Case study · 2026

The JeosCraft Portal

The system running the shop you’re looking at — every client, from first brief to 90-day check-in, moves through software built for the job.

Role
Founder & sole developer
Timeline
Apr 2026 – present
Status
Running the business today
Type
Internal SaaS · this site
15
lifecycle stages

Inquiry received through 90-day check-in — each a typed email template in one registry.

8
sections in the brief

The Project Brief captures scope in ~10 minutes and autosaves every keystroke locally.

10
industry templates

Complete themed builds — trades, restaurant, salon, dental, and more — ready as starting material.

8
Postgres tables

Projects, scope, content, revisions, proposals, contracts, invoices, and an activity log.

The problem

A one-person shop makes promises a whole team usually keeps.

The homepage promises written proposals, fixed prices, milestone visibility, replies inside 48 hours, and check-ins after launch. For an agency, a project manager and a CRM keep those promises. For one developer, the honest options are a heroic inbox — or a system.

Most freelancers pick the inbox, and the process quietly becomes whatever this week’s memory allows: proposals as ad-hoc emails, scope in a thread somewhere, the 60-day check-in that never happens.

So before taking clients, I built the system — the same way I’d build it for a paying customer.

What shipped

One chain, brief to check-in.

The public half is the Project Brief at /inquiry; everything after it runs in the admin portal.

  1. The brief

    A prospective client fills out the eight-section Project Brief — business basics, goals, content, tier. It autosaves to their browser on every change and greets them with their draft if they come back later. Submitting writes the structured scope to Postgres.

  2. The spec

    The submitted brief compiles into a Markdown build specification — headers, bullets, empty fields skipped — shaped so an AI builder can act on it directly. The form's real output isn't a lead notification; it's the spec the build starts from.

  3. The dashboard

    Every inquiry becomes a project in the admin dashboard: notes, stage, and an activity log, behind magic-link auth. One place answers "where is this project and what happens next."

  4. The emails

    Each stage of the engagement — discovery scheduled, proposal sent, build started, ready for review, launched, invoice paid, 30/60/90-day check-ins — has a typed template sent from the project page via Resend, in one consistent first-person voice.

  5. The paper trail

    Proposals, contracts with their own storage bucket, invoices with Stripe fields, and an activity log recording what was sent when. The promises on the homepage — written proposals, fixed prices — have tables behind them.

How it’s built

Small system, real engineering.

The interesting decisions here aren’t scale — they’re fit: every piece sized to what a one-person shop actually needs, with the upgrade path written down where it isn’t.

The brief compiles to a build spec

The form’s real output is a Markdown specification — generated from the structured scope, empty fields skipped — written so an AI builder can act on it directly. Capturing the right information and shaping it into buildable form is the product; the email notification is a side effect.

Ten minutes of typing is never lost

The brief autosaves to the browser on every change and restores the draft with a welcome-back banner — hydration-safe, so a returning visitor’s draft never flashes or clobbers. Nobody abandons an inquiry because a tab closed.

One registry, fifteen emails

Every lifecycle stage maps to a typed builder in a single registry: adding a stage is one key and one function, and the send endpoint picks it up automatically. All fifteen render through one branded shell in the same first-person voice — no template drifting off-tone three months in.

Auth sized to the truth

One admin exists, so the system says so: magic-link sign-in via Supabase Auth against a single hardcoded admin email, enforced in middleware, with separate service-role and cookie-aware server clients. The upgrade path to a proper roles table is documented at the constant — engineering restraint as a feature, not a shortcut.

Templates as starting material

Ten complete industry builds — trades, restaurant, salon, dental, real estate, and more — live in the codebase as themed foundations, so a Starter-tier project begins from a real design, not a blank page. The brief’s tier and industry answers point straight at one.

Stack

  • Next.js 16
  • TypeScript
  • Supabase
  • PostgreSQL
  • Resend
  • Stripe
  • Tailwind v4
  • Vercel
Where it stands

You’re inside it right now.

This case study is a page in the product it describes. The Project Brief, the admin dashboard, and the lifecycle email registry run the JeosCraft client flow today; the client-facing portal views — where a client reviews milestones and pays invoices — are in active development.

It’s the smallest project on this page and the one a client feels most: every promise in the process section has a table, a template, or an endpoint behind it.