A production application foundation you can adopt one package at a time.
Design system, app shell, multi-tenancy, forms, analytics, workflows, integrations, documents, communications, and more—composable without becoming inseparable.
See what you can build · Quick start · Packages · Architecture · Demo app · Documentation
AppKit is the reusable product layer between a framework and your application. It gives you the pieces teams usually spend their first year rebuilding: a coherent interface, responsive navigation, tenant isolation, permissions, auditing, dashboard and report builders, forms, workflows, notifications, external data sync, outbound integrations, documents, background work, and provider-neutral delivery.
Use @braedonsaunders/appkit-ui for a polished shell and component system. Add
@braedonsaunders/appkit-db and @braedonsaunders/appkit-tenant when you need multi-tenant Postgres with RLS.
Install forms, analytics, workflows, sync, or PDF only when your product needs
them. The package boundaries are deliberate: adopting one capability does not
pull the whole platform into your process or browser bundle.
AppKit is especially useful for SaaS products, internal tools, operations platforms, admin consoles, vertical software, and app builders that need more than a component gallery but do not want a rigid all-or-nothing framework.
- A real application system. Navigation, settings, data lists, builders, drawers, dashboards, audit history, jobs, storage, and delivery paths are designed to work together—not presented as disconnected examples.
- Modular without integration tax. Every feature has a dependency-light core and explicit optional adapters for React, Drizzle, providers, browser automation, editors, canvas engines, and database drivers.
- Secure defaults. PostgreSQL RLS, wildcard RBAC, sealed secrets, idempotent mutations, transactional outbox, isolated user code, sandboxed installable apps, SSRF-safe egress, and fail-closed sync snapshots are available as first-class packages.
- One design language. Semantic tokens drive light and dark themes, Tailwind v4 utilities, radius, elevation, and motion. Rebrand the entire system by replacing channel values in one CSS file.
- Application-owned domains. AppKit supplies engines and contracts; your app supplies record catalogues, analytics sources, workflow actions, connectors, authorization context, and persistence policy. Product concepts never leak into reusable packages.
- Proven in production. The foundation generalizes production application patterns, preserves reusable behavior, and keeps domain coupling behind injected adapters.
Start a new Next.js application with the shell, tokens, theme runtime, and page transitions already connected:
pnpm create appkit my-appAdd optional capability groups at creation time:
pnpm create appkit operations --features forms,tenancy,workflows --yesThe scaffold is deliberately small: it gives you a production-shaped AppKit application without generating product-specific routes, records, or fake data.
Install only the interface foundation:
pnpm add @braedonsaunders/appkit-ui @braedonsaunders/appkit-tokens/* app/globals.css */
@import "@braedonsaunders/appkit-ui/styles.css";
@source '../app';import { AppShell, Toaster } from "@braedonsaunders/appkit-ui";
export default function Application({
children,
pathname,
}: {
children: React.ReactNode;
pathname: string;
}) {
return (
<>
<AppShell groups={navigation} pathname={pathname}>{children}</AppShell>
<Toaster richColors closeButton />
</>
);
}Add a tenant-safe backend when you need it:
pnpm add @braedonsaunders/appkit-db @braedonsaunders/appkit-tenant drizzle-orm postgresimport { assertCan } from "@braedonsaunders/appkit-tenant";
assertCan(requestContext, "projects.write");
await requestContext.db(async (db) => {
await db.insert(projects).values(input);
});Published packages contain compiled ESM, TypeScript declarations, source maps,
styles, and required migrations—not monorepo source or tests. Every package is
independently installable; internal AppKit dependencies use normal semver ranges
in npm artifacts while this repository keeps fast workspace:* links locally.
| Package | What it gives your app |
|---|---|
@braedonsaunders/appkit-tokens |
Semantic light/dark brand, shape, elevation, and motion tokens surfaced through Tailwind v4. |
@braedonsaunders/appkit-ui |
Accessible primitives, topbar/sidebar app shell, account launcher, search, notifications, settings, record and paged tables, subtabs, drawers, uploads, signatures, page layouts, and route transitions. |
@braedonsaunders/appkit-dashboard |
Responsive drag/resize dashboards, reusable insight cards, a card library, query studio, visualizations, lifecycle controls, and optional Drizzle persistence. |
@braedonsaunders/appkit-forms-core |
Versioned schemas, field and companion-value registry, formulas, conditional logic, validation, scoring, and source-compatible business and safety automation contracts. |
@braedonsaunders/appkit-forms |
The complete production designer and fill runtime: 1/3–2/3 authoring, fields/canvas/tabs/sign-off, record/list/action/access configuration, workflow bridge, immutable publishing, revision-safe drafts, guided steps, data-bound controls, repeating tables, media, signatures, and typed host adapters. |
@braedonsaunders/appkit-editor |
Optional controlled TipTap rich-text authoring. |
@braedonsaunders/appkit-customization |
Versioned form layouts, custom fields, and the production record-list system: saved views, subtabs, search, filters, sorting, paging, drill-through, designers, plus optional memory and tenant-scoped Drizzle persistence. Your app supplies its record catalogue once; AppKit keeps every editor, validator, and store on that contract. |
@braedonsaunders/appkit-design-studio |
Bounded multi-artboard print design, safe HTML/print output, and an interactive Fabric workspace with transforms, layers, zoom, and full property editing. |
@braedonsaunders/appkit-i18n |
Twenty-locale policy, request negotiation, user overrides, exact-copy translation with plural forms, and localized authored content. |
@braedonsaunders/appkit-scheduling |
Project scheduling: CPM critical path, calendars, resource leveling, baselines, and a Gantt/list/board authoring surface. |
@braedonsaunders/appkit-avatars |
Avatar parts library, composition model, and composer — one full-body figure per subject with portraits derived by head viewport — plus AI image generation. |
@braedonsaunders/appkit-scene |
Animated character scene: characters walk, idle, and scale with depth over a configurable ground. |
@braedonsaunders/appkit-errors |
Universal action-error handling: a typed refusal taxonomy, a response read path that cannot throw, a persistent alert, and a busy lifecycle that always releases. |
Bind customization to your records once and retain key-based calls throughout the application:
import { createCustomizationEngine } from '@braedonsaunders/appkit-customization'
import { createMemoryListViewStore } from '@braedonsaunders/appkit-customization/memory'
const customization = createCustomizationEngine(recordTypes)
const listStore = createMemoryListViewStore({ registry: customization.registry })
const systemView = customization.defaultListView('work_order')The same catalogue drives the form designer, list-view designer, runtime record table, API validation, and memory or Postgres persistence—without putting your product’s record names, routes, queries, or permissions inside AppKit.
| Package | What it gives your app |
|---|---|
@braedonsaunders/appkit-db |
Tenant-scoped Postgres execution, BYPASSRLS system access, identity schema, API keys, schema helpers, and RLS installation. |
@braedonsaunders/appkit-tenant |
Tenant-bound request context with locale/timezone policy, typed app extensions, active-role resolution, wildcard/read-tier RBAC, fail-closed grant/deny overrides, portable database-runtime binding, and super-admin behavior. |
@braedonsaunders/appkit-iam |
Optional roles, memberships, scoped assignments, permission exceptions, audit, full administration UI, and memory/HTTP/Drizzle adapters. |
@braedonsaunders/appkit-auth |
Durable sessions, passwords and resets, magic links, invitation grants, OAuth accounts, React forms, and memory/Drizzle/Next adapters. |
@braedonsaunders/appkit-events |
Structured audit records, transactional outbox, recipient resolution, leased relay, durable retries, and effects ledger. |
@braedonsaunders/appkit-api |
API-key authorization, idempotent writes, typed public errors, and OpenAPI descriptions. |
@braedonsaunders/appkit-sandbox |
Shared QuickJS isolation with memory, stack, deadline, governance, frozen-input, host-function, log, and structured-fault contracts. |
@braedonsaunders/appkit-endpoints |
Resource-bounded handler(request) programs with storage, records, and application-governed host capabilities. |
@braedonsaunders/appkit-query-console |
Governed raw-SQL workbench with live schema discovery, reusable snippets, local or injected persistence, sortable/filterable results, CSV export, and a host-owned execution boundary. |
@braedonsaunders/appkit-scripts |
Event, scheduled, endpoint, bulk, and opaque-origin client scripts with a production CodeMirror editor, run/log inspection, vetoes, allowed mutations, cron, jobs, auditing, Drizzle storage, and a bound cutover runtime. |
@braedonsaunders/appkit-apps |
Installable app manifests and ZIPs, a nested file browser and syntax editors, immutable versions, storage, capabilities, QuickJS backends, opaque-origin preview, bridge SDK, run inspection, marketplace, memory, Drizzle, and bound lifecycle adapters. |
@braedonsaunders/appkit-ai |
Provider-neutral bounded agents, streaming React UI, and production analysis, extraction, document, vision, writing, digest, and model helpers. |
@braedonsaunders/appkit-feedback |
In-app product issue reporter: header chrome, a short help-first triage, PII-safe generalization, and a host-owned GitHub Issues publisher. |
@braedonsaunders/appkit-superadmin |
Instance-operator administration over platform identity: the users who can sign in, their credentials, and active sessions, with guard rails and production React components. |
@braedonsaunders/appkit-process-sandbox |
Fail-closed Linux process isolation with bubblewrap, for workspace-bound coding agents and other trusted application workers. |
| Package | What it gives your app |
|---|---|
@braedonsaunders/appkit-analytics |
App-owned semantic catalogues, parsed formulas, tenant-bound parameterized SQL, result contracts, and a visualization registry. |
@braedonsaunders/appkit-reports |
Production-shaped query plans and catalogues, governed SQL, recursive filters, fiscal/grouped results, a 1/3–2/3 report studio with host-owned save/delete lifecycles, full paper/statement viewers, drilldown drawers, print/export, schedules, and durable run claims. |
@braedonsaunders/appkit-workflows |
Multi-flow visual studio, compatible templates, typed inspectors, bounded graphs, durable replay-safe actions, pause/resume approval gates, record approve/reject controls and history, any/all quorum, HMAC email decisions, and optional Drizzle storage. |
@braedonsaunders/appkit-sync |
Production connector registry and orchestration: transactional batches/savepoints, run and record-change ledgers, clean-run cursors, previews, ownership conflicts, fail-closed snapshots, CSV/transforms, hardened egress, and optional SQL drivers. |
@braedonsaunders/appkit-integrations |
Outbound publisher, authoring hub/builder, token mapping, deterministic jobs, send-once/partial retry ledgers, and optional HTTP, Slack/Teams, Sheets, email, SQL, and Drizzle adapters. |
@braedonsaunders/appkit-notifications |
Responsive three-pane inbox, production preference matrix and device-push enrollment, tenant routing cockpit, audiences, escalation, digest/quiet-hour/scan policy, dispatch, and React/Drizzle entries. |
| Package | What it gives your app |
|---|---|
@braedonsaunders/appkit-email-render |
Bounded templates, loops, conditions, sanitization, escaped merge values, subjects, recipients, attachments, HTML, and plain text. |
@braedonsaunders/appkit-email-designer |
Drag-and-drop message and signature authoring: email-safe blocks, merge fields, repeating tables, table tools, and a sanitize/inline/expand compile pipeline. |
@braedonsaunders/appkit-emails |
Resend, SendGrid, Mailgun, Postmark, secure SMTP, and development-only loopback SMTP behind one tenant-aware contract. |
@braedonsaunders/appkit-sms |
Twilio, Vonage, MessageBird, Plivo, and Telnyx with strict addressing and credential-safe failures. |
@braedonsaunders/appkit-pdf |
Pure-JS PDFKit reports/statements plus optional authored-template and hardened Chromium rendering entries. |
@braedonsaunders/appkit-forms-documents |
Form print styles and bounded authored PDF templates over the canonical forms-core companion-value contract. |
@braedonsaunders/appkit-forms-pdf |
Form summaries, repeating tables, photos, hardened browser/resource rendering, record/report templates, and full-bleed design documents. |
@braedonsaunders/appkit-crypto |
AES-256-GCM sealed secrets with configurable HKDF-derived application keys. |
@braedonsaunders/appkit-jobs |
Pure timezone-aware recurrence at /recurrence; lazy BullMQ/Redis runtime plus production email, notification/push, PDF/document, report, scheduled, outbound, script, sandbox, migration, and capture queues with exact retries, retention, validation, deterministic IDs, schedule reconciliation, worker profiles, rate limits, and hardened Web Push. |
@braedonsaunders/appkit-storage |
Tenant-owned S3 objects plus the optional production attachment workspace: upload, search, type filters, paging, preview, download, expansion, removal, HTTP adapters, and database-free memory adapters. |
@braedonsaunders/appkit-mailbox |
Incremental IMAP sync and SMTP send with RFC-5322 threading, persistence injected so the app owns the ledger, plus the three-pane operator inbox. |
@braedonsaunders/appkit-office |
HTML to .docx/.pdf through headless LibreOffice, plain-text precision edits inside .docx, PDF concatenation, and declarative .xlsx workbooks. |
@braedonsaunders/appkit-voice |
Per-agent voice configuration, speech-provider catalogues and key verification (Deepgram, ElevenLabs, OpenAI Realtime, Gemini Live), and LiveKit token minting. |
@braedonsaunders/appkit-telephony |
Carrier phone-number provisioning and the SIP trunk the numbers arrive on, with sealed-secret config and an injectable carrier adapter. |
The core of each feature remains usable without its heaviest dependencies:
@braedonsaunders/appkit-workflows graph + durable runtime
├─ /react React Flow authoring
├─ /approval-tokens Node HMAC email actions
├─ /schema feature-owned Drizzle tables
└─ /drizzle durable Postgres store
@braedonsaunders/appkit-sync connector + orchestration contracts
├─ /egress DNS-pinned, SSRF-safe HTTPS
├─ /db-drivers optional PostgreSQL/MySQL/MSSQL clients
├─ /schema connections, runs, crosswalk
└─ /drizzle run and cursor persistence
@braedonsaunders/appkit-integrations dispatch + delivery ledger
├─ /http /chat /sheets hardened outbound adapters
├─ /email /sql optional render and database adapters
├─ /schema definitions and delivery ledger
└─ /drizzle tenant-scoped persistence
@braedonsaunders/appkit-apps installable application platform
├─ /manifest /bundle validated manifests and ZIP packages
├─ /runtime /bridge governed QuickJS backend + opaque iframe SDK
├─ /service source-shaped lifecycle bound to host adapters
├─ /react app builder, runtime frame, and library
├─ /memory database-free complete adapter
└─ /schema /drizzle tenant-scoped durable lifecycle
@braedonsaunders/appkit-scripts governed automation code
├─ /bound positional cutover runtime + context mapping
├─ /client opaque-origin browser validation gate
├─ /jobs queue-neutral scheduled/bulk worker handler
├─ /react searchable list and full-screen authoring drawer
└─ /schema /drizzle definitions, schedules, and run history
@braedonsaunders/appkit-query-console governed raw-SQL workbench
├─ /react schema, snippets, history, editor, and results UI
└─ /styles.css optional-package Tailwind source registration
The repository enforces this architecture. Boundary checks reject runtime cycles, forbidden foundation dependencies, missing feature migrations, and an optional peer imported by a package root. Server-only adapters cannot silently inflate a client bundle.
apps/playground is a real Next.js 16 application, not a static component
catalogue. Authentication is intentionally disabled throughout the public demo;
one built-in identity exercises tenant context and permissions without a login.
The hosted demo and its
manifest-backed package catalogue run
without a database. Its sample tenant data is deterministic, analytics queries
execute in memory, and editable dashboard and insight-card state persists in the
browser.
It includes the topbar/sidebar shell, admin hub and settings shell, configurable dashboard, insight-card studio, form designer and runtime, workflow canvas, reports, notifications, design studio, customization, integrations, API reference, searchable/paginated tenant data, activity inbox, and one detail page for every publishable package manifest.
pnpm install
pnpm --filter @braedonsaunders/appkit-playground devOpen http://localhost:4310/dashboard. Use the account launcher to switch
between the topbar (default) and sidebar navigation. No database or provider
credentials are required.
To exercise the real tenant-scoped Postgres/RLS path, copy
apps/playground/.env.example to apps/playground/.env.local, set both database
URLs to your Postgres or Supabase connections, and run
pnpm --filter @braedonsaunders/appkit-playground seed before starting the app. With those
variables present, the same routes use durable package-owned persistence.
- Every color in reusable UI resolves through a semantic token; light and dark themes are part of the same contract.
- Entrance content is visible by default. CSS starting styles provide motion without hiding server-rendered content, and reduced-motion is honored.
- React is optional unless a surface is interactive; framework-neutral cores remain safe to use in services and workers.
- Persistence-owning packages ship their own schema and SQL migrations.
- External network access validates HTTPS, DNS answers, redirects, request metadata, response sizes, timeouts, and public IP ranges.
- Package tests, monorepo typecheck, architecture checks, build, and browser verification are required before changes land.
- Every npm artifact is packed and inspected, then installed from its tarball in fresh Node, React, and Next.js consumers before release.
Agents and contributors should start with AGENTS.md, then read
the design and package orientation and
application-building rules.
pnpm install
pnpm -r typecheck
pnpm -r test
pnpm lint
pnpm build
pnpm test:packages
pnpm test:consumersAppKit is AGPL-3.0-or-later. Changesets owns package versioning and the release PR; successful merges publish provenance-enabled artifacts to npm. See the publishing guide for the exact artifact and release contracts.