/model coding-by-hand-again
Progression Through Unlearning
Every once in a while, I take a weekend off from childrearing, dog training, and general-adulting and go to a nearby Airbnb for the weekend and just code, John Carmack style . This weekend I stayed in what my wife called a “hellbnb” (hot, musty, and roaches for roommates, but hey—solid wifi!) and I (95%) finished https://mockingboard.design and got a WIP version of https://floating.is live. React, TypeScript, Tailwind and Mountain Dew. Good times were had by all.
I spent nearly every day for the past six months vibe coding my heart out. I learned a lot about LLM workflows, but actually wasn’t learning how to build the apps I was building. I decided going forward I’d split my time fifty-fifty on frameworks/fundamentals and the new-fangled AI stuff.
Is coding without Claude/Codex even useful still? Are we already on the vertical part of the AI acceleration graph? METR said a few months ago that AI task capacity is basically doubling every three months. That’s like Moore’s Law on crack.
I typed every single line of Mockingboard and floating.is. In a way, it’s regression to pre-AI days where we followed tutorials, except now the tutorial is accurate and it’s written by Claude on the fly.
Things I learned while working on Mockingboard and floating.is:
- React:
- useState pattern
(const [val, setVal] = useState())for managing component and app UI state - lots of js module style imports, both named and default.
- handling all state logic at the top level (in this case
src/pages/HomePage.tsx), passing state and handlers down into components and bubbling events back up through callback functions - basic React
tsxstructure with imports at the top thenexport function HomePage() {}and inside that towards the bottom,return ( )with HTML markup with{ }for ts expressions in the markup.
- useState pattern
- TypeScript:
- defining react props with
typeat the top of component files. - defining shared app-wide TypeScript types in
src/types.ts !as non-null assertion operator, saying don’t warn me about null here
- defining react props with
- Tailwind:
gridgrid-cols-2to create a two-column grid layoutgrid grid-cols-[300px_1fr]for a custom column with second column as remaining fraction- the
px-4 md:px-8pattern for setting mobile-first styles and then desktop hidden md:blockpattern for hiding things at mobile sizesmx-auto max-w-2xlpattern for centered contentmax-w-xl md:max-w-noneto set a mobile max width but none on wider widths
- git:
- worked on my Conventional Commits commit messages using project scopes and commit messages that don’t just say what was done, but also why it was done
- worked on my muscle memory for various git syntaxes:
git reset HEAD~1uncommits and unstages while keeping working tree changes.git reset --soft HEAD~1to undo commit but keep stagedgit reset --hard HEAD~1undo commit and delete from working treegit reset --cached <file>remove file from git tracking while keeping it locally- to add my current unstaged changes to two commits back:
git stashgit rebase -i HEAD~2- set commit
Atoedit git stash popgit add .git commit --amend --no-editgit rebase --continue