YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
HugHub (hh)
What if GitHub went down and you didn't even notice?
Two-command setup
Install the hh CLI once:
uv tool install hughub
Then, from any existing GitHub checkout:
hf auth login
hh mirror
That is the whole setup. HugHub copies the current branch to a git-backed Hugging Face
repository, creates a free paired Static Space, and configures origin with two push URLs.
From then on, use Git normally:
git add .
git commit -m "Keep working"
git push
The same push goes to Hugging Face first and GitHub second. GitHub remains the fetch source,
so pulls and all existing tooling behave normally. Run hh mirror again at any time; setup
is idempotent.
By default the HF repository is YOUR_HF_USERNAME/GITHUB_REPO_NAME. Override it when needed:
hh mirror --hf-repo MY_ORG/MY_REPO
Git itself stops after a failed push destination. HugHub is ordered first, so a GitHub outage
cannot prevent the safety copy; Git reports GitHub's error only after HF accepts the commit.
If Hugging Face itself is down, push GitHub directly with git push github. A future HugHub
remote helper can make either partial failure completely invisible while preserving normal
git push syntax.
HugHub is a warm Hugging Face standby for GitHub. You and your agents use the familiar
gh command shape through hh:
hh pr create --fill
hh issue list
hh run watch 123
When GitHub is healthy, hh passes those commands straight through to gh. When GitHub's
PR, issue, or Actions APIs return an outage error, the same command continues on HugHub.
Commits and pull-request refs live in an already-git-backed Hugging Face repository, and
workflows run directly on Hugging Face Jobs.
There is no standby server fleet to pay for. A public HF repository can sit idle as the standby, its paired Static Space is free, and compute starts only for brief workflow-Job setup or Actions-compatible runs. Jobs are charged according to their selected hardware and runtime. In other words: you and your agents do not even need to know GitHub is down—you keep pushing to HugHub, the continuity layer is free while idle, and it costs little unless you choose substantial Job compute.
HugHub is currently an early MVP. Git mirroring, a free read-only Static Space, native webhook-triggered Jobs, promotion, lightweight HF pull requests/issues, and aggregate recovery PRs work. Periodic GitHub-to-HF synchronization still runs through
hh continuity sync, and broad GitHub Actions compatibility is still planned.
Advanced continuity setup
hh mirror intentionally starts with the smallest useful setup: the current branch, dual
push, and the Static Space. The older continuity command additionally mirrors all branches
and tags and prepares compatible Actions jobs:
hf auth login
gh auth login
cd your-repository
hh continuity enable OWNER/REPO --hf-repo HF_OWNER/REPO
This creates or reuses two repositories with the same HF identifier:
- A normal HF repo containing the SHA-identical Git mirror and native HF PR refs.
- A free Static Space containing a read-only GitHub-like UI and credential-free runner.
For every compatible workflow job and matrix entry, it creates a dormant HF Job and attaches
a native repo webhook directly to that Job. The webhooks start disabled, so GitHub Actions
remain the only CI system during normal operation. No dispatcher service or control plane is
involved.
The command adds github and hughub git remotes, mirrors branches and tags, and records the
last common commit locally under .git/hughub/config.json.
HugHub detects GitHub's visibility and defaults to a private HF repository if that check
fails; --public and --private can override it explicitly.
Then use hh anywhere you would normally use gh:
hh pr create --fill
hh pr list --json number,title,state
hh issue create --title "A bug" --body "Details"
hh run list
In normal mode these are real gh commands, with gh's flags, output, authentication, and
interactive behavior. For non-interactive agent calls, a recognized GitHub 5xx or network
failure automatically promotes collaboration to HugHub and retries the operation there.
No prompt rewrite. No new agent instructions. The agent just keeps working.
Partial and complete outages
HugHub separates GitHub's Git data plane from its collaboration and Actions APIs.
Overlay mode
Use this when git push still works but PRs, issues, or Actions do not:
hh failover --overlay
Git commits can continue going to GitHub. hh pr, hh issue, hh run, and
hh workflow run use HugHub. Transient failures from supported agent commands enter this
mode automatically. Promotion enables the native HF Job webhook.
Full HugHub mode
Use this when GitHub's Git transport is unavailable too:
hh failover --all
HugHub first pushes all locally available branches and tags to HF, records the recovery
base, and changes origin to the HF repository. From then on, ordinary git push plus the
same hh commands are independent of GitHub.
The promotion is deliberately explicit for Git writes. Automatically making two git hosts writable during a network partition would invite split-brain history.
Once promoted, pushes to the HF repo and updates to refs/pr/* rerun the corresponding
workflow Jobs directly. Each Job checks the webhook event and branch filters, checks out the
exact pushed commit, and executes its supported steps. No credential-bearing dispatcher or
second child Job is involved.
Coming back to GitHub
When GitHub is healthy again:
hh recover --to github
HugHub pushes the current HEAD to a timestamped hughub-recovery-* branch, opens one GitHub
pull request describing the recovery epoch and base commit, restores origin to GitHub, and
returns to standby mode.
Recovery disables the native HF webhook before moving work back, preventing duplicate runs.
To push the recovery branch without opening a PR:
hh recover --to github --no-pr
An aggregate patch PR is intentionally the default. Reconstructing every emergency issue, review, and PR on GitHub is possible later, but it is not required to get the code safely home.
Keeping the standby fresh
Run this from a developer machine, agent host, cron, or another trusted scheduler:
hh continuity sync
It fetches GitHub branches, mirrors them to HF, mirrors tags, and advances the recorded
recovery checkpoint. It also regenerates the Static Space with the latest file tree, README,
and commit history. It does not use git push --mirror, because that could delete HF's
refs/pr/* pull-request refs.
Before a full promotion, HugHub also pushes every branch and tag present in the local clone. This means a current developer or agent checkout remains useful even if GitHub can no longer be fetched.
The native webhook covers HF-side events after promotion. It deliberately does not mirror
GitHub while GitHub is primary, so run hh continuity sync periodically from a developer
machine, agent host, cron, or another trusted scheduler.
Read-only Static Space
The Space is a zero-compute snapshot rather than the Git backend itself. Keeping these separate preserves original Git commit SHAs and avoids adding Space metadata to the project. The generated UI includes:
- Repository file tree with links to HF's file browser
- README snapshot
- Recent commits and mirrored SHA
- Git remote and standby status
- A prominent arrow to HF's Community menu for issues and pull requests
The Space holds no credentials. Public automatic workflow Jobs also receive no HF token: they clone the public mirror after the webhook has selected an exact SHA.
Native webhook automation is intentionally disabled for private mirrors. HF webhook-triggered
Jobs currently do not inherit source-Job secrets, and webhook secrets can appear as ordinary
Job environment metadata, so passing a repository token through either path would be unsafe.
Private mirrors can still run workflows manually with hh workflow run and a separate,
fine-grained read-only token in HH_JOB_TOKEN.
Actions on Hugging Face Jobs
HugHub reads existing .github/workflows/*.yml files. runs-on labels are mapped to HF Jobs
hardware and images in an optional .hughub.yml:
runners:
ubuntu-latest:
flavor: cpu-upgrade
image: python:3.12
gpu:
flavor: a10g-small
image: nvidia/cuda:12.4.0-runtime-ubuntu22.04
Check whether workflows fit the current runner before an outage:
hh workflow doctor
After promotion, ordinary pushes launch matching workflows automatically:
git push
hh run list
hh run watch JOB_ID
You can also launch a workflow manually:
hh workflow run tests.yml
hh run list
hh run watch JOB_ID
The current native-webhook and manually launched runners support:
- Parsing
push,pull_request, andworkflow_dispatchdeclarations - Automatic
pushbranch filters and HF pull-request ref events - Shell
runsteps actions/checkout(performed natively before the steps)- Job and step environment variables
- Matrix expansion
- Mapping runner labels to an HF Jobs flavor and Docker image
It currently rejects job dependencies, services, job containers, and actions other than
actions/checkout. hh workflow doctor reports these before anything is launched. This
deliberately small subset makes emergency behavior predictable instead of silently claiming
compatibility that is not there.
HugHub collaboration commands
The HF backend currently implements the agent-critical subset:
hh pr list
hh pr create --fill
hh pr view NUMBER
hh pr checkout NUMBER
hh pr comment NUMBER --body TEXT
hh pr merge NUMBER
hh pr close NUMBER
hh issue list
hh issue create --title TEXT --body TEXT
hh issue view NUMBER
hh issue comment NUMBER --body TEXT
hh issue close NUMBER
hh issue reopen NUMBER
hh run list
hh run view JOB_ID
hh run watch JOB_ID
hh run cancel JOB_ID
These use Hugging Face discussions and the Hub's native refs/pr/NUMBER refs. Unsupported
commands fail explicitly rather than pretending to succeed.
Status and configuration
hh continuity status
hh continuity status --json
HugHub stores no repository state in a hosted HH control plane. The local file contains the
GitHub/HF pairing, Static Space, native webhook and source Job IDs, mode, last mirrored
commit, promotion time, and recovery base. Tokens stay with the existing gh and hf
authentication systems. Neither the public workflow Jobs nor the Static Space receive an HF
token.
Development
uv sync
uv run ruff check .
uv run pytest
uv run hh --help
The test suite uses fake gh, hf, and git process boundaries; it does not create remote
repositories or Jobs.
Design principles
- Invisible during healthy operation.
hhisghuntil GitHub cannot do the work. - Local failover authority. Promotion must not require contacting a failed control plane.
- Git first. Recovery is always possible from commits, even if collaboration metadata is incomplete.
- One writer after promotion. Preserve divergent work; never force an automatic merge.
- No idle infrastructure bill. Use a Static Space plus native Job webhooks; allocate compute only for brief Job setup and workflow runs.
- Honest compatibility. Diagnose unsupported workflows before an outage.