Skip to content

Security

Cannvas holds the operating record of licensed cannabis businesses — so security is built into how the platform is constructed and shipped, not bolted on after. This page is the real posture: what isolates your data, what watches the platform, and how to reach us. No badge theater — mechanisms, published.

1.0 Isolation

Your data is yours by construction.

Cannvas is multi-tenant with isolation enforced at the database, the service layer, and the session — three independent walls, each of which would have to fail before one organization could see another’s data.

ROW-LEVEL SECURITY
Every organization table carries database-enforced row-level security. The public API key returns nothing from org tables — not an error, an empty set. There is no query path around it.
SERVICE-LAYER MEDIATION
All organization reads and writes pass through the platform’s edge service, which scopes every query to the authenticated org. Client code never holds privileged database credentials.
FAIL-CLOSED PERMISSIONS
Role checks deny by default — a permission that can’t be resolved is a refusal, never a pass. Limited principals (in-store kiosks, invited vendors) receive scoped tokens that can reach only their own surface.
SESSION SCOPING
Sessions are signed (JWT) and org-scoped end to end — including browser storage, so two tenants on one device can’t bleed into each other.
2.0 The net

Three layers watch the platform. None of them is a human’s memory.

Every security signal is either a deploy-blocker — caught before it ships — or a push alert on what’s new — caught before it festers. Nothing depends on someone remembering to check a dashboard.

EVERY CHANGEAll code ships through one gated deploy path.
GATE 1 · PRE-DEPLOYStatic security lint blocks the deploy: secrets, CORS, security headers, unguarded routes, resolver drift.
GATE 2 · WEEKLY SWEEPDatabase advisors + live probes on the real domains, diffed against a baseline — only NEW findings alert.
GATE 3 · OUTSIDE-INExternal vulnerability scanning, dependency alerts, and secret-scanning with push protection.

And the net grows. Every incident or near-miss becomes a permanent, mechanical guardrail — a new deploy-blocking check or a new sweep probe — so the same class of mistake can’t ship twice.

2.1 The fuse

AI nobody can run up the bill on. Or talk into a wrong number.

Every model call in Cannvas passes through one gate. It carries a platform-wide daily ceiling, a per-organization ceiling, and a ledger row — who asked, which surface, how much, how long — with alerts at 80% and at the cap. Over the cap, the caller gets a plain message, not a surprise invoice. The anonymous surfaces (a customer’s taste match, a panelist’s score) add per-device caps and per-address rate limits on top, and every public write on the platform is rate-limited by construction — the deploy gate refuses a new one that isn’t.

ONE GATE

Platform cap per day, organization cap per day, inside the single function every model call uses. A lint fails the deploy if any code path goes around it.

THE LEDGER

Organization, caller, actor, model, outcome, input size, latency — one row per call, so spend is read from records, never estimated.

GROUNDED OR WITHHELD

The model writes the sentence; the engines compute every number. A figure the engine did not produce is withheld — the AI cannot be talked into inventing one.

TOLD AT POINT OF USE

Every AI surface says what the model did and did not do, in the sentence beside the control; expert panel weight comes only from devices the organization enrolled.

3.0 The data

Encrypted, backed up twice, and always yours.

The platform runs on Cloudflare’s edge network and Supabase-managed Postgres — infrastructure with its own audited security programs underneath ours.

IN TRANSIT / AT REST
TLS on every connection; encryption at rest on the managed database and object storage. Uploaded media (floor photos, COAs) lives in private buckets served only through short-lived signed URLs.
RECOVERY
Managed database backups, plus an independent, age-encrypted disaster-recovery vault maintained outside the primary provider — two failure domains, not one.
WHAT WE DON’T HOLD
No payment-card data — Cannvas has no payment rails. The consumer app is anonymous-first; retail transaction ingestion (as it ships) drops customer and patient identifiers at the door: transactions, never people.
OWNERSHIP & EXIT
Your data is yours on every plan — CSV export, cancel anytime, take everything with you. Details in the Data Processing Addendum.
ABUSE CONTROLS
Public surfaces run bot protection (Turnstile) and rate limits; the state compliance mirror is read-faithful — Cannvas reflects the system of record and never writes to it.

The numbers are the product — protecting them is the job.

4.0 Disclosure

Found something? Tell us directly.

Report suspected vulnerabilities to [email protected] with “Security disclosure” in the subject. Good-faith research against your own account’s data is welcome; we’ll acknowledge, investigate, and tell you what we found. Please don’t access other tenants’ data, degrade the service, or retain data you weren’t meant to see — the full rules live in the Acceptable Use Policy.

Questions? Ask them on the demo.