# Interest signup

Free workshop: [how to burn a trillion tokens and get good results](/tokenmaxx#interested).

## What it does

A person submits the [browser signup form](/tokenmaxx#interested). In confirmation mode, a request starts pending confirmation; the person follows the email link and confirms in the browser before the signup is confirmed. The core interest machine owns the local pending → confirmed lifecycle. Capture-only mode records the request without sending mail; it is not a confirmed signup.

`SubscriberIntake` and `SubscriberConfirm` are job-shaped ports in core. `packages/subscriber-delivery` implements external delivery outside core, and the Worker provides the adapter at composition. See [hexagonal architecture](/lore/hexagonal-architecture). List signup is separate from [account authentication](/systems/auth).

## The standard

- Submission is not confirmation. A person's email confirmation is required before joining.
- Consent is explicit: the person chooses to submit the signup form. An agent must not infer permission to subscribe someone from their address or an unrelated request.
- Rate-limited and honeypot submissions receive a neutral answer rather than revealing whether an address is on file. Invalid addresses and expired confirmation links have deliberate refusal responses.
- Provider details remain outside core; `no-core-adapters` enforces that boundary.
- Today, joining remains a person's browser step. Agent-assisted intake is coming; it must retain explicit consent and the person's email confirmation.

## How to check

- Read `apps/mischief/src/interest/routes.ts` and `handlers.ts` for submission, neutral answers, and browser confirmation. Check the Worker composition and configured mode before interpreting a capture as a pending signup.
- Run `pnpm --filter @rat-stack/core test` for lifecycle behavior and `pnpm --filter @rat-stack/mischief test` for submission and confirmation seams. `pnpm --filter @rat-stack/subscriber-delivery test` checks the adapter contract.
- With an authorized test address, use the browser form, receive the confirmation email, follow its link, and confirm. Source and local tests alone do not prove inbox delivery or the external list state.
- Check [OpenAPI](/openapi.json) and the [agent guide](/llms.txt) before treating any planned agent intake as available. Do not bypass confirmation.


## Sources

1. [Interest lifecycle machine](<https://github.com/joelhooks/rat-stack/blob/main/packages/core/src/interest-machine.ts>)
   GitHub joelhooks/rat-stack. Local pending, confirmation, and capture states. Accessed 2026-10-01.

2. [Subscriber intake port](<https://github.com/joelhooks/rat-stack/blob/main/packages/core/src/interest-intake.ts>)
   GitHub joelhooks/rat-stack. Job-shaped intake service contract. Accessed 2026-10-01.

3. [Subscriber confirmation port](<https://github.com/joelhooks/rat-stack/blob/main/packages/core/src/interest-confirm-port.ts>)
   GitHub joelhooks/rat-stack. Job-shaped confirmation service contract. Accessed 2026-10-01.

4. [Subscriber delivery adapter](<https://github.com/joelhooks/rat-stack/tree/main/packages/subscriber-delivery>)
   GitHub joelhooks/rat-stack. External delivery implementations outside core. Accessed 2026-10-01.

5. [Interest HTTP routes](<https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/interest/routes.ts>)
   GitHub joelhooks/rat-stack. Browser submission, confirmation, and result routing. Accessed 2026-10-01.

6. [Interest handlers](<https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/interest/handlers.ts>)
   GitHub joelhooks/rat-stack. Neutral answers, mode choices, and delivery composition. Accessed 2026-10-01.

## Lore on this page

- [Double opt-in](/lore/double-opt-in)


## Linked from

- A clean playground → rat-stack is a place to do real work with pieces that stay easy to add and remove. → [Read page](<https://ratstack.sh/lore/a-clean-playground>)
- Agent guide → An Effect stack so pure (aspirational) Kit Langton will blush. → [Read page](<https://ratstack.sh/llms.txt>)
- Change log → What changed in the files served here, newest first. → [Read page](<https://ratstack.sh/log>)
- Full agent guide → An Effect stack so pure (aspirational) Kit Langton will blush. → [Read page](<https://ratstack.sh/llms-full.txt>)
- HATEOAS → Links in a representation tell its reader what to do next; rat-stack applies that idea to agent surfaces. → [Read page](<https://ratstack.sh/lore/hateoas>)
- Hexagonal architecture → Ports name the application's jobs; adapters connect them to the outside world. → [Read page](<https://ratstack.sh/lore/hexagonal-architecture>)
- Hosted agent front door → Discovery documents, HTTP, MCP, A2A, and bounded code mode expose the public reference to agents. → [Read page](<https://ratstack.sh/systems/agent-front-door>)
- log.md → The generated change log as Markdown. → [Read page](<https://ratstack.sh/log.md>)
- One capability, every surface → A schema-typed contract and one handler feed every interface rat-stack keeps. → [Read page](<https://ratstack.sh/lore/one-capability-every-surface>)
- Rat Stack systems | rat-stack → The systems rat-stack ships, the standard each keeps, and how to check it. → [Read page](<https://ratstack.sh/systems>)
- rat-stack → An Effect stack so pure (aspirational) Kit Langton will blush. → [Read page](<https://ratstack.sh/>)
