Day 1 in retrospect: what I did, what the AIs did, what nearly broke me
Idea at 9:30 AM. Walk by 11. Lunch at 1. Live site by 5. This is the honest hour-by-hour record.
It’s 7:30 PM and Day 1 isn’t quite over yet, but it’s far enough along that I can see the shape of it. The site is live at 50by50.dev. The counter says Day 1 of 132. The first time the date math flips will be at midnight tonight and I’ll be asleep when it happens.
I already published the announcement post earlier today — that one’s the bet, the rules, the rhythm. The performance. This is the other thing. The journal. What actually happened in ten hours, in order, with the bumps left in.
~9:30 AM — An idea I needed to pressure-test before committing to
I was sitting with my coffee when the 50by50 frame clicked. Fifty websites by my fiftieth birthday in 132 days. Public bet. Real numbers. Build a factory, not a portfolio.
The thing about an idea like that is you can’t trust the first ten minutes of it. So I did what I do — I gave it to the AIs and made them argue with me.
First conversation: ChatGPT. I dumped the idea and asked it to flesh it out — the framing, the operating model, what could go wrong. Got back a long doc, roughly playbook-shaped, with a 132-day phased structure and warnings about niche traps.
Second conversation: Claude (a different session from the one I’d later use to actually build). Same dump, different angle. Came back with a strategy-memo framing — sharper on the why, more opinionated about TrustCore wiring, fewer tactical specifics.
Two big planning docs. Same thesis, different operating cadences, different ways of identifying the same failure modes. I had two paper plans and zero validation that I actually agreed with either one.
So I did the third thing: NotebookLM. Dropped both docs in, asked for an audio explainer. Two AI hosts in conversation walking through the whole bet. By 11:04 AM the m4a was on my phone.
~11:00 AM – 12:45 PM — A walk and a coach
I left the house with the podcast playing. Forty-one minutes of two synthetic voices explaining my own idea back to me. Some of it landed. Some of it sounded suspiciously like the kind of confidence-fluff that AI generates when you don’t push it hard enough. But the core — the factory framing, the kill-fast rule, the monetize-at-launch rule — held up against my own internal voice. That was the test.
Midway through the walk I had NotebookLM make me one more thing: a video, narrated like a coach trying to get me amped up about the bet. Listened to that too. It was simultaneously corny and effective. The coach voice told me to stop overthinking and start shipping. I rolled my eyes at it. I also kept walking.
By the time I got home around 12:45 PM I knew. The idea wasn’t going to dissolve under a walk’s worth of scrutiny. Which meant I owed it the work.
12:45 PM — Lunch
Leftovers from last night: filet, loaded baked potato, homemade mac and cheese. Yum.
Worth recording because the bet that comes next is real and the food was good and these are the days you remember.
~1:00 PM — Open a fresh Claude session and get to work
This is where the real build started, and where I want to be honest about the split.
I opened a new Claude conversation. Pasted the two planning docs. Told Claude to compare them and pitch me an integrated plan. The compare came back honest — flagged the tensions out loud (the playbook deferred monetization to Phase 4, the strategy memo said monetize at launch — couldn’t both be right). I picked monetize-at-launch and made it a rule.
By 12:44 PM (commit 7256684) the integrated MasterPlan was in a fresh GitHub repo with the foundation scaffolding around it. By 1:03 PM (commit 5a4c03d) four big decisions were locked: stack (Astro static + Next.js interactive + Tailwind), analytics (GA4 + Search Console), monetize-at-launch, and the ten-point Minimum Useful Launch Standard.
The one place I pushed back early: Claude had drafted TrustCore wiring as mandatory — every site must feed ASBCP / MemoryCore / DPO pipelines. I read that and said no. Focusing on TrustCore will be a blocker. Nice to have, not need to have. By 2:10 PM (commit 8e3d63a) the plan was updated to opportunistic. Claude saved that as a memory: in velocity sprints, don’t frame upstream integrations as launch gates. That feedback loop is going to matter for the next 131 days.
~2:30 PM — The domain that wasn’t
I wanted 50by50.com. Of course I did. It’s the name. I told Claude to check.
Squatter. Held since 2003. Listed at $2,495 on HugeDomains.
I sat with that number for about a minute. Twenty-five hundred dollars for what is — let’s be honest — a scaffolding site. A scoreboard for a sprint that nobody has watched yet. Not a brand asset, not a moat, just a public-facing counter. Two-thousand-five-hundred-dollar counter.
No.
I bought 50by50.dev for $15/year at Cloudflare Registrar instead. The first money decision of the sprint was a not decision, and it was the right one.
While we were at it, Claude noticed the matching .com for my company — TrustCoreSystems.com — is also held by a squatter on parking nameservers. Flagged for later. Filed.
~3:00 PM — The Beehiiv detour I’d take back
Here’s where I made a real mistake.
I had a Beehiiv account from another project. Beehiiv has a free tier. Beehiiv hosts the page, handles email capture, handles the subscriber list. Scaffolding doesn’t need to be perfect, I said. We’ll use Beehiiv now, swap to Astro later.
Set up a new publication. Connected 50by50.dev as the custom domain. DMARC, DKIM, SendGrid records — Entri pushed all seven DNS records into Cloudflare in one click. I was impressed at how smooth it was.
Then I looked at the result.
Some kind of stock landscape photo as a hero. “No posts found” in the latest section. A footer that said “Get the latest interviews delivered to your inbox” because I hadn’t bothered to customize the placeholder copy. It looked like every newsletter platform homepage from the last decade. Generic in a way that felt physically wrong.
I typed at Claude: “Man I just can’t get over how ugly this beehive site is. Please help me. Look at it.”
Claude’s response was honest. Some of what I was seeing was uncustomized defaults, fixable in thirty minutes. But Beehiiv’s design ceiling is genuinely lower than what we could do with Astro + Tailwind. And we were going to build the Astro template anyway for Week 1’s Calculator #2. “If we have to do it anyways and we have better control it is worth eating tomorrow.” That’s what I said.
The lesson is sitting right there: scaffolding does need to be good enough that I don’t recoil. If the scoreboard makes me wince every time I open it, the discipline mechanism breaks. The whole point of the scoreboard is that I want to show it to people. An ugly scoreboard isn’t scaffolding — it’s a different problem in a friendly hat.
~3:20 PM — Three hero images
While Claude was scaffolding the Astro project, I opened ChatGPT and generated a hero image. 3:22 PM — first attempt. It said “50 DAYS TO 50.” Wrong. I have 132 days.
3:25 PM — second attempt. Still wrong number somewhere.
I’d come back to this later.
4:00 – 4:45 PM — Football
Stepped away from the keyboard for forty-five minutes. Best forty-five minutes of the day, probably.
Commits show I’d been pushing right up to the break — Hub Astro scaffold at 4:07 PM (commit dae7c6f), podcast wired at 4:08 PM (commit a182192). Came back around 4:45 and did the 4:21 PM-stamped “raise public target to 50” commit (in the file, anyway — that decision was sitting there waiting for me when I got back). Then the 4:24 PM YAML-import build fix.
What Claude had done during the morning + this stretch:
- Scaffolded the entire Astro project structure
- Built the base layout, header, footer, the live day counter component
- Configured content collections for posts, podcasts, videos
- Wrote the homepage, about page, roadmap page
- Set up Tailwind 4 with a custom theme + dark color tokens
- Wrote 14 vitest tests for the date math (
dayOfSprint,daysRemaining) covering edge cases I hadn’t considered - Set up eslint, prettier, strict tsconfig, and an
npm run verifyscript gating lint + format + typecheck + tests - Added module docstrings to every source file per the TrustCore coding standards
What I’d done in the same window:
- Said “builder-scoreboard aesthetic, dark mode with mono fonts, no marketing gradients” once
- Approved each direction call
- Generated two failed hero images in ChatGPT
- Threw a football
The asymmetry isn’t a brag. It’s the new reality. The bottleneck has decisively shifted from “can I code this” to “do I know what I want.”
~4:54 PM — The third hero image
Back to ChatGPT. Third attempt — 4:54 PM, file saved. This one said “50 WEBSITES BY AGE 50” and put the actual 132-day counter inside a fake dashboard mockup on the laptop. Both numbers correct. That’s the version on the site now.
The earlier two attempts had said the wrong things and I almost shipped one of them. Claude pushed back when I first sent the wrong image: “The rest of the site is rigorously honest about Day N / 132. A marketing image that says something different undercuts the ‘real numbers, real lessons’ promise on the same page.” That push was worth the extra fifteen minutes.
By 5:00 PM (commit b64ca78) the hero was on the homepage, Astro had generated four responsive WebP variants from the 2.1MB PNG, and the site was visibly mine.
~5:06 PM — The roadmap infographic
NotebookLM made me one more visual asset: a 5-phase factory roadmap infographic. Saved to Downloads at 5:06 PM. I asked Claude to put it on the /roadmap page and also add a place to track traffic and revenue. Claude added per-site metrics fields to the YAML, computed aggregates, rendered tiles for visitors / revenue / qualified leads / email subscribers. All zeros to start, with a small caption: Honest about zeros — every number you see is real.
I liked that line. I didn’t write it. 5:12 PM (commit 5ce6136).
5:16 PM – 5:28 PM — The bug parade (twelve minutes that felt like an hour)
I asked Claude to wire up GitHub Actions so future commits would auto-deploy. The workflow went in at 5:16 PM (commit 0cef891). First run failed.
Bug 1: wrangler-action@v3 mishandling. Cloudflare returned a “no route for that URI” error against a project I’d literally created two hours earlier. Claude replaced the official Cloudflare action with direct npx wrangler@latest at 5:21 PM (commit cf2d0b8). Same error.
Bug 2: gh secret set --body - storing a literal hyphen. The auto-deploy kept failing with the routing error. Claude added a debug step at 5:23 PM (commit 1f65cd4) that printed the length and sha256 hash of the secrets at workflow runtime — not the values, just the proof-of-life. The length came back as 1. Both secrets. One character each. The sha256 matched printf '%s' "-" | sha256sum. Both my API token and account ID had been stored as a single hyphen character.
The --body - flag I’d used with gh CLI doesn’t mean “read from stdin.” It means “the body value is literally the character -.” A 53-character API token and a 32-character account ID, both replaced by a hyphen. GitHub Actions was masking every - in the workflow logs because the secret value was -. The whole mystery unraveled in about ten seconds once we saw the lengths.
Re-set the secrets properly (gh secret set NAME --body "actual-value"). Deploy succeeded. Debug step removed at 5:28 PM (commit 9ae179b).
Total elapsed time for that bug: twelve minutes by the clock. Felt like an hour because I’d burned three deploy attempts and started questioning Cloudflare’s documentation. The fix cost five seconds. The lesson cost zero — I just have to remember.
Bug 3: YAML import in static build. Earlier in the afternoon (~4:24 PM, commit 125c77c). The roadmap page worked locally because I was reading roadmap.yaml via fs.readFileSync. Astro’s static build doesn’t copy data files into the prerender output. Fix: import YAML via Vite’s ?raw query so the content gets bundled at build time. Five-minute fix.
Each bug was small. Together they were maybe 30–40 minutes. Not catastrophic. But also not zero, and they happened because I’d gotten ambitious about shipping auto-deploy on Day 1.
~6:00 PM — Handscript reality check
Somewhere in here we’d talked through what existing sites I had that could be sprinkled into Week 1 to boost the launch count. I sent Claude three: TrustCore Media (live news aggregator), AI-Directory (a Replit project from March), and Handscript (a font-from-handwriting product I’d been designing).
Claude’s read was honest and slightly harder than I wanted to hear:
- TrustCore Media — counts as a Week 1 launch if the curation is automated. (It is — automated daily pull from 14 sources.) Polish pass: analytics, Search Console, custom subdomain, footer cleanup.
- AI-Directory — park it. MasterPlan §11 explicitly warns against generic AI directories. The engineering is solid but the niche is wrong. Refactor as a niche vertical directory later if at all.
- Handscript — 111 KB of planning docs across six files. Zero code. Classic perfection trap. Defer to Week 3 with an aggressively scoped MVP (upload → Claude vision → fontforge → download; no memorial, no agent API, no Stripe).
That last one stung a little because I’d genuinely thought Handscript was further along. Pushed the planning docs to GitHub around 6:00 PM (pushedAt: 2026-05-11T22:32 UTC = 6:32 PM ET) so Claude could see them. Read the architecture doc. Realized the same thing Claude was saying. Filed Handscript for Week 3.
~6:30 PM — Lock the week
This is when the daily tracker came up. I wanted a day-by-day checklist visible on the site, updated at EOD as part of the close-of-day process. Claude proposed three structural options (content collection, single YAML, or reuse the reviews folder). I picked the content-collection option. Claude proposed a frontmatter schema (tasks, blockers, learnings, tomorrow’s plan, counted-launches counters). I said yes.
By 6:54 PM (commit 9bcc5bc) the whole thing was built and deployed:
/todayand/dailypages- Day 1’s entry with all 11 tasks checked off
- Day 2’s entry pre-populated with tomorrow’s tasks
playbooks/sop-close-of-day.mddocumenting the 10-minute EOD ritual- MasterPlan §10 updated to reflect Path C cadence + the locked Week 1 plan
roadmap.yamlupdated with TrustCore Media + Parent Care entries at their target subdomains
That commit closed out the planning work. Forty-five minutes from “I want a daily tracker” to live on the site.
7:00 PM — The subscribe form was broken
I clicked the subscribe button to check it. Got a 404. The SubscribeBlock had been POSTing to a guessed Beehiiv URL all day. Nobody had actually tested it because the page wasn’t real for most of the day.
I sent Claude the Beehiiv embed snippet. Claude swapped in the v3 widget loader, added the attribution script to the Hub’s <head>, deployed via the auto-deploy pipeline we’d just wired up. The widget renders in-place. It’s a white card on our dark page — visually jarring — but the form actually works now. Day 2 or 3 we’ll restyle.
7:12 PM — commit 8821121. Fix landed. Auto-deploy ran. Form live.
The fact that I caught this and we fixed it before dinner is the system working. The fact that I didn’t catch it until 7 PM is the system needing a launch QA checklist.
The AI/human split, honestly
I want to be specific about this because the question keeps coming up — and because Day 1 was the most AI-augmented work day I’ve had to date.
What the AIs did, hands-on:
- Morning ideation — ChatGPT and Claude (a different session) both produced long planning docs from the same raw idea. Different framings, complementary angles. NotebookLM turned both docs into an audio explainer + a coach-narrated video.
- Afternoon build — Claude (this session) wrote nearly all of the code: Astro scaffolding, every page, every component, every test, every config file. ~1,200 lines of TypeScript / Astro / CSS by the end of the day.
- Visual assets — ChatGPT generated all three hero image attempts. NotebookLM generated the roadmap infographic.
- API calls — Claude drove Cloudflare (DNS swaps, Pages projects, domain attach), GitHub (repo init, Actions secrets, workflow runs), and Beehiiv (probing endpoints).
- Bug diagnoses — the sha256-of-the-secrets trick that found the gh-CLI hyphen bug came from Claude, faster than I would have arrived at it.
- Drafting — including, embarrassingly, the first version of this post (the one with the hallucinated midnight-in-bed timeline).
What I did, hands-on:
- Had the idea
- Decided which framings to keep and which to drop
- Walked for an hour and a half to pressure-test the idea against my own gut before committing
- Made the visual judgment calls when something didn’t feel right
- Bought the domain in Cloudflare’s UI (auth is human-only)
- Signed up for the new Beehiiv account (Google SSO is human-only)
- Approved every commit, every deploy, every direction
- Made the hard scoping decisions (Path C, three launches in Week 1, Parent Care over Roof Storm, park AI-Directory, defer Handscript to Week 3 with an MVP chop)
- Pushed back when Claude proposed framings I didn’t agree with (TrustCore wiring mandatory → opportunistic)
- Provided the existing assets (TrustCore Media URL, Handscript planning docs, the podcast m4a)
- Threw a football
- Caught the broken subscribe form
- Caught the hallucinated timeline in the first version of this post
The pattern that emerged: I’m the architect and the customer. The AIs are contractors with infinite patience and fast hands. The good moments are when I make calls fast and clearly. The bad moments are when I either rubber-stamp an AI default (Beehiiv was almost that) or refuse to make a call at all.
What worked
- The verify gate.
npm run verifyruns lint + format + typecheck + tests. The GitHub Action runs it before every deploy. It caught the import-order issue today before it shipped. I will never not have this. - AI pushback. Claude told me AI-Directory failed the niche test, told me Handscript needed an MVP chop, told me the Beehiiv “scaffolding is good enough” argument was wrong once I started complaining about how it looked. None of that was sycophantic. All of it was right.
- Auto-deploy. Editing a markdown file, pushing, and seeing the change live ninety seconds later — that’s the workflow that has to compound for the next 131 days. It’s working.
- The walk. Best decision-validation tool I have. Forty minutes of synthetic-voice explainer on a quiet street did more to confirm the bet than another hour of staring at the doc would have.
What didn’t
- The Beehiiv detour. Maybe an hour of customization that ended in a complete eject. Should have started in Astro.
gh secret set --body -. Twelve minutes of confusion plus three failed deploys. Memorized now.- 111 KB of Handscript planning docs with zero code. Classic perfection trap. Caught.
- No launch QA checklist. The subscribe form was broken from the first deploy. Should have been the first thing I tested. Tomorrow I add “click every CTA end-to-end” to the launch SOP.
- My first attempt at this post. Fabricated a midnight-in-bed timeline that hadn’t happened yet. The version you’re reading is the rewrite. Lesson for me and for the AI: vlog-style writing doesn’t license fabricated timestamps. The vibe should come from honest specificity, not made-up specificity.
Tomorrow
Tuesday is the factory’s first real test. Two new sites (Calculator #2 and Parent Care Checklist) scaffolded side by side, plus TrustCore Media polish in parallel. If the template clones cleanly and we can spin up site #2 and #3 in a single day, the factory is real. If we can’t, I’m spending Wednesday rebuilding the template and the week shifts.
The site is live. The bet is public. The clock is ticking. I have dinner to make and a Tuesday morning to be sharp for.
See you in the daily log.
— Dave
Follow the build
One email a week. Real numbers, real lessons. No hype.
Unsubscribe in one click. No selling, no sharing.