drovr

Vision

drovr is deal flow, built for agents, rat-stack to the bone. It runs the whole path of a content business's customer: the first cold visit, the email course, the offer, the purchase, the support that follows, and the 1,500-seat team deal, in one agentic product. It starts as Kit rebuilt for agents: it takes the core of what creators use Kit for (subscribers, forms, sequences, automations, broadcasts, segments, deliverability and reporting) and turns each piece into a typed capability an agent can drive. Then it adds what Kit can't do, because Kit wasn't built this way: simulation before send, receipts for every email, content as git, vendors as swappable cartridges. Support and high-touch sales are part of the same flow, not separate products.

A drover moves the herd along a defined route over days: journeys, time edges, no stragglers. drovr is the commerce engine of the content business, made durable, portable and wholly owned. Journeys are data, providers are adapters, receipts are the truth.

Scope: badass-courses/drovr, the product. Multi-tenant from day one. AI Hero is tenant one, not a special case.

Audience: Joel, the agents that build and operate deal flow, and the creators who run their business on it. Not a drag-and-drop marketing suite, and not a helpdesk or CRM workbench UI.

Reference: rat-stack is how drovr is built: Effect for the hard parts, Alchemy for the whole cloud, and a fence that makes the easy path the right one. This is non-negotiable: drovr fully realizes rat-stack's goals and ambitions, and what drovr learns shapes rat-stack's vision in return. AGENTS.md holds the law; this file holds the intent.

Who we serve

Why it exists

Email lists, sending, automations and content are the commerce engine of the content business, and today that engine is rented. The best creator email methods (Brennan Dunn's, Amy Hoy's and others', distilled in badass-courses/skills) end up as workarounds on Kit: flag tags, glossary automations, link triggers, Liquid conditionals, Deadline Funnel bolted on. Provider-captive logic is debt, and it is invisible to agents.

drovr exists so the engine is ours and agents can run it: the patterns those methods describe become first-class, typed and observable.

Beyond email: the right message at the right time

drovr is not just email marketing. It is the personalization layer of the content business: it knows where each person is on their path and shows them the right message at the right time, in their inbox, on the website, and at the offer. It is what Kit, RightMessage, and Brennan's, Amy's and Nathan's playbooks taught us, built as one agent-driven system.

What that means

Deal flow: one product, a spiral

Deal flow is drovr's one product: a graph of machines that every account moves through, from a cold first visit to the biggest sale and back out wider. The seller calls it deal flow; for the customer, it is their path. The spiral is Kathy Sierra's: start at low resolution and rise. A stranger joins the newsletter or the free course, walks a path of value, meets the offer the path calls for, and buys: one seat, a subscription, a ticket, or 1,500 seats. A turn of the spiral completes on evidence of an outcome, not on payment. One buyer gets results, their team asks, and the next turn opens at higher resolution.

Agentic by default

This app is agentic. Agents run deal flow end to end: they triage, reply, offer, quote, invoice, grant seats and open the next deal. People take part when an agent brings them in, not as a gate on every act.

Simulated worlds, all day, every day

drovr can spin up fake business worlds for agents to live in. A world is a sandboxed tenant with fake cartridges, customer agents built from the patterns of real history (never its text), drovr's own agents running the business, and a clock that runs a quarter in days. Worlds run around the clock on local intelligence. They are how a new drafter, policy or journey earns its way into production, and how drift gets caught before customers see it.

How it's built

The rat-stack way. rat-stack's own vision is to build the best Effect + Alchemy application we can, and drovr moves toward it with every path it finishes. (That north star lives in rat-stack's vision, not here.)

drovr models its business with Alchemy Domain. Joel, 2026-11-04: "we want to full adopt alchemy domains as part of our vision, aggressively." Each part of the business (access, signup, consent, content, broadcasts, delivery, send ops, flags, contacts and journeys) is one domain package of commands, aggregates, events, views, projections, policies, sagas and external systems. Stories test it in memory, and Durable Objects host it. apps/api shrinks to the Api and one thin hosting root per Worker. drovr already had this shape by hand: per-key actors decide, receipts record, projections answer, executors act. Alchemy Domain gives that shape one vocabulary, one runtime and one test style. The laws stay: journeys are data, tenant is in the types, seven ports, and receipts are the log. Where a law and Alchemy Domain disagree, the law holds until Joel rules. The adoption plan owns the order, the fit and the open questions.

The north star

Kit's core, agent-first

Kitdrovr
Subscribers, tags, custom fieldsThe contact directory: one Schema-typed profile per (tenant, contact) with a full timeline from receipts
Forms and landing pagesCapture routes that are rate-limited and captcha'd from day one; abusers hunt for open forms
Sequences and visual automationsVersioned XState journeys shipped as data; zero drag-and-drop
BroadcastsA one-shot journey over a segment of the directory, honoring suppressions, sent in configurable batches (for example 500/hour, or a target window of 6–8 hours), most engaged recipients first, and pausable and editable while sending
SegmentsProjections over the directory, receipts and engagement events
DeliverabilitySuppressions, one-click unsubscribe, and warm-up as code
ReportsReceipts and Analytics Engine grouped by journey, message, version and segment

Every capability is one Schema-described action. CLI, HTTP (with OpenAPI), MCP and code mode are projections of it, rendered from one catalog. The HUD is read-only.

Methods become primitives

The Kit workaround (from the skills)The drovr primitive
Flag-tag events, glossary automationsTyped events that journeys react to directly
Link triggers ("click to tell us who you are")Answer events (value-path.answer-selected), with click-intent filtering so mail scanners don't count as answers
Custom fields, surveys, Liquid offer funnelsA typed profile, next_offer as a projection, MDX components instead of Liquid if blocks
Deadline FunnelPer-contact deadlines as durable timers (the evergreen bridge already runs one)
Time-zone sendsThe tested calendar code
Lead scoring, behavioral segmentsDerived from receipts: the transition log is the behavior log
A/B testsContent variants as git branches, deterministic assignment by contact hash, simulated before sending
"Why didn't you buy?", post-purchase accountability, launchesJourney templates started by purchase, non-purchase and calendar events

The eight sequence types in email-sequence-architect become journey templates plus MDX scaffolds. Three already run in production: the value-path course, the evergreen bridge and the shadow newsletter. The skills are rewritten against drovr's catalog and ship with its MCP server, so an agent that connects gets the methods as well as the tools. The extracted source material stays private; drovr encodes patterns, never their text.

Contact identity is ours

Contact identity is (tenantId, contactId), not an email address or a provider id. Email is a lookup claim, normalized by trimming and lowercasing only. Plus-tags and dots stay intact. Kit, PostShiba and AI Hero ids are aliases. Conflicting claims never auto-merge.

drovr owns consent, suppression and custom fields. AI Hero's active Kit subscribers count as consented because its list is fully double opt-in; inactive or unconfirmed subscribers do not. Existing suppressions still hold.

New-id minting, the transactional identity registry and a new identity port remain open design decisions. Crypto-shredding is under design, not a shipped erasure guarantee. The full active-list broadcast proof is met: C5 #05 went out on drovr and PostShiba with no Kit share.

Content is code

What Kit can't do

Machines for time, Effect for everything they touch

An automation of any complexity is a composition, and each part has one owner.

Shape (settled at charter 2026-08-29, still true)

  1. Journeys are XState v5 machines: pure, serializable, versioned data. The machine plans; actions emit intents; executors do provider work; completion receipts advance the actor. At-least-once with idempotency keys.
  2. One contact and journey = one Durable Object: snapshot, alarm and fold in one primitive. The alarm is memoryless: time edges live in storage, one alarm arms for the soonest, due work is re-derived on fire.
  3. Tenant in types from day one: contact identity is (tenantId, contactId) everywhere. Domain packages never import auth; the boundary parses it into domain values.
  4. Authoring is agent-native: MCP, CLI, HTTP, code mode. Exactly zero drag-and-drop. The visual UI is read-only.
  5. Ports, not providers: every provider sits behind a port, and a second adapter must pass the same contract tests as the first. Adding a port needs owner sign-off (AGENTS.md).
  6. Projections never gain authority: actor snapshots are the state truth; receipts are the transition log; the SQL projections (PlanetScale MySQL), HUD and segments derive from them.

Owned storage, replaceable database

PlanetScale MySQL is the production store for main data: Joel expects drovr will need a full-featured database it can write and read fast to grow to its full potential (October 8). Joel chose it on October 4, 2026, and production reads and writes it through DROVR_DB. The main D1 is unbound from production and retained as a frozen archive; the auth and corpus D1s stay. The October 4 decision and the flip runbook own the details. We measured the move (a 2.2 GB, 3.9M-row export took minutes; the MySQL load took over 17), and those measurements shaped the cutover.

The database stays replaceable because drovr owns its storage contracts. Drizzle owns application queries through typed schemas in @drovr/database; the EventLog and ReceiptSink ports keep a second adapter honest by passing the same contract tests as the first. Cascades live in code and tests, not database foreign keys. Durable Object snapshots, alarms and DO-local SQLite are the state truth and do not move. AI Hero's PlanetScale database stays a read-only integration through AIHERO_DB.

MySQL has taken writes, so we keep the flip forward-only under the fleet's confirm-irreversible guardrail: fix forward, with no reverse copy into D1. Joel approved deleting the main D1 on 2026-10-28, and its code and resource go in steps. A limit nobody measured is a guess, so the cutover advances on measured evidence.

Guardrails

How we ship

drovr is agentic: Joel, 2026-10-23, “i want drivr agentic af”. Agents decide and act within the worker autonomy ladder, including fixing their own CI and using the authority the code already grants. Joel sets direction; his attention goes to decisions his words reserve, not desk settings presented as his gates. Before asking him, read the code and current rulings, act where they already decide, and keep independent work moving.

Small continuous releases, automated gates, a canary tenant and rolling deploys are the direction. Minimal CD comes first; a design or a green build is not proof that CD is enabled.

Release speed is a product feature. Waiting is the cost we measure first: on October 7 most of a change's time from merge to live was spent queued behind policy, not in code or gates. So:

Push each failure to the fastest layer that can catch it: lint, types, model/property tests, workerd integration, stage E2E, then production canary E2E.

Don't guess. Test, benchmark, eval. We learn what a platform actually does by pushing it until it breaks, not from conservative theory or a doc's caution. Our D1 "budget" turned out to be our own 3-second deadline. A limit nobody measured is a guess, and we label it as one.

A test earns its place by failing when behavior breaks. Hand-written mutant suites and property tests are how we know: a test that kills no mutant another test does not already kill is redundant, and a test that restates the implementation or asserts a mock is not a test. The count of tests is not a measure. Tests are written the rat-stack way: Vitest with @effect/vitest, it.effect for anything that runs an Effect, Layers for every service a test needs, TestClock for time, and property tests (it.prop) over Schema-derived inputs for every function that decides something. One runner, no node:test. The deep runs (properties at high counts, stage E2E) belong to pennywise. Following the Bitter Lesson, incidents become executable checks, not more prose rules. Validation and cutover phases end on event coverage: every required event kind meets its threshold with reconciled evidence. Missing events hold the phase; elapsed time never passes it.

The arbiter handles each risky step in four classes: real-reader email, SQL schema changes, binding/route/secret/resource changes, and provider-account writes. The arbiter also owns every release gate: plan, arm, verdict and rollback. In drovr practice, a change in none of the four classes ships without an arbiter GO; the lift fence still refuses any diff on a class path that has no logged GO. The risky-class approvals protect against irreversible harm under the fleet's confirm-irreversible guardrail. Port and durability changes still need owner sign-off. This direction grants no deploy, merge, send or CD enablement.

Outcomes