08. Maintenance & Iteration

Create a Maintenance Runbook for Your Open Source Project

A practical guide to writing a simple maintenance runbook so your Open Source project can stay reliable when problems happen.
Table of Contents
In: 08. Maintenance & Iteration

Maintenance gets harder when important knowledge lives only in your head. You may know how to restart a service, publish a patch, rotate a token, or respond when a user reports broken data. But if you are tired, busy, unavailable, or welcoming a new maintainer, that hidden knowledge becomes a risk.

A maintenance runbook is a plain-language guide for keeping an Open Source project operating. It does not need to be fancy. It should answer one question: when something common goes wrong, what should a maintainer do next?

For public-benefit software in education, accessibility, security, and civic projects, reliability matters. People may depend on your tool to learn, communicate, stay safe, or access services. A runbook helps your project serve those people more consistently.


Start With the Problems That Actually Happen

Do not try to document every possible failure. Start with the repeat issues you already see. Your first runbook can cover five to ten common situations.

Good candidates include:

  • A user cannot sign in.
  • A scheduled job stops running.
  • A dependency update breaks the build.
  • A release needs to be rolled back.
  • A project website or documentation page is down.
  • A security report arrives by email or issue.
  • A maintainer needs to publish a hotfix.
  • A demo instance runs out of storage or quota.

If your project is still small, use your issue history, release notes, and commit history as clues. Look for tasks you have done more than once and would not want to explain from scratch during a stressful moment.


Write for a Tired Maintainer

A runbook is not a design document. It is not the place for long background essays. Write it for someone who is trying to fix a problem at the end of a long day.

Each entry should be short, direct, and easy to scan. Use simple headings and numbered steps. Avoid clever wording. If a command is dangerous, say so clearly before the command appears.

A useful runbook entry usually includes:

  • Symptoms: what the problem looks like.
  • Impact: who is affected and how badly.
  • First checks: the fastest safe ways to confirm the issue.
  • Fix steps: the normal repair process.
  • Rollback: how to undo the change if it makes things worse.
  • Aftercare: what to update, communicate, or monitor afterward.

The goal is not perfection. The goal is to reduce guessing when the project needs calm, careful action.


Use a Simple Runbook Template

You can keep your runbook in your repository as MAINTENANCE.md, in a docs/maintenance folder, or in another place your maintainers can easily find. If some information is sensitive, keep the public instructions separate from private credentials.

Here is a basic structure you can copy:

  • Problem: Name the maintenance issue.
  • When to use this: Describe the visible signs.
  • User impact: Explain who may be affected.
  • Before you start: List access, tools, and warnings.
  • Steps: Provide the repair process in order.
  • Verify: Explain how to confirm the fix worked.
  • If it fails: Give the safest next action.
  • Follow-up: Note any issue comments, release notes, or documentation updates needed.

This template keeps entries consistent. Consistency matters because maintainers should not have to relearn the document every time they open it.


Example: A Broken Export in an Education Tool

Imagine an Open Source reading assessment tool used by small tutoring programs. Teachers can export student progress as a CSV file. After a dependency update, exports start failing for names with accent marks. The app still loads, but teachers cannot download reports they need for family meetings.

A runbook entry might look like this:

  • Problem: CSV export fails or produces unreadable characters.
  • When to use this: Users report failed downloads, blank CSV files, or broken names in exported reports.
  • User impact: Teachers and program staff may be unable to share student progress with families.
  • Before you start: Do not use real student data in local testing. Use the sample dataset in the test fixtures.
  • Steps: Reproduce with the accented-name fixture, run the export test suite, check recent changes to CSV encoding or dependency versions, and patch the export function.
  • Verify: Confirm the sample export opens correctly in a spreadsheet app and plain text editor.
  • If it fails: Revert the dependency update and publish a patch release if the current release affects users.
  • Follow-up: Add a regression test and comment on the issue with the fixed version.

This is not a huge document. But it protects users, reduces maintainer stress, and turns a painful bug into a reusable maintenance process.


Include Access Without Exposing Secrets

Many maintenance tasks require access: package registries, hosting dashboards, domain settings, analytics, email accounts, or security inboxes. Your runbook should explain what access is needed, but it should not publish secrets.

Safe access documentation can include:

  • Which service is used for releases, hosting, or package publishing.
  • Which maintainer role is required.
  • Where private credentials are stored, without revealing the credentials.
  • Who can grant access when a maintainer joins or leaves.
  • What to do if a token may have been exposed.

For Open Source projects, this balance is important. Public documentation helps contributors understand the project, while private handling of credentials protects users and maintainers.


Add a “Stop and Ask” Rule

A good runbook should also say when not to continue. Some situations are too risky for solo action, especially if they involve user data, security reports, destructive database changes, or unclear legal obligations.

Add a short “stop and ask” section for high-risk tasks. For example:

  • Stop if the fix requires deleting user data.
  • Stop if a security report includes a working exploit.
  • Stop if you cannot reproduce the issue safely.
  • Stop if a rollback would affect all active users.
  • Stop if you are unsure whether logs contain sensitive information.

This is not bureaucracy. It is a safety rail. Sustainable maintenance means knowing when to move quickly and when to slow down.


Test the Runbook Before You Need It

A runbook that has never been tried may hide bad assumptions. Schedule a small practice session after you write the first version. Pick one entry and follow it exactly in a safe environment.

As you test, ask:

  • Can a new maintainer find the document?
  • Are any steps missing?
  • Are the commands current?
  • Does the verification step prove the issue is fixed?
  • Does the rollback step actually work?
  • Are there words that only the original author understands?

If a step feels obvious to you, write it down anyway. The best maintenance docs often capture boring details that become very useful later.


Keep It Small and Updated

Your runbook should grow with real maintenance experience. Do not let it become a museum of outdated instructions. When you fix a recurring problem, update the related entry while the details are fresh.

A simple habit works well: after a production fix, release repair, or confusing bug investigation, ask one question before closing the issue: Should the runbook change?

Sometimes the answer is no. But when the answer is yes, add the missing command, warning, link, or verification step immediately. Small updates keep the runbook alive.

This supports the broader mission of public-benefit Open Source: useful tools should not depend on one exhausted maintainer remembering everything. Shared maintenance knowledge makes projects more dependable, more welcoming, and easier to sustain.


TL;DR

A maintenance runbook is a practical guide for handling common project problems. Start with real issues, write for tired maintainers, use a consistent template, protect secrets, include stop-and-ask rules, and test the instructions before an emergency. For Open Source software that serves communities, a good runbook helps keep the lights on and the bugs out.

Written By
Cory Fail
Cory Fail leads the Software for Progress Foundation, helping developers build Open Source tools for education, accessibility, and social good through mentorship and community support.
Comments
More From Software for Progress Foundation
Great! You’ve successfully signed up.
Welcome back! You've successfully signed in.
You've successfully subscribed to Software for Progress Foundation.
Your link has expired.
Success! Check your email for magic link to sign-in.
Success! Your billing info has been updated.
Your billing was not updated.