<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Workbench Notes by Karthik Gurumoorthy</title><link>https://karthikg.in/notes</link><atom:link href="https://karthikg.in/rss.xml" rel="self" type="application/rss+xml" /><description>Short notes about making software, noticing things, and wandering the web.</description><language>en-us</language><item><title># After the Drafting Room</title><link>https://karthikg.in/notes/after-the-drafting-room/</link><guid isPermaLink="false">urn:karthikg.in:note:01a039a8-12ed-737d-bec1-38ea48bd7fcd</guid><pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate><description>A workbench note from Tue Aug 25 2026.</description><content:encoded><![CDATA[<h1 id="after-the-drafting-room">After the Drafting Room</h1>
<p>I wired the bit after the Drafting Room.</p>
<p>The last note was about the room: the agent can sit there and poke at the writing, but it doesn’t publish. A draft leaving the room is still a draft.</p>
<p>Then I wanted the rest of it to happen without me babysitting a terminal.</p>
<p>So: I hit Prepare, and the text goes into Git as unpublished. I have to tick a box saying this exact version is okay to enter the public repo. Publish only flips <code>draft</code>. That’s the whole mutation.</p>
<p>If Bluesky is down, the note is still on karthikg.in. That felt like the important split.</p>
<p>Copies wait.</p>
<p>At Prepare, Webmentions and Bluesky are both off unless I say so. Nothing fires until Vercel has actually put that commit on production. The Action fetches the live URL, looks for the ObjectId, then talks to the rest of the web. One note, not a scan of the archive.</p>
<p>Bluesky uses a stable key so a retry doesn’t spawn a second post. The URL gets written back into the file, and a second deploy is what puts <code>u-syndication</code> on the page.</p>
<p>I keep almost typing “and then it’s done” and it isn’t, quite. There’s a second deployment. Whatever.</p>
<p>The last note already went through this. I think that’s funny. I wrote about not collapsing thinking into a publish button, then I automated the part after the button.</p>
<p>Still not one button. Just fewer steps I will forget.</p>
<p>I don’t know if this is the right amount of machinery for a site with four notes. It is the amount that meant I didn’t have to remember the CLI this time.</p>
]]></content:encoded></item><item><title>Building my personal site for the web I want in 2030</title><link>https://karthikg.in/notes/building-my-personal-site-for-the-web-i-want-in-2030/</link><guid isPermaLink="false">urn:karthikg.in:note:01a036e3-c69a-757c-9c83-6ae1712d24e5</guid><pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate><description>A workbench note from Tue Aug 25 2026.</description><content:encoded><![CDATA[<h1 id="building-my-personal-site-for-the-web-i-want-in-2030">Building my personal site for the web I want in 2030</h1>
<p>I have been rebuilding parts of this site around a simple question:</p>
<p>If I were designing a personal website for the web of 2030, what would I want to own?</p>
<p>Not a blockchain wallet. Not a social account. Not a profile inside somebody else’s network.</p>
<p>My answer, increasingly, is this domain.</p>
<p>karthikg.in should be the durable representation of me and the things I publish. Social networks, feeds, search engines and whatever comes after them should be ways of discovering or interacting with that material—not the place where its identity originates.</p>
<p>Some of this site already worked that way. Notes lived here first. RSS was generated from the same content. I could publish a note here and syndicate it to Bluesky. Webmentions gave the site a small connection to the wider independent web.</p>
<p>But there were cracks in the idea. A note’s identity was effectively its filename. Renaming it could change its URL. Projects mostly pointed elsewhere instead of having canonical pages here. My identity was repeated across several templates. Bluesky-specific rules and Webmention plumbing sat close to the content model. Incoming interactions lived with a provider.</p>
<p>So I started separating identity from location.</p>
<p>Every canonical object now has an immutable ID. A note has an identity independent of its slug. Its URL can evolve without changing what the object is. Old slugs can permanently redirect to the current location.</p>
<p>Projects now have first-party pages too. Neighborbook may run somewhere else, but there is a canonical object on karthikg.in describing it. The product URL is a location you can visit; it isn’t the project’s identity.</p>
<p>The site’s public facts now come from one structured Person object rather than being independently encoded in different pages.</p>
<p>The more important change, though, is one you mostly can’t see.</p>
<p>The site’s core no longer needs to know about Bluesky, RSS, Webmentions or microformats. It knows about people, notes, projects, identity and relationships. Protocols sit at the edges and translate those objects into whatever representation another part of the web understands.</p>
<p>RSS is a projection.</p>
<p>Microformats are a projection.</p>
<p>A Bluesky post is a syndicated copy.</p>
<p>A future ActivityPub representation could be another projection.</p>
<p>None of them need to become the source of truth.</p>
<p>There is also now the beginning of something that could eventually become a small personal knowledge graph. But I stopped there. There isn’t enough writing on this site yet to justify building the graph.</p>
<p>It would be easy to add relationship types, backlink indexes, JSON-LD, ActivityPub, agent-readable APIs and a dozen other things that sound like the future web. But architecture built ahead of actual meaning becomes its own kind of dependency.</p>
<p>So the next phase isn’t another protocol.</p>
<p>It’s writing.</p>
]]></content:encoded></item><item><title>Changing the Drafting Room</title><link>https://karthikg.in/notes/changing-the-drafting-room/</link><guid isPermaLink="false">urn:karthikg.in:note:01a0375d-cdc7-70cf-9e0c-a93a1e83c3b6</guid><pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate><description>A workbench note from Tue Aug 25 2026.</description><content:encoded><![CDATA[<h1 id="changing-the-drafting-room">Changing the Drafting Room</h1>
<p>I’ve been changing the Drafting Room on my site.</p>
<p>The first version was built around a fairly obvious idea: give an AI some notes, have a conversation, and eventually get better writing out of it.</p>
<p>That increasingly felt like the wrong goal.</p>
<p>I don’t particularly need another place where I can ask an AI to “make this better.” There are already plenty of those.</p>
<p>What I want is something closer to an editor sitting beside me while I work.</p>
<p>An editor who notices when there is something interesting buried in a paragraph. Who asks about the contradiction I casually skipped past. Who points out when a sentence sounds like me — and when I suddenly sound like I’m performing the role of Someone Who Writes On The Internet.</p>
<p>And importantly, one who doesn’t quietly fill the gaps.</p>
<p>So I changed the rules.</p>
<p>The Drafting Room is now explicitly constrained to the material I give it. It shouldn’t invent an experience, an opinion, a fact, certainty I don’t have, or a satisfying conclusion just because essays are supposed to have one.</p>
<p>It also shouldn’t turn my writing into an imitation of another writer.</p>
<p>There is a mode now that reflects on voice: what feels natural, what might be performed, and something worth experimenting with in the next revision.</p>
<p>I don’t think “my voice” is a style guide that can be discovered and frozen. I’d rather let it emerge from repeated writing — odd phrases, fragments, jokes, recurring obsessions, contradictions and all.</p>
<p>The other boundary is between private writing and published writing.</p>
<p>The Drafting Room is private. Details about work, family, places or other people can sometimes be exactly what makes a thought concrete.</p>
<p>But concrete doesn’t mean publishable.</p>
<p>The system can flag sensitive material, but it cannot declare something safe to publish. A draft leaving the room still lands as a draft. Publishing remains a separate human decision.</p>
<p>The more capable these systems become, the easier it is to collapse thinking → writing → editing → approving → publishing into one button.</p>
<p>I’m deliberately moving in the other direction.</p>
<p>The Drafting Room can help me think and challenge the writing. But it doesn’t get to decide what I believe, what my voice is, or what belongs on the public web.</p>
]]></content:encoded></item><item><title>First note, probably</title><link>https://karthikg.in/notes/first-note-probably/</link><guid isPermaLink="true">https://karthikg.in/notes/first-note-probably/</guid><pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate><description>I have never published a personal blog before. This is a deliberately rough first attempt.</description><content:encoded><![CDATA[<p>I have built plenty of websites. Writing something personal on one feels different.</p>
<p>This is my first attempt. I do not have a voice for it yet—or maybe I do, and I have not heard it often enough to recognize it.</p>
<h2 id="what-happened">what happened</h2>
<ul>
<li>I redrew this site.</li>
<li>The old version was tidy and professional.</li>
<li>It also felt a little too much like a résumé.</li>
<li>The new one has paper colours, red links, and a crooked drawing of a house.</li>
</ul>
<p>The projects are still here. So are the identity pieces: my domain, RSS, and links to other places I appear online. The change is mostly that the site now has room for things that are not finished.</p>
<h2 id="an-open-question">an open question</h2>
<p>I am not sure what belongs here yet.</p>
<p>Maybe notes about making small software. Things I noticed. Links worth keeping. A sentence that did not need to become an article.</p>
<p>I do not want a publishing schedule before I have a reason to publish.</p>
<h2 id="for-now">for now</h2>
<p>One rough note.</p>
<p>Then I can see what the next one wants to be.</p>
]]></content:encoded></item></channel></rss>