{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Marginalia",
  "description": "Notes, learnings, and discoveries by Sachin Dharmapurikar.",
  "home_page_url": "https://marginalia.thoughtworker.in",
  "feed_url": "https://marginalia.thoughtworker.in/feed.json",
  "authors": [
    {
      "name": "Sachin Dharmapurikar"
    }
  ],
  "items": [
    {
      "id": "https://marginalia.thoughtworker.in/posts/brew-tailscaled-macos-split-dns",
      "url": "https://marginalia.thoughtworker.in/posts/brew-tailscaled-macos-split-dns",
      "title": "When `*.ts.net` won't resolve: brew tailscaled and macOS split-DNS",
      "content_text": "MagicDNS works through Tailscale's resolver but not through the system. Why the brew-installed tailscaled silently skips the split-DNS rule the App Store build sets up, and the one-line fix.",
      "date_published": "2026-05-08T00:00:00.000Z",
      "tags": [
        "tailscale",
        "macos",
        "dns",
        "homebrew",
        "networking",
        "debugging"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/colima-launchd-sequoia-provenance",
      "url": "https://marginalia.thoughtworker.in/posts/colima-launchd-sequoia-provenance",
      "title": "Why my Colima LaunchAgent refused to load: a Sequoia provenance story",
      "content_text": "A reboot test on a headless Mac surfaced an opaque launchd error that traced back to a months-old architectural decision and a SIP-protected extended attribute most people never see.",
      "date_published": "2026-05-05T00:00:00.000Z",
      "tags": [
        "macos",
        "colima",
        "launchd",
        "sequoia",
        "til"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/macmini-headless",
      "url": "https://marginalia.thoughtworker.in/posts/macmini-headless",
      "title": "Making a Mac Mini headless: FileVault, auto-login, and launchd",
      "content_text": "How I got a Mac Mini to boot to a fully remote-accessible state without physical presence — FileVault disabled, auto-login configured, and Tailscale launchd tuned for network wait.",
      "date_published": "2026-05-04T00:00:00.000Z",
      "tags": [
        "macos",
        "tailscale",
        "launchd",
        "headless",
        "karkhana"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/self-hosted-gitea-with-github-backup",
      "url": "https://marginalia.thoughtworker.in/posts/self-hosted-gitea-with-github-backup",
      "title": "Self-hosted Gitea with GitHub backup: migration lessons",
      "content_text": "How I migrated repos from GitHub to a self-hosted Gitea instance, configured push-mirrors back to GitHub, and the specific API and URL format issues I hit along the way.",
      "date_published": "2026-05-04T00:00:00.000Z",
      "tags": [
        "gitea",
        "dokploy",
        "github",
        "git",
        "self-hosted",
        "karkhana"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/tmux-cursor-shape-til",
      "url": "https://marginalia.thoughtworker.in/posts/tmux-cursor-shape-til",
      "title": "`E[2 q`: when tmux quoting silently eats your ESC byte",
      "content_text": "Random characters dribbling into your terminal? It's an escape sequence that lost its ESC byte upstream. In tmux, this often comes from how `\\E` is quoted in `terminal-overrides`.",
      "date_published": "2026-05-04T00:00:00.000Z",
      "tags": [
        "tmux",
        "terminal",
        "macos",
        "debugging",
        "til"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/tmux-ssh-headless-mac",
      "url": "https://marginalia.thoughtworker.in/posts/tmux-ssh-headless-mac",
      "title": "tmux + SSH: work survives dropped connections",
      "content_text": "Configure tmux to auto-spawn sessions on SSH login and tune terminal defaults so your terminal state persists across any network interruption — airport, flight, hotel WiFi, whatever.",
      "date_published": "2026-05-04T00:00:00.000Z",
      "tags": [
        "tmux",
        "ssh",
        "macos",
        "karkhana"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/caddy-to-tailscale-serve",
      "url": "https://marginalia.thoughtworker.in/posts/caddy-to-tailscale-serve",
      "title": "Caddy to Tailscale serve: the quiet TLS win for tailnet services",
      "content_text": "I spent an evening fighting Caddy on macOS for tailnet TLS. Then I deleted Caddy, ran one Tailscale command, and was done in two minutes.",
      "date_published": "2026-05-02T00:00:00.000Z",
      "tags": [
        "tailscale",
        "caddy",
        "macos",
        "tls",
        "homelab",
        "karkhana"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/colima-vz-macos",
      "url": "https://marginalia.thoughtworker.in/posts/colima-vz-macos",
      "title": "Colima with vz on macOS: the quirks worth knowing",
      "content_text": "Five gotchas that cost me an evening setting up Colima with the vz backend as a real workhorse — not a dev convenience, but where actual services run.",
      "date_published": "2026-05-02T00:00:00.000Z",
      "tags": [
        "colima",
        "macos",
        "docker",
        "homelab",
        "karkhana"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/decision-records",
      "url": "https://marginalia.thoughtworker.in/posts/decision-records",
      "title": "Decision Records for solo developers",
      "content_text": "Solo developers need Decision Records more than teams do — not less. Future-you has forgotten the reasoning. Here's the template and why it matters.",
      "date_published": "2026-05-02T00:00:00.000Z",
      "tags": [
        "practices",
        "documentation",
        "decision-records",
        "karkhana",
        "solo-dev"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/karkhana-thesis",
      "url": "https://marginalia.thoughtworker.in/posts/karkhana-thesis",
      "title": "Karkhana: A workshop for solo software work",
      "content_text": "I run three machines, ten projects, and one production app as a solo dev. Here's the mental model — the quality baseline, the principles, and why AI changed what's possible.",
      "date_published": "2026-05-02T00:00:00.000Z",
      "tags": [
        "karkhana",
        "solo-dev",
        "ai-agents",
        "infrastructure"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/three-tier-backup",
      "url": "https://marginalia.thoughtworker.in/posts/three-tier-backup",
      "title": "Three-tier backup for a one-person shop",
      "content_text": "A practical guide to backing up a home server as a solo dev — three failure domains, ~€8/month, and the one step most people skip.",
      "date_published": "2026-05-02T00:00:00.000Z",
      "tags": [
        "backup",
        "restic",
        "homelab",
        "karkhana",
        "solo-dev"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/context-bloat-til",
      "url": "https://marginalia.thoughtworker.in/posts/context-bloat-til",
      "title": "Context Bloat: How I Accidentally Built OpenClaw 2.0",
      "content_text": "I switched to Hermes because OpenClaw got slow and bloated. Six weeks later, Hermes was doing the same thing. Here's what I found and fixed.",
      "date_published": "2026-04-20T00:00:00.000Z",
      "tags": [
        "ai",
        "hermes",
        "tokens",
        "optimization",
        "mcp",
        "til"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/khabar-llm-wiki-radio-show",
      "url": "https://marginalia.thoughtworker.in/posts/khabar-llm-wiki-radio-show",
      "title": "Khabar: Building a Daily AI Radio Show on a Mac Mini",
      "content_text": "How I wired together email newsletters, a local LLM wiki, and a radio narrator on entry-level hardware — with 7 bugs along the way.",
      "date_published": "2026-04-20T00:00:00.000Z",
      "tags": [
        "ai",
        "automation",
        "local-first",
        "tts",
        "workflow"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/one-agent-many-faces",
      "url": "https://marginalia.thoughtworker.in/posts/one-agent-many-faces",
      "title": "One Agent, Many Faces: Why I Stopped Creating Separate Profiles",
      "content_text": "Profiles vs personality switching in Hermes Agent — and why the distinction matters less than I thought.",
      "date_published": "2026-04-20T00:00:00.000Z",
      "tags": [
        "ai",
        "hermes",
        "productivity",
        "automation"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/docker-healthcheck-localhost-alpine",
      "url": "https://marginalia.thoughtworker.in/posts/docker-healthcheck-localhost-alpine",
      "title": "The 404 That Wasn't: Debugging Traefik, Docker, and a Stubborn Health Check",
      "content_text": "How a localhost vs 127.0.0.1 difference in Alpine Linux caused Traefik to silently drop routing to my container.",
      "date_published": "2026-04-19T00:00:00.000Z",
      "tags": [
        "docker",
        "traefik",
        "debugging",
        "dokploy"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/tailscale-services-dashboard",
      "url": "https://marginalia.thoughtworker.in/posts/tailscale-services-dashboard",
      "title": "How Tailscale Services actually work (and why my dashboard wouldn't connect)",
      "content_text": "Debugging Tailscale Services — the three-layer mental model that would have saved me hours.",
      "date_published": "2026-04-19T00:00:00.000Z",
      "tags": [
        "tailscale",
        "networking",
        "devops"
      ]
    },
    {
      "id": "https://marginalia.thoughtworker.in/posts/welcome-to-marginalia",
      "url": "https://marginalia.thoughtworker.in/posts/welcome-to-marginalia",
      "title": "Welcome to Marginalia",
      "content_text": "Introducing Marginalia — a personal log of learnings by Sachin Dharmapurikar.",
      "date_published": "2026-04-10T00:00:00.000Z",
      "tags": [
        "meta",
        "blog"
      ]
    }
  ]
}