<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Ship Then Fix</title>
    <link>https://shipthenfix.com</link>
    <description>Short reads on tech work — code, teams, and the human side.</description>
    <language>en-us</language>
    <lastBuildDate>Mon, 15 Jun 2026 00:00:00 GMT</lastBuildDate>
    <atom:link href="https://shipthenfix.com/rss.xml" rel="self" type="application/rss+xml"/>
<item>
  <title>Redis Cache Stampede: Single-Flight, Jitter, XFetch</title>
  <link>https://shipthenfix.com/redis-cache-stampede-prevention</link>
  <guid isPermaLink="true">https://shipthenfix.com/redis-cache-stampede-prevention</guid>
  <description>Hot keys expiring together trigger thundering herds. TTL jitter, Lua single-flight locks, XFetch early refresh, and stale-while-revalidate — when each pattern earns its keep.</description>
  <content:encoded>You shipped cacheaside, set a sensible TTL, watched hit rate climb in staging. Production traffic arrived and the graph still looked healthy. Then the top ten keys share an EXPIRE 3600 from the nightly warm job, the clock ticks, and Postgres activeconnections spikes while Redis reports nothing wrong. That is a cache stampede — thundering herd, coordinated miss, whatever label you prefer. Not a br…</content:encoded>
  <pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Engineer 1:1 Prep: Three-Slot Shared Doc Template</title>
  <link>https://shipthenfix.com/engineer-one-on-one-prep-habit</link>
  <guid isPermaLink="true">https://shipthenfix.com/engineer-one-on-one-prep-habit</guid>
  <description>Only 16% call their last manager chat meaningful. Own three doc slots — blocker, growth, feedback up — and prune to three bullets before the invite.</description>
  <content:encoded>Every engineering org schedules them. Gallup finds only 16% of employees call their last manager conversation extremely meaningful. The rest got a calendar block — checkin, standup with the door closed, or both. You know the slot exists. What no IC playbook spells out is what to write down before you walk in. Manager training covers listening ratios, Radical Candor quadrants, when to cancel. Your…</content:encoded>
  <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Price Technical Debt: Carry-Cost Worksheet for VPs</title>
  <link>https://shipthenfix.com/price-technical-debt-carry-cost</link>
  <guid isPermaLink="true">https://shipthenfix.com/price-technical-debt-carry-cost</guid>
  <description>Stop measuring debt, start pricing it. A VP rejected 17 metrics and $0 — use hours × rate to fund legacy auth remediation ($62k carry vs $32k principal).</description>
  <content:encoded>Last planning season I watched a VP reject a refactoring proposal in under thirty seconds. Not because the proposal was wrong. Because it contained seventeen engineering metrics and zero dollars. Cyclomatic complexity. Sonar debt ratio. A heat map nobody in the room knew how to action. Sonar turns orange. Planning forums stay gray. Not a vocabulary problem. A translation problem. Technical debt b…</content:encoded>
  <pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>PHP Turns 31: History, Birthday Date, and the ElePHPant</title>
  <link>https://shipthenfix.com/php-turns-31-history</link>
  <guid isPermaLink="true">https://shipthenfix.com/php-turns-31-history</guid>
  <description>PHP turned 31 on June 8, 1995. Short history from Personal Home Page Tools to the elePHPant mascot — accessible, not a version matrix.</description>
  <content:encoded>Most engineers meet PHP as a punchline long before they meet it as infrastructure. WordPress. Laravel. That legacy monolith nobody wants to touch until payroll week. Reputation first. Dependency later — often years later, when you&apos;re debugging something you didn&apos;t know you owned. After three decades, the dependency won. PHP still runs on the majority of sites where a serverside language can be de…</content:encoded>
  <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>First sprint retrospective: prep, script, follow-through</title>
  <link>https://shipthenfix.com/running-your-first-retrospective</link>
  <guid isPermaLink="true">https://shipthenfix.com/running-your-first-retrospective</guid>
  <description>Run your first retro without the venting-session trap — Prime Directive prep, diverge→converge→decide script, Adaptation Commitments, and the week-after loop teams skip.</description>
  <content:encoded>We schedule retrospectives because Scrum says we should. We pick a format from a blog post. We stickynote complaints for an hour. We leave with six action items owned by &quot;the team.&quot; Next sprint, nothing moved — and everyone learned the retro is a checkbox. The failure isn&apos;t agile skepticism. It&apos;s treating the meeting as the whole job. A retrospective that works is three acts: prep, facilitated in…</content:encoded>
  <pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>BullMQ background jobs: retries, dedup, DLQ</title>
  <link>https://shipthenfix.com/nodejs-bullmq-background-jobs</link>
  <guid isPermaLink="true">https://shipthenfix.com/nodejs-bullmq-background-jobs</guid>
  <description>Production BullMQ patterns for Node.js — bounded retries, jobId vs deduplication modes, DLQ wiring, Redis connection split, stalled jobs, and the removeOnComplete footgun.</description>
  <content:encoded>Most Node.js services ship background work the same way they ship health checks: copy a BullMQ tutorial, paste attempts: 3, call it resilient, and discover the gaps on the first Redis memory alert or the second Stripe charge on the same invoice. The failure mode isn&apos;t ignorance. You treated the queue as transport. Production needs policy — what to retry, what to dedupe, what to bury, and which Re…</content:encoded>
  <pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Engineering Burnout: Early Signs Engineers Miss</title>
  <link>https://shipthenfix.com/engineering-burnout-early-signals</link>
  <guid isPermaLink="true">https://shipthenfix.com/engineering-burnout-early-signals</guid>
  <description>Burnout misreads as skill gap, imposter syndrome, or toxic team. Engineering observables — review tone, estimates, post-ship indifference — show cynicism before exhaustion.</description>
  <content:encoded>Most engineers know burnout means tired. Few watch cynicism first. We monitor weekends, sleep debt, the postrelease crash — reasonable proxies for the exhaustion dimension Maslach and Leiter have been documenting since the 1990s. The WHO classification treats burnout as an occupational phenomenon with three legs: energy depletion, mental distance from the job, and reduced professional efficacy. E…</content:encoded>
  <pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>What Tech Leads Actually Do (Beyond Architecture)</title>
  <link>https://shipthenfix.com/tech-lead-role-reality</link>
  <guid isPermaLink="true">https://shipthenfix.com/tech-lead-role-reality</guid>
  <description>Tech lead is coordination and delivery with a technical vocabulary — not diagram duty. What changes day one, what doesn&apos;t, and why glue work is the job.</description>
  <content:encoded>When I first got called &quot;tech lead,&quot; I thought the job was architecture. Draw the boxes. Pick Postgres or Kafka. Win the whiteboard debate. Ship the diagram. Six weeks in I had drawn exactly one box. The rest went to Slack threads about CI flakes, designdoc comments, and a junior who couldn&apos;t get staging credentials. The team shipped. I barely merged code. I felt like I was failing upward. That&apos;s…</content:encoded>
  <pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>First On-Call Rotation: What Engineers Should Expect at 3am</title>
  <link>https://shipthenfix.com/first-on-call-rotation-guide</link>
  <guid isPermaLink="true">https://shipthenfix.com/first-on-call-rotation-guide</guid>
  <description>Shadow shifts, triage before heroics, and why &quot;I don&apos;t know yet&quot; is a professional status — what onboarding skips about your first pager week.</description>
  <content:encoded>Your phone buzzes at 3:12am. Not a text — the short vibration you&apos;ve trained yourself to fear. You read the alert twice because the service name in the page doesn&apos;t match anything you deployed last month. The runbook link opens to a Confluence page last edited by someone whose Slack account says &quot;deactivated.&quot; Somewhere, a product manager is already typing &quot;any update?&quot; in a channel you haven&apos;t j…</content:encoded>
  <pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Docker for Developers: Containerize Your First App (Minimal)</title>
  <link>https://shipthenfix.com/docker-first-app-minimal</link>
  <guid isPermaLink="true">https://shipthenfix.com/docker-first-app-minimal</guid>
  <description>Skip the 40-line Stack Overflow Dockerfile. Three mental models, one minimal Node Dockerfile, and Compose for Postgres — what to learn first and what to ignore.</description>
  <content:encoded>Here&apos;s an uncomfortable truth: most developers who &quot;use Docker&quot; have never containerized their own app. They pasted a Dockerfile from a gist, changed three paths, watched docker build fail twice, swapped the base image tag, and declared victory when the container stayed up for eleven minutes. The file has forty lines. They can explain maybe nine. That isn&apos;t competence. It&apos;s Dockerfile archaeology…</content:encoded>
  <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Astro 6.4: Sätteri Markdown &amp; Cloudflare cf() Guide</title>
  <link>https://shipthenfix.com/astro-64-markdown-satteri-cf</link>
  <guid isPermaLink="true">https://shipthenfix.com/astro-64-markdown-satteri-cf</guid>
  <description>When to switch markdown.processor to Sätteri, migrate remark plugins before Astro 8.0, and wire cf() for advanced routing on Cloudflare.</description>
  <content:encoded>Here&apos;s an uncomfortable truth about minor framework releases: the changelog reads like three bullet points, and the migration work hides in the assumptions. Astro 6.4 ships a pluggable markdown.processor, a Rustbased Sätteri option that the team says cut more than a minute off large docs builds, and cf() helpers for Cloudflare&apos;s experimental advanced routing. None of that is cosmetic. Each item m…</content:encoded>
  <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>How to Build a Culture of Accountability in IT Teams (58 chars)</title>
  <link>https://shipthenfix.com/accountability-culture-it-teams</link>
  <guid isPermaLink="true">https://shipthenfix.com/accountability-culture-it-teams</guid>
  <description>Most IT accountability initiatives produce engineers who hide failures instead of fixing them. Here&apos;s what actually works.</description>
  <content:encoded>We add &quot;accountability&quot; to team values docs. We run blameless retrospectives. We redesign the RACI matrix, assign owners to every service, and publish ownership charts to Confluence. Then a 3am incident happens, and the Slack thread fills with &quot;that was handled by X team&quot; — while the alert ages in silence. The culture didn&apos;t change. The vocabulary did. The uncomfortable part: the RACI update prob…</content:encoded>
  <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Monitor Microservices: OpenTelemetry, RED, Sampling</title>
  <link>https://shipthenfix.com/monitor-microservices-architecture</link>
  <guid isPermaLink="true">https://shipthenfix.com/monitor-microservices-architecture</guid>
  <description>Practical microservices monitoring with OpenTelemetry Collector, RED alerts, tail sampling, and trace-log correlation — week-one rollout order.</description>
  <content:encoded>Most teams running microservices know what Prometheus is. Fewer can open one slow checkout trace and land on the exact log line that proves which downstream call stalled. That gap is not a tooling gap — it&apos;s an architecture gap. You instrumented services individually, bought a dashboard product, and called it observability. Monitoring a microservices architecture in production means shipping metr…</content:encoded>
  <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Help Engineers Feel in Control of Workload</title>
  <link>https://shipthenfix.com/engineer-workload-control</link>
  <guid isPermaLink="true">https://shipthenfix.com/engineer-workload-control</guid>
  <description>WIP limits, maker-schedule blocks, and visible queues beat vague autonomy. Manager playbook for workload control without surveillance.</description>
  <content:encoded>When I first became a tech lead, I thought control was something you granted. Give the squad autonomy. Don&apos;t micromanage. Trust the process. The team would feel ownership, and workload would sort itself out because adults manage their own calendars. Six months later, standup was a performance. Fourteen tickets sat &quot;In Progress&quot; on the board. Everyone looked busy. Nobody could answer &quot;what&apos;s actua…</content:encoded>
  <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Laravel Entitlements: plans, slots, and token pools</title>
  <link>https://shipthenfix.com/laravel-entitlements-subscription-plans</link>
  <guid isPermaLink="true">https://shipthenfix.com/laravel-entitlements-subscription-plans</guid>
  <description>Model SaaS entitlements in Laravel: slot vs pool strategies, two-phase device release, immutable plan transitions, and where Cashier fits — masterix21/laravel-entitlements walkthrough.</description>
  <content:encoded>The uncomfortable truth about SaaS limits: most teams store who pays and what they can still use in the same mental bucket. Cashier says the workspace is subscribed. Your product still refuses the ninth invite because eight seats are bound to eight humans. Those are different columns — and the bug reports that start with &quot;but they&apos;re on Pro&quot; are almost always a category error, not a billing glitc…</content:encoded>
  <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>PostgreSQL vs MongoDB: Workload Contracts Compared</title>
  <link>https://shipthenfix.com/postgres-vs-mongodb</link>
  <guid isPermaLink="true">https://shipthenfix.com/postgres-vs-mongodb</guid>
  <description>Postgres vs MongoDB isn&apos;t a speed contest — JSONB, BSON partial updates, ACID design, and sharding ops decide which contract fits your hot path.</description>
  <content:encoded>You&apos;re about to run the comparison everyone runs: feature matrix, benchmark screenshot, declare a winner, move on. I&apos;ve watched teams do exactly that — pick MongoDB for schema freedom, hit month three with normalized collections and joinshaped aggregation pipelines; pick Postgres for JSONB, then watch autovacuum and row rewrites eat a telemetry table alive under partial updates. The databases are…</content:encoded>
  <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>NestSync NestJS SDK Generator vs OpenAPI Codegen</title>
  <link>https://shipthenfix.com/nestsync-nestjs-sdk-generator</link>
  <guid isPermaLink="true">https://shipthenfix.com/nestsync-nestjs-sdk-generator</guid>
  <description>NestJS OpenAPI codegen vs NestSync: when source-first wins in a monorepo, when spec-first wins for partners, and what both pipelines get wrong.</description>
  <content:encoded>When I first wired a NestJS monorepo, I assumed the grownup path was @nestjs/swagger, export the JSON, run OpenAPI Generator, commit the client. Decorators in, types out, standup over. After a few sprints of DTO refactors and a partner team asking for &quot;the spec,&quot; I stopped treating Swagger as documentation and started treating it as a second codebase nobody owned. The mistake to avoid isn&apos;t &quot;pick…</content:encoded>
  <pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
</item>
  </channel>
</rss>
