2026 · FIRST BUILD

RiskScanAI

CIS IG1 risk assessment for small businesses — my first product, started off GitHub in late January; 160 commits across 15 active days.

SHELVED
START HERE Never make a user wait on an AI My first product's worst bug wasn't the AI being wrong. It was awaiting the model inside a web request that dies at 26 seconds. Read the full story →
160COMMITS
3PULL REQUESTS
15BUILD DAYS
SOURCE: GITHUB COMMIT HISTORY · 2026-06-12
Build cadence — commits per active day
Feb 27 Heaviest day: 34 commits · Mar 17 Mar 23
RiskScanAI screenshot
  1. The pitch: a consultant-grade risk assessment that used to cost $10K+, delivered from plain-language questions.
  2. Take the free snapshot — the funnel starts unauthenticated by design; guest, free, and paid tiers gate at the paid features.
  3. A linked security-practices page — the one hardening day that replaced decorative token checks with real verification sits behind it.
  4. Plain language, a ~10-minute snapshot, no credit card — the conversion framing of the three tiers.

Overview

My first product: a small business answers ~25 questions and gets an AI-written security assessment, an AI interview that digs deeper, and an exportable report — with three paid tiers. Started off GitHub in late January; 160 commits over 15 active days once the repository existed.

Project Design

First product, first agent workflow — and where the foundational patterns were paid for: the async background-work architecture from a six-day timeout war, a one-day security retrofit that replaced decorative token checks with real verification, and a failure taxonomy for AI output mapping what users see to which contract piece broke.

First build — React SPA, Netlify Functions, Supabase, Claude
Frontend
React 18 + ViteZustand storesReact Router SPA
API / edge
11 Netlify Functions + edge auth guardClerk JWT verification26s timeout pins + background functions
Data
Supabase Postgres + RLS (5 tables)Code-level ownership re-checks on service-role queriesAudit log
External
Claude (Sonnet 4, cached prompts)Clerk authStripe (idempotent webhooks)

Key modules

Pipeline

Snapshot engine

A 21-question, 5-section intake feeding deterministic domain scoring.

Data

Derived-signals processor

Computes risk tier, compliance tracks, and active signals server-side — stable for prompt caching.

AI

Summary pipeline

Returns a 202 and generates the Claude risk summary in a background function the frontend polls.

AI

Interview chat

A domain-by-domain CIS IG1 gap interview that emits structured state via delimiter blocks.

Pipeline

Report generation

Enriches findings into a NIST CSF view with PDF and PowerPoint exports.

Auth

Access & payments

Three-tier guest/free/paid gating over Clerk + Stripe with idempotent webhooks.

Key features

Never await an LLM — the async summary

Netlify cuts off an HTTP request at 26 seconds; a Claude summary under load can take longer. The first version called the model inline, so heavy requests returned a 504 error page that the frontend then tried to parse as JSON — and crashed. The fix splits the work: finishing the questionnaire returns immediately with a deterministic summary built from the derived signals, schedules the Claude call in a background function with a 15-minute budget, and the page polls every few seconds, swapping in the richer AI version when it's ready. The user never stares at a spinner waiting on the model.

Snapshot submitted202 + background task scheduledFallback summary shown (~3s)Claude finishes in backgroundPoll detects resultAI summary swapped in
The HTTP request never blocks on Claude — no 26s timeout, no 504

Security & ops decisions

Tenant isolation
Authenticated request
Token signature verified — one hardening day replaced a decorative check with real verification
Row-level security on all five tables, keyed on the JWT subject claim (the user's stable ID from the signed token)
Service-role functions re-enforce ownership in code — a deliberate second layer

Builder notes

Lessons learned

What carried forward

Everything — the successor is literally the same repository continued. Six agent skills and three reviewer agents survived into a roster that grew to 42 and 11, and the honest verdict (“nobody pays for an AI-interview risk assessment”) re-aimed the product at a question businesses do pay attention to.

Posts from this project

POSTMORTEM

Never make a user wait on an AI

My first product's worst bug wasn't the AI being wrong. It was awaiting the model inside a web request that dies at 26 seconds.

JUN 2026 · 5 MIN
"A written rule is a suggestion. A gate is a control."
The operating principle behind every project here. The same bug shipped three times past written rules — and zero times past a CI gate. Deterministic enforcement beats advisory documentation, in agent harnesses and security programs alike.