One red page covered several jobs.
GitHub's status page reported widespread impact between 15:06 and 15:16 UTC on October 7. The incident touched Git Operations, Pull Requests, Actions, Issues, and Webhooks. GitHub posted full recovery across the named systems at 15:58 UTC while it continued to investigate the cause.[1]
That list matters more than the broad label "GitHub outage." Each service answers a different question. Git Operations moves repository objects and references. Pull Requests hold review conversation and merge state. Actions runs hosted workflow jobs. Webhooks deliver events to other systems. A green local commit does not prove any of the other routes worked.
The useful outage question is not "Can I code?" It is "Which receipt can I still produce?"
Local history is still a work surface.
A hosted forge can disappear while the local repository keeps accepting edits, commits, branches, diffs, and tests. Save work under a named branch. Record the base revision. Run checks that do not need the affected provider. Keep new dependency downloads and external services out of the claim unless they were available and recorded.
Do not turn "committed locally" into "backed up." A single laptop is still one failure domain. Git documents bundle files for offline transfer of repository objects and references. A full bundle can be created with git bundle create backup.bundle --all, checked with git bundle verify backup.bundle, and cloned elsewhere.[2]
A bundle does not include untracked files. It is not a copy of repository configuration, hooks, issue state, pull-request discussion, workflow logs, secrets, or hosted permissions. Commit the intended files first on a private recovery branch, or archive the untracked material through a separate approved path.
Do not improvise a second source of truth.
An outage is a bad time to create an unowned mirror and call it production. GitHub documents a mirror clone and mirror push for maintaining another Git repository.[3] That can support a planned continuity route. It does not copy the rest of the forge.
If a maintained secondary remote already exists, name its purpose and who may use it. Decide whether it accepts backup only, review branches, or releases. If no route exists, make the bundle and wait. A temporary remote without ownership, protected branches, credentials, or cleanup rules can create a longer incident than the provider did.
Hold review and CI claims separately.
When the pull-request route is down, a local diff can still be reviewed through an approved alternate channel. The review record must name the exact commit. It should also state that hosted branch rules and merge controls were unavailable. Do not merge because someone saw a screenshot or pasted diff.
When hosted Actions is down, a local test may provide useful evidence. It does not become the missing hosted check. Record the command, environment, revision, and output. After recovery, run the required workflow against the same candidate. GitHub says a badge shows the default branch unless its URL selects a branch or event.[4] Pin the exact run and revision. Do not rely on the badge alone.
Reconnect in order.
- Fetch once and compare the remote references with the recorded local base.
- Push the recovery branch without rewriting shared history.
- Open or restore the review record against the pushed commit.
- Run the required hosted workflows and wait for their final results.
- Check webhook consumers for missed, delayed, or duplicated work.
- Delete temporary bundles or alternate credentials only after the retained copy and policy say it is safe.
The incident was brief. The habit should last. Split local work, remote transport, review, and CI before the next red status page forces the distinction.
FORGE OUTAGE CARD BASE_REVISION=$(git rev-parse HEAD) RECOVERY_BRANCH=outage/<ticket> LOCAL_CHECKS=[COMMANDS AND OUTPUT PATH] OFFLINE_COPY=[BUNDLE PATH AND VERIFY RESULT] REMOTE_TRANSPORT=[AVAILABLE / HOLD] REVIEW_RECORD=[COMMIT AND REVIEWER] HOSTED_CI=[REPLAY REQUIRED] WEBHOOK_CONSUMERS=[RECONCILE AFTER RECOVERY] MERGE_AUTHORITY=[UNCHANGED]