{"version":"https://jsonfeed.org/version/1.1","title":"Rob Martinson","home_page_url":"https://robmartinson.me","feed_url":"https://robmartinson.me/api/feed.json","description":"Personal blog and projects by Rob Martinson — software developer, entrepreneur, car restorer, and maker.","items":[{"id":"https://robmartinson.me/x-2062885355439968740","url":"https://robmartinson.me/x-2062885355439968740","title":"I’ve been gradually migrating a few projects over to Grok Build via ACP as…","_content_markdown":"# I’ve been gradually migrating a few projects over to Grok Build via ACP as…\n\nI’ve been gradually migrating a few projects over to Grok Build via ACP as the primary pipeline.  Soo many things I love about the xai agents and models. Speed is refreshing!\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2062885355439968740) · Jun 5, 2026*\n","summary":"I’ve been gradually migrating a few projects over to Grok Build via ACP as the primary pipeline. Soo many things I love about the xai agents and models. Speed is refreshing! --- 𝕏 view original on x.com · Jun 5, 2026","date_published":"2026-06-05T13:12:49Z","date_modified":"2026-06-05T13:24:40.102322Z"},{"id":"https://robmartinson.me/x-2062602494434590736","url":"https://robmartinson.me/x-2062602494434590736","title":"HUGE improvements to Grok build.","_content_markdown":"# HUGE improvements to Grok build.\n\nHUGE improvements to Grok build. Man they are *cranking*! Long running tasks, really thorough and my favorite part is it is crazy fast. Love it!\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2062602494434590736) · Jun 4, 2026*\n","summary":"HUGE improvements to Grok build. Man they are cranking! Long running tasks, really thorough and my favorite part is it is crazy fast. Love it! --- 𝕏 view original on x.com · Jun 4, 2026","date_published":"2026-06-04T18:28:50Z","date_modified":"2026-06-04T18:54:40.082917Z"},{"id":"https://robmartinson.me/more-minormud-work","url":"https://robmartinson.me/more-minormud-work","title":"More MinorMUD work","_content_markdown":"# More MinorMUD work\n\n\n![Screenshot 2026-06-02 at 2.29.08 PM.png](/api/assets/01KT53WF1TYR7Z2B5682R6F1D3)\nWorking on a new game in the MinoMUD engine that is based in Spokane and spending some time polishing the iso rendering mobile app. \n\nYou can still switch back-and-forth between iso and terminal. Pretty fun learning about Godot, meshes, rendering and all of those things that Ive never worked with before. ","summary":"Working on a new game in the MinoMUD engine that is based in Spokane and spending some time polishing the iso rendering mobile app. You can still switch back-and-forth between iso and terminal. Pretty fun learning about Godot, meshes, rendering and all of those things that Ive never worked with before.","date_published":"2026-06-02T12:00:00Z","date_modified":"2026-06-03T12:50:48.465319Z","tags":["minormud"]},{"id":"https://robmartinson.me/titletools-workers","url":"https://robmartinson.me/titletools-workers","title":"TitleTools Workers","_content_markdown":"# TitleTools Workers\n\nThis is what it sounds like when we run a batch of 800 docs through TitleTools on our small local worker cluster.\n\n\u003cvideo src=\"/api/assets/01KSNR7E3886QG6TQ4WFZ2J44Z\" controls preload=\"metadata\"\u003e\u003c/video\u003e\n","summary":"This is what it sounds like when we run a batch of 800 docs through TitleTools on our small local worker cluster.","date_published":"2026-05-26T12:00:00Z","date_modified":"2026-05-27T22:18:19.147375Z","tags":["titletools.io"]},{"id":"https://robmartinson.me/x-2057564719402438865","url":"https://robmartinson.me/x-2057564719402438865","title":"@wesbos Crazy fast and generally works well.","_content_markdown":"# @wesbos Crazy fast and generally works well.\n\n@wesbos Crazy fast and generally works well. They are shipping improvements fast which is nice as well. We are working with it pretty heavily where we can to keep up with momentum.\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2057564719402438865) · May 21, 2026*\n","summary":"@wesbos Crazy fast and generally works well. They are shipping improvements fast which is nice as well. We are working with it pretty heavily where we can to keep up with momentum. --- 𝕏 view original on x.com · May 21, 2026","date_published":"2026-05-21T20:50:31Z","date_modified":"2026-06-19T13:40:04.258169Z"},{"id":"https://robmartinson.me/x-2056874694775886161","url":"https://robmartinson.me/x-2056874694775886161","title":"Why is it that I often have to fight with Claude’s auto classifier to get it…","_content_markdown":"# Why is it that I often have to fight with Claude’s auto classifier to get it…\n\nWhy is it that I often have to fight with Claude’s auto classifier to get it to do what I want? Ultimate it relents. I understand it’s trying to guide the conversation and help make good decisions but maybe just ask me to confirm. I’m 52 years old. I don’t need an agentic parent.\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2056874694775886161) · May 19, 2026*\n","summary":"Why is it that I often have to fight with Claude’s auto classifier to get it to do what I want? Ultimate it relents. I understand it’s trying to guide the conversation and help make good decisions but maybe just ask me to confirm. I’m 52 years old. I don’t need an agentic parent. --- 𝕏 view original on…","date_published":"2026-05-19T23:08:36Z","date_modified":"2026-05-19T23:24:38.156655Z"},{"id":"https://robmartinson.me/x-2056804644945609125","url":"https://robmartinson.me/x-2056804644945609125","title":"Just added our MCP connector to grok for Sluicebox and holy crap it’s fast!","_content_markdown":"# Just added our MCP connector to grok for Sluicebox and holy crap it’s fast!\n\nJust added our MCP connector to grok for Sluicebox and holy crap it’s fast! I’ve gotten used to the speed of Claude over the past year but tool calls and lookups rip on Grok with remote MCP!\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2056804644945609125) · May 19, 2026*\n","summary":"Just added our MCP connector to grok for Sluicebox and holy crap it’s fast! I’ve gotten used to the speed of Claude over the past year but tool calls and lookups rip on Grok with remote MCP! --- 𝕏 view original on x.com · May 19, 2026","date_published":"2026-05-19T18:30:15Z","date_modified":"2026-05-19T18:54:38.145868Z"},{"id":"https://robmartinson.me/grok-build-after-a-weekend","url":"https://robmartinson.me/grok-build-after-a-weekend","title":"Grok Build, after a weekend","_content_markdown":"# Grok Build, after a weekend\n\nSpent the weekend with Grok Build on a couple of side projects. Model calls and reasoning are insanely fast. One-shot feature implementations land more often than they should. Plan mode is solid. Decisions are good. Highly intelligent, if that's what we want to call it. Hooked it up to some of our local MCP tooling for task management, markdown extraction, knowledge base and that works really really well right out of the gate.\n\nI've been a huge fan of xAI from the start. We've had Grok running in production for a while with backend services, mobile apps, phone IVRs, even a few games. Voice models doing TTS and STT on a few mobile apps and game stuff in MinorMUD. The voice models are awesome.\n\nWe're a 26-year-old dev shop with about 10 devs. Heavy Claude Code users. Most days it works really well and we lean on it constantly. A while back we built our own coding agent on top of our internal chatbot, modeled after Claude Code's workflow but running on Grok models so we could test that out. That also works pretty well, personally I love Grok reasoning. \n\nxAI got a slightly late start on the dev tooling side, Claude Code had the edge for a while but it was always a matter of when, not if. I see how Elon attacks problems\nand once he builds momentum its like a freight train. \n\nWhat's not there yet: long-running sessions and deeper orchestration. Everybody's into TUIs lately, and Grok Build's TUI is pretty and works well if you're sitting in one console but I run 20–25 agents at a time, across different projects, in tmux. A TUI doesn't slot into that the way a normal terminal client does. What I'd love is a JSON backend with hooks. Something I can drive programmatically and plug into Shunt.app, the orchestrator we built for our own use.\n\nAnyway, going to spend as much time on it as I can until it's our main process. Its pretty lean and mean already. Claude Code still has its place for now, but I'm super excited to move more workflow over to Grok Build. ","summary":"Spent the weekend with Grok Build on a couple of side projects. Model calls and reasoning are insanely fast. One-shot feature implementations land more often than they should. Plan mode is solid. Decisions are good. Highly intelligent, if that's what we want to call it. Hooked it up to some of our local MCP tooling…","date_published":"2026-05-19T12:00:00Z","date_modified":"2026-05-19T13:04:21.821972Z"},{"id":"https://robmartinson.me/multi-surface-client-sync-a-minormud-postmortem","url":"https://robmartinson.me/multi-surface-client-sync-a-minormud-postmortem","title":"Multi-Surface Client Sync: A MinorMUD Postmortem","_content_markdown":"# Multi-Surface Client Sync: A MinorMUD Postmortem\n\n\n![IMG_8501.png](/api/assets/01KRZ0JB8SVHGDEF815RB2H69G?w=488)\n![6AE44350-98F0-4F2A-BD99-FC117C3BDF32_4_5005_c.jpeg](/api/assets/01KRYPJ459B481MEVEGMS0YZPN?w=491)\n![4D6E7942-7189-4096-AF6F-2EB8521C1F66_4_5005_c.jpeg](/api/assets/01KRYPJ97PW0WJD9MNVAWY3R8M?w=515)\n\nI've been polishing the Godot mobile client and trying to make the iso 3D view feel natural when moving around. The other surfaces (TUI, web, Telegram, and the simple terminal mode) mostly just redraw when events come in. The 3D view has its own animation and state, and that created some interesting sync problems with the server.\n\nMinorMUD has five client surfaces against the same 20 Hz tick engine. Four stayed in sync easily. The Godot iPhone iso 3D one, the only one with real animation, kept drifting on multi-step movement. It took several attempts across a handful of releases before it finally felt right.\n\n## The system\n\nThere are five surfaces watching the same server events:\n\n- `mm term` (TUI), just redraws\n- Telegram bot, server-rendered messages\n- React web, redraws on events\n- Godot terminal mode, redraws on events\n- **Godot iso 3D**, has its own animation and internal model of the world\n\nThe first four are stateless. They show whatever the server just sent. The iso view has to animate the player moving, so it has its own idea of where you are while the slide is happening.\n\n## Server cadence\n\nMovement speed depends on what you're doing:\n\n- Normal walk: ~1 second per step\n- Run: ~0.5 seconds per step\n\nThe server sends `room_state` + `map_snapshot` + progress info on every step. The iso client has to turn that stream into a smooth treadmill animation.\n\n## Why the other surfaces never drifted\n\nThey don't animate. When a new room arrives, they just draw it. No local state to get out of sync with. If five steps come in during a run, they get five updates in order and that's it.\n\nThe iso view is different because the animation takes time. When the server is sending rooms faster than the animation can play, things start to drift.\n\n## What went wrong\n\nTwo main problems showed up once I started running.\n\n**Throwing away rooms**: I had a single \"next room\" slot. When running, new rooms would overwrite the previous one before the slide finished. You would skip rooms visually and the direction the world was moving would be wrong. It would eventually give up and fade/teleport.\n\n**Player and map looking at different rooms**: Even after fixing the skipping, during a long run the player model would be standing in the middle of the wrong tile on the surrounding grid. The animation thought we were still in room N while the server had already moved us several rooms ahead.\n\n## Trying to fix it (the long way)\n\nI went through several attempts.\n\nFirst I just waited for the current animation to finish, then snapped to wherever the server said we were. It stopped the worst jumping but still felt wrong in the middle of a run because you were watching the wrong rooms go by.\n\nNext I made it keep a queue of rooms that arrived while the animation was still playing. That fixed the skipping, but direction was still off because it was reading from the lagging map data.\n\nAfter that I stopped guessing direction and started using the actual `x/y/z` coordinates the server was sending with every room. That helped the sliding feel more correct.\n\nThe next improvement was making the animation speed up or slow down based on how fast rooms were actually arriving from the server, instead of always assuming walk speed. I also let the movement buttons update even while the slide was happening.\n\nThe last change was the important one: stop forcing the surrounding map grid to follow what the server thinks the current room is. Instead, make the grid follow whatever room the animation has currently drawn. Once the player model and the map grid were both looking at the animation's idea of \"where we are right now,\" the visual offset disappeared.\n\n## Stuff I learned\n\nStateless surfaces can just follow the server and stay correct. Anything with its own animation needs its own anchor for \"where the player is right now\", separate from the live server state, plus a way to catch up or snap when it falls behind. Basically\n\nTrying to keep animated state perfectly glued to the live server truth while it's in the middle of a movement is what creates the weirdness.\n\nThis was one of those problems that looked simple until I dug into all of the details.\n\n","summary":"I've been polishing the Godot mobile client and trying to make the iso 3D view feel natural when moving around. The other surfaces (TUI, web, Telegram, and the simple terminal mode) mostly just redraw when events come in. The 3D view has its own animation and state, and that created some interesting sync problems with…","date_published":"2026-05-18T12:00:00Z","date_modified":"2026-06-02T21:30:26.549184Z","tags":["blog","godot","postmortem","architecture","sync","tempo","minormud"]},{"id":"https://robmartinson.me/x-2055669850740310486","url":"https://robmartinson.me/x-2055669850740310486","title":"Lots of real work to catch up on this weekend but on the side going to spend…","_content_markdown":"# Lots of real work to catch up on this weekend but on the side going to spend…\n\nLots of real work to catch up on this weekend but on the side going to spend some time with @grok cli building on https://t.co/gVaky1XrDx. Pretty heavy Claude code user but super excited to see how grok does.\n\n\u003e **[MinorMUD, cheaper than therapy. Worse outcomes.](https://mmud.io)**\n\u003e\n\u003e MinorMUD, cheaper than therapy, worse outcomes. A persistent dungeon you can sneak into from terminal, web, Telegram, or mobile.\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2055669850740310486) · May 16, 2026*\n","summary":"Lots of real work to catch up on this weekend but on the side going to spend some time with @grok cli building on https://t.co/gVaky1XrDx. Pretty heavy Claude code user but super excited to see how grok does. \u003e MinorMUD, cheaper than therapy. Worse outcomes. \u003e \u003e MinorMUD, cheaper than therapy, worse outcomes. A…","date_published":"2026-05-16T15:20:59Z","date_modified":"2026-05-26T21:14:10.289247Z"},{"id":"https://robmartinson.me/x-2055348232662999271","url":"https://robmartinson.me/x-2055348232662999271","title":"@levelsio What do you mean they won’t let you pay more?","_content_markdown":"# @levelsio What do you mean they won’t let you pay more?\n\n@levelsio What do you mean they won’t let you pay more? Last month I burned through $7k in extra usage just myself.\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2055348232662999271) · May 15, 2026*\n","summary":"@levelsio What do you mean they won’t let you pay more? Last month I burned through $7k in extra usage just myself. --- 𝕏 view original on x.com · May 15, 2026","date_published":"2026-05-15T18:02:59Z","date_modified":"2026-06-22T11:40:04.737304Z"},{"id":"https://robmartinson.me/x-2055269140336869573","url":"https://robmartinson.me/x-2055269140336869573","title":"Very cool!","_content_markdown":"# Very cool!\n\nVery cool!\n\n[synadia.com/blog/introduci…](https://www.synadia.com/blog/introducing-synadia-protect)\n\n\u003e **[Introducing Synadia Protect: a security gateway for NATS](https://www.synadia.com/blog/introducing-synadia-protect)**\n\u003e\n\u003e There's no firewall for NATS. Synadia Protect is the missing control point: a transparent proxy that inspects every connection and message, enforces NATS-aware policy at the network edge, and produces the audit trail your security team needs to actually approve the deployment.\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2055269140336869573) · May 15, 2026*\n","summary":"Very cool! synadia.com/blog/introduci… \u003e Introducing Synadia Protect: a security gateway for NATS \u003e \u003e There's no firewall for NATS. Synadia Protect is the missing control point: a transparent proxy that inspects every connection and message, enforces NATS-aware policy at the network edge, and produces the audit…","date_published":"2026-05-15T12:48:42Z","date_modified":"2026-05-15T13:00:57.826932Z"},{"id":"https://robmartinson.me/x-2055245039757045964","url":"https://robmartinson.me/x-2055245039757045964","title":"@wholemars Not alone.","_content_markdown":"# @wholemars Not alone.\n\n@wholemars Not alone. TUIs are nice and all and have their place but one of the big advantages of CLI is script ability and friendliness with existing tools like screen and tmux. TUIs often break those rules.\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2055245039757045964) · May 15, 2026*\n","summary":"@wholemars Not alone. TUIs are nice and all and have their place but one of the big advantages of CLI is script ability and friendliness with existing tools like screen and tmux. TUIs often break those rules. --- 𝕏 view original on x.com · May 15, 2026","date_published":"2026-05-15T11:12:56Z","date_modified":"2026-06-01T23:24:40.961146Z"},{"id":"https://robmartinson.me/x-2055095107347714218","url":"https://robmartinson.me/x-2055095107347714218","title":"Last 30 days on main dev machine.","_content_markdown":"# Last 30 days on main dev machine.\n\n![](/api/assets/01KRMM460D52BRG9ATBZ9XT1XP)\n\nLast 30 days on main dev machine.\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2055095107347714218) · May 15, 2026*\n","summary":"Last 30 days on main dev machine. --- 𝕏 view original on x.com · May 15, 2026","date_published":"2026-05-15T01:17:10Z","date_modified":"2026-05-15T01:30:57.993982Z"},{"id":"https://robmartinson.me/nats-as-an-event-fabric","url":"https://robmartinson.me/nats-as-an-event-fabric","title":"NATS as an event fabric","_content_markdown":"# NATS as an event fabric\n\nBeen building with NATS for the last few years now and I feel like I'm becoming a fanboy. It's the event fabric underneath several of our bigger projects, Sluicebox, TitleTools, PropertySync. Different products, totally different problem spaces, same bus.\n\nFor the enterprise stuff it does what you'd expect. Message bus, job queuing, request-reply, fan-out. The things you run into on every project once it gets past a certain size, async processing, decoupled services, reliable delivery. JetStream handles the persistence side so you get durable queues and replay without bolting on Kafka or Rabbit or whatever. One less thing to manage.\n\nTitleTools moves a ton of document data and imagery through a large pipeline. NATS handles the whole path, ingest, process, validate, deliver. Sluicebox uses it for background jobs, notifications, real-time updates across the platform. Boring enterprise plumbing. Works great.\n\nIt also scales down to tiny projects really well. MinorMUD embeds NATS directly in the zone server process. No external broker, no separate infrastructure. Every game event is a message on the bus, player moves, combat ticks, chat, the Oracle listening to world events. Every client surface (terminal, web, Telegram, mobile) subscribes to the same subjects over WebSocket. Add a new client type, subscribe, done. Replay of events is super useful in that environment also. Multiple clients subscribe to the same stream so we can have observers, full rewind and fast forward and all of the client events are identical. \n\nSame technology running a multi-tenant SaaS platform and a MUD. That's a pretty good range.\n\nEmbedded NATS was the thing that sold me originally. One binary, zero dependencies, starts with the process. For MinorMUD that means the entire game server is a single Go binary. For the bigger projects it runs as a proper cluster. Same API either way. \n\nAnyway, if you havent used it, [you should](https://nats.io)","summary":"Been building with NATS for the last few years now and I feel like I'm becoming a fanboy. It's the event fabric underneath several of our bigger projects, Sluicebox, TitleTools, PropertySync. Different products, totally different problem spaces, same bus. For the enterprise stuff it does what you'd expect. Message…","date_published":"2026-05-09T12:00:00Z","date_modified":"2026-05-26T21:14:10.220189Z","tags":["Limelyte Technology Group Inc","titletools.io","minormud","nats.io"]},{"id":"https://robmartinson.me/x-2052911497840644400","url":"https://robmartinson.me/x-2052911497840644400","title":"I have designed built, tested and shipped more software across more projects in…","_content_markdown":"# I have designed built, tested and shipped more software across more projects in…\n\nI have designed built, tested and shipped more software across more projects in the last 30 days then I did in all of 2025\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2052911497840644400) · May 9, 2026*\n","summary":"I have designed built, tested and shipped more software across more projects in the last 30 days then I did in all of 2025 --- 𝕏 view original on x.com · May 9, 2026","date_published":"2026-05-09T00:40:16Z","date_modified":"2026-05-09T00:43:01.111392Z"},{"id":"https://robmartinson.me/sluicebox-scheduling-milestones-workflows","url":"https://robmartinson.me/sluicebox-scheduling-milestones-workflows","title":"Sluicebox, Scheduling, Milestones, Workflows","_content_markdown":"# Sluicebox, Scheduling, Milestones, Workflows\n\nSluicebox got a big round of updates this week. Mostly around project scheduling and task workflows, the stuff that was too simple before.\n\nTasks used to be completed or not. That's it. Binary. Which is fine until you're actually managing work across a team and need to know what's in progress, what's waiting on review, what's queued up. So now task statuses are configurable per tenant. Default workflow is planning → ready for dev → in progress → ready to verify → done, but you can rename them, reorder them, add your own, hide the ones you don't use. Kanban board view groups by status. Filter pills on the list view. Status combobox right on the schedule grid. The completed toggle is gone, status drives everything now.\n\nMilestones are new. Dated markers on a project, ship dates, design freezes, install windows, whatever. They show up as flags on the schedule grid. You can drag them to reschedule. Click to edit. Color-coded. There's a milestones tab on the project sheet with a sorted list and quick-add. The schedule view needed this badly, before you had tasks and epics on the grid but no way to mark the important dates that everything is working toward.\n\nThe schedule view itself got reworked. Gannt style layout with department grouping, overallocation warnings, epic budget fill bars, infinite horizontal scroll, today indicator line, drag-and-drop on epics. Went through about six rounds of fixing scroll and sticky positioning issues because that kind of grid is always a nightmare. It works well now.\n\nFilter UI got a full overhaul too. Linear-style picker with polished chips and quick presets. Feels way better than what was there before.\n\nSixteen releases in a day. Because that's how we do it apparently.","summary":"Sluicebox got a big round of updates this week. Mostly around project scheduling and task workflows, the stuff that was too simple before. Tasks used to be completed or not. That's it. Binary. Which is fine until you're actually managing work across a team and need to know what's in progress, what's waiting on review,…","date_published":"2026-05-08T12:00:00Z","date_modified":"2026-05-26T21:14:10.253728Z","tags":["sluicebox.io","Limelyte Technology Group Inc"]},{"id":"https://robmartinson.me/minormud-isometric-success","url":"https://robmartinson.me/minormud-isometric-success","title":"MinorMUD Isometric Client - Success!","_content_markdown":"# MinorMUD Isometric Client - Success!\n\n\n\u003cvideo src=\"/api/assets/01KR2EGFTJ0D9CX6G7JF14YF0T\" controls preload=\"metadata\"\u003e\u003c/video\u003e\n","date_published":"2026-05-08T12:00:00Z","date_modified":"2026-05-08T00:09:00.934607Z","tags":["minormud"]},{"id":"https://robmartinson.me/minormud-isometric-client","url":"https://robmartinson.me/minormud-isometric-client","title":"MinorMUD Isometric Client","_content_markdown":"# MinorMUD Isometric Client\n\n![Screenshot 2026-05-07 at 9.13.11 AM.png](/api/assets/01KR1KJ1CHS0HXG5JJ65V327N4)\n\nBeen noodling on what a Diablo-style isometric client for MinorMUD would look like. We already have XY coordinates on rooms, multiple clients hitting the same zone server over NATS/WebSocket, and the tempo mechanic for mixed-pace players. The question is what engine and how polished can we get it.\n\nLooked at Tiled (mapeditor.org) for level building. Its format is just JSON, room descriptions plus exits plus XY coords could feed a generator that outputs Tiled-compatible maps. AI could drive it too, give it a room description and a tile palette and get a grid back. Could also write a Tiled plugin that pulls room data straight from the zone server.\n\nFor the engine: Godot is the front-runner. Best isometric support out of the box, TileMap node, iso mode, built-in pathfinding, lighting, shaders. Exports to iOS, Android, desktop, web. Imports Tiled maps via plugins. Most polished path to a D1-feel client.\n\nLooked at Flutter+Flame but the iso support isn't as mature. Looked at embedding Godot inside Flutter as a platform view, doable but janky, not worth the integration tax.\n\nSTT/TTS: same xAI and ElevenLabs API calls the Flutter app uses. Godot has HTTPRequest built in, mic capture via AudioEffectCapture/AudioStreamMicrophone, audio playback via AudioStreamPlayer. Could call APIs directly from the client or route through the zone server over WebSocket to keep API keys off the client and let the server process/cache. Latency would be the same as the Flutter app since it's the same APIs.\n\nMobile first since that's the whole thesis, MUD in 30-minute windows from your phone. Desktop comes almost free from the same Godot codebase, just different input bindings. Touch-to-move on mobile, click-to-move on desktop, keyboard shortcuts for abilities. Same iso rendering and networking underneath.\n\nStill deciding between Godot for everything vs keeping Flutter for some pieces. Flutter has a nice TestFlight deployment workflow already. Need to figure out if Godot can match that.","summary":"Been noodling on what a Diablo-style isometric client for MinorMUD would look like. We already have XY coordinates on rooms, multiple clients hitting the same zone server over NATS/WebSocket, and the tempo mechanic for mixed-pace players. The question is what engine and how polished can we get it. Looked at Tiled…","date_published":"2026-05-07T12:00:00Z","date_modified":"2026-05-26T21:14:10.147032Z","tags":["minormud"]},{"id":"https://robmartinson.me/x-2052235808497868992","url":"https://robmartinson.me/x-2052235808497868992","title":"Something new to get working with @xai STT and TTS","_content_markdown":"# Something new to get working with @xai STT and TTS\n\n![](/api/assets/01KR0AB4CQSVH9GTBH74CBS4H9)\n\nSomething new to get working with @xai STT and TTS\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2052235808497868992) · May 7, 2026*\n","summary":"Something new to get working with @xai STT and TTS --- 𝕏 view original on x.com · May 7, 2026","date_published":"2026-05-07T03:55:20Z","date_modified":"2026-05-07T04:15:11.31686Z"},{"id":"https://robmartinson.me/x-2051751946982433206","url":"https://robmartinson.me/x-2051751946982433206","title":"Building from the road with shunt.app","_content_markdown":"# Building from the road with [shunt.app](https://shunt.app)\n\n![](/api/assets/01KQWW3H1492FR77DCCGNFB88Z)\n\nBuilding from the road with [shunt.app](https://shunt.app)\n\n\u003e **[Shunt, AI Terminal Session Manager](https://shunt.app)**\n\u003e\n\u003e Monitor, approve, and control your AI coding agents from anywhere. Free.\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2051751946982433206) · May 5, 2026*\n","summary":"Building from the road with shunt.app \u003e Shunt, AI Terminal Session Manager \u003e \u003e Monitor, approve, and control your AI coding agents from anywhere. Free. --- 𝕏 view original on x.com · May 5, 2026","date_published":"2026-05-05T19:52:38Z","date_modified":"2026-05-26T21:14:10.108234Z"},{"id":"https://robmartinson.me/x-2051681284368540159","url":"https://robmartinson.me/x-2051681284368540159","title":"Burning the candle @limelytedotcom","_content_markdown":"# Burning the candle @limelytedotcom\n\n![](/api/assets/01KQWB9K54106SXQ0S5XPWH8GD)\n\nBurning the candle @limelytedotcom\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2051681284368540159) · May 5, 2026*\n","summary":"Burning the candle @limelytedotcom --- 𝕏 view original on x.com · May 5, 2026","date_published":"2026-05-05T15:11:51Z","date_modified":"2026-05-05T15:14:51.693199Z"},{"id":"https://robmartinson.me/x-2051488366441697690","url":"https://robmartinson.me/x-2051488366441697690","title":"Post on X · 2026-05-05","_content_markdown":"# Post on X · 2026-05-05\n\n![](/api/assets/01KQTZG8D0JZPQB3ZFRY3YWS6C)\n\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2051488366441697690) · May 5, 2026*\n","summary":"--- 𝕏 view original on x.com · May 5, 2026","date_published":"2026-05-05T02:25:16Z","date_modified":"2026-05-05T04:53:52.276948Z"},{"id":"https://robmartinson.me/bees","url":"https://robmartinson.me/bees","title":"Bees","_content_markdown":"# Bees\n\n\"Installed\" 3 bee packages this weekend. Two for us and one for my father in law. Turned out great. Happy girls!\n\n\n\u003cvideo src=\"/api/assets/01KQSP4TAB32X0EZR4ANKPMG9H\" controls preload=\"metadata\"\u003e\u003c/video\u003e\n\n\n![IMG_8301.jpeg](/api/assets/01KQRMKGG5541KM658JH2N0ZNP)\n\n\n\n","summary":"\"Installed\" 3 bee packages this weekend. Two for us and one for my father in law. Turned out great. Happy girls!","date_published":"2026-05-04T04:42:25.439081Z","date_modified":"2026-05-04T14:27:00.934852Z","tags":["martinson.shop"]},{"id":"https://robmartinson.me/titletools-autoexamine","url":"https://robmartinson.me/titletools-autoexamine","title":"TitleTools AutoExamine","_content_markdown":"# TitleTools AutoExamine\n\nWorking on our AutoExamine functionality in TitleTools\n\n\n\u003cvideo src=\"/api/assets/01KQSP1QSXPYZXERNTCQGNEZPY\" controls preload=\"metadata\"\u003e\u003c/video\u003e\n","summary":"Working on our AutoExamine functionality in TitleTools","date_published":"2026-05-01T12:00:00Z","date_modified":"2026-05-04T15:41:21.571839Z","tags":["titletools.io","Limelyte Technology Group Inc"]},{"id":"https://robmartinson.me/nugget-name-collision","url":"https://robmartinson.me/nugget-name-collision","title":"nugget name collision","_content_markdown":"# nugget name collision\n\nSomeone in the office looked at nugget.com and it's basically the same product, AI agent for business data, but with a lot more money behind it. Cool.\n\nGuess we're renaming.\n","summary":"Someone in the office looked at nugget.com and it's basically the same product, AI agent for business data, but with a lot more money behind it. Cool. Guess we're renaming.","date_published":"2026-04-30T12:00:00Z","date_modified":"2026-05-26T21:14:10.069388Z","tags":["nugget"]},{"id":"https://robmartinson.me/minormud-multi-surface","url":"https://robmartinson.me/minormud-multi-surface","title":"MinorMUD Multisurface","_content_markdown":"# MinorMUD Multisurface\n\n\n\u003cvideo src=\"/api/assets/01KQWE1JA1685GN91A5ZET2FW2\" controls preload=\"metadata\"\u003e\u003c/video\u003e\n","date_published":"2026-04-29T12:00:00Z","date_modified":"2026-05-05T16:03:26.417888Z","tags":["minormud"]},{"id":"https://robmartinson.me/minormud-screen-share","url":"https://robmartinson.me/minormud-screen-share","title":"MinorMUD Game Engine","_content_markdown":"# MinorMUD Game Engine\n\n\n\u003cvideo src=\"/api/assets/01KQSV16JY1QS76N9P72MTWB4S\" controls preload=\"metadata\"\u003e\u003c/video\u003e\n","date_published":"2026-04-29T12:00:00Z","date_modified":"2026-05-05T15:00:53.918717Z","tags":["minormud"]},{"id":"https://robmartinson.me/redundancy-planning","url":"https://robmartinson.me/redundancy-planning","title":"redundancy planning","_content_markdown":"# redundancy planning\n\nArchitecture discussion today about redundancy. Right now we have 3 nodes in our building on fiber. That's fine for hardware failures — lose a node and the cluster keeps running — but a site-level event takes everything down.\n\nOptions on the table:\n\n- **4th in-building node** — cheapest, handles hardware failures better, doesn't help with site-level outages\n- **Full second site** — proper geographic redundancy, expensive, complex (Patroni cross-site replication, split-brain risk)\n- **Single remote node** — one node at a second location, joins the cluster over WireGuard, gives us a quorum tiebreaker and a place to fail over to\n- **TierPoint colo** — move production workloads to TierPoint, keep the office cluster for dev\n- **AWS mirror** — keep a minimal EC2 instance as a Nomad/Consul member, dormant until needed. Ironic given we just left AWS, but it's simple DR\n\nStill deciding. The cluster is dev workloads right now so the urgency is low. If we move production to TierPoint later, the office cluster becomes the redundancy story by default.\n","summary":"Architecture discussion today about redundancy. Right now we have 3 nodes in our building on fiber. That's fine for hardware failures — lose a node and the cluster keeps running — but a site-level event takes everything down. Options on the table: - 4th in-building node — cheapest, handles hardware failures…","date_published":"2026-04-28T12:00:00Z","date_modified":"2026-05-05T04:33:16.952024Z","tags":["shared-hosting","nomad"]},{"id":"https://robmartinson.me/one-version-across-the-whole-repo","url":"https://robmartinson.me/one-version-across-the-whole-repo","title":"one VERSION across the whole repo","_content_markdown":"# one VERSION across the whole repo\n\nOne file holds the version number. Every build target reads from it.\n\nThe repos I've been building lately share a shape — Go backend, `clients/` folder with a React web app, CLI tool, sometimes a Flutter mobile app. Multiple surfaces, one codebase. `pubspec.yaml` is the source of truth because iOS is the pickiest consumer — `CFBundleVersion` needs a monotonically increasing integer, and Flutter wants `MAJOR.MINOR.BUILD+BUILD`. Everything else pulls from there.\n\n`make bump-build` increments the build number, rewrites pubspec, commits, tags, pushes. One command. The Go binaries get the same version stamped via `-ldflags -X` at link time. React reads it at build time and inlines it. Docker image gets tagged with it. The Flutter `build_info.dart` gets regenerated on every build so the running app self-identifies with the same triple the server reports at `/version`.\n\n`make release` in the Flutter directory calls `bump-build` at the root, builds the IPA, uploads to TestFlight — all aligned on the same number. The root Makefile builds the Go zone server, cross-compiles the CLI for six platforms, and embeds the React app into the binary. Same version everywhere.\n\nA `publish-release.sh` script walks the commits since the last tag, buckets them by prefix — `feat:`, `fix:`, `perf:`, `refactor:` — and writes a human-readable release note as markdown. Drops bookkeeping commits like \"Release vX\" automatically. The notes land in `clients/react_web/public/releases/` so the web app can show a changelog with zero extra work.\n\nWhat it costs: the version ticks for everything even when only one surface changed. Worth it. The alternative is per-surface versions and a spreadsheet to correlate them.\n","summary":"One file holds the version number. Every build target reads from it. The repos I've been building lately share a shape — Go backend, clients/ folder with a React web app, CLI tool, sometimes a Flutter mobile app. Multiple surfaces, one codebase. pubspec.yaml is the source of truth because iOS is the pickiest…","date_published":"2026-04-28T12:00:00Z","date_modified":"2026-05-05T03:53:57.098785Z","tags":["ai-workflow"]},{"id":"https://robmartinson.me/minormud-more-stuff","url":"https://robmartinson.me/minormud-more-stuff","title":"MinorMUD - More stuff","_content_markdown":"# MinorMUD - More stuff\n\n![Screenshot 2026-05-04 at 4.15.43 PM.png](/api/assets/01KQTMV294XADKNQDP1ZDMESYD)\n\nHah! Dude, this is soo much fun!\n\nLots of fun game  issues to solve, which I'll go into more but at this point I have a working zone server beyond what I did before, and a start at a Flutter client, lots of work on the React web client. Using Xai's STT/TTS for audio narration, which works pretty awesome. Also using Gemini Nano Banana pro for generating room imagery. Simple for now but looks really good. Also another fun thing to sort that I got working this week is server side travel. Basically you can give the system a destination, like a room that you have visited before in the game (you must have visted for it to be on the map) and it will generate a route server-side and start traversing server-side and pushing events out to any of the clients. Really cool\n\n","summary":"Hah! Dude, this is soo much fun! Lots of fun game issues to solve, which I'll go into more but at this point I have a working zone server beyond what I did before, and a start at a Flutter client, lots of work on the React web client. Using Xai's STT/TTS for audio narration, which works pretty awesome. Also using…","date_published":"2026-04-27T12:00:00Z","date_modified":"2026-05-05T16:04:01.98256Z","tags":["minormud"]},{"id":"https://robmartinson.me/minormud-back-from-the-dead","url":"https://robmartinson.me/minormud-back-from-the-dead","title":"MinorMUD, back from the dead","_content_markdown":"# MinorMUD, back from the dead\n\nThe repo from the cruise sat for three months. Life and work took over.\n\nHad breakfast with my buddy Josh last week. We played MajorMUD together on PlanetX twenty-some years ago and have talked about writing our own MUD forever. We've had a few slow starts over the years but nothing that really stuck. \n\nAnyway, the breakfast conversation restarted it. Opened the repo, realized most of what I'd built during xmas vaca was \"can I build this from a phone with an AI agent\" proof-of-concept code. Wrong shape for what I actually want.\n\nGutted it. SQLite became Postgres on our internal Patroni cluster.  Moved the zone off my Raspberry Pi into Docker + Nomad on limelyte-dc1, same orchestration everything else runs on. NATS embedded in the zone, exposed over WebSocket through Traefik, `wss://mmud.io/ws` is the front door for every client. Web, TUI, Telegram, mobile, they all speak NATS. Three clients in the open: React web app, bubbletea TUI, Telegram bot for slow play. Flutter app in progress.\n\nThe tempo mechanic has a spec now. Partial dispatch wired up, combat formulas that know about the gap between two players moving at different paces. Slow players get pre-commit postures so they're not helpless between ticks. Fast players have abilities that bend local tempo as a resource.\n\nMore posts coming. [mmud.io](https://mmud.io)\n","summary":"The repo from the cruise sat for three months. Life and work took over. Had breakfast with my buddy Josh last week. We played MajorMUD together on PlanetX twenty-some years ago and have talked about writing our own MUD forever. We've had a few slow starts over the years but nothing that really stuck. Anyway, the…","date_published":"2026-04-26T12:00:00Z","date_modified":"2026-05-26T21:14:10.664277Z","tags":["minormud"]},{"id":"https://robmartinson.me/x-2046626187854909667","url":"https://robmartinson.me/x-2046626187854909667","title":"@elonmusk and the @grok team, as developers what can we do to accellerate the…","_content_markdown":"# @elonmusk and the @grok team, as developers what can we do to accellerate the…\n\n@elonmusk and the @grok team, as developers what can we do to accellerate the use of Grok in dev? I know you're working on a CLI harness but, Grok is fast and we'd like to use it now. Can we see it early? Should we build our own?\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2046626187854909667) · Apr 21, 2026*\n","summary":"@elonmusk and the @grok team, as developers what can we do to accellerate the use of Grok in dev? I know you're working on a CLI harness but, Grok is fast and we'd like to use it now. Can we see it early? Should we build our own? --- 𝕏 view original on x.com · Apr 21, 2026","date_published":"2026-04-21T16:24:42Z","date_modified":"2026-06-06T06:54:40.035929Z"},{"id":"https://robmartinson.me/x-2046625040226275486","url":"https://robmartinson.me/x-2046625040226275486","title":"Hey @AnthropicAI, how do we switch back to Opus 4.6 because 4.7 is, quite…","_content_markdown":"# Hey @AnthropicAI, how do we switch back to Opus 4.6 because 4.7 is, quite…\n\nHey @AnthropicAI, how do we switch back to Opus 4.6 because 4.7 is, quite frankly, a giant turd.\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2046625040226275486) · Apr 21, 2026*\n","summary":"Hey @AnthropicAI, how do we switch back to Opus 4.6 because 4.7 is, quite frankly, a giant turd. --- 𝕏 view original on x.com · Apr 21, 2026","date_published":"2026-04-21T16:20:08Z","date_modified":"2026-05-05T04:53:52.967176Z"},{"id":"https://robmartinson.me/how-i-work-tasks","url":"https://robmartinson.me/how-i-work-tasks","title":"how I work tasks","_content_markdown":"# how I work tasks\n\nI file tasks in the middle of whatever I'm doing. Bug report from a client, feature request, screenshot of a Slack message, doesn't matter. The point is to not lose it. Fifteen seconds to file, keep working on whatever I was actually doing.\n\nThe task is written in plain language, exactly how it came in. Sometimes that's a paragraph, sometimes it's a pasted screenshot. I don't clean it up at filing time.\n\nLater, maybe that day, maybe the next, I point an agent at the task. First job is always the same: read the task, figure out the scope, write an implementation plan in the task description. If it's a greenfield project or something low-risk, I'll let the agent run the plan. Rules are simple: write tests, tests must pass before committing, commit but never deploy, mark the task so I can review it. High-risk or client-facing stuff, I review the plan before anything runs.\n\nThe other half is notes. Every project has markdown notes, longer-form documents that accumulate project knowledge as development continues. Architecture decisions, deployment quirks, things that bit us. The notes outlive any single task and give the agent context the next time it picks something up.\n\nAlmost every project ends up with the same shape: a CLI with tasks and notes. Personal projects get their own. Client projects read from Sluicebox, where we already track everything. Either way, the agent has a task queue to pull from and a knowledge base to read.\n","summary":"I file tasks in the middle of whatever I'm doing. Bug report from a client, feature request, screenshot of a Slack message, doesn't matter. The point is to not lose it. Fifteen seconds to file, keep working on whatever I was actually doing. The task is written in plain language, exactly how it came in. Sometimes…","date_published":"2026-04-13T12:00:00Z","date_modified":"2026-05-26T21:14:10.3709Z","tags":["ai-workflow"]},{"id":"https://robmartinson.me/timers-that-write-their-own-descriptions","url":"https://robmartinson.me/timers-that-write-their-own-descriptions","title":"timers that write their own descriptions","_content_markdown":"# timers that write their own descriptions\n\nGlobal rule: when I'm working on a project, the agent keeps a timer running and appends a client-readable description as work happens. I don't write time entries. They write themselves.\n\nThis matters because time tracking drives billing at Limelyte. Every entry needs a real description, the kind a client reads on an invoice and understands what they paid for. Not \"worked on stuff.\" More like \"Fixed date parsing bug in CSV import, trailing whitespace in timestamp column caused silent failures on records after March 1.\"\n\nThe agent writes those as we go. Honestly they're better than what I'd write at 5 PM trying to reconstruct my morning.\n\nEnd of day I review the entries, adjust anything that looks off, and move on. Nothing to remember, nothing to reconstruct.\n\nFailure mode: long sessions. A timer running all day or over a weekend accumulates a lot of appended descriptions. By the end it's a wall of text, every commit message, every tool call, every tangent. These need a lot of summarization, but Claude (or whatever your favorite agent is) does a pretty good job of reading and summarizing given a good set of instructions about what's valuable to clients.\n","summary":"Global rule: when I'm working on a project, the agent keeps a timer running and appends a client-readable description as work happens. I don't write time entries. They write themselves. This matters because time tracking drives billing at Limelyte. Every entry needs a real description, the kind a client reads on an…","date_published":"2026-04-05T12:00:00Z","date_modified":"2026-05-26T21:14:10.409472Z","tags":["ai-workflow","Limelyte Technology Group Inc"]},{"id":"https://robmartinson.me/x-2037526249531412647","url":"https://robmartinson.me/x-2037526249531412647","title":"@wesbos Switch to an iPad with a keyboard and just do everything in a terminal.","_content_markdown":"# @wesbos Switch to an iPad with a keyboard and just do everything in a terminal.\n\n@wesbos Switch to an iPad with a keyboard and just do everything in a terminal.\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2037526249531412647) · Mar 27, 2026*\n","summary":"@wesbos Switch to an iPad with a keyboard and just do everything in a terminal. --- 𝕏 view original on x.com · Mar 27, 2026","date_published":"2026-03-27T13:44:47Z","date_modified":"2026-06-29T03:40:04.233087Z"},{"id":"https://robmartinson.me/shunt","url":"https://robmartinson.me/shunt","title":"Shunt","_content_markdown":"# Shunt\n\nI run too many Claude Code sessions in too many tmux panes, and half the time I'm not at the keyboard when one needs approval.\n\n[Shunt](https://shunt.app) sits on top of tmux's control mode. Go daemon parses the agent output as it streams, watches for pending-approval prompts, and exposes everything as a web app, an iPad app, and a phone app. Approve a write, send a follow-up, check on a long-running task — from a phone in line at the grocery store, an iPad on the couch, whatever's closest. A gateway relay handles devices outside the network without port forwards or a VPN.\n\nShips as one Go binary (web client embedded via `go:embed`), plus a Tauri v2 desktop wrapper for macOS, a Flutter iOS app for phone-first use, and the gateway relay. Same protocol everywhere.\n\nBefore Shunt I was tabbing between tmux panes constantly, missing approval prompts because they scrolled off-screen, tethered to my desk. Now I catch them from wherever.\n\nScaffolded the daemon, CLI, TUI, and web client in one Friday. Using it daily across half a dozen projects. [shunt.app](https://shunt.app)\n","summary":"I run too many Claude Code sessions in too many tmux panes, and half the time I'm not at the keyboard when one needs approval. Shunt sits on top of tmux's control mode. Go daemon parses the agent output as it streams, watches for pending-approval prompts, and exposes everything as a web app, an iPad app, and a phone…","date_published":"2026-03-20T12:00:00Z","date_modified":"2026-05-05T03:58:36.918522Z","tags":["shunt.app","ai-workflow","claude-code"]},{"id":"https://robmartinson.me/what-make-release-actually-does","url":"https://robmartinson.me/what-make-release-actually-does","title":"what `make release` actually does","_content_markdown":"# what `make release` actually does\n\nOne command. Every surface ships. Type `make release`, answer one prompt for the version number, wait 90 seconds.\n\nThe order:\n\n1. **Pre-flight**, tests green, working tree clean, GoReleaser exists, `GITLAB_TOKEN` in env. If anything fails, bail. (Learned this after GoReleaser ran for two minutes, died on a 401, and left the version bumped with binaries un-built.)\n\n2. **Bump**, increment the integer in pubspec/VERSION, commit `Release vX.Y.Z`, annotate the tag, push to develop. Only commit that gets `--follow-tags`.\n\n3. **Fast-forward main**, develop into main, no merge commits. Main is what's deployed. Anything on main that's not on develop is a bug.\n\n4. **Cross-platform CLI**, GoReleaser builds six targets (`darwin/linux/windows × amd64/arm64`), uploads to GitLab package registry.\n\n5. **Docker image**, multi-stage build. Node stage builds the React client, Go stage embeds `dist/` and stamps the version via ldflags, Alpine runtime stage gets the binary. Tag is `vX.Y.Z-BUILD-commit`. Push to registry.\n\n6. **Nomad deploy**, `nomad job run`, secrets rendered from `nomad var` at allocation time. Health check is HTTP GET every 10s.\n\n7. **TestFlight** (when mobile is involved), `flutter build ipa`, archive, export with App Store Connect signing, upload via `altool`. Slowest step, most likely to break, runs last so everything else is already live when Apple acts up.\n\n90 seconds for server-only. 5-7 minutes with mobile. What I'd change: hand the CLI builds and Docker push to CI. They're deterministic and don't need my laptop.\n","summary":"One command. Every surface ships. Type make release, answer one prompt for the version number, wait 90 seconds. The order: 1. Pre-flight, tests green, working tree clean, GoReleaser exists, GITLABTOKEN in env. If anything fails, bail. (Learned this after GoReleaser ran for two minutes, died on a 401, and left the…","date_published":"2026-03-18T12:00:00Z","date_modified":"2026-05-26T21:14:10.030581Z","tags":["ai-workflow"]},{"id":"https://robmartinson.me/commit-prefixes-that-write-your-changelog","url":"https://robmartinson.me/commit-prefixes-that-write-your-changelog","title":"commit prefixes that write your changelog","_content_markdown":"# commit prefixes that write your changelog\n\nEvery shipping commit starts with a prefix. The first body paragraph is the user-facing summary. A script between bump and deploy parses the log and emits a markdown changelog. That's it.\n\nPrefixes:\n\n| Prefix | Changelog section |\n|---|---|\n| `feat:` `add:` | New Features |\n| `fix:` | Fixes |\n| `perf:` `polish:` `improve:` | Improvements |\n| `refactor:` `chore:` `docs:` `test:` `ci:` | Dropped, internal |\n\nBookkeeping commits (`Release vX.Y.Z`, `changelog: vX.Y.Z`, `Bump build to N`) get auto-dropped too.\n\nFrom each surviving commit: take the first paragraph only, collapse to one line, strip trailers (`Signed-off-by`, `Refs`, `Closes`). Everything after is implementation detail, belongs in `git log`, not in the changelog.\n\nSo a commit like:\n\n```\nfeat(zone): renames now stick across tmux automatic-rename\n\nWindow and pane renames now persist by disabling tmux's\nautomatic-rename mode after a rename.\n\nRefs: shunt-board #42\n```\n\nBecomes: **renames now stick across tmux automatic-rename**, Window and pane renames now persist by disabling tmux's automatic-rename mode after a rename.\n\nThe style rule: release notes are for users, not engineers. \"Fixed a crash when multiple devices connected\" is good. \"Resolved a concurrent map write panic in the snapshot cache\" isn't, the user doesn't care about the map.\n\nWhat this costs me at commit time: write the user-facing summary first, put implementation detail under a blank line. Fifteen seconds of discipline, real changelogs on every release.\n","summary":"Every shipping commit starts with a prefix. The first body paragraph is the user-facing summary. A script between bump and deploy parses the log and emits a markdown changelog. That's it. Prefixes: | Prefix | Changelog section | |---|---| | feat: add: | New Features | | fix: | Fixes | | perf: polish: improve: |…","date_published":"2026-03-15T12:00:00Z","date_modified":"2026-05-26T21:14:10.183804Z","tags":["ai-workflow"]},{"id":"https://robmartinson.me/forgejo","url":"https://robmartinson.me/forgejo","title":"forgejo","_content_markdown":"# forgejo\n\nMandy and I try to take a trip on or around our anniversary (end of Feb) every year to someplace sunny. Usually Maui but this year we decided to try something new and explore the Florida keys. \n\nDuring our downtime, when just hanging out on the beach in a chair or for an hour in the mornings while having coffee, I'm building stuff in tmux sessions from my phone.\n\nThis time I'm pondering our source control. Currently we use Gitlab which has been fine but we don't use 90% of what Premium offers, and running it ourselves means one less vendor and one less bill.\n\nSpent some time looking at options and found Forgejo. Forgejo doesn't have nested group support out of the box, which we needed, Limelyte's org structure in GitLab uses nested groups heavily. So I cloned the Forgejo repo and built it from scratch: database schema changes, models, routing, git transport layer, API endpoints, and templates. Not a small patch.\n\nDeployed to Nomad with its own PostgreSQL database and MinIO bucket for LFS and attachments. Created the Limelyte org with the same group structure we had in GitLab, pushed everything over. All repos, all history. \n\nAfter building nested group support things work pretty well, although a lot of the UI has to be adjusted as it's more of a GitHub style structure. I have a snapshot I should probably push up at some point. \n\nAnyone else running forgejo?\n","summary":"Mandy and I try to take a trip on or around our anniversary (end of Feb) every year to someplace sunny. Usually Maui but this year we decided to try something new and explore the Florida keys. During our downtime, when just hanging out on the beach in a chair or for an hour in the mornings while having coffee, I'm…","date_published":"2026-03-10T12:00:00Z","date_modified":"2026-05-26T21:14:09.990698Z","tags":["shared-hosting","nomad","forgejo"]},{"id":"https://robmartinson.me/x-2030988291080945881","url":"https://robmartinson.me/x-2030988291080945881","title":"I run into this issue every single day while building a with Claude code.","_content_markdown":"# I run into this issue every single day while building a with Claude code.\n\nI run into this issue every single day while building a with Claude code. Multiple sessions on multiple projects. Looks like this could solve. Awesome\n\n\u003e **Quoting [@code_rams](https://x.com/code_rams/status/2030920724504838399), Ramya Chinnadurai 🚀**\n\u003e\n\u003e Running multiple projects locally is painful. localhost:3000, localhost:3001, localhost:8080... which one is which? One port conflict and your whole setup breaks. Portless by Vercel Labs fixes this cleanly. Instead of port numbers, you get stable named URLs:\n\u003e\n\u003e ![](/api/assets/01KQTQR6E190G8Q9GD1187N67K)\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2030988291080945881) · Mar 9, 2026*\n","summary":"I run into this issue every single day while building a with Claude code. Multiple sessions on multiple projects. Looks like this could solve. Awesome \u003e Quoting @coderams, Ramya Chinnadurai 🚀 \u003e \u003e Running multiple projects locally is painful. localhost:3000, localhost:3001, localhost:8080... which one is which? One…","date_published":"2026-03-09T12:45:17Z","date_modified":"2026-05-26T21:14:10.701774Z"},{"id":"https://robmartinson.me/x-2030791767352861112","url":"https://robmartinson.me/x-2030791767352861112","title":"@johncrickett Go check out [github.com/slopus/happy](https://github.com/slopus/h…","_content_markdown":"# @johncrickett Go check out [github.com/slopus/happy](https://github.com/slopus/h…\n\n@johncrickett Go check out [github.com/slopus/happy](https://github.com/slopus/happy) I’ve been using this for months. It’s a harness around Claude code. Hasn’t been updated in a while, but still does the job fairly well.\n\n\u003e ![](https://pbs.twimg.com/news_img/2058216199758946304/zG8vhqei?format=jpg\u0026name=orig)  \n\u003e **[GitHub - slopus/happy: Mobile and Web client for Codex and Claude Code, with realtime voice, encryption and fully featured](https://github.com/slopus/happy)**\n\u003e\n\u003e Mobile and Web client for Codex and Claude Code, with realtime voice, encryption and fully featured - slopus/happy\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2030791767352861112) · Mar 8, 2026*\n","summary":"@johncrickett Go check out github.com/slopus/happy I’ve been using this for months. It’s a harness around Claude code. Hasn’t been updated in a while, but still does the job fairly well. \u003e \u003e GitHub - slopus/happy: Mobile and Web client for Codex and Claude Code, with realtime voice, encryption and fully featured…","date_published":"2026-03-08T23:44:22Z","date_modified":"2026-06-02T18:24:40.080095Z"},{"id":"https://robmartinson.me/x-2030778366392238117","url":"https://robmartinson.me/x-2030778366392238117","title":"@johncrickett I’m a huge Claude code fan and a high volume user along with…","_content_markdown":"# @johncrickett I’m a huge Claude code fan and a high volume user along with…\n\n@johncrickett I’m a huge Claude code fan and a high volume user along with the rest of our team. That said, yes, remote control is pretty much unusable at this point.\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2030778366392238117) · Mar 8, 2026*\n","summary":"@johncrickett I’m a huge Claude code fan and a high volume user along with the rest of our team. That said, yes, remote control is pretty much unusable at this point. --- 𝕏 view original on x.com · Mar 8, 2026","date_published":"2026-03-08T22:51:07Z","date_modified":"2026-06-01T23:24:40.976076Z"},{"id":"https://robmartinson.me/raid-migration-complete","url":"https://robmartinson.me/raid-migration-complete","title":"RAID migration complete","_content_markdown":"# RAID migration complete\n\nFinished the RAID storage migration across all nodes. MinIO data, PostgreSQL data, and Docker volumes all moved to RAID arrays. Each node now has software RAID1 for the OS and dedicated RAID storage for persistent data.\n\nHit one snag — moving Docker's data directory broke Nomad host volumes because the paths changed. Reverted the Docker path change and kept Docker on the OS drive, just moved the actual persistent data (MinIO buckets, Postgres WAL, etc.) to RAID. Restored all 12 Nomad jobs after the fix.\n\nSet up MinIO data replication between nodes via rsync every 6 hours. MinIO runs as a single instance pinned to one node (not distributed mode), so rsync gives us a warm copy on the other nodes in case we need to fail over. Updated all project docs with the new storage layout.\n","summary":"Finished the RAID storage migration across all nodes. MinIO data, PostgreSQL data, and Docker volumes all moved to RAID arrays. Each node now has software RAID1 for the OS and dedicated RAID storage for persistent data. Hit one snag — moving Docker's data directory broke Nomad host volumes because the paths changed.…","date_published":"2026-03-07T12:00:00Z","date_modified":"2026-05-05T04:21:50.742676Z","tags":["shared-hosting","nomad"]},{"id":"https://robmartinson.me/raid-migration","url":"https://robmartinson.me/raid-migration","title":"RAID migration","_content_markdown":"# RAID migration\n\nFound storage issues on node-3 — mdadm array had degraded. Fixed the array, repaired Patroni's data directory, and got replication healthy again.\n\nWhile I was in there I realized we needed to move all persistent data to proper RAID storage across every node, not just the OS drives. Wrote up the full migration runbook: per-node breakdown of what data lives where, phased migration plan (one node at a time, keep the cluster healthy throughout), verification checklists for each step, and rollback procedures in case something goes sideways. PostgreSQL, MinIO, and Docker volumes all need to move.\n","summary":"Found storage issues on node-3 — mdadm array had degraded. Fixed the array, repaired Patroni's data directory, and got replication healthy again. While I was in there I realized we needed to move all persistent data to proper RAID storage across every node, not just the OS drives. Wrote up the full migration…","date_published":"2026-03-06T12:00:00Z","date_modified":"2026-05-05T04:21:50.735772Z","tags":["shared-hosting","nomad"]},{"id":"https://robmartinson.me/x-2029755184436699304","url":"https://robmartinson.me/x-2029755184436699304","title":"@noahzweben I am super excited for this to work well.","_content_markdown":"# @noahzweben I am super excited for this to work well.\n\n@noahzweben I am super excited for this to work well. I have been using Happy as a remote Claude code harness since December and it’s now an essential part my workflow. That said, this release is essentially unusable so far. Sessions seem to stall for 10-30 minutes or just go completely\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2029755184436699304) · Mar 6, 2026*\n","summary":"@noahzweben I am super excited for this to work well. I have been using Happy as a remote Claude code harness since December and it’s now an essential part my workflow. That said, this release is essentially unusable so far. Sessions seem to stall for 10-30 minutes or just go completely --- 𝕏 view original on…","date_published":"2026-03-06T03:05:21Z","date_modified":"2026-06-11T05:40:04.240428Z"},{"id":"https://robmartinson.me/x-2029227968065880222","url":"https://robmartinson.me/x-2029227968065880222","title":"@noahzweben Hey @noahzweben when do we get this on Teams plans?","_content_markdown":"# @noahzweben Hey @noahzweben when do we get this on Teams plans?\n\n@noahzweben Hey @noahzweben when do we get this on Teams plans?\n\n---\n*𝕏 [view original on x.com](https://x.com/robmartinson/status/2029227968065880222) · Mar 4, 2026*\n","summary":"@noahzweben Hey @noahzweben when do we get this on Teams plans? --- 𝕏 view original on x.com · Mar 4, 2026","date_published":"2026-03-04T16:10:23Z","date_modified":"2026-06-02T17:54:40.068928Z"},{"id":"https://robmartinson.me/the-golden-pattern","url":"https://robmartinson.me/the-golden-pattern","title":"the golden pattern","_content_markdown":"# the golden pattern\n\nThe stack we keep landing on at Limelyte.\n\n**Go API**, Gin router, Gorm or SQLX or SQLC for data depending on how much SQL we want to write by hand, SQLite for anything that doesn't need Postgres. Auth via Goth when we need OAuth. One binary. No runtime dependencies.\n\n**Cobra CLI**, built at the same time as the API, not after. If the API can do it, the CLI can do it. This is the primary interface for the first few weeks of any project, web comes later.\n\n**Cobra-to-MCP bridge**, walks the Cobra command tree and exposes every command as an MCP tool automatically. Add a CLI command, agents can use it immediately.\n\n**React web client**, lives in `clients/react_web/`. Built by Vite. The Go binary embeds the built `dist/` directory via `//go:embed` and serves it. No separate web server, no nginx, no CDN config.\n\n**One binary deploys everything.** API, CLI, web client, MCP server. Drop it on a box and it runs.\n\nCLI-first means agents have full access from day one. By the time the React client exists, every endpoint has been exercised through Cobra commands and MCP tool calls.\n\nThis pattern runs Sluicebox, this blog, and a ton of client projects. Different data layers depending on the project, but the shape is the same. It's rock solid, it's fast, and it's fast to develop against.\n\nOne of the things we've learned working with agentic development: work out repeatable patterns, refine them, keep using them. Spec-driven development. The agent gets a known architecture, known conventions, known file layout. It doesn't have to guess. That's the whole point.\n","summary":"The stack we keep landing on at Limelyte. Go API, Gin router, Gorm or SQLX or SQLC for data depending on how much SQL we want to write by hand, SQLite for anything that doesn't need Postgres. Auth via Goth when we need OAuth. One binary. No runtime dependencies. Cobra CLI, built at the same time as the API, not after.…","date_published":"2026-03-01T12:00:00Z","date_modified":"2026-05-26T21:14:10.455654Z","tags":["ai-workflow","golden-pattern","Limelyte Technology Group Inc"]},{"id":"https://robmartinson.me/corvette-back-from-paint","url":"https://robmartinson.me/corvette-back-from-paint","title":"back from paint!","_content_markdown":"# back from paint!\n\nGot Mandy's car back from paint. it looks AMAZING! Super happy with how its turning out. \n\n\n![IMG_7685.jpeg](/api/assets/01KQW3YZSHDJH302AT3AY6DV3G)\n\n![IMG_7681.jpeg](/api/assets/01KQW3Z3PD54649X770NY2PBAH)\n\n![IMG_7683.jpeg](/api/assets/01KQW3Z4DY3FFX2QBNN50MTTKJ)\n\n![IMG_7682.jpeg](/api/assets/01KQW3Z54FFG44RW36QM9XNMQF)\n\n![IMG_7680.jpeg](/api/assets/01KQW3Z5SXT6K3Z6VBCMFKSFT3)\n","summary":"Got Mandy's car back from paint. it looks AMAZING! Super happy with how its turning out.","date_published":"2026-02-27T12:00:00Z","date_modified":"2026-05-05T13:08:48.636142Z","tags":["martinson.shop","71-corvette"]}]}