diff --git a/.gitignore b/.gitignore index 8fe973de8..02cd11bcd 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ hugo.linux # Other .DS_Store .* +!.okf !.claude .claude/**/*.json .claude/**/*.sh diff --git a/.okf/build/hugo-build.md b/.okf/build/hugo-build.md new file mode 100644 index 000000000..a84473d7e --- /dev/null +++ b/.okf/build/hugo-build.md @@ -0,0 +1,29 @@ +--- +type: Build Pipeline +title: Hugo build (bin/hugo-build) +description: Canonical build + validation entry point; runs Hugo plus the course validators including the banned-strings ratchet. +resource: bin/hugo-build +tags: [build, hugo, validation] +timestamp: 2026-07-13T00:00:00Z +--- + +`bin/hugo-build` builds the site into `public/` and runs the validation +suite. Zero build breaks is a hard rule - all content changes must pass it +before commit. + +# Key facts + +- Course pages get extra validators, including the banned-strings ratchet + driven by [data/course_banned_strings.yaml](/content/banned-strings-ratchet.md). +- The ratchet only sees rendered HTML text. It CANNOT see inside SVG artwork + or mermaid diagram labels - defects there need the + [visual scroll gate](/workflows/render-verification.md). +- Build twice as a control before blaming an edit for output flicker: + Hugo stats/PurgeCSS interactions can produce nondeterministic diffs + (term-casing races, header partialCached race). + +# Examples + +```bash +bin/hugo-build # build + validate +``` diff --git a/.okf/build/index.md b/.okf/build/index.md new file mode 100644 index 000000000..ebb1f25de --- /dev/null +++ b/.okf/build/index.md @@ -0,0 +1,5 @@ +# Build & Test + +* [Hugo build pipeline](hugo-build.md) - bin/hugo-build with the 8 course validators +* [Test gates](test-gates.md) - the three suites and when each is a commit blocker +* [Template PDFs](pdf-templates.md) - regenerating the downloadable course PDFs diff --git a/.okf/build/pdf-templates.md b/.okf/build/pdf-templates.md new file mode 100644 index 000000000..9529215ca --- /dev/null +++ b/.okf/build/pdf-templates.md @@ -0,0 +1,20 @@ +--- +type: Build Pipeline +title: Course template PDFs +description: bin/generate-template-pdfs regenerates the downloadable course PDFs from built pages; run it after editing any template chapter. +resource: bin/generate-template-pdfs +tags: [build, pdf, course] +timestamp: 2026-07-13T00:00:00Z +--- + +The course offers downloadable PDF versions of its template chapters +(worksheet, ownership checklist, and siblings). They are generated FROM the +built HTML pages, so any content change to a template chapter silently +stales its PDF. + +# Steps + +1. Edit the template chapter markdown. +2. `bin/hugo-build` +3. `bin/generate-template-pdfs` +4. Commit the regenerated PDFs together with the content change. diff --git a/.okf/build/test-gates.md b/.okf/build/test-gates.md new file mode 100644 index 000000000..daf440be1 --- /dev/null +++ b/.okf/build/test-gates.md @@ -0,0 +1,29 @@ +--- +type: Playbook +title: Test gates and when they block commits +description: bin/rake test:critical always; bin/test AND bin/dtest are both mandatory for any themes/, layouts/, or CSS change. +tags: [testing, visual-regression, gates] +timestamp: 2026-07-13T00:00:00Z +--- + +# The three suites + +| Command | What it is | When required | +|---|---|---| +| `bin/rake test:critical` | Critical Minitest suite (46 runs / 84 screenshots) | After every change, before every commit | +| `bin/test` | Visual regression on macOS host (baselines in `test/fixtures/screenshots/macos/`) | Any edit to `themes/`, `layouts/`, `*.css`, or post body HTML | +| `bin/dtest` | Same suite in Linux/Docker (baselines in `linux/`) - CI runs Linux | Same trigger as bin/test; skipping it ships green-locally / red-in-CI | + +# Hard-won caveats + +- The snapshot tool REWRITES baselines when a run passes. Never edit CSS + while a suite is running - a raced run once saved a corrupt baseline + missing its hero image. Catch with pixel-compare, restore via `git checkout`. +- Visual failures are commit blockers, not warnings. Either fix the + regression or update BOTH baseline dirs (macos/ and linux/) in the same + commit with the intentional change. +- Content-only + standalone-SVG waves need only + [bin/hugo-build](/build/hugo-build.md) + `test:critical`. +- Docker runs via Colima; fresh worktrees need `bun install` first. +- Tests must assert behavior shape (`q=\d+`, has ``), never tunable + config values (exact quality/width numbers). diff --git a/.okf/content/banned-strings-ratchet.md b/.okf/content/banned-strings-ratchet.md new file mode 100644 index 000000000..9ea319626 --- /dev/null +++ b/.okf/content/banned-strings-ratchet.md @@ -0,0 +1,25 @@ +--- +type: Validator +title: Banned-strings ratchet +description: data/course_banned_strings.yaml pins every fixed prose defect so it cannot silently regress; entries can be scoped to a single page. +resource: data/course_banned_strings.yaml +tags: [validation, course, regression] +timestamp: 2026-07-13T00:00:00Z +--- + +When a review sprint fixes a prose defect (a wrong tool name, a banned +phrase, a stale threshold), the exact defective string is added to +`data/course_banned_strings.yaml`. [bin/hugo-build](/build/hugo-build.md) +fails if it reappears in rendered course HTML. + +# Rules + +- Entries support per-page scoping (e.g. "Airtable" is banned only on the + operating-kit page where it was a fabricated attribution) and exemptions + (rescue framing is allowed on Going Further rescue chapters). +- The ratchet reads rendered text only - it is blind to text inside SVG + artwork and mermaid labels. Artwork defects are caught by the + [render-verification playbook](/workflows/render-verification.md) instead. +- After fixing any prose defect, grep your own replacement text for the + exact pattern you just removed - re-introducing the defect being fixed is + a blocking failure. diff --git a/.okf/content/course-canon.md b/.okf/content/course-canon.md new file mode 100644 index 000000000..1220b3967 --- /dev/null +++ b/.okf/content/course-canon.md @@ -0,0 +1,33 @@ +--- +type: Reference +title: Course canon numbers +description: The single source of truth for every recurring number in the course; any chapter that contradicts these is defective. +tags: [course, canon, consistency] +timestamp: 2026-07-13T00:00:00Z +--- + +# Canonical values + +| Fact | Canon | +|---|---| +| Founding Hypothesis score | ≥14/20 across four lenses | +| Smoke test traffic | 300 cold visitors | +| Interviews | 10 (from a 30-name list, expanded if replies run thin) | +| Build / pivot / kill gate | 7+ strong signals build · 4-6 pivot · under 4 kill | +| Prototype test subjects | 5 interview subjects | +| Sean Ellis must-have test | 40% - directional at ≥10 respondents, useful at 20+, sliceable at 30+ | +| Cold reply bands | 3-8% realistic; <5% stop and diagnose · 5-10% continue · >10% accelerate | +| Paid pilot deposit | $500+ refundable, via Stripe | +| Tracking tool | Google Sheet - never Airtable | +| AI token pass-through | disciplined $80-$120/dev/mo · undisciplined $300-$500; industry range $80-$300 | +| Slopsquatting source | Lasso Security research March 2025; "slopsquatting" coined by Infosecurity Magazine April 2025 | + +# Recurring cast (keep consistent across chapters) + +- **Mia** - the walkthrough protagonist (TutorMatch). +- **Marcos** (author) and **Priya** (reviewer) - the PR-review example pair. + Spelling is "Marcos", never "Marcus". PR #847 = the refund-branch review + story; the weekly-report admin-search example uses PR #843. + +Structural home: [course structure](/content/course-structure.md). +Enforcement: [banned-strings ratchet](/content/banned-strings-ratchet.md). diff --git a/.okf/content/course-structure.md b/.okf/content/course-structure.md new file mode 100644 index 000000000..94d06c042 --- /dev/null +++ b/.okf/content/course-structure.md @@ -0,0 +1,34 @@ +--- +type: Content Architecture +title: Course structure (From Idea to First Paying Customer) +description: 5-module linear spine defined in data/course_sequence.yaml, plus a non-linear Going Further set, per-module Mia walkthroughs, and template chapters. +resource: content/course/tech-for-non-technical-founders-2026/ +tags: [course, structure, hugo] +timestamp: 2026-07-13T00:00:00Z +--- + +# The spine + +The reading order lives in `data/course_sequence.yaml` - Chapter 0 +(how-this-course-works) then Modules 1-5 (hypothesis → smoke test → +interviews → brief/build → first paying customer). The prev/next strip, +branch-aware forks, and the `course-stat` shortcode all derive from that +file. Never hardcode exact chapter counts in prose; use near numbers +("20+ chapters"). + +# Outside the spine + +- **Going Further set** (linked from the 5.7 closing callout): continuation + chapters (churn triage, pivot-or-persevere), the hire-track reference, + demoted management chapters (engineering org chart, friday demo rule, + three questions standup, weekly dev report), and the AI-in-production trio + (agency AI questions → AI token bill → slopsquatting, badged Step 1-3 of 3). +- **Mia walkthroughs**: one per module (`module-N-walkthrough-mia`). +- **Templates**: worksheet/checklist/script chapters with + [generated PDFs](/build/pdf-templates.md). +- **Reference deep-dives** under `reference/` (hypothesis-sprint-full, + smoke-test-channel-guide, stripe-price-test-full). +- **Floating glossary**: five-tech-words-stop-nodding-at, reachable from every + chapter, not in the linear order. + +All chapter facts must agree with the [course canon](/content/course-canon.md). diff --git a/.okf/content/index.md b/.okf/content/index.md new file mode 100644 index 000000000..344404089 --- /dev/null +++ b/.okf/content/index.md @@ -0,0 +1,6 @@ +# Content + +* [Course structure](course-structure.md) - the 5-module spine, Going Further set, and course_sequence.yaml +* [Course canon](course-canon.md) - the numbers every chapter must agree on +* [Voice rules](voice-rules.md) - Sam voice, banned patterns, and the em-dash rule +* [Banned-strings ratchet](banned-strings-ratchet.md) - how fixed prose defects stay fixed diff --git a/.okf/content/voice-rules.md b/.okf/content/voice-rules.md new file mode 100644 index 000000000..40939e201 --- /dev/null +++ b/.okf/content/voice-rules.md @@ -0,0 +1,42 @@ +--- +type: Style Guide +title: Course voice rules (write for Sam) +description: The reader is Sam, an idea-stage non-technical first-time founder; plain-words glossing, dash style, and the banned structural patterns. +tags: [voice, style, course] +timestamp: 2026-07-13T00:00:00Z +--- + +Full guides: `docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md` +and the course-specific rules in `CLAUDE.md`. This concept records the +rules that recur in review sprints. + +# Core rules + +- **Write for Sam, not Paul.** Sam is an idea-stage non-technical founder. + Course bodies never use rescue/trauma framing (that ICP is the website's + "Alex", not the course's Sam); the Going Further rescue chapters are the + exemption. +- **Gloss at first mention** - every acronym/tool/term gets a plain-words + parenthetical the first time it appears in the reading order (SOW, MSA, + SLA, FTE, PLG, ARPU, MAU, RAG-status, 0day...). +- **Dashes**: always "-", never "—" - in prose AND inside SVG/mermaid artwork. +- **Progressive disclosure**: orientation blocks orient; thresholds and + mechanics belong where the reader acts on them. +- **Callout rhythm**: no two adjacent same-form callouts. + +# Banned structural patterns (reject on sight) + +Slogany reveal-twist flips ("X wasn't Y - it was Z"), cinematic time-cut +narration, anonymous-founder-vignette openers repeated 3+ chapters in a row, +aphoristic flourish closers, fabricated cohort stats without a source, +`## Why this matters` headings, "Founders who / Most founders / Founders we +worked with", dual-source statistical openers, sustained staccato. + +Sentence-level slop scoring is necessary but NOT sufficient - shape-tell +review (essay arc, pivot sentences, cloned scaffolding) runs alongside it. + +Regression sweep before any handback: + +```bash +grep -rn "## Why this matters\|Founders who\|Most founders\|Founders we worked with" content/course/ +``` diff --git a/.okf/design/course-typography.md b/.okf/design/course-typography.md new file mode 100644 index 000000000..ee1bedd9e --- /dev/null +++ b/.okf/design/course-typography.md @@ -0,0 +1,34 @@ +--- +type: Design System +title: Course reading typography +description: Course pages read at 20px/1.65 body scale (blog keeps 22.4px); overrides must mirror the full single-post.css selector chain or they silently lose. +resource: themes/beaver/assets/css/style.css +tags: [css, typography, course] +timestamp: 2026-07-13T00:00:00Z +--- + +# The scale (course pages only) + +| Element | Value | +|---|---| +| Body p / li | 20px / 1.65 | +| li margin | 12px | +| Blockquote/callout p | 19px / 1.6 | +| Worksheet card p, ws-checks li | 17px / 1.55 | +| ws-route p | 16.5px | + +The blog keeps its thoughtbot-anchored 22.4px scale - the course override is +scoped with a `.section-course` prefix. + +# The specificity trap + +`single-post.css` sets body type via +`.blog article.single-content .fl-rich-text p` (specificity 0,3,2). Any +course override weaker than that silently loses - a plain +`.section-course .blog p` (0,2,1) does nothing. Mirror the FULL chain: +`.section-course .blog article.single-content .fl-rich-text p`. + +Also: broad element rules (e.g. the 20px li rule) can invert component +hierarchies - the worksheet-card checklist items got bumped to 20px and had +to be re-pinned to 17px. After any type change, run both visual suites per +[test gates](/build/test-gates.md). diff --git a/.okf/design/cover-pipeline.md b/.okf/design/cover-pipeline.md new file mode 100644 index 000000000..7e0a2b32d --- /dev/null +++ b/.okf/design/cover-pipeline.md @@ -0,0 +1,29 @@ +--- +type: Playbook +title: Course cover rebuild pipeline +description: Covers are rebuilt as full HTML per .stitch/design.md rendered headless at 2400x1260; chip-composite for single-fact edits. +resource: .stitch/design.md +tags: [covers, design, stitch] +timestamp: 2026-07-13T00:00:00Z +--- + +Original covers were Stitch-made and their downloads are auth-gated, so the +working rebuild path is: author a full HTML page implementing the spec and +screenshot it headless at 2400x1260. + +# Spec essentials (.stitch/design.md) + +- Titles: Space Grotesk 800, letter-spacing -0.03em +- Chip labels: Inter 600, 22px, letter-spacing 0.14em +- Chip values: Space Grotesk 700 +- Status line: JetBrains Mono +- Palette: JetVelocity - obsidian dark, Ruby red #cc342d, neon purple #a855f7 + +# Techniques + +- Full rebuild: HTML file in scratchpad → headless Chrome screenshot → + `cover.png` (update the `cover_image_alt` frontmatter to match). +- Single-fact edit (one chip's wording): chip-composite - render just the + corrected chip and composite it over the existing PNG with magick. +- Watch sub-glyph grazes on chips ("%", trailing "E"); fix with explicit + `
` splits and ` ` slack, verify with zoomed re-renders. diff --git a/.okf/design/house-visual-spec.md b/.okf/design/house-visual-spec.md new file mode 100644 index 000000000..b3aa5500c --- /dev/null +++ b/.okf/design/house-visual-spec.md @@ -0,0 +1,32 @@ +--- +type: Design System +title: House in-post visual spec +description: Hand-drawn SVG house style - paper tones, 2-2.5px strokes, semantic colors (green = money only), labels inside shapes. +resource: .stitch/prompts/course-inpost-visual-prompt.md +tags: [svg, design, course] +timestamp: 2026-07-13T00:00:00Z +--- + +# The spec in one table + +| Element | Rule | +|---|---| +| Backgrounds | Paper tones: #fff5f5 (red-tint), #faf7f2 (cream), #f0f9f0 (green), #fbe9ff (purple) | +| Strokes | 2-2.5px, hand-drawn feel | +| Red | Action / anti-pattern | +| Purple | Alternate path | +| Green | ONLY money/success outcomes | +| Amber | Warnings | +| Typography | Caveat / Patrick Hand / Comic Sans MS cursive stack | +| Labels | INSIDE shapes (Sweller split-attention rule); never bare diamonds | +| Dashes | "-" only, including inside artwork | + +# Exemplars + +`invoice-loop.svg` (ai-token-bill) and `network-buckets.svg` are the +canonical compact hand-drawn exemplars - numbered step cards, outcome cards, +dashed loop, header + italic subtitle, ~960x470. + +Diagrams taller than 2x viewport read as a wall, not a hook - replace with a +compact SVG or table. Verify every new visual with the +[render-verification playbook](/workflows/render-verification.md). diff --git a/.okf/design/index.md b/.okf/design/index.md new file mode 100644 index 000000000..bac55cdfa --- /dev/null +++ b/.okf/design/index.md @@ -0,0 +1,6 @@ +# Design + +* [Mermaid theme](mermaid-theme.md) - the Caveat webfont root-cause fix and the theming gotchas +* [House visual spec](house-visual-spec.md) - paper tones, semantic colors, hand-drawn identity +* [Cover pipeline](cover-pipeline.md) - rebuilding course covers from the design spec +* [Course typography](course-typography.md) - the course-scoped reading scale and the specificity trap diff --git a/.okf/design/mermaid-theme.md b/.okf/design/mermaid-theme.md new file mode 100644 index 000000000..022d1c214 --- /dev/null +++ b/.okf/design/mermaid-theme.md @@ -0,0 +1,40 @@ +--- +type: Design System +title: Mermaid house theme and the Caveat webfont fix +description: Mermaid renders in Caveat handwritten cursive, loaded explicitly and awaited via document.fonts.ready; label metrics gotchas documented. +resource: themes/beaver/layouts/baseof.html +tags: [mermaid, fonts, design] +timestamp: 2026-07-13T00:00:00Z +--- + +# Root cause worth remembering + +The Caveat webfont was historically NEVER loaded - mermaid fell back to the +platform's generic cursive (Apple Chancery on macOS) and measured labels +with different metrics than it rendered, causing a whole class of recurring +last-character clipping. The fix in `baseof.html`: + +1. Google Fonts Caveat `` (+ preconnects), gated on `features.mermaid`. +2. `startOnLoad: false` and `document.fonts.ready.then(() => mermaid.run())`. +3. Font stack `'Caveat', 'Patrick Hand', 'Comic Sans MS', cursive` - mirrors + the in-post SVGs' fallback. + +# Theming gotchas + +- NEVER set font-size/padding on `.edgeLabel` via `themeCSS` - it applies + AFTER measurement and reintroduces the measure/render mismatch. +- Labels ending in wide glyphs (%) clip; append ` ` inside the label or + keep edge labels to 1-2 words. +- Bare diamond decision nodes are banned - use rects. +- Flowchart spacing: `nodeSpacing: 45, rankSpacing: 55, padding: 14`. +- Mermaid code fences render via + `themes/beaver/layouts/_markup/render-codeblock-mermaid.html`, which sets + `features.mermaid`. + +# Brand rule + +Handwritten typography in diagrams is a non-negotiable brand identity - +the owner rejected a clean-sans mermaid theme on sight the same day he had +approved it in the abstract. Fix legibility structurally (compact SVG, +table) rather than by changing the font. See the +[house visual spec](/design/house-visual-spec.md). diff --git a/.okf/index.md b/.okf/index.md new file mode 100644 index 000000000..091b515fb --- /dev/null +++ b/.okf/index.md @@ -0,0 +1,16 @@ +--- +okf_version: "0.1" +--- + +# JetThoughts Blog & Course — Knowledge Bundle + +Curated operational knowledge for the Hugo static site at +`jetthoughts.github.io`, with emphasis on the 2026 course project +(`content/course/tech-for-non-technical-founders-2026/`). + +# Sections + +* [Build & Test](build/) - build pipeline, validators, and the blocking test gates +* [Content](content/) - course structure, canonical numbers, and voice rules +* [Design](design/) - mermaid theme, house visual spec, covers, typography +* [Workflows](workflows/) - render-verification recipes and review-swarm patterns diff --git a/.okf/log.md b/.okf/log.md new file mode 100644 index 000000000..78dfcfe93 --- /dev/null +++ b/.okf/log.md @@ -0,0 +1,6 @@ +# Bundle Update Log + +## 2026-07-13 +* **Update**: taste anchor established at `.stitch/course-taste-design.md` - Stitch-skill DESIGN.md encoding the course design language + anti-pattern bans; used as the scoring lens for taste-critic passes (see [review-swarm](/workflows/review-swarm.md)). +* **Update**: [render-verification](/workflows/render-verification.md) - render from `_dest/public-dev/` (relative URLs), never the stale repo-root `public/`; stale-tree reviews produce false missing-asset findings. +* **Initialization**: Created the bundle with build/, content/, design/, and workflows/ sections distilled from CLAUDE.md, docs/workflows/, .stitch/design.md, and the 2026-07 course review sprints. diff --git a/.okf/workflows/index.md b/.okf/workflows/index.md new file mode 100644 index 000000000..de645119b --- /dev/null +++ b/.okf/workflows/index.md @@ -0,0 +1,4 @@ +# Workflows + +* [Render verification](render-verification.md) - headless Chrome + slicing recipes for the visual scroll gate +* [Review swarm](review-swarm.md) - the two-critic review pattern and its failure modes diff --git a/.okf/workflows/render-verification.md b/.okf/workflows/render-verification.md new file mode 100644 index 000000000..0d5f377f5 --- /dev/null +++ b/.okf/workflows/render-verification.md @@ -0,0 +1,48 @@ +--- +type: Playbook +title: Render verification (visual scroll gate) +description: The working headless-Chrome capture, page-slicing, and SVG re-render recipes used to inspect every scroll view of a page. +tags: [verification, chrome, screenshots] +timestamp: 2026-07-13T00:00:00Z +--- + +Text validators cannot see rendered output - mermaid clipping, SVG text +crossing borders, stale cover badges, and wrong-direction "diagram above" +references are all invisible to grep. Canonical protocol: +`docs/workflows/visual-scroll-gate.md`. + +# Render from _dest/public-dev, NEVER public/ + +[bin/hugo-build](/build/hugo-build.md) outputs to `_dest/public-dev/` with +RELATIVE asset URLs (covers and SVGs work over file://). The repo-root +`public/` directory is a stale artifact of raw `hugo` runs or the dev +server (localhost:1717 or canonified production URLs baked in) - reviewing +it produces false "missing image / missing cover / nav overlap" findings. +The 2026-07-13 review wave lost a whole finding class to this. + +# Working capture recipe (macOS) + +Chrome never exits on its own - background it and kill after a sleep: + +```bash +'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' \ + --headless --disable-gpu --user-data-dir=$(mktemp -d) \ + --hide-scrollbars --window-size=1280,20000 --virtual-time-budget=8000 \ + --screenshot=page.png "file:///path/to/public/.../index.html" & P=$! +sleep 14; kill $P +``` + +- 390-wide window for mobile first-fold; raw headless is NOT full mobile + emulation. +- Slice for inspection: `magick page.png -trim +repage -crop 1280x2400 +repage p-%02d.png` +- Standalone SVGs: `rsvg-convert -w 1400 file.svg -o out.png` then inspect. +- Line-fraction crop estimates are unreliable (tables/code expand); iterate + crops or measure with getBoundingClientRect. + +# The gate + +Walk EVERY slice at 1280x800 and 390x844 and actually look at each one +before handback. Score new visuals on: great look / functional / earns the +next scroll / helpful. Any NO on the last two = rollback or redesign. +Diagram checklist lives in the [house visual spec](/design/house-visual-spec.md) +and [mermaid theme](/design/mermaid-theme.md). diff --git a/.okf/workflows/review-swarm.md b/.okf/workflows/review-swarm.md new file mode 100644 index 000000000..06cf9d64a --- /dev/null +++ b/.okf/workflows/review-swarm.md @@ -0,0 +1,43 @@ +--- +type: Playbook +title: Two-critic review swarm +description: The proven module-review loop - a design critic (full render walk) plus a content-canon critic, followed by verified fixer waves. +tags: [swarm, review, process] +timestamp: 2026-07-13T00:00:00Z +--- + +# The loop + +1. Build the site so critics inspect fresh output. +2. Spawn a DESIGN critic (renders every page via the + [render-verification recipe](/workflows/render-verification.md), scores + worst-first) and a CONTENT-CANON critic (diffs numbers against the + [course canon](/content/course-canon.md), sweeps banned patterns, checks + links) in parallel, in the background. +3. Adjudicate reports; VERIFY every claim against the actual files/renders + before acting - critics are sometimes wrong about line numbers or values. +4. Fix surgically (one attribute = one edit; never re-theme the page). +5. Add ratchet entries for fixed prose defects + ([banned-strings ratchet](/content/banned-strings-ratchet.md)). +6. Gates per [test gates](/build/test-gates.md), commit to the sprint + branch, one bundled PR per sprint. + +# Taste pass (premium bar) + +After defect review, run taste critics scoring 1-10 against +`.stitch/course-taste-design.md` - defect checklists miss "technically +fine but not premium" (monotone callout runs, brand living only in the +cover, wall-shaped diagrams). Adjudicate critic conflicts against the +anchor text, not majority vote: taste-e's red-metric ruling beat +taste-a's recolor suggestion because the anchor names Ruby as the brand +accent ink. + +# Known failure modes + +- Agents often go idle WITHOUT sending their report - nudge via SendMessage, + and verify their work in the tree regardless. +- Session-limit failures kill whole waves; respawn after the reset rather + than retrying immediately. +- Fixer geometry claims (SVG sizes, clipping fixed) must be re-verified by + your own re-render - one wave shipped a wording truncation nobody saw. +- Parallel sessions contend on .git/index.lock - wait-loop before git ops. diff --git a/.stitch/course-taste-design.md b/.stitch/course-taste-design.md new file mode 100644 index 000000000..ff0d9e651 --- /dev/null +++ b/.stitch/course-taste-design.md @@ -0,0 +1,91 @@ +# Design System: From Idea to First Paying Customer (course pages) + +Stitch-compatible DESIGN.md for the 2026 course. Single source of truth for +taste-scoring course pages and for generating Stitch concepts of in-post +visuals. Where this conflicts with generic design advice, THIS file wins - +the handwritten identity is owner-mandated brand (sans artwork was rejected +on sight 2026-07-12). + +## 1. Visual Theme & Atmosphere + +A founder's annotated field notebook: warm paper surfaces, hand-drawn +diagrams with confident 2-2.5px strokes, dark editorial covers that snap +against the cream page. Density "Daily App Balanced" (5) - every H2's worth +of prose earns one visual break. Variance "Offset Asymmetric" (5) - diagrams +are horizontal strips and card rows, never symmetric 3-up grids. Motion +"Static Restrained" (2) - the page holds still; the hand-drawn line carries +the energy. + +## 2. Color Palette & Roles + +- **Paper Cream** (#faf7f2) - default diagram card fill +- **Blush Paper** (#fff5f5) - red-tinted fill for action/anti-pattern cards +- **Mint Paper** (#f0f9f0) - green-tinted fill, money/success outcomes ONLY +- **Lilac Paper** (#fbe9ff) - purple-tinted fill for alternate paths +- **Ruby Ink** (#cc342d) - action, anti-pattern, "stop" accents; brand red +- **Forest Ink** (#2e7d32) - money and success outcomes ONLY, never decoration +- **Violet Ink** (#a855f7) - alternate path, optional branch +- **Amber Ink** (#d97706 on #fffbeb) - warnings and conditional states +- **Notebook Black** (#1a1a1a) - primary artwork text; never #000000 +- **Pencil Gray** (#555/#666) - captions, subtitles, annotations + +Covers only (JetVelocity): obsidian dark ground, Ruby red #cc342d, neon +purple #a855f7 - the dark cover is the one deliberate contrast slam per page. + +## 3. Typography Rules + +- **Artwork (SVG/mermaid):** `"Caveat", "Patrick Hand", "Comic Sans MS", cursive` + - the full stack is MANDATORY (SVG-as-img cannot load webfonts; Comic Sans + MS is the only handwritten face reliably installed - omitting it re-enters + the platform font lottery). +- **Covers:** Space Grotesk 800 titles (-0.03em), Inter 600 chip labels + (22px / 0.14em), Space Grotesk 700 chip values, JetBrains Mono status. +- **Body prose:** theme sans at 20px/1.65 (course scope), li margin 12px, + callouts 19px/1.6. +- **Depicted UI/code inside artwork:** sans/mono is CORRECT when the artwork + imitates a real screen, email, or terminal - the handwritten voice is for + the diagram's own labels, headers, and annotations. +- **Dashes:** "-" everywhere, including inside artwork. "—" is banned. + +## 4. Component Stylings + +* **Diagram cards:** paper fill, 2-2.5px Notebook Black or semantic-ink + border, 12-14px radius, label INSIDE the shape (Sweller split-attention). +* **Step strips:** numbered pill chips (Ruby fill, white numeral) + arrows, + header + italic Pencil Gray subtitle - exemplar `invoice-loop.svg`. +* **Callouts:** red-left-border aside is the default; `bq-good` (green) / + `bq-bad` (red) variants for good/bad exemplars; `bq-tldr` for TL;DR. Never + two same-form callouts adjacent. +* **Tables:** decision aids and comparisons; 6+ visually identical rows need + per-row differentiation (color-coded labels, icons, or grouped sub-tables). +* **Worksheet cards (`ws-*`):** cream card, checkbox squares, dashed verdict + strip, green go-route / purple alt-route. + +## 5. Layout Principles + +- Diagrams are compact horizontal strips (~960x300-560); anything taller + than 2x viewport reads as a wall and must become a strip or table. +- First fold (1280x800) always carries a visual hook - dark cover or + handwritten strip. Pure-text heroes are a defect. +- One visual break per H2 run; 3+ H2s of plain prose is a rhythm defect. +- No overlap: labels never cross borders; artwork text never grazes edges + (verify by render - Caveat metrics differ from sans). + +## 6. Motion & Interaction + +None inside the course pages. Mermaid renders after `document.fonts.ready` +(never remove - it kills the measure/render font mismatch class of bugs). + +## 7. Anti-Patterns (Banned) + +- Sans-serif diagram labels/headers (except depicted-UI mimicry, §3) +- Green used for anything but money/success; conditional states in green +- Bare diamond decision nodes; mermaid edge labels over 2 words +- Font stacks missing the Comic Sans MS fallback +- Em-dashes anywhere; year-stamped "LABEL // 2026" typography +- Fabricated metrics in artwork (numbers must come from the page's canon) +- Decorative visuals that add no information (delete instead) +- Corporate-slide look: symmetric 3-equal-card rows, glossy gradients, + neon glows, stock photography, generic icon arrays +- "Scroll to explore" filler, emoji in artwork, pure #000000 +- Repeating one callout form 3+ times in a row on a page diff --git a/.stitch/prompts/course-inpost-visual-prompt.md b/.stitch/prompts/course-inpost-visual-prompt.md new file mode 100644 index 000000000..14e76a306 --- /dev/null +++ b/.stitch/prompts/course-inpost-visual-prompt.md @@ -0,0 +1,79 @@ +# Master prompt — in-post course visuals (inline SVG + mermaid) + +Reusable AI-design prompt for redesigning the diagrams that live INSIDE course +pages (not covers). Written 2026-07-12 after a design-critic triage of all ~70 +in-post visuals. Covers get `.stitch/prompts/course-landing-hero-prompt.md`; +this file governs everything rendered in the reading column. + +--- + +Redesign an informational diagram that sits inline in a long-form lesson for a +non-technical first-time founder ("Sam"). The diagram interrupts reading, so it +must pay for the interruption: a reader who looks ONLY at the diagram should +learn the section's core decision or structure in under 5 seconds. + +CONTEXT CONSTRAINTS: +- Renders in a ~688px-wide reading column on WHITE page background (mobile: + ~360px, may scroll horizontally inside its own container but must stay + legible without zooming). +- It is content, not decoration: labels INSIDE shapes (Sweller split-attention + rule); if a separate paragraph is needed to explain it, the diagram failed. +- One diagram = one idea. If it needs two ideas, make two diagrams or a table. + +HOUSE FAMILY - "informational sketch, drawn by a confident hand": +- Paper-tone fills: #fff5f5 (warm) / #faf7f2 (cream) / #f0f9f0 (success tint) + / #fbe9ff (purple tint) on white; NEVER dark backgrounds inline. +- Stroke grammar: uniform 2-2.5px strokes, rounded corners (rx 10-16), slight + per-card rotation (max ±1.5°) allowed for the sketch feel - but ALL shapes in + one diagram share the same stroke weight and corner language. +- Color = meaning, never mood: red #cc342d for the action/anti-pattern side, + purple #a855f7 for the alternate branch, green #2e7d32 ONLY for + pass/money/success, amber #b8860b sparingly for warnings, gray #666 for + neutral structure. Two accent colors max per diagram plus green if there is + a success state. +- Typography: Caveat / Patrick Hand for labels (>=15px effective at column + width), plain sans-serif is acceptable for dense table-like cells; NEVER + mix a third family; NEVER let a font fallback to system defaults (embed or + restrict text to the declared stack + sans-serif tail). The handwritten + family is the house identity - the owner rejected a clean-sans diagram + variant on sight (2026-07-12). +- Hierarchy: exactly one visual entry point (title or biggest shape); reading + order left-to-right or top-to-bottom, marked with arrows that touch the + shapes they connect; annotations in gray italic BELOW or BESIDE, never + across artwork. + +MERMAID-SPECIFIC (when the diagram stays a mermaid block): +- The handwritten family STAYS. A clean-sans mermaid theme was shipped and + rejected by the owner on sight the same day (2026-07-12: "typography is + not handwritten") - and it clipped labels anyway (sans glyphs are wider + than mermaid's measured boxes). Fix legibility STRUCTURALLY: an + oversized / awkward / all-red flowchart becomes a compact hand-drawn + SVG in the house family (exemplar: ai-token-bill invoice-loop.svg) or + a decision table - not a font change. +- Always include the house init: theme base, fontFamily 'Caveat, Patrick + Hand, cursive', fontSize >=20px, primaryColor #fff5f5, + primaryBorderColor #cc342d, lineColor #333, primaryTextColor #1a1a1a. + The site-level default in baseof.html already carries these; the + per-diagram init is for repo-greppable self-containment. +- Rect nodes with the question/threshold INSIDE; never bare diamonds (they + crush cursive text). +- Edge labels: mermaid's measured label box runs ~1 glyph short, so labels + ending in a wide glyph (%, digits, K) clip their last character. Append + ` ` inside the label (`-->|Over 40% |`) or keep edge labels to + 1-2 short words and move thresholds into the node. Never set font-size + or padding on .edgeLabel via themeCSS - it applies after measurement. +- Max ~6 nodes per direction; a sequential checklist of gates is NOT a + flowchart - render it as a decision TABLE instead (proven pattern: + engineering-org-chart, pivot-or-persevere). +- LR for <=6 short-label nodes in a row; TD for branching; never a staircase + (LR+TD mixed) - it scales the whole render down to micro-text. + +QUALITY GATES (reject if any fails): +- Screenshot at 688px column width: every label legible without zoom. +- No text within 12px of any border it doesn't belong to; nothing crosses + another element's text. +- Squint test: the diagram's ONE idea survives blurring (hierarchy holds). +- Family test: put it beside network-buckets.svg and page-anatomy.svg - it + must look drawn by the same hand. +- Information test: delete the diagram - if the section loses nothing, the + diagram should not exist (fix by adding the missing info, not ornament). diff --git a/CLAUDE.md b/CLAUDE.md index 98a311de0..3d93263cc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -30,6 +30,19 @@ Always read these files before making changes. They define the project's archite --- +## 📚 OKF Knowledge Bundle (`.okf/`) + +Distilled operational knowledge lives in the OKF v0.1 bundle at `.okf/` (markdown + YAML frontmatter, one concept per file). **Consume it via progressive disclosure**: read `.okf/index.md` first, then follow links into only the concepts relevant to the task. + +- `.okf/build/` — build pipeline, blocking test gates, template-PDF regeneration +- `.okf/content/` — course structure, canonical numbers, voice rules, banned-strings ratchet +- `.okf/design/` — mermaid/Caveat theme, house visual spec, cover pipeline, course typography +- `.okf/workflows/` — render-verification recipes, review-swarm pattern + +**Maintain it as you work**: when you learn something durable (a new canon number, a root-cause fix, a workflow gotcha), update the affected concept file and its `timestamp`, refresh the section `index.md`, and append a dated entry to `.okf/log.md`. Validate with `/okf:validate .okf --strict` before committing bundle changes. + +--- + ## 🔍 Research Protocol (MANDATORY) **Session start**: Always read `@docs/workflows/BASE_HANDBOOK.md` and `@docs/workflows/flow-router.md`. diff --git a/content/course/tech-for-non-technical-founders-2026/_index.md b/content/course/tech-for-non-technical-founders-2026/_index.md index 311bb0f6d..3c7c3c22d 100644 --- a/content/course/tech-for-non-technical-founders-2026/_index.md +++ b/content/course/tech-for-non-technical-founders-2026/_index.md @@ -171,22 +171,28 @@ These conditional chapters kick in once you've passed the Module 5 gate. Read ea **Diagnose what's slowing growth** -- Customers leaving faster than you can replace them → [Churn Triage Before Acquisition](/course/tech-for-non-technical-founders-2026/customers-leaving-churn-triage-not-acquisition/) -- A key metric flat for 2+ months → [Pivot or Persevere](/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/) -- Hit the self-serve ceiling, time to hire your first engineer → [Hire Track Reference](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/) +| Trigger | Continuation chapter | +|---|---| +| Customers leaving faster than you can replace them | [Churn Triage Before Acquisition](/course/tech-for-non-technical-founders-2026/customers-leaving-churn-triage-not-acquisition/) | +| A key metric flat for 2+ months | [Pivot or Persevere](/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/) | +| Hit the self-serve ceiling, time to hire your first engineer | [Hire Track Reference](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/) | **Working with a dev agency in the AI era** -- Before the discovery call → ["We Use AI" Follow-Up Questions](/course/tech-for-non-technical-founders-2026/agency-uses-ai-follow-up-questions/) -- Surprise AI tokens on the invoice → [AI Token Bill](/course/tech-for-non-technical-founders-2026/ai-token-bill-dev-shop-pass-through-cost/) -- Worried about AI supply-chain risk in the code they ship → [Slopsquatting](/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/) +| Trigger | Continuation chapter | +|---|---| +| Before the discovery call | ["We Use AI" Follow-Up Questions](/course/tech-for-non-technical-founders-2026/agency-uses-ai-follow-up-questions/) | +| Surprise AI tokens on the invoice | [AI Token Bill](/course/tech-for-non-technical-founders-2026/ai-token-bill-dev-shop-pass-through-cost/) | +| Worried about AI supply-chain risk in the code they ship | [Slopsquatting](/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/) | **Manage a hired team without writing code** -- Need a structure for who reports to whom → [Engineering Org Chart](/course/tech-for-non-technical-founders-2026/engineering-org-chart-non-technical-founder/) -- Want a weekly heartbeat to confirm something shipped → [Friday Demo Rule](/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/) -- Want a 3-question standup that catches problems early → [Three Standup Questions](/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/) -- Need a plain-English weekly report from the team → [Weekly Dev Report](/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/) +| Trigger | Continuation chapter | +|---|---| +| Need a structure for who reports to whom | [Engineering Org Chart](/course/tech-for-non-technical-founders-2026/engineering-org-chart-non-technical-founder/) | +| Want a weekly heartbeat to confirm something shipped | [Friday Demo Rule](/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/) | +| Want a 3-question standup that catches problems early | [Three Standup Questions](/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/) | +| Need a plain-English weekly report from the team | [Weekly Dev Report](/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/) | ## Already started building? diff --git a/content/course/tech-for-non-technical-founders-2026/agency-ai-five-questions/index.md b/content/course/tech-for-non-technical-founders-2026/agency-ai-five-questions/index.md index 41794c6b1..998cc0d5e 100644 --- a/content/course/tech-for-non-technical-founders-2026/agency-ai-five-questions/index.md +++ b/content/course/tech-for-non-technical-founders-2026/agency-ai-five-questions/index.md @@ -30,7 +30,7 @@ related_posts: false Five questions that catch AI theatre in 30 minutes - hand them to your next agency call before you sign anything. -By the end of one Tuesday discovery call you will know whether the agency claiming "we use AI to ship 3x faster" can describe what their developers do with Cursor on a Wednesday morning, or whether the AI talk is a slide. Five questions, sent in writing 24 hours before the call, scored 0 or 1 in real time. Two failed questions is a walkaway. +By the end of one Tuesday discovery call you will know whether the agency claiming "we use AI to ship 3x faster" can describe what their developers do with Cursor on a Wednesday morning, or whether the AI talk is a slide. Five questions, sent in writing 24 hours before the call, scored 0 or 1 in real time. Three failed questions is a walkaway. A founder we picked up in Q1 2026 had been three weeks deep with an "AI-native" agency that promised a four-week MVP for $34K. She asked for a walkthrough of one PR the team had merged that week. The lead developer screenshared a staging branch; her independent advisor paused the screen-share and pointed at line 14 of `config/database.yml`: an OpenAI API key, a Stripe live key, and a database password committed in plaintext, on a public-by-default GitHub repo. @@ -48,6 +48,10 @@ If the agency declines to answer in advance, that is a 0 on every question. Exer ## The five questions +Keep this card open during the call - the pass signal sits beside the fail signal for each question, with a box to score 0 or 1 in real time. The full criteria for each are in the sections below. + +![The five agency AI questions on one card - the pass signal beside the fail signal for each, with a box to score 0 or 1 in real time](scorecard-at-a-glance.svg) + ### Q1 - The workflow question > "Walk me through how a developer on your team takes a Jira ticket and ends up with merged code, when they use AI in the loop. Name the tools, the prompt patterns, and the human review gates. Use a real ticket your team closed last week." @@ -82,7 +86,7 @@ If the agency declines to answer in advance, that is a 0 on every question. Exer *slopsquatting: when AI suggests a package name that doesn't exist, an attacker registers it, and your build pulls the malicious version. See the [dedicated chapter](/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/).* -> "In April 2025 a security researcher published findings that AI assistants suggested over 200 package names across Rubygems, PyPI, and npm that did not exist; attackers register those names and wait for developers to install the typo. How does your team prevent installing a hallucinated gem or pip package?" +> "In March 2025 a security researcher published findings that AI assistants suggested over 200 package names across Rubygems, PyPI, and npm that did not exist; attackers register those names and wait for developers to install the typo. How does your team prevent installing a hallucinated gem or pip package?" **Pass:** A pre-vetted allowlist with a written process for adding new packages. A scanner like Socket or Snyk on every PR that blocks the build on new dependencies until a human approves. They use the term "slopsquatting" without prompting and cite the [Infosecurity Magazine writeup](https://www.infosecurity-magazine.com/news/ai-hallucinations-slopsquatting/) or the [SecurityWeek piece on AI coding agents and supply-chain risk](https://www.securityweek.com/ai-coding-agents-could-fuel-next-supply-chain-crisis/). @@ -109,7 +113,7 @@ The AI-theatre pattern: the salesperson takes every question. Answers come back One concrete contrast on Q3: > Bad: "Our senior reviews every PR. We have a high standard." -> Good: "Open PR #1247 - Marcus reviewed it Tuesday morning. He flagged that Cursor had added `gem 'active_record_extras_helper'` to the Gemfile - a gem that does not exist on Rubygems. He blocked the merge and asked the developer to use the real `active_record_extra` gem. The hallucinated name would have been a slopsquat install if an attacker had registered it." +> Good: "Open PR #1247 - Marcos reviewed it Tuesday morning. He flagged that Cursor had added `gem 'active_record_extras_helper'` to the Gemfile - a gem that does not exist on Rubygems. He blocked the merge and asked the developer to use the real `active_record_extra` gem. The hallucinated name would have been a slopsquat install if an attacker had registered it." ## What to do after the call diff --git a/content/course/tech-for-non-technical-founders-2026/agency-ai-five-questions/scorecard-at-a-glance.svg b/content/course/tech-for-non-technical-founders-2026/agency-ai-five-questions/scorecard-at-a-glance.svg new file mode 100644 index 000000000..dd39bbedd --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/agency-ai-five-questions/scorecard-at-a-glance.svg @@ -0,0 +1,66 @@ + + The five agency AI questions on one card: the pass signal beside the fail signal for each, scored 0 or 1 + + + + + Score the call from this card + Give 1 point when the answer lands on the Pass side, 0 when it lands on Fail. Full criteria below. + + + + + + + Question + PASS = 1 point + FAIL = 0 points + + + + + Q1 + Workflow: ticket to code + Tools by version + a real PR + “Senior decides,” no PR + + + + Q2 + Cost: $/dev/mo, who pays + $ range + pass-through in SOW + “Included in the rate” + + + + Q3 + Verify: reviewer checks + Opens real PR, names checks + “We trust the model / CI” + + + + Q4 + Slopsquatting defense + Allowlist/scanner + says word + “Our devs know packages” + + + + Q5 + Accountability: owned it + Dated incident + root cause + “Never had one” / not my job + + + Score in real time. A total of 2 or below out of 5 - do not sign, no matter how good the pitch. + diff --git a/content/course/tech-for-non-technical-founders-2026/agency-uses-ai-follow-up-questions/index.md b/content/course/tech-for-non-technical-founders-2026/agency-uses-ai-follow-up-questions/index.md index f6de52d91..f12f87901 100644 --- a/content/course/tech-for-non-technical-founders-2026/agency-uses-ai-follow-up-questions/index.md +++ b/content/course/tech-for-non-technical-founders-2026/agency-uses-ai-follow-up-questions/index.md @@ -51,7 +51,7 @@ Score 0 or 1 in real time during the discovery call. Below 3 means walk. | # | Question | Pass (1) | Fail (0) | |---|---|---|---| | Q1 | **Workflow:** walk one Jira ticket to merged PR with AI | Named tools, written gates, real PR number from last week | Slogans, no PR shown | -| Q2 | **Cost:** per-developer monthly AI token spend, who pays | Dollar range, pass-through written into SOW, sample invoice line | "It's all included" | +| Q2 | **Cost:** per-developer monthly AI token spend, who pays | Dollar range, pass-through written into the SOW (statement of work), sample invoice line | "It's all included" | | Q3 | **Verification:** what senior checks on a 200-line AI PR | Opens real PR on screenshare, names checks line by line | "We trust the model" | | Q4 | **Slopsquatting:** how do you stop a hallucinated package install | Named defense (allowlist, Socket/Snyk, gated CI), uses the term unprompted | Confused look | | Q5 | **Accountability:** who is on the hook for an AI-caused incident | Specific incident with date, root cause, named reviewer, workflow change | "We've never had one" | @@ -100,7 +100,7 @@ Ask which human's name shows up on the agency's `Assisted-by:` lines this week. ### Q4 - The slopsquatting question -> "In April 2025 a security researcher published findings that AI assistants suggested over 200 package names across Rubygems, PyPI, and npm that did not exist. Attackers register those names and wait for developers to install the typo. How do you prevent installing a hallucinated package?" +> "In March 2025 a security researcher published findings that AI assistants suggested over 200 package names across Rubygems, PyPI, and npm that did not exist. Attackers register those names and wait for developers to install the typo. How do you prevent installing a hallucinated package?" A passing answer names a specific defense: a pre-vetted package allowlist with a written process for adding new dependencies, a scanner like [Socket](https://socket.dev/) or [Snyk](https://snyk.io/) on every PR that blocks the build until a human approves any new package, or a manual `gem info ` / `pip show ` / `npm view ` step before any new dependency lands. @@ -139,8 +139,8 @@ Same five questions, two completely different conversations: | # | AI Theatre (walk away) | AI Direction (sign with confidence) | |---|---|---| | Q1 | "Our developers use AI where it makes sense. We are AI-native." | "Cursor + Claude 4.5 Sonnet. Here is PR #1247 from Tuesday." | -| Q2 | "It's all included in the rate. Don't worry about token costs." | "$140-$220 per dev per month. SOW pass-through. Sample invoice line below." | -| Q3 | "We trust the model. Cursor catches the obvious stuff." | "Marcus reviewed PR #1247 - flagged a hardcoded API key." | +| Q2 | "It's all included in the rate. Don't worry about token costs." | "$140-$220 per dev per month for our stack. SOW pass-through. Sample invoice line below." | +| Q3 | "We trust the model. Cursor catches the obvious stuff." | "Marcos reviewed PR #1247 - flagged a hardcoded API key." | | Q4 | "Our developers know what packages to use." [confused look] | "Socket on every PR. Allowlist in `Gemfile.policy`. Yes, slopsquatting." | | Q5 | "We've never had an AI-related incident. Our standards are high." | "March 14: AI-generated webhook retried 8x. Added idempotency key." | | Score | 0 / 5 - polite no the same evening | 5 / 5 - ask for AI-project references next | @@ -150,7 +150,7 @@ Same five questions, two completely different conversations: Run the call on a 30-minute Zoom block. Hold the timer. ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% flowchart TD A["0-3 min
Set the frame
(you sent the questions
24h ago; senior present?)"] A --> B["3-23 min
Walk Q1 - Q5
(~4 min each)
Score 0/1 in Notion live"] @@ -161,10 +161,12 @@ flowchart TD classDef intro fill:#e8f4f8,stroke:#0277bd,stroke-width:2.5px,color:#1a1a1a classDef body fill:#fff5f5,stroke:#cc342d,stroke-width:2.5px,color:#1a1a1a classDef pass fill:#f0f9f0,stroke:#2e7d32,stroke-width:2.5px,color:#1a1a1a + classDef cond fill:#fffbeb,stroke:#d97706,stroke-width:2.5px,color:#1a1a1a classDef fail fill:#fce4ec,stroke:#c2185b,stroke-width:2.5px,color:#1a1a1a class A intro class B,C body - class D,E pass + class D pass + class E cond class F fail ``` diff --git a/content/course/tech-for-non-technical-founders-2026/ai-persona-pre-validation-mom-test-prep/index.md b/content/course/tech-for-non-technical-founders-2026/ai-persona-pre-validation-mom-test-prep/index.md index b5c2afe7a..a8c06f179 100644 --- a/content/course/tech-for-non-technical-founders-2026/ai-persona-pre-validation-mom-test-prep/index.md +++ b/content/course/tech-for-non-technical-founders-2026/ai-persona-pre-validation-mom-test-prep/index.md @@ -60,20 +60,7 @@ Real interviews stay irreplaceable for the things rehearsal cannot simulate: the This chapter is the companion polish step between Ch 2.1 (where you learned the Mom Test technique and drafted 5-8 rough questions) and Ch 2.3-2.4 (where you recruit 10 real interviewees). You don't validate anything here - the real interviews do that. You catch the broken question shapes before they reach a real human - one focused rehearsal session can save you several wasted interview slots. Here's the rehearsal flow at a glance: -```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% -flowchart TD - Start(["Your draft Mom Test questions
+ your customer blank from Ch 1.1"]) - P1["Prompts 1-2: Build 3 ICP personas,
test each draft question in-character"] - P2["Prompt 3: Get Claude's
out-of-character diagnosis"] - P3["Prompts 4-5: Surface 3 likely objections,
sharpen weak questions (past-anchored)"] - Done(["5-7 sharpened questions
+ Objection Tracker → real interviews"]) - - Start --> P1 - P1 --> P2 - P2 --> P3 - P3 --> Done -``` +![The rehearsal flow at a glance: bring in your draft question list plus the Ch 1.1 customer blank, run Prompts 1-2 to build 3 ICP personas and test each question in-character, Prompt 3 for Claude's out-of-character diagnosis, Prompts 4-5 to surface 3 objections and sharpen weak questions past-anchored, and leave with 5-7 sharpened questions plus an Objection Tracker for real interviews](rehearsal-loop.svg) ## Why rehearse with AI at all diff --git a/content/course/tech-for-non-technical-founders-2026/ai-persona-pre-validation-mom-test-prep/rehearsal-loop.svg b/content/course/tech-for-non-technical-founders-2026/ai-persona-pre-validation-mom-test-prep/rehearsal-loop.svg new file mode 100644 index 000000000..f5b6ea0ee --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/ai-persona-pre-validation-mom-test-prep/rehearsal-loop.svg @@ -0,0 +1,93 @@ + + The rehearsal flow at a glance: bring in your draft Mom Test question list plus the customer blank from Ch 1.1. Prompts 1-2 build 3 ICP personas and test each draft question in-character. Prompt 3 gets Claude's out-of-character diagnosis of each question. Prompts 4-5 surface 3 likely objections and sharpen the weak questions to be past-anchored. You leave with 5-7 sharpened questions plus an Objection Tracker, ready for real interviews. + A left-to-right strip of five cards joined by arrows: an input card, three numbered prompt-step cards, and an output card. Input: your draft question list plus the customer blank. Step 1 (Prompts 1-2): build 3 ICP personas, test each draft question in-character. Step 2 (Prompt 3): get Claude's out-of-character diagnosis. Step 3 (Prompts 4-5): surface 3 objections and sharpen weak questions past-anchored. Output: 5-7 sharpened questions plus an Objection Tracker, into real interviews. + + + + + + + + + The rehearsal flow at a glance + Sharpen the question list with 3 free Claude prompts before booking real interviews. + + + + + INPUT + Draft question + list (5-8) + + customer blank + (Ch 1.1) + + + + + + + 1 + PROMPTS 1-2 + Build 3 personas + Test each draft + question + in-character + + + + + + + 2 + PROMPT 3 + Diagnose + Claude's out-of- + character read + on each Q + + + + + + + 3 + PROMPTS 4-5 + Objections + fix + Surface 3 objections. + Rewrite weak Qs + past-anchored + + + + + + OUTPUT + 5-7 sharpened Qs + + Objection + Tracker + → real interviews + + + + + + + + + + The in-character answer is plausible by default - the out-of-character diagnosis is where you learn. + diff --git a/content/course/tech-for-non-technical-founders-2026/ai-token-bill-dev-shop-pass-through-cost/index.md b/content/course/tech-for-non-technical-founders-2026/ai-token-bill-dev-shop-pass-through-cost/index.md index ce5fd0f98..f1bc57188 100644 --- a/content/course/tech-for-non-technical-founders-2026/ai-token-bill-dev-shop-pass-through-cost/index.md +++ b/content/course/tech-for-non-technical-founders-2026/ai-token-bill-dev-shop-pass-through-cost/index.md @@ -35,7 +35,7 @@ course_nav: false > > **Input:** a signed agency contract OR a hire who claims "AI-augmented." > -> **Output:** monthly AI cost predicted within ±20% + 3 contract clauses you add to the next SOW +> **Output:** monthly AI cost predicted within ±20% + 3 contract clauses you add to the next SOW (statement of work) **Supplementary content.** This chapter is relevant after you've shipped (Module 4+) and your product touches AI in production. Bookmark and return when needed. @@ -97,7 +97,7 @@ Take your invoice in three numbers. - Avg per-dev AI cost: $100/month (disciplined: Cursor seat + Claude Code with budget alerts) - Agency margin: 0% (per Clause 1 in the SOW) - Expected monthly AI line: **$400 ± 20% = $320 to $480** -- If invoice shows $1,800: undisciplined developer (Devon in the table above), 30% hidden margin, or both - 15-minute conversation either way +- If invoice shows $1,800: undisciplined developer (like Devon in the invoice table below), 30% hidden margin, or both - 15-minute conversation either way **Worked example - 2-dev team with one heavy agent-loop user:** @@ -113,21 +113,7 @@ The trade-off you are accepting: ±20% is a wide band. AI usage is genuinely var Paste these into your next SOW under "Pricing and Pass-Through Costs." If the agency redlines all three, that tells you something. If they accept all three with a shrug, that also tells you something useful. -```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% -flowchart TD - A[Sign SOW with the 3 clauses] --> B[Predict bill: devs x avg x margin] - B --> C{Month-2 invoice arrives} - C -->|Within +/-20%| D[Pay it. Mark as baseline] - C -->|>20% over| E[Itemized breakdown required] - E --> F{Itemization explains it?} - F -->|Yes - Devon hit a hard ticket| G[Update budget alert. Continue] - F -->|No - margin or padding| H[Push back. Cite Clause 1] - D --> I[Quarterly: review dashboards under Clause 3] - G --> I - H --> I - I --> A -``` +![The month-2 invoice loop: sign the SOW with the 3 clauses, predict the bill (devs x avg AI cost x margin), compare the invoice. Within plus-or-minus 20 percent: pay it and mark the baseline. 20 percent or more over: demand the itemized breakdown - a hard ticket raises the budget alert, margin or padding gets pushed back under Clause 1. Quarterly, review the dashboards under Clause 3 and re-predict.](invoice-loop.svg) ### Clause 1 - Pass-through caps diff --git a/content/course/tech-for-non-technical-founders-2026/ai-token-bill-dev-shop-pass-through-cost/invoice-loop.svg b/content/course/tech-for-non-technical-founders-2026/ai-token-bill-dev-shop-pass-through-cost/invoice-loop.svg new file mode 100644 index 000000000..01d066d69 --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/ai-token-bill-dev-shop-pass-through-cost/invoice-loop.svg @@ -0,0 +1,93 @@ + + The month-2 invoice loop: sign the SOW with the 3 clauses, predict the bill, compare the invoice. Within plus-or-minus 20 percent, pay it and mark the baseline. 20 percent or more over, demand the itemized breakdown - a hard ticket updates the budget alert, margin or padding gets pushed back citing Clause 1. Quarterly, review the dashboards under Clause 3. + Three numbered step cards in a row: sign the SOW, predict the bill with the formula devs times average times margin, month-2 invoice arrives. The invoice card forks into two outcome cards: a green card for within 20 percent - pay it, mark it the baseline - and an amber card for 20 percent or more over - demand the itemized breakdown, with two inner lines: a check for a hard ticket that updates the budget alert, and a cross for margin or padding that gets pushed back under Clause 1. A dashed loop arrow returns to the predict step with the caption: quarterly, review the dashboards under Clause 3. + + + + + + + + + + + + The month-2 invoice loop + Predict the bill first - then the invoice is a comparison, not a surprise. + + + + + + 1 + Sign the SOW + with the 3 clauses below + + + + + + + 2 + Predict the bill + devs × avg AI cost × margin + + + + + + + 3 + The invoice lands + compare it to the prediction + + + + + + + + + + + + + + Within ±20% of the prediction + Pay it. Mark it as the baseline + for every month after. + + + + + + 20%+ over: demand the breakdown + One dev hit a hard ticket → raise the + budget alert and carry on. + Margin or padding → push back, cite Clause 1. + + + + + Quarterly: open the usage dashboards yourself (Clause 3), then re-predict next month's bill. + diff --git a/content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/build-path-decision-worksheet.pdf b/content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/build-path-decision-worksheet.pdf index 4a1ef50f6..84226145d 100644 Binary files a/content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/build-path-decision-worksheet.pdf and b/content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/build-path-decision-worksheet.pdf differ diff --git a/content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/index.md b/content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/index.md index b79d23a39..7a9817539 100644 --- a/content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/index.md +++ b/content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/index.md @@ -50,161 +50,74 @@ Total time budget: 30 minutes alone, 20 minutes with one peer, 0 minutes second- ## The 5 questions - check the box that matches -``` -=========== BUILD PATH DECISION WORKSHEET =========== - -Founder: _________________ Date: ____________________ - -one-page brief finalized on: ____________________ - -Months of runway in the bank: ________________________ -``` +
+
FounderDate
+
One-page brief finalized on
+
Months of runway in the bank
+
### Q1: Is the problem validated? -``` ------------------------------------------------------- -Q1. Is the problem validated? ------------------------------------------------------- - -Counts as YES only if all 4 below are true: - [ ] 10 or more Mom Test interviews complete - [ ] Strong past-behavior signal in at least 7 of 10 - [ ] Smoke test cleared the 6%+ "Promising" band - - the share of visitors who left their email on - your test page (Module 1, Chapter 1.4) - [ ] Prototype test: 4 of 5 people reached the right - screen without you coaching them (from Module 2) - -LinkedIn likes do not count. "They said they would -buy" does not count. What people DID counts - the -sign-ups on the smoke test and the prototype run, not -what they said they would do. Pre-orders and paid -pilots come later (Module 5); you do not need them -to answer YES here. - -VERDICT: [ ] Yes [ ] No - -If NO -> stop here. Path 1 (Validate without code). - Run the Airbnb test this week. - -If YES -> go to Q2. -``` +
+

Counts as YES only if all 4 below are true:

+
    +
  • 10 or more Mom Test interviews complete
  • +
  • Strong past-behavior signal in at least 7 of 10
  • +
  • Smoke test cleared the 6%+ "Promising" band - the share of visitors who left their email on your test page (Module 1, Chapter 1.4)
  • +
  • Prototype test: 4 of 5 people reached the right screen without you coaching them (from Module 2)
  • +
+

LinkedIn likes do not count. "They said they would buy" does not count. What people DID counts - the sign-ups on the smoke test and the prototype run, not what they said they would do. Pre-orders and paid pilots come later (Module 5); you do not need them to answer YES here.

+
Verdict Yes No
+
If NO → stop here. Path 1 (Validate without code). Run the Airbnb test this week.
+
If YES → go to Q2.
+
### Q2: How backend-heavy is the build? -``` ------------------------------------------------------- -Q2. How backend-heavy is the build? ------------------------------------------------------- - -Check every TRUE row: - [ ] Live updates that appear on screen without - anyone refreshing the page (like watching - someone type in Google Docs or Slack) - [ ] Heavy jobs that run in the background and keep - retrying if they fail (mass emails, big uploads) - [ ] An AI model runs every time someone uses the - feature, and each run costs real money (more - than a cent per use) - [ ] Many separate companies use the same app and - none can ever see another company's data - [ ] The app connects to 5 or more outside services - (payments, email, maps, calendars, and so on) - [ ] Regulated data - health records (HIPAA), stored - credit-card numbers (PCI), or enterprise - security audits (SOC 2) - -VERDICT: - [ ] 0-1 boxes checked = LIGHT backend - [ ] 2-3 boxes checked = MID backend - [ ] 4 or more checked = HEAVY backend - -If HEAVY -> Path 4 (Hire a team - see the hire-track - supplementary reference, linked in the - verdict table below). - Read the SOW guide before kickoff. - -If LIGHT or MID -> go to Q3. -``` +
+

Check every TRUE row:

+
    +
  • Live updates that appear on screen without anyone refreshing the page (like watching someone type in Google Docs or Slack)
  • +
  • Heavy jobs that run in the background and keep retrying if they fail (mass emails, big uploads)
  • +
  • An AI model runs every time someone uses the feature, and each run costs real money (more than a cent per use)
  • +
  • Many separate companies use the same app and none can ever see another company's data
  • +
  • The app connects to 5 or more outside services (payments, email, maps, calendars, and so on)
  • +
  • Regulated data - health records (HIPAA), stored credit-card numbers (PCI), or enterprise security audits (SOC 2)
  • +
+
Verdict 0-1 boxes checked = LIGHT backend 2-3 boxes checked = MID backend 4 or more checked = HEAVY backend
+
If HEAVY → Path 4 (Hire a team - see the hire-track supplementary reference, linked in the verdict table below). Read the SOW guide before kickoff.
+
If LIGHT or MID → go to Q3.
+
### Q3: What is your runway? -``` ------------------------------------------------------- -Q3. What is your runway? ------------------------------------------------------- - -Months of cash until you must show paying customers: - - [ ] Less than 4 months - [ ] 4 to 12 months - [ ] 12 or more months - -If LESS THAN 4 -> Path 1 (Validate without code), - regardless of how validated you - feel. The Airbnb test is the only - experiment that fits in the window. - -If 4 TO 12 -> Paths 2, 3 are on the table. Go to Q4. - -If 12+ -> Paths 2, 3, 4 are on the table. Go to Q4. -``` +
+

Months of cash until you must show paying customers:

+
Less than 4 months 4 to 12 months 12 or more months
+
If LESS THAN 4 → Path 1 (Validate without code), regardless of how validated you feel. The Airbnb test is the only experiment that fits in the window.
+
If 4 TO 12 → Paths 2, 3 are on the table. Go to Q4.
+
If 12+ → Paths 2, 3, 4 are on the table. Go to Q4.
+
### Q4: What is your monthly engineering budget? -``` ------------------------------------------------------- -Q4. What is your monthly engineering budget? ------------------------------------------------------- - -Money you can commit for at least 6 months: - - [ ] $0 to $400/wk of your own time - [ ] $1,600 to $4,000/mo (Fractional CTO band) - [ ] $5,000 to $30,000/mo (small team band) - [ ] $30,000+ /mo (multi-person team band) - -If $0-$400 -> Path 2 (Self-serve / Ch 4.3 then 4.4). - Paste one-page brief into Lovable. - -If $1.6K-$4K -> go to Q5. - -If $5K-$30K -> Path 3 (Fractional CTO) until problem - complexity demands more. - -If $30K+ -> Path 4 (Hire a team - see the hire-track - supplementary reference, linked in the - verdict table below). -``` +
+

Money you can commit for at least 6 months:

+
$0 to $400/wk of your own time $1,600 to $4,000/mo (Fractional CTO band) $5,000 to $30,000/mo (small team band) $30,000+ /mo (multi-person team band)
+
If $0-$400 → Path 2 (Self-serve / Ch 4.3 then 4.4). Paste one-page brief into Lovable.
+
If $1.6K-$4K → go to Q5.
+
If $5K-$30K → Path 3 (Fractional CTO) until problem complexity demands more.
+
If $30K+ → Path 4 (Hire a team - see the hire-track supplementary reference, linked in the verdict table below).
+
### Q5: Senior engineer in your network for 1 hour of architecture review per month? -``` ------------------------------------------------------- -Q5. Senior engineer in your network for 1 hour - of architecture review per month? ------------------------------------------------------- - -A real human you can text. Returns calls within 48 hrs. -Has shipped a backend at scale in the last 5 years. - - [ ] Yes, named: ___________________________________ - [ ] No - -If YES -> Path 2 (Self-serve / Ch 4.3 then 4.4). - Use them for the monthly architecture call - + worst-route code review. - -If NO -> Path 3 (Fractional CTO bridge - see the - hire-track supplementary reference). - Buy the same insurance commercially. - -====================================================== -THE 4-PATH VERDICT (write your row at the top of -your Notion doc) -====================================================== -``` +
+

A real human you can text. Returns calls within 48 hrs. Has shipped a backend at scale in the last 5 years.

+
Yes, named: No
+
If YES → Path 2 (Self-serve / Ch 4.3 then 4.4). Use them for the monthly architecture call + worst-route code review.
+
If NO → Path 3 (Fractional CTO bridge - see the hire-track supplementary reference). Buy the same insurance commercially.
+
## The 4-path verdict table diff --git a/content/course/tech-for-non-technical-founders-2026/channel-selection-before-outbound/channel-decision.svg b/content/course/tech-for-non-technical-founders-2026/channel-selection-before-outbound/channel-decision.svg new file mode 100644 index 000000000..f6d09ac95 --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/channel-selection-before-outbound/channel-decision.svg @@ -0,0 +1,49 @@ + + Pick one channel from interview evidence, score it out of 12, then commit to one full send-reply-follow-up arc before switching + + + + + + + + Pick one channel - then commit to it + + + + 10 interview + transcripts + from Module 2 + + + + + + + Score each channel 1-3 + Price / Buyer / Time / Signal + = your total / 12 + + + + + + + 9+ / 12 - commit to it + + + 7-8 / 12 - pilot your top 2 + + + 6 or less - re-read transcripts + + + + Then run ONE full send / reply / follow-up arc before you switch channels. + Reply rate over 5% and demos turning into paid chats - keep going. All flat - fix the script first. + diff --git a/content/course/tech-for-non-technical-founders-2026/channel-selection-before-outbound/index.md b/content/course/tech-for-non-technical-founders-2026/channel-selection-before-outbound/index.md index 05b3819fb..c88f805f3 100644 --- a/content/course/tech-for-non-technical-founders-2026/channel-selection-before-outbound/index.md +++ b/content/course/tech-for-non-technical-founders-2026/channel-selection-before-outbound/index.md @@ -48,6 +48,8 @@ You ran 10 interviews in [Module 2](/course/tech-for-non-technical-founders-2026 This chapter is about listening to what they actually said and committing to one channel before you try anything else. +![Pick one channel from your interview transcripts, score each candidate out of 12, then commit to one full send-reply-follow-up arc before you switch](channel-decision.svg) + ## The commitment rule Stick with one channel long enough to read the signal, not chase the algorithm. A cold-email sequence needs time to deliver, more time for replies to accumulate, and more time still before the "not now" replies reveal whether the non-replies are disinterest or bad timing. @@ -130,8 +132,6 @@ Run the prompt against your own transcripts. If your interview evidence points t The prompt is a forcing function, not a crystal ball. The real data comes from running the channel. -> **Fast-path exit: skip the worksheet if your interviews already named a channel.** If your Ch 2.3-2.4 interview transcripts pointed to a clear channel (e.g., 7+ of 10 interviewees found tools through LinkedIn, or 5+ named a specific Slack community), jump to Part 3: The Commitment at the bottom of the worksheet. Write your commitment statement and move to Ch 5.3. The full worksheet is for founders still deciding between channels. It's a diagnostic, not a gate. - > **What the Claude prompt above can and cannot tell you.** > > The prompt in the section above is your channel-choice pressure-test. It pressure-tests your channel hypothesis against interview evidence, surfaces assumptions behind each choice, and flags contradictions between what your transcripts said and what your gut says. @@ -147,73 +147,89 @@ The prompt is a forcing function, not a crystal ball. The real data comes from r Fill this out before you send message one. It prevents the wasted-effort cycle of channel-hopping. +> **Fast-path exit: skip the worksheet if your interviews already named a channel.** If your Ch 2.3-2.4 interview transcripts pointed to a clear channel (e.g., 7+ of 10 interviewees found tools through LinkedIn, or 5+ named a specific Slack community), jump to Part 3: The Commitment below. Write your commitment statement and move to Ch 5.3. The full worksheet is for founders still deciding between channels. Use it to decide between channels; skipping it does not block anything. + ### Part 1: Interview Evidence -Go through each interview transcript. For each one, note any channel signal the interviewee gave - directly or indirectly. - -| Interview # | Interviewee role | Channel signal (direct quote or paraphrase) | Channel type implied | -|-------------|------------------|---------------------------------------------|----------------------| -| 1 | | | | -| 2 | | | | -| 3 | | | | -| 4 | | | | -| 5 | | | | -| 6 | | | | -| 7 | | | | -| 8 | | | | -| 9 | | | | -| 10 | | | | - -**Tally by channel type:** -- LinkedIn mentions: ___ -- Email / newsletter mentions: ___ -- Community / Slack / Discord mentions: ___ -- Social (Twitter, Reddit, TikTok) mentions: ___ -- Search / Google mentions: ___ -- Word of mouth / referral mentions: ___ - -**Strongest signal** (channel with most mentions): _______________ +
+

Go through each interview transcript. For each one, note any channel signal the interviewee gave - directly or indirectly.

+ + + + + + + + + + + + + + + + +
#Interviewee roleChannel signal (quote or paraphrase)Channel type implied
1
2
3
4
5
6
7
8
9
10
+

Tally by channel type

+
LinkedInEmail / newsletter
+
Community / Slack / DiscordSocial (X, Reddit, TikTok)
+
Search / GoogleWord of mouth / referral
+
Strongest signal (most mentions)
+
### Part 2: Channel-Fit Score Score each candidate channel 1-3 on the four dimensions (1 = poor fit, 2 = moderate, 3 = strong). Add the four to a total out of 12. Use the per-channel guidance below as the anchor. -**LinkedIn DM → B2B SaaS, $200+/month.** Pick when: buyer is a professional, title and company size filter cleanly, 1-2 hours/week available. Skip when: buyer is a freelancer, solo creator, or under 30 years old. -- Price fit: ___ / Buyer type fit: ___ / Time budget fit: ___ / Interview signal fit: ___ / **Total: ___** - -**Cold email → Any B2B with verified work emails.** Pick when: you have 30-50 verified emails, a sending domain that is not your main domain, deliverability you can monitor. Skip when: open rates stay below 20% after batch 1 (domain or subject line is broken; fix before scale). -- Price fit: ___ / Buyer type fit: ___ / Time budget fit: ___ / Interview signal fit: ___ / **Total: ___** - -**Community outreach → B2B and prosumer where buyers already gather.** Pick when: a specific Slack/Discord/forum exists, you are already a participant, you can post one signal-quality post per sprint. Skip when: you joined this week (spend two weeks commenting before posting product, or get banned permanently). -- Price fit: ___ / Buyer type fit: ___ / Time budget fit: ___ / Interview signal fit: ___ / **Total: ___** - -**Social organic → B2C and prosumer with a visible product.** Pick when: a sustained posting cadence is realistic, format shows the product working (screen recordings, before/after, results). Skip when: you have never posted content before and cannot commit to the early stretch of posting into a void. -- Price fit: ___ / Buyer type fit: ___ / Time budget fit: ___ / Interview signal fit: ___ / **Total: ___** - -**Highest-scoring channel**: _______________ +
+

LinkedIn DM → B2B SaaS, $200+/month. Pick when: buyer is a professional, title and company size filter cleanly, 1-2 hours/week available. Skip when: buyer is a freelancer, solo creator, or under 30 years old.

+
Price fitBuyer typeTime budgetInterview signal
+
Total / 12
+
+ +
+

Cold email → Any B2B with verified work emails. Pick when: you have 30-50 verified emails, a sending domain that is not your main domain, deliverability you can monitor. Skip when: open rates stay below 20% after batch 1 (domain or subject line is broken; fix before scale).

+
Price fitBuyer typeTime budgetInterview signal
+
Total / 12
+
+ +
+

Community outreach → B2B and prosumer where buyers already gather. Pick when: a specific Slack/Discord/forum exists, you are already a participant, you can post one signal-quality post per sprint. Skip when: you joined this week (spend two weeks commenting before posting product, or get banned permanently).

+
Price fitBuyer typeTime budgetInterview signal
+
Total / 12
+
+ +
+

Social organic → B2C and prosumer with a visible product. Pick when: a sustained posting cadence is realistic, format shows the product working (screen recordings, before/after, results). Skip when: you have never posted content before and cannot commit to the early stretch of posting into a void.

+
Price fitBuyer typeTime budgetInterview signal
+
Total / 12
+
+ +
+
Highest-scoring channel
+
### Part 3: The Commitment Write this down. Literally write it. Skip this step and you are the founder who hops channels at the first cricket. -```text -My chosen channel: [channel name] - -Why this channel: -1. Interview evidence: [which interviewees, what they said] -2. Buyer type match: [why this channel reaches my buyer] -3. Price point math: [estimated cost per lead vs my price point] -4. Time budget: [time per batch I will actually spend] - -I will not switch channels until I have run a full send/reply/follow-up arc. - -At the evaluation point, I will check: -- Reply rate (target: >5%) -- Demo-to-conversation rate (target: >20%) -- Any paid conversations started (target: ≥1) - -If all three targets missed: diagnose the filter and script first, then consider a channel switch. -``` +
+
My chosen channel
+

Why this channel - note the evidence beside each:

+
    +
  • Interview evidence: which interviewees, and what they said
  • +
  • Buyer type match: why this channel reaches my buyer
  • +
  • Price point math: estimated cost per lead vs my price point
  • +
  • Time budget: time per batch I will actually spend
  • +
+
+ At the evaluation point I check + Reply rate (target: over 5%) + Demo-to-conversation rate (target: over 20%) + Any paid conversations started (target: 1 or more) +
+
Commitment - I will not switch channels until I have run a full send/reply/follow-up arc. If all three targets are missed, I diagnose the filter and script first, then consider a channel switch.
+
Keep this in the same Google Sheet as your interview transcripts. Look at it before you send each batch. diff --git a/content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/index.md b/content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/index.md index 2a0ada195..78e799b67 100644 --- a/content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/index.md +++ b/content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/index.md @@ -85,7 +85,7 @@ The [smoke test](/course/tech-for-non-technical-founders-2026/smoke-test-landing Neither answers the question this chapter is built around - whether a real user can find their way through your interface without someone over their shoulder telling them what to do. ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% flowchart LR A["Smoke Test
Do strangers click?
Demand signal"] --> B["Mom Test
Is the problem felt?
Problem signal"] B --> C["Prototype Session
Can users navigate?
Shape signal"] @@ -198,19 +198,7 @@ First, use the vocabulary you heard in Mom Test interviews, not the vocabulary y Second, resist adding a fourth screen. The constraint is the test. If you feel the prototype needs a fourth screen to "make sense," that is a finding: your solution has more steps than a single session can validate. Note it and keep the prototype to three screens. You are testing legibility of the shape, not the completeness of the product. -```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% -flowchart TD - P["Open Lovable
Paste the prompt template"] - P --> R["Read fake data out loud
Change vocab to match
interview language"] - R --> T["Test the 3 screens yourself
as if you've never seen your idea"] - T --> Done["Prototype ready
Share link to 5 interviewees"] - - classDef red fill:#fff5f5,stroke:#cc342d,stroke-width:2.5px,color:#1a1a1a - classDef purple fill:#fbe9ff,stroke:#a855f7,stroke-width:2.5px,color:#1a1a1a - class P,R,T red - class Done purple -``` +![Build the 3-screen prototype in three moves: open Lovable and paste the prompt template with placeholders filled, read the fake data out loud and change the vocabulary to match the words you heard in interviews, then test all three screens yourself as if you've never seen the idea - leaving with a prototype ready to share as a link to 5 interviewees](prototype-build-strip.svg) ## Run a Silent-Observation Session with 5 Interviewees @@ -229,9 +217,9 @@ Book the sessions as 30-minute video calls. Send the Lovable prototype link 10 m **The re-engagement message** (paste into LinkedIn DM or reply to your original Ch 2.3-2.4 thread): -> *"Hi [name] - thank you for the 40 minutes last week. I built a quick clickable prototype based on what you told me about [their specific workaround from the Mom Test transcript]. I'd like 30 more minutes to watch you try it without me explaining anything - just silent observation while you click through. I'll send the link 10 minutes before. Would Tuesday afternoon or Wednesday afternoon work?"* +> *"Hi [name] - thank you for the 30 minutes last week. I built a quick clickable prototype based on what you told me about [their specific workaround from the Mom Test transcript]. I'd like 30 more minutes to watch you try it without me explaining anything - just silent observation while you click through. I'll send the link 10 minutes before. Would Tuesday afternoon or Wednesday afternoon work?"* -Expect 4-5 of 5 to say yes. They invested 40 minutes in the first call; the second ask is shorter and a different motion. The *"I built something based on what you told me"* line is what gets them to say yes - it signals you listened, and it makes the prototype session feel like the natural continuation of the first conversation rather than a fresh cold outreach. +Expect 4-5 of 5 to say yes. They invested 30 minutes in the first call; the second ask is a different motion. The *"I built something based on what you told me"* line is what gets them to say yes - it signals you listened, and it makes the prototype session feel like the natural continuation of the first conversation rather than a fresh cold outreach. > **Slow-path variant for the part-time founder**: scheduling 5 live observation calls on top of your only weekly window is unrealistic. Async alternative: send each interviewee the Lovable prototype link + a short Loom prompt ("record yourself trying these 3 tasks"). Use [Maze](https://maze.co) (free tier covers a handful of testers - check current limits) or [UserTesting](https://www.usertesting.com) (paid) if you want screen recording with click heatmaps. You lose the real-time follow-up question ability, but you gain async scheduling - the testers record on their own time, you watch the 5 recordings in one batch. Recordings surface less than live sessions do (you miss the "what were you about to click" follow-ups), and still far more than skipping the validation step because you couldn't schedule it. diff --git a/content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/prototype-build-strip.svg b/content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/prototype-build-strip.svg new file mode 100644 index 000000000..15eb5c42f --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/prototype-build-strip.svg @@ -0,0 +1,77 @@ + + Building the 3-screen prototype in three moves: open Lovable and paste the prompt template with your placeholders filled in; read the fake data out loud and change the vocabulary to match the words you heard in interviews; test all three screens yourself as if you have never seen the idea. You leave with a prototype ready to share as a link to 5 interviewees. + A left-to-right strip of four cards joined by arrows: three numbered build-step cards and one output card. Step 1: open Lovable, paste the prompt template with placeholders filled. Step 2: read the fake data out loud, change vocabulary to match interview language. Step 3: test all 3 screens yourself as if new to the idea. Output: prototype ready, share the link to 5 interviewees. + + + + + + + + + Build the 3-screen prototype + Three moves in Lovable, then hand the link to 5 interviewees. + + + + + + 1 + Open Lovable + Paste the prompt + template with your + placeholders filled + + + + + + + 2 + Read it out loud + Change vocab to + match the words you + heard in interviews + + + + + + + 3 + Test it yourself + Click all 3 screens + as if you've never + seen your idea + + + + + + PROTOTYPE READY + Share the link + to 5 of your Mom + Test interviewees + + + + + + + + + The constraint is the test - stop at 3 screens; a 4th is the prototype turning into the MVP. + diff --git a/content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/wireframe-strip.svg b/content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/wireframe-strip.svg index fda7a0ab2..b2f39812b 100644 --- a/content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/wireframe-strip.svg +++ b/content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/wireframe-strip.svg @@ -2,14 +2,14 @@ A passing 3-screen prototype: Screen 1 entry point (fake file list + a Match transactions button) leads to Screen 2 core action (a Stripe-vs-QuickBooks match table where testers stall) leads to Screen 3 result (a summary card and Download report), which is where a passing tester lands without coaching. diff --git a/content/course/tech-for-non-technical-founders-2026/faq/index.md b/content/course/tech-for-non-technical-founders-2026/faq/index.md index 55dfe0770..a6c1bac32 100644 --- a/content/course/tech-for-non-technical-founders-2026/faq/index.md +++ b/content/course/tech-for-non-technical-founders-2026/faq/index.md @@ -113,7 +113,7 @@ Five is enough to start. Message all five before you try cold outbound - people **Q: The customer wants to start free and convert later. Should I accept?** -No. A verbal yes is not a paid pilot. Reframe: the deposit is year-one ACV (annual contract value - what one customer pays in year one) prepaid, not added cost. If they still say no, their problem isn't acute enough - they're not in your must-have segment. Move to the next lead. +No. A verbal yes is not a paid pilot. Reframe: the deposit is credited toward year-one ACV (annual contract value - what one customer pays in year one), not added cost. If they still say no, their problem isn't acute enough - they're not in your must-have segment. Move to the next lead. --- diff --git a/content/course/tech-for-non-technical-founders-2026/faq/module-strip.svg b/content/course/tech-for-non-technical-founders-2026/faq/module-strip.svg index a7c3566ad..7dc2c64bd 100644 --- a/content/course/tech-for-non-technical-founders-2026/faq/module-strip.svg +++ b/content/course/tech-for-non-technical-founders-2026/faq/module-strip.svg @@ -1,13 +1,18 @@ - + FAQ map: questions are grouped as General, then Module 1 Hypothesis and smoke test, Module 2 Validate the problem, Module 3 Design from evidence, Module 4 Build it yourself, and Module 5 First paying customer - in that order. @@ -24,40 +29,40 @@ - - M1 + + M1 Hypothesis & smoke test - - M2 + + M2 Validate the problem - - M3 + + M3 Design from evidence - - M4 + + M4 Build it yourself - - M5 + + M5 First paying customer diff --git a/content/course/tech-for-non-technical-founders-2026/find-10-people-where-to-look/index.md b/content/course/tech-for-non-technical-founders-2026/find-10-people-where-to-look/index.md index 8d30338ad..af2bacd20 100644 --- a/content/course/tech-for-non-technical-founders-2026/find-10-people-where-to-look/index.md +++ b/content/course/tech-for-non-technical-founders-2026/find-10-people-where-to-look/index.md @@ -48,14 +48,14 @@ After this lesson you will be able to: **build a 30-name list of specific people The full journey, top to bottom: ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% -flowchart TD - H(["Your 1-sentence hypothesis
(from Ch 1.1)"]) - H --> S1[Step 1
Translate hypothesis → ICP map
Paste into Claude/ChatGPT] - S1 --> S2[Step 2
Read where they complain
Reddit/LinkedIn/forums] - S2 --> S3[Step 3
Build 30-name list
One name per real complaint] - S3 --> S4[Step 4
Write each one personally
Templates in Part 2] - S4 --> S5(["Step 5
10 interviews on calendar"]) +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'fontSize':'24px', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% +flowchart LR + H(["Hypothesis
from Ch 1.1"]) + H --> S1["1. AI ICP map
paste into Claude"] + S1 --> S2["2. Read where
they complain"] + S2 --> S3["3. Build the
30-name list"] + S3 --> S4["4. Write each
one personally"] + S4 --> S5(["10 interviews
on calendar"]) classDef start fill:#e8f4f8,stroke:#0277bd,stroke-width:2.5px,color:#1a1a1a classDef step fill:#fff5f5,stroke:#cc342d,stroke-width:2px,color:#1a1a1a diff --git a/content/course/tech-for-non-technical-founders-2026/find-10-people-with-problem-outreach-2026/index.md b/content/course/tech-for-non-technical-founders-2026/find-10-people-with-problem-outreach-2026/index.md index a7526a1af..9d5b9c9a7 100644 --- a/content/course/tech-for-non-technical-founders-2026/find-10-people-with-problem-outreach-2026/index.md +++ b/content/course/tech-for-non-technical-founders-2026/find-10-people-with-problem-outreach-2026/index.md @@ -137,7 +137,7 @@ While the cold-outreach path books the calls, the smoke-test landing page from [ That opener out-performs every cold variant in this chapter - the person already raised a hand. ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% flowchart TD A(["Start a focused block. 30-name list from Part 1."]) A --> B[Cold outreach track: 30 messages by hand] diff --git a/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/first-paying-customer-operating-kit.pdf b/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/first-paying-customer-operating-kit.pdf index 19a3353e8..6f4538b75 100644 Binary files a/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/first-paying-customer-operating-kit.pdf and b/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/first-paying-customer-operating-kit.pdf differ diff --git a/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/index.md b/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/index.md index af3f7633c..72a4f9e77 100644 --- a/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/index.md +++ b/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/index.md @@ -44,21 +44,7 @@ related_posts: false Module 5 of this course runs seven lessons (5.1-5.7): the Sean Ellis 40% test, channel choice, the personal-network outreach arc, the paid-pilot contract, and the cold-outbound pipeline. The lessons reference these templates. This page hosts them as each one ships. The DPA template is live below (component 3); the remaining 5 are described and shipping next. -```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% -flowchart TB - Kit[First-Paying-Customer
Operating Kit] - Kit --> T1[1. 50-name network list
Google Sheets template] - Kit --> T2[2. Cold-email scripts
3 variants] - Kit --> T3[3. Design Partner Agreement
one-page LOI] - Kit --> T4[4. Stripe Checkout setup
Rails / Django / Laravel] - Kit --> T5[5. Sean Ellis survey
5 questions, Typeform-ready] - Kit --> T6[6. First 10 Customers tracker
Airtable template] - classDef kitstyle fill:#a855f7,stroke:#1a1a1a,stroke-width:2px,color:#fff; - classDef compstyle fill:#fff5f5,stroke:#cc342d,stroke-width:2px; - class Kit kitstyle; - class T1,T2,T3,T4,T5,T6 compstyle; -``` +![The First-Paying-Customer Operating Kit and its six numbered components: the 50-name network list, cold-email scripts, the Design Partner Agreement, the Stripe Checkout setup, the Sean Ellis 40% survey, and the First 10 Customers tracker](kit-components.svg) ## The 6 components @@ -88,66 +74,60 @@ Two annotated examples: a $1,500 B2B SaaS pilot DPA and a $5,000 B2B services pi The outcome: makes the "we run paid pilots" conversation a 15-second handoff instead of a three-week back-and-forth. -> **📋 Copy-pasteable DPA template - copy into Google Docs, fill the [BLANKS], send:** -> -> # Design Partner Agreement -> -> **Between:** [Your Company Name] ("Company") and [Customer Company Name] ("Design Partner") -> **Date:** [YYYY-MM-DD] -> -> ## 1. Scope of Pilot -> -> The Company will deliver the following outcomes during the pilot period: -> 1. [Outcome 1 - measurable, e.g. "Reduce weekly report prep from 3 hours to 30 minutes"] -> 2. [Outcome 2] -> 3. [Outcome 3] -> -> Specific use cases covered: [Use case 1], [Use case 2]. -> Anything outside this list is out of scope until year-one conversion. -> -> ## 2. Duration + Dates -> -> Start date: [YYYY-MM-DD] -> End date: [YYYY-MM-DD] (6-8 weeks) -> Weekly Friday demo at [time] [timezone]. 15 minutes. Loom or live screenshare. -> -> ## 3. Pilot Fee + Deposit -> -> One-time deposit: $[500-6,000] (10-30% of year-one ACV). -> Paid via Stripe before pilot kickoff. Credited dollar-for-dollar toward year-one invoice on conversion. -> If Design Partner cancels before week 4: deposit forfeited. -> If Company cancels for any reason: 100% refund within 14 days. -> -> ## 4. Success Criteria -> -> The pilot is successful if **2 of 3** criteria are met by [end date]: -> 1. [Measurable criterion 1 - e.g. "Report prep time reduced to ≤30 min/week, verified in Friday demo"] -> 2. [Measurable criterion 2] -> 3. [Measurable criterion 3] -> -> If 2+ criteria met: year-one contract auto-converts unless Design Partner opts out in writing within 7 days. -> If <2 criteria met: both parties walk. Company retains deposit as paid consideration for pilot work. -> -> ## 5. Conversion Terms -> -> Year-one price: $[amount] / [month or year] -> Billing: [monthly / annual] -> Conversion: auto-convert at pilot end unless Design Partner opts out in writing. -> Post year-one: 30-day written notice to cancel. -> -> ## 6. Data, IP, Termination -> -> Design Partner keeps their data. Company keeps the product IP. -> Either party may exit at 30 days written notice during pilot. -> Design Partner's data remains exportable for 90 days after termination. -> -> **Signed:** -> -> _________________________ Date: __________ -> [Your Name], [Your Company] -> -> _________________________ Date: __________ -> [Champion Name], [Customer Company] +**📋 Copy-pasteable DPA template - copy into Google Docs, fill the [BLANKS], send:** + +```text +DESIGN PARTNER AGREEMENT + +Between: [Your Company Name] ("Company") and [Customer Company Name] ("Design Partner") +Date: [YYYY-MM-DD] + +1. SCOPE OF PILOT +The Company will deliver the following outcomes during the pilot period: + 1. [Outcome 1 - measurable, e.g. "Reduce weekly report prep from 3 hours to 30 minutes"] + 2. [Outcome 2] + 3. [Outcome 3] +Specific use cases covered: [Use case 1], [Use case 2]. +Anything outside this list is out of scope until year-one conversion. + +2. DURATION + DATES +Start date: [YYYY-MM-DD] +End date: [YYYY-MM-DD] (6-8 weeks) +Weekly Friday demo at [time] [timezone]. 15 minutes. Loom or live screenshare. + +3. PILOT FEE + DEPOSIT +One-time deposit: $[500-6,000] (10-30% of year-one ACV). +Paid via Stripe before pilot kickoff. Credited dollar-for-dollar toward year-one invoice on conversion. +If Design Partner cancels before week 4: deposit forfeited. +If Company cancels for any reason: 100% refund within 14 days. + +4. SUCCESS CRITERIA +The pilot is successful if 2 of 3 criteria are met by [end date]: + 1. [Measurable criterion 1 - e.g. "Report prep time reduced to <=30 min/week, verified in Friday demo"] + 2. [Measurable criterion 2] + 3. [Measurable criterion 3] +If 2+ criteria met: year-one contract auto-converts unless Design Partner opts out in writing within 7 days. +If <2 criteria met: both parties walk. Company retains deposit as paid consideration for pilot work. + +5. CONVERSION TERMS +Year-one price: $[amount] / [month or year] +Billing: [monthly / annual] +Conversion: auto-convert at pilot end unless Design Partner opts out in writing. +Post year-one: 30-day written notice to cancel. + +6. DATA, IP, TERMINATION +Design Partner keeps their data. Company keeps the product IP. +Either party may exit at 30 days written notice during pilot. +Design Partner's data remains exportable for 90 days after termination. + +SIGNED: + +_________________________ Date: __________ +[Your Name], [Your Company] + +_________________________ Date: __________ +[Champion Name], [Customer Company] +``` ### 4. Stripe Checkout setup checklist (Rails / Django / Laravel) @@ -169,11 +149,11 @@ Plus a one-tab Google Sheet that computes per-segment must-have % from your CSV Result: 24 hours from "I should run the test" to a scored result you can act on. -### 6. The "First 10 Customers" Airtable tracker +### 6. The "First 10 Customers" Google Sheet tracker -The Airtable base from [Chapter 5.7](/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/). Pre-filled columns - Name, Company, Bucket, Loom sent, Reply, Demo, DPA sent, Deposit - with color-coded bucket pills (champion / hot / warm / cold) and date stamps on every progress column. Filters: "Replied this week," "Demo this week," "Pilot landed this month." +The Google Sheet from [Chapter 5.7](/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/). Pre-filled columns - Name, Company, Bucket, Loom sent, Reply, Demo, DPA sent, Deposit - with color-coded bucket pills (champion / hot / warm / cold) and date stamps on every progress column. Filters: "Replied this week," "Demo this week," "Pilot landed this month." -![Sample row from the First 10 Customers Airtable tracker](kit-sample-row.svg) +![Sample row from the First 10 Customers Google Sheet tracker](kit-sample-row.svg) The payoff: turns Friday afternoon into a 10-minute "what shipped this week" review instead of a 90-minute scroll through Gmail. @@ -210,7 +190,7 @@ By Friday of week 4, you should have: a segment-isolated persona doc, 50 sent me ## What this kit is not -The kit is not a substitute for a sales course or a CRM. It will not teach the conversational mechanics of objection-handling, so if you have never run a customer call, read [the Mom Test interview script](/course/tech-for-non-technical-founders-2026/mom-test-interview-script/) and run 10 user calls first. It will not track touch counts past the first 30 customers the way HubSpot, Pipedrive, or Salesforce does - past 30, the Airtable tracker breaks and you graduate to a real CRM. It also does not replace the must-have-segment test from [Chapter 5.1](/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/) - if your overall must-have % from template 5 is under 25%, your pipeline will fill, the demos will go fine, and conversions will stall at the deposit conversation. Run the 40% test first; download the kit second. +The kit is not a substitute for a sales course or a CRM. It will not teach the conversational mechanics of objection-handling, so if you have never run a customer call, read [the Mom Test interview script](/course/tech-for-non-technical-founders-2026/mom-test-interview-script/) and run 10 user calls first. It will not track touch counts past the first 30 customers the way HubSpot, Pipedrive, or Salesforce does - past 30, the Sheet breaks and you graduate to a real CRM. It also does not replace the must-have-segment test from [Chapter 5.1](/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/) - if your overall must-have % from template 5 is under 25%, your pipeline will fill, the demos will go fine, and conversions will stall at the deposit conversation. Run the 40% test first; download the kit second. ## How to get the kit diff --git a/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/kit-components.svg b/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/kit-components.svg new file mode 100644 index 000000000..0bb53ab7f --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/kit-components.svg @@ -0,0 +1,94 @@ + + The First-Paying-Customer Operating Kit and its six components: the 50-name network list, cold-email scripts, the Design Partner Agreement, the Stripe Checkout setup, the Sean Ellis 40 percent survey, and the First 10 Customers tracker. + + + + + + + + + + + First-Paying-Customer Operating Kit + Six templates that run Module 5 + + + + + + + + + + + + + + + + 1 + 50-name network list + Google Sheet · Chapter 5.3 + + + + + + + 2 + Cold-email scripts + 3 sector variants · Chapter 5.7 + + + + + + + 3 + Design Partner + Agreement + One-page LOI · Chapter 5.6 + + + + + + + 4 + Stripe Checkout setup + Rails / Django / Laravel + + + + + + + 5 + Sean Ellis 40% survey + 5 questions · Chapter 5.1 + + + + + + + 6 + First 10 Customers + tracker + Google Sheet · Chapter 5.7 + + + From live MVP to signed paid pilot in 4 weeks - one template per step. + diff --git a/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/kit-sample-row.svg b/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/kit-sample-row.svg index c1df70ffa..bb86c76f6 100644 --- a/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/kit-sample-row.svg +++ b/content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/kit-sample-row.svg @@ -1,5 +1,5 @@ - Sample row from the First 10 Customers Airtable tracker + Sample row from the First 10 Customers Google Sheet tracker - First 10 Customers tracker - sample rows from the Airtable template + First 10 Customers tracker - sample rows from the Google Sheet template diff --git a/content/course/tech-for-non-technical-founders-2026/first-ten-customers-network-list/index.md b/content/course/tech-for-non-technical-founders-2026/first-ten-customers-network-list/index.md index 3ed57317d..bba60cf0a 100644 --- a/content/course/tech-for-non-technical-founders-2026/first-ten-customers-network-list/index.md +++ b/content/course/tech-for-non-technical-founders-2026/first-ten-customers-network-list/index.md @@ -65,7 +65,7 @@ Open a Google Sheet. Six columns: Name, Company, Role, Bucket, Relationship stre > |---|---|---| > | **30+** | Standard warm motion works. | Continue below. | > | **15-29** | Reduced warm motion. Build smaller buckets: 2 champions + 5 hot + 8 warm + 5 cold. You'll need cold outbound ([Ch 5.7](/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/)) in parallel. | -> | **Under 15** | Your network doesn't contain the ICP segment. | Skip to [Ch 5.7](/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/) cold outbound. | +> | **Under 15** | Your network doesn't contain the ICP segment (ICP = Ideal Customer Profile - the specific kind of person your product is for). | Skip to [Ch 5.7](/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/) cold outbound. | --- @@ -75,7 +75,7 @@ Open a Google Sheet. Six columns: Name, Company, Role, Bucket, Relationship stre > 2. Export the filtered list with [LinkedIn's data export](https://www.linkedin.com/help/linkedin/answer/a566336) (free, takes 24 hours; you can use yesterday's). > 3. Cross-reference your phone contacts, email inbox, and last three jobs' Slack workspaces if you still have access. > 4. Sort every name into one of the 4 buckets. Champions first. If you can't name 5 people who complained to you about this problem in the last 12 months, re-read your verbatim Q2-Q3 quotes from [5.1](/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/). -> 5. **✅ Success check:** 50 names sorted across all 4 buckets, champions row fully filled. +> 5. **Success check:** 50 names sorted across all 4 buckets, champions row fully filled. --- diff --git a/content/course/tech-for-non-technical-founders-2026/first-ten-customers-network-list/network-buckets.svg b/content/course/tech-for-non-technical-founders-2026/first-ten-customers-network-list/network-buckets.svg index b1522ab9f..90a7ca5da 100644 --- a/content/course/tech-for-non-technical-founders-2026/first-ten-customers-network-list/network-buckets.svg +++ b/content/course/tech-for-non-technical-founders-2026/first-ten-customers-network-list/network-buckets.svg @@ -2,11 +2,11 @@ The 50-name network list sorted into 4 outreach buckets
messy, hard to read"] - - Start --> RealQ{Real refactor?} - Start --> FakeQ{Fake refactor?} - - RealQ --> R1["CartController · 120 lines"] - RealQ --> R2["CheckoutController · 140 lines"] - RealQ --> R3["ReceiptController · 130 lines"] - - R1 --> RW["Same Stripe webhook URL
Same tests stay green"] - R2 --> RW - R3 --> RW - - RW --> Win["✓ Same behavior for users
Cleaner structure
Three-line commit cap"] - - FakeQ --> F1["OrdersController v2
3,800 lines, no tests"] - F1 --> F2["Stripe secret hard-coded
into controller"] - F2 --> Lose["✗ Checkout broke at board demo
$9K invoice for the rewrite"] - - classDef good fill:#f0f9f0,stroke:#2e7d32,stroke-width:2.5px,color:#1a1a1a - classDef bad fill:#fff5f5,stroke:#cc342d,stroke-width:2.5px,color:#1a1a1a - classDef neutral fill:#f5f5f5,stroke:#666,stroke-width:2px,color:#1a1a1a - - class Start,RealQ,FakeQ neutral - class R1,R2,R3,RW,Win good - class F1,F2,Lose bad -``` +![Refactoring real versus fake: one messy 400-line OrdersController either splits into small Cart, Checkout, and Receipt controllers behind the same Stripe webhook with tests still green (real refactor), or gets rewritten into a 3,800-line v2 with the Stripe secret hard-coded that broke checkout at the board demo and cost a $9K invoice (fake refactor)](refactor-check.svg) ### 🐳 2. Docker @@ -151,25 +122,37 @@ A healthy architecture for a pre-Series-A Rails SaaS is one Rails monolith on He The five words above are dev-shop jargon - vocabulary you'll hit in Modules 4-5 (build and ship). Modules 1-3 (hypothesis, validate, design) have their own acronym soup. Skim the list below once; come back when an unfamiliar acronym shows up in a chapter: +**Customer & validation words** - who you serve and whether the demand is real: + | Acronym | Plain English | Where it shows up | |---|---|---| | **ICP** | Ideal Customer Profile - the specific kind of person your hypothesis names | Ch 1.1, 2.3 | -| **PMF** | Product-Market Fit - the survey question "would you be very disappointed if you could no longer use this?" 40%+ "very disappointed" = signal | Ch 5.1 | | **JTBD** | Jobs To Be Done - what a customer "hires" your product to do (instead of feature list) | Ch 3.1, 3.2 | +| **PMF** | Product-Market Fit - the survey question "would you be very disappointed if you could no longer use this?" 40%+ "very disappointed" = signal | Ch 5.1 | +| **NPS** | Net Promoter Score - "how likely are you to recommend us?" 0-10 scale; less useful at idea stage than PMF | Ch 5.1 sidebar | +| **Retention** | What % of users come back next week / next month - the only metric that proves the product solves a real problem | Ch 5.1 | +| **Wizard of Oz** | A no-code pattern - customer thinks software is running, but you do the work by hand behind the scenes to test demand before building | Ch 4.3 Concierge MVP | + +**Money & market words** - the numbers that decide whether it is a business: + +| Acronym | Plain English | Where it shows up | +|---|---|---| | **MRR** / **ARR** | Monthly / Annual Recurring Revenue - what one customer pays per month or year | Ch 1.1, 5.6 | | **ACV** | Annual Contract Value - what one customer pays in year one (deposit math is 10-30% of ACV) | Ch 5.6 | | **CAC** / **LTV** | Customer Acquisition Cost / Lifetime Value - what you spend to land one customer vs what they pay you over their lifetime | Ch 5.2, 5.6 | -| **DPA** | Design Partner Agreement - a one-page contract where a customer pays a deposit to test your product as a co-design partner | Ch 5.6 | -| **SOW** | Statement of Work - the contract that defines what an agency is paid to deliver | _index, rescue chapters | -| **PRD** / **Vibe PRD** | Product Requirements Document - the "Vibe" version is a one-pager an AI builder can act on, not a 30-page spec | Ch 3.1 | -| **TAM** / **SAM** / **SOM** | Total / Serviceable / Serviceable-Obtainable Market - investor-pitch math, not builder math | _index pitch sections only | -| **Pixel** | A small JavaScript tracking snippet from an ad platform (Meta/LinkedIn/Reddit) - paste it on your page and the platform learns who converted | Ch 1.3 | -| **NPS** | Net Promoter Score - "how likely are you to recommend us?" 0-10 scale; less useful at idea stage than PMF | Ch 5.1 sidebar | -| **Retention** | What % of users come back next week / next month - the only metric that proves the product solves a real problem | Ch 5.1 | | **Unit economics** | Revenue per customer minus cost to serve per customer - whether the math works at scale | Ch 1.1 Money lens | | **Runway** | Months of cash until you must show paying customers or close the company | Ch 4.1 Q3 | +| **TAM** / **SAM** / **SOM** | Total / Serviceable / Serviceable-Obtainable Market - investor-pitch math, not builder math | _index pitch sections only | + +**Strategy, deal & tool words** - the frameworks, contracts, and tools you touch: + +| Acronym | Plain English | Where it shows up | +|---|---|---| | **SWOT / PESTEL / Porter's Five Forces** | Three classic strategy-school checklists - VenturusAI runs all three on your hypothesis | Ch 1.1 sidebar | -| **Wizard of Oz** | A no-code pattern - customer thinks software is running, but you do the work by hand behind the scenes to test demand before building | Ch 4.3 Concierge MVP | +| **Pixel** | A small JavaScript tracking snippet from an ad platform (Meta/LinkedIn/Reddit) - paste it on your page and the platform learns who converted | Ch 1.3 | +| **DPA** | Design Partner Agreement - a one-page contract where a customer pays a deposit to test your product as a co-design partner | Ch 5.6 | +| **SOW** | Statement of Work - the contract that defines what an agency is paid to deliver | _index, rescue chapters | +| **PRD** / **Vibe PRD** | Product Requirements Document - the "Vibe" version is a one-pager an AI builder can act on, not a 30-page spec | Ch 3.1 | ## What to do tomorrow diff --git a/content/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/jargon-translator.svg b/content/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/jargon-translator.svg index 957c5d906..83b6b742a 100644 --- a/content/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/jargon-translator.svg +++ b/content/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/jargon-translator.svg @@ -9,7 +9,7 @@ .box-l { fill: #fff5f5; stroke: #cc342d; stroke-width: 2.5; stroke-linejoin: round; stroke-linecap: round; } .box-r { fill: #f5f0ff; stroke: #a855f7; stroke-width: 2.5; stroke-linejoin: round; stroke-linecap: round; } .arrow { stroke: #1a1a1a; stroke-width: 2.5; stroke-linecap: round; fill: none; } - .caption { font-family: "Caveat", "Patrick Hand", cursive; font-size: 18px; fill: #666; font-style: italic; } + .caption { font-family: "Caveat", "Patrick Hand", "Comic Sans MS", cursive; font-size: 18px; fill: #666; font-style: italic; } diff --git a/content/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/refactor-check.svg b/content/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/refactor-check.svg new file mode 100644 index 000000000..c02b72d07 --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/refactor-check.svg @@ -0,0 +1,103 @@ + + Refactoring, real versus fake: one messy 400-line controller either splits into small controllers behind the same Stripe webhook with tests still green (a real refactor), or gets rewritten into a 3,800-line v2 with the Stripe secret hard-coded that broke checkout at the board demo and cost a 9,000-dollar invoice (a fake refactor). + + + + + + + + Refactoring: real vs fake + One messy controller. Two ways the word lands on your invoice. + + + + + OrdersController + 400 lines, messy, + hard to read + + + + + + + + REAL REFACTOR ✓ + + + + Cart · 120 lines + + + + Checkout · 140 lines + + + + Receipt · 130 lines + + + + + + + Same Stripe webhook + Tests stay green + + + + + + + ✓ Same behavior + Cleaner structure + 3-line commit cap + + + + FAKE REFACTOR ✗ + + + + OrdersController v2 + 3,800 lines, no tests + + + + + + + Stripe secret + hard-coded in controller + + + + + + + ✗ Checkout broke + at the board demo + $9K for the rewrite + + + A real refactor leaves a working feature untouched. A fake one rewrites it on your dime. + diff --git a/content/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/hypothesis-mad-libs.svg b/content/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/hypothesis-mad-libs.svg index 12a5e2b20..53dcc5d71 100644 --- a/content/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/hypothesis-mad-libs.svg +++ b/content/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/hypothesis-mad-libs.svg @@ -1,19 +1,46 @@ - - - If we help - - customer - solve - - problem - with - - approach - they'll choose it over - - competition - because - - differentiation - Five blanks. One sentence. No vagueness allowed. + + The founding-hypothesis Mad Libs sentence with five blanks: If we help [customer] solve [problem] with [approach], they'll choose it over [competition] because [differentiation]. + Five fill-in-the-blank pills stitched into one sentence. Three red pills name the customer, the problem, and the approach; two purple pills name the competition and the differentiation. Caption: five blanks, one sentence, no vagueness allowed. + + + + + + If we help + + + customer + + solve + + + problem + + with + + + approach + + + + they'll choose it over + + + competition + + because + + + differentiation + + + + Five blanks. One sentence. No vagueness allowed. diff --git a/content/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/index.md b/content/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/index.md index a00473d26..ed9dddbf4 100644 --- a/content/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/index.md +++ b/content/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/index.md @@ -56,8 +56,8 @@ Each blank is an assumption, and each assumption has a test waiting for it later **Why this works:** when the sentence is vague, people nod politely because there's nothing to disagree with; when it's specific, they push back - and the pushback is what you're after: -- ❌ *"We help small businesses save time with automation."* - Nobody can argue with this. Nobody can validate it either. -- ✅ *"If we help solo chiropractors solve insurance-claim resubmission with a one-click resubmit, they pick it over billing services that take 14 days and charge 8% of recovered claims."* - A chiropractor either says "I dealt with this last Tuesday" or "that's not my problem." Both are useful. +- **Bad:** *"We help small businesses save time with automation."* - Nobody can argue with this. Nobody can validate it either. +- **Good:** *"If we help solo chiropractors solve insurance-claim resubmission with a one-click resubmit, they pick it over billing services that take 14 days and charge 8% of recovered claims."* - A chiropractor either says "I dealt with this last Tuesday" or "that's not my problem." Both are useful. **What makes a blank specific:** @@ -91,7 +91,7 @@ Score each lens 1-5. Be honest - this is for you, not an investor deck. > 1. Open a blank note. Write the Mad Libs frame at the top. > 2. Fill each blank with the most specific noun you can. If a blank says "small businesses," rewrite it until it names one person in one industry. > 3. Score your sentence using the four lenses above. -> 4. **✅ Success check:** total ≥14/20 (or ≥11/15 if Money is blank) AND no lens below 2. +> 4. **Success check:** total ≥14/20 (or ≥11/15 if Money is blank) AND no lens below 2. > 5. Save the sentence to a Google Doc titled `Founding Hypothesis - [today's date]`, inside a new Google Drive folder called `Founder OS` - every module adds an artifact to that folder, and by the course's end it is your evidence pack. You'll paste it verbatim into Lessons 1.2, 1.4, and 1.5. Module 2 uses it too - to choose who you interview and what you ask about - but you never read it to an interviewee. --- diff --git a/content/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/catching-the-lie.svg b/content/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/catching-the-lie.svg index 1f1123feb..73ab8ab91 100644 --- a/content/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/catching-the-lie.svg +++ b/content/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/catching-the-lie.svg @@ -2,10 +2,10 @@ One Loom for a small full-stack team versus five Looms for a microservice-detached team
Founder posts the
7-question template
in #dev Slack]) --> Tue([Tuesday-Thursday
Team builds + reviews
against the questions]) - Tue --> Wed{Wednesday EOD
Anything not
going to be ready?} - Wed -->|Yes| Replan([Team replans
before Friday]) - Wed -->|No| Fri([Friday 4pm
15-min Loom or live
working software only]) - Replan --> Fri - Fri --> Click([Founder clicks
every staging URL
during the call]) - Click --> Forward([Forward Loom URL
to your inbox
same evening]) - Forward --> Score{After 4 weeks
review the pattern} - Score -->|4 of 4 demos clickable| Healthy([Cadence works
continue weekly]) - Score -->|2 of 4 or fewer| Investigate([Run the
oversight audit
standup + report + spaceship]) - classDef good fill:#f0f9f0,stroke:#2e7d32,stroke-width:2.5px,color:#1a1a1a - classDef bad fill:#fff5f5,stroke:#cc342d,stroke-width:2.5px,color:#1a1a1a - classDef neutral fill:#f5f5f5,stroke:#666,stroke-width:2px,color:#1a1a1a - class Mon,Tue,Fri,Click,Forward neutral - class Wed,Score neutral - class Replan,Healthy good - class Investigate bad - -``` +![The Friday demo weekly loop: Monday 9am the founder posts the 7-question template in #dev Slack, Tuesday through Thursday the team builds and reviews against those questions, and Wednesday end of day the team checks whether anything won't be ready - if yes they replan before Friday, if no they go straight on. Friday 4pm is a 15-minute Loom or live demo of working software only, the founder clicks every staging URL during the call, and that evening forwards the Loom URL to their inbox - then the cycle repeats the next Monday. After 4 Fridays, review the pattern: 4 of 4 demos clickable means the cadence works and continues weekly; 2 of 4 or fewer means something is stalling, so run the Org Chart audit and the red-flags checklist.](friday-loop.svg) + +If the four-week score lands at 2 of 4 or fewer, run the [Org Chart audit](/course/tech-for-non-technical-founders-2026/engineering-org-chart-non-technical-founder/) and the [eight red flags checklist](/blog/dev-shop-red-flags-checklist/) before adding any new process - the demo cadence is the symptom log, those two are the diagnosis. ## What to do tomorrow diff --git a/content/course/tech-for-non-technical-founders-2026/friday-demo-template/index.md b/content/course/tech-for-non-technical-founders-2026/friday-demo-template/index.md index acf365f6c..222cb87d9 100644 --- a/content/course/tech-for-non-technical-founders-2026/friday-demo-template/index.md +++ b/content/course/tech-for-non-technical-founders-2026/friday-demo-template/index.md @@ -36,7 +36,7 @@ By Friday of week 4 you will know whether your dev team is shipping or stalling. ## Why this exists -A founder we worked with last year was four months and $62K into a six-week MVP. Jira showed nine tickets closed that week. When she asked the team to demo the checkout flow, the lead developer said "it's behind a feature flag, give us until Monday." Monday came: the flag had been on for three weeks. The page threw a 500 on every click. None of the three developers had opened it themselves. +A founder we worked with last year was four months and $54K into a six-week MVP. Jira showed nine tickets closed that week. When she asked the team to demo the checkout flow, the lead developer said "it's behind a feature flag, give us until Monday." Monday came: the flag had been on for three weeks. The page threw a 500 on every click. None of the three developers had opened it themselves. ## How to use it @@ -97,7 +97,7 @@ This is the over-engineering check. If your team never cuts anything, they are e > Bad: "A few things are in PR, I can send you the list later." > -> Good: "PR #847 - signup rate limiting. Marcus reviewed it Tuesday, three changes requested, will merge Monday. PR #851 - admin search. Nobody has reviewed it yet because Marcus is on vacation." +> Good: "PR #851 - signup rate limiting. Priya reviewed it Tuesday, three changes requested, will merge Monday. PR #843 - admin search. Nobody has reviewed it yet because Priya is on vacation." If the same name keeps appearing as the only reviewer, you have a single point of failure - the [JetThoughts red-flags checklist](/blog/dev-shop-red-flags-checklist/) calls this bus factor of one. diff --git a/content/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/index.md b/content/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/index.md index ade6c1010..bfc4046c9 100644 --- a/content/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/index.md +++ b/content/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/index.md @@ -69,7 +69,7 @@ The financial damage is rarely the headline number on the contractor invoice. It ## What good looks like vs what bad looks like -Every item rhymes the same way when it passes: an email on a domain you control, billing on a card you own, MFA (the same two-factor login code) on a phone in your pocket, and a password in a vault you can read. Failure rhymes too: somebody else's email, somebody else's card, and "let me ask Marcus" as the answer to "who can rotate this?" +Every item rhymes the same way when it passes: an email on a domain you control, billing on a card you own, MFA (the same two-factor login code) on a phone in your pocket, and a password in a vault you can read. Failure rhymes too: somebody else's email, somebody else's card, and "let me ask Marcos" as the answer to "who can rotate this?" Three pairs that come up most often in ownership audits. @@ -84,10 +84,10 @@ If the contractor controls the root email, AWS support will treat them as the ac **Item #7 - Production database password** -> Bad: "Marcus has it. Slack him and he can DM it to you." +> Bad: "Marcos has it. Slack him and he can DM it to you." > Good: "I opened AWS Secrets Manager just now and read it myself. I rotated it once in March when we offboarded the previous DBA (database administrator - the person who manages your production database)." -The Marcus answer means you have a single point of failure. It does not matter whether Marcus is honest, kind, or available - one person holding the prod DB password is one person away from a production outage you cannot fix. Firing Marcus does not fix it. Putting the credential in a store you administer, with Marcus pulling read access from there, does. +The Marcos answer means you have a single point of failure. It does not matter whether Marcos is honest, kind, or available - one person holding the prod DB password is one person away from a production outage you cannot fix. Firing Marcos does not fix it. Putting the credential in a store you administer, with Marcos pulling read access from there, does. **Item #10 - Domain registrar** @@ -119,42 +119,7 @@ Those three pairs anchor the pattern; the table below is the fill-in-the-blank v Two of those twelve are existential. AWS root email controls whether a contractor can lock you out in ten minutes. Domain registrar turns into a 14-day practical buffer (approval itself takes about five days; the 60-day post-registration lock is the ICANN rule) if someone else will not release the auth code. The other ten matter; these two end the company if they go wrong. -```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#f5f5f5', 'primaryBorderColor':'#666', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% -flowchart TD - Start(["Friday afternoon. Alone.
Credit card + Notion doc."]) - Start --> Code["Code: Are you
GitHub org Owner?"] - Code -->|Yes| Cloud["Cloud: Is the AWS
root email yours?"] - Code -->|No| FixCode[Slack the lead engineer.
Self-serve org transfer] - - Cloud -->|Yes, with MFA| Sec["Secrets: can you read the prod
DB password without asking?"] - Cloud -->|No| FixCloud[Self-serve email change
or 3-5 day AWS support
recovery with corp docs] - - Sec -->|Yes, from your vault| Dom["Domain: WHOIS shows
your name + email?"] - Sec -->|"'Marcus has it'"| FixSec[Set up Secrets Manager
or 1Password vault tonight.
Migrate this sprint] - - Dom -->|Yes, on your card| Pass[Audit clean.
Quarterly recurring block.
Email investor / board.] - Dom -->|No| FixDom[Initiate registrar transfer.
Budget 14 days as a practical buffer.
Escalate to ICANN if blocked] - - FixCode --> Recovery[Recovery plan
started this Friday] - FixCloud --> Recovery - FixSec --> Recovery - FixDom --> Recovery - - Recovery --> Escalate["Contractor cooperated within
7 days code / 14 days cloud?"] - Escalate -->|Yes| Pass - Escalate -->|No| Lawyer[Retain lawyer.
$2K-$5K beats
a stalled checkout] - - classDef good fill:#f0f9f0,stroke:#2e7d32,stroke-width:2.5px,color:#1a1a1a - classDef bad fill:#fff5f5,stroke:#cc342d,stroke-width:2.5px,color:#1a1a1a - classDef neutral fill:#f5f5f5,stroke:#666,stroke-width:2px,color:#1a1a1a - classDef start fill:#e8f4f8,stroke:#0277bd,stroke-width:2.5px,color:#1a1a1a - - class Start start - class Code,Cloud,Sec,Dom,Escalate neutral - class Pass good - class FixCode,FixCloud,FixSec,FixDom,Recovery,Lawyer bad -``` +![The Friday ownership audit: four numbered checks in a row - Code (are you GitHub org Owner? pass: your email, not the agency's), Cloud (is the AWS root email yours with MFA? pass: root on your domain, MFA on), Secrets (can you read the prod DB password solo? pass: from your vault, no asking), Domain (does WHOIS show you? pass: your name and your renewal email). Any failure drops into one shared amber fix lane naming the fix - Slack the lead engineer for org transfer, self-serve email change or 3-5 day AWS recovery, Secrets Manager or 1Password vault this sprint, registrar transfer with a 14-day buffer plus ICANN escalation. All four fixes converge on one card: recovery plan started this Friday. That leads to one question - did the contractor cooperate, 7 days for code or 14 days for cloud? Yes routes to a green card: audit clean, quarterly recurring block, email investor or board. No routes to a red card: retain a lawyer, $2K-$5K beats a stalled checkout.](ownership-audit-flow.svg) ## When the audit fails: a recovery plan that takes weeks, not months @@ -184,7 +149,7 @@ The [ownership checklist template](/course/tech-for-non-technical-founders-2026/ | **Signed key infrastructure** | You have 50+ users AND you handle regulated data. Rotating to asymmetric signing keys (AWS KMS, HashiCorp Vault Transit engine) means revocation actually removes access. | You have <50 users. Defer to month three, not month eighteen. | | **Security audit reference** | Before an enterprise prospect sends a SOC2 questionnaire. Run [AWS Trusted Advisor](https://aws.amazon.com/premiumsupport/technology/trusted-advisor/) (free for Business/Enterprise) or [Prowler](https://github.com/prowler-cloud/prowler) (open-source). Both produce reports answering 80% of infra questions. | You have no enterprise prospects yet. No need for SOC2 or formal audit. | -Ownership audit done right means no Marcus stands between you and a 9pm Tuesday production fix. +Ownership audit done right means no Marcos stands between you and a 9pm Tuesday production fix. ## Further reading diff --git a/content/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/ownership-audit-flow.svg b/content/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/ownership-audit-flow.svg new file mode 100644 index 000000000..b35021af5 --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/ownership-audit-flow.svg @@ -0,0 +1,150 @@ + + The Friday ownership audit: four checks - GitHub org owner, AWS root email with MFA, prod DB password access, and WHOIS ownership. Any failure routes to a matching fix, then a recovery plan starts that Friday. If the contractor cooperates within 7 days for code or 14 days for cloud, the audit passes: quarterly recurring block, email the investor or board. If not, retain a lawyer - $2K to $5K beats a stalled checkout. + Four numbered check cards in a row. Card 1, Code: are you GitHub org Owner - pass if your email, not the agency's. Card 2, Cloud: is the AWS root email yours with MFA - pass if root sits on your domain with MFA on. Card 3, Secrets: can you read the prod DB password from your vault without asking - pass if you can pull it yourself, no asking. Card 4, Domain: does WHOIS show your name - pass if it shows your name and your renewal email. Below, one shared amber fix lane: if a check fails, fix it there - Code fix is Slack the lead engineer for org transfer; Cloud fix is self-serve email change or a 3-5 day AWS support recovery; Secrets fix is a Secrets Manager or 1Password vault this sprint; Domain fix is a registrar transfer with a 14-day buffer plus ICANN escalation if blocked. Every fix path converges on one card: recovery plan started that Friday. That leads to one question: did the contractor cooperate, 7 days for code or 14 days for cloud? Yes routes to a green card: audit clean, quarterly recurring block, email the investor or board. No routes to a red card: retain a lawyer, 2 to 5 thousand dollars beats a stalled checkout. + + + + + + + + + The Friday ownership audit + Friday afternoon, alone, credit card in hand - four checks, one fix lane, one recovery clock. + + + + + + 1 + Code + GitHub org Owner? + Your email, not the + agency's + + + + + + 2 + Cloud + AWS root yours + MFA? + Root on your domain, + MFA on + + + + + + 3 + Secrets + Read prod DB pw solo? + From your vault, + no asking + + + + + + 4 + Domain + WHOIS shows you? + Your name + your + renewal email + + + + + + + + + + + + If a check fails, fix it right here + + + + + Slack the lead + engineer for org + transfer + + Self-serve email + change or 3-5 day + AWS recovery + + Secrets Manager or + 1Password vault + this sprint + + Registrar transfer, + 14-day buffer + + ICANN escalation + + + + + + + + + + + + Recovery plan started this Friday + + + + + + + + + Did the contractor cooperate? + 7 days for code · 14 days for cloud + + + + + + Yes + No + + + + + Audit clean + Quarterly recurring block. Email investor / board. + + + + + + Retain a lawyer + $2K-$5K beats a stalled checkout. + + diff --git a/content/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/ownership-zones.svg b/content/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/ownership-zones.svg index 8fe5109fd..409821304 100644 --- a/content/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/ownership-zones.svg +++ b/content/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/ownership-zones.svg @@ -2,12 +2,12 @@ The four ownership zones a non-technical founder must control: code, cloud, secrets, and domain diff --git a/content/course/tech-for-non-technical-founders-2026/how-this-course-works/module-pipeline.svg b/content/course/tech-for-non-technical-founders-2026/how-this-course-works/module-pipeline.svg index a1f2774bc..4de0c6bb1 100644 --- a/content/course/tech-for-non-technical-founders-2026/how-this-course-works/module-pipeline.svg +++ b/content/course/tech-for-non-technical-founders-2026/how-this-course-works/module-pipeline.svg @@ -2,12 +2,12 @@ 5-module course pipeline: Hypothesis → Validate → Design → Build → First Paying Customer @@ -60,7 +61,7 @@ 1.4 Smoke test run - 6.5% + 6.5% 300 visits · Promising @@ -70,7 +71,7 @@ 1.5 Price test - 6 buyers + 6 buyers $99 each $594 before product diff --git a/content/course/tech-for-non-technical-founders-2026/module-2-walkthrough-mia/artifact-trail.svg b/content/course/tech-for-non-technical-founders-2026/module-2-walkthrough-mia/artifact-trail.svg index b4af11c69..22626b3f5 100644 --- a/content/course/tech-for-non-technical-founders-2026/module-2-walkthrough-mia/artifact-trail.svg +++ b/content/course/tech-for-non-technical-founders-2026/module-2-walkthrough-mia/artifact-trail.svg @@ -2,13 +2,13 @@ Mia's Module 2 artifact trail: a Mom-Test script to a 30-name list to 10 scored interviews to a BUILD verdict to a Money answer to prototype feedback diff --git a/content/course/tech-for-non-technical-founders-2026/mom-test-ask-about-past-not-future/index.md b/content/course/tech-for-non-technical-founders-2026/mom-test-ask-about-past-not-future/index.md index 3705d5b72..854b39760 100644 --- a/content/course/tech-for-non-technical-founders-2026/mom-test-ask-about-past-not-future/index.md +++ b/content/course/tech-for-non-technical-founders-2026/mom-test-ask-about-past-not-future/index.md @@ -127,7 +127,7 @@ While the script runs, your job is to listen for three patterns. These flags do ## The interview flow ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% flowchart TD Start(["Call starts.
Script open on second screen."]) Start --> Q1[Q1 - Last time it happened?] diff --git a/content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/index.md b/content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/index.md index c8b60637f..e14219fd4 100644 --- a/content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/index.md +++ b/content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/index.md @@ -30,12 +30,15 @@ related_posts: false *Five questions that get the interviewee to tell you what they actually did, not what sounds polite.* -> **The 5 Mom Test questions, in order:** -> Q1. Tell me about the last time [problem] happened. Walk me through what you did. -> Q2. What did that cost you - in time, money, or sanity? -> Q3. What have you tried already to fix this? -> Q4. On a scale of 1-10, how big a problem is this compared to everything else on your plate? -> Q5. Who else on your team feels this? How do they handle it? +**The 5 Mom Test questions, in order:** + +| Question | What it surfaces | +|---|---| +| **Q1.** Tell me about the last time [problem] happened. Walk me through what you did. | Anchors in a real episode - story over preference. | +| **Q2.** What did that cost you - in time, money, or sanity? | Quantifies the pain - an unquantified problem won't get paid for. | +| **Q3.** What have you tried already to fix this? | Surfaces existing workarounds - if they never tried anything, it never actually hurt. | +| **Q4.** On a scale of 1-10, how big a problem is this compared to everything else on your plate? | Calibrates urgency against the interviewee's whole problem stack - most "would be great if" problems land at 4. | +| **Q5.** Who else on your team feels this? How do they handle it? | Surfaces the buying committee and workarounds other people on the team already own. | *Prefer paper? Download the PDF - same content, print-ready.* diff --git a/content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/mom-test-interview-script.pdf b/content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/mom-test-interview-script.pdf index 31b8212d9..5d496c04a 100644 Binary files a/content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/mom-test-interview-script.pdf and b/content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/mom-test-interview-script.pdf differ diff --git a/content/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/index.md b/content/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/index.md index d20b7f89e..20d19e604 100644 --- a/content/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/index.md +++ b/content/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/index.md @@ -62,7 +62,7 @@ The pattern matters more than the average. Eight 7+ scores and two 3s is a stron Your strong-signal count from Step 2 routes you to one of three outcomes. ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% flowchart TD Start(["10 Mom Test transcripts.
90 minutes alone, pen + printed template."]) Start --> S1[Step 1
Score each interview 1-10] @@ -104,10 +104,10 @@ Before you start writing code, run the 3 pre-orders test: ask your 5 strongest-s ## What good looks like vs what bad looks like **Bad problem statement (vague, unfilled):** -> Founders need a better way to validate their startup ideas. Many of them waste time and money. +> **Bad** - Founders need a better way to validate their startup ideas. Many of them waste time and money. **Good problem statement (specific, named, signed):** -> Pre-seed B2B SaaS founders running their own discovery do customer interviews, but 9 of 10 (per our 10-call sample, Apr-May 2026) use hypothetical-future questions and get polite-yes answers. The average interviewee currently spends 6-12 hours running interviews and learns the problem wasn't real only after their first launch flops - typical sunk cost is 6 weeks of build time plus $15K-$30K of contractor spend. Workarounds tried: YC Library essays (too high-level), $1,500 SurveyMonkey panel (taught one founder I spoke with nothing in the survey style), free templates downloaded but not used. Why now: AI-built MVPs accelerated this failure mode - the prototype lands in 4 days instead of 12 weeks, so the validation gap surfaces faster. Pain average 7.6/10 across 10 calls, 8 strong signals. +> **Good** - Pre-seed B2B SaaS founders running their own discovery do customer interviews, but 9 of 10 (per our 10-call sample, Apr-May 2026) use hypothetical-future questions and get polite-yes answers. The average interviewee currently spends 6-12 hours running interviews and learns the problem wasn't real only after their first launch flops - typical sunk cost is 6 weeks of build time plus $15K-$30K of contractor spend. Workarounds tried: YC Library essays (too high-level), $1,500 SurveyMonkey panel (taught one founder I spoke with nothing in the survey style), free templates downloaded but not used. Why now: AI-built MVPs accelerated this failure mode - the prototype lands in 4 days instead of 12 weeks, so the validation gap surfaces faster. Pain average 7.6/10 across 10 calls, 8 strong signals. The good answer has named industry, dated sample, named workarounds with named failure modes, a quantified cost, a why-now, and a strong-signal count. A peer can argue with it. If your statement has the word "many" or "a lot," cross it out. diff --git a/content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/index.md b/content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/index.md index d05d2a6db..13b5e41fa 100644 --- a/content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/index.md +++ b/content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/index.md @@ -45,18 +45,15 @@ The dashboard tells that founder what five phone calls would have said for free: The real question after the MVP ships is whether the people who already touched it would notice if it vanished tomorrow. If less than 40% would be very disappointed, no amount of ad spend will turn that group into customers. Paid traffic does not fix a product problem; it routes more users into something they will not return to. -> **What your first-pass numbers will probably look like (and that is not a failure signal).** An idea-stage founder with 4-6 onramp users typically sees one of three patterns on the first survey run: -> - All "somewhat disappointed" or "not disappointed" → that segment is not must-have; do not scale it. Run more interviews before re-attempting. -> - 3-4 "very disappointed" out of 6 → directional MAYBE. Almost certainly a sample-size problem, not a product problem; book 5-10 more users. -> - 5+ "very disappointed" out of 6 → directional STRONG YES. Advance to M5.3 with the caveat above. +> **What your first-pass numbers will probably look like (and that is not a failure signal).** An idea-stage founder with 4-6 onramp users will likely land somewhere in a wide range on the first survey run - that is expected, not a red flag. The exact read-by-count guide lives in the "Sample-size honesty" box in Step 5 below; use it once your numbers are in. > -> A 25-40% reading at small sample size is not a failure. It is the normal state of a brand-new product with a brand-new founder. The Sean Ellis test is calibrated for ≥ 20 respondents with months of usage; your first-pass run is a forecast, not a verdict. Treat looping back to M2.3 outreach for more user sessions as the default first-pass move, not a setback. +> A 25-40% reading at small sample size is not a failure. It is the normal state of a brand-new product with a brand-new founder. The Sean Ellis test is directional at ≥ 10 respondents and useful at 20+ with months of usage; your first-pass run is a forecast, not a verdict. Treat looping back to M2.3 outreach for more user sessions as the default first-pass move, not a setback. ## The 40% test, in one paragraph Sean Ellis ran growth at Dropbox, LogMeIn, and Eventbrite. While he was building the playbook for those three, he kept noticing the same dividing line between products that ignited and products that needed life support. He surveyed every product's existing users with a single load-bearing question: "How would you feel if you could no longer use [product]?" The answer is one of four: very disappointed, somewhat disappointed, not disappointed, no longer use it. If at least 40% of users said "very disappointed," the product was almost always able to grow on outbound and word of mouth alone. Under 40%, growth stalled until the product changed. Ellis explained the cutoff and the survey wording on Lenny Rachitsky's podcast ([transcript and replay here](https://www.lennysnewsletter.com/p/the-original-growth-hacker-sean-ellis)). -![Sean Ellis 40% gauge - the threshold that decides whether paid ads will work or burn](sean-ellis-gauge.svg) +![Semicircular gauge of the share of users answering very disappointed: amber below the 40% line means product problem, green at 40% or more means a must-have user](sean-ellis-gauge.svg) ## Why you, the non-technical founder, get this wrong @@ -137,17 +134,17 @@ Pull three numbers: 2. **Per-segment must-have %.** Slice by job title and by company size. One segment will almost always be higher than the average. That is your must-have segment. 3. **Three verbatim Q2-Q3 quotes from your must-have segment.** Paste them into a Google Doc. Those quotes are your persona description, your ad copy, and your cold-email subject line for the next chapter. -![Segment isolation Venn - what an average hides and what one slice reveals](segment-isolation.svg) +![Three segment cards showing what the blended 28% average hides: B2B Marketers at 64% must-have clear the 40% line, Solo Founders at 14% and Agencies at 0% do not](segment-isolation.svg) ### Step 5 - The decision tree ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% flowchart TD - A[Run the 5-question survey] --> B{Overall must-have %} - B -->|Under 25%| C[Stop. Product problem.
Talk to 5 'very disappointed' users.
Find what you missed.] - B -->|25-40%| D{Any segment over 40%?} - B -->|Over 40%| E[You have a must-have user.
Chapter 5.3 outreach starts here.] + A[Run the 5-question survey] --> B[Overall must-have %] + B -->|Under 25% | C[Stop. Product problem.
Talk to 5 'very disappointed' users.
Find what you missed.] + B -->|25-40%  | D[Any segment over 40%?] + B -->|Over 40% | E[You have a must-have user.
Chapter 5.3 outreach starts here.] D -->|Yes| F[Target that segment.
Rebuild the persona on those quotes.] D -->|No| G[Refine the product first.
Re-run after the next release.] classDef redbox fill:#fff5f5,stroke:#cc342d,stroke-width:2px; @@ -158,11 +155,11 @@ flowchart TD Re-run cadence: re-run while the must-have rate is climbing, and after every major release once it holds above 40% for two consecutive runs. If a re-run drops, read the "somewhat disappointed" Q2-Q4 verbatims first - the diagnostic is in there. -> **Sample-size honesty.** The Sean Ellis 40% threshold is statistically directional at **≥ 10 respondents**, useful at **20+**, and segment-sliceable at **30+**. Under 10 respondents your result is a hypothesis, not a verdict - with 6 "very disappointed" out of 10 the threshold says PASS, but the confidence band is wide enough that real demand could be 20% or 80%. Under 10, segment-slice math does not work and the 25-40% bands do not apply. Read the count directionally instead: +> **Sample-size honesty.** The Sean Ellis 40% threshold is statistically directional at **≥ 10 respondents**, useful at **20+**, and segment-sliceable at **30+**. Under 10 respondents your result is a hypothesis, not a verdict - with 6 "very disappointed" out of 10 the threshold says PASS, but the confidence band is wide enough that real demand could be 20% or 80%. Under 10, segment-slice math does not work and the 25-40% bands do not apply. Read your first-pass count directionally instead, out of your 4-6 onramp users: > > - **0-2 "very disappointed"**: directional NO. Book more user sessions before re-running. > - **3-4 "very disappointed"**: directional MAYBE. Book 5-10 more users, re-run. -> - **5+ "very disappointed" out of 6**: directional STRONG YES. Advance to M5.3 but caveat your outreach decisions - the segment language is hypothesis, not verified. +> - **5+ "very disappointed"**: directional STRONG YES. Advance to M5.3 but caveat your outreach decisions - the segment language is hypothesis, not verified. > > Use an under-10 reading to prioritize the next outreach batch, not to advance into Module 5.3 with confidence. diff --git a/content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/sean-ellis-gauge.svg b/content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/sean-ellis-gauge.svg index 71f04d532..b48f6d741 100644 --- a/content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/sean-ellis-gauge.svg +++ b/content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/sean-ellis-gauge.svg @@ -1,59 +1,64 @@ - - The Sean Ellis 40% threshold: where founder paid-ads instinct fails and where it does not + + The Sean Ellis 40% gauge: the share of your first users who would be "very disappointed" without the product, with 40% as the pass line. + A semicircular meter reading 0 to 100 percent of "very disappointed" survey answers. A bold red line marks the 40 percent threshold. The arc left of the line is amber (under 40 percent, a product problem); the arc right of the line is green (must-have segment, go sell). A needle points into the green zone. - - - - "Very disappointed if this disappeared tomorrow" - Sean Ellis 40% test - survey your first 10-30 users before spending a dollar on ads - - - - 0% - 25% - 40% - 60% - 100% - - - - 40% line - - - - UNDER 40% - Product problem. - More ads will not fix this. - Talk to your "very disappointed" users. - - - - 40% OR HIGHER - You have a must-have user. - Now find more of them. - Outreach beats paid ads at this stage. - - - If you ran ads first: - you would burn $3K-$5K - finding out the same thing. - - - - - 5 questions. 24-48 hour run. Free Typeform or Tally. - Re-run every 6 weeks until the must-have % stops climbing or holds steady above 40%. + + "How would you feel if you could no longer use it?" + Gauge = % of your first 10-30 users who answer "very disappointed" + + + + + + + + 40% + THE LINE + + + 0% + 100% + + + + + + + + UNDER 40% + Product problem, + not a marketing one. + More ads won't fix it - + talk to the "very disappointed". + + + + 40% OR MORE + You have a must-have user. + Outreach beats paid ads - + go find more of them + and start selling. + + + Run the survey before you buy any ads - 5 questions, free on Typeform or Tally. diff --git a/content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/segment-isolation.svg b/content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/segment-isolation.svg index 79678cab5..a6d31d138 100644 --- a/content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/segment-isolation.svg +++ b/content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/segment-isolation.svg @@ -1,45 +1,70 @@ - - Segment isolation: the must-have % hidden inside an average + + Segment isolation without a Venn: three cohort cards side by side. The blended average of 28% hides one segment scoring 64%, which passes the 40% line and is the one to sell to first. + Three cohort cards. B2B Marketers score 64% must-have (9 of 14) and pass the 40% line, highlighted green and tagged sell here first. Solo Founders 14% (1 of 7) and Agencies 0% (0 of 7) fall below the line, shown neutral. A red dashed 40% line crosses each mini fill-bar; only the marketers' bar clears it. - Average 28% looks like failure. - Slice by segment and one bucket is 64%. - Same 28 responses. Different conclusion. The 64% segment is who you ship to next. + + One blended average hides three different products. + Same 28 responses. The overall 28% looks like failure - until you slice by who the user is. - - - B2B Marketers - 64% must-have - 9 of 14 said "very disappointed" - Use it daily. Already replaced a tool. + + + B2B Marketers + 64% + must-have + + + + + 40% line + 9 of 14 said "very disappointed" + Use it daily. Dropped another tool. + + → SELL HERE FIRST - - - Solo Founders - 14% must-have - 1 of 7 said "very disappointed" - Tried it once. Forgot it existed. + + + Solo Founders + 14% + must-have + + + + 40% line + 1 of 7 said "very disappointed" + Tried it once. Forgot it existed. + Below the line - not now - - - Agencies - 0% must-have - 0 of 7. Already have an internal tool. - - - Now you know: - → Target B2B marketers next. - → Stop chasing solo founders for now. - → Agencies were never your buyer. + + + Agencies + 0% + must-have + + + 40% line + 0 of 7 said "very disappointed" + Already have an internal tool. + Never your buyer diff --git a/content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/good-vs-bad-prd.svg b/content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/good-vs-bad-prd.svg index fbeb0c7fd..a703e90d9 100644 --- a/content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/good-vs-bad-prd.svg +++ b/content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/good-vs-bad-prd.svg @@ -4,48 +4,49 @@ - Vibe PRD - Bad vs Good + Vibe PRD - Bad vs Good - BAD + BAD - "Build a CRM" + "Build a CRM" - 1. The problem + 1. The problem (blank) - 2. The user + context + 2. The user + context "Founders need a better way to manage customer relationships." - 3. What you're building + 3. What you're building "A modern CRM with great UX, integrations, and AI features." - 4. Success metric + 4. Success metric "Lots of happy users." - 5. What you're NOT building + 5. What you're NOT building (blank) Result: Lovable builds a settings @@ -57,31 +58,31 @@ - GOOD + GOOD - Stripe - QuickBooks reconciler + Stripe - QuickBooks reconciler - 1. The problem + 1. The problem Pre-seed SaaS founders, 6 hrs/week on Stripe - QB reconciliation. 8/10 confirmed, May 2026 sample. - 2. The user + context + 2. The user + context Founder, 9pm Tuesday, browser, Stripe + QB tabs open. Wants to be done in 10 min, not 40. - 3. What you're building + 3. What you're building Paste Stripe payout CSV. Get QB journal CSV back. USD only. Magic-link auth. No CSV stored. - 4. Success metric + 4. Success metric 10 of first 20 signups convert 1+ file in 30 days. Event: conversion_completed. - 5. What you're NOT building + 5. What you're NOT building Multi-currency - multi-Stripe - auto-sync - settings page - roles - mobile beyond 1024px - marketing diff --git a/content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/index.md b/content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/index.md index 7ce465f61..1e7a404bd 100644 --- a/content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/index.md +++ b/content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/index.md @@ -109,7 +109,7 @@ Common mistake: leaving this section blank because "we'll just say what we want Not every brief is a Vibe PRD. The audience tells you which to write. ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% flowchart TD Start(["Brief written"]) Start --> Q1{Who builds
from it?} diff --git a/content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/vibe-prd-template-visual.svg b/content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/vibe-prd-template-visual.svg index dd66abf25..52df8a5da 100644 --- a/content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/vibe-prd-template-visual.svg +++ b/content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/vibe-prd-template-visual.svg @@ -4,14 +4,15 @@ @@ -27,14 +28,14 @@ - Vibe PRD - One-Page Product Brief + Vibe PRD - One-Page Product Brief One 90-minute sitting. Hand to Lovable, Cursor, or a hired junior. - 1. - The problem (copy from Chapter 2.5) + 1. + The problem (copy from Chapter 2.5) Persona + industry + dated sample + verbatim quote + cost. _______________________________________________________ _______________________________________________________ @@ -43,8 +44,8 @@ - 2. - The user and their context + 2. + The user and their context Who they are while using your product: __________________ 60 seconds before reaching for it: ______________________ 60 seconds after they close it: _________________________ @@ -53,8 +54,8 @@ - 3. - What you're building (one paragraph) + 3. + What you're building (one paragraph) Smallest end-to-end thing the user can do: ______________ Inputs they provide + output they get back: _____________ What v1 explicitly supports (scope of done): ____________ @@ -63,8 +64,8 @@ - 4. - Success metric (one number) + 4. + Success metric (one number) Number + unit + timeframe: ______________________________ How it's measured (event name, not gut feel): ___________ e.g., "10 of first 20 signups convert in 30 days. Event: conversion_completed." @@ -72,8 +73,8 @@ - 5. - What you're NOT building (the no-go list) + 5. + What you're NOT building (the no-go list) 5-8 lines of things the agent or contractor will add unprompted: _______________________________________________________ Longer list = cheaper build diff --git a/content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/index.md b/content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/index.md index e47601242..e2f4b2638 100644 --- a/content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/index.md +++ b/content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/index.md @@ -57,11 +57,11 @@ Product Hunt converted at 3.1% per launch event across 387 launches OpenHunts st Product Hunt is not bad; it is a one-day event in a job that needs sustained motion over a quarter. -Picture the situation. Four paid pilots have closed from your personal network and LinkedIn audience over six weeks. The warm names are gone at customer five. The default move is to book a launch coach or sign an ad-agency contract. Either decision costs the same six weeks and a few thousand dollars - and neither one was designed for your B2B vertical. +Four paid pilots have closed from your personal network and LinkedIn audience over six weeks. The warm names are gone at customer five. The default move is to book a launch coach or sign an ad-agency contract. Either decision costs the same six weeks and a few thousand dollars - and neither one was designed for your B2B vertical. The four-line cold-email sequence below is what customer five answers in week three for under $40 of tooling. -![Product Hunt 3.1% vs Indie Hackers 23.1% - per OpenHunts 2024](ph-vs-ih.svg) +![Two stat cards, separate metrics: Product Hunt 3.1% per launch event (one-day spike, 89% would not launch again) vs Indie Hackers 23.1% per engaged post (sustained motion) - OpenHunts 2024](ph-vs-ih.svg) This is the closing chapter of Module 5 (First Paying Customer). Once your personal network is exhausted, the next 10 customers come from filtered cold outbound, not from launch events. @@ -155,61 +155,51 @@ The 60-90 second rule keeps the volume tractable. 30 prospects × 90 seconds = 4 ### Variant 1: B2B SaaS, shipped-MVP context -> Subject: shipped MVP last month - your post on [topic] -> -> Hi [first name], -> -> Saw your post on [topic, paraphrased in their words] last [Tuesday]. I shipped my MVP for [the same problem] last month using [Lovable + Supabase + Stripe] after 12 interviews with people who flagged the exact issue you described. I built [a tool that does X for Y]. -> -> Worth 15 minutes to walk through? Paid design partner spots, [$ deposit] credited toward year one. Calendly: [link] -> -> [Your name] +```text +Subject: shipped MVP last month - your post on [topic] + +Hi [first name], + +Saw your post on [topic, paraphrased in their words] last [Tuesday]. I shipped my MVP for [the same problem] last month using [Lovable + Supabase + Stripe] after 10 interviews with people who flagged the exact issue you described. I built [a tool that does X for Y]. + +Worth 15 minutes to walk through? Paid design partner spots, [$ deposit] credited toward year one. Calendly: [link] + +[Your name] +``` ### Variant 2: B2B services -> Subject: noticed your hiring for [role] -> -> Hi [first name], -> -> Saw [Company] is hiring a [role] - guessing [the problem the role solves] is on your roadmap. I run a [services category] practice and we have helped [a comparable company size] handle [the same problem] in [the same vertical] in the last six months. -> -> Open to a 15-minute walk-through? Paid pilot model, [$ deposit] credited toward year-one engagement. Calendly: [link] -> -> [Your name] +```text +Subject: noticed your hiring for [role] + +Hi [first name], + +Saw [Company] is hiring a [role] - guessing [the problem the role solves] is on your roadmap. I run a [services category] practice and we have helped [a comparable company size] handle [the same problem] in [the same vertical] in the last six months. + +Open to a 15-minute walk-through? Paid pilot model, [$ deposit] credited toward year-one engagement. Calendly: [link] + +[Your name] +``` ### Variant 3: B2C app -> Subject: re: your [Reddit post / TikTok video] on [topic] -> -> Hi [first name], -> -> Your [Reddit post / TikTok video] on [topic] hit. I built an app that handles [the painful task you described] - the link below is a 90-second Loom showing it work end-to-end on my phone. -> -> Loom: [link]. App: [link]. If it looks useful, I am opening 20 paid beta spots at $9/month for the first month. Reply to claim one. -> -> [Your name] +```text +Subject: re: your [Reddit post / TikTok video] on [topic] + +Hi [first name], + +Your [Reddit post / TikTok video] on [topic] hit. I built an app that handles [the painful task you described] - the link below is a 90-second Loom showing it work end-to-end on my phone. + +Loom: [link]. App: [link]. If it looks useful, I am opening 20 paid beta spots at $9/month for the first month. Reply to claim one. + +[Your name] +``` All three variants follow the same shape: a specific reference earns the open, one sentence on what you built, one specific ask with friction removed (Calendly or Loom + claim link), one currency anchor (deposit, beta price). Total length: 4-6 lines including subject. Anything longer reduces response rate. ## Stage-by-stage cadence -```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'fontSize':'20px', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% -flowchart LR - W1[Stage 1
Send 30 messages
1-4 replies expected] - W2[Stage 2
Run 3-5 demos
2-3 DPAs sent] - W3[Stage 3
1-2 deposits cleared
Pilot kickoffs scheduled] - W4[Stage 4
Send next 20
Hold for reply tail] - W5[Stage 5
First Friday demos
+ earlier prospects mature] - W7[Stage 6
Year-one conversions
+ next 20 cold names] - W1 --> W2 --> W3 --> W4 --> W5 --> W7 - classDef coldweek fill:#fff5f5,stroke:#cc342d,stroke-width:2px; - classDef warmweek fill:#fbe9ff,stroke:#a855f7,stroke-width:2px; - classDef conv fill:#fff8e0,stroke:#b8860b,stroke-width:2px; - class W1,W4 coldweek; - class W2,W5 warmweek; - class W3,W7 conv; -``` +![Six-stage outbound cadence: Stage 1 send 30 messages with 1-4 replies expected, Stage 2 run 3-5 demos with 2-3 DPAs sent, Stage 3 1-2 deposits cleared with pilot kickoffs scheduled, Stage 4 send next 20 and hold for reply tail, Stage 5 first Friday demos plus earlier prospects mature, Stage 6 year-one conversions plus next 20 cold names](stage-cadence.svg) Expect 3-8% replies on a realistic first batch - 1-2 replies per 30 messages - and treat 10-15% as what a tightly filtered, heavily personalized batch can reach: 3-4 replies, of which 1-2 agree to a 15-minute demo, of which one becomes a paid-pilot conversation. Of the pilots, the [Chapter 5.6](/course/tech-for-non-technical-founders-2026/paid-pilot-charge-before-ship/) deposit-to-year-one conversion math holds. diff --git a/content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/ph-vs-ih.svg b/content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/ph-vs-ih.svg index 9cca64cfe..6027b780c 100644 --- a/content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/ph-vs-ih.svg +++ b/content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/ph-vs-ih.svg @@ -1,46 +1,72 @@ - - Product Hunt 3.1% vs Indie Hackers 23.1% - the OpenHunts 2024 conversion data + + Product Hunt 3.1% per launch event vs Indie Hackers 23.1% per engaged post - two separate metrics, not one axis. + Two separate stat cards. Left, Product Hunt: 3.1% per launch event, 387 launches studied, 89% of founders would not launch again, shown as a single one-day spike. Right, Indie Hackers: 23.1% per engaged post, shown as sustained repeated engagement. Bottom note: Product Hunt is not bad - it is a one-day event in a job that needs sustained motion over a quarter. - Launch-day platforms - what actually converts in 2024 - OpenHunts study of 387 product launches and 156 founders surveyed - - - - 0% - 10% - 20% - 30% - 40% - - - Product Hunt - - 3.1% - per launch event - 89% of PH founders surveyed - said they would not launch again - - - Indie Hackers - - 23.1% - per engaged post - - - - 7.4x conversion advantage for IH per engaged post vs PH per launch. - Different metrics, same lesson: showing up where founders complain converts; one-day launches do not. + + + Two channels. Two different jobs. + OpenHunts 2024 - 387 launches, 156 founders surveyed. Separate metrics, shown separately. + + + + + + PRODUCT HUNT + + 3.1% + per launch event + + 387 launches studied + 89% said they would not launch again + + + + + + one-day spike + + + + + + + INDIE HACKERS + + 23.1% + per engaged post + + Written as engagement, + not a launch announcement + + + + + + + + + + + sustained motion + + + + + Product Hunt is not bad - it is a one-day event in a job that needs sustained motion over a quarter. diff --git a/content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/stage-cadence.svg b/content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/stage-cadence.svg new file mode 100644 index 000000000..27e8ea765 --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/stage-cadence.svg @@ -0,0 +1,96 @@ + + The six-stage outbound cadence + A snake-path diagram of six weekly stages. Row one, left to right: Stage 1, send 30 messages, 1-4 replies expected, tinted cold red. Stage 2, run 3-5 demos, 2-3 DPAs sent, tinted warm purple. Stage 3, 1-2 deposits cleared, pilot kickoffs scheduled, tinted conversion amber. The path drops down under Stage 3, then row two continues right to left: Stage 4, send next 20, hold for reply tail, tinted cold red. Stage 5, first Friday demos plus earlier prospects mature, tinted warm purple. Stage 6, year-one conversions plus next 20 cold names, tinted conversion amber. A legend below explains the three tints: cold outreach, warm pipeline, conversion. + + + + + + + + + The six-stage outbound cadence + Cold sends and warm follow-ups, running the same week. + + + + + + 1 + Send 30 messages + 1-4 replies expected + + + + + + 2 + Run 3-5 demos + 2-3 DPAs sent + + + + + + 3 + 1-2 deposits cleared + Pilot kickoffs scheduled + + + + + + + + + + + + + + 4 + Send next 20 + Hold for reply tail + + + + + + 5 + First Friday demos + + earlier prospects mature + + + + + + 6 + Year-one conversions + + next 20 cold names + + + + + + + + + Cold outreach + + Warm pipeline + + Money lands + diff --git a/content/course/tech-for-non-technical-founders-2026/ownership-checklist/index.md b/content/course/tech-for-non-technical-founders-2026/ownership-checklist/index.md index aa0150375..a66f20d1c 100644 --- a/content/course/tech-for-non-technical-founders-2026/ownership-checklist/index.md +++ b/content/course/tech-for-non-technical-founders-2026/ownership-checklist/index.md @@ -62,7 +62,7 @@ By the end of one Friday (or the 5 minutes if you're self-serve) you will know w ## Why this exists -A founder we saw last year handed a contractor her company credit card on Day 1. The contractor opened the accounts fast and shipped the MVP inside six weeks. Nobody moved the accounts to her email afterwards. A year later the contractor left the industry, and she discovered the GitHub org, the AWS root, and the domain were all registered to an inbox nobody checked. Recovery is slow and expensive when the accounts are not in your name. The audit below catches all of this on Day 1 in 45 minutes. +The account that locks you out is the one set up under someone else's email on Day 1 and never moved - and you find it a year later, once the person who opened it is gone. That is how it played out for a founder we saw last year: she handed a contractor her company credit card on Day 1, and he opened the accounts fast and shipped the MVP inside six weeks. Nobody moved the accounts to her email afterwards. A year later the contractor left the industry, and she discovered the GitHub org, the AWS root, and the domain were all registered to an inbox nobody checked. Recovery is slow and expensive when the accounts are not in your name. The audit below catches all of this on Day 1 in 45 minutes. Most contractors are not trying to lock you out. They set the accounts up under their own email on Day 1 because it was the fastest way to start, and nobody ever moved them. The damage is the same either way. @@ -129,7 +129,7 @@ The root account owns everything underneath it. If the contractor controls the r **#7 - Production database password rotation** -The fail looks like one sentence: *"Marcus knows it. I would have to ask him."* The pass looks like one action: you open AWS Secrets Manager right now, read the password, and remember the last time you rotated it (e.g. March, when the previous DBA left). +The fail looks like one sentence: *"Marcos knows it. I would have to ask him."* The pass looks like one action: you open AWS Secrets Manager right now, read the password, and remember the last time you rotated it (e.g. March, when the previous DBA left). If only one person can rotate the prod DB password, you do not have a database. You have a single point of failure. @@ -137,7 +137,7 @@ If only one person can rotate the prod DB password, you do not have a database. > Bad: Renewals come to a contractor's email. You have never logged into the registrar. > Good: Logged into Namecheap with your account. WHOIS shows your name. Auto-renew is on, charged to your card. -A domain transfer takes a minimum of **14 days** under ICANN rules and requires the losing registrar to release the auth code. If the contractor will not release it, your customers cannot reach your site for two weeks. +Plan a 14-day buffer for a domain transfer: ICANN's release window is five days, and many registrars add a 60-day lock after registration or a recent transfer. If the contractor will not release the auth code, your customers cannot reach your site for two weeks. ## What to do if the audit fails diff --git a/content/course/tech-for-non-technical-founders-2026/ownership-checklist/ownership-checklist.pdf b/content/course/tech-for-non-technical-founders-2026/ownership-checklist/ownership-checklist.pdf index 245bbc75d..f3f49f2fc 100644 Binary files a/content/course/tech-for-non-technical-founders-2026/ownership-checklist/ownership-checklist.pdf and b/content/course/tech-for-non-technical-founders-2026/ownership-checklist/ownership-checklist.pdf differ diff --git a/content/course/tech-for-non-technical-founders-2026/paid-pilot-charge-before-ship/free-vs-paid-pilot.svg b/content/course/tech-for-non-technical-founders-2026/paid-pilot-charge-before-ship/free-vs-paid-pilot.svg index 43b4ea483..c18b1e77a 100644 --- a/content/course/tech-for-non-technical-founders-2026/paid-pilot-charge-before-ship/free-vs-paid-pilot.svg +++ b/content/course/tech-for-non-technical-founders-2026/paid-pilot-charge-before-ship/free-vs-paid-pilot.svg @@ -2,21 +2,21 @@ Why free pilots ghost and paid pilots convert - the skin-in-the-game gap Free pilot vs paid pilot - what skin in the game does - Illustrative from 4 JT-rescue founders who ran both motions in 2026. Your numbers will vary. + Illustrative from 4 founders we worked with who ran both motions in 2026. Your numbers will vary. diff --git a/content/course/tech-for-non-technical-founders-2026/paid-pilot-charge-before-ship/index.md b/content/course/tech-for-non-technical-founders-2026/paid-pilot-charge-before-ship/index.md index 10bb1b484..ecbf8031b 100644 --- a/content/course/tech-for-non-technical-founders-2026/paid-pilot-charge-before-ship/index.md +++ b/content/course/tech-for-non-technical-founders-2026/paid-pilot-charge-before-ship/index.md @@ -54,7 +54,7 @@ Free pilots feel collaborative because the customer says yes, you build for six Week 8 lands and you send the proposal for the year-one contract. The customer says "this is great, let me circle back to my CFO" - and that CFO has never heard of you, did not approve the pilot, and has no internal justification for the line item. The conversation dies in a forwarded email thread. -That's the recurring mechanic. A 20% deposit at kickoff puts the CFO question on Week 0, when there's no project yet for the customer to defend. Conversion in Week 7 becomes paperwork, not negotiation. Skip the deposit and you're back at the Week 8 wall: "this is great" emails Friday, ghost on conversion Monday. +That's the recurring mechanic: real money on the table before kickoff forces the internal budget conversation while there is still nothing riding on it for the customer to defend. By the time the pilot wraps, converting to a paid contract is a formality, not a fresh sales pitch. Skip the deposit and you're back at the Week 8 wall: "this is great" emails Friday, ghost on conversion Monday. First-time founders often default to "let the customer try it free and they'll pay once they see the value" - that instinct produces six months of free pilots and zero signed contracts. Charging first is what flips a curious user into a customer with skin in the game. @@ -210,7 +210,7 @@ The five-minute path: That is the entire setup. No webhook, no Rails controller, no Django view, no Laravel route. If you want to log paid pilots into your existing app, you can - but you do not have to. The CSV export from Stripe is enough for a Module 5 first-pilot motion. ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% sequenceDiagram participant Founder participant Stripe @@ -317,7 +317,7 @@ A 20% deposit at kickoff puts the CFO question on Week 0. Conversion in Week 7 b > > **Next:** that is the core course complete - from a one-sentence hypothesis to a stranger's money in your account. Two ways to keep going: the optional [5.7 · Going Outbound Without a Sales Team](/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/) when your warm list runs dry, and the [Going further chapters](/course/tech-for-non-technical-founders-2026/#going-further-after-first-paying-customer) once your pilot converts. The [First-Paying-Customer Operating Kit](/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/) keeps the build honest through the pilot. > -> **If blocked:** If the customer says "can we start free and convert later," reframe: the deposit is year-one ACV prepaid, not added cost. If they still say no, they are not in your must-have segment - move to the next lead. +> **If blocked:** If the customer says "can we start free and convert later," reframe: the deposit is credited toward year-one ACV, not added cost. If they still say no, they are not in your must-have segment - move to the next lead. > **Stuck here?** Asking for money from someone you know is the stall point, even as a refundable deposit. **Fix:** the deposit is a test of whether the problem is real - not a test of whether you deserve to be paid. If they value the solved problem less than the deposit, their problem isn't acute enough. Send the DPA to your warmest lead first. The second one is easier. diff --git a/content/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/index.md b/content/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/index.md index e8bc84984..35a5315c0 100644 --- a/content/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/index.md +++ b/content/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/index.md @@ -47,7 +47,7 @@ related_posts: false A founder I rode shotgun with last quarter - a fintech founder named D. - hit the cold-outbound stage (Chapter 5.7) with a conversion rate of 0.6%. He had sent 287 personal emails to CFOs of 50-200-person companies over 14 days, with 11 replies and 0 paid pilots. His instinct, the same instinct every founder gets here, was to push forward into salvage-or-rebuild territory and start managing the build harder. -That was the wrong move. The right move was backwards. The 0.6% conversion rate was telling him the messaging he had built off his [Founding Hypothesis](/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/) sentence was not landing on the segment he had picked. Three things could be wrong: the customer (segment), the need (problem), or the channel (outbound vs PLG). Pushing forward into rebuild mode would have made him a better operator of a misaligned hypothesis. Going back to [Form Your Founding Hypothesis](/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/) with a pivot decision made him a better founder. +That was the wrong move. The right move was backwards. The 0.6% conversion rate was telling him the messaging he had built off his [Founding Hypothesis](/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/) sentence was not landing on the segment he had picked. Three things could be wrong: the customer (segment), the need (problem), or the channel (outbound vs PLG - product-led growth, where users find and buy the product self-serve). Pushing forward into rebuild mode would have made him a better operator of a misaligned hypothesis. Going back to [Form Your Founding Hypothesis](/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/) with a pivot decision made him a better founder. The course you have been reading was structured as a numbered sequence because that is the cleanest way to learn the moves. But the actual job is a loop. A founder writes a hypothesis, smoke-tests it, talks to customers, builds an MVP, lands paying customers, and at any point can hit a signal that sends them back to [Form Your Founding Hypothesis](/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/) with a new hypothesis. The courses that pretend the journey is one-way escalator produce founders who think pivoting is failure. It is not. Pivoting is the discovery loop working correctly. @@ -73,7 +73,7 @@ Eric Ries catalogued ten pivot types in *The Lean Startup*; Steve Blank built on ### 4. Technology pivot -*Right solution, wrong tech stack.* The shape of the solution is right but the platform you built it on cannot reach the price or performance the customer needs. Less common for non-technical founders because most ship on Lovable, Bubble, or with a hired team and the tech is opaque. Becomes relevant when you outgrow a no-code ceiling. Example: a B2C founder hit 4,000 MAU on Bubble and discovered the per-row pricing model would cost $11K/month at 20K MAU; the rebuild on a native stack made the unit economics work. +*Right solution, wrong tech stack.* The shape of the solution is right but the platform you built it on cannot reach the price or performance the customer needs. Less common for non-technical founders because most ship on Lovable, Bubble, or with a hired team and the tech is opaque. Becomes relevant when you outgrow a no-code ceiling. Example: a B2C founder hit 4,000 MAU (monthly active users) on Bubble and discovered the per-row pricing model would cost $11K/month at 20K MAU; the rebuild on a native stack made the unit economics work. ### 5. Channel pivot @@ -81,7 +81,7 @@ Eric Ries catalogued ten pivot types in *The Lean Startup*; Steve Blank built on ### 6. Revenue Model pivot -*Right product, wrong pricing.* The product works and the audience pays, but the pricing shape (per seat, per event, flat tier, freemium) does not match how customers value or budget for the product. The signal comes from active customers churning at the renewal date with feedback that points at price, not the product. Example: a B2B SaaS priced at $200/seat/month for 10-seat teams; customers loved it but balked at the renewal because they only needed 3 power users. Pivot was to $400/month flat for unlimited seats with feature gates by usage tier. ARPU dropped 20% per customer; net revenue retention jumped to 118%. +*Right product, wrong pricing.* The product works and the audience pays, but the pricing shape (per seat, per event, flat tier, freemium) does not match how customers value or budget for the product. The signal comes from active customers churning at the renewal date with feedback that points at price, not the product. Example: a B2B SaaS priced at $200/seat/month for 10-seat teams; customers loved it but balked at the renewal because they only needed 3 power users. Pivot was to $400/month flat for unlimited seats with feature gates by usage tier. ARPU (average revenue per user) dropped 20% per customer; net revenue retention (the revenue you keep plus expansion from existing customers) jumped to 118%. The skill is not memorizing the six types. The skill is asking which of the five Mad Libs blanks (customer, problem, approach, competition, differentiation) is wrong, and matching it to the pivot type that addresses that blank. diff --git a/content/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/pivot-ledger.svg b/content/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/pivot-ledger.svg index 51632f5a1..aee05cc62 100644 --- a/content/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/pivot-ledger.svg +++ b/content/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/pivot-ledger.svg @@ -2,12 +2,12 @@ The pivot ledger: 4-column table tracking what survives the pivot and what does not diff --git a/content/course/tech-for-non-technical-founders-2026/quickstart/index.md b/content/course/tech-for-non-technical-founders-2026/quickstart/index.md index 307053a2a..f6b22981e 100644 --- a/content/course/tech-for-non-technical-founders-2026/quickstart/index.md +++ b/content/course/tech-for-non-technical-founders-2026/quickstart/index.md @@ -29,6 +29,8 @@ related_posts: false You have an idea and no time, so this page lists only the core lessons - the smallest amount of reading that still produces a real result. +![The minimal path: five numbered core-lesson stops, one per module in its module colour - Hypothesis and Smoke Test (landing page and price signal), Validate the Problem (10 interviews and a prototype), Design from Evidence (a one-page Product Brief), Build It Yourself (a live MVP at a real URL), and First Paying Customer (a signed paid pilot).](minimal-path.svg) + ## The Problem (in your language) You want to validate whether your idea has real demand before you spend $30K+ on a dev shop - but you can't read code, your available time is evenings and weekends (maybe 2-4 hours a week), and hiring anyone is premature. This route works within all three constraints. diff --git a/content/course/tech-for-non-technical-founders-2026/quickstart/minimal-path.svg b/content/course/tech-for-non-technical-founders-2026/quickstart/minimal-path.svg new file mode 100644 index 000000000..08e1d2a6a --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/quickstart/minimal-path.svg @@ -0,0 +1,88 @@ + + The minimal path: five numbered core-lesson stops from idea to first paying customer. + A left-to-right strip of five numbered step cards, one per module, each in its module colour. Step 1 Hypothesis and Smoke Test produces a landing page and a price signal. Step 2 Validate the Problem produces 10 interviews and a prototype. Step 3 Design from Evidence produces a one-page Product Brief. Step 4 Build It Yourself produces a live MVP at a real URL. Step 5 First Paying Customer produces a signed paid pilot. Arrows connect each step to the next. + + + + + + + + + The Minimal Path + Core lessons only - the shortest route from idea to first paying customer. + + + + + + 1 + Hypothesis & + Smoke Test + landing page + + price signal + + + + + + + 2 + Validate the + Problem + 10 interviews + + prototype + + + + + + + 3 + Design from + Evidence + one-page + Product Brief + + + + + + + 4 + Build It + Yourself + live MVP at + a real URL + + + + + + + 5 + First Paying + Customer + signed + paid pilot + + + + + + + + diff --git a/content/course/tech-for-non-technical-founders-2026/reference/hypothesis-sprint-full/index.md b/content/course/tech-for-non-technical-founders-2026/reference/hypothesis-sprint-full/index.md index 982d05f0d..d51f1eb1d 100644 --- a/content/course/tech-for-non-technical-founders-2026/reference/hypothesis-sprint-full/index.md +++ b/content/course/tech-for-non-technical-founders-2026/reference/hypothesis-sprint-full/index.md @@ -8,6 +8,8 @@ slug: hypothesis-sprint-full > **Reference companion to [Lesson 1.1 · Form Your Founding Hypothesis](/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/)** - the full 6-step sprint, 4-lens scoring methodology, AI research prompts, and worked examples. Read the micro-lesson first for the minimum effective path; return here when you want the deep reference. +![The 6-step founding-hypothesis sprint as a numbered snake: 1 The Basics (five candidates per column), 2 Differentiator (faster, easier, or cheaper), 3 Three Approaches (one sentence each), 4 Magic Lenses (score 1-5 on four lenses), 5 Write It Down (the one Mad Libs sentence), 6 Design the Test (smoke test plus interviews) - one notebook, about 90 minutes, run alone](sprint-timeline.svg) + --- ## The Full 6-Step Sprint diff --git a/content/course/tech-for-non-technical-founders-2026/reference/hypothesis-sprint-full/sprint-timeline.svg b/content/course/tech-for-non-technical-founders-2026/reference/hypothesis-sprint-full/sprint-timeline.svg new file mode 100644 index 000000000..69bcf1c06 --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/reference/hypothesis-sprint-full/sprint-timeline.svg @@ -0,0 +1,78 @@ + + The six-step founding-hypothesis sprint, run alone in about 90 minutes + Six numbered step cards laid out as a snake - three across the top left to right, three across the bottom right to left - joined by arrows. Step 1 The Basics: five candidates per column. Step 2 Differentiator: faster, easier, or cheaper. Step 3 Three Approaches: one sentence each. Step 4 Magic Lenses: score 1 to 5 on four lenses. Step 5 Write It Down: the one Mad Libs sentence. Step 6 Design the Test: smoke test plus interviews. + + + + + + + + The 6-step founding-hypothesis sprint + One notebook, a kitchen timer, about 90 minutes - run it alone. + + + + + + 1 + The Basics + five candidates per column + + + + + 2 + Differentiator + faster, easier, or cheaper + + + + + 3 + Three Approaches + one sentence each + + + + + + + 4 + Magic Lenses + score 1-5 on four lenses + + + + + 5 + Write It Down + the one Mad Libs sentence + + + + + 6 + Design the Test + smoke test + interviews + + + + + + + + + + + diff --git a/content/course/tech-for-non-technical-founders-2026/reference/smoke-test-channel-guide/channel-icp-matrix.svg b/content/course/tech-for-non-technical-founders-2026/reference/smoke-test-channel-guide/channel-icp-matrix.svg new file mode 100644 index 000000000..d564f37c9 --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/reference/smoke-test-channel-guide/channel-icp-matrix.svg @@ -0,0 +1,72 @@ + + Channel-by-ICP matrix - the right paid channel for the audience your hypothesis names + Four handwritten cards, one per audience type. Top-left B2C consumer: Meta, 0.70 to 1.90 dollars per click, split 60/40 Reels and feed. Top-right B2B sold by job title: LinkedIn for unaware audiences or Google Search for active searchers, 3 to 22 dollars per click. Bottom-left developer tools: Reddit Ads, 1.25 to 3 dollars per click, in r/programming, r/webdev, r/SaaS. Bottom-right niche vertical: Google Search on long-tail intent, 1 to 5 dollars per click. Footer: skip Twitter/X for first-time validation in 2026 - targeting signal too noisy. + + + + + Where the audience actually lives + Pick the channel where your customer scrolls - not the one YOU scroll. + + + + + B2C consumer products + Meta (Facebook + Instagram) + Cheap CPMs, fast learning. + Split 60% Reels / 40% feed. + $0.70 - $1.90 per click + Best targeting for broad consumer reach. + + + + + + B2B, sold by job title + LinkedIn or Google Search + LinkedIn: unaware audience. + Google: already searching for a fix. + $3 - $22 per click + Job-title + company-size targeting. + + + + + + Developer tools / technical + Reddit Ads + r/programming, r/webdev, + r/SaaS - where devs already are. + $1.25 - $3 per click + Skip if procurement is non-technical. + + + + + + Niche vertical + (real estate, dentists, contractors) + Google Search + Long-tail keywords with + clear purchase intent. + $1 - $5 per click + + + + + Twitter / X: skip for first-time validation in 2026 - the targeting signal is too noisy now. + diff --git a/content/course/tech-for-non-technical-founders-2026/reference/smoke-test-channel-guide/index.md b/content/course/tech-for-non-technical-founders-2026/reference/smoke-test-channel-guide/index.md index 0051a844f..59942bc1f 100644 --- a/content/course/tech-for-non-technical-founders-2026/reference/smoke-test-channel-guide/index.md +++ b/content/course/tech-for-non-technical-founders-2026/reference/smoke-test-channel-guide/index.md @@ -42,7 +42,7 @@ Picking the channel takes minutes; getting the ad account approved and ready to ## B2B on a Small Budget -If your ideal customer profile (ICP) says LinkedIn but $1,800+ is out of reach, three viable substitutes at ~10% of the cost: +If your ideal customer profile (ICP) says LinkedIn but $1,800+ is out of reach, three viable substitutes - two free, one at a fraction of the cost: | Alternative | How | Cost | |---|---|---| @@ -56,6 +56,8 @@ Use one of these, run it the same way until the numbers stabilize, read the resu ## Channel by ICP (Full Breakdown) +![Channel-by-ICP matrix: Meta for B2C consumer at $0.70-$1.90 per click, LinkedIn or Google Search for B2B at $3-$22, Reddit Ads for developer tools at $1.25-$3, Google Search for niche verticals at $1-$5, and skip Twitter/X for first-time validation in 2026](channel-icp-matrix.svg) + ### B2C Consumer **Channel:** Meta ($0.70-$1.90 CPC). Split 60/40 Reels/feed. **When to pick:** Product is visual, audience is broad. diff --git a/content/course/tech-for-non-technical-founders-2026/reference/stripe-price-test-full/index.md b/content/course/tech-for-non-technical-founders-2026/reference/stripe-price-test-full/index.md index 8fa6bff67..07e0e22d3 100644 --- a/content/course/tech-for-non-technical-founders-2026/reference/stripe-price-test-full/index.md +++ b/content/course/tech-for-non-technical-founders-2026/reference/stripe-price-test-full/index.md @@ -8,6 +8,8 @@ slug: stripe-price-test-full > **Reference companion to [Lesson 1.5 · Price Your Hypothesis on the Smoke-Test Page](/course/tech-for-non-technical-founders-2026/price-hypothesis-on-smoke-test-page/)** - this page contains the full Stripe setup walkthrough with gotchas, click-vs-completion tracking table, detailed threshold bands, button copy patterns, and the Claude copy-generation prompt. Read the micro-lesson first; return here for deep pricing methodology. +![The Stripe price-test flow: 1 create the Payment Link (one-time product at your price), 2 wire it to the page button in live mode, 3 read the visit-to-Stripe-click rate - then act on the band: under 5% iterate on price, 5-10% advance to interviews, over 10% verify with a second cold channel](price-test-flow.svg) + --- ## The Maya Story (Full Version) diff --git a/content/course/tech-for-non-technical-founders-2026/reference/stripe-price-test-full/price-test-flow.svg b/content/course/tech-for-non-technical-founders-2026/reference/stripe-price-test-full/price-test-flow.svg new file mode 100644 index 000000000..6772ab835 --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/reference/stripe-price-test-full/price-test-flow.svg @@ -0,0 +1,97 @@ + + The Stripe price-test flow: build the Payment Link, wire it to the page, read the click rate, then act on the band it lands in. + Three numbered step cards in a row: create the Stripe Payment Link with a one-time product at your hypothesis price, wire it to the landing-page button in live mode, and read the visit-to-Stripe-click rate. The rate forks into three outcome bands. Under 5 percent, amber: iterate - cut the price by half, add founding-member framing; below 2 percent means the audience or hypothesis is wrong, not the price. Five to ten percent, green: advance - the price is validated, move to Module 2 interviews and email everyone who clicked but did not buy. Over 10 percent, purple: verify - run a second cold channel; if both hold the signal is real, if one spikes the targeting was hot, not the pricing. + + + + + + + + The Stripe price test, step by step + An email costs nothing; a card entry costs intent. Measure the one that counts. + + + + + + + + 1 + Create the Payment Link + one-time product, your price + + + + + + + 2 + Wire it to the button + live mode, not test mode + + + + + + 3 + Read the click rate + page visits → Stripe clicks + + + + + + + + + + + + + + + + Under 5% - iterate + Cut the price 50%, add a + "founding member" framing. + Below 2% after that = the + audience is wrong, not the price. + + + + + 5 - 10% - advance + Price-validated. Move to + Module 2 customer interviews. + Email everyone who clicked + but didn't buy - your best group. + + + + + Over 10% - verify + Run a second cold channel. + Both hold → the signal is real. + One spikes → hot targeting, + not your pricing. + + diff --git a/content/course/tech-for-non-technical-founders-2026/salvage-vs-rebuild-decision-tree/index.md b/content/course/tech-for-non-technical-founders-2026/salvage-vs-rebuild-decision-tree/index.md index 9123b2041..7e5a2bebd 100644 --- a/content/course/tech-for-non-technical-founders-2026/salvage-vs-rebuild-decision-tree/index.md +++ b/content/course/tech-for-non-technical-founders-2026/salvage-vs-rebuild-decision-tree/index.md @@ -65,9 +65,9 @@ Add up the scores. | Score | Verdict | What you do next | |---|---|---| -| **5-6** | **KEEP and harden.** | The codebase is salvageable. Spend the rebuild budget you were about to write a check for on test coverage, monitoring, and one senior hire. Do not rewrite. | -| **3-4** | **FREEZE and stabilize.** | No new features for 30 to 60 days. One sprint on access ownership (run the [GitHub / AWS / database checklist](/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/)), one sprint on adding tests around the top three flows, one sprint on monitoring and backups. Re-score in 60 days. If you climb to 5+, you keep. If you stay at 3-4, you rebuild the core paths. | -| **0-2** | **REBUILD core paths.** | Not a full rewrite. Identify the two or three highest-traffic flows (signup, checkout, the one core action your users repeat) and rebuild THOSE on a parallel codebase. Migrate users behind a feature flag. Keep the legacy system running for everything else for 90 days, then sunset it one flow at a time. | +| **5-6** | KEEP and harden. | The codebase is salvageable. Spend the rebuild budget you were about to write a check for on test coverage, monitoring, and one senior hire. Do not rewrite. | +| **3-4** | FREEZE and stabilize. | No new features for 30 to 60 days. One sprint on access ownership (run the [GitHub / AWS / database checklist](/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/)), one sprint on adding tests around the top three flows, one sprint on monitoring and backups. Re-score in 60 days. If you climb to 5+, you keep. If you stay at 3-4, you rebuild the core paths. | +| **0-2** | REBUILD core paths. | Not a full rewrite. Identify the two or three highest-traffic flows (signup, checkout, the one core action your users repeat) and rebuild THOSE on a parallel codebase. Migrate users behind a feature flag. Keep the legacy system running for everything else for 90 days, then sunset it one flow at a time. | A score of 0 is not a "burn it down" verdict. The legacy code keeps running while you carve out the parts that matter and rebuild them with tests, monitoring, and one engineer who owns them. diff --git a/content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-build-phases/cover.png b/content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-build-phases/cover.png index 748db0c9a..230bd0ced 100644 Binary files a/content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-build-phases/cover.png and b/content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-build-phases/cover.png differ diff --git a/content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-build-phases/index.md b/content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-build-phases/index.md index 123461868..4762694a5 100644 --- a/content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-build-phases/index.md +++ b/content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-build-phases/index.md @@ -23,7 +23,7 @@ metatags: image: cover.png og_title: "4.4 · The Self-Serve MVP Stack: Build Phases" og_description: "The build plan: 4 phases from Lovable UI to live Stripe checkout. Phase exit criteria, 5 green lights, and the Module 5 handoff." -cover_image_alt: "JetThoughts cover showing three hand-drawn stacked layers labeled Lovable, Supabase, and Stripe with arrows linking them, and a sticky note reading Weeks 4-10 for the build-phase plan." +cover_image_alt: "JetThoughts cover titled Self-Serve Build Phases, showing four connected phase cards - Phase 1 UI, Phase 2 Data, Phase 3 Pay, Phase 4 Deploy - with chips reading Weeks 4-12, Phases 4, Team Solo." canonical_url: "https://jetthoughts.com/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-build-phases/" related_posts: false --- @@ -158,7 +158,7 @@ Be honest about the trade-off. This stack cannot host every business. It can hos The stack holds until it doesn't. Five specific signals tell you the ceiling is close. The next chapter ([Chapter 4.5 - Proactive Ceiling Signals](/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/)) walks through each one with the threshold to watch. -Quick preview: scale beyond roughly 5,000 users, complex data model that no longer fits a single Supabase project, real-time features the auto-generated REST API cannot serve, security or compliance scope that needs an external audit, AI inference at scale where per-request cost crosses pennies. When you see two of these, route to the [hire-track supplementary reference](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/) or to a [Fractional CTO](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/#the-fractional-cto-bridge) for the architecture call. Architecture does not collapse overnight; the warning shows up in the metrics before the customer sees it. Chapter 4.5 names the metrics. +Quick preview: scale beyond roughly 5,000 users, complex data model that no longer fits a single Supabase project, real-time features the auto-generated REST API cannot serve, security or compliance scope that needs an external audit, AI inference at scale where per-request cost crosses pennies. When two of these keep firing across two consecutive monthly checks (the 4-week rule from Chapter 4.5), route to the [hire-track supplementary reference](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/) or to a [Fractional CTO](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/#the-fractional-cto-bridge) for the architecture call. Architecture does not collapse overnight; the warning shows up in the metrics before the customer sees it. Chapter 4.5 names the metrics. What the stack actually costs, per published vendor pricing: @@ -188,7 +188,7 @@ The shed build never grows that large. Either you reach the architectural ceilin ## When this path ends -Self-serve has a ceiling. The [ceiling-signal monitoring chapter](/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/) covers the 5 signals that mean it's time to bring in help. When 2+ signals fire in one monthly check, switch to the [hire-track supplementary reference](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/). +Self-serve has a ceiling. The [ceiling-signal monitoring chapter](/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/) covers the 5 signals that mean it's time to bring in help. When 2+ signals fire across two consecutive monthly checks (the 4-week rule from Chapter 4.5), switch to the [hire-track supplementary reference](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/). Build the shed first. Lovable + Supabase + Stripe + a ~$10 domain ships your validated problem to a staging URL on per-vendor pricing. The bigger architecture is a different conversation, and you have not earned the right to have it yet. diff --git a/content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-lovable-supabase-stripe-2026/index.md b/content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-lovable-supabase-stripe-2026/index.md index ac28a9929..8b8cc0621 100644 --- a/content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-lovable-supabase-stripe-2026/index.md +++ b/content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-lovable-supabase-stripe-2026/index.md @@ -166,7 +166,7 @@ Synthesis of every rule scattered across Module 4 and the supplementary referenc 9. **Budget envelope: vendor free tiers + per-tool monthly fees.** Lovable free, Supabase free, Stripe transaction fees, domain registration. Upgrade Lovable to a paid tier only when build velocity demands it. 10. **Ship before scope creep, then a short stabilization phase.** Build the smallest end-to-end thing, then a stabilization phase before paid-pilot conversations. Sits inside the multi-month journey to first paying customer. 11. **Monthly Ch 4.5 ceiling-signal check once the live MVP is up.** Even if everything is green, the habit catches the 5 architectural break-points before they become rebuilds. -12. **Do not scale a Lovable stack past ~5K users or 2 ceiling signals at red.** When you hit either limit, graduate to a Fractional CTO bridge (see [hire-track reference](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/#the-fractional-cto-bridge)). The shed is not the house; pouring skyscraper foundations into a shed slab does not build a skyscraper. +12. **Do not scale a Lovable stack past ~5K users or two ceiling signals firing for 4+ weeks.** When you hit either limit, graduate to a Fractional CTO bridge (see [hire-track reference](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/#the-fractional-cto-bridge)). The shed is not the house; pouring skyscraper foundations into a shed slab does not build a skyscraper. Each of the 12 rules is taught in depth somewhere across this chapter, the [self-serve stack walkthrough](/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/), [Ch 4.5 ceiling signals](/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/), or the [hire-track supplementary reference](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/). The list above is the index; the surrounding chapters are the depth. diff --git a/content/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/cover.png b/content/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/cover.png index e2eee42f6..1a63c0a88 100644 Binary files a/content/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/cover.png and b/content/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/cover.png differ diff --git a/content/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/index.md b/content/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/index.md index 420798d3d..29d27945c 100644 --- a/content/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/index.md +++ b/content/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/index.md @@ -21,6 +21,7 @@ tags: - self-serve - vibe-coding categories: ["Templates"] +cover_image_alt: "JetThoughts cover titled Self-Serve Stack Walkthrough, showing four cards - Lovable, Supabase, Stripe, Go live - each marked 5 sessions, with chips reading Pace Evenings OK, Sessions 20, Team Solo." canonical_url: "https://jetthoughts.com/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/" related_posts: false --- @@ -66,7 +67,7 @@ If a session runs long, or a phase takes you a couple of extra weeks, you are no - [ ] **one-page brief finalized** ([template](/course/tech-for-non-technical-founders-2026/vibe-prd-template/)) - [ ] **Validated Problem Statement filled in** ([template](/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/)) - [ ] **[Build Path Decision Worksheet](/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/) verdict = Path 2 (Self-serve)** -- [ ] **One Lovable account created** (Free tier OK to start; upgrade to Pro $25 around Phase 2) +- [ ] **One Lovable account created** (Free tier OK to start; upgrade to a paid plan - check Lovable's pricing page - around Phase 2) - [ ] **One Supabase project created** (Free tier OK through Phase 4) - [ ] **One Stripe account created** in test mode (verify the email) - [ ] **One GitHub account** (Free plan is fine for solo founder) @@ -390,7 +391,7 @@ The bad pattern ships an MVP where any user with the right URL pattern can fake - **If 1+ paid signups**: continue. The hypothesis is alive. Build the second feature next, using the same one-feature-per-month rhythm. Re-read the [three-questions standup chapter](/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/) for the weekly oversight rhythm once you bring in a contractor. - **If 0 paid signups but 3+ signups**: the product clicks but the price or the paywall is wrong. Run two A/B tests next: lower price ($19 vs $29), and earlier paywall (paid from day 1 vs 14-day trial). Pick the winner. Re-send to 5 new ICP prospects. - **If 0 signups**: the cold message and the landing screen are both wrong, OR the [Module 2](/course/tech-for-non-technical-founders-2026/mom-test-ask-about-past-not-future/) validation was a false positive. Re-read your Mom Test transcripts. Are the buyers who said "yes I'd pay" the same buyers ignoring your cold message? If yes, the validation was polite, not real. Loop back to Module 2 for ten more interviews before you build feature two. -- **Watch for the architectural ceiling**: when any of the [5 ceiling signals](/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/) appears (covered in detail in Chapter 4.5), pause feature work and route to the [Fractional CTO bridge](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/#the-fractional-cto-bridge). The shed does not collapse overnight, but you stop adding load once you see the signal. +- **Watch for the architectural ceiling**: when two of the [5 ceiling signals](/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/) keep firing for 4+ weeks (covered in detail in Chapter 4.5), plan the route to the [Fractional CTO bridge](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/#the-fractional-cto-bridge). The shed does not collapse overnight; finish the build phase you are in, then plan the route rather than panicking mid-ship. If you want the doctrine in long form, [Chapter 4.3](/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-lovable-supabase-stripe-2026/) walks through what each tool does, the role boundaries, the cost reality, and the architectural ceiling preview. diff --git a/content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/airbnb-test.svg b/content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/airbnb-test.svg index 7ea10c0ef..74df196f9 100644 --- a/content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/airbnb-test.svg +++ b/content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/airbnb-test.svg @@ -1,5 +1,5 @@ - + diff --git a/content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/decision-matrix.svg b/content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/decision-matrix.svg deleted file mode 100644 index a6d6eb327..000000000 --- a/content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/decision-matrix.svg +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - The 4-Way Build-Path Decision Matrix - Pick the smallest path that answers the next question your investors will ask. - - - more validated above - less validated below - simpler build - backend-heavier build - - - - - 1. Validate without code - When: no MVP. Single hypothesis untested. - First action: post a Carrd page + Stripe link. - Cost: $0-$300. Timeline: 1 week. - Failure mode: 0 buyers. Pivot before you build. - Tools: Carrd, Stripe, Notion, Lovable demo, - Calendly, 1 paid LinkedIn ad ($100-200). - "Sell the solution before you build it." - - - - 2. Self-serve build (Ch 4.3-4.4) - When: validated. Simple MVP. - First action: paste Vibe PRD into Lovable. - Cost: $200-$1,200/mo. Timeline: 6-12 weeks. - Failure mode: hits ceiling at 5K users. - Tools: Lovable + Supabase + Stripe. - Architecture review: 1 hour/month with - a senior engineer in your network. - - - - 3. Fractional CTO bridge - When: validated. Mid complexity. No $200K+. - First action: hire 5 hrs/wk Fractional CTO. - Cost: $1,600-$4,000/mo. Timeline: 8-16 wks. - Failure mode: CTO becomes a coder, not a guard. - Use them for: architecture review, PR review, - interviewing your first hire, watching costs. - $0 equity. Beats a 50%-equity cofounder. - - - - 4. Hire a team (hire track) - When: backend-heavy. Integrations. Compliance. - First action: read SOW clause-by-clause. - Cost: $30K-$80K/mo. Timeline: 12-26 weeks. - Failure mode: spaceship for the wrong moon. - Stack: Rails / Django / Laravel. - Own: GitHub org, AWS root, domain registrar. - Friday demos start day one. - - - Most pre-seed founders belong in box 1 or 2. Most who hire belonged in box 3. - diff --git a/content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/index.md b/content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/index.md index be4322d84..294c845ae 100644 --- a/content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/index.md +++ b/content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/index.md @@ -44,8 +44,6 @@ Pre-seed founders hiring engineering before a single paying customer is confirme The hire is the move that breaks the runway. The skipped step is the cheaper experiment - a smoke test, a clickable prototype, a Concierge MVP - that would have told you whether you need to build at all. -![A hand-drawn 2-by-2 decision matrix with four quadrants labeled Validate without code, Self-serve build, Fractional CTO bridge, and Hire a team. Each quadrant lists a first action, cost band, and timeline.](decision-matrix.svg) - ## Your real question: do you need to build at all > **The decision is not "code or no-code." It is "what evidence do I have that I need to build at all?"** @@ -114,7 +112,7 @@ Choose this when the build is backend-heavy (real-time, queues, AI inference at Five questions feed the matrix. Answer them alone with a printed worksheet, write the result at the top of your Notion doc, and the matrix picks for you. ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% flowchart TD Start(["Default: self-serve.
Five questions test it."]) Start --> Q1["Q1: Problem validated?
10+ calls, 7+ signals, smoke test 6%+"] diff --git a/content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/attack-chain.svg b/content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/attack-chain.svg index a3d7b02ab..de43a31ce 100644 --- a/content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/attack-chain.svg +++ b/content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/attack-chain.svg @@ -1,5 +1,5 @@ - + diff --git a/content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/hallucinated-vs-real.svg b/content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/hallucinated-vs-real.svg index f7d87527a..f50f7d0de 100644 --- a/content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/hallucinated-vs-real.svg +++ b/content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/hallucinated-vs-real.svg @@ -1,5 +1,5 @@ - + diff --git a/content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/index.md b/content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/index.md index d025f73dd..56249502a 100644 --- a/content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/index.md +++ b/content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/index.md @@ -40,13 +40,15 @@ course_nav: false **Supplementary content.** This chapter is relevant after you've shipped (Module 4+) and your product touches AI in production. Bookmark and return when needed. -In April 2025, Lasso Security published findings that AI assistants suggested over 200 package names across Rubygems, PyPI, and npm that did not exist. Attackers registered those names and waited. By the time the [Infosecurity Magazine writeup](https://www.infosecurity-magazine.com/news/ai-hallucinations-slopsquatting/) named the technique "slopsquatting" in April 2025, security teams had already logged the first installs of the proof-of-concept packages on real production systems. You paid $34K for an MVP. The most expensive line in the codebase was free. It was the one a model invented and a developer typed into a `Gemfile` without checking that the gem existed. +In March 2025, Lasso Security published findings that AI assistants suggested over 200 package names across Rubygems, PyPI, and npm that did not exist. Attackers registered those names and waited. By the time the [Infosecurity Magazine writeup](https://www.infosecurity-magazine.com/news/ai-hallucinations-slopsquatting/) named the technique "slopsquatting" in April 2025, security teams had already logged the first installs of the proof-of-concept packages on real production systems. You paid $34K for an MVP. The most expensive line in the codebase was free. It was the one a model invented and a developer typed into a `Gemfile` without checking that the gem existed. ![A hand-drawn diagram of the slopsquatting attack chain in five steps: AI hallucinates a package name, attacker watches public prompt logs, attacker registers the name on Rubygems / PyPI / npm with a malicious payload, developer installs without review, damage runs in production. Annotated with the Lasso Security 11-day reproduction window.](attack-chain.svg) ## What slopsquatting is -LLMs invent package names that sound plausible but do not exist. The original [Lasso Security research from March 2025](https://www.lasso.security/blog/ai-package-hallucinations) tested GPT-4, Claude, and the open-source Code Llama against thousands of common developer prompts. About 5.2% of GPT-4's package suggestions and 21.7% of Code Llama's were hallucinated. [Snyk's slopsquatting write-up](https://snyk.io/articles/slopsquatting-mitigation-strategies/) cites follow-up research putting the overall rate at roughly one in five AI-suggested packages across models. Attackers then register the most-suggested hallucinated names as squatted packages, sometimes with a malicious payload (data exfiltration, credential theft, persistence backdoor), sometimes empty until a real victim shows up. Rubygems, PyPI, npm, Composer, and crates.io all have the same exposure. The attack does not need a 0day - just a developer who trusts a model without checking. +LLMs invent package names that sound plausible but do not exist. The original [Lasso Security research from March 2025](https://www.lasso.security/blog/ai-package-hallucinations) tested GPT-4, Claude, and the open-source Code Llama against thousands of common developer prompts. About 5.2% of GPT-4's package suggestions and 21.7% of Code Llama's were hallucinated. [Snyk's slopsquatting write-up](https://snyk.io/articles/slopsquatting-mitigation-strategies/) cites follow-up research putting the overall rate at roughly one in five AI-suggested packages across models. Attackers then register the most-suggested hallucinated names as squatted packages, sometimes with a malicious payload (data exfiltration, credential theft, persistence backdoor), sometimes empty until a real victim shows up. Rubygems, PyPI, npm, Composer, and crates.io all have the same exposure. The attack does not need a 0day (a secret, unpatched vulnerability) - just a developer who trusts a model without checking. + +![A hand-drawn comparison table across three stacks - Rails/Ruby, Django/Python, and Laravel/npm. Each row shows the plausible-sounding package name an AI model hallucinated (active_support_extras_helper, requestz, react-toastify-fork) next to the real package it was confused with (active_record_extra, requests, react-toastify). All three hallucinated names were registered by Lasso researchers as proof-of-concept in April 2025.](hallucinated-vs-real.svg) ## The 20-line CI gate (the simplest defense) @@ -84,7 +86,7 @@ That is the entire defense. The PR cannot merge until a human looks at the new g ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#1a1a1a', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#1a1a1a', 'primaryTextColor':'#1a1a1a'}}}%% flowchart TD @@ -124,7 +126,7 @@ That is it. No Snyk subscription, no Socket.dev license, no signing key infrastr ## The contract clause -One paragraph. Send it as an SOW addendum to your existing dev shop, or paste it into the next agency MSA before signing. Do not let an agency talk you out of it. +One paragraph. Send it as an SOW (statement of work) addendum to your existing dev shop, or paste it into the next agency MSA (master service agreement) before signing. Do not let an agency talk you out of it. > **Supply-chain hygiene.** Contractor will not introduce any third-party dependency (Ruby gem, PyPI package, npm module, Composer package, system library, or container base image) without prior written approval from the Founder. Approval requires (a) confirmation that the package exists on its canonical registry under the exact name proposed; (b) a published maintainer history of at least 12 months or a signed deviation memo; (c) a download / install count appropriate for the package's stated purpose; (d) a CI dependency gate that fails the build on any unapproved new dependency. Contractor is liable for any incident traceable to a hallucinated, typosquatted, or slopsquatted dependency that was not gated. AI tooling output is contractor's work product for the purpose of this clause; "the model suggested it" is not a defense. diff --git a/content/course/tech-for-non-technical-founders-2026/smoke-test-build-page/index.md b/content/course/tech-for-non-technical-founders-2026/smoke-test-build-page/index.md index 2a5a6ff83..b8a80a320 100644 --- a/content/course/tech-for-non-technical-founders-2026/smoke-test-build-page/index.md +++ b/content/course/tech-for-non-technical-founders-2026/smoke-test-build-page/index.md @@ -66,7 +66,7 @@ The page has four copy blocks that decide whether it converts: Send the URL to **ONE real person** who has not seen your work. Any stranger works (they don't need to be your target customer - this tests headline clarity, not buying interest). Ask: "In 3 seconds, who is this page for and what does it do?" **Nobody available right now?** Record a short screen recording of your page with [Loom](https://www.loom.com/) (a free screen-recording tool) and send it to someone tomorrow with the same 3-second question. Or post the URL in a relevant subreddit with "What does this page do in 3 seconds?" -> **✅ Success check:** they can name both. If they cannot, the headline is almost always the fix - rewrite it and retest. +> **Good** - **Success check:** they can name both. If they cannot, the headline is almost always the fix - rewrite it and retest. ## If strangers can't name it diff --git a/content/course/tech-for-non-technical-founders-2026/smoke-test-build-page/page-anatomy.svg b/content/course/tech-for-non-technical-founders-2026/smoke-test-build-page/page-anatomy.svg index 0248b2ec6..b5f1a92c3 100644 --- a/content/course/tech-for-non-technical-founders-2026/smoke-test-build-page/page-anatomy.svg +++ b/content/course/tech-for-non-technical-founders-2026/smoke-test-build-page/page-anatomy.svg @@ -2,11 +2,11 @@ Smoke-test page anatomy: 4 stacked blocks - headline names customer + outcome, sub-headline explains the mechanism, a row of 3-4 value props, and the CTA with coming-soon footer diff --git a/content/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/channel-icp-matrix.svg b/content/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/channel-icp-matrix.svg deleted file mode 100644 index 64e223393..000000000 --- a/content/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/channel-icp-matrix.svg +++ /dev/null @@ -1,58 +0,0 @@ - - Channel-by-ICP matrix - the right paid channel for the audience your hypothesis names - - - - - Where the audience actually lives - Pick the channel where your customer scrolls, not the one YOU scroll. - - - - B2C consumer products - Meta (Facebook + Instagram) - Cheap CPMs, fast learning. - 60% Instagram Reels / 40% Feed. - $0.50-$2 per click - Best targeting for consumer audiences. - - - - B2B SaaS / professional services - LinkedIn or Google Search - LinkedIn: unaware audience. - Google: already searching for fix. - $2-$20 per click - Job-title + company-size targeting. - - - - Developer tools / technical - Reddit or HN job listing - r/programming, r/webdev, - r/devops, r/SaaS. - $1-$3 per click - HN job board: $475 for 100K+ devs. - - - - Niche-vertical (real estate, dental, - contractors, etc.) - Google Search - Long-tail keywords with - clear purchase intent. - $1-$8 per click - - - - Twitter/X: decayed enough that we no longer recommend it for B2B validation in 2026. - diff --git a/content/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/index.md b/content/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/index.md index cd50a3872..2f9761776 100644 --- a/content/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/index.md +++ b/content/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/index.md @@ -50,7 +50,7 @@ Choose based on who your hypothesis names in the [customer] blank. The dollar ra **Start ad-account setup 2-3 days before launch.** First-time ad accounts can take 24-72 hours to approve. Meta is the slowest; Reddit clears same-day. -![A landing page with ad traffic arrows pointing to it, a tracking dashboard showing conversion numbers, and a decision arrow leading to go/iterate/kill](smoke-test-signal.svg) +![Signal meter reading the smoke-test conversion rate: 0-3% kill or pivot, 3-6% iterate the message, 6-10% promising, 10-20% strong signal, over 20% suspicious - with the 6% go line marked](smoke-test-signal.svg) ## Launch and read the signal @@ -72,7 +72,7 @@ Choose based on who your hypothesis names in the [customer] blank. The dollar ra *On a boundary (exactly 6%, 10%, or 20%)? Take the higher band's action.* -**✅ Success check:** you have a conversion rate from ≥300 cold visits AND a go/iterate/kill decision written down. +**Success check:** you have a conversion rate from ≥300 cold visits AND a go/iterate/kill decision written down. ## If the number looks wrong diff --git a/content/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/smoke-test-signal.svg b/content/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/smoke-test-signal.svg index be011b1b4..53ab5fff9 100644 --- a/content/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/smoke-test-signal.svg +++ b/content/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/smoke-test-signal.svg @@ -1,30 +1,70 @@ - - - - - Meta / Google - Ads → - - - Landing - Page - CTA + Form - - - Tracking - Page views: 300 - CTA clicks: 24 - - - Go / Iterate - / Kill - - - - + + Smoke-test signal meter: read your cold-traffic conversion rate against the kill / iterate / promising / strong / suspicious bands. + A horizontal meter from 0 to over 20 percent conversion. Under 3 percent is Kill or pivot (red). 3 to 6 percent is Iterate the message (amber). 6 to 10 percent is Promising (green). 10 to 20 percent is Strong signal (deep green). Over 20 percent is Suspicious - verify with a second channel (gray). A pointer marks the 6 percent line where the demand is real enough to start building. - - - + + + + + Read your conversion rate off the meter + form submits ÷ page views, after 300 cold visitors + + + + 6% = the go line + demand is real - start building + + + + + + + + 0-3% + Kill / pivot + + + + 3-6% + Iterate msg + + + + 6-10% + Promising + + + + 10-20% + Strong signal + + + + 20%+ + Suspicious? + + + + 0% + 3% + 6% + 10% + 20% + + + + + + + A stranger's signup is a real vote. A friend's "sounds great" is not. diff --git a/content/course/tech-for-non-technical-founders-2026/smoke-test-wire-tracking/index.md b/content/course/tech-for-non-technical-founders-2026/smoke-test-wire-tracking/index.md index db66ffe2e..fa4b2224f 100644 --- a/content/course/tech-for-non-technical-founders-2026/smoke-test-wire-tracking/index.md +++ b/content/course/tech-for-non-technical-founders-2026/smoke-test-wire-tracking/index.md @@ -72,7 +72,7 @@ Conversion rate = form submits ÷ page views. That is the number your hypothesis > 1. **Create accounts:** sign in to Microsoft (for Clarity) and Google (for GA4). Most people already have one or both - reuse them. > 2. **Install Clarity** ([clarity.microsoft.com](https://clarity.microsoft.com/), 60 seconds): copy the snippet, paste in your page builder's head-tag field. > 3. **Install GA4** ([analytics.google.com](https://analytics.google.com/)): copy the GA4 snippet, paste in the head-tag field. If you plan to use Google Ads in 1.4, you'll link GA4 in Google Ads Settings there. -> 4. **Verify:** open your page in an incognito window. Wait 60 seconds. **✅ Clarity:** your visit appears as a session recording. **✅ GA4:** test visit registers in your dashboard. +> 4. **Verify:** open your page in an incognito window. Wait 60 seconds. **Clarity:** your visit appears as a session recording. **GA4:** test visit registers in your dashboard. > > (One "custom code" field? That field is the head-tag - paste all snippets there.) diff --git a/content/course/tech-for-non-technical-founders-2026/smoke-test-wire-tracking/tracking-snippets.svg b/content/course/tech-for-non-technical-founders-2026/smoke-test-wire-tracking/tracking-snippets.svg index b3675bc90..ebb60b140 100644 --- a/content/course/tech-for-non-technical-founders-2026/smoke-test-wire-tracking/tracking-snippets.svg +++ b/content/course/tech-for-non-technical-founders-2026/smoke-test-wire-tracking/tracking-snippets.svg @@ -2,12 +2,12 @@ Three tracking snippets stacked on the left side - Microsoft Clarity, Ad-platform pixel, Google Analytics 4 - with arrows pointing to a landing page wireframe on the right showing page_view, cta_click, and form_submit events firing **Bad wording** | **Good wording** | +|---|---| +| "Vendor will deliver the features described in Exhibit A. Detailed scope, including specific tickets, will be defined sprint by sprint with Client's product owner." | Demand a feature list at the level of "a Rails 7 app with a Hotwire frontend, deployed via Kamal to Hetzner, with sign-up, contractor-match, payment, and an admin panel listing the last 100 jobs." Then ask for an estimate per feature in days, not story points. If they cannot estimate the work, they cannot price it. (See [the founder's guide to hiring a dev shop](/blog/founders-guide-hiring-dev-shop/) for what a real scope looks like.) | -**Fix**: Demand a feature list at the level of "a Rails 7 app with a Hotwire frontend, deployed via Kamal to Hetzner, with sign-up, contractor-match, payment, and an admin panel listing the last 100 jobs." Then ask for an estimate per feature in days, not story points. If they cannot estimate the work, they cannot price it. (See [the founder's guide to hiring a dev shop](/blog/founders-guide-hiring-dev-shop/) for what a real scope looks like.) +**Flag:** "Scope to be defined sprint by sprint", "agile discovery throughout", "exact features dependent on user research." Sounds collaborative; means the SOW is a blank cheque. ### Clause 2 - Milestone acceptance -> **Sample**: "A milestone shall be deemed delivered upon Vendor's deployment to the Client-accessible staging environment. Client shall have five (5) business days to raise objections; absent objections, the milestone is accepted and payable." - **Plain English**: We get paid when we push code to a URL nobody uses. If you do not write a structured rejection in five days, the money is ours. -**Flag**: "Delivered" defined as "deployed to staging" or "made available for review." Five-day silent-acceptance windows. No acceptance criteria the milestone has to pass. +| **Bad wording** | **Good wording** | +|---|---| +| "A milestone shall be deemed delivered upon Vendor's deployment to the Client-accessible staging environment. Client shall have five (5) business days to raise objections; absent objections, the milestone is accepted and payable." | "A milestone is delivered when (a) the acceptance criteria in Exhibit B pass in CI (`bundle exec rspec` for Rails, `pytest` for Django, `php artisan test` for Laravel), (b) Client has clicked the feature end-to-end on the staging URL, and (c) Client has signed off in writing." Acceptance criteria belong in the SOW, not in a Slack message. The [Friday demo template](/course/tech-for-non-technical-founders-2026/friday-demo-template/) covers what the click-through looks like. | -**Fix**: "A milestone is delivered when (a) the acceptance criteria in Exhibit B pass in CI (`bundle exec rspec` for Rails, `pytest` for Django, `php artisan test` for Laravel), (b) Client has clicked the feature end-to-end on the staging URL, and (c) Client has signed off in writing." Acceptance criteria belong in the SOW, not in a Slack message. The [Friday demo template](/course/tech-for-non-technical-founders-2026/friday-demo-template/) covers what the click-through looks like. +**Flag:** "Delivered" defined as "deployed to staging" or "made available for review." Five-day silent-acceptance windows. No acceptance criteria the milestone has to pass. ### Clause 3 - Change-request process -> **Sample**: "Any modification to Scope shall be processed via Change Order, billed at Vendor's standard rate of $185/hour. Vendor shall provide a written estimate prior to execution." - **Plain English**: Anything you ask for after signing costs $185/hour with no ceiling. The estimate can be 4 hours or 400; you have nothing to compare it against. -**Flag**: Hourly-rate change-orders with no cap, no estimate review window, and especially "Vendor may proceed upon Client's verbal approval." +| **Bad wording** | **Good wording** | +|---|---| +| "Any modification to Scope shall be processed via Change Order, billed at Vendor's standard rate of $185/hour. Vendor shall provide a written estimate prior to execution." | (1) Cap change orders at a percentage of the original SOW (10% standard, 20% generous). (2) Require a written estimate naming the developer, hours, and deliverable, with a 48-hour Founder-approval window. (3) Strike "verbal approval." Skip this and you end up with the [hidden-cost vendor management problem](/blog/hidden-cost-poor-development-vendor-management-fix/) on the AmEx statement. | -**Fix**: (1) Cap change orders at a percentage of the original SOW (10% standard, 20% generous). (2) Require a written estimate naming the developer, hours, and deliverable, with a 48-hour Founder-approval window. (3) Strike "verbal approval." Skip this and you end up with the [hidden-cost vendor management problem](/blog/hidden-cost-poor-development-vendor-management-fix/) on the AmEx statement. +**Flag:** Hourly-rate change-orders with no cap, no estimate review window, and especially "Vendor may proceed upon Client's verbal approval." ### Clause 4 - IP / code ownership @@ -98,13 +98,13 @@ The single highest-stakes clause in the SOW: who owns the code while you're payi ### Clause 5 - Third-party dependencies -> **Sample**: "Vendor shall manage all third-party services required for the Project, including hosting, third-party APIs, and AI/ML tooling. Costs shall be passed through to Client at cost plus a 15% administrative fee." - **Plain English**: We will rent AWS, Stripe, and the AI tools under our own accounts and bill you whatever they cost, plus 15%. When this engagement ends, the accounts stay with us. -**Flag**: Pass-through costs with no cap, no monthly attribution, and no language about who owns the third-party accounts. Watch AI token costs (Cursor seats, Anthropic API, OpenAI API) - the [5-question AI script](/course/tech-for-non-technical-founders-2026/agency-ai-five-questions/) caught a $4,800 OpenAI line that surprised one founder we worked with. +| **Bad wording** | **Good wording** | +|---|---| +| "Vendor shall manage all third-party services required for the Project, including hosting, third-party APIs, and AI/ML tooling. Costs shall be passed through to Client at cost plus a 15% administrative fee." | (1) Every third-party account (AWS, GitHub, Stripe, Anthropic, OpenAI) is created under your company email from Day 1, paid by your company card; the agency gets IAM sub-access. (2) Pass-through costs capped per month with a Founder-approval gate above the ceiling. (3) AI token usage itemized monthly per developer and per project. Strike the 15% admin fee on infrastructure. | -**Fix**: (1) Every third-party account (AWS, GitHub, Stripe, Anthropic, OpenAI) is created under your company email from Day 1, paid by your company card; the agency gets IAM sub-access. (2) Pass-through costs capped per month with a Founder-approval gate above the ceiling. (3) AI token usage itemized monthly per developer and per project. Strike the 15% admin fee on infrastructure. +**Flag:** Pass-through costs with no cap, no monthly attribution, and no language about who owns the third-party accounts. Watch AI token costs (Cursor seats, Anthropic API, OpenAI API) - the [5-question AI script](/course/tech-for-non-technical-founders-2026/agency-ai-five-questions/) caught a $4,800 OpenAI line that surprised one founder we worked with. ### Clause 6 - Termination triggers @@ -123,23 +123,23 @@ The [step-by-step exit guide](/blog/fire-dev-shop-guide/) covers what a clean te ### Clause 7 - Post-launch warranty -> **Sample**: "Vendor warrants that the Deliverables shall conform to the specifications for thirty (30) days following Delivery." - **Plain English**: We will fix bugs free for 30 days after we declare the thing delivered. If "delivered" means "deployed to staging" (see Clause 2), the warranty might run out before users ever touch the feature. -**Flag**: Warranty starts at "Delivery" rather than "Launch to Production Users." Windows under 60 days. No definition of warranted bug versus "new feature request." +| **Bad wording** | **Good wording** | +|---|---| +| "Vendor warrants that the Deliverables shall conform to the specifications for thirty (30) days following Delivery." | Anchor the warranty to **production launch**: "The warranty period begins on the date the Deliverables are first served to live, paying users in production, and runs for 90 days thereafter." Define "warranted bug" plainly: anything that blocks a user from completing a flow listed in Exhibit A. The opening-story founder lost three weeks of warranty coverage because three milestones were "delivered" to staging but never reached production. | -**Fix**: Anchor the warranty to **production launch**: "The warranty period begins on the date the Deliverables are first served to live, paying users in production, and runs for 90 days thereafter." Define "warranted bug" plainly: anything that blocks a user from completing a flow listed in Exhibit A. The opening-story founder lost three weeks of warranty coverage because three milestones were "delivered" to staging but never reached production. +**Flag:** Warranty starts at "Delivery" rather than "Launch to Production Users." Windows under 60 days. No definition of warranted bug versus "new feature request." ### Clause 8 - Dispute resolution -> **Sample**: "Any dispute arising under this Agreement shall be finally resolved by binding arbitration administered by JAMS in [Vendor's home county, Vendor's home state]. Each party shall bear its own costs." - **Plain English**: If we ever fight about money, you fly to our city, hire a local lawyer, and wait six to twelve months for an arbitrator we know to decide. -**Flag**: Binding arbitration in the agency's home state. No mediation step before arbitration. "Each party bears its own costs" favors whichever party has more cash to wait you out. +| **Bad wording** | **Good wording** | +|---|---| +| "Any dispute arising under this Agreement shall be finally resolved by binding arbitration administered by JAMS in [Vendor's home county, Vendor's home state]. Each party shall bear its own costs." | (1) Add a **mediation step**: "The parties shall attempt in good faith to resolve any dispute through non-binding mediation in [Client's home city] before initiating arbitration." Mediation resolves about 80% of commercial disputes. (2) Set the arbitration venue at a **neutral location** or split it by who initiates the claim. (3) Add a **prevailing-party fee-shift**: the loser pays the winner's reasonable attorney fees. | -**Fix**: (1) Add a **mediation step**: "The parties shall attempt in good faith to resolve any dispute through non-binding mediation in [Client's home city] before initiating arbitration." Mediation resolves about 80% of commercial disputes. (2) Set the arbitration venue at a **neutral location** or split it by who initiates the claim. (3) Add a **prevailing-party fee-shift**: the loser pays the winner's reasonable attorney fees. +**Flag:** Binding arbitration in the agency's home state. No mediation step before arbitration. "Each party bears its own costs" favors whichever party has more cash to wait you out. ## What to do before signing diff --git a/content/course/tech-for-non-technical-founders-2026/stop-specifying-features-start-outcomes/index.md b/content/course/tech-for-non-technical-founders-2026/stop-specifying-features-start-outcomes/index.md index 3332e582b..20c1884cc 100644 --- a/content/course/tech-for-non-technical-founders-2026/stop-specifying-features-start-outcomes/index.md +++ b/content/course/tech-for-non-technical-founders-2026/stop-specifying-features-start-outcomes/index.md @@ -90,7 +90,7 @@ Both outcome-shaped briefs in the section above use the same three parts. The sh Put the three parts together and the engineer (or the AI agent) has no gaps left to guess at. Drop any one part - the timeframe, the action, or the outcome - and the gap gets filled in from training data instead of your intent. The same shape has a name in product-management literature; see *Further reading* below if you want to chase the lineage. ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% flowchart TD Feature["FEATURE brief: Build a CRM module"] Feature --> F1["Companies + contacts"] diff --git a/content/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/daily-weekly-cadence.svg b/content/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/daily-weekly-cadence.svg new file mode 100644 index 000000000..57f727a42 --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/daily-weekly-cadence.svg @@ -0,0 +1,84 @@ + + The weekly oversight cadence: five daily standups feed one Friday demo, then the loop resets Monday. + On the left, a daily-standup panel labelled Mon to Fri holds the three questions asked at the end of every standup: show the staging URL of what shipped, walk through one PR you reviewed and what you flagged, and what did we cut to ship it. An arrow labelled five days of proof feeds a green Friday demo card - the week's working software. That feeds a purple weekly report card - what shipped, what is next. A dashed loop returns from the weekly report to the daily standup with the caption: Monday, the loop resets - you already know what should be on staging. + + + + + + + + + + + + The weekly oversight cadence + Five daily standups feed one Friday demo - then the loop resets. + + + + + Daily standup - Mon to Fri + Ask these 3 at the end, every day. + + + 1 + Staging URL of what shipped? + + + 2 + One PR reviewed - what you flagged? + + + 3 + What did we cut to ship it? + + + + 5 days + of proof + + + + + + Friday demo + the week's + working software + + + + + + + + + Weekly report + what shipped, + what's next + + + + + Monday: the loop resets - you already know what should be on staging. + diff --git a/content/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/index.md b/content/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/index.md index 06ac3ba69..61d76a376 100644 --- a/content/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/index.md +++ b/content/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/index.md @@ -77,7 +77,7 @@ The question catches the **progress mirage** - tickets moving on Jira while noth The question catches **rubber-stamp reviews** and **bus factor of one** - the failure mode where every pull request gets approved by the same senior in under two minutes, or worse, by another junior who knows less than the author. Will Larson, who ran engineering at Stripe and Carta, [treats the pull request funnel as the load-bearing signal](https://review.firstround.com/unexpected-anti-patterns-for-engineering-leaders-lessons-from-stripe-uber-carta/) for engineering health. Founders should too. -**Pass.** A named PR number, a named reviewer (not "the team"), and 2-3 specific things the reviewer checked. "PR #847, Marcus reviewed it. He flagged a missing test on the refund branch, asked why the `Gemfile.lock` had a new gem he had not approved, and pushed back on a hardcoded Stripe key in the controller. The author fixed all three and Marcus re-approved Tuesday at 4pm." The texture is what tells you - real reviews leave a trail of pushback. +**Pass.** A named PR number, a named reviewer (not "the team"), and 2-3 specific things the reviewer checked. "PR #847, Priya reviewed it. She flagged a missing test on the refund branch, asked why the `Gemfile.lock` had a new gem she had not approved, and pushed back on a hardcoded Stripe key in the controller. The author fixed all three and Priya re-approved Tuesday at 4pm." The texture is what tells you - real reviews leave a trail of pushback. **Fail.** "We trust each other's work." / "The CI caught the issues." / "Everyone reviews their own when the others are busy." First answer means there is no review. Second answer is a fundamental misunderstanding of what CI does - CI catches syntax errors and broken tests, not security gaps, not architectural drift, not the migration that locks the orders table at peak hours. Third answer is the [bus factor of one](/blog/dev-shop-red-flags-checklist/) JT's red-flags checklist warns about. @@ -97,6 +97,8 @@ The question catches **over-engineering** - the failure mode where the team buil The three standup questions are the daily proof. The [Friday demo](/course/tech-for-non-technical-founders-2026/friday-demo-template/) is the weekly proof. Together they form a single weekly cadence: five standups answer "did anything ship today?" and Friday answers "what is the working software for the week?" Without both, the daily check feels like nagging and the weekly demo feels like theatre. With both, the daily check feeds the demo - by Friday afternoon the founder already knows what should be on staging because she has been clicking the URLs all week. +![The weekly oversight cadence: five daily standups Monday to Friday feed one Friday demo, then the loop resets. Each day's standup ends with the three questions - show the staging URL of what shipped, walk through one PR you reviewed and what you flagged, and what did we cut to ship it. Five days of proof feed the Friday demo, the week's working software, which feeds the weekly report of what shipped and what is next. On Monday the loop resets and the founder already knows what should be on staging.](daily-weekly-cadence.svg) + [Atlassian's 2024 update on standups](https://www.atlassian.com/agile/scrum/standups) and the [Scrum Alliance's reference on async standups](https://resources.scrumalliance.org/Article/async-standups) both note that the daily ritual works only when it surfaces blockers. The three questions above are how you make blockers visible. The Friday demo is how you make working software visible. Together they replace the founder's anxiety about whether the team is shipping with a record of what shipped, week by week. The companion [Friday Demo Template](/course/tech-for-non-technical-founders-2026/friday-demo-template/) holds the full script. ## What to do tomorrow diff --git a/content/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/index.md b/content/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/index.md index 9095b39d9..b4eb03c21 100644 --- a/content/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/index.md +++ b/content/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/index.md @@ -152,6 +152,8 @@ Date: ______________ ## What good looks like vs what bad looks like +Three worked examples for the sections founders most often get wrong - 1, 2, and 4. Sections 3 and 5 are direct transcript copying; the same specific-beats-vague rule applies. + **Section 1 - Who has the problem** > Bad: *"Founders and small business owners who need help with productivity."* @@ -180,13 +182,13 @@ The good version names the specific cost number, the specific competitor's speci The decision the filled page makes for you: -- **BUILD** if: 7+ strong-signal calls (score 7+ with 3+ emotional flags), a named workaround the customer is already paying for, and a named why-now from the last 12 months. Test the shape in [Ch 2.6 · Build a Clickable Prototype](/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/), then move to the [Module 3 Product Brief](/course/tech-for-non-technical-founders-2026/). +- **BUILD** if: 7+ strong-signal calls (score 7+ with 3+ emotional flags), a named workaround the customer is already paying for, and a named why-now from the last 12 months. Test the shape in [Ch 2.6 · Build a Clickable Prototype](/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/), then move to the [Module 3 Product Brief](/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/). - **PIVOT** if: 4-6 strong signals, OR the pain is real but belongs to a different persona than you targeted (e.g., you interviewed founders but the pain lives with their CFOs). Run 5 sharper interviews with the corrected ICP, then refill this page. - **KILL** if: fewer than 4 strong signals OR no workaround surfaced in the 10 interviews. Find a different problem and write the 200-word post-mortem below. Then walk the page through these four moves: -- **Get 2 advisor signatures within 48 hours.** Email the page as a PDF. Ask: "Would you argue with this problem statement?" One sentence response is enough. If both say no, you've passed Module 2's checkpoint and you move to the [Module 3 Product Brief](/course/tech-for-non-technical-founders-2026/) next. +- **Get 2 advisor signatures within 48 hours.** Email the page as a PDF. Ask: "Would you argue with this problem statement?" One sentence response is enough. If both say no, you've passed Module 2's checkpoint and you move to the [Module 3 Product Brief](/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/) next. - **If you landed in the BUILD lane (7+ strong signals), run the 3 pre-orders test before writing code.** Email your 5 strongest-signal interviewees. Ask each for a $500 deposit, a signed letter of intent, or a paid waitlist slot. Three yes-and-paid out of five = build. Zero yes = the 7+ scores were politer than you thought, slide back to pivot. - **If you landed in the PIVOT lane (4-6), pick the cleanest segment and run 5 sharper interviews using [the Mom Test interview script](/course/tech-for-non-technical-founders-2026/mom-test-interview-script/) again.** Don't rerun the same 10 - they've already given you their honest answer. New segment, new interviews, one week. - **If you landed in the KILL lane (fewer than 4), write a 200-word post-mortem to your future self.** What ICP did you pick wrong? What why-now did you assume that wasn't true? What workaround did you not learn about until interview 7? The post-mortem is the most valuable artifact from a kill round - it stops you from picking the same wrong target again next quarter. The [stop-AI-obsession validation post](/blog/stop-ai-obsession-smart-way-validate-your-startup-idea-product-bootstrap/) has the long version of the discipline. diff --git a/content/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/validated-problem-statement-template.pdf b/content/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/validated-problem-statement-template.pdf index 7bee56078..60f9776e6 100644 Binary files a/content/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/validated-problem-statement-template.pdf and b/content/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/validated-problem-statement-template.pdf differ diff --git a/content/course/tech-for-non-technical-founders-2026/validation-tools-field-guide/index.md b/content/course/tech-for-non-technical-founders-2026/validation-tools-field-guide/index.md index 0eba0a186..72d20c9f7 100644 --- a/content/course/tech-for-non-technical-founders-2026/validation-tools-field-guide/index.md +++ b/content/course/tech-for-non-technical-founders-2026/validation-tools-field-guide/index.md @@ -43,29 +43,24 @@ This guide covers three tools - VenturusAI, DimeADozen, and Preuve AI - with eno Write the Mad Libs sentence in five minutes and you'll fall in love with it. Run it through one validation tool first and you'll find the blank you were vague about before it costs you ten interviews. ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#333', 'primaryTextColor':'#1a1a1a'}}}%% flowchart TD Draft(["Draft hypothesis
(rough Mad Libs sentence)"]) - Draft --> V[VenturusAI
SWOT + PESTEL + Porter
~30s · Free tier] - Draft --> D[DimeADozen
7-section validation brief
~2min · $9 Starter] - Draft --> P[Preuve AI
50+ data sources
~60s · Free scan] - V --> Catch(["Catches: weak differentiation
+ missed competitors"]) - D --> Sizing(["Catches: wrong unit economics
+ market too small"]) - P --> Niche(["Catches: customer too broad
+ market signal"]) - Catch --> Refine[Rewrite the blanks the tools flagged] - Sizing --> Refine - Niche --> Refine + Draft --> V["VenturusAI · ~30s
catches weak differentiation
and missed competitors"] + Draft --> D["DimeADozen · ~2min
catches wrong unit economics
and market too small"] + Draft --> P["Preuve AI · ~60s
catches customer too broad,
reads market signal"] + V --> Refine["Rewrite the blanks
the tools flagged"] + D --> Refine + P --> Refine Refine --> Out(["Sharpened hypothesis
ready for Ch 2.1 interviews"]) classDef draft fill:#e8f4f8,stroke:#0277bd,stroke-width:2.5px,color:#1a1a1a classDef tool fill:#fff5f5,stroke:#cc342d,stroke-width:2px,color:#1a1a1a - classDef catch fill:#faf5ff,stroke:#a855f7,stroke-width:2px,color:#1a1a1a classDef refine fill:#f0f9f0,stroke:#2e7d32,stroke-width:2.5px,color:#1a1a1a classDef out fill:#fffbe6,stroke:#bf8a00,stroke-width:2.5px,color:#1a1a1a class Draft draft class V,D,P tool - class Catch,Sizing,Niche catch class Refine refine class Out out ``` @@ -125,7 +120,7 @@ Every blank in the Mad Libs sentence is a blank in your VenturusAI input. Specif The report has 7-8 sections. You do not need to read all of them. Focus on three: -**Porter's Five Forces - Competitive Rivalry section.** If it names a competitor you had not thought of, add that competitor to your Step 1 competition column in Ch 1.1. If it names one you already knew about but describes their advantage in a way you had not considered, rewrite your [differentiation] blank. +**Porter's Five Forces - Competitive Rivalry section.** If it names a competitor you had not thought of, add that competitor to the Competition column in the [full hypothesis sprint](/course/tech-for-non-technical-founders-2026/reference/hypothesis-sprint-full/). If it names one you already knew about but describes their advantage in a way you had not considered, rewrite your [differentiation] blank. **SWOT - Weaknesses.** This is the section that hurts. If the AI flags a weakness you already knew about (e.g., "founder has no engineering background"), that is expected. If it flags one you had not considered (e.g., "customer acquisition depends on insurance-industry partnerships that take 6-12 months to close"), pay attention. That is a structural blank in your hypothesis. @@ -165,7 +160,7 @@ The Starter report is 5-7 pages. You only need to read two sections on the first **Kill Risks.** This is the section that justifies the $9. It flags existential threats: market saturation (too many entrenched players), low barriers to entry (competitors can clone you in a weekend), CAC-to-LTV problems (acquiring a customer costs more than they will ever pay you), and regulatory hurdles. If any kill risk is specific - names a competitor, a regulation, or a cost number - take it seriously. If it is generic ("the market is competitive"), treat it as a yellow flag, not a red one. -**Retention-Curve / Unit Economics.** This section estimates whether the numbers work. If it says your target market is too small at your price point, revisit the [customer] blank in Ch 1.1 Step 1. If it says your CAC is too high relative to LTV, revisit your channel assumption. +**Retention-Curve / Unit Economics.** This section estimates whether the numbers work. If it says your target market is too small at your price point, revisit the [customer] blank in Ch 1.1. If it says your CAC is too high relative to LTV, revisit your channel assumption. Skip the Executive Summary and Go-To-Market sections on first read. They are AI-generated strategy and rarely say anything you could not have guessed. Come back to them after you have real interview data. @@ -260,6 +255,8 @@ For pre-interview validation, the Free Scan + Founder Report is the sweet spot. The three tools work best in sequence, not all at once. Here is the order that produces the most signal for the least time: +![The three validation tools in recommended order: VenturusAI first (free, ~30s) catches missed competitors and weak differentiation, Preuve AI free scan second (free, ~60s) reads market signal and flags a too-broad customer, DimeADozen Starter third (optional, $9, ~2min) catches kill risks and unit economics - none validates the hypothesis, only 10 Mom Test interviews do](tools-in-sequence.svg) + ### 1. VenturusAI (first - free) Run your hypothesis paragraph through VenturusAI. Read the Porter's Five Forces Competitive Rivalry section and the SWOT Weaknesses section. If it flags a competitor you missed or a structural weakness you had not considered, fix those blanks in your hypothesis before moving to the next tool. @@ -292,7 +289,7 @@ These tools sharpen your hypothesis. They do not validate it. Specifically: **They cannot tell you whether the problem is real.** AI tools summarize what people have already said online. They cannot surface a problem that nobody has articulated publicly. The Mom Test interviews in Ch 2.1 surface what specific named humans actually did last Friday - a signal no AI tool can produce. -**They cannot substitute for the Pragmatic-lens gut-check.** VenturusAI can flag that you have no engineering background, but only you know whether you can ship the thing with Lovable on evenings and weekends. The Pragmatic lens in Ch 1.1 Step 4 is still yours to score. +**They cannot substitute for the Pragmatic-lens gut-check.** VenturusAI can flag that you have no engineering background, but only you know whether you can ship the thing with Lovable on evenings and weekends. The Pragmatic lens in Ch 1.1 is still yours to score. **They do not replace talking to humans.** If you spend three hours across these tools and zero hours on interviews, you have three AI reports and zero validation. The tools exist to sharpen the sentence you test in interviews. Skip the interviews and you have sharpened a sentence that might describe nothing. diff --git a/content/course/tech-for-non-technical-founders-2026/validation-tools-field-guide/tools-in-sequence.svg b/content/course/tech-for-non-technical-founders-2026/validation-tools-field-guide/tools-in-sequence.svg new file mode 100644 index 000000000..cd697bd04 --- /dev/null +++ b/content/course/tech-for-non-technical-founders-2026/validation-tools-field-guide/tools-in-sequence.svg @@ -0,0 +1,81 @@ + + The three validation tools in the recommended order: first VenturusAI (free, about 30 seconds) catches missed competitors and weak differentiation; second Preuve AI's free scan (free, about 60 seconds) reads market signal and flags a customer that is too broad; third DimeADozen's Starter report (9 dollars, optional, about 2 minutes) catches kill risks and weak unit economics. None of them validates the hypothesis - only 10 Mom Test interviews do that. + A left-to-right strip of three numbered tool cards joined by arrows. Card 1 VenturusAI: catches missed competitors and weak differentiation; chips read about 30 seconds and Free. Card 2 Preuve AI free scan: reads market signal, flags customer too broad; chips read about 60 seconds and Free scan. Card 3 DimeADozen (optional): catches kill risks and unit economics; chips read about 2 minutes and 9 dollar Starter. + + + + + + + + + The 3 tools, in the order that pays off + Run them in sequence, not all at once - each catches what the next one can't. + + + + + + 1 + VenturusAI + CATCHES + Missed rivals, weak edge + + ~30 seconds + + Free + + + + + + + 2 + Preuve AI + CATCHES + Market signal, too broad + + ~60 seconds + + Free scan + + + + + + + 3 + DimeADozen + optional + CATCHES + Kill risks, unit economics + + ~2 minutes + + $9 Starter + + + + + + + + None of these validates your hypothesis - only 10 Mom Test interviews do that. + diff --git a/content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/index.md b/content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/index.md index 25af0feb2..580255035 100644 --- a/content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/index.md +++ b/content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/index.md @@ -54,8 +54,6 @@ Once your build goes live, run this 5-signal check monthly. Each signal that fir > **This chapter is a monthly review reference, not an action-today chapter.** Your only action today: open your calendar and add a recurring monthly block titled "Vibe-coding 5-signal check." The first run is once the live MVP is up (Ch 4.3-4.4); until then, the chapter sits on the shelf. If you haven't shipped a live MVP yet, bookmark this and come back the moment you have real users clicking around. The morning scene above is what the ceiling looks like when it actually arrives. -![A hand-drawn scoreboard showing the 5 architectural ceiling signals: data model, real-time, auth complexity, AI cost, compliance. Each row has the visible symptom and the recommended action.](signals-scoreboard.svg) - ## Who this 5-signal check is for The Lovable + Supabase + Stripe shed from [The Self-Serve MVP Stack](/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-lovable-supabase-stripe-2026/) handles the common early-SaaS build. The builds it cannot hold are what this post is about. @@ -177,13 +175,13 @@ A skyscraper - compliance-bound, multi-tenant, real-time, AI-heavy - needs a hir The 2-question test runs in 90 seconds. Print it. Tape it inside the laptop case. ```mermaid -%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#1a1a1a', 'primaryTextColor':'#1a1a1a'}}}%% +%%{init: {'theme':'base', 'themeVariables': {'fontFamily':'Caveat, Patrick Hand, Comic Sans MS, cursive', 'primaryColor':'#fff5f5', 'primaryBorderColor':'#cc342d', 'lineColor':'#1a1a1a', 'primaryTextColor':'#1a1a1a'}}}%% flowchart TD Start(["Open the 5-signal scoreboard"]) Q1{"Q1: Has any signal been
firing for 4+ weeks?"} Q2{"Q2: Is your runway
> 6 months from today?"} Stay["STAY SELF-SERVE
Keep shipping on the shed.
Re-score every 2 weeks."] - Bridge["GRADUATE: BRIDGE
Fractional CTO
(5 hours / week, ~$8-15K / mo)"] + Bridge["GRADUATE:
BRIDGE
Fractional CTO
5 hours / week
~$1.6-2.6K / mo"] Hire["GRADUATE: HIRE A TEAM
1-2 engineers on Rails /
Django / Laravel. SOW signed
before kickoff."] Start --> Q1 @@ -194,7 +192,7 @@ flowchart TD classDef q fill:#fffbe6,stroke:#bf8a00,stroke-width:2.5px,color:#1a1a1a classDef stay fill:#f0f9f0,stroke:#2e7d32,stroke-width:2.5px,color:#1a1a1a - classDef bridge fill:#e8f4f8,stroke:#0277bd,stroke-width:2.5px,color:#1a1a1a + classDef bridge fill:#fbe9ff,stroke:#a855f7,stroke-width:2.5px,color:#1a1a1a classDef hire fill:#f5e9ff,stroke:#7c3aed,stroke-width:2.5px,color:#1a1a1a classDef start fill:#fff5f5,stroke:#cc342d,stroke-width:2.5px,color:#1a1a1a class Start start @@ -210,8 +208,6 @@ Q1 Yes + Q2 Yes: graduate to the hire-a-team path. You have the runway to scope, Q1 Yes + Q2 No: graduate to the [Fractional CTO bridge](/course/tech-for-non-technical-founders-2026/hire-track-supplementary-reference/#the-fractional-cto-bridge). Five hours a week of senior eyes for the next two to three months while you raise or grow into the runway needed for a hire. The [Salvage vs Rebuild decision tree](/course/tech-for-non-technical-founders-2026/salvage-vs-rebuild-decision-tree/) tells you which signal-firing pieces salvage and which the Fractional CTO triages first. -> Two ceiling signals firing for 4+ weeks means the shed is no longer holding. Either hire a team if you have runway, or bridge with a Fractional CTO until you do. Both beat watching the codebase get worse. - ## What to do tomorrow Three actions. The first is tonight. diff --git a/content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/shed-house-skyscraper.svg b/content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/shed-house-skyscraper.svg index 8f0715abd..2becc463c 100644 --- a/content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/shed-house-skyscraper.svg +++ b/content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/shed-house-skyscraper.svg @@ -1,5 +1,5 @@ - + @@ -26,7 +26,7 @@ The shed Lovable + Supabase + Stripe - 1 founder - ~$87 / mo - 4 weeks + 1 founder - ~$87 / mo - 4 weeks @@ -39,7 +39,7 @@ The house Fractional CTO + 1-2 engineers - Rails / Django / Laravel - ~$10-25K / mo + Rails / Django / Laravel - ~$10-25K / mo @@ -60,7 +60,7 @@ The skyscraper Hired engineering team - SOC2 / HIPAA - audit-ready - ~$50K+ / mo + SOC2 / HIPAA - audit-ready - ~$50K+ / mo diff --git a/content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/signals-scoreboard.svg b/content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/signals-scoreboard.svg deleted file mode 100644 index df4d3e13d..000000000 --- a/content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/signals-scoreboard.svg +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - The 5 Architectural Ceiling Signals - Score each signal: green / yellow / red. Two reds = graduate from self-serve. - - - - Signal - What you see - What to do - - - - 1. AI inference - rate limits, cost - per request >$0.05 - OpenAI bill hit $1,400 last - month. Margin per user is - now negative on the Pro plan. - Fractional CTO models the - unit economics. Caching, model - routing, queue back-pressure. - - - - 2. Data model - >5 entities, deep - relations, joins - Lovable rewrites a screen and - three other screens break. - Same fix three times a week. - Fractional CTO for a schema - review (2 hours, $400). Then - route to the hire-a-team path. - - - - 3. Real-time - live presence, - collab, websockets - Two users edit the same row. - One overwrites the other. - Refresh = different state. - Hire a team. Real-time needs - an engineer who has shipped - Action Cable / Channels. - - - - 4. Auth complexity - RBAC matrix, - multi-tenant, SAML - Enterprise prospect asks - for SSO and a role matrix. - Supabase RLS no longer fits. - Fractional CTO scopes the - RBAC model. Then hire a team - to ship it on Rails / Devise. - - - - 5. Compliance - SOC2, HIPAA, PCI - audit on calendar - Customer's procurement asks - for a SOC2 letter or HIPAA BAA. - Vibe-coded stack cannot pass. - Hire a team day one. Senior - engineer architects the audit - surface before you take the deal. - diff --git a/content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/five-sections.svg b/content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/five-sections.svg index d6ebcc404..09f2411f6 100644 --- a/content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/five-sections.svg +++ b/content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/five-sections.svg @@ -1,5 +1,5 @@ - + The five sections of the weekly dev report on one page Five labelled boxes stacked vertically representing the one-page weekly report. Box 1 (green) Shipped: staging URL plus test login. Box 2 (yellow) In review: PR number plus reviewer name. Box 3 (red) Blocked: named person plus deadline. Box 4 (blue) Cut: what got descoped and why. Box 5 (purple) Concern: one sentence on next week's risk. @@ -23,7 +23,7 @@ 2. In review PR number + author + named reviewer + what is holding it up - "PR #847 - Marcos opened Tue, Priya reviewing, two changes requested" + "PR #843 - Marcos opened Tue, Priya reviewing, two changes requested" PIPELINE diff --git a/content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/index.md b/content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/index.md index 6ba49363f..c1027155c 100644 --- a/content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/index.md +++ b/content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/index.md @@ -47,7 +47,7 @@ Both teams worked the same five days, and the second report gave you everything ## Why weekly reports usually fail -The weekly report habit gets inherited from whichever PM the agency assigned in week one. The PM was trained to write status reports for an enterprise customer who wanted comfort: lots of words, a velocity chart, a RAG indicator that has been amber for six months. The format survived because nobody on the agency side had to read it. You did. +The weekly report habit gets inherited from whichever PM the agency assigned in week one. The PM was trained to write status reports for an enterprise customer who wanted comfort: lots of words, a velocity chart, a RAG (red-amber-green) status indicator that has been amber for six months. The format survived because nobody on the agency side had to read it. You did. The vibe-coding wave made the prose worse, not better. The same PM now pastes the standup transcripts into a long-context model and asks for "an executive summary suitable for the founder." What you get back is a wall of soft language - "exploring," "optimising," "iterating on" - assembled out of whatever the team said in standup, with no signal about whether anything reached a place you can click. [Atlassian's writeup of weekly status reporting](https://www.atlassian.com/work-management/project-management/status-reports) makes the point flat: a status report that does not link to working software is theatre, regardless of how cleanly it is formatted. @@ -63,7 +63,7 @@ Send this to your tech lead Sunday night or first-thing Monday. Frame it as the > > **1. What shipped this week.** One line per shipped feature. Each line must include the staging or production URL I can click, the test login if it is gated, and one sentence on what the user can now do. Example: `staging.acme.app/co/v2 - login: demo@example.com / example-pass-123 - users can now apply a discount code at checkout.` If nothing shipped, write "Nothing shipped this week" and skip to section 2. Do not pad. > -> **2. What is in review but not shipped.** One line per open pull request. Include the PR number, the author, the named reviewer, the date the review was requested, and what is holding it up. Example: `PR #847 - Marcos opened Tue, Priya reviewing, two changes requested Wed evening - waiting on author.` If nobody reviewed it, name that. +> **2. What is in review but not shipped.** One line per open pull request. Include the PR number, the author, the named reviewer, the date the review was requested, and what is holding it up. Example: `PR #843 - Marcos opened Tue, Priya reviewing, two changes requested Wed evening - waiting on author.` If nobody reviewed it, name that. > > **3. What is blocked, and on whom.** One line per blocked item. Name the person, the answer they need, and the deadline they need it by. If I am the blocker, list me first. Example: `Stripe live keys - waiting on you - need them by Wed end-of-day or the launch slips to next week.` > @@ -96,7 +96,7 @@ Two reports on the same week of work. Same team. Same backlog. Different formats ### Bad report (1,840 words, no clickable URL) -> *Subject: Weekly Status Report - Sprint 12* +> **Bad** - *Subject: Weekly Status Report - Sprint 12* > > Team made significant progress this sprint on architectural improvements and tech debt reduction. We continued to iterate on the v2 checkout flow, exploring options for the discount-code feature and aligning on best practices for the underlying data model. Velocity remained steady at 34 points (vs. 32 last sprint). The team participated in three architecture workshops to ensure long-term maintainability. RAG status: Amber. We are tracking three risks around third-party dependencies and will provide a deeper writeup in next week's report. PR throughput remained healthy. > @@ -106,14 +106,14 @@ You finish reading at 9:18am. You cannot tell what shipped, who reviewed what, o ### Good report (one page, five sections) -> *Subject: Weekly report - week of 5 Oct* +> **Good** - *Subject: Weekly report - week of 5 Oct* > > **1. Shipped:** > - `staging.acme.app/co/v2` - discount-code field is live; test code `LAUNCH10` gives 10% off; webhook to Stripe fires correctly. Login: `demo@example.com / example-pass-123`. > - `staging.acme.app/account/email` - email change flow now sends confirmation and reverts on link expiry. > > **2. In review:** -> - PR #847 (admin search) - Marcos, Priya reviewing since Tue; two changes requested Wed evening; waiting on author. +> - PR #843 (admin search) - Marcos, Priya reviewing since Tue; two changes requested Wed evening; waiting on author. > - PR #851 (rate limiting on signup) - Marcos, no reviewer yet because Priya is on PTO Thu-Fri; will assign Mon. > > **3. Blocked:** diff --git a/content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/report-comparison.svg b/content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/report-comparison.svg index 41d557cbd..0614e2193 100644 --- a/content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/report-comparison.svg +++ b/content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/report-comparison.svg @@ -1,7 +1,7 @@ - + Weekly report comparison: jargon wall vs. one-page five-section format - Two side-by-side mock email screenshots covering the same five working days. The left panel is a 1,840-word jargon wall with no clickable URL. The right panel is a one-page report with five labelled sections — Shipped, In review, Blocked, Cut, Concern. + Two side-by-side mock email screenshots covering the same five working days. The left panel is a 1,840-word jargon wall with no clickable URL. The right panel is a one-page report with five labelled sections - Shipped, In review, Blocked, Cut, Concern. @@ -71,7 +71,7 @@ 2. In review - PR #847 - Marcos, Priya reviewing Tue + PR #843 - Marcos, Priya reviewing Tue PR #851 - Marcos, no reviewer (PTO) diff --git a/content/course/tech-for-non-technical-founders-2026/where-to-hire-developer-2026-map/index.md b/content/course/tech-for-non-technical-founders-2026/where-to-hire-developer-2026-map/index.md index 2ea52b5d3..4935a9473 100644 --- a/content/course/tech-for-non-technical-founders-2026/where-to-hire-developer-2026-map/index.md +++ b/content/course/tech-for-non-technical-founders-2026/where-to-hire-developer-2026-map/index.md @@ -33,12 +33,12 @@ related_posts: false > **Geography quick-pick** (cost x timezone fit): > - **Onshore** (US / UK): high cost, timezone-aligned, fast ramp > - **LATAM** (Mexico, Colombia, Argentina): mid cost, timezone-aligned -> - **Tier-2 India** (Coimbatore, Pune): low cost, async-only +> - **Tier-2 India** (Jaipur, Kochi, Indore, Coimbatore): low cost, async-only > - **Upwork / freelance**: variable, task-based, no commitment ## Why this exists -A B2B SaaS founder we picked up in Q2 2026 had been paying $185K base for a San Francisco Senior pitched as "AI-native." The Senior wrote good code but had never opened Cursor for a real ship and treated every contractor PR like he was reviewing a junior. After four months she was shipping one feature every three weeks. Her fractional CTO walked her through this map on a Tuesday. By Friday she had a Coimbatore Rails engineer at $42 an hour on a 3-day take-home test, and by the following sprint she had two features shipped and a hallucinated Stripe webhook caught in PR review. Replacement cost: 22% of the original burn. The map was not on her desk in February. It is on yours now. +The Monday you decide to hire, the map matters more than the job post. A B2B SaaS founder we worked with in Q2 2026 had been paying $185K base for a San Francisco Senior pitched as "AI-native." The Senior wrote good code but had never opened Cursor for a real ship and treated every contractor PR like he was reviewing a junior. After four months she was shipping one feature every three weeks. Her fractional CTO walked her through this map on a Tuesday. By Friday she had a Coimbatore Rails engineer at $42 an hour on a 3-day take-home test, and by the following sprint she had two features shipped and a hallucinated Stripe webhook caught in PR review. Replacement cost: 22% of the original burn. The map was not on her desk in February. It is on yours now. ## How to use this @@ -50,25 +50,16 @@ Total time budget: 30 minutes alone, 30 minutes posting, 0 minutes second-guessi ## The 4 regions -Walk these four blocks in order. Circle the one your scope and budget land in, then move to the platform list. +Walk the four rows in order. Circle the one your scope and budget land in, then move to the platform list. *The rate bands and hire-cycle times below are our own market reads from placing and hiring engineers through 2025-2026 at JetThoughts, not survey data - treat them as negotiation anchors, and expect your quotes to land inside the band, not on its edges.* -### Onshore (US / EU) - -Salaried, $130K - $210K+/year, 30-60 days to hire. Pick when: regulated industry (HIPAA, SOC 2 with US data residency, fintech license), security clearance, or board-mandated US team. Watch out for: 51% offer-acceptance rate and the worst cost-to-output ratio on the map. - -### Nearshore (LATAM) - -$45-$100/hr, $90K-$200K annualized, 2-5 days to hire. Pick when: you need real-time timezone overlap for pair programming, customer calls, or daily standups. US founder default in 2026. Watch out for: rates compressed in the top metros; English fluency varies by candidate - screen for it. - -### Tier-2 India - -$15-$70/hr, $30K-$140K annualized, 1-5 days to hire. Pick when: backend-heavy work where async is acceptable. Cities: Jaipur, Kochi, Indore, Coimbatore. NOT Bangalore. Watch out for: no 9am Pacific standups; async PR culture; build CLAUDE.md / coding-standards docs before the first PR lands. - -### Mass-market (Upwork) - -$35-$120/hr, project-based, 1-3 days to hire. Pick when: single landing page, logo, or one-off scraper. Anything you would ship and never touch again. Watch out for: you become the technical interviewer; no platform vetting. NOT for backend, payments, or auth. +| Region | Rate band & time to hire | Pick when | Watch out for | +|---|---|---|---| +| **Onshore (US / EU)** | $130K - $210K+/yr, 30-60 days | Regulated industry (HIPAA, SOC 2 with US data residency, fintech license), security clearance, or board-mandated US team | Low offer-acceptance rates and the worst cost-to-output ratio on the map | +| **Nearshore (LATAM)** | $45 - $100/hr ($90K - $200K annualized), 2-5 days | Real-time timezone overlap for pair programming, customer calls, or daily standups; US founder default in 2026 | Rates compressed in the top metros; English fluency varies by candidate - screen for it | +| **Tier-2 India** | $15 - $70/hr ($30K - $140K annualized), 1-5 days | Backend-heavy work where async is acceptable (Jaipur, Kochi, Indore, Coimbatore - NOT Bangalore) | No 9am Pacific standups; async PR culture; build CLAUDE.md / coding-standards docs before the first PR | +| **Mass-market (Upwork)** | $35 - $120/hr project-based, 1-3 days | Single landing page, logo, or one-off scraper - anything you'd ship and never touch again | You become the technical interviewer; no platform vetting; NOT for backend, payments, or auth | ## The 6 platforms ranked diff --git a/data/course_banned_strings.yaml b/data/course_banned_strings.yaml index 157688097..fca918537 100644 --- a/data/course_banned_strings.yaml +++ b/data/course_banned_strings.yaml @@ -319,3 +319,34 @@ banned: - string: "clicked your fake" reason: "worksheet Q1 conflated the 1.4 Promising band (email sign-ups) with the 1.5 Buy-button price test" scope: "build-path-decision-worksheet" + - string: "Airtable" + reason: "operating kit tracker teaches a Google Sheet (Ch 5.5/5.7 canon), not Airtable (fixed 2026-07-12); scoped because Airtable is a legitimate Concierge-MVP no-code stack example elsewhere" + scope: "first-paying-customer-operating-kit" + - string: "It's a diagnostic, not a gate" + reason: "banned slogany reveal-twist flip (voice guide)" + - string: "after 12 interviews" + reason: "course canon is ten interviews everywhere" + - string: "Picture the situation" + reason: "banned AI-narration imperative-frame opener" + - string: "standup + report + spaceship" + reason: "fixed 2026-07-12; never re-add" + - string: "Two failed questions is a walkaway" + reason: "contradicted the page's own 2-or-below-out-of-5 walk threshold; fixed 2026-07-13" + - string: "the deposit is year-one ACV" + reason: "deposit is 10-30% of ACV credited toward it (5.6 canon), never the full year-one value" + - string: "51% offer-acceptance rate" + reason: "fabricated-precision market stat outside the rate-band disclaimer scope" + - string: "Devon in the table above" + reason: "wrong-direction table reference; the invoice table is below" + - string: "In April 2025, Lasso Security" + reason: "Lasso research is March 2025; April is the Infosecurity coinage" + - string: "Marcus reviewed" + reason: "recurring reviewer cast is Marcos/Priya; Marcus spelling retired 2026-07-13" + - string: "Eight of the first twenty replied" + reason: "40% reply rate overshoots the 2.4 lesson's own 20-30% ceiling" + - string: "substitutes at ~10% of the cost" + reason: "overstated; Reddit substitute is a quarter to a seventh of LinkedIn cost, two others free" + - string: "The founders we work with in 2026 did not lose money" + reason: "fake-authority cohort generalization (voice guide)" + - string: "In April 2025 a security researcher published" + reason: "Lasso research is March 2025; April is only the slopsquatting coinage" diff --git a/docs/workflows/visual-scroll-gate.md b/docs/workflows/visual-scroll-gate.md index 80d1b3aa6..de12528e3 100644 --- a/docs/workflows/visual-scroll-gate.md +++ b/docs/workflows/visual-scroll-gate.md @@ -54,6 +54,32 @@ EVERY page, which reads as fake overflow. Mobile checks need the chrome-devtools MCP resize (or DevTools device emulation); use raw headless only for desktop-width captures. +## Design-quality pass (separate from defect QA - 2026-07-12 lesson) + +Defect-checklist reviews systematically MISS taste problems: reviewer +rubrics bias toward provable failures (overflow, broken links, banned +strings) and "intentional style" allowances teach reviewers to wave +through badly-executed instances of the style. The owner repeatedly +caught dated/ugly visuals that geometry-QA rounds had passed. When the +goal is "premium", run a dedicated critic pass with these properties: + +1. **Score, don't checklist**: 1-5 design-quality scale per asset with a + FORCED worst-first ranking (must name the bottom N with specific + visual sins). Critics allowed to say "this is ugly" without a rule ID. +2. **External anchor**: judge against market-premium references, not + against the sibling corpus - when 40 assets share a style, the style + becomes the baseline and only outliers get flagged. +3. **Judge in page context too**: an asset fine in isolation fails if it + duplicates the adjacent table/list, or repeats what the H1 says. +4. **Read the TEXT inside artwork against policy**: prices, counts, + chapter numbers, banned phrases inside SVG/mermaid escape the + banned-string ratchet (it never scans them) - check manually. +5. **"Intentional style" never exempts execution**: the question is not + "is sketch style allowed?" but "is this a GOOD sketch?". +6. Mermaid renders client-side: text validators never see it. Theme-level + problems (edge weight, label chips, font-to-node ratio) repeat across + every diagram - diagnose once at the theme, not per diagram. + ## Per-view checklist | Class | What to look for | Caught before | diff --git a/themes/beaver/assets/css/style.css b/themes/beaver/assets/css/style.css index 81ac43388..e5fbf664e 100644 --- a/themes/beaver/assets/css/style.css +++ b/themes/beaver/assets/css/style.css @@ -590,6 +590,155 @@ input[type=submit]:disabled { margin-bottom: 0; } +/* Worksheet cards — fill-in form treatment for course companion worksheets. + Use as
blocks in content markdown. Route colors are + semantic: green = advance to the next question, purple = terminal path + assignment (the worksheet's output). Red stays reserved for insight + blockquotes so the five stacked cards don't shout. */ +.blog .ws-card { + background: #faf7f2; + border: 2px solid #2b2b2b; + border-radius: 14px; + padding: 22px 28px; + margin: 24px 0 40px; +} +.blog .ws-card p { + font-size: 17px; + line-height: 1.55; + margin: 0 0 12px; + color: #1a1a2e; +} +.blog .ws-field { + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 10px 14px; + margin: 14px 0; + font-size: 17px; +} +.blog .ws-flabel { + font-weight: 600; + color: #1a1a2e; +} +.blog .ws-blank { + flex: 1 1 140px; + min-width: 110px; + border-bottom: 2px dotted #8b8578; + height: 1.3em; +} +.blog .ws-card ul.ws-checks { + list-style: none; + margin: 0 0 16px; + padding: 0; +} +.blog .ws-card ul.ws-checks li { + position: relative; + padding-left: 34px; + margin: 10px 0; + font-size: 17px; + line-height: 1.5; + color: #1a1a2e; +} +.blog .ws-card ul.ws-checks li::before { + content: ""; + position: absolute; + left: 2px; + top: 4px; + width: 17px; + height: 17px; + border: 2px solid #444; + border-radius: 4px; + background: #fff; +} +.blog .ws-verdict { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 10px 26px; + background: #fff; + border: 2px dashed #b9b2a4; + border-radius: 10px; + padding: 12px 18px; + margin: 18px 0; + font-size: 17px; +} +.blog .ws-verdict-stack { + flex-direction: column; + align-items: flex-start; + gap: 8px; +} +.blog .ws-vlabel { + font-weight: 700; + letter-spacing: 0.08em; + font-size: 14px; + text-transform: uppercase; + color: #6b6558; +} +.blog .ws-opt { + display: inline-flex; + align-items: center; + gap: 9px; + color: #1a1a2e; +} +.blog .ws-opt .ws-box { + width: 17px; + height: 17px; + flex: none; + border: 2px solid #444; + border-radius: 4px; + background: #fff; +} +.blog .ws-route { + font-size: 16.5px; + line-height: 1.5; + border-radius: 8px; + padding: 10px 16px; + margin: 10px 0; + color: #1a1a2e; +} +.blog .ws-route p { margin: 0; font-size: 16.5px; } +.blog .ws-route-go { + background: #f0f9f0; + border-left: 5px solid #2e7d32; +} +.blog .ws-route-alt { + background: #fbe9ff; + border-left: 5px solid #a855f7; +} +@media (max-width: 480px) { + .blog .ws-card { padding: 16px 14px; } +} + +/* Course reading typography — course pages only (body.section-course). + Lessons run 3-5K words; the site-wide 22.4px body stretches them past + 15K px tall and shows barely two paragraphs per screen (Gloria Mark: + ~43s attention per screen). 20px/1.65 keeps the approachable size while + fitting ~30% more per screen, restores H3 contrast (26/20 = 1.3x) so + scanning landmarks work, and drops callouts a step (19px) so they read + as asides, not more wall. Blog pages keep the site-wide scale. */ +/* Selectors mirror single-post.css's `.blog article.single-content + .fl-rich-text p` (0,3,2) - anything weaker silently loses to it. */ +.section-course .blog article.single-content .fl-rich-text p, +.section-course .blog article.single-content .fl-rich-text li { + font-size: 20px; + line-height: 1.65; +} +.section-course .blog article.single-content .fl-rich-text li { + margin-bottom: 12px; +} +.section-course .blog article.single-content .fl-rich-text blockquote p { + font-size: 19px; + line-height: 1.6; +} +.section-course .blog article.single-content .fl-rich-text .ws-card p, +.section-course .blog article.single-content .fl-rich-text .ws-card ul.ws-checks li { + font-size: 17px; + line-height: 1.55; +} +.section-course .blog article.single-content .fl-rich-text .ws-route p { + font-size: 16.5px; +} + /* Details/summary — collapsible tool-stack accordion. Summary looks like a clickable heading, details body has standard spacing. */ .blog details { diff --git a/themes/beaver/layouts/baseof.html b/themes/beaver/layouts/baseof.html index 0ea975af0..04ca9cb9f 100644 --- a/themes/beaver/layouts/baseof.html +++ b/themes/beaver/layouts/baseof.html @@ -91,6 +91,16 @@ {{ partialCached "page/site-scripts" . "site-scripts" }} {{ if .Store.Get "features.mermaid" }} + {{/* The house diagram font. Without this, 'Caveat, Patrick Hand, + cursive' resolves to the PLATFORM generic cursive (Apple + Chancery on macOS, varies elsewhere) - a per-visitor identity + lottery caught by the 2026-07-12 M5 design review. Loaded only + on pages that render mermaid. */}} + + +