<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Journal | Ömer Yanbaş</title>
    <link>https://omeryanbas.com/blog/</link>
    <atom:link href="https://omeryanbas.com/blog/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Field notes on enterprise systems, automation, performance, data and integrations: the problem, the diagnosis and the fix.</description>
    <language>en</language>
    <item>
      <title>Making technical debt visible enough to pay</title>
      <link>https://omeryanbas.com/blog/technical-debt-visible/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/technical-debt-visible/</guid>
      <pubDate>Mon, 14 Sep 2026 09:00:00 GMT</pubDate>
      <description>Debt nobody can see never gets budget. Give each item a cost, an interest rate and a place on the same list as features, then pay it inside feature work.</description>
    </item>
    <item>
      <title>Where your team writes down its decisions</title>
      <link>https://omeryanbas.com/blog/where-decisions-are-written/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/where-decisions-are-written/</guid>
      <pubDate>Fri, 28 Aug 2026 09:00:00 GMT</pubDate>
      <description>Decisions live in chat threads and in people&#39;s heads until they vanish. A one paragraph record next to the code keeps the reasons where the work is.</description>
    </item>
    <item>
      <title>Five questions for the first meeting with a client</title>
      <link>https://omeryanbas.com/blog/five-questions-first-meeting/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/five-questions-first-meeting/</guid>
      <pubDate>Tue, 11 Aug 2026 09:00:00 GMT</pubDate>
      <description>Ask what success is in numbers, what must keep running, who owns the accounts, what was tried before, and who decides. Then write the answers down.</description>
    </item>
    <item>
      <title>Debugging: measure first, guess later</title>
      <link>https://omeryanbas.com/blog/debugging-measure-first/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/debugging-measure-first/</guid>
      <pubDate>Tue, 28 Jul 2026 09:00:00 GMT</pubDate>
      <description>The order that finds bugs is reproduce, narrow, measure, then theorise. Here is how to bisect changes and inputs, and why the first theory costs the most.</description>
    </item>
    <item>
      <title>Long jobs get finished in small reversible steps</title>
      <link>https://omeryanbas.com/blog/small-reversible-steps/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/small-reversible-steps/</guid>
      <pubDate>Sat, 11 Jul 2026 09:00:00 GMT</pubDate>
      <description>How to cut a large piece of work into steps that can each ship and each be undone, with feature flags, expand and contract migrations and a real rollback.</description>
    </item>
    <item>
      <title>Lab numbers, field data and a real phone</title>
      <link>https://omeryanbas.com/blog/measure-before-optimising/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/measure-before-optimising/</guid>
      <pubDate>Wed, 24 Jun 2026 09:00:00 GMT</pubDate>
      <description>A synthetic audit, real user data and a phone in your hand answer three different questions. Here is when each one lies and how to measure a change.</description>
    </item>
    <item>
      <title>An eleven kilobyte home page: the case for static sites</title>
      <link>https://omeryanbas.com/blog/static-site-still-good/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/static-site-still-good/</guid>
      <pubDate>Wed, 10 Jun 2026 09:00:00 GMT</pubDate>
      <description>What pre rendering buys you, what it costs, and the build pipeline, page weight budget and caching rules that keep a static site small and boring.</description>
    </item>
    <item>
      <title>The scheduled job that never runs at midnight</title>
      <link>https://omeryanbas.com/blog/cron-timezone/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/cron-timezone/</guid>
      <pubDate>Sun, 24 May 2026 09:00:00 GMT</pubDate>
      <description>A schedule written in one zone on a machine running another, plus daylight saving twice a year, makes a nightly job run late, twice or not at all.</description>
    </item>
    <item>
      <title>Your backup is a zero byte file and nobody noticed</title>
      <link>https://omeryanbas.com/blog/restore-drills-zero-byte-backup/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/restore-drills-zero-byte-backup/</guid>
      <pubDate>Thu, 07 May 2026 09:00:00 GMT</pubDate>
      <description>Backups fail quietly: a missing tool in the container, a permission, a full disk. Check the size and the row counts, and restore on a schedule.</description>
    </item>
    <item>
      <title>Three fields that make logs worth reading</title>
      <link>https://omeryanbas.com/blog/logs-worth-reading/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/logs-worth-reading/</guid>
      <pubDate>Thu, 23 Apr 2026 09:00:00 GMT</pubDate>
      <description>Most logs cannot answer the one question an incident asks. A correlation id, the subject being worked on and an outcome with a reason fix that.</description>
    </item>
    <item>
      <title>What your AI feature does when the credit runs out</title>
      <link>https://omeryanbas.com/blog/llm-fallback-when-credit-ends/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/llm-fallback-when-credit-ends/</guid>
      <pubDate>Mon, 06 Apr 2026 09:00:00 GMT</pubDate>
      <description>A model provider can fail for billing, quota or an outage. Without a fallback ladder every user sees the same generic error. How to degrade on purpose.</description>
    </item>
    <item>
      <title>Keeping an AI feature affordable in production</title>
      <link>https://omeryanbas.com/blog/ai-cost-control/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/ai-cost-control/</guid>
      <pubDate>Fri, 20 Mar 2026 09:00:00 GMT</pubDate>
      <description>An AI feature that works can still produce a bill nobody planned for. Where the tokens go, what to cache, what to trim and how to cap spend per user.</description>
    </item>
    <item>
      <title>Payment webhooks: signatures, replays and idempotency keys</title>
      <link>https://omeryanbas.com/blog/payment-webhook-security/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/payment-webhook-security/</guid>
      <pubDate>Fri, 06 Mar 2026 09:00:00 GMT</pubDate>
      <description>Verify the signature over the raw body, reject old timestamps, store the event id, never trust the amount. A compact handler and the checks around it.</description>
    </item>
    <item>
      <title>From a slow query to the right index</title>
      <link>https://omeryanbas.com/blog/slow-query-to-right-index/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/slow-query-to-right-index/</guid>
      <pubDate>Tue, 17 Feb 2026 09:00:00 GMT</pubDate>
      <description>Find the query, read the plan, then choose the column order. A practical route from a slow page to an index that actually gets used, and its cost.</description>
    </item>
    <item>
      <title>Idempotent jobs: doing the work exactly once</title>
      <link>https://omeryanbas.com/blog/idempotent-jobs/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/idempotent-jobs/</guid>
      <pubDate>Sat, 31 Jan 2026 09:00:00 GMT</pubDate>
      <description>Queues and webhooks deliver at least once, so every handler runs twice eventually. How to make the second run harmless with a key and a constraint.</description>
    </item>
    <item>
      <title>Two accessibility mistakes almost every site makes</title>
      <link>https://omeryanbas.com/blog/two-accessibility-classics/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/two-accessibility-classics/</guid>
      <pubDate>Sat, 17 Jan 2026 09:00:00 GMT</pubDate>
      <description>Heading levels chosen to match the layout, and an aria-label that hides the visible text. Both break keyboard and voice users, and both are cheap to fix.</description>
    </item>
    <item>
      <title>Self hosted fonts, privacy law and one request less</title>
      <link>https://omeryanbas.com/blog/self-hosted-fonts-privacy/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/self-hosted-fonts-privacy/</guid>
      <pubDate>Wed, 31 Dec 2025 09:00:00 GMT</pubDate>
      <description>A hosted font stylesheet hands every visitor IP address to another company before your page renders. Self hosting removes the transfer and a round trip.</description>
    </item>
    <item>
      <title>What the responsive images audit is really telling you</title>
      <link>https://omeryanbas.com/blog/responsive-images-audit/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/responsive-images-audit/</guid>
      <pubDate>Sun, 14 Dec 2025 09:00:00 GMT</pubDate>
      <description>The audit compares the file you sent with the pixels the device needs, which is layout width times pixel ratio. Here is how to read it and what to change.</description>
    </item>
    <item>
      <title>Invisible dot underscore files travelling from macOS to your server</title>
      <link>https://omeryanbas.com/blog/macos-tar-appledouble/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/macos-tar-appledouble/</guid>
      <pubDate>Sun, 30 Nov 2025 09:00:00 GMT</pubDate>
      <description>Extended attributes become AppleDouble files inside archives made on a Mac, land in your web root and get served. How to spot, stop and clean them up.</description>
    </item>
    <item>
      <title>The rsync flag that breaks certificate renewal</title>
      <link>https://omeryanbas.com/blog/rsync-delete-well-known/</link>
      <guid isPermaLink="true">https://omeryanbas.com/blog/rsync-delete-well-known/</guid>
      <pubDate>Thu, 13 Nov 2025 09:00:00 GMT</pubDate>
      <description>A mirroring deploy removes everything the build did not create, including the path a certificate authority reads. How to catch it weeks before the expiry.</description>
    </item>
  </channel>
</rss>
