Branchark

Backups of GitHub you can actually restore.

Your repositories, history, issues and pull requests — backed up automatically, independently and recoverably, into storage you control.

  • A read-only GitHub App: Branchark can never change your code.
  • Archives land in your own S3, R2 or B2 bucket, mirrors in GitLab.
  • Restore with tar, git and sha256sum. No Branchark needed.
acme/payments-api
Example
  1. Today, 02:00 Running

    Exporting pull request reviews

    Started 6 minutes ago

  2. Yesterday Complete

    48 refs, 1,204 issues, 386 pull requests

    Verified in 2 buckets

  3. Monday Complete

    47 refs, 1,198 issues, 384 pull requests

    Verified in 2 buckets

  4. Sunday Partial

    Archive verified

    GitLab mirror rejected a force-push

  5. Saturday Complete

    47 refs, 1,190 issues

    Verified in 2 buckets

  6. Friday Failed

    Bucket credentials rejected

    Owner notified, fixed the same day

An illustrative repository. Every run is a layer you can dig back to; failures stay visible instead of being overwritten by the next success.

One file per recovery point. No proprietary format.

Each snapshot is a plain tar archive: a verified Git bundle with every branch, tag and pull request ref, Git LFS objects, and GitHub metadata as gzipped JSON Lines — exactly as the API returned it, with original IDs, authors and timestamps.

  • Verified after upload

    Branchark downloads what it stored and compares SHA-256 checksums before calling a backup complete.

  • Every destination on its own

    One bucket failing never hides behind another succeeding. You see each copy’s state.

  • On your schedule

    Daily or weekly, in your time zone, safe across daylight-saving changes.

Inside one snapshot archive
branchark-acme-payments-api-20261021T020000Z/
├── manifest.json            schema, source ids, components, checksums
├── checksums.sha256         for sha256sum -c
├── RESTORE.md               instructions for this snapshot
├── git/
│   ├── repository.bundle    all branches, tags, refs/pull/*
│   └── refs.txt
├── lfs/objects/…            Git LFS content
└── metadata/
    ├── repository.json
    ├── issues.jsonl.gz
    ├── issue_comments.jsonl.gz
    ├── pull_requests.jsonl.gz
    ├── pull_request_reviews.jsonl.gz
    ├── pull_request_review_comments.jsonl.gz
    ├── labels.jsonl.gz
    ├── milestones.jsonl.gz
    └── releases.jsonl.gz

Recover without us.

If GitHub locks an account, a repository is deleted, or you simply leave, your archives still work. Standard tools restore the full history; the bundled guide explains the rest.

Restore a snapshot (replace SNAPSHOT with the downloaded file name)
tar -xf SNAPSHOT.tar && cd branchark-acme-payments-api-*
sha256sum -c checksums.sha256
git clone --mirror git/repository.bundle payments-api.git
cd payments-api.git
git push https://git.example.com/acme/payments-api.git \
  'refs/heads/*:refs/heads/*' 'refs/tags/*:refs/tags/*'

What a backup can and cannot give back.

Preserved

  • Complete Git history of every branch, tag and pull request ref
  • Issues, comments, pull requests, reviews, labels, milestones and releases with original IDs and timestamps
  • Git LFS objects and release assets, when enabled

Not recreated automatically

  • Issues imported elsewhere get new numbers, authors and dates — the archive keeps the originals
  • Reactions, project boards, discussions, Actions and repository settings are not exported
  • A GitLab mirror holds Git history only; it is not a substitute for an archive

Start with one repository.

Install the read-only GitHub App, add a bucket, and take your first verified snapshot in a few minutes.