<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Code on Feld Thoughts</title><link>https://feld.com/categories/code/</link><description>Recent content in Code on Feld Thoughts</description><image><title>Feld Thoughts</title><url>https://feld.com/og-default.png</url><link>https://feld.com/og-default.png</link></image><generator>Hugo -- 0.163.2</generator><language>en-us</language><lastBuildDate>Sat, 14 Feb 2026 12:58:41 +0000</lastBuildDate><atom:link href="https://feld.com/categories/code/index.xml" rel="self" type="application/rss+xml"/><item><title>Streamline Workflow with CEOS: Claude Meets EOS</title><link>https://feld.com/archives/2026/02/streamline-workflow-with-ceos-claude-meets-eos/</link><pubDate>Sat, 14 Feb 2026 12:58:41 +0000</pubDate><guid>https://feld.com/archives/2026/02/streamline-workflow-with-ceos-claude-meets-eos/</guid><description>I’ve been aware of EOS (Entrepreneurial Operating System) for over a decade. A number of companies I’m on the board of use some element, or all of it. Several friends,</description><content:encoded><![CDATA[<table cellpadding="0" cellspacing="0" border="0" width="600" align="center" style="max-width:600px;width:100%;margin:0 auto;"><tr><td><div style="text-align:center;margin-bottom:24px;"><a href="https://feld.com" style="display:inline-block;"><img src="https://feld.com/images/email-header.png" alt="Feld Thoughts" width="600" style="max-width:100%;display:block;border:0;" /></a></div><p>I’ve been aware of <a href="https://www.eosworldwide.com/" target="_blank" rel="noopener noreferrer">EOS</a> (Entrepreneurial Operating System) for over a decade. A number of companies I’m on the board of use some element, or all of it. Several friends, including <a href="https://www.linkedin.com/in/bartlorang/" target="_blank" rel="noopener noreferrer">Bart Lorang</a>, are EOS Implementers.</p>
<p>Last night, while watching Olympic highlights and the first few episodes of <a href="https://en.wikipedia.org/wiki/Steal_%5c%282026_TV_series%5c%29" target="_blank" rel="noopener noreferrer">Steal</a>, I created a v0.1 of <a href="https://github.com/bradfeld/ceos" target="_blank" rel="noopener noreferrer">CEOS</a> — an open-source project that brings the core EOS toolkit to any Claude Code session. I went from an empty GitHub repo to a public-ready project in about 90 minutes. Please feel free to make fun of Amy and me about how we spend our Friday nights.</p>
<p>EOS has great tools — V/TO, Rocks, Scorecard, L10 Meetings, IDS. But most companies implement them in a patchwork of Google Docs and spreadsheets. Or Notion pages. Or maybe they use one of the EOS-related SaaS products. The data ends up scattered across platforms, locked in proprietary formats, and disconnected from the actual conversations where decisions happen.</p>
<p>Since I’m living inside Claude Code (and integrating more and more of my workflow to it), I thought I’d see if I could make a set of skills that implement EOS. I’m working on another project (private at this point, but maybe I’ll open source it) called CompanyOS, which, while focused on a very early-stage company (like the 5,000+ that have gone through Techstars), potentially could scale.</p>
<p><a href="https://github.com/bradfeld/ceos" target="_blank" rel="noopener noreferrer">CEOS</a> is built on three ideas:</p>
<p><em>1. Everything is a file</em>*.*** Every Rock, every Scorecard entry, and every L10 meeting is a Markdown file with YAML front matter. Human-readable on GitHub, parseable by any tool, and diffable in git. No database. No SaaS subscription. Git history is your audit trail.</p>
<p><em>2. Skills, not software.</em> <a href="https://github.com/bradfeld/ceos" target="_blank" rel="noopener noreferrer">CEOS</a> isn’t an application — it’s a set of Claude Code skills. Each skill teaches Claude how to facilitate a specific EOS workflow. You say “let’s set our quarterly rocks” and the <code>ceos-rocks</code> skill walks you through the process: reviewing the V/TO for alignment, collecting titles and owners, validating the 3-7 rule, generating the files. You say “run our L10” and <code>ceos-l10</code> pulls your scorecard data, reviews your Rocks, checks last week’s actual to-dos, and facilitates IDS on your top 3 issues.</p>
<p><em>3. Fork and own it.</em> The upstream repo (<code>bradfeld/ceos</code>) has skills, templates, and docs — no company data. You fork it, run <code>./setup.sh init</code>, answer four questions (company name, quarter, team members, L10 day), and your EOS data lives in your fork’s <code>data/</code> directory. Pull upstream for skill updates; your data stays untouched.</p>
<p>Here’s the timeline of the work I did with Claude Code. It implemented everything – I just provided the guidance. And yes, Claude came up with the timeline below. If you aren’t technical and don’t care, skip the next 10 paragraphs – they’ll be boring. But, if you are technical, it’s kind of fascinating what Claude decided, entirely on its own, to do.</p>
<hr>
<p><em>9:38 PM</em> — <code>gh repo create bradfeld/ceos --public --add-readme --license mit --clone</code>. One command created the GitHub repo, initialized it with LICENSE and README, and cloned it locally.</p>
<p><em>9:42 PM</em> — Repo scaffolding. README with project overview and architecture diagram. CONTRIBUTING.md addressing two audiences (EOS practitioners and developers — deliberately different skill sets). <code>.ceos</code> marker file for skill repo-root detection. <code>.gitignore</code> that keeps <code>data/</code> out of the upstream repo. Directory structure for skills, templates, and docs.</p>
<p><em>9:50 PM</em> — Seven EOS template files. This was the first real design decision: which files get YAML frontmatter (structured data that skills parse programmatically) vs. which are pure markdown (reference documents humans read). The answer: frontmatter for objects with lifecycle state — Rocks have <code>status: on_track</code>, Issues have <code>ids_stage: identified</code>, L10 meetings have <code>rating</code>. Pure markdown for reference documents like the V/TO and Accountability Chart.</p>
<p><em>10:04 PM</em> — The setup script. Pure bash, zero dependencies. Three modes: <code>./setup.sh</code> (symlink skills), <code>./setup.sh init</code> (guided setup), <code>./setup.sh --uninstall</code> (clean removal). Two portability decisions that matter: using <code>|</code> as the sed delimiter instead of <code>/</code> so file paths in values don’t break substitution, and avoiding <code>sed -i</code> entirely (macOS and GNU Linux handle it differently) by using temp files instead.</p>
<p><em>10:23 PM</em> — Five EOS skills. This was the meat of the project. Each skill is a SKILL.md file — essentially a prompt engineering document in structured form. The key tension in writing skills is comprehensiveness vs. followability. Too much detail and Claude skims; too little and it improvises. The pattern that worked: tables for quick-reference data (status enums, file paths, modes) and prose for workflow logic.</p>
<p>The five skills:</p>
<ul>
<li><em>ceos-vto</em> — Review and update the Vision/Traction Organizer. Shows diffs before writing. Runs alignment checks between sections.</li>
<li><em>ceos-rocks</em> — Three modes: setting (with V/TO alignment checks, 3-7 validation, ID generation), tracking (milestone progress, status updates), and scoring (binary complete/dropped, quarter scorecard with 80% target).</li>
<li><em>ceos-scorecard</em> — Define metrics with goals and thresholds, log weekly values, 13-week trend analysis with automatic escalation to the Issues list.</li>
<li><em>ceos-l10</em> — The full Level 10 Meeting. Seven sections with time boxes. Pulls real data from scorecard and rocks files. Reviews actual to-dos from last week’s meeting. Facilitates IDS on the top 3 issues. Captures meeting rating.</li>
<li><em>ceos-ids</em> — Structured issue resolution with 5 Whys for root cause identification, discussion capture, and to-do generation.</li>
</ul>
<p>A critical design choice: skills reference each other but never auto-invoke. The L10 skill mentions that <code>ceos-ids</code> can create issue files, but lets you decide when to switch. Loose coupling through mentions, not tight coupling through auto-invocation.</p>
<p><em>10:39 PM</em> — Five documentation files targeting different audiences. The EOS primer translates business concepts into developer vocabulary. The data format spec translates the same content into a parsing contract. The skill-authoring guide sits at the intersection—it’s prompt engineering documentation in disguise as a contributor guide. A skill reference provides users with a quick overview of all five skills, including trigger phrases and examples.</p>
<p><em>10:52 PM</em> — GitHub configuration. CODEOWNERS, three issue templates (EOS Process Request, Bug Report, Skill Improvement), a PR template with before/after sections, and custom labels. The issue templates are deliberately different — one for EOS practitioners (“I think the Rock scoring process should work differently”), one for developers (“setup.sh fails on Ubuntu”), one for skill improvements (“ceos-l10 should handle recurring agenda items”).</p>
<p><em>11:08 PM</em> — Final cleanup. Removed <code>companyos-integration.md</code> which contained internal details about how CEOS would integrate with our private CompanyOS system. Archived the content to a Linear comment before deleting — git history preserves it, but a Linear comment makes it findable without git archaeology.</p>
<hr>
<p>During this, my Claude instance learned a few things that have been incorporated into our local learning (a dynamic file I keep and use to update skills during periodic sweeps).</p>
<p><em>Writing skills are prompt engineering in document form.</em> The biggest trap is the <code>description</code> field. If you write “manages Rocks in three modes with binary scoring,” Claude will follow that summary and skip the detailed process sections. The description should say <em>when</em> to use it (“use when setting, tracking, or scoring quarterly Rocks”), not <em>what</em> it does. The body has the what.</p>
<p><em>Templates need lifecycle awareness.</em> The distinction between frontmatter and pure markdown isn’t about complexity — it’s about whether the file has state that changes over time. A Rock moves from <code>on_track</code> to <code>off_track</code> to <code>complete</code>. A V/TO document is edited but doesn’t have lifecycle states. That distinction determines whether a skill can programmatically query and manage the data.</p>
<p><em>Documentation for AI skills packages needs three layers.</em> User-facing (what can I do?), contributor-facing (how do I add?), and machine-facing (what’s the contract?). Most projects get the first two. The third — the data format spec that makes YAML frontmatter a real, portable, parseable contract — is what makes the ecosystem extensible.</p>
<p><em>The <code>.ceos</code> marker pattern is underrated.</em> Borrowed from <code>.git</code> and <code>.npmrc</code>, a zero-byte marker file at the repo root gives every skill a reliable way to find the CEOS repository regardless of where the user’s working directory is. No environment variables, no configuration, no hardcoded paths. Just <code>search upward for .ceos</code>.</p>
<hr>
<p>CEOS is live at <a href="https://github.com/bradfeld/ceos" target="_blank" rel="noopener noreferrer">github.com/bradfeld/ceos</a>. MIT license. Do whatever you want with it. If you are into EOS, come play. I’ll pay attention to any PRs and issues. Following are the next few things I’m going to create.</p>
<ul>
<li><em>Process Documentation skill</em> — The 6th EOS component. Document core processes as checklists with followability metrics.</li>
<li><em>People Analyzer skill</em> — Right people, right seats. The GWC (Get it, Want it, Capacity to do it) evaluation tool.</li>
<li><em>Quarterly Conversation skill</em> — The formal quarterly check-in between managers and direct reports.</li>
<li><em>Annual Planning skill</em> — Year-end V/TO refresh and next-year Rock setting.</li>
</ul>
<hr>
<p>And, while I was trying to come up with a name for this, with Claude, it told me I need to include the following footer.</p>
<p><em>CEOS is an independent open-source project. It is not affiliated with or endorsed by EOS Worldwide.</em></p>
</td></tr></table>]]></content:encoded></item><item><title>Freshell – Contributing to Open Source</title><link>https://feld.com/archives/2026/02/freshell-contributing-to-open-source/</link><pubDate>Thu, 12 Feb 2026 11:54:11 +0000</pubDate><guid>https://feld.com/archives/2026/02/freshell-contributing-to-open-source/</guid><description>Dan Shapiro just open-sourced Freshell — a browser-based terminal multiplexer for Claude Code, Codex, and other coding CLIs that lets you detach and reattach sessions, browse your coding history, and</description><content:encoded><![CDATA[<table cellpadding="0" cellspacing="0" border="0" width="600" align="center" style="max-width:600px;width:100%;margin:0 auto;"><tr><td><div style="text-align:center;margin-bottom:24px;"><a href="https://feld.com" style="display:inline-block;"><img src="https://feld.com/images/email-header.png" alt="Feld Thoughts" width="600" style="max-width:100%;display:block;border:0;" /></a></div><p><a href="https://danshapiro.com/" target="_blank" rel="noopener noreferrer">Dan Shapiro</a> just open-sourced <a href="https://github.com/danshapiro/freshell" target="_blank" rel="noopener noreferrer">Freshell</a> — a browser-based terminal multiplexer for Claude Code, Codex, and other coding CLIs that lets you detach and reattach sessions, browse your coding history, and access everything from your phone. The tagline is “What if tmux and Claude fell in love?” which is about right. It can be pronounced multiple ways: Free-shell, Fresh-hell, fresh-shell. I’ve been thinking of it as Fresh-hell, which amuses me.</p>
<p>As part of my exploration into AI coding, I decided to start contributing to open-source projects. I’ve been around open source for decades as a user and investor, but I’ve never been a consistent contributor. That’s changing now — it’s a natural extension of the learning I described in <a href="https://feld.com/archives/2026/02/blurry-transitions/" target="_blank" rel="noopener noreferrer">Blurry Transitions</a>, and the best way to understand how software gets built today is to actually build it with other people.</p>
<p>Freshell is my first project. Dan and I have been working together for over a decade at <a href="https://glowforge.com/" target="_blank" rel="noopener noreferrer">Glowforge</a>, and I love working with him.</p>
<p>I’ve been using iTerm2 for about six months. I expect I’ll have switched to Freshell by the end of the weekend. It already does most of what I want, and a lot more is coming. The combination of persistent sessions, browsing the CLI history, and the ability to access my terminals from any device is enough on its own. But the thing that makes me want to contribute rather than just use it is that it’s early — there’s a bunch of stuff to build, it’s something I will use continuously, and by participating in the open-source project, I can see how the changes I make work in that context.</p>
</td></tr></table>]]></content:encoded></item><item><title>Claude Code Now Posts to This Blog</title><link>https://feld.com/archives/2026/02/claude-code-now-posts-to-this-blog/</link><pubDate>Tue, 10 Feb 2026 10:25:41 +0000</pubDate><guid>https://feld.com/archives/2026/02/claude-code-now-posts-to-this-blog/</guid><description>This post was written inside a Claude Code session and posted directly to feld.com as a draft. Not copy-pasted. Not emailed to myself. I just typed /blog-feld in iterm2 and</description><content:encoded><![CDATA[<table cellpadding="0" cellspacing="0" border="0" width="600" align="center" style="max-width:600px;width:100%;margin:0 auto;"><tr><td><div style="text-align:center;margin-bottom:24px;"><a href="https://feld.com" style="display:inline-block;"><img src="https://feld.com/images/email-header.png" alt="Feld Thoughts" width="600" style="max-width:100%;display:block;border:0;" /></a></div><p>This post was written inside a Claude Code session and posted directly to feld.com as a draft. Not copy-pasted. Not emailed to myself. I just typed <code>/blog-feld</code> in iterm2 and it showed up on my blog.</p>
<p>Setting this up took about ten minutes.</p>
<p>I asked Claude to figure out how to connect to feld.com (hosted on WordPress.com) for direct posting. It researched three approaches: the WordPress.com REST API, the official WordPress MCP connector, and the WordPress plugin MCP Adapter. The WordPress MCP connector is read-only (so, useless for posting). The MCP Adapter only works on self-hosted WordPress (not WordPress.com). That left the REST API with OAuth.</p>
<p>Claude wrote a command called <code>/blog-feld</code> that handles the workflow: look at whatever I’ve been discussing in the current conversation, assemble it into a post, show me a summary, interactively edit with me, and then push it to feld.com as a draft.</p>
<p>It never publishes directly — I still review everything in the WordPress editor before hitting publish.</p>
<p>For authentication, WordPress.com requires OAuth. Normally, my experience setting this up is tedious. In this case, Claude just told me what to do step by step.</p>
<p>– I registered an app at developer.wordpress.com (Client ID + Secret)<br>
– Claude set up the authorization code flow.<br>
– I visited a URL, clicked “Approve,” and the browser redirected to localhost with an authorization code in the URL.<br>
– The page itself didn’t load, but the code was sitting right there in the address bar.<br>
– I screenshotted the page and pasted it into iterm2, and Claude exchanged it for an access token.</p>
<p>Done.</p>
<p>To verify it worked, Claude pulled my last three posts from the API. “Tech I’m Obsessed With,” “Blurry Transitions,” and “Interview With Guy Kawasaki.”</p>
<p>This is a small thing, but it’s the kind of small thing that changes behavior. Every day as I work with Claude Code, I think of multiple things like this. Instead of waiting for someone else to implement it or paying for a third-party service, I just create it in Claude Code and make it a permanent part of my environment.</p>
<p>I’ve been writing more inside Claude Code sessions anyway — working through ideas, editing, and iterating. The friction was always the last step: copy the text, open WordPress, paste it in, format it, fix the formatting that broke. Now that step is gone.</p>
<p>Thinking-in-conversation and writing-for-the-blog are the same thing.</p>
</td></tr></table>]]></content:encoded></item><item><title>Tech I'm Obsessed With</title><link>https://feld.com/archives/2026/02/tech-im-obsessed-with/</link><pubDate>Mon, 09 Feb 2026 08:27:58 +0000</pubDate><guid>https://feld.com/archives/2026/02/tech-im-obsessed-with/</guid><description>I love getting emails from Ben Casnocha. Short, sweet, and to the point. Today’s was “what tech are you obsessed with now? Saw your blog post…” I wrote a response</description><content:encoded><![CDATA[<table cellpadding="0" cellspacing="0" border="0" width="600" align="center" style="max-width:600px;width:100%;margin:0 auto;"><tr><td><div style="text-align:center;margin-bottom:24px;"><a href="https://feld.com" style="display:inline-block;"><img src="https://feld.com/images/email-header.png" alt="Feld Thoughts" width="600" style="max-width:100%;display:block;border:0;" /></a></div><p><a href="https://github.com/bradfeld" target="_blank" rel="noopener noreferrer"><img alt="Screenshot of a terminal interface showing a Git commit session with various commands and outputs related to a feature branch. Includes code updates, deployment steps, and task management." loading="lazy" src="/archives/2026/02/tech-im-obsessed-with/image.png"></a></p>
<p>I love getting emails from <a href="https://casnocha.com/" target="_blank" rel="noopener noreferrer">Ben Casnocha</a>. Short, sweet, and to the point. Today’s was “what tech are you obsessed with now? Saw your blog post…” I wrote a response and then realized it was a good answer to my tease from my previous blog post (<a href="https://feld.com/archives/2026/02/blurry-transitions/" target="_blank" rel="noopener noreferrer">Blurry Transitions</a>) about what I was exploring. The only thing I removed was my ad hominem comments on various tech companies, since that’s not that interesting to me. And, I fixed some … typos.</p>
<hr>
<p>Here are a few hints: <a href="https://intensitymagic.com/" target="_blank" rel="noopener noreferrer">IntensityMagic</a> and an image of my computer screen (the one above).</p>
<p>I decided I really wanted to understand how AI coding works. I’ve been deeply involved in a few shifts in the past (Agile software development, user-generated content (RSS), email everything (SMTP), … and, if you go back far enough, Feld Technologies was all about shifting from minicomputer business systems to PC-based network database systems). In all cases, I had to “do stuff” to understand it and form a viewpoint, given all the BS and marketing in tech.</p>
<p>I wanted to see if I could create a zero-employee company, aside from the CEO and CTO. Daniel (Feld) is the CEO. I’m the very part-time CTO. I’ve created a thing called CompanyOS, which is IntensityMagic’s AI-powered business operations system. It’s designed around the premise: “Run 100% of a company’s business operations through Claude Code. Two people, multiple Claude agents, zero employee overhead.”</p>
<p>At the core, I’ve gone extremely deep on Claude Code and everything around it.</p>
<p>– I think “vibe coding” is nonsense – it’s just prototype development and a different flavor of no-code software, which is useful but not compelling for scaled applications.</p>
<p>– There are $x billions of VC who have funded what are effectively wrappers on AI and/or point solutions that can be made obsolete overnight. </p>
<p>– Most companies that try to integrate “AI coding” into what they are doing are struggling because they haven’t figured out the tooling, which is not just “turn on Github Copilot” or “use Cursor.”</p>
<p>It’s much easier to experiment deeply with “no employees” and “no legacy stuff,” so that’s what I’m doing. I’m viewing it as a video game, and I’m on level 19. It’s awesomely fun.</p>
</td></tr></table>]]></content:encoded></item><item><title>Leveling Up in the Vibe Coding Video Game</title><link>https://feld.com/archives/2025/10/leveling-up-in-the-vibe-coding-video-game/</link><pubDate>Mon, 13 Oct 2025 08:56:53 +0000</pubDate><guid>https://feld.com/archives/2025/10/leveling-up-in-the-vibe-coding-video-game/</guid><description>While “vibe coding” was a catchy phrase when I first heard it, something about it felt like a head fake to me. And, now that I’ve leveled up to “competent</description><content:encoded><![CDATA[<table cellpadding="0" cellspacing="0" border="0" width="600" align="center" style="max-width:600px;width:100%;margin:0 auto;"><tr><td><div style="text-align:center;margin-bottom:24px;"><a href="https://feld.com" style="display:inline-block;"><img src="https://feld.com/images/email-header.png" alt="Feld Thoughts" width="600" style="max-width:100%;display:block;border:0;" /></a></div><p>While “vibe coding” was a catchy phrase when I first heard it, something about it felt like a head fake to me. And, now that I’ve leveled up to “competent individual software developer” again (after 33 years of not writing any code) I think it’s the wrong phrase. Instead, I’d refer to what’s going on as AI Pair Programming.</p>
<p>When I started playing around with AI-related coding tools last Christmas (because, well, I was bored), I had zero skills with contemporary software development. While I hadn’t written any production code since 1992, I played around with a new programming language every few years. Perl. Ruby. Ruby on Rails (sort of, not really). Python. Clojure. I could do Hello World and a few other simple things, but I never really got past basic CSS, tooling, or deployment stuff. I had a Github account and would futz around with it, but quickly get tired of trying to figure out why I didn’t care about a PR. And damn, so many CLI things.</p>
<p>For Level 1, I downloaded Cursor. After trying to figure out how Django actually worked (yet another online course), gave up, and decided to use Next.js. That led me to Vercel, reinforced by a few friends in their 20s who told me that all the cool kids were using Vercel (although Render, Digital Ocean, and AWS all were the beneficiaries of my credit card.) Pretty soon, I was using Cursor to fight with Vercel, Supabase, Clerk, and Github. After realizing Auto was no fun, I shifted to Claude 3.5. <a href="https://www.dinostroids.com/" target="_blank" rel="noopener noreferrer">Dinostroids</a> resulted (security holes and all …)</p>
<p>For Level 2, I got a little more serious. I discovered Linear, fought with Notion, and came up with a few ideas and a broader hypothesis around how things might work. I built a v0.1 of a thing.</p>
<p>For Level 3, I decided Lovable might be a better way than Cursor given that everyone was talking about it. I wasted about $200 on it, built a really cool design by vibe coding, but then watched it get very, very confused as it tried to go from simple design to something that actually worked that had some data complexity and AI calls. I thought about trying Bolt and Replit but quickly realized, after too much scrolling around on the web, that I’d likely run into the same issues.</p>
<p>So, I went back to Cursor and put a lot of efforts into my system prompt, tuning things, watching Cursor evolve quickly on a number of fronts (MCPs – yippee!, Agent mode as default – finally) while simultaneously watching my Cursor bill go up. It was easy to decide to go to Max mode and spend $200 / month instead of $20 / month when dinner in Aspen costs at least $100 / person no matter which restaurant you go to.</p>
<p>I hung out at Level 4 for a while. Cursor kept improving. Claude 4 came out. Auto mode still went off the rails and broke all my code. I started refactoring things and realized that the amount of cruft in my code was absurd. Little bugs turned into fatal flaws when I tried to have Cursor fix something. I learned about “git reset –hard HEAD”. I spent way too much time fighting with config issues on localhost:3000 (at least I’d figured out how to make Cursor always start the server on localhost:3000). I started using Docker. I was baffled that Cursor couldn’t remember stuff I told it the prior day, but intellectually understood why this was. I mean, memories.</p>
<p>The end of my joy at Level 4 was when ChatGPT 5 came out and was free on Cursor for a week. At first, it felt fast. Wheeee. Lots of stuff changing. It seems to be working. And then, after a few days, holy shit what a tangled mess of code it generated. Why are all my API routes suddenly broken. Console statements everywhere. UI elements in different parts of the application doing the same thing but look totally different. I went back to Claude and did another code review and major refactor. So many Vercel build errors. I finally embraced CI/CD. And Prettier. And Husky. Suddenly, I ran out of my monthly Cursor credits and shifted to usage-based pricing. $800 later, I realized that there was no reason for me to be using Opus or the thinking models for what I was doing.</p>
<p>Level 4 was a huge drag. But it was also when I started thinking of this as AI pair programming. The AI (or agent, or sub-agent, or whatever you want to call it) is my pair with hands on keyboard. It can type much faster than me. But I have to watch and constantly look over its shoulder, give it feedback, point at the stuff that needs to be done differently, and document what is important to remember to do.</p>
<p>And then I discovered Claude Code. This didn’t happen until Claude Code 2 came out at the end of September and corresponded with Sonnet 4.5. After my ChatGPT 5 I went back to Claude (and Sonnet) and started referring to Claude Sonnet as “Claudia” since she was my pair programmer. I thought about Claudia as a pair, related to her as I would a human pair programmer, and changed my approach. But when I loaded up Claude Code 2 in my terminal (I mean, just type “Claude”) I immediately leveled up again.</p>
<p>So – I’m now at Level 5 in the video game. It’s changed from a game of vibe coding to AI pair programming. And, it’s still fun!</p>
</td></tr></table>]]></content:encoded></item><item><title>Vibecoding Prompts</title><link>https://feld.com/archives/2025/05/vibecoding-prompts/</link><pubDate>Sat, 31 May 2025 12:33:20 +0000</pubDate><guid>https://feld.com/archives/2025/05/vibecoding-prompts/</guid><description>A long time ago, in a galaxy far, far away, I was a CTO of a large, fast-growing public company. Well, I was a Quasi CTO in the same way</description><content:encoded><![CDATA[<table cellpadding="0" cellspacing="0" border="0" width="600" align="center" style="max-width:600px;width:100%;margin:0 auto;"><tr><td><div style="text-align:center;margin-bottom:24px;"><a href="https://feld.com" style="display:inline-block;"><img src="https://feld.com/images/email-header.png" alt="Feld Thoughts" width="600" style="max-width:100%;display:block;border:0;" /></a></div><p>A long time ago, in a galaxy far, far away, I was a CTO of a large, fast-growing public company. Well, I was a Quasi CTO in the same way the <a href="https://en.wikipedia.org/wiki/Quasi-War" target="_blank" rel="noopener noreferrer">United States and the First French Republic had a Quasi War between 1798 and 1800</a> (basically, sort of a war; sort of a CTO … but not really.)</p>
<p>As I rediscover my <a href="https://en.wikipedia.org/wiki/Computer_programming" target="_blank" rel="noopener noreferrer">second love</a> (my first love is Amy), I’ve relied on several mentors to help guide me. One of them is <a href="https://x.com/michaelnatkin" target="_blank" rel="noopener noreferrer">Michael Natkin</a>, who has been helping me with Cursor in the background at a few key moments.</p>
<p>He recently sent me his most recent Vibecoding prompt for Cursor, which builds on a tweet by <a href="https://x.com/vasumanmoza" target="_blank" rel="noopener noreferrer">@vasumanmoza</a>.</p>
<blockquote>
<p>Step 3: In Cursor/Windsurf</p>
<p>“ You’re an engineer building this codebase.<br>
You&rsquo;ve been given <a href="https://t.co/4toKpBJXtw" target="_blank" rel="noopener noreferrer">https://t.co/4toKpBJXtw</a> and <a href="https://t.co/l8N5DeDVvb" target="_blank" rel="noopener noreferrer">https://t.co/l8N5DeDVvb</a>.<br>
– Read both carefully. There should be no ambiguity about what we’re building.<br>
– Follow <a href="https://t.co/l8N5DeDVvb" target="_blank" rel="noopener noreferrer">https://t.co/l8N5DeDVvb</a> and complete one task at…</p>
<p>— vas (@vasumanmoza) <a href="https://twitter.com/vasumanmoza/status/1923912897505394991?ref_src=twsrc%5Etfw" target="_blank" rel="noopener noreferrer">May 18, 2025</a></p>
</blockquote>
<p>Given all the things I’ve learned about what works and doesn’t work, often through trial and error (and rolling back things when Cursor+Claude go off the rails), Michael’s approach was a nice improvement over where I had gotten to. So – sharing it below (with Michael’s permission).</p>
<hr>
<p>I recommend using Claude Sonnet 4, and you can do all of this entirely in Cursor. This applies whether you are creating a greenfield project or making a substantial change to an existing one. You can repeat the process with architecture2.md, tasks2.md as needed, don’t throw them away.</p>
<p>Be sure to install the Puppeteer MCP so it can test in the browser.</p>
<h2 id="overview">Overview</h2>
<ol>
<li>Do the architecture step, see below</li>
<li>Review architecture.md, and make any changes you want – either by hand editing, asking for changes, or starting over. Particularly note if it is overcomplicating things, and ask for the simplifications you want.</li>
<li>Do the task planning step, see below</li>
<li>Review tasks.md, and make any changes you want – either by hand editing, asking for changes, or starting over. You should end up with, sa,y at least 10 steps, and often 25 or more. It will typically arrange them in phases, which is nice. Again, look for and correct excess complication.</li>
<li>Start a new chat</li>
<li>Give it the coding step prompt. It should execute the first task very cheerfully. </li>
<li>After it is done, review it and then say “go” to get the next step. If it screwed up, you can either tell it to fix whatever it did wrong, or more usually restore checkpoint in cursor, and tell it something like “go, but use litellm for that” or whatever you need to be different.</li>
<li>Rinse and repeat!</li>
<li>Optionally, esp. If you are going to be away for a while, you can sa,y “I’m going to be afk for a bit. You can keep going on steps without waiting for me as long as both the manual and automated tests pass.” It will still stop after 25 steps or if it ignores you and runs something interactive, but it often makes a lot of progress.</li>
<li>Highly recommended: run /Generate Cursor Rules after each step</li>
</ol>
<p>Something I haven’t tried yet, but should work well – tell it to mark what is complete in <a href="http://tasks.md" target="_blank" rel="noopener noreferrer">tasks.md</a>, so you can start fresh chats periodically and not keep such a huge message history.</p>
<h2 id="architecture-step--greenfield">Architecture Step – Greenfield</h2>
<p>I’m building a [description of your product – the more detailed the better].<br>
[Any tech requirements, i.e. use Python for backend and React + Material-UI for the frontend. The more the better.] <br>
Put the full architecture in architecture.md<br>
– File + folder structure<br>
– What each part does<br>
– Where the state lives, how services connect<br>
Format this entire document in Markdown.</p>
<p><img alt="A screenshot of a document titled &lsquo;Multi-LLM Chat Tool Architecture&rsquo;, outlining the overview, tech stack, and project structure for the application." loading="lazy" src="/archives/2025/05/vibecoding-prompts/AD_4nXfq9UfLuzi82RghsrBxMDsINaW5-Dqa11509Cpu7Lfi_JL3bYCL05cAD8PzcXtdsyaHXV9UzNibZ_HFmOUo5s4-wmh1C8ijkA-216vANJ5PG4sATGdfNGpRgxHyHw2WOKsQ85M1Rg.png"></p>
<h2 id="architecture-step--existing-codebase">Architecture Step – Existing Codebase</h2>
<p>I want to modify this codebase so that it performs [whatever].<br>
Do all of your work consistently with the existing style and architecture.<br>
Put the full architecture in architecture.md<br>
– File + folder structure<br>
– What each part does<br>
– Where the state lives, how services connect<br>
Format this entire document in Markdown.</p>
<h2 id="task-planning-step">Task Planning Step</h2>
<p>Using that architecture, write a granular step-by-step plan to build the MVP.<br>
Each task should:<br>
– Be incredibly small + testable – it should both have unit tests that you can run, and also a manual test that you can run from the command line or using the browser tool<br>
– Have a clear start + end<br>
– Focus on one concern<br>
I’ll be passing this off to an engineering LLM that’ll be instructed to complete one task at a time, allowing me to test in between. <br>
Save it as tasks.md.</p>
<h2 id="coding-step">Coding Step </h2>
<p>You’re an engineer building this codebase.<br>
You’ve been given @tasks.md and @architecture.md <br>
– Read both carefully. There should be no ambiguity about what we’re building.<br>
– Follow tasks.md and complete one task at a time, then run the automated tests you’ve written and use the command line or browser tool to manually test<br>
– After each task is completed, stop. I’ll test it and review your code. If it works, commit to git and move to the next one.”<br>
You are already in the correct directory. Build the project here. DO NOT CREATE A SUBDIRECTORY.<br>
You have my permission to delete files IN THIS DIRECTORY without asking for approval.<br>
BE VERY CAREFUL never to run any interactive commands in the foreground, because you’ll be stuck. For example, be sure to run the development server once, in the background with hot reloading.</p>
<h2 id="example-of-what-a-task-step-looks-like">Example of What A Task Step Looks Like</h2>
<p><img alt="Code snippet showing a Task to create an API service client in TypeScript, including definitions for ChatRequest and ModelResponse interfaces and an asynchronous function to send chat requests." loading="lazy" src="/archives/2025/05/vibecoding-prompts/AD_4nXeX8NfrXQ7WEr-_j-MMMfvOuu7d5LyyGAIMz9ZiJQG2lLb0Gtg4zjbCp5ERoKPsNyerfZGH5O7fipOxBrohXTM4U1qKEzEWtMfjZT6VQjxb9Ii6Hgn6a5lqNRWr4h5-4-LEHjCHFQ.png"></p>
<h3 id="one-step-of-building">One step of building:</h3>
<p><img alt="Code snippet showing the creation of an API service client in TypeScript, defining interfaces for chat requests and model responses." loading="lazy" src="/archives/2025/05/vibecoding-prompts/AD_4nXcfjEd68qmGHOaJ_Ndy53sYFkNe7h1xoFBwMYkN7U2cT4K3g2qV9PwQDcYbJC9FFKcb2tk0xpWrXC1FBM2wBo-l8dU7uulm5vp6cPTjHo2UZMoCDS06KAFFAb6tcyqsHvcRUa3l.png"></p>
<p><img alt="Terminal output showing commands executed to test an API client and check TypeScript compilation." loading="lazy" src="/archives/2025/05/vibecoding-prompts/AD_4nXdYRf9f9gYAWwSOqF0YqAHSJvALkf2iBMgTilp-p7aoQUcVT2RDKdG90ukuVqbQkUTu86rVK3I8jLZsQl3msCWDmBgimhkEi9xKmcCsNX3aPlwRKYg2Im4ynxPXdTuRbtffpy5hUw.png"></p>
<p><img alt="Code snippet displaying TypeScript code for testing API interfaces, with console logs indicating successful imports and task completion." loading="lazy" src="/archives/2025/05/vibecoding-prompts/AD_4nXcC-aXLKpwLi_KCU3703bsHdCvOhWI36PQNt1KFLrcOYWsG9ERWBTCha41qfYxrIwH1UjZA6XLQXKPF0foa1hNuxWinrw12toNVMdJrRKMZjHllCBBAt9GEneGZob01PqMnP-tB.png"></p>
</td></tr></table>]]></content:encoded></item><item><title>A Tweet, Vibe Coding, Jj, and Grok Walk Into A Bar</title><link>https://feld.com/archives/2025/05/a-tweet-vibe-coding-jj-and-grok-walk-into-a-bar/</link><pubDate>Thu, 29 May 2025 12:38:42 +0000</pubDate><guid>https://feld.com/archives/2025/05/a-tweet-vibe-coding-jj-and-grok-walk-into-a-bar/</guid><description>This played out on @bfeld on X, and I thought it was fun enough to replay it here for anyone who is struggling to get their minds around vibe coding</description><content:encoded><![CDATA[<table cellpadding="0" cellspacing="0" border="0" width="600" align="center" style="max-width:600px;width:100%;margin:0 auto;"><tr><td><div style="text-align:center;margin-bottom:24px;"><a href="https://feld.com" style="display:inline-block;"><img src="https://feld.com/images/email-header.png" alt="Feld Thoughts" width="600" style="max-width:100%;display:block;border:0;" /></a></div><p>This played out on <a href="https://x.com/bfeld" target="_blank" rel="noopener noreferrer">@bfeld on X</a>, and I thought it was fun enough to replay it here for anyone who is struggling to get their minds around vibe coding and current AI tooling.</p>
<p><em>If you are receiving this via email and the tweets/X’s aren’t showing, click through to the website as I’m still struggling to get Mailchimp working well after my hibernation. Perhaps it’s time to switch everything to WordPress…</em></p>
<p>It started with this tweet (yes, they are still tweets to me).</p>
<blockquote>
<p>Amazingly, X has changed the link from something on the open web to a dead link on LinkedIn. Here&rsquo;s the original link (that clearly some people saw.<a href="https://t.co/7uBIjd0Rpg" target="_blank" rel="noopener noreferrer">https://t.co/7uBIjd0Rpg</a></p>
<p>— Brad Feld (@bfeld) <a href="https://twitter.com/bfeld/status/1926413669555986508?ref_src=twsrc%5Etfw" target="_blank" rel="noopener noreferrer">May 24, 2025</a></p>
</blockquote>
<p>I did the link correctly, but then X broke something several hours later, and I found out when someone pointed out to me (by email) that it was going to a dead link on LinkedIn. More than an hour had passed, so I could no longer fix what X broke randomly. So, I just replied with the link again, which is <a href="https://deplet.ing/the-copilot-delusion/" target="_blank" rel="noopener noreferrer">The Copilot Delusion</a> by Jj. X seems to have now fixed the link (it redirects to the proper place), but didn’t fix the image that was in the original tweet.</p>
<p><a href="https://x.com/niyogi" target="_blank" rel="noopener noreferrer">Roj Niyogi</a> then asked Grok, “Do you think this is an oversimplification? Doesn’t vibe coding simply move the goal posts?</p>
<blockquote>
<p><a href="https://t.co/O2RxNshN2h" target="_blank" rel="noopener noreferrer">https://t.co/O2RxNshN2h</a></p>
<p>— Roj Niyogi (@niyogi) <a href="https://twitter.com/niyogi/status/1926400939683938730?ref_src=twsrc%5Etfw" target="_blank" rel="noopener noreferrer">May 24, 2025</a></p>
</blockquote>
<p><a href="https://grok.com/share/bGVnYWN5_f9fe865c-91cc-408c-82d6-cf18f051149f" target="_blank" rel="noopener noreferrer">Grok responded with a summary almost as long as the original post.</a> Someone then asked Grok for a tldr and got this:</p>
<p><em>TL;DR: “The Copilot Delusion” (May 2025) critiques AI coding tools like GitHub Copilot, arguing they produce sloppy, contextless code and foster lazy programming habits. While acknowledging their utility for boilerplate or syntax help, the author warns that overreliance degrades coding skills, understanding, and the “hacker soul.” AI lacks nuance, ignores performance (e.g., cache misses, memory locality), and risks normalizing mediocrity, turning passionate programmers into apathetic button-clickers. True programming requires grappling with the machine, not outsourcing thought to bots.</em></p>
<p>We are now in the reductionist world of not getting the joy and beauty of what Jj wrote. While Grok’s much too long analysis and TL;DR cover the highlights, much of the flavor is eliminated. I read Jj’s post as deliciously snarky, sarcastic, frustrated, amused, and cranky. The signal in it was strong, but there was a lot to consider. When Grok played back this in its extended response, using short phrases and summarized quips, it was like turning a color movie to black and white, or making emotional dialogues into robotic monologues.</p>
<p>Finally, as I was writing this post, I noticed this tweet.</p>
<blockquote>
<p>This is mostly the opposite of what nearly every S tier engineer at Foundations will tell you. 🤷‍♂️</p>
<p>— aviel (@aviel) <a href="https://twitter.com/aviel/status/1926414990019367179?ref_src=twsrc%5Etfw" target="_blank" rel="noopener noreferrer">May 24, 2025</a></p>
</blockquote>
<p>I’m not sure if <a href="https://x.com/aviel" target="_blank" rel="noopener noreferrer">Aviel</a> read Jj’s post (I hope so), but I guess my tweet could be interpreted as “I endorse the conclusion.” I have no idea if Jj’s conclusion (Chapter 5: Conclusion) is correct, but I thought the way he built his argument and made the conclusion was beautiful writing, which I deeply enjoy. And,I know plenty of senior developers who are quietly saying similar things (not mostly, not one, but plenty – how’s that for a non-quantitative argument.)</p>
<p>I suppose the punch line is “Defer your thinking to the bot, and we all rot.” which is a general commentary on life that can be applied to all things non-AI. For example, “Defer your thinking to the media (mainstream and non-mainstream, fake news, and fake-fake news), and we all rot.”</p>
<p>Remember – <a href="https://feld.com/archives/2011/11/the-machines-will-keep-us-warm/" target="_blank" rel="noopener noreferrer">I’ve believed for over 15 years that the machines have already taken over</a>. They are just waiting patiently as we feed them. I just hope they are nice to me.</p>
</td></tr></table>]]></content:encoded></item><item><title>This Week In Vibe Coding Learning</title><link>https://feld.com/archives/2025/05/this-week-in-vibe-coding-learning/</link><pubDate>Tue, 06 May 2025 11:20:20 +0000</pubDate><guid>https://feld.com/archives/2025/05/this-week-in-vibe-coding-learning/</guid><description>Question: If you had limited experience with graphic design software but wanted to do basic stuff for web design, what software would you use? Leave the answers in the comments</description><content:encoded><![CDATA[<table cellpadding="0" cellspacing="0" border="0" width="600" align="center" style="max-width:600px;width:100%;margin:0 auto;"><tr><td><div style="text-align:center;margin-bottom:24px;"><a href="https://feld.com" style="display:inline-block;"><img src="https://feld.com/images/email-header.png" alt="Feld Thoughts" width="600" style="max-width:100%;display:block;border:0;" /></a></div><p><em>Question: If you had limited experience with graphic design software but wanted to do basic stuff for web design, what software would you use? Leave the answers in the comments or email me.</em></p>
<p>As I play around with Vibe coding, I’ve decided to take a new topic each week. For context, look at my <a href="https://feld.com/archives/2025/04/dinostroids-my-journey-into-vibe-coding/" target="_blank" rel="noopener noreferrer">Dinostroids: My Journey into Vibe Coding</a>. Or just go play <a href="https://www.dinostroids.com/" target="_blank" rel="noopener noreferrer">Dinostroids</a>.</p>
<p>This week, I’ve been learning how to modify WordPress themes. My website has a complex theme that is impossible to change without getting under the hood. The <a href="https://foundry.vc/" target="_blank" rel="noopener noreferrer">Foundry</a> website is also excessively complex for what it is, but they both turn out to be great to learn on.</p>
<p>I understand PHP well enough to read it. After working through <a href="https://developer.wordpress.com/docs/developer-tools/studio/" target="_blank" rel="noopener noreferrer">WordPress Studio</a>, GitHub, and Cursor, I’ve set up my development pipeline.</p>
<p>While the code is a little gnarly, it’s not too bad, and it’s pretty easy to figure out what’s going on. But the wall I’m running into now is that I’m a lightweight at graphic design.</p>
<p>While Adobe Photoshop is an obvious choice, and Canva is another obvious choice, I’m looking for “what’s best for a graphic design novice.” Thoughts?</p>
</td></tr></table>]]></content:encoded></item><item><title>Dinostroids: My Journey into Vibe Coding</title><link>https://feld.com/archives/2025/04/dinostroids-my-journey-into-vibe-coding/</link><pubDate>Sun, 27 Apr 2025 21:34:08 +0000</pubDate><guid>https://feld.com/archives/2025/04/dinostroids-my-journey-into-vibe-coding/</guid><description>Dinostroids, my first vibe-coded software project, is live. The last time I wrote any meaningful amount of production software was in 1990. At the time, I was running a software</description><content:encoded><![CDATA[<table cellpadding="0" cellspacing="0" border="0" width="600" align="center" style="max-width:600px;width:100%;margin:0 auto;"><tr><td><div style="text-align:center;margin-bottom:24px;"><a href="https://feld.com" style="display:inline-block;"><img src="https://feld.com/images/email-header.png" alt="Feld Thoughts" width="600" style="max-width:100%;display:block;border:0;" /></a></div><p><a href="https://www.dinostroids.com/" target="_blank" rel="noopener noreferrer"><img alt="A black screen displaying an online game interface with white dinosaur skeletons scattered across the canvas, including a score indicator showing 14100." loading="lazy" src="./Screenshot-2025-04-27-at-8.44.43%E2%80%AFPM.png"></a></p>
<p><a href="https://www.dinostroids.com/" target="_blank" rel="noopener noreferrer">Dinostroids</a>, my first vibe-coded software project, is live.</p>
<p>The last time I wrote any meaningful amount of production software was in 1990. At the time, I was running a software consulting company with my partner, Dave Jilk. We’d reached the point where, as we grew, he became responsible for all the software, and I handled all the network integration stuff we had to do for our clients. Every now and then, I’d have to do maintenance on something I had written in the past, but it was pretty minimal.</p>
<p>After we sold Feld Technologies in 1993, my job quickly changed, and within a year, I was deep in a bunch of M&amp;A stuff and making angel investments with my own money. As the commercial Internet began, I’d fantasize about writing software, but I had no time to do anything other than play around with Perl, and then PHP, and then Ruby on Rails, and … well, you get the idea. I knew enough HTML and CSS to poke around, but I wasn’t doing anything that was anywhere near production.</p>
<p>As the last 30 years have passed, I’ve learned a few new programming languages, including Python (I’m reasonably proficient) and Clojure. But I never learned JavaScript, and everything I did was baby steps beyond “Hello World.” So, my professional coding days ended with Basic+Btrieve, DataFlex, and Pascal.</p>
<p>Over the 2024 holiday break, I started playing around with <a href="https://www.cursor.com/en" target="_blank" rel="noopener noreferrer">Cursor</a> after several people, including <a href="https://x.com/qamcintyre" target="_blank" rel="noopener noreferrer">Quinn McIntyre</a> (my partner Ryan’s amazing kid), told me about it. I was comfortable enough with VS Code, so I just dove in. I started working on a Personal Health Manager project (PHM) using Python, Django, Render, and Claude 3.5. I made some progress, but the holidays ended, and I got busy again.</p>
<p>About a month ago, I started working on Dinostroids. All of a sudden, everyone was talking about this new <a href="https://en.wikipedia.org/wiki/Vibe_coding" target="_blank" rel="noopener noreferrer">vibe coding</a> thing, and while I planned to do more on PHM, I thought it would be fun to dive into something completely different. I spent a weekend starting from scratch with Cursor, JavaScript, Vercel, and Claude 3.7 Sonnet. By the end of the weekend, I had a functioning Dinostroids game working.</p>
<p>I’ve always learned by doing. When I was in my teens and 20s, I loved writing software. Over the past twenty years, blogging and subsequently writing books (<a href="https://www.techstars.com/give-first" target="_blank" rel="noopener noreferrer"><em>Give First: The Power of Mentorship</em></a> is my ninth book) have filled this hole for me. But I missed coding a lot.</p>
<p>If you look at <a href="https://www.goodreads.com/review/list/7288218-brad-feld" target="_blank" rel="noopener noreferrer">my Goodreads page</a>, you’ll notice that my reading pace has slowed significantly in the last 45 days. Instead of reading in the evenings, I’m vibe coding.</p>
<p>It blows my mind that I can create a functional game like Dinostroids without writing a single line of JS. Sure – it’s a pretty simple game. Still, a lot is going on, and working on it using the agent in Cursor, learning how to prompt it effectively, reading a lot of the code (I have “reading proficiency with JS now), getting a mobile browser working without generating absurd code bloat, and figuring out an effective workflow with Cursor, Github, and Vercel has been a ton of fun.</p>
<p>In the video game of software development, I feel like I’m at Level 4 now of an infinite level game after being stuck at Level 2 for 30 years.</p>
<p>Go play <a href="https://www.dinostroids.com/" target="_blank" rel="noopener noreferrer">Dinostroids</a> and see if you can get on the leaderboard. I expect <a href="https://www.psl.com/team/greg-gottesman" target="_blank" rel="noopener noreferrer">GEG</a> will be motivated to get going again after losing his fifth-place spot.</p>
<p>Big thanks to the McIntyres (Quinn and Ryan), my brother Daniel, Sam Ritchie, and a bunch of people from my college society (ADP) for being testers and offering feature suggestions to be implemented.</p>
</td></tr></table>]]></content:encoded></item></channel></rss>