diff --git a/.okf/build/test-gates.md b/.okf/build/test-gates.md index 78a4faaba..557a42f81 100644 --- a/.okf/build/test-gates.md +++ b/.okf/build/test-gates.md @@ -4,7 +4,7 @@ title: Test gates and when they block commits description: bin/qtest --changed is the routine gate; bin/rake test:critical at milestones; bin/test AND bin/dtest once at PR prep (or on explicit confirmation) for themes/, layouts/, or CSS changes. tags: [testing, visual-regression, gates] status: stable -generated: { by: claude/fable-5, at: 2026-08-01T18:00:00Z } +generated: { by: claude/opus-4-8, at: 2026-08-12T20:20:00Z } verified: { by: claude/fable-5, at: 2026-08-01T11:30:00Z } --- @@ -179,3 +179,12 @@ extend it when adding components or critical files. The macOS full suite remains the repo - fresh clones had a hooksPath pointing at nothing. Adding any root dotfile/dot-dir? Check `git check-ignore -v ` before assuming it's tracked. +- REPORT-ONLY build gates (each flips to blocking once its backlog hits + zero via an env flag): `bin/check-svg-floor` (`SVG_FLOOR_BLOCK=1`) + catches course SVGs whose smallest text renders <9px@390; + `bin/check-course-paths` (`COURSE_PATH_BLOCK=1`) catches lesson + `Next:`/branch drift vs `data/course_sequence.yaml`. Both are standalone + (NOT yet wired into hugo-build/CI), carry a `--self-test`, and print a + burn-down list + exit 0 until their env flag is set. (A landing-parity + variant was tried and dropped as redundant - YAGNI: a report-only gate + nobody wires in earns its keep only when it guards an active backlog.) diff --git a/.okf/log.md b/.okf/log.md index eb6b666be..3171ff062 100644 --- a/.okf/log.md +++ b/.okf/log.md @@ -1,5 +1,21 @@ # Bundle Update Log +## 2026-08-12 (item16 landing migration) - below-fold coverage gap confirmed + +* **Update**: `.okf/build/test-gates.md` documents the REPORT-ONLY build-gate + pair (`bin/check-svg-floor`, `bin/check-course-paths`) - standalone, each + with a `--self-test`, flipping to blocking via an env flag once its backlog + is zero. +* **Coverage-gap confirmed from both sides**: item16's below-fold changes + (dark NOT-cover band, merged endcap, compacted module cards) produced + ZERO Linux dtest reds - only the hero-fold desktop/course/landing baseline + shifted (T2/T4). Below-fold visual work is gated by rendered chrome-devtools + review at 1280+390, never by the pixel suite. +* **Dropped**: a `bin/check-landing-parity` report-only gate was tried as the + wave's 20%-slot and removed as redundant (Paul, YAGNI) - a report-only + gate nobody wires into hugo-build/CI doesn't earn its keep unless it guards + an active backlog the way svg-floor/course-paths do. + ## 2026-08-09 (CEO decisions) - delivery goes dual-route, client picture corrected * **Update**: no concept file changed - this is a business-layer decision, and the 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 32beb7a07..b25cb3a1a 100644 --- a/content/course/tech-for-non-technical-founders-2026/_index.md +++ b/content/course/tech-for-non-technical-founders-2026/_index.md @@ -43,23 +43,7 @@ The first checkpoint comes fast: two to three weeks in, at an evenings-and-weeke Two ways in: [Start Lesson 1.1 →](/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/) or [see the full syllabus ↓](#module-map). *Prefer a map first? [How This Course Works](/course/tech-for-non-technical-founders-2026/how-this-course-works/) (10 minutes) and the [FAQ](/course/tech-for-non-technical-founders-2026/faq/) cover the route and the most common blockers.* -## Take this course if - -- You are a first-time founder with an idea -- You want the fastest route from that idea to your first paying customer -- You can read a [Stripe](https://stripe.com) invoice but not a GitHub commit -- You have never systematically validated a business before -- You might have tinkered with no-code tools, but you want a structured path instead of guessing - -Skip this course if you want to learn to code or hand off founder judgment to someone else. And if what you need most is cohort deadlines and peers, [YC Startup School](https://www.startupschool.org/) runs free - this course is the self-paced, artifact-first alternative. - -Already building, or paying someone to build for you? Start at the [ownership audit in Lesson 4.2](/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/) - the [side-path below](#already-started-building) explains the fork. - -## Who built this - -Built by [JetThoughts](https://jetthoughts.com). We've run a Rails-first dev shop since 2011, and we have sat on the receiving end of enough first builds gone wrong to know which mistakes repeat: a 15-page wishlist spec where a one-page brief should have been, or a GitHub account registered to a contractor who stopped replying. This course is the desk reference we wish those founders had before their first build decision. - -Why free? A founder who validates before building makes a better future client than one we meet mid-disaster, and there is nothing to buy inside the course. +Already building, or paying someone to build for you? Start at the [ownership audit in Lesson 4.2](/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/) - the [Already started building? side-path](/course/tech-for-non-technical-founders-2026/how-this-course-works/#already-started-building) explains the fork. ## Why this course exists @@ -74,33 +58,6 @@ The five mistakes below sink more first products than bad code does - we have wa
  • Each mistake maps to a module - jump to the module map ↓
  • -## What this course does NOT cover - -To save your time, here is what we intentionally exclude - none of it is needed for the promised result (idea → first paying customer): - -
    -
    -

    How to code

    -

    The course assumes zero coding ability - Lovable + Supabase + Stripe handle the technical side.

    -
    -
    -

    Hiring & managing a team

    -

    Covered as a build-path decision in Lesson 4.1, not as org design; early-stage management lives in the Friday Demo Rule + Weekly Dev Report.

    -
    -
    -

    Raising venture capital

    -

    The course produces the artifacts investors want to see. It does not teach pitch decks or fundraising mechanics.

    -
    -
    -

    Acquisition at scale

    -

    Module 5 covers your first customers; SEO, content marketing, and paid acquisition at scale are a separate discipline.

    -
    -
    - -

    Also out of scope: mobile-only and marketplace-only specifics (they have their own playbooks), and legal incorporation, taxes, and IP filings - use a lawyer or a service like Stripe Atlas, Clerky, or Firstbase. If you need something on this list, the course won't help with it.

    - -
    - ## Module map Read the modules in order - each module's output is the next module's input, and each card's **"You leave with"** line names its output. The artifacts bundle into a single Google Drive folder - your **Founder OS** ([printable pack index](/course/tech-for-non-technical-founders-2026/founder-os-pack/)). @@ -244,12 +201,32 @@ Read the modules in order - each module's output is the next module's input, and
    - +
    + +## What this course does NOT cover + +To save your time, here is what we intentionally exclude - none of it is needed for the promised result (idea → first paying customer): -## Going further (after first paying customer) +
    +
    +

    How to code

    +

    The course assumes zero coding ability - Lovable + Supabase + Stripe handle the technical side.

    +
    +
    +

    Hiring & managing a team

    +

    Covered as a build-path decision in Lesson 4.1, not as org design; early-stage management lives in the Friday Demo Rule + Weekly Dev Report.

    +
    +
    +

    Raising venture capital

    +

    The course produces the artifacts investors want to see. It does not teach pitch decks or fundraising mechanics.

    +
    +
    +

    Acquisition at scale

    +

    Module 5 covers your first customers; SEO, content marketing, and paid acquisition at scale are a separate discipline.

    +
    +
    -Once you've passed the Module 5 gate, the continuation chapters - churn triage, pivot-or-persevere, hiring, agency oversight - live with their read-this-when triggers in the [First-Paying-Customer Operating Kit](/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/#going-further-triggers). +

    Also out of scope: mobile-only and marketplace-only specifics (they have their own playbooks), and legal incorporation, taxes, and IP filings - use a lawyer or a service like Stripe Atlas, Clerky, or Firstbase. If you need something on this list, the course won't help with it.

    -## Already started building? +
    -If you just have an idea or a half-built prototype you're tinkering with, skip to [Module 1](#module-1). If you are already typing, or paying someone an hourly rate to type for you, start with the ownership audit in [Lesson 4.2 · Who Owns Your GitHub, AWS, and Database?](/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/) - it carries the full pre-flight list to run before you approve any more work. diff --git a/content/course/tech-for-non-technical-founders-2026/customers-leaving-churn-triage-not-acquisition/index.md b/content/course/tech-for-non-technical-founders-2026/customers-leaving-churn-triage-not-acquisition/index.md index ba7f1be5e..a27e49c0f 100644 --- a/content/course/tech-for-non-technical-founders-2026/customers-leaving-churn-triage-not-acquisition/index.md +++ b/content/course/tech-for-non-technical-founders-2026/customers-leaving-churn-triage-not-acquisition/index.md @@ -8,7 +8,7 @@ course_chapter: true author: "JetThoughts Team" slug: customers-leaving-churn-triage-not-acquisition course_nav_prev: - url: "/course/tech-for-non-technical-founders-2026/#going-further-after-first-paying-customer" + url: "/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/#going-further-triggers" module: "Going further" title: "All Going-further chapters" course_nav_next: 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 54d2a2b67..5004d79d9 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 @@ -120,7 +120,7 @@ Whose inbox did the AWS root email land in tonight? If the honest answer is "I'm ## Already mid-build with a contractor? -A side-path for readers who came from the course landing's [Already started building?](/course/tech-for-non-technical-founders-2026/#already-started-building) fork - you are already typing, or paying someone an hourly rate to type for you. The ownership audit above is step one. Run these before you approve any more work: +A side-path for readers who came from the course overview's [Already started building?](/course/tech-for-non-technical-founders-2026/how-this-course-works/#already-started-building) fork - you are already typing, or paying someone an hourly rate to type for you. The ownership audit above is step one. Run these before you approve any more work: 1. Demand one Friday demo with working software only - no Jira tickets, no slides, no "almost done." - [Friday Demo Rule](/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/) 2. Require a plain-English weekly report: what shipped, what's blocked, what's next. - [Weekly Dev Report](/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/) diff --git a/content/course/tech-for-non-technical-founders-2026/how-this-course-works/index.md b/content/course/tech-for-non-technical-founders-2026/how-this-course-works/index.md index 1fb636b70..8253c3ce2 100644 --- a/content/course/tech-for-non-technical-founders-2026/how-this-course-works/index.md +++ b/content/course/tech-for-non-technical-founders-2026/how-this-course-works/index.md @@ -40,6 +40,18 @@ This course takes a non-technical founder from a rough idea to a signed paid pil --- +## Take this course if + +- You are a first-time founder with an idea +- You want the fastest route from that idea to your first paying customer +- You can read a [Stripe](https://stripe.com) invoice but not a GitHub commit +- You have never systematically validated a business before +- You might have tinkered with no-code tools, but you want a structured path instead of guessing + +Skip this course if you want to learn to code or hand off founder judgment to someone else. And if what you need most is cohort deadlines and peers, [YC Startup School](https://www.startupschool.org/) runs free - this course is the self-paced, artifact-first alternative. + +--- + ## The Big Picture ![Program map: five modules on one spine, each output feeding the next input. Module 1 Hypothesis & Smoke Test produces a tested hypothesis and a live page that takes payment; Module 2 Validate the Problem produces 10 customer interviews and a validated problem statement; Module 3 Design from Evidence produces a one-page product brief in real customer words; Module 4 Build It Yourself produces a live MVP at a real URL with every account in your name; Module 5 First Paying Customer produces a signed paid pilot with a deposit in the bank.](program-map.svg) @@ -146,7 +158,7 @@ The brief is the handoff document. It goes to Lovable, a hired developer, or a f **Important distinction:** your warm network is the right place to sell your first paid pilot, and the wrong place to validate the problem. Friends and other founders will tell you your idea is great because they're being polite. Only cold strangers who describe the problem in their own words and pay money produce a real signal. -> **Going further:** After your first paid pilot, the course has continuation chapters for churn triage, pivot-or-persevere decisions, hiring, management (Friday Demo Rule, Weekly Dev Report), and AI-era topics (token bill auditing, slopsquatting, agency AI questions). +> **Going further:** After your first paid pilot, the course has continuation chapters for churn triage, pivot-or-persevere decisions, hiring, agency oversight and management (Friday Demo Rule, Weekly Dev Report), and AI-era topics (token bill auditing, slopsquatting, agency AI questions). Once you've passed the Module 5 gate, they live with their read-this-when triggers in the [First-Paying-Customer Operating Kit](/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/#going-further-triggers). --- @@ -203,7 +215,7 @@ If you fail a gate, the system requires you to go back, not forward. Failing at Read the overview once. Then start at [Module 1, Lesson 1.1: Form Your Founding Hypothesis](/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/). Come back to this page when you need to see where you are in the full route. -If you're not at the idea stage - you're already building, or paying someone to build for you - see the [Already started building?](/course/tech-for-non-technical-founders-2026/#already-started-building) section on the course landing page. +If you're not at the idea stage - you're already building, or paying someone to build for you - see [Already started building?](#already-started-building) below. > **Done when:** You have read the full route and know which module to start with. > **Next click:** [1.1 · Form Your Founding Hypothesis](/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/) @@ -211,6 +223,20 @@ If you're not at the idea stage - you're already building, or paying someone to --- +## Already started building? + +If you just have an idea or a half-built prototype you're tinkering with, skip to [Module 1](/course/tech-for-non-technical-founders-2026/#module-1). If you are already typing, or paying someone an hourly rate to type for you, start with the ownership audit in [Lesson 4.2 · Who Owns Your GitHub, AWS, and Database?](/course/tech-for-non-technical-founders-2026/github-aws-database-ownership-checklist/) - it carries the full pre-flight list to run before you approve any more work. + +--- + +## Who built this + +Built by [JetThoughts](https://jetthoughts.com). We've run a Rails-first dev shop since 2011, and we have sat on the receiving end of enough first builds gone wrong to know which mistakes repeat: a 15-page wishlist spec where a one-page brief should have been, or a GitHub account registered to a contractor who stopped replying. This course is the desk reference we wish those founders had before their first build decision. + +Why free? A founder who validates before building makes a better future client than one we meet mid-disaster, and there is nothing to buy inside the course. + +--- + **Updated July 2026.** Recent changes: - Lesson 1.1 split into two short sittings - write first, score later diff --git a/content/course/tech-for-non-technical-founders-2026/module-5-walkthrough-mia/index.md b/content/course/tech-for-non-technical-founders-2026/module-5-walkthrough-mia/index.md index 9a702814a..0958df8e1 100644 --- a/content/course/tech-for-non-technical-founders-2026/module-5-walkthrough-mia/index.md +++ b/content/course/tech-for-non-technical-founders-2026/module-5-walkthrough-mia/index.md @@ -14,7 +14,7 @@ course_nav_prev: module: "Lesson 5.6" title: "5.6 · Charge Before You Ship: The Paid Pilot Contract" course_nav_next: - url: "/course/tech-for-non-technical-founders-2026/#going-further-after-first-paying-customer" + url: "/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/#going-further-triggers" module: "After the course" title: "Going further: churn triage, pivot-or-persevere, the operating kit" --- 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 7f52750ad..b2d925657 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 @@ -12,7 +12,7 @@ course_nav_prev: module: "Going further" title: "When Your Customers Are Leaving: Churn Triage" course_nav_next: - url: "/course/tech-for-non-technical-founders-2026/#going-further-after-first-paying-customer" + url: "/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/#going-further-triggers" module: "Going further" title: "All Going-further chapters" keywords: diff --git a/docs/projects/2605-tech-for-non-technical-founders/40-49-review/40.32-item16-result-full.jpeg b/docs/projects/2605-tech-for-non-technical-founders/40-49-review/40.32-item16-result-full.jpeg new file mode 100644 index 000000000..b50aa0a63 Binary files /dev/null and b/docs/projects/2605-tech-for-non-technical-founders/40-49-review/40.32-item16-result-full.jpeg differ diff --git a/docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md b/docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md index 10e763759..33f63683b 100644 --- a/docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md +++ b/docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md @@ -10,7 +10,7 @@ ## Open queue (in execution order) -1. **Item 16 — Landing full-migration to the shuffle2 reference. RUNS NEXT** (unfrozen by Paul 2026-08-02, no Aug-14 wait). Six-gap punch-list groomed and re-audited @662744c3 — full scope in the archive @L476: (1) RELOCATE "Take this course if" + "Who built this" (+ "Going further", "Already started building?") off the landing to how-this-course-works/FAQ — biggest height cut, mind the `#already-started-building` + `#module-map` inbound anchors; (2) module map → compact summaries + chapter counts; (3) gradient second-line H1 — needs `layouts/course/list.html` (TEMPLATE = post-Aug-14 safe only); (4) mistakes grid 2→3-col; (5) hero card labeled stat cells; (6) NOT-cover dark band (dark-zone-budget rebalance). Skills: /impeccable + stitch-design + ux-principles; side-by-side vs 40.28 reference + Paul taste gate at the PR render. Landing-owned files now; the title-render template change waits for Aug-14. +1. **Item 16 — Landing full-migration to the shuffle2 reference. ✅ PR #444 OPEN** (branch `landing-item16`). **Blocked on merge by: (a) Paul's taste gate on the render (esp. T4 stat-cell copy), (b) CI `workflow_dispatch update-baselines` for the Linux `desktop/course/landing` baseline** (T2/T4 changed the hero-fold; macOS committed, Linux stale — the only real Linux red; the other 7 dtest reds are known local-Docker codeblock env-flakes, green on CI). Host `bin/test` green; both reviewer agents failed on Fable quota so all blocking checks were run directly with evidence (constraint scoping, anchors, canon, fact-loss, div balance, parity-gate regression sim — all pass). Design panel (3 lenses: conversion/taste/UX) decided: Fork A = Option 2 + embedded CTA (dark NOT-cover, drop the endcap island, keep the bottom CTA inside the dark base); Fork B = relocate all 4 off-reference sections; section reorder = adopt reference order. Shipped: **T1** relocate 4 sections → how-this-course-works (5 inbound anchors repointed, router one-liner kept in hero); **reorder** Hero → mistakes → module map → NOT-cover; **T2** gradient second-line H1 (`list.html` replaceRE, one semantic h1); **T3** mistakes 2→3-col; **T4** hero stat cells (Methodology/No-Code MVP · Validation Pace/2-3 Weeks — copy Paul-gated); **T5** dark NOT-cover single full-bleed band + merged endcap (0px seam to footer) + 4 dead eyebrow selectors removed; **T6** chapter links body-color + muted numbers + tighter cards. 20%-slot dropped (a `bin/check-landing-parity` gate was tried and removed as redundant per Paul, YAGNI). Result render: `40-49-review/40.32-item16-result-full.jpeg`. **Remaining before merge:** core-reviewer verdict, full visual pair (`bin/test` host + honest `bin/dtest` from main), **Linux hero baseline re-record via CI `workflow_dispatch update-baselines`** (T2/T4 changed the hero-fold; macOS baseline committed, Linux stale), ONE PR + Paul taste gate on the render (T4 copy). Constraints held: all CSS in `course-list.css`, template only `list.html`, no shared CSS/partials. 2. **Item 18 — Remaining 46 under-floor SVGs → O2 flat-vector.** Groomed 2026-08-02, READY TO RUN, campaign-safe, parked after SW-1 per Paul — full scope in the archive @L693. Extends the decided O2 system (ADR 30.09; no new Paul style call needed); template = the 22 already-converted FLAT/PASS SVGs; spec = `.okf/design/house-visual-spec.md` "v3 exhibit spec" (W=720, 5-rung scale, basis rung ≥17px). Gate per batch: `bin/check-svg-floor` + scroll gate both viewports. diff --git a/layouts/course/list.html b/layouts/course/list.html index 3df60e1ba..2ce832d87 100644 --- a/layouts/course/list.html +++ b/layouts/course/list.html @@ -31,7 +31,7 @@
    -

    {{ .Title }}

    +

    {{ .Title | replaceRE `First Paying Customer` `First Paying Customer` | safeHTML }}

    {{ with .Params.hero_lede }}

    {{ . | markdownify }}

    @@ -76,8 +76,17 @@

    {{ .Title }}

    Free course

    Idea to
    First Paying Customer

    -

    {{ len $mods }} modules · {{ $lessons }} lessons

    -

    You leave with a signed paid pilot - a real customer paying real money.

    +
    +
    +

    Methodology

    +

    No-Code MVP

    +
    +
    +

    Validation Pace

    +

    2-3 Weeks

    +
    +
    +

    You leave with a signed paid pilot - a real customer paying real money. {{ len $mods }} modules, {{ $lessons }} lessons, all free.

    diff --git a/test/fixtures/screenshots/linux/desktop/404.png b/test/fixtures/screenshots/linux/desktop/404.png index f54829840..7a9d08884 100644 Binary files a/test/fixtures/screenshots/linux/desktop/404.png and b/test/fixtures/screenshots/linux/desktop/404.png differ diff --git a/test/fixtures/screenshots/linux/desktop/about_page/_missions.png b/test/fixtures/screenshots/linux/desktop/about_page/_missions.png index 52e8c4241..45fc462bb 100644 Binary files a/test/fixtures/screenshots/linux/desktop/about_page/_missions.png and b/test/fixtures/screenshots/linux/desktop/about_page/_missions.png differ diff --git a/test/fixtures/screenshots/linux/desktop/blog/index.png b/test/fixtures/screenshots/linux/desktop/blog/index.png index 81cc4eb52..ff004f7ed 100644 Binary files a/test/fixtures/screenshots/linux/desktop/blog/index.png and b/test/fixtures/screenshots/linux/desktop/blog/index.png differ diff --git a/test/fixtures/screenshots/linux/desktop/blog/index/_pagination.png b/test/fixtures/screenshots/linux/desktop/blog/index/_pagination.png index 0b5f46861..61bba0210 100644 Binary files a/test/fixtures/screenshots/linux/desktop/blog/index/_pagination.png and b/test/fixtures/screenshots/linux/desktop/blog/index/_pagination.png differ diff --git a/test/fixtures/screenshots/linux/desktop/blog/special/codeblocks/text.png b/test/fixtures/screenshots/linux/desktop/blog/special/codeblocks/text.png index 93ea15b44..485402f2d 100644 Binary files a/test/fixtures/screenshots/linux/desktop/blog/special/codeblocks/text.png and b/test/fixtures/screenshots/linux/desktop/blog/special/codeblocks/text.png differ diff --git a/test/fixtures/screenshots/linux/desktop/blog/special/inline_style_post.png b/test/fixtures/screenshots/linux/desktop/blog/special/inline_style_post.png index 2f19ffa2c..172fc4f8d 100644 Binary files a/test/fixtures/screenshots/linux/desktop/blog/special/inline_style_post.png and b/test/fixtures/screenshots/linux/desktop/blog/special/inline_style_post.png differ diff --git a/test/fixtures/screenshots/linux/desktop/careers.png b/test/fixtures/screenshots/linux/desktop/careers.png index 90bc4faa3..2c95fdf98 100644 Binary files a/test/fixtures/screenshots/linux/desktop/careers.png and b/test/fixtures/screenshots/linux/desktop/careers.png differ diff --git a/test/fixtures/screenshots/linux/desktop/careers/junior-ruby-on-rails-developer.png b/test/fixtures/screenshots/linux/desktop/careers/junior-ruby-on-rails-developer.png index 248959892..da6b0eeba 100644 Binary files a/test/fixtures/screenshots/linux/desktop/careers/junior-ruby-on-rails-developer.png and b/test/fixtures/screenshots/linux/desktop/careers/junior-ruby-on-rails-developer.png differ diff --git a/test/fixtures/screenshots/linux/desktop/clients/_testimonials.png b/test/fixtures/screenshots/linux/desktop/clients/_testimonials.png index 1f1afc246..d3d5fb44f 100644 Binary files a/test/fixtures/screenshots/linux/desktop/clients/_testimonials.png and b/test/fixtures/screenshots/linux/desktop/clients/_testimonials.png differ diff --git a/test/fixtures/screenshots/linux/desktop/clients/single-full.png b/test/fixtures/screenshots/linux/desktop/clients/single-full.png index 0bbc6eeee..27cee10af 100644 Binary files a/test/fixtures/screenshots/linux/desktop/clients/single-full.png and b/test/fixtures/screenshots/linux/desktop/clients/single-full.png differ diff --git a/test/fixtures/screenshots/linux/desktop/course/chapter.png b/test/fixtures/screenshots/linux/desktop/course/chapter.png index 0871edbca..e0e372f2f 100644 Binary files a/test/fixtures/screenshots/linux/desktop/course/chapter.png and b/test/fixtures/screenshots/linux/desktop/course/chapter.png differ diff --git a/test/fixtures/screenshots/linux/desktop/course/landing.png b/test/fixtures/screenshots/linux/desktop/course/landing.png index 395d60c08..cec03b9a1 100644 Binary files a/test/fixtures/screenshots/linux/desktop/course/landing.png and b/test/fixtures/screenshots/linux/desktop/course/landing.png differ diff --git a/test/fixtures/screenshots/linux/desktop/free_consultation.png b/test/fixtures/screenshots/linux/desktop/free_consultation.png index 950dd4a9e..6d0b0f771 100644 Binary files a/test/fixtures/screenshots/linux/desktop/free_consultation.png and b/test/fixtures/screenshots/linux/desktop/free_consultation.png differ diff --git a/test/fixtures/screenshots/linux/desktop/homepage/_services.png b/test/fixtures/screenshots/linux/desktop/homepage/_services.png index 0122f621c..298f54b71 100644 Binary files a/test/fixtures/screenshots/linux/desktop/homepage/_services.png and b/test/fixtures/screenshots/linux/desktop/homepage/_services.png differ diff --git a/test/fixtures/screenshots/linux/desktop/privacy-policy.png b/test/fixtures/screenshots/linux/desktop/privacy-policy.png index fee7c46f0..53adcd2fa 100644 Binary files a/test/fixtures/screenshots/linux/desktop/privacy-policy.png and b/test/fixtures/screenshots/linux/desktop/privacy-policy.png differ diff --git a/test/fixtures/screenshots/linux/desktop/services/app_web_development.png b/test/fixtures/screenshots/linux/desktop/services/app_web_development.png index 78011c97c..648da5e32 100644 Binary files a/test/fixtures/screenshots/linux/desktop/services/app_web_development.png and b/test/fixtures/screenshots/linux/desktop/services/app_web_development.png differ diff --git a/test/fixtures/screenshots/linux/desktop/services/fractional-cto/_overview.png b/test/fixtures/screenshots/linux/desktop/services/fractional-cto/_overview.png index c71429755..6062dca38 100644 Binary files a/test/fixtures/screenshots/linux/desktop/services/fractional-cto/_overview.png and b/test/fixtures/screenshots/linux/desktop/services/fractional-cto/_overview.png differ diff --git a/test/fixtures/screenshots/linux/desktop/services/fractional_cto.png b/test/fixtures/screenshots/linux/desktop/services/fractional_cto.png index b75e6d4b9..534c40480 100644 Binary files a/test/fixtures/screenshots/linux/desktop/services/fractional_cto.png and b/test/fixtures/screenshots/linux/desktop/services/fractional_cto.png differ diff --git a/test/fixtures/screenshots/linux/desktop/use-cases/_overview.png b/test/fixtures/screenshots/linux/desktop/use-cases/_overview.png index 70c0f7911..5c557fb2a 100644 Binary files a/test/fixtures/screenshots/linux/desktop/use-cases/_overview.png and b/test/fixtures/screenshots/linux/desktop/use-cases/_overview.png differ diff --git a/test/fixtures/screenshots/linux/mobile/about_page/achievements.png b/test/fixtures/screenshots/linux/mobile/about_page/achievements.png index 3cdb779d9..46d113099 100644 Binary files a/test/fixtures/screenshots/linux/mobile/about_page/achievements.png and b/test/fixtures/screenshots/linux/mobile/about_page/achievements.png differ diff --git a/test/fixtures/screenshots/linux/mobile/about_page/values.png b/test/fixtures/screenshots/linux/mobile/about_page/values.png index 3d6c76b8b..a0133e462 100644 Binary files a/test/fixtures/screenshots/linux/mobile/about_page/values.png and b/test/fixtures/screenshots/linux/mobile/about_page/values.png differ diff --git a/test/fixtures/screenshots/linux/mobile/about_us.png b/test/fixtures/screenshots/linux/mobile/about_us.png index 5ee6099e8..d08dd9fcf 100644 Binary files a/test/fixtures/screenshots/linux/mobile/about_us.png and b/test/fixtures/screenshots/linux/mobile/about_us.png differ diff --git a/test/fixtures/screenshots/linux/mobile/blog/index.png b/test/fixtures/screenshots/linux/mobile/blog/index.png index 09fd5162f..763cfcddc 100644 Binary files a/test/fixtures/screenshots/linux/mobile/blog/index.png and b/test/fixtures/screenshots/linux/mobile/blog/index.png differ diff --git a/test/fixtures/screenshots/linux/mobile/blog/index/_pagination.png b/test/fixtures/screenshots/linux/mobile/blog/index/_pagination.png index 06b88d01a..a26f48a41 100644 Binary files a/test/fixtures/screenshots/linux/mobile/blog/index/_pagination.png and b/test/fixtures/screenshots/linux/mobile/blog/index/_pagination.png differ diff --git a/test/fixtures/screenshots/linux/mobile/blog/post.png b/test/fixtures/screenshots/linux/mobile/blog/post.png index b2011cc1b..cb36272c5 100644 Binary files a/test/fixtures/screenshots/linux/mobile/blog/post.png and b/test/fixtures/screenshots/linux/mobile/blog/post.png differ diff --git a/test/fixtures/screenshots/linux/mobile/blog/special/code_highlight_post.png b/test/fixtures/screenshots/linux/mobile/blog/special/code_highlight_post.png index d6c609487..380a55bc6 100644 Binary files a/test/fixtures/screenshots/linux/mobile/blog/special/code_highlight_post.png and b/test/fixtures/screenshots/linux/mobile/blog/special/code_highlight_post.png differ diff --git a/test/fixtures/screenshots/linux/mobile/blog/special/codeblocks/text.png b/test/fixtures/screenshots/linux/mobile/blog/special/codeblocks/text.png index 446053a2c..4352f4db5 100644 Binary files a/test/fixtures/screenshots/linux/mobile/blog/special/codeblocks/text.png and b/test/fixtures/screenshots/linux/mobile/blog/special/codeblocks/text.png differ diff --git a/test/fixtures/screenshots/linux/mobile/careers.png b/test/fixtures/screenshots/linux/mobile/careers.png index 491655e54..0082536b9 100644 Binary files a/test/fixtures/screenshots/linux/mobile/careers.png and b/test/fixtures/screenshots/linux/mobile/careers.png differ diff --git a/test/fixtures/screenshots/linux/mobile/careers/junior-ruby-on-rails-developer.png b/test/fixtures/screenshots/linux/mobile/careers/junior-ruby-on-rails-developer.png index 149e94972..1032d8f24 100644 Binary files a/test/fixtures/screenshots/linux/mobile/careers/junior-ruby-on-rails-developer.png and b/test/fixtures/screenshots/linux/mobile/careers/junior-ruby-on-rails-developer.png differ diff --git a/test/fixtures/screenshots/linux/mobile/clients/single-full.png b/test/fixtures/screenshots/linux/mobile/clients/single-full.png index cdbcfbe1c..b62b6d126 100644 Binary files a/test/fixtures/screenshots/linux/mobile/clients/single-full.png and b/test/fixtures/screenshots/linux/mobile/clients/single-full.png differ diff --git a/test/fixtures/screenshots/linux/mobile/contact_us.png b/test/fixtures/screenshots/linux/mobile/contact_us.png index 82fac7045..60263f33e 100644 Binary files a/test/fixtures/screenshots/linux/mobile/contact_us.png and b/test/fixtures/screenshots/linux/mobile/contact_us.png differ diff --git a/test/fixtures/screenshots/linux/mobile/course/chapter.png b/test/fixtures/screenshots/linux/mobile/course/chapter.png index 2f86581ab..558644caa 100644 Binary files a/test/fixtures/screenshots/linux/mobile/course/chapter.png and b/test/fixtures/screenshots/linux/mobile/course/chapter.png differ diff --git a/test/fixtures/screenshots/linux/mobile/course/landing.png b/test/fixtures/screenshots/linux/mobile/course/landing.png index 2db161f08..3d591d061 100644 Binary files a/test/fixtures/screenshots/linux/mobile/course/landing.png and b/test/fixtures/screenshots/linux/mobile/course/landing.png differ diff --git a/test/fixtures/screenshots/linux/mobile/free_consultation.png b/test/fixtures/screenshots/linux/mobile/free_consultation.png index e74789b36..7b0fe912a 100644 Binary files a/test/fixtures/screenshots/linux/mobile/free_consultation.png and b/test/fixtures/screenshots/linux/mobile/free_consultation.png differ diff --git a/test/fixtures/screenshots/linux/mobile/nav/hamburger_menu/services.png b/test/fixtures/screenshots/linux/mobile/nav/hamburger_menu/services.png index 80dbe52c4..e09ee331f 100644 Binary files a/test/fixtures/screenshots/linux/mobile/nav/hamburger_menu/services.png and b/test/fixtures/screenshots/linux/mobile/nav/hamburger_menu/services.png differ diff --git a/test/fixtures/screenshots/linux/mobile/services.png b/test/fixtures/screenshots/linux/mobile/services.png index bab1f387c..29d327d5f 100644 Binary files a/test/fixtures/screenshots/linux/mobile/services.png and b/test/fixtures/screenshots/linux/mobile/services.png differ diff --git a/test/fixtures/screenshots/linux/mobile/services/fractional_cto.png b/test/fixtures/screenshots/linux/mobile/services/fractional_cto.png index c5fd4b242..ec82f13ad 100644 Binary files a/test/fixtures/screenshots/linux/mobile/services/fractional_cto.png and b/test/fixtures/screenshots/linux/mobile/services/fractional_cto.png differ diff --git a/test/fixtures/screenshots/linux/mobile/use_cases.png b/test/fixtures/screenshots/linux/mobile/use_cases.png index eb0b38234..e2af5a736 100644 Binary files a/test/fixtures/screenshots/linux/mobile/use_cases.png and b/test/fixtures/screenshots/linux/mobile/use_cases.png differ diff --git a/test/fixtures/screenshots/linux/mobile/use_cases/startup-mvp-prototyping-development.png b/test/fixtures/screenshots/linux/mobile/use_cases/startup-mvp-prototyping-development.png index c4f3bb1ab..628b02977 100644 Binary files a/test/fixtures/screenshots/linux/mobile/use_cases/startup-mvp-prototyping-development.png and b/test/fixtures/screenshots/linux/mobile/use_cases/startup-mvp-prototyping-development.png differ diff --git a/test/fixtures/screenshots/linux/mobile/vibe_code_rescue.png b/test/fixtures/screenshots/linux/mobile/vibe_code_rescue.png index 582794c4b..4351bb732 100644 Binary files a/test/fixtures/screenshots/linux/mobile/vibe_code_rescue.png and b/test/fixtures/screenshots/linux/mobile/vibe_code_rescue.png differ diff --git a/test/fixtures/screenshots/macos/desktop/course/landing.png b/test/fixtures/screenshots/macos/desktop/course/landing.png index 379ae199a..37ac8623d 100644 Binary files a/test/fixtures/screenshots/macos/desktop/course/landing.png and b/test/fixtures/screenshots/macos/desktop/course/landing.png differ diff --git a/test/system/desktop_site_test.rb b/test/system/desktop_site_test.rb index 66977a380..cd2908595 100644 --- a/test/system/desktop_site_test.rb +++ b/test/system/desktop_site_test.rb @@ -354,7 +354,7 @@ def test_course_landing_page_renders visit "/course/tech-for-non-technical-founders-2026/" within "h1" do - assert_text "From Idea to First Paying Customer" + assert_text "From Idea to First Paying Customer", normalize_ws: true end assert_text "Why this course exists" assert_text "Module map" diff --git a/test/system/mobile_site_test.rb b/test/system/mobile_site_test.rb index b9dc28106..711a38c74 100644 --- a/test/system/mobile_site_test.rb +++ b/test/system/mobile_site_test.rb @@ -61,7 +61,7 @@ def test_course_landing visit "/course/tech-for-non-technical-founders-2026/" within "h1" do - assert_text "From Idea to First Paying Customer" + assert_text "From Idea to First Paying Customer", normalize_ws: true end assert_stable_screenshot "course/landing", tolerance: 0.03, skip_area: %w[picture img] diff --git a/themes/beaver/assets/css/pages/course-list.css b/themes/beaver/assets/css/pages/course-list.css index 95dfd3b31..ce6495af5 100644 --- a/themes/beaver/assets/css/pages/course-list.css +++ b/themes/beaver/assets/css/pages/course-list.css @@ -19,6 +19,14 @@ letter-spacing: -0.03em; margin: 0 0 20px !important; } +/* item16 T2: reference-style gradient second line (ruby → purple) */ +.blog h1.course-title .course-title__grad { + display: block; + background: linear-gradient(90deg, #cc342d, #a855f7); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} .blog .post-content h2 { font-family: "Space Grotesk", system-ui, sans-serif; font-weight: 700; @@ -36,13 +44,28 @@ /* W1.5 full-bleed gray band around the Module map section (spec: white -> #FAFAFA -> white -> dark endcap island). The band re-applies the content grid; its H2 drops the section top margin - the band padding owns it. */ -.course-landing .course-band--gray { - background: #fafafa; +/* item16 T5: NOT-cover is now the page's single full-bleed contrast band - + dark, landing against the footer (modules moved back to white). */ +.course-landing .course-band--dark { + background: #0d1117; margin-top: 88px; padding: 72px 0 88px; + color: #d1d5db; } -.course-landing .course-band--gray > h2 { +.course-landing .course-band--dark > h2 { margin-top: 0; + color: #ffffff; +} +.course-landing .course-band--dark .scope-card { + background: #161b22; + border-color: #2d333b; +} +.course-landing .course-band--dark .scope-card h3.scope-card__title { + color: #ffffff; +} +.course-landing .course-band--dark .scope-card p, +.course-landing .course-band--dark .scope-residual { + color: #9ca3af; } /* Hero chips — 2+2 grid on phones instead of the lopsided 3+1 wrap. @@ -76,7 +99,7 @@ counter-numbered cards (01-05 in ruby). Copy untouched. */ .blog ul.mistake-list { display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; counter-reset: mistake; margin: 24px 0; @@ -123,15 +146,15 @@ border-radius: 16px; border: 1px solid #ececf0; box-shadow: 0 6px 24px rgba(26, 26, 46, 0.07); - padding: 28px 30px; - margin: 0 0 20px; + padding: 24px 26px; + margin: 0 0 16px; } .blog .module-card__head { display: grid; gap: 10px 40px; - padding-bottom: 20px; + padding-bottom: 16px; border-bottom: 1px solid #f1f2f4; - margin-bottom: 20px; + margin-bottom: 16px; } .blog .module-card__badge { display: block; @@ -180,7 +203,7 @@ list-style: none; } .blog ol.module-card__chapters > li { - padding: 7px 0; + padding: 5px 0; border-bottom: 1px solid #f5f6f7; font-size: 15px; line-height: 1.4; @@ -188,12 +211,24 @@ .blog ol.module-card__chapters > li:last-child { border-bottom: none; } +/* item16 T6: chapter titles read as body text, not a wall of links - + ruby is reserved for hover + the deliverable/badges (taste guardrail). + !important beats the global `a:not(.btn)...` link-color rule, the same + way the module headings beat the shared h3 divider rule above. */ +.blog ol.module-card__chapters > li a { + color: #1f2937 !important; + text-decoration: none; +} +.blog ol.module-card__chapters > li a:hover { + color: var(--color-ruby) !important; + text-decoration: underline; +} .blog .module-card__num { display: inline-block; min-width: 34px; font-family: "JetBrains Mono", ui-monospace, monospace; font-size: 13px; - color: var(--color-ruby); + color: #9ca3af; } .blog .module-card__optional { margin-left: 6px; @@ -344,13 +379,9 @@ section H2, keyed off the stable heading ids. W1.5 eyebrow economy: gray-400, ruby stays reserved for the hero-card eyebrow, CTAs, and the mistake numerals. */ -.blog h2#take-this-course-if::before, -.blog h2#who-built-this::before, .blog h2#why-this-course-exists::before, .blog h2#what-this-course-does-not-cover::before, -.blog h2#module-map::before, -.blog h2#going-further-after-first-paying-customer::before, -.blog h2#already-started-building::before { +.blog h2#module-map::before { display: block; font-family: system-ui, sans-serif; font-size: 12px; @@ -360,13 +391,9 @@ color: #9ca3af; margin-bottom: 6px; } -.blog h2#take-this-course-if::before { content: "Who it's for"; } -.blog h2#who-built-this::before { content: "The team"; } .blog h2#why-this-course-exists::before { content: "The problem"; } .blog h2#what-this-course-does-not-cover::before { content: "Scope"; } .blog h2#module-map::before { content: "The syllabus"; } -.blog h2#going-further-after-first-paying-customer::before { content: "After module 5"; } -.blog h2#already-started-building::before { content: "Side path"; } /* V2.1 Mid-page CTA card — the 6th cell of the mistakes grid: dark inverted door to the module map. No counter, no ✗. */ @@ -512,10 +539,28 @@ color: #ffffff; margin: 0 0 18px; } -.course-landing .course-window__meta { +/* item16 T4: reference-style labeled stat cells replace the meta line */ +.course-landing .course-window__stats { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; + border-top: 1px solid rgba(255, 255, 255, 0.12); + padding-top: 14px; +} +.course-landing .course-window__stat-label { font-family: "JetBrains Mono", ui-monospace, monospace; - font-size: 14px; - color: #d1d5db; + font-size: 11px; + font-weight: 600; + letter-spacing: 0.14em; + text-transform: uppercase; + color: #9ca3af; + margin: 0 0 4px; +} +.course-landing .course-window__stat-value { + font-family: "Space Grotesk", system-ui, sans-serif; + font-weight: 700; + font-size: 17px; + color: #ffffff; margin: 0; } .course-landing .course-window__leave { @@ -551,6 +596,12 @@ padding-left: 0; padding-right: 0; } +/* item16 T5: page ends on the full-bleed dark endcap - drop the wrapper's + bottom breathing room so the dark base meets the footer with no light + seam (the dark band + endcap own the bottom spacing now). */ +.course-landing.blog { + padding-bottom: 0; +} .course-landing .post-content, .course-landing .course-band { display: grid; @@ -570,26 +621,31 @@ max-width: 720px; } -/* W1.5 endcap island (spec §10) — the article is full width now, so the - endcap constrains itself: max-w 896, radius 24, ruby glow top-right - half off-card. */ +/* item16 T5: the endcap is no longer a floating island - it's the CTA + footer of the dark NOT-cover band, flush above and below so the page + ends on one continuous dark base into the global footer (panel Fork-A + ruling: drop the island, keep the bottom CTA). */ .course-landing .course-endcap { - width: min(896px, calc(100% - 48px)); + width: 100%; + margin: 0; + border-radius: 0; + padding: 8px 24px 72px; +} +.course-landing .course-endcap__promise, +.course-landing .course-endcap__cta, +.course-landing .course-endcap__share { + max-width: 640px; margin-left: auto; margin-right: auto; - margin-top: 96px; - margin-bottom: 48px; - border-radius: 24px; - padding: 56px 40px 48px; } .course-landing .course-endcap::before { - left: auto; - right: -160px; - top: -140px; - width: 400px; - height: 400px; - transform: none; - background: radial-gradient(closest-side, rgba(204, 52, 45, 0.25), transparent); + left: 50%; + right: auto; + top: -120px; + width: 520px; + height: 320px; + transform: translateX(-50%); + background: radial-gradient(closest-side, rgba(204, 52, 45, 0.22), transparent); } /* V1.4b Hero chips + CTA polish, converged on the demo-1 component spec