Skip to content
braedonsaundersPublic

About

Modular production foundation for modern apps: design system, multi-tenancy, forms, analytics, workflows, integrations, documents, and more.

Topics

Resources

Stars

6 stars

Watchers

0 watching

Forks

Repository files navigation

AppKit — build the product

CodeFlow card — codebase scale and structure snapshot

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

License: AGPL-3.0 Next.js React TypeScript Tailwind CSS PostgreSQL RLS


Build your app, not its foundation

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.

Why AppKit

  • 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 small or take the whole stack

Start a new Next.js application with the shell, tokens, theme runtime, and page transitions already connected:

pnpm create appkit my-app

Add optional capability groups at creation time:

pnpm create appkit operations --features forms,tenancy,workflows --yes

The 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 postgres
import { 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.

What you can build with

Interface and product builders

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.

Data, access, and extension

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.

Analytics, workflows, and connectivity

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.

Documents, communications, and infrastructure

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.

Modular by construction

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.

Running the playground

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 dev

Open 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.

Quality guarantees

  • 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.

Develop AppKit

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:consumers

AppKit 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.

About

Modular production foundation for modern apps: design system, multi-tenancy, forms, analytics, workflows, integrations, documents, and more.

Topics

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages