The Curious Engineer

All blogs / DevOps / SRE / infrastructure

Mergify

mergify.com/blog

Stories, insights, and opinions from the team behind Mergify

DevOps / SRE / infrastructurePythonTesting / QA

Posts
107 from 6 Dec 2024 to 28 Oct 2026
Posting
weekly (84 in the last year)
Kind
company blog

2026 75

  1. “Re-run Failed Jobs” Is Not Flaky Test Management
  2. Python and Postgres Don’t Agree on What “CET” Means
  3. Moving Our Python Engine to httpx2: the Tracer and the Trust Store Were the Hard Part
  4. hash(id) % 8 Pinned One Python Process at 98% While Its Neighbors Idled
  5. A GitHub Actions Cache Key Is Not the Cache Key
  6. We Deleted a 63 MB GeoIP Database and Replaced It with a 64-Byte Signature
  7. Two Logins, One Tab, One Cache Key
  8. Merge Queue & CIShould you build your own merge queue?
  9. OpinionBuild vs. buy, after LLMs made building look cheap
  10. Every Test Gets a Fresh Postgres Database: Fast Per-Test Isolation in SQLAlchemy
  11. We Stopped Our Config Builder From Destroying Your YAML, Then Found a Worse Bug Next to It
  12. The Native TypeScript Compiler Cut Our Typecheck From 13s to 3.5s. The Only Hard Part Was ESLint.
  13. AI-assisted PRs break main half as often as human ones
  14. Our Frontend Was Guessing What Our Parser Accepts. It Was Wrong for 70 of 75 Attributes.
  15. Our Auth Library’s Last Release Was July 2022. We Noticed in June 2026.
  16. Merge Queues Were Built for Humans. AI Agents Need More.
  17. How we made our merge queue lower its own quality bar (only when it’s drowning)
  18. Two counters instead of a materialized view
  19. We put Jinja2 in our config for flexibility. Users wanted one variable.
  20. Merge Queue & CIStop Using Labels to Control CI in GitHub Actions
  21. Merge Queue & CIPath Filters Are a Convenience, Not a CI Gate
  22. Merge Queue & CIWhen to Outgrow GitHub's Merge Queue
  23. When a production deploy fails, our merge queue freezes itself
  24. Most aria-labels on your buttons are dead weight, and some are bugs
  25. ON CONFLICT DO UPDATE Is Rewriting Rows You Never Changed
  26. We Built a Merge Queue Mode That Skips the Safety Check on Purpose
  27. A Disk Alert, a 392 GB Table, and Indexes Bigger Than the Data
  28. Swapping a Primary Key on a 4M-Row Table: Why I Took 10 Minutes of Downtime
  29. Merge Queue & CIHow we run parallel merge queues on our own monorepo
  30. How Agents Work With Parallel Agents
  31. We Let an LLM Open Pull Requests Against Your .mergify.yml. The Prompt Was the Easy Part.
  32. Bun shipped 1M lines in nine days. The PR is the bottleneck now.
  33. How we built stacked PRs without a new git workflow
  34. We fixed Alembic’s multiple-heads error with Git history
  35. Merge Queue & CIHow to merge main into a branch in Git (and when to rebase instead)
  36. Making Dashboard Charts Actually Useful: Brush Zoom, Click-to-Filter, and Shareable URLs with ECharts
  37. TestingTimecop.freeze without Timecop.return is the textbook RSpec time bomb
  38. TestingPlaywright storageState is not just a setup file. It is a contract.
  39. We Spent Years Hardening Jinja2 in User Config. We’re Removing It Instead.
  40. TestingVitest's isolate:false buys you 30% speed and a class of flake you cannot grep for
  41. TestingHypothesis is not flaky. Your code under test is, and Hypothesis is the messenger.
  42. TestingRSpec system specs see an empty database. database_cleaner is why.
  43. 225 Self-Hosted GitHub Actions Runners: Why We Picked Docker Over VMs
  44. Testingregex101: A Practical Guide to the Regex Tester Engineers Actually Use
  45. TestingPlaywright route handlers fire only on requests they were registered before
  46. Testingvi.mock hoists. Your closure variables do not.
  47. Testingpytest-xdist makes the suite faster and the flakes weirder
  48. TestingRSpec randomized order is the messenger, not the bug
  49. I’m the new hire on a codebase I didn’t write
  50. TestingPlaywright auto-wait is great, until your component re-renders mid-action
  51. TestingVitest's `threads` pool is fast. It is also why your suite leaks state.
  52. Testingpytest fixture teardown races: when yield-style cleanup eats itself
  53. What GitHub Webhook Latency Actually Looks Like
  54. Merge Queue & CIGitHub Auto-Merge: When the Native Button Is Enough, and When You Outgrow It
  55. Merge Queue & CIHow to Enable GitHub Merge Queue with GitHub Actions: The 5-Minute Setup
  56. Merge Queue & CIHow to Cut Your GitHub Actions CI Bill (Without Compromising Tests)
  57. Why jest.retryTimes() is hiding bugs in your test suite
  58. A merge queue is critical infrastructure. Build it accordingly.
  59. Jest snapshot drift: when toMatchSnapshot lies about your code
  60. Fake-timer leakage in Jest: the flake nobody sees coming
  61. Switching from npm to pnpm found 3 phantom dependencies in our React app
  62. Python 3.14 in Production: What PEP 649 Actually Breaks
  63. A Markdown File Became Our Company-Wide On-Call Cheat Code
  64. How We Formally Verified Our Merge Queue with TLA+ (and Found Bugs That Tests Missed)
  65. Your Monorepo’s Merge Queue Has a Concurrency Problem
  66. Diving into pytest Finalizers
  67. How a Dashboard Arms Race Put Me on the App Store
  68. The Day My AI Agent Deleted 29 Git Worktrees
  69. When GitHub Webhooks Lie: How an Empty Array Broke Our Merge Queue
  70. The Comfortable Room
  71. How We Turned Claude Into a Cross-System Support Investigator
  72. Spinners Are the UX Equivalent of “TODO: Fix Later”
  73. Claude Didn’t Kill Craftsmanship
  74. On LATERAL Joins
  75. Detecting Blocking Tasks in Asyncio by Measuring Event Loop Latency

2025 30

  1. GitHub Merge Queue Was Step One. Real CI Orchestration Comes Next.
  2. Stop Lying to Your Dependency Resolver: The Real Rules for Python Dependency Management
  3. Lessons From a Noisy Monitor
  4. Monorepo CI for GitHub Actions: Run Exactly the Tests You Need, Nothing More
  5. await Is Not a Context Switch: Understanding Python’s Coroutines vs Tasks
  6. Updating Materialized Views (Without Worrying Too Much)
  7. Goodbye Checklists, Hello AI Linters
  8. Origin and Evolution of the Globstar
  9. Shadow Shipping: How We Double-Executed Code to Ship Safely
  10. Why PostgreSQL Ignored Our Index (and What the Planner Was Thinking)
  11. The Magic (and Mayhem) Behind Our Config Deprecation Transformers
  12. TypeScript’s import type: The Flag That Makes Builds Honest
  13. Should We Still Write Docs If AI Can Read the Code?
  14. Why WARNING Has No Place in Modern Logging
  15. AI Won’t Replace Code Reviews, But It Can Fix Them
  16. Friends Don’t Let Friends Use :latest
  17. Application vs. Database: Where Should Permissions Live?
  18. The Origin Story of Merge Queues
  19. What I Learned Building My First Jenkins Plugin
  20. Trunk-Based Development vs Gitflow: Which Branching Model Actually Works?
  21. Pull Request Management: Streamline Your Workflow with Automation
  22. Stop Abusing .gitignore
  23. Looking for a Bulldozer Alternative? Meet Mergify.
  24. Feature Branch Workflow: A Practical Guide for Git
  25. Mergify CI Insights Now Supports Jenkins
  26. Code Review: Culture, Flow, and Practices That Drive Team Performance
  27. CI Sucks (and That’s OK)
  28. GitHub’s Merge Queue Isn’t Enough for Large Teams
  29. CI Failures Don’t Just Break Builds: They Break Focus
  30. Handling Candidate Rejection: A Delicate Balancing Act

2024 2

  1. The Mechanics of Mergify’s Project-Driven Workflow
  2. Aligning Project Management with Team Culture at Mergify