Todd Watts

Behind the interface

Small systems.
Explicit decisions.

Keep the work readable when a service fails. Give state a clear owner. Make an experiment useful before adding a provider. Those decisions shape this portfolio and the demonstrations you can inspect below.

01 / Keep the core available

Content survives a failed experiment

Next.js renders the portfolio and case studies on the server. Project filters have real URLs, so the work remains navigable without client-side JavaScript. The character portrait starts with a static frame; motion is a separate, optional layer.

The tradeoff is deliberate: interactive state lives in small client components while the career story, project evidence and contact links remain ordinary pages. An unavailable feed, inference provider or database demonstration cannot gate them.

Inspect the project explorer ↗

02 / Make the first step testable

Scope before implementation

Project Advisor turns a project pattern and three constraints into a decision brief: a recommended first release, a credible alternative, explicit exclusions, and a small experiment. Changing a selected answer changes the relevant scope and steps.

The default planner uses authored rules in your browser. That makes its reasoning repeatable and usable without an external service. Your free-text goal stays in the brief for a person to review; the rules do not analyze arbitrary prose. Proposed success targets are hypotheses to agree with your team.

Build a decision brief ↗
Optional AI evaluation and request boundaries

A separate AI mode exists for configured local evaluation. A question selector receives the goal and previous answers; a writer drafts the brief when discovery finishes. Code checks the output format and quoted input. It does not independently verify the claims. This mode requires the data agreement and is blocked on deployed previews and production.

Shared limits record each paid attempt before dispatch. A bounded deadline and no automatic retry limit repeat work. Three interface decisions are not an authenticated session allowance. Neither mode browses links, checks current pricing, or establishes the feasibility of a particular system.

03 / Make transitions inspectable

Give state an owner

The workflow below moves one synthetic task through queued, running and complete. Choose the decision stage to force a failure on the first attempt, then retry it. Every control sends one bounded command through the same pure transition code.

Locally, one store in this tab owns the simulated state. In the optional SpacetimeDB implementation, the server derives ownership from the authenticated connection, stores a private row, and exposes a caller-filtered view. Reducers never accept a supplied owner ID. Sharing transition code does not make the local simulation evidence of database isolation.

Read about the state boundary ↗

Fictional architecture experiment

Follow one bounded workflow

Choose a stage and inspect a synthetic task through queued, running, failed and complete states. No free text, analytics, or visitor counts are collected.

Local simulation

Runs the same pure state machine in this tab's memory. It is not a server connection and is never presented as live data.

Optional live connection

Connects only after this button is pressed. The server derives row ownership from the authenticated connection identity.

Live demo unavailable: the public SpacetimeDB URI and database name are not configured.

1. Choose a stage

2. Send one bounded command

3. Inspect the result

Mode
idle
Stage
not started
Status
empty
Attempt
not started
Run the local simulation to inspect a task and its retry path.
How it works

Intake and output complete on their first run. Decision fails once by design, making the explicit retry path visible. Every operation is a constant-time state transition.

In live mode, reducers accept commands but no owner identity. The server uses the authenticated sender, stores rows in a private table, and exposes only the caller's row through an indexed public view.

Authentication credentials stay in session storage for this tab. A bounded reconnect sequence runs only after an explicit connection; clearing the session deletes the row and forgets the token.

What leaves your browser

  • Browsing and contactThe hosting service receives ordinary web requests. Public pages need no AI account or database identity. Email links open your mail application; the site has no contact form.
  • Local experimentsThe guided planner, workflow simulation and résumé game keep their state in this tab’s memory. They make no AI requests. Copy writes to your clipboard only when you choose it. The motion preference is stored on this device.
  • Optional live workflowAn explicit connection sends synthetic commands and connection metadata to the configured SpacetimeDB server. A tab-scoped token restores the identity after a disconnect. Clear session deletes the row while connected and forgets the token. Disconnecting or closing a tab does not necessarily delete the server row.
Data handling for configured provider services

Optional AI evaluation sends the goal and answers to this server and third-party services after the data agreement. Conversation text remains in page memory and is not saved by this application. Starting a new project clears its visible input and result; cancellation cannot retract an already dispatched request. Hosting and provider retention policies still apply. Do not submit confidential material.

Local evaluation records retain attempt numbers, provider names, timestamps, estimated costs and outcomes across server restarts, but no submitted text or provider responses. Unknown outcomes consume an attempt. The spending estimate is not a provider-enforced billing cap.

The older evidence API remains available only when configured; its finder is not in the current interface. An explicit submission sends the need to this server and, if admitted, a third-party AI service. This application does not log or persist the need. Configured Redis protection retains short-lived counters and a keyed pseudonymous client identifier, not the need or raw IP address. Request ceilings are not dollar guarantees.

These are application boundaries, not claims about every hosting or network log. The live workflow is demonstration infrastructure for synthetic data.