Internal product chassis · in active use

One chassis. Every client build.

A full-stack starter that carries auth, storage, background jobs, AI and admin out of the box — so a new client application begins at the interesting part. Product modules drop in as self-contained plugins without touching core.

Bun · React 19 · Postgres 8 product modules Config over code
Meeting Performance overview dashboard: KPI strip, personal score ring, trend sparkline and dimension breakdown
The idea

Stop rebuilding the first six weeks.

Every client project needs the same foundation: accounts, permissions, file storage, a job queue, email, an admin surface. The chassis owns all of it, and keeps the parts that differ between clients in configuration rather than forks.

Plugin architecture

A module brings its own routes, schema, jobs and client pages. Adding one is a folder, not a refactor — and removing one leaves no trace in core.

Config, not code

Providers, spend caps, storage drivers, admin access and nudge schedules are environment values. A deployment is configured, never branched.

One design language

Every module renders through the same page archetypes, density and tokens. A new surface looks like it always belonged, because it is assembled from parts that already exist.


What ships with it

Product modules, not scaffolding.

Each one is a real working surface — schema, API, jobs, and UI — that a client project can keep, cut, or use as the pattern for something new.

Meeting Performance

Ingests call transcripts, scores each speaker across six communication dimensions, and tracks the trend meeting over meeting.

Fireflies webhookAI scoringCoaching nudges

Knowledge Base

Document workspaces with chunked indexing and grounded question answering — every claim cites the passage it came from.

RAGCitationsPDF · MD · TXT

AI Chat

Threaded conversations with streaming responses, model selection, and per-request cost accounting rolled into the admin ledger.

StreamingMulti-provider

CRM

Contacts, deals and pipeline stages with an activity timeline and AI-assisted follow-up drafting from the contact page.

PipelineEmail

Uploads

Drag-and-drop file handling backed by S3-compatible storage, or the local filesystem when a deployment does not warrant a bucket.

S3 · R2 · MinIOLocal driver

FitStreak

Daily activity streaks counted in a real home timezone, with per-user device sync and an evening reminder that respects local hours.

Timezone-awareDevice sync

Speech Coach

Audio transcription and delivery feedback, sharing the scoring vocabulary and trend model used by Meeting Performance.

WhisperDaily nudge

Notes

The deliberately small one — a reference implementation of the plugin contract, readable end to end in a sitting.

Reference module

A closer look

Depth where it counts.

Three surfaces that show the difference between a module that exists and a module that is finished.

Meeting Performance

Feedback you can trace back to the moment.

Scores are only useful if you can see where they came from. Analysis and transcript are two views of one workspace: pick a dimension, and the transcript highlights the lines that earned it.

Six scored dimensions per speaker, tracked as a trend across meetings
Annotations jump between the analysis and the exact transcript line
Action items grouped by owner, each with a jump-to timestamp
Speaker detail page showing score trend chart, dimension comparison radar and goal tracking
Speaker trend — score history, meeting comparison, goals
Knowledge Base

Answers that show their work.

Retrieval is easy; trust is the hard part. Answers lead with a one-line summary, cite numbered sources inline, and every citation opens the source document at the chunk it came from with the supporting sentence highlighted.

Inline citations link answer, source card and document viewer
Sources are summarised, not dumped as raw chunk walls
When retrieval is weak it says so, instead of inventing an answer
Knowledge Base ask view with a summarised answer, inline numbered citations and a ranked source rail
Grounded Q&A — summary, inline citations, ranked sources · sample data
Admin

Configuration that explains itself.

Deployment settings are where projects rot. Every value carries the context an operator needs, states plainly whether the environment has pinned it, and flags the ones that only take effect after a restart.

Inline guidance on every setting, not just a variable name
Environment-pinned values render read-only and say so
Secrets stay masked; plaintext never reaches the client
Admin settings page with a section navigation rail and per-setting help text
Admin settings — sectioned, annotated, environment-aware

Design system

Consistency is an architecture decision.

Modules stay coherent because they cannot easily diverge. One token set, one type ramp, one row density, and a fixed set of page archetypes every surface is assembled from.

Surface ladder — depth by lift, not shadow
canvas
#010102
surface-1
#0f1011
surface-2
#141516
surface-3
#18191a
Accent — used sparingly, on purpose
primary
#ef7c26
success
#27a644
warning
#e2a336
danger
#e5484d
Type ramp
display 40Contacts
display 28Recent activity
title 17Today's plan
body 14Dense rows, card body, secondary copy.
eyebrow 11Section label
mono 12a3f0e1c8 · status=open
Page archetypes every module is built from
Page headerDense listCard gridDetail + railTwo-paneForm + save barDashboardSettingsEmpty statesAuth

Under it

Boring where it should be.

Chosen for speed of iteration and few moving parts. One runtime, one database, typed end to end.

BunRuntime, bundler, test runner
React 19Client
TanStack Router · QueryRouting and server state
Postgres · DrizzleTyped schema and migrations
Better AuthSessions, OAuth, two-factor
Tailwind 4Tokenised styling
S3 · R2 · MinIOObject storage, swappable
Claude · OpenAIProviders behind one interface
Postgres job queueScheduled and recurring work
ResendTransactional email
PinoStructured logging
Docker ComposeOne command to local
Built by D12Labs

Happy to walk through any of it.

The interesting conversations are about the decisions — why the plugin boundary sits where it does, why admin is configuration, and what it costs to keep eight modules visually identical.