{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Henry's Room",
  "home_page_url": "https://henry.098555.xyz/en/",
  "feed_url": "https://henry.098555.xyz/en/feed.json",
  "description": "Henry's Room — notes on technology, design, life, and the practice of getting better.",
  "language": "en-US",
  "authors": [
    {
      "name": "Henry"
    }
  ],
  "items": [
    {
      "id": "https://henry.098555.xyz/en/blog/henrys-room-chapter-three/",
      "url": "https://henry.098555.xyz/en/blog/henrys-room-chapter-three/",
      "title": "Henry's Room · Chapter Three: From Working to Feeling Right",
      "summary": "Why keep changing a site that already works? A rejected redesign, motion found through experimentation, and small inconsistencies that affect trust: a room discovering its own character.",
      "date_published": "2026-10-25T00:00:00.000Z",
      "tags": [
        "Henry's Room",
        "Project retrospective",
        "Interaction design",
        "AI collaboration"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/henrys-room-chapter-two/",
      "url": "https://henry.098555.xyz/en/blog/henrys-room-chapter-two/",
      "title": "Henry's Room · Chapter Two: Turning a Blog into a System Worth Maintaining",
      "summary": "Inside the implementation: static pages and dynamic services, browser-based writing, reliable publishing, notifications, data, performance, and the boundaries of private content.",
      "date_published": "2026-10-25T00:00:00.000Z",
      "tags": [
        "Henry's Room",
        "Personal blog",
        "Astro",
        "Cloudflare",
        "Engineering practice"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/henrys-room-chapter-one/",
      "url": "https://henry.098555.xyz/en/blog/henrys-room-chapter-one/",
      "title": "Henry's Room · Chapter One: From an Idea to a Real Website",
      "summary": "A retrospective on wanting a personal blog, rebuilding it repeatedly, and learning to maintain it: the excitement, frustrations, failures, and choices that gave this room its character.",
      "date_published": "2026-10-24T00:00:00.000Z",
      "tags": [
        "Henry's Room",
        "Project retrospective",
        "Personal blog"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/vibe-coding-era/",
      "url": "https://henry.098555.xyz/en/blog/vibe-coding-era/",
      "title": "What Is Truly Scarce in the Age of Vibe Coding?",
      "summary": "Natural language can turn into software more easily now. Judgment, verification, and responsibility have not gone away. On the gains, costs, and changing role of the engineer.",
      "date_published": "2026-10-22T00:00:00.000Z",
      "tags": [
        "Vibe Coding",
        "AI programming",
        "Codex",
        "Engineering judgment",
        "Development practice"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/ios-gallery-predecessor/",
      "url": "https://henry.098555.xyz/en/blog/ios-gallery-predecessor/",
      "title": "The Abandoned iOS-Style Gallery That Became the Prequel to Henry Media Library",
      "summary": "From an iOS-inspired photo gallery on Ubuntu to Henry Media Library: features, failure points, technical choices, and open-source notices.",
      "date_published": "2026-10-19T00:00:00.000Z",
      "tags": [
        "iOS style",
        "Gallery",
        "Henry Media Library",
        "Python",
        "Project retrospective"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/ai-api-gateway/",
      "url": "https://henry.098555.xyz/en/blog/ai-api-gateway/",
      "title": "I Built an AI API Gateway, Then Decided to Stop",
      "summary": "A multi-model gateway experiment involving New API, Cloudflare, Nginx, Codex, Xiaomi MiMo, and the protocol gaps that made a clean finish impossible.",
      "date_published": "2026-10-18T00:00:00.000Z",
      "tags": [
        "AI API",
        "New API",
        "Codex",
        "Open source",
        "Project retrospective"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/henry-media-library/",
      "url": "https://henry.098555.xyz/en/blog/henry-media-library/",
      "title": "I Built My Own Media Library: Why Thousands of Photos and Videos Ended Up in a Browser",
      "summary": "A local-first personal media library, combining native JavaScript, IndexedDB, a single-file Python backend, and a SwiftUI client to handle photos, videos, thumbnails, and real folders.",
      "date_published": "2026-10-18T00:00:00.000Z",
      "tags": [
        "Henry Media Library",
        "Local-first",
        "JavaScript",
        "Python",
        "SwiftUI",
        "Media management"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/henry-model/",
      "url": "https://henry.098555.xyz/en/blog/henry-model/",
      "title": "I Built a Model Manager So Codex, dsh, and LM Studio Could Coexist",
      "summary": "A native macOS model orchestration tool for coordinating Codex, DeepSeek Harness, LM Studio, cloud gateways, configuration, memory, launchd, permissions, and state.",
      "date_published": "2026-10-18T00:00:00.000Z",
      "tags": [
        "Henry Model Manager",
        "macOS",
        "SwiftUI",
        "AI tools",
        "Local models",
        "Codex"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/sapphire/",
      "url": "https://henry.098555.xyz/en/blog/sapphire/",
      "title": "Rebuilding a macOS Notch App",
      "summary": "A localization project around Shariq Charolia's Sapphire that became an engineering exercise: filling missing modules, rebuilding strings, and dealing with macOS signing, permissions, and product boundaries.",
      "date_published": "2026-10-17T00:00:00.000Z",
      "tags": [
        "macOS",
        "Sapphire",
        "Open source",
        "Localization",
        "Swift",
        "Development"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/hello-world/",
      "url": "https://henry.098555.xyz/en/blog/hello-world/",
      "title": "Hello, World: Starting to Write Again",
      "summary": "Why I decided to pick up writing again in a culture built around fragments.",
      "date_published": "2026-09-04T00:00:00.000Z",
      "tags": [
        "Notes",
        "Writing",
        "Beginnings"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/design-principles/",
      "url": "https://henry.098555.xyz/en/blog/design-principles/",
      "title": "Five Principles of Minimal Design",
      "summary": "Space, hierarchy, restraint, consistency, and focus. Good design is often quiet.",
      "date_published": "2026-09-02T00:00:00.000Z",
      "tags": [
        "Design",
        "Minimalism",
        "Apple"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/cloudflare-pages/",
      "url": "https://henry.098555.xyz/en/blog/cloudflare-pages/",
      "title": "Build a Free Personal Blog with Cloudflare",
      "summary": "A free, fast, and secure publishing stack: hosting, CDN, and HTTPS in one place.",
      "date_published": "2026-08-28T00:00:00.000Z",
      "tags": [
        "Technology",
        "Cloudflare",
        "Deployment",
        "Free"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/focus/",
      "url": "https://henry.098555.xyz/en/blog/focus/",
      "title": "Deep Work: Taking Back Your Attention",
      "summary": "In an age of information overload, attention is the scarcest resource. A few methods that work for me.",
      "date_published": "2026-08-20T00:00:00.000Z",
      "tags": [
        "Productivity",
        "Focus",
        "Life"
      ]
    },
    {
      "id": "https://henry.098555.xyz/en/blog/city-walk/",
      "url": "https://henry.098555.xyz/en/blog/city-walk/",
      "title": "A City Walk with No Destination",
      "summary": "Walking around for a whole day without a destination may be the best kind of rest.",
      "date_published": "2026-08-05T00:00:00.000Z",
      "tags": [
        "Travel",
        "Cities",
        "Life"
      ]
    }
  ]
}