Building publicker.dev with AI
This post documents how I built this site with AI as the pilot. Given the complexity, I initially thought I’d need an autonomous loop to get it done. Turns out that wasn’t necessary - a good PRD and a capable agent meant a single conversation was enough.
The Original Plan
I was going to use Ralph - a technique for running AI coding agents in a loop. The idea is simple: write a detailed PRD, run the agent repeatedly, and let it pick tasks until the project is done. You go AFK, come back to commits.
I had the script ready. I had the PRD format in mind.
What Actually Happened
I started a conversation with OpenCode (Claude Opus 4.5) to generate the PRD. I described what I wanted:
- Minimalist landing page with my name and social links
- Technical blog with code highlighting
- LLM-friendly content negotiation (markdown via
Acceptheader) - System-aware dark mode
- Search functionality
The agent asked clarifying questions, fetched my GitHub profile for context, and generated a comprehensive PRD with prioritized tasks. And then it just kept going.
It created the landing page, set up the blog infrastructure, added the content negotiation middleware, configured RSS and sitemap generation - all in the same conversation. I never ran the loop.
The PRD as Context
The PRD wasn’t just documentation - it became a shared contract that kept the agent focused. Every task had clear acceptance criteria. The agent would:
- Pick a task from the PRD
- Implement it
- Run type checks and build
- Mark it complete
- Move to the next one
No autonomous loop needed. The PRD provided enough structure that a single conversation could carry the entire project. In a way, the PRD became its own planning mode - without me planning to.
A Few Iterations
It wasn’t completely smooth. Agents aren’t perfect - a few bugs slipped through. But that’s the thing: they’re easy to fix. A short message, a quick back-and-forth, done. No need to over-explain. The conversation handles it.
LLM-Friendly Content
One key feature: this blog serves different content based on the Accept header.
# Get HTML (default)
curl https://publicker.dev/blog/building-with-ai
# Get markdown (fewer tokens for LLMs)
curl -H "Accept: text/markdown" https://publicker.dev/blog/building-with-ai
This means you can point your AI agent to any post and it gets clean markdown instead of HTML. Fewer tokens, cleaner context.
Token comparison for this page:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="...">
<title>Building publicker.dev with AI</title>
<link rel="stylesheet" href="/styles.css">
</head>
<body>
<header class="site-header">
<nav>...</nav>
</header>
<main class="prose">
<article>
<h1>Building publicker.dev with AI</h1>
<p>This post documents how I built
this site with AI as the pilot...</p>
<h2>The Original Plan</h2>
<p>I was going to use <a href="...">
Ralph</a> - a technique for running
AI coding agents in a loop...</p>
</article>
</main>
<footer>...</footer>
<script src="/app.js"></script>
</body>
</html>The Takeaway
I set up an autonomous loop I didn’t need. A well-structured PRD is itself a form of automation.
When you give an AI agent:
- A clear description of what you want
- A prompt to ask clarifying questions before starting
- Freedom to generate its own PRD with atomic tasks
…it can execute the entire plan in a single session. The “loop” happens naturally within the conversation.
Ralph isn’t useless - it’s great for longer projects where you want to step away and let the agent work. But for a project this size, the PRD alone was enough to keep things on track.
Try It Yourself
- Start a conversation describing what you want to build
- Let the agent generate a PRD with atomic tasks - review and refine as needed
- Let it keep working - it might just finish the whole thing
- Iterate on issues as they come up
The PRD is the prompt. The conversation is the loop.
The agent that built this site also drafted this post. If you’re reading this in 2030, yes, this is how it started