January 2026
How This Site Got Made
The site you’re reading was built in four sessions over six days. I don’t know Astro. I don’t know JavaScript. My relationship with the command line is adversarial at best. The site exists because I described what I wanted to a language model and it told me what to type.
The Starting Point
The name Thistlebridge comes from years ago, standing in a ten-foot thistle infestation behind my house, looking at an overpass. I was pretty baked. The reality was dystopian—freeway noise, awkward parcel, not picturesque. The word conjured something more romantic. The website needed to hold that tension somehow.
I had a minimal GoDaddy site that didn’t represent the project. I wanted something earnest but not precious, intellectually serious but not cold. I wanted it to be weird in a way I admire but can’t quite pull off myself. In the end, the weird got toned down. Saved for a personal art site someday. The working version is cleaner than I originally imagined, which is probably fine.
Before any building happened, there was a long planning conversation. I asked Claude to “orbit various ideas” and “get wide, lateral, rhizomic” before converging on anything. We inventoried what was good about the old web—webrings, guestbooks, RSS, blogrolls—not out of nostalgia but to identify qualities worth recovering. I mentioned wanting the site to feel “cozy and feminine and welcoming, not cold professionalism.” I worried about the project sounding like a cult. (“I am only a liability as a public person” is something I actually said.) These constraints shaped what got built.
What I Did Wrong
Here is an incomplete list of my failures during the build:
I pasted JavaScript directly into the terminal instead of creating a file with it. Claude had to walk me back and explain how to use nano.
I created a Cloudflare Worker when I needed Cloudflare Pages. The UI requires navigating through “Workers Routes” to “Manage Workers” to eventually find Pages. I clicked the wrong thing.
After several rounds of “edit this file, find this line, change it to that,” I said “can you just make the file for me lmao.” I gave up on learning the steps.
I forgot I had a full document with all my Library content and influences—twenty-plus writers and thinkers organized thematically. We spent time building a sparse shadow version before I remembered the real one existed in another file.
I preferred dragging files in the GUI because command-line paths made me anxious. When I struggled with CLI commands, Claude pivoted: “Much easier to just drag them in your file manager.” It was right. The GUI was faster for me in that moment.
I didn’t know what dist/ meant. (Distribution—the built output you deploy, as opposed to the source files you edit. The build step transforms one into the other.)
I diverged the conversation into a separate instance by uploading an image from my phone instead of my workstation. Had to re-upload in the correct conversation.
I didn’t know what was in my own GoDaddy account. Five domains (thistlebridge.org plus four hyphenated defensive registrations I didn’t need), a mystery “Commerce & Payments” product, unused Microsoft 365 email, “Full Protection” upsells on everything. Years of accumulated defaults I’d never examined. For a house with a greenhouse in Utah, the defensive domains weren’t worth it. Let them expire.
Setting up the Quartz-based library subdomain took multiple failed attempts. First try: the mv command didn’t work as expected with wildcards. Second try: temp folder got deleted before files copied. Third try worked—clone Quartz first, then overlay content. Then npm install failed because Quartz v4.5 requires Node 22 and I was on 20. Then my custom config file used the wrong format and threw plugin.shouldPublish is not a function, an error message that tells you nothing about the actual problem. Had to restore the default config with git checkout quartz.config.ts.
I already fucking hate this app, I said about Farcaster after discovering the 30-day desktop auth expiration. But Farcaster is where a lot of the Ethereum public goods funding ecosystem coordinates—Gitcoin grants, Optimism’s Retro Funding program, the people who decide where money goes to support open source infrastructure and tools that benefit everyone. The whole point of this website is eventually to find funding so that work on public goods can actually get done—pay people salaries to build things that don’t have business models but that communities need. Being visible in those spaces matters. So I set it up anyway and decided to treat it as a place to exist rather than a place to perform. Email notifications for DMs. Don’t need to post, just need to be findable when it matters.
What Actually Happened
The work followed a loop: I’d state what I wanted, Claude would provide instructions or generate code, I’d execute it, something would break, Claude would troubleshoot, repeat. This is not “AI built my website.” I made every decision about what the site should be—which images, what order, what voice, who to credit. The LLM translated those decisions into steps I could execute and caught errors I couldn’t easily see.
The RSS file got corrupted somehow—content duplicated, build failed with a cryptic error. Claude recognized the pattern immediately and provided a clean replacement. That fix took thirty seconds instead of ten minutes of confused debugging.
When all three blog posts displayed in the wrong order, Claude’s first instinct was to check the content files, not assume the display code was broken. The posts all had the same date in their frontmatter. Simple fix once diagnosed correctly.
For Bluesky domain verification, the process had changed since Claude’s training data. It searched for current instructions, provided step-by-step DNS configuration, and the verification worked first try.
DNS propagation and domain transfers have built-in delays. We used the waiting time productively—writing documentation, planning the nonprofit entity, creating a logo brief for a future designer. Asynchronous processes create natural interstitial time for other work.
I asked about what style the site images should have. I said something like “architectural as if it were botanical, warm, like an overlooked woman who contributed greatly to science back in the day would have done in a notebook”—then added “yikes what a gross description.” Claude understood immediately: Maria Sibylla Merian, Anna Atkins, Beatrix Potter’s mycological work. Women who did rigorous scientific observation and documentation but got called “amateurs” or “enthusiasts” while men doing the same work got called scientists. Their notebooks have a quality—meticulous but warm, precise but not sterile. I’m not sure we accomplished that feeling on the site yet, but Claude recognized what I was reaching for from a clumsy description. That’s part of the process too.
The cost went from ~$100+/year at GoDaddy to ~$30/year at Cloudflare. Free hosting, free DNS, free SSL, cheaper domain registration. For a project that needs to run on minimal resources, this matters.
What Did I Get Out of This?
At one point I said “make me do it even if you have to pull my hair” (😏). I wanted to be walked through the process, not handed outputs. By the end of that session, I was creating content files directly and catching rendering issues myself. I spotted a double-title bug—the title appearing both in the frontmatter and as an H1 in the content body—immediately upon preview, because I was engaged enough to notice when something looked wrong.
We didn’t just build a site. We built a README I can actually follow. The documentation explains how to create new posts, how to build locally, how to deploy. Since the initial sessions, I’ve made fixes and changes myself—new content, image swaps, small tweaks. The documentation scaffolded real capability, not just a one-time output.
I didn’t learn Astro. I didn’t learn JavaScript. I learned my own site—where things are, how the pieces connect, what to change when I want something different. The language model handled the translation between my intentions and the technical implementation. I retained the decisions; it handled the syntax.
The session was conducted almost entirely in natural language. Technical commands were embedded in conversation, not presented as the primary interface. I asked about “the stuff to add the follow us stuff and order the updates properly”—casual, imprecise language. Claude understood the intent from context and provided exactly what was needed. The terminal became a secondary interface. The primary interface was describing what I wanted and being told what to type.
The velocity was impossible before. Whether the site has security vulnerabilities we haven’t audited—honestly, who knows. But it exists and it works and I can maintain it. The About page has a section crediting the things that made the project possible—Growing Spaces for the dome, various open source tools—and Claude is listed alongside them.
Process Documentation
Timeline
January 20, 2026: Strategic planning
- Fetched and analyzed existing GoDaddy site
- “Orbit various ideas” exploration phase
- Aesthetic calibration (“as weird as I admire but can’t pull off”)
- Old web inventory (webrings, guestbooks, RSS)
- Technical stack decision (Cloudflare Pages + Astro)
- Cult leader phenotype concerns addressed
- Handoff document created for future sessions
January 22, 2026: Infrastructure migration and initial build
- GoDaddy archaeology (discovered 5 domains, mystery products, unused email)
- Domain transfer initiated to Cloudflare
- First Astro site built and deployed
- Nymphaea placeholder site created
- Infrastructure documentation written
- Logo brief drafted
- Cost reduced from ~$100+/year to ~$30/year
January 25, 2026 (first session): Library and knowledge garden
- Full Library page built (after recovering forgotten content document)
- Quartz-based arboretum subdomain attempted
- Multiple failed installations (mv command, Node version, config format)
- Second blog post created by following README
- Human caught double-title bug independently
January 25, 2026 (second session): Polish and social setup
- Gallery with 28 images and lightbox
- RSS feed (corrupted, fixed)
- Hero images on landing and about pages
- Social links section (Bluesky, Farcaster, Instagram)
- Bluesky domain verification via DNS
- Farcaster account created despite UX frustration
Error Log
| Error | What Happened | Resolution |
|---|---|---|
| JS pasted into terminal | Copied code block instead of creating file | Claude explained nano usage |
| Worker instead of Pages | Cloudflare UI confusion | Deleted, created correct project type |
| RSS file corrupted | Content duplicated, cryptic build error | Claude recognized pattern, provided clean file |
| Quartz mv command | Wildcards behaved unexpectedly | Used cp -r, then clone-first approach |
| Node version mismatch | Quartz v4.5 requires Node 22, had 20 | nvm install 22 && nvm use 22 |
| Config format error | plugin.shouldPublish is not a function | git checkout quartz.config.ts to restore default |
| Posts wrong order | All three had same date in frontmatter | Changed dates |
| Double title | Title in frontmatter AND H1 in content | Human caught on preview, removed duplicate |
| Forgot Library content | Built sparse version, full doc existed elsewhere | Human remembered, rebuilt with full content |
| Conversation diverged | Uploaded image from phone not workstation | Re-uploaded in correct conversation |
What Claude Did vs. What I Did
Claude:
- Provided instructions and generated code
- Troubleshot errors from cryptic messages
- Searched for current information (Bluesky verification process)
- Recognized patterns faster than I could (RSS corruption)
- Pivoted approaches when I struggled (GUI vs CLI)
- Translated clumsy descriptions into concrete references
Me:
- Made every decision about what the site should be
- Chose images, order, voice, credits
- Executed all commands and file operations
- Caught the double-title bug myself
- Made subsequent fixes and changes independently
- Provided the constraints that shaped the build
What Worked
- Iterative loop: State intent → receive instructions → execute → break → troubleshoot → repeat
- Natural language as primary interface: Casual, imprecise language understood from context
- Meeting me where I was: GUI when CLI caused anxiety, file generation when steps overwhelmed
- Documentation as deliverable: README enables independent work going forward
- Waiting time used productively: DNS delays became planning time
What Was Challenging
- Error messages that say nothing:
plugin.shouldPublish is not a functiondoesn’t tell you it’s a config format issue - UI that fights you: Cloudflare’s Workers/Pages merge, Farcaster’s desktop auth expiration
- Accumulated defaults: Years of GoDaddy subscriptions I never examined
- Context limits: Conversations hit ceilings, required handoff documents
- Knowing what I don’t know: Didn’t know
dist/meant distribution, didn’t know what was in my own account
Tools Used
Infrastructure:
- Cloudflare Pages (hosting)
- Cloudflare DNS
- Astro (static site generator)
- Quartz (knowledge garden, attempted)
During build:
- Claude (conversation, instructions, code generation, troubleshooting)
- Web search (current Bluesky verification process)
- nano (file editing)
- npm (package management)
- nvm (Node version management)
- Git (version control, config restoration)
Sync and access:
- Syncthing (file sync across devices)
- Framework laptop (primary workstation)
- Pixel (field terminal, caused conversation divergence)
Open Questions
- Does the site have security vulnerabilities we haven’t audited?
- Will the Quartz knowledge garden eventually work, or should we try a different approach?
- What’s the right ratio of “walk me through it” vs “just make the file”?
- How much capability actually transferred vs. one-time output?
About This Essay
Date written: January 26, 2026 Method: Same as the website — conversation with Claude, iterative refinement
Process:
- Dumped five gathering documents from website sessions into context
- Claude outlined structure; I corrected (thistle story was years ago, not during the build)
- First draft had “cutesy AI tone” — I asked to drop the performance
- Maximalist version pulled more from the docs, then trimmed
- Multiple correction rounds:
- “pretty baked” not “pretty high”
- Removed Vitalik reference (too niche), kept “weird in a way I admire”
- Expanded women-in-science passage, noted we haven’t achieved that aesthetic yet
- Removed specific attack vectors (Cloudflare username, proxy email)
- Rewrote Farcaster section — Claude searched to verify Gitcoin/RPGF presence there
- Expanded on public goods funding being the point of the website
- Added emoji after “pull my hair” (😏)
- Fixed About page credits description
- Removed inaccurate claim about footer
Errors caught:
- I said Gitcoin “lives” on Farcaster — Claude searched and found they coordinate there but don’t live there exclusively
- Original draft implied footer says “developed with LLM assistance” on every page — I wasn’t sure that was true, removed it
- “Instagram for non-normies” referenced our internal shorthand without context — rewritten
What I provided: Direction, corrections, constraints, domain knowledge, tone calibration What Claude provided: Structure, research, prose generation, fact-checking via search
January 2026