A2P3Build. Ship. Operate.

A2P3-002 — Datasheet

← All specifications
Time, spent on purposeA2P3-002

Operator Cadence

A calm, keyboard-first way for founders to spend time the way they intend — and the full-stack platform behind it.

A production SaaS built as a single Turborepo monorepo — web app, native desktop client, browser extension and admin console, all from one shared core. Behind a security-hardened Postgres backend (~100 tables, ~213 stored procedures, row-level security on every one) runs a fault-tolerant, offline-capable timer engine, a multi-provider planning layer that drafts each operator's day, and an MCP server that lets outside agents act on their work. Built on Next.js 16, React 19 and Supabase.

StatusIn development
CategoryPersonal Productivity
Started02 / 2026
4Client surfaces, one core
~100Postgres tables · RLS on each
~213Database stored procedures
168Versioned migrations
3LLM providers · bring-your-own-key
26Scheduled jobs · two schedulers
§ 01 · Working cycle

A day, as the product runs it

Operator Cadence isn't a task list — it's a loop. Each day is drafted, run as a timed sequence, tracked against goals, and picked back up exactly where it was left. That cycle is the spine the whole platform is built around.

01 · PLANDaily GuideThe day is drafted from goals, time-debt, calendar & learned energy
02 · RUNSequenceLoops run in order as a timed session, sized to real hours
03 · TRACKTimerTime accrues against each loop's goal — offline-safe, cross-device
04 · CAPTURELeft-off noteOn stop, context is captured so nothing is lost between passes
05 · ADVANCECycleThe loop advances; tomorrow's Guide starts from where today ended

Domain › Loop › Category › Next Action — the data model that recursively cycles, so an operator always resumes rather than restarts.

§ 02 · Stack

Everything, as a spec sheet

FrontendNext.js 16 App Router · React 19 · TypeScript 5.9 strict · Tailwind CSS v4
Server stateTanStack Query v5 — server-side prefetch & hydration across ~188 data hooks, single query-key factory
Client stateZustand v5 — ~40 focused stores, several persisted through a safe-storage layer
BackendSupabase — Postgres 17, Auth, Realtime, Storage · a "fat-database" of ~213 RPCs, migrations-only
SecurityRow-Level Security on ~100 tables · SECURITY INVOKER functions · AES-256-GCM secrets · HMAC agent keys
IntelligenceAnthropic · OpenAI · Gemini behind one router — BYOK, SSE streaming, per-feature config & usage metering
Agent APIModel Context Protocol server + token-scoped REST · granular per-agent read/write permissions
NativeTauri v2 (Rust) desktop shell · WXT browser extension · installable PWA with offline background sync
SchedulingTwo schedulers — Postgres pg_cron (15 jobs) + Vercel Cron (11 jobs), circuit-breaker guarded
PaymentsStripe — idempotent webhooks, subscriptions, add-ons, referrals · Google Calendar · Resend · Web Push
QualityPlaywright E2E (seeded + scratch users) · Vitest units · TypeScript strict · ESLint 10 flat config
§ 03 · Engineering

What we're proud of

A1

A fault-tolerant timer engine

The signature subsystem: a ~2,400-line reducer state machine tracking time against goals across sequences of work. Optimistic updates roll back from the server; actions that happen offline queue to IndexedDB and drain via a Service-Worker background sync; a single global tick and Realtime + BroadcastChannel keep every tab and device in step.

state machineoffline queuerealtime sync
A2

A backend that carries its own logic

A deliberate "fat-database": ~213 Postgres functions and ~111 triggers hold the transactional business rules, with route handlers as thin authenticated wrappers. Row-level security on ~100 tables, append-only audit logs, and a documented hardening campaign — every function flipped to INVOKER, every search-path pinned, EXECUTE revoked from anon.

~213 RPCsRLS everywhere168 migrations
A3

A planning layer that drafts the day

The Daily Guide assembles real context — loops behind their goals, overdue actions, live calendar, and energy patterns learned from the operator's own history — then casts the model as a chief of staff and returns a validated, machine-parseable plan. One router spans three providers with bring-your-own-key, streaming, quotas and cost tracking.

context assemblymulti-providerBYOK · metered
A4

An open door for agents

An MCP server and a token-scoped agent API let outside AI agents read and act on an operator's loops and actions — gated by granular per-agent read/write permissions and HMAC-hashed keys. Agent dispatch is bounded by concurrency and pending-invocation limits, with a watchdog that sweeps stale work.

MCPscoped tokensbounded dispatch
A5

Built to scale calmly

The highest-volume tables — time entries and activity logs — are partitioned, RLS enforced on the children. A performance-audit series dropped dead indexes and added materialized rollup caches so dashboards read pre-aggregated data. Two schedulers, async email & agent queues, rate limits and circuit breakers keep load in hand.

partitioningrollup cachesrate limits
A6

One codebase, four surfaces

A Turborepo monorepo ships web, desktop, extension and admin from a shared @opcadence/core — the typed queries, Zod schemas and timer math that keep every surface behaving identically. The frontend is server-components-first with prefetch-and-hydrate, so pages arrive without client fetch waterfalls.

shared coreprefetch + hydratekeyboard-first
§ 04 · Surface area

Where the platform meets people

Web app

The operator's console

~30 feature areas and ~180 route handlers — dashboard, loops, sequences, calendar, inbox, reports and a deep settings tree. Keyboard-first: a ⌘K command palette, global search and multi-key chords.

Desktop

Native shell & floating timer

A thin Tauri v2 (Rust) frame that loads the web app — no fork — adding a frameless always-on-top timer, system tray and a global show/hide shortcut. Pre-release build.

Browser extension

Capture from anywhere

A WXT + React 19 extension that drops any page straight into the Inbox with its source, so a stray idea never breaks the operator's focus.

Admin

A hardened back office

A separate console with its own auth — argon2 hashing, TOTP 2-factor, append-only audit logs and support impersonation with cascade cleanup.

Reports

Time, made legible

Recharts dashboards — goal-vs-actual, allocation and trends — plus a dnd-kit calendar timeline with ghost blocks and a kanban board for triage.

Marketing site

The front door

A separate static Next.js site on a bespoke design system — a "stateless-first" build where only six files ship client JS, with generated OG images, full JSON-LD and end-to-end UTM attribution.

§ 05 · Lifecycle

Build. Ship. Operate.

build

Built on Next.js, TypeScript, and Supabase — server components by default, a typed data layer, and AI tooling (Claude Code, Cursor) woven through the dev workflow to move fast without giving up rigor.

ship

Pre-launch. Shaping the core product loop and validating it against how high-agency people actually plan and switch contexts before opening the doors.

operate

The plan every time: once it ships, run it hands-on — product, growth, and operations — the same way I've operated software businesses for two decades.

§ 06 · At a glance

The headline numbers

4 surfaces · 1 shared coreNext.js 16 · React 19 · TypeScriptSupabase Postgres · ~100 tables~213 stored proceduresRLS on every table~2,400-line timer state machineOffline queue · background sync3 LLM providers · BYOKMCP + scoped agent APIpg_cron + Vercel Cron · 26 jobsTauri v2 · WXT · PWAStripe · Google Calendar · Web Push

Figures verified against the codebase. The desktop client is a pre-release build; a React Native mobile app referenced in internal docs is not yet built. Deployed single-region on Vercel + Supabase — "scale" here means partitioning, rollup caches and rate limiting, not a bespoke cluster.

§ 04Custom Orders

Limited availability

Working on something interesting?

I take on a small number of collaborations each year — usually where I can go deep on product and engineering. If that sounds like a fit, let's talk.