Danvas
Danvas
DashboardSupportWelcome

👤 USER DOCS

User Guides

Getting Started

Getting StartedDashboard & OnboardingApp Settings

Tutorials

Tutorial: Setting Up Shift Tasks & ClosersTutorial: Managing Incidents in the InboxTutorial: Tracking Compliance & Sync StatusTutorial: Operational Workflows with the AI AssistantTutorial: Building & Deploying Custom Checklists

Daily Operations (Staff)

Shift Workspace & TasksService Day SetupDaily Line-UpStaff Service Day ReportsForms

Communication & Chat

Messages & AnnouncementsUnified Operations InboxAI Assistant

Manager & Admin Guides

Daily Line-Up SetupStaff SchedulingManaging LocationsNPS and Guest FeedbackCouponsContacts and Guest HistoryManager CloseoutsDaily Line-Up & ComplianceAnalyticsIncident ReportingWhistleblower Concerns & FeedbackAdmin Tools

⚙️ DEVELOPER DOCS

Getting Started

Getting StartedDevelopmentDeployment Guide

Architecture

Architecture OverviewExplanation: AI Integration & Tenant SecurityExplanation: Dynamic Forms Engine DesignExplanation: Compliance Ledger DesignExplanation: Live Sync & Data FreshnessData FlowArchitecture Decision Records

Core Domain

Core DomainDatabase ReferenceLocations DomainAuth & RBACScheduling DomainReports DomainIncidents DomainUnified Operations InboxLive Sync Data FreshnessToast Sync PipelineNotifications DomainCoupons and Guest NPSAudit Log & Compliance ArchitectureDesign Audit FindingsAI Chat IntegrationAnalytics & Tips Integration

Frontend

Frontend ArchitectureFormsLoading SkeletonsComponentsPWA & Offline ShellScreenshots

API Reference

API Reference

Endpoints

POS Sales APIOptimization Data APISchedule Shifts APIEmployee Export APIReports APIIncidents APIAI Chat APIPush Notifications APIWebhooks APICron API

Contributing

ContributingCode Examples

Security

Security & Compliance

Release Notes

What's New

Database Reference

Overview of the database schema and data model

Database & Multi-Tenant Architecture

Canvas Forge uses PostgreSQL with Drizzle ORM. All database access goes through @repo/database; application code must not instantiate a separate Drizzle or Neon client.

Multi-tenant isolation

Tenant-owned operational tables generally carry a teamId column. This is a local Canvas Forge tenant identifier named by CANVAS_TEAM_ID, not a Clerk Organization ID. Global, reference, audit, migration, and system-owned tables follow their explicit schema and ownership contracts rather than a universal tenant-column rule.

  • Every tenant-owned read and write must enforce the authorized tenant and, where applicable, locationId scope.
  • Clerk authenticates the user; authentication alone is not authorization. Server actions and API routes resolve and verify local team/location ownership before querying or mutating.
  • Runtime, migration, serving-reader, and audit-reader database identities remain separate and least-privileged.

Schema management

Schema changes use generated Drizzle migrations. Review the SQL and journal, rehearse on a disposable or production-derived branch as appropriate, and use the repository-owned protected workflow for production. Never use a schema push, edit the migration journal, or apply migration SQL manually to production.

See the database migrations how-to for local, rehearsal, and production command contracts. The database access workflow owns migration invariants.

Seed data

Seed commands and local fixture ownership are maintained in SETUP.md and the CLI command reference. Seeds are for disposable/local targets only; they are not a production migration path.

Related

Architecture Overview

Multi-location Model

Audit & Compliance

Core Domain

Technical architecture and data models for Danvas domains

Locations Domain

Technical design of multi-location hierarchy and data isolation

On this page

Database & Multi-Tenant ArchitectureMulti-tenant isolationSchema managementSeed dataRelated