{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Santiago Molina | santi020k JSON Feed",
  "description": "Writing on software, reading, gaming, and everyday discoveries.",
  "home_page_url": "https://santi020k.com/",
  "feed_url": "https://santi020k.com/feed.json",
  "language": "en-US",
  "authors": [
    {
      "name": "Santiago Molina",
      "url": "https://santi020k.com/"
    }
  ],
  "items": [
    {
      "id": "https://santi020k.com/blog/open-sourcing-santi020k-auth-cloudflare/",
      "url": "https://santi020k.com/blog/open-sourcing-santi020k-auth-cloudflare/",
      "title": "Open-sourcing authentication without sharing accounts",
      "summary": "Why I made @santi020k/auth-cloudflare public, how it reuses email-code and passkey policy across Cloudflare applications, and where the shared boundary deliberately ends.",
      "content_text": "Why I made @santi020k/auth-cloudflare public, how it reuses email-code and passkey policy across Cloudflare applications, and where the shared boundary deliberately ends.",
      "date_published": "2026-09-25T13:00:00.000Z",
      "tags": [
        "authentication",
        "cloudflare-workers",
        "passkeys",
        "security",
        "open-source"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/building-santi020k-developer-tool-ecosystem/",
      "url": "https://santi020k.com/blog/building-santi020k-developer-tool-ecosystem/",
      "title": "How I Built the santi020k Developer Tool Ecosystem",
      "summary": "How Lumen, ESLint Config Basic, Quality, Astro Doctor, Commitprompt, Dep Beacon, OG, Theme, and Auth form one practical system for my projects.",
      "content_text": "How Lumen, ESLint Config Basic, Quality, Astro Doctor, Commitprompt, Dep Beacon, OG, Theme, and Auth form one practical system for my projects.",
      "date_published": "2026-09-24T22:45:00.000Z",
      "tags": [
        "developer-experience",
        "developer-tools",
        "open-source",
        "automation",
        "design-systems"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/what-changed-when-i-started-writing-architecture-notes-every-month/",
      "url": "https://santi020k.com/blog/what-changed-when-i-started-writing-architecture-notes-every-month/",
      "title": "What Changed When I Started Writing Architecture Notes Every Month",
      "summary": "A year of monthly architecture notes changed how I review systems, how I catch drift, and how I explain decisions to the people who inherit them.",
      "content_text": "A year of monthly architecture notes changed how I review systems, how I catch drift, and how I explain decisions to the people who inherit them.",
      "date_published": "2026-09-11T15:00:00.000Z",
      "tags": [
        "architecture",
        "documentation",
        "software-design",
        "engineering-culture"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/why-i-moved-to-zed/",
      "url": "https://santi020k.com/blog/why-i-moved-to-zed/",
      "title": "Why I Moved from VS Code-Based Editors to Zed",
      "summary": "Why Zed became my editor of choice: responsive work across multiple projects, flexible AI integrations, and Dep Beacon now available as a Zed extension.",
      "content_text": "Why Zed became my editor of choice: responsive work across multiple projects, flexible AI integrations, and Dep Beacon now available as a Zed extension.",
      "date_published": "2026-09-07T00:00:00.000Z",
      "tags": [
        "zed",
        "developer-experience",
        "productivity",
        "ai",
        "developer-tools"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/run-repo-on-mac-with-silo-dxmt/",
      "url": "https://santi020k.com/blog/run-repo-on-mac-with-silo-dxmt/",
      "title": "How I Got R.E.P.O. Running on Mac Without Whisky",
      "summary": "A tested Apple silicon setup for running R.E.P.O. through Silo, Wine, and DXMT, including the DirectX graphics failure and its exact fix.",
      "content_text": "A tested Apple silicon setup for running R.E.P.O. through Silo, Wine, and DXMT, including the DirectX graphics failure and its exact fix.",
      "date_published": "2026-09-04T18:56:45.000Z",
      "tags": [
        "macos",
        "apple-silicon",
        "gaming",
        "wine",
        "dxmt"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/building-roadscore-offline-road-trip-game/",
      "url": "https://santi020k.com/blog/building-roadscore-offline-road-trip-game/",
      "title": "Building RoadScore: An Offline Road-Trip Game for One Shared Phone",
      "summary": "How I designed RoadScore around a co-pilot, an offline catalog, flexible trip sessions, and privacy boundaries that keep game data on the device.",
      "content_text": "How I designed RoadScore around a co-pilot, an offline catalog, flexible trip sessions, and privacy boundaries that keep game data on the device.",
      "date_published": "2026-09-04T00:00:00.000Z",
      "tags": [
        "roadscore",
        "expo",
        "react-native",
        "offline-first",
        "game-development",
        "accessibility"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/flash-xteink-x4-international-firmware/",
      "url": "https://santi020k.com/blog/flash-xteink-x4-international-firmware/",
      "title": "How I Flashed International Firmware on an Xteink X4",
      "summary": "A tested guide to replacing Chinese Xteink X4 firmware with the international release by using its microSD updater when USB flashing is unavailable.",
      "content_text": "A tested guide to replacing Chinese Xteink X4 firmware with the international release by using its microSD updater when USB flashing is unavailable.",
      "date_published": "2026-09-03T15:00:00.000Z",
      "tags": [
        "reading",
        "xteink",
        "e-reader",
        "firmware",
        "hardware",
        "troubleshooting"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/deterministic-open-graph-images-without-design-lock-in/",
      "url": "https://santi020k.com/blog/deterministic-open-graph-images-without-design-lock-in/",
      "title": "Deterministic Open Graph images without design lock-in",
      "summary": "Why I separated social-image generation mechanics from project-owned visuals, then built caching, safe cleanup, worker concurrency, and CI checks around that boundary.",
      "content_text": "Why I separated social-image generation mechanics from project-owned visuals, then built caching, safe cleanup, worker concurrency, and CI checks around that boundary.",
      "date_published": "2026-08-22T15:00:00.000Z",
      "tags": [
        "open-graph",
        "typescript",
        "nodejs",
        "developer-experience",
        "build-tools"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/coolstead-safety-first-mac-cooling/",
      "url": "https://santi020k.com/blog/coolstead-safety-first-mac-cooling/",
      "title": "Coolstead: Safety-first cooling for a Mac",
      "summary": "What it takes to design a native fan-control utility around bounded requests, invalid sensor data, reversible behavior, and macOS as the final safety layer.",
      "content_text": "What it takes to design a native fan-control utility around bounded requests, invalid sensor data, reversible behavior, and macOS as the final safety layer.",
      "date_published": "2026-08-21T15:00:00.000Z",
      "tags": [
        "macos",
        "swift",
        "hardware",
        "safety-engineering",
        "native-apps"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/one-quality-command-across-polyglot-repositories/",
      "url": "https://santi020k.com/blog/one-quality-command-across-polyglot-repositories/",
      "title": "One quality command across polyglot repositories",
      "summary": "How I built a native CLI that coordinates existing analyzers across Rust, Swift, Android, Kotlin, JavaScript, and Astro without flattening their ecosystem-specific strengths.",
      "content_text": "How I built a native CLI that coordinates existing analyzers across Rust, Swift, Android, Kotlin, JavaScript, and Astro without flattening their ecosystem-specific strengths.",
      "date_published": "2026-08-21T15:00:00.000Z",
      "tags": [
        "rust",
        "code-quality",
        "developer-experience",
        "ci-cd",
        "tooling"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/between-contractions-sync-critical-path/",
      "url": "https://santi020k.com/blog/between-contractions-sync-critical-path/",
      "title": "Between Contractions: Local-First Partner Sync",
      "summary": "How I designed optional cross-platform Partner Sync without making a contraction timer depend on the network, an account, or a central history database.",
      "content_text": "How I designed optional cross-platform Partner Sync without making a contraction timer depend on the network, an account, or a central history database.",
      "date_published": "2026-08-21T07:00:00.000Z",
      "tags": [
        "distributed-systems",
        "cloudflare",
        "websockets",
        "swiftui",
        "android",
        "local-first"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/why-i-built-between-contractions/",
      "url": "https://santi020k.com/blog/why-i-built-between-contractions/",
      "title": "Why I Built Between Contractions",
      "summary": "How waiting for Aarón became a calm, private contraction timer across the web, iOS, Android, watches, widgets, and partner devices.",
      "content_text": "How waiting for Aarón became a calm, private contraction timer across the web, iOS, Android, watches, widgets, and partner devices.",
      "date_published": "2026-08-20T15:00:00.000Z",
      "tags": [
        "product-engineering",
        "swiftui",
        "android",
        "astro",
        "privacy",
        "personal-projects"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/astro-and-alpine-patterns-for-fast-content-heavy-sites/",
      "url": "https://santi020k.com/blog/astro-and-alpine-patterns-for-fast-content-heavy-sites/",
      "title": "Astro and Alpine Patterns for Fast Content-Heavy Sites",
      "summary": "The Astro and Alpine.js patterns that keep content-heavy sites fast without giving up the interactive details that make them feel polished.",
      "content_text": "The Astro and Alpine.js patterns that keep content-heavy sites fast without giving up the interactive details that make them feel polished.",
      "date_published": "2026-08-14T15:00:00.000Z",
      "tags": [
        "astro",
        "alpine",
        "performance",
        "frontend",
        "javascript"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/postlens-private-on-device-content-studio/",
      "url": "https://santi020k.com/blog/postlens-private-on-device-content-studio/",
      "title": "PostLens: A private on-device content studio",
      "summary": "Why PostLens keeps selection, scoring, enhancement, composition, and caption preparation on the iPhone while making optional generative handoffs explicit.",
      "content_text": "Why PostLens keeps selection, scoring, enhancement, composition, and caption preparation on the iPhone while making optional generative handoffs explicit.",
      "date_published": "2026-08-14T15:00:00.000Z",
      "tags": [
        "ios",
        "swiftui",
        "on-device-ai",
        "privacy",
        "photography"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/expanding-santi020k-theme-to-the-terminal/",
      "url": "https://santi020k.com/blog/expanding-santi020k-theme-to-the-terminal/",
      "title": "Expanding Santi020k Theme from editor to terminal",
      "summary": "How a VS Code palette became a generated terminal system with six application formats, three Starship styles, managed shells, validation, and Homebrew releases.",
      "content_text": "How a VS Code palette became a generated terminal system with six application formats, three Starship styles, managed shells, validation, and Homebrew releases.",
      "date_published": "2026-07-15T15:00:00.000Z",
      "date_modified": "2026-07-26T15:00:00.000Z",
      "tags": [
        "terminal",
        "design-systems",
        "developer-experience",
        "homebrew",
        "open-source"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/shipping-macos-tools-with-a-homebrew-tap/",
      "url": "https://santi020k.com/blog/shipping-macos-tools-with-a-homebrew-tap/",
      "title": "Shipping macOS tools with a personal Homebrew tap",
      "summary": "How I separated product code from distribution metadata and turned signed terminal releases into familiar Homebrew install and upgrade commands.",
      "content_text": "How I separated product code from distribution metadata and turned signed terminal releases into familiar Homebrew install and upgrade commands.",
      "date_published": "2026-07-12T15:00:00.000Z",
      "tags": [
        "homebrew",
        "macos",
        "release-engineering",
        "developer-experience",
        "open-source"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/designing-eslint-packages-teams-actually-adopt/",
      "url": "https://santi020k.com/blog/designing-eslint-packages-teams-actually-adopt/",
      "title": "Designing ESLint Packages Teams Actually Adopt",
      "summary": "What separates ESLint configurations that spread across a codebase from ones that get removed after the first sprint.",
      "content_text": "What separates ESLint configurations that spread across a codebase from ones that get removed after the first sprint.",
      "date_published": "2026-07-10T15:00:00.000Z",
      "tags": [
        "eslint",
        "code-quality",
        "javascript",
        "typescript",
        "developer-experience"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/lumen-ui-one-system-three-frameworks/",
      "url": "https://santi020k.com/blog/lumen-ui-one-system-three-frameworks/",
      "title": "Lumen UI: One system, three frameworks",
      "summary": "How I built 123 accessible primitives for Astro, React, and Web Components while sharing tokens and behavior without forcing one runtime model.",
      "content_text": "How I built 123 accessible primitives for Astro, React, and Web Components while sharing tokens and behavior without forcing one runtime model.",
      "date_published": "2026-07-04T15:00:00.000Z",
      "tags": [
        "design-systems",
        "astro",
        "react",
        "web-components",
        "accessibility"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/dep-beacon-vscode-extension/",
      "url": "https://santi020k.com/blog/dep-beacon-vscode-extension/",
      "title": "Dep Beacon: Dependency Signals Inside VS Code",
      "summary": "Why I built Dep Beacon, a VS Code extension that keeps npm update paths, pnpm catalog context, and OSV security warnings inside manifests.",
      "content_text": "Why I built Dep Beacon, a VS Code extension that keeps npm update paths, pnpm catalog context, and OSV security warnings inside manifests.",
      "date_published": "2026-07-01T15:00:00.000Z",
      "date_modified": "2026-09-07T00:00:00.000Z",
      "tags": [
        "vscode",
        "developer-experience",
        "dependencies",
        "security",
        "open-source"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/astro-doctor-announcement/",
      "url": "https://santi020k.com/blog/astro-doctor-announcement/",
      "title": "Astro Doctor: A Health Check for Astro Codebases",
      "summary": "Why I built Astro Doctor: a CLI, ESLint plugin, editor extension, GitHub Action, and agent skill system for catching Astro anti-patterns early.",
      "content_text": "Why I built Astro Doctor: a CLI, ESLint plugin, editor extension, GitHub Action, and agent skill system for catching Astro anti-patterns early.",
      "date_published": "2026-06-22T00:00:00.000Z",
      "tags": [
        "astro",
        "developer-experience",
        "performance",
        "accessibility",
        "open-source"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/eslint-config-basic-version-2/",
      "url": "https://santi020k.com/blog/eslint-config-basic-version-2/",
      "title": "What Is New in @santi020k/eslint-config-basic v2.0",
      "summary": "Explore @santi020k/eslint-config-basic v2 with ESLint 10, one-package setup, lazy framework support, monorepo tooling, lite mode, and CLI checks.",
      "content_text": "Explore @santi020k/eslint-config-basic v2 with ESLint 10, one-package setup, lazy framework support, monorepo tooling, lite mode, and CLI checks.",
      "date_published": "2026-06-20T15:00:00.000Z",
      "date_modified": "2026-08-20T00:00:00.000Z",
      "tags": [
        "eslint",
        "javascript",
        "typescript",
        "developer-experience",
        "open-source"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/why-developer-experience-work-should-be-measured-like-product-work/",
      "url": "https://santi020k.com/blog/why-developer-experience-work-should-be-measured-like-product-work/",
      "title": "Why Developer Experience Work Should Be Measured Like Product Work",
      "summary": "DX improvements that cannot be measured rarely survive long enough to compound. Treating them like product work changes that.",
      "content_text": "DX improvements that cannot be measured rarely survive long enough to compound. Treating them like product work changes that.",
      "date_published": "2026-06-12T15:00:00.000Z",
      "date_modified": "2026-07-28T00:00:00.000Z",
      "tags": [
        "developer-experience",
        "engineering-culture",
        "metrics",
        "leadership"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/building-aaronmgz-as-a-family-platform/",
      "url": "https://santi020k.com/blog/building-aaronmgz-as-a-family-platform/",
      "title": "Building Aaronmgz as a family platform",
      "summary": "How a nautical personal site became a shared family platform for messages, invitations, administration, and a long-lived digital home.",
      "content_text": "How a nautical personal site became a shared family platform for messages, invitations, administration, and a long-lived digital home.",
      "date_published": "2026-06-04T15:00:00.000Z",
      "tags": [
        "astro",
        "nextjs",
        "cloudflare",
        "product-architecture",
        "personal-projects"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/playwright-accessibility-checks-that-teams-keep-running/",
      "url": "https://santi020k.com/blog/playwright-accessibility-checks-that-teams-keep-running/",
      "title": "Playwright Accessibility Checks That Teams Keep Running",
      "summary": "How to add accessibility automation to your Playwright suite in a way that is fast enough to stay in the workflow and specific enough to actually catch problems.",
      "content_text": "How to add accessibility automation to your Playwright suite in a way that is fast enough to stay in the workflow and specific enough to actually catch problems.",
      "date_published": "2026-05-15T15:00:00.000Z",
      "tags": [
        "accessibility",
        "playwright",
        "testing",
        "e2e",
        "developer-experience"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/muted-commands-make-ai-automation-faster-and-cheaper/",
      "url": "https://santi020k.com/blog/muted-commands-make-ai-automation-faster-and-cheaper/",
      "title": "Muted Commands Make AI Automation Faster and Cheaper",
      "summary": "AI agents rerun checks constantly. Quiet logs, compact reporters, and parallel verification reduce token waste without lowering the quality bar.",
      "content_text": "AI agents rerun checks constantly. Quiet logs, compact reporters, and parallel verification reduce token waste without lowering the quality bar.",
      "date_published": "2026-04-29T15:00:00.000Z",
      "tags": [
        "ai",
        "automation",
        "developer-experience",
        "testing",
        "ci-cd"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/ai-coding-is-probabilistic-your-delivery-process-should-not-be/",
      "url": "https://santi020k.com/blog/ai-coding-is-probabilistic-your-delivery-process-should-not-be/",
      "title": "AI Coding Is Probabilistic. Your Delivery Process Should Not Be.",
      "summary": "AI speeds up code changes, but ESLint, tests, snapshots, and end-to-end checks are what keep probabilistic output from turning into production risk.",
      "content_text": "AI speeds up code changes, but ESLint, tests, snapshots, and end-to-end checks are what keep probabilistic output from turning into production risk.",
      "date_published": "2026-04-15T15:30:00.000Z",
      "tags": [
        "ai",
        "eslint",
        "testing",
        "e2e",
        "developer-experience"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/why-i-moved-my-eslint-library-to-eslint-config-basic/",
      "url": "https://santi020k.com/blog/why-i-moved-my-eslint-library-to-eslint-config-basic/",
      "title": "Why I Moved My ESLint Library to @santi020k/eslint-config-basic",
      "summary": "Why I deprecated @santi020k/eslint-config-santi020k in favor of a composable monorepo with clearer packages, better docs, and stronger DX.",
      "content_text": "Why I deprecated @santi020k/eslint-config-santi020k in favor of a composable monorepo with clearer packages, better docs, and stronger DX.",
      "date_published": "2026-04-01T18:30:00.000Z",
      "tags": [
        "eslint",
        "flat-config",
        "developer-experience",
        "open-source",
        "typescript"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/avoid-inverted-conditionals-when-clarity-matters/",
      "url": "https://santi020k.com/blog/avoid-inverted-conditionals-when-clarity-matters/",
      "title": "Avoid Inverted Conditionals When Clarity Matters",
      "summary": "Positive conditionals usually reduce mental load and make branches easier to scan, review, and change.",
      "content_text": "Positive conditionals usually reduce mental load and make branches easier to scan, review, and change.",
      "date_published": "2025-10-13T12:56:00.000Z",
      "date_modified": "2026-04-08T18:00:00.000Z",
      "tags": [
        "readability",
        "javascript",
        "frontend",
        "clean-code"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/a-release-process-that-reduces-drama/",
      "url": "https://santi020k.com/blog/a-release-process-that-reduces-drama/",
      "title": "A Release Process That Reduces Drama",
      "summary": "A release process should lower stress, tighten feedback loops, and make production changes easier to trust.",
      "content_text": "A release process should lower stress, tighten feedback loops, and make production changes easier to trust.",
      "date_published": "2025-10-05T18:44:00.000Z",
      "date_modified": "2026-04-08T18:00:00.000Z",
      "tags": [
        "release-management",
        "git",
        "qa",
        "delivery"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/code-standards-that-scale-with-a-team/",
      "url": "https://santi020k.com/blog/code-standards-that-scale-with-a-team/",
      "title": "Code Standards That Scale With a Team",
      "summary": "The version of coding standards I would actually hand to a growing frontend team today.",
      "content_text": "The version of coding standards I would actually hand to a growing frontend team today.",
      "date_published": "2025-09-14T14:18:00.000Z",
      "date_modified": "2026-04-08T18:00:00.000Z",
      "tags": [
        "engineering-standards",
        "typescript",
        "frontend",
        "team-process"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/responsive-design-standards-that-scale-across-components/",
      "url": "https://santi020k.com/blog/responsive-design-standards-that-scale-across-components/",
      "title": "Responsive Design Standards That Scale Across Components",
      "summary": "Responsive work gets easier when breakpoints and layout decisions are treated like a shared system.",
      "content_text": "Responsive work gets easier when breakpoints and layout decisions are treated like a shared system.",
      "date_published": "2025-09-12T16:40:00.000Z",
      "date_modified": "2026-04-08T18:00:00.000Z",
      "tags": [
        "responsive-design",
        "frontend",
        "design-systems",
        "ui-engineering"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/git-best-practices-for-calm-collaboration/",
      "url": "https://santi020k.com/blog/git-best-practices-for-calm-collaboration/",
      "title": "Git Best Practices for Calm Collaboration",
      "summary": "Simple commit and pull-request habits that reduce review friction and make collaboration calmer.",
      "content_text": "Simple commit and pull-request habits that reduce review friction and make collaboration calmer.",
      "date_published": "2025-07-21T13:10:00.000Z",
      "date_modified": "2026-04-08T18:00:00.000Z",
      "tags": [
        "git",
        "pull-requests",
        "collaboration",
        "developer-experience"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/write-better-review-feedback-with-conventional-comments/",
      "url": "https://santi020k.com/blog/write-better-review-feedback-with-conventional-comments/",
      "title": "Write Better Review Feedback with Conventional Comments",
      "summary": "A lightweight review language that makes feedback clearer, kinder, and easier to act on.",
      "content_text": "A lightweight review language that makes feedback clearer, kinder, and easier to act on.",
      "date_published": "2025-05-17T17:34:00.000Z",
      "date_modified": "2026-04-08T18:00:00.000Z",
      "tags": [
        "code-review",
        "engineering-culture",
        "communication",
        "git"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/avoid-magic-strings-in-typescript-and-javascript/",
      "url": "https://santi020k.com/blog/avoid-magic-strings-in-typescript-and-javascript/",
      "title": "Avoid Magic Strings in TypeScript and JavaScript",
      "summary": "Replace ad-hoc string literals with clearer domain language, stronger typing, and safer refactors.",
      "content_text": "Replace ad-hoc string literals with clearer domain language, stronger typing, and safer refactors.",
      "date_published": "2025-03-29T14:22:00.000Z",
      "date_modified": "2026-04-08T18:00:00.000Z",
      "tags": [
        "typescript",
        "javascript",
        "code-quality",
        "refactoring"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/common-code-pitfalls-that-signal-maintenance-risk/",
      "url": "https://santi020k.com/blog/common-code-pitfalls-that-signal-maintenance-risk/",
      "title": "Common Code Pitfalls That Signal Maintenance Risk",
      "summary": "The code smells that usually predict rising maintenance cost before a team feels the full pain.",
      "content_text": "The code smells that usually predict rising maintenance cost before a team feels the full pain.",
      "date_published": "2025-01-07T15:08:00.000Z",
      "date_modified": "2026-04-08T18:00:00.000Z",
      "tags": [
        "code-quality",
        "maintainability",
        "refactoring",
        "software-design"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/skin-in-the-game-for-software-teams/",
      "url": "https://santi020k.com/blog/skin-in-the-game-for-software-teams/",
      "title": "Skin in the Game for Software Teams",
      "summary": "Why strong engineers care about product outcomes, users, and system health instead of stopping at ticket completion.",
      "content_text": "Why strong engineers care about product outcomes, users, and system health instead of stopping at ticket completion.",
      "date_published": "2024-12-08T16:12:00.000Z",
      "date_modified": "2026-04-08T18:00:00.000Z",
      "tags": [
        "engineering-culture",
        "leadership",
        "product-thinking",
        "software-teams"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/boosting-code-quality-and-efficiency-with-my-eslint-configuration-library/",
      "url": "https://santi020k.com/blog/boosting-code-quality-and-efficiency-with-my-eslint-configuration-library/",
      "title": "Boosting Code Quality and Efficiency with My ESLint Configuration Library",
      "summary": "Reusable ESLint library for React, Next.js, and TypeScript projects. Enforces code quality with flat config support and simplifies the move from ESLint 8 to 9.",
      "content_text": "Reusable ESLint library for React, Next.js, and TypeScript projects. Enforces code quality with flat config support and simplifies the move from ESLint 8 to 9.",
      "date_published": "2024-11-23T19:27:02.000Z",
      "tags": [
        "react-native",
        "react",
        "eslint",
        "typescript",
        "eslint-config"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/migrate-eslint-8-or-less-to-eslint-9/",
      "url": "https://santi020k.com/blog/migrate-eslint-8-or-less-to-eslint-9/",
      "title": "Migrate ESLint 8 or Less to ESLint 9",
      "summary": "A practical guide to moving from ESLint 8 to flat config in ESLint 9, with a cleaner setup for React, Next.js, and TypeScript projects.",
      "content_text": "A practical guide to moving from ESLint 8 to flat config in ESLint 9, with a cleaner setup for React, Next.js, and TypeScript projects.",
      "date_published": "2024-05-19T15:41:30.167Z",
      "date_modified": "2026-07-28T00:00:00.000Z",
      "tags": [
        "eslint",
        "typescript",
        "react",
        "nextjs",
        "migration"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/authentication-and-authorization-in-next-js-applications-with-supabase/",
      "url": "https://santi020k.com/blog/authentication-and-authorization-in-next-js-applications-with-supabase/",
      "title": "Authentication and Authorization in Next.js Applications with Supabase",
      "summary": "Build maintainable Next.js authentication with Supabase SSR, protected routes, session handling, and clear authorization patterns for production teams.",
      "content_text": "Build maintainable Next.js authentication with Supabase SSR, protected routes, session handling, and clear authorization patterns for production teams.",
      "date_published": "2024-04-25T18:20:00.000Z",
      "date_modified": "2026-08-20T00:00:00.000Z",
      "tags": [
        "supabase",
        "authentication",
        "authorization",
        "nextjs",
        "typescript"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/continuous-integration-and-deployment-for-next-js-projects/",
      "url": "https://santi020k.com/blog/continuous-integration-and-deployment-for-next-js-projects/",
      "title": "Continuous Integration and Deployment for Next.js Projects",
      "summary": "Build a practical Next.js CI/CD pipeline with GitHub Actions that installs cleanly, runs linting and tests, verifies builds, and deploys trusted code.",
      "content_text": "Build a practical Next.js CI/CD pipeline with GitHub Actions that installs cleanly, runs linting and tests, verifies builds, and deploys trusted code.",
      "date_published": "2024-04-18T17:12:00.000Z",
      "date_modified": "2026-08-20T00:00:00.000Z",
      "tags": [
        "ci-cd",
        "github-actions",
        "nextjs",
        "react",
        "deployment"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/testing-react-components-with-vitest-and-react-testing-library/",
      "url": "https://santi020k.com/blog/testing-react-components-with-vitest-and-react-testing-library/",
      "title": "Testing React Components with Vitest and React Testing Library",
      "summary": "A practical setup for testing React components with Vitest and React Testing Library, focused on behavior, confidence, and maintainable frontend code.",
      "content_text": "A practical setup for testing React components with Vitest and React Testing Library, focused on behavior, confidence, and maintainable frontend code.",
      "date_published": "2024-04-11T15:46:53.731Z",
      "date_modified": "2026-07-28T00:00:00.000Z",
      "tags": [
        "vitest",
        "testing-library",
        "react",
        "typescript",
        "nextjs"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/configuring-mongodb-with-homebrew-on-macos-converting-a-standalone-instance-to-a-replica-set/",
      "url": "https://santi020k.com/blog/configuring-mongodb-with-homebrew-on-macos-converting-a-standalone-instance-to-a-replica-set/",
      "title": "Configuring MongoDB with Homebrew on macOS: Converting a Standalone Instance to a Replica Set",
      "summary": "Convert a standalone MongoDB instance to a replica set on macOS using Homebrew. Covers mongod.conf changes, replication settings, and local verification steps.",
      "content_text": "Convert a standalone MongoDB instance to a replica set on macOS using Homebrew. Covers mongod.conf changes, replication settings, and local verification steps.",
      "date_published": "2024-04-05T18:33:37.000Z",
      "tags": [
        "mongo",
        "configuration",
        "homebrew",
        "mac"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/storybook-in-action-with-next-js-tailwind-and-typescript/",
      "url": "https://santi020k.com/blog/storybook-in-action-with-next-js-tailwind-and-typescript/",
      "title": "Storybook in Action with Next.js, Tailwind and TypeScript",
      "summary": "Set up Storybook in a Next.js project with Tailwind and TypeScript. Build isolated UI components, write stories, and improve design system collaboration.",
      "content_text": "Set up Storybook in a Next.js project with Tailwind and TypeScript. Build isolated UI components, write stories, and improve design system collaboration.",
      "date_published": "2024-03-29T00:11:10.000Z",
      "tags": [
        "typescript",
        "tailwind",
        "storybook",
        "react",
        "nextjs"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/development-workflow-with-husky-for-next-js-eslint-and-vitest-integration/",
      "url": "https://santi020k.com/blog/development-workflow-with-husky-for-next-js-eslint-and-vitest-integration/",
      "title": "Development Workflow with Husky for Next.js, ESLint, and Vitest Integration",
      "summary": "A practical Husky setup for Next.js projects so linting, testing, and pre-push checks become part of the team workflow instead of a last-minute cleanup step.",
      "content_text": "A practical Husky setup for Next.js projects so linting, testing, and pre-push checks become part of the team workflow instead of a last-minute cleanup step.",
      "date_published": "2024-03-21T17:47:55.000Z",
      "tags": [
        "pre-commit",
        "vitest",
        "husky",
        "react",
        "nextjs"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/building-the-best-next-js-typescript-standard-vitest-eslint-configuration/",
      "url": "https://santi020k.com/blog/building-the-best-next-js-typescript-standard-vitest-eslint-configuration/",
      "title": "Building the Best Next.js TypeScript Standard Vitest ESLint Configuration",
      "summary": "Configure ESLint for Next.js with TypeScript and Vitest integration. Covers code quality rules, import conventions, and a scalable setup for React projects.",
      "content_text": "Configure ESLint for Next.js with TypeScript and Vitest integration. Covers code quality rules, import conventions, and a scalable setup for React projects.",
      "date_published": "2024-03-14T18:01:55.000Z",
      "tags": [
        "eslint",
        "vitest",
        "typescript",
        "standards",
        "react"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    },
    {
      "id": "https://santi020k.com/blog/atomic-module-component-structure-for-react/",
      "url": "https://santi020k.com/blog/atomic-module-component-structure-for-react/",
      "title": "Atomic Module Component Structure for React",
      "summary": "Structure React projects using Atomic Module Components — covering file layout, naming conventions, and scalability patterns for growing TypeScript codebases.",
      "content_text": "Structure React projects using Atomic Module Components — covering file layout, naming conventions, and scalability patterns for growing TypeScript codebases.",
      "date_published": "2024-03-07T22:05:53.000Z",
      "tags": [
        "development",
        "react",
        "nextjs",
        "typescript"
      ],
      "authors": [
        {
          "name": "Santiago Molina"
        }
      ]
    }
  ]
}