Signed-off-by: Tyler Longwell <tlongwell@block.xyz> Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Max <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Mari <95cae996907d7cab9f5dbf43c0f53edeac6ab0b032a6feae4abfd784e467b3f5@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Quinn <96f056ad5f2305c8ddf637dc65d048aa4c12d7daeb8867690e34fca46b0ef64c@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Sami <f4a42a97e594b77bdbd8ee35191c8b28a94a4cb871d96f32921558275421fb68@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Perci <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Tyler Longwell <tlongwell@block.xyz>
git-credential-nostr
NIP-98 credential helper for git — signs HTTP auth events with your Nostr key so git can push/pull from Buzz's git server without passwords.
Requirements
- git 2.46+ (requires
authtypecapability in the credential protocol) - Rust toolchain (for building from source)
Installation
cargo install --path crates/git-credential-nostr
Setup
# 1. Register the helper and enable per-path credentials.
git config --global credential.helper nostr
git config --global credential.useHttpPath true
# 2. Store your nsec in a key file (must be 0600).
mkdir -p ~/.nostr
echo "nsec1..." > ~/.nostr/key && chmod 600 ~/.nostr/key
git config --global nostr.keyfile ~/.nostr/key
That's it. Use git normally — git clone, git push, git fetch.
CI / CD
Set $NOSTR_PRIVATE_KEY instead of a key file. The env var takes precedence
over nostr.keyfile and avoids touching the filesystem:
export NOSTR_PRIVATE_KEY=nsec1...
git clone https://relay.example.com/git/owner/repo.git
How It Works
When a Buzz git server returns HTTP 401 with a
WWW-Authenticate: Nostr realm="...", method="GET" header, git calls this
helper with the request details on stdin. The helper loads your Nostr private
key, builds a NIP-98
kind-27235 event signed over the request URL and method, base64-encodes it, and
writes it back to stdout. Git then retries the request with
Authorization: Nostr <token>, which the server verifies by checking the event
signature.
git ──stdin──▶ git-credential-nostr ──stdout──▶ git
│
▼
sign kind:27235 event
(NIP-98 HTTP Auth)
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
no nostr key configured |
Neither $NOSTR_PRIVATE_KEY nor nostr.keyfile is set |
Follow the Setup steps above |
insecure permissions |
Key file is readable by group/others | chmod 600 ~/.nostr/key |
method hint |
Server's WWW-Authenticate header is missing method="..." |
Upgrade the Buzz server |
useHttpPath |
credential.useHttpPath is not set |
git config --global credential.useHttpPath true |
| Empty output / no auth | git version is older than 2.46 | Upgrade git |
clock skew / auth rejected |
System clock is off by more than 60 s | Sync your system clock (ntpdate, timedatectl) |