Skip to contentSkip to Content
Architecture

Tech stack

We pick boring, proven technology and spend the innovation budget on the AI layer. Every choice below optimizes for the same things we promise clients: reliability, auditability, and systems a small team can actually operate.

Web applications

LayerTechnologyWhy
FrameworkNext.js (App Router) + React + TypeScriptOne framework across every property; server components keep client bundles small
HostingVercelPush-to-deploy, preview URLs per pull request, zero ops
StylingTailwind CSS + shadcn/ui (apps); design-token CSS (this site)Speed in apps; full control where brand matters
TestingPlaywright + VitestEnd-to-end checks gate every deploy

Backend services

Python services run on Railway, deliberately separate from the web tier:

ServiceJob
Knowledge-base APISearch, ingestion, and agent memory over the agency knowledge vault
Text embedderConverts text to vectors for semantic search
Quality workerBackground jobs: message scoring, quality alerts, cleanup
Lead-gen pipelineWebhook-driven execution of the automation pipeline — reply detection through deck generation

Data

ConcernChoice
DatabaseSupabase (PostgreSQL) — one master instance for auth and internal data, one isolated instance per client
IsolationClient data never shares a database with other clients; row-level security inside each instance
Vectorspgvector for semantic search and agent memory

AI layer

Model-agnostic by architecture: AI vendors (typically Anthropic and OpenAI) are called from the orchestration layer only, behind the DOE framework. Models make decisions; deterministic Python executes them. Swapping a model is a configuration change, not a rebuild.

Why this matters to clients

This is the same stack we deploy for client builds. When we say your team can operate what we hand over, it’s because the stack is learnable: one web framework, one database, plain Python, and documentation like this page.

Next steps

Last updated on