Documentation

Quiver is a CLI sync layer for the global skills your AI agents share. One command pushes, one command pulls — and your skills follow you to every machine you sign in on.

Introduction

Most AI coding agents — Claude Code, Cursor, Gemini CLI, GitHub Copilot — read from a shared global skill registry at ~/.agents/.skill-lock.json. When you set up skills on one machine, they live in that file. Move to another machine and you're starting from scratch.

Quiver fixes that. It writes your lock file to a private GitHub Gist and replays the installs on any other machine you sign in on. There is no Quiver server, no new account, and no proprietary backend — the Gist on your own GitHub account is the source of truth.

tldr

Install Quiver. Run quiver login once. On every machine after that, run quiver sync.

Install

Quiver is distributed via npm and requires Node.js 18 or newer.

npm · global
$ npm install -g usequiver

Verify the install:

verify
$ quiver --version
quiver/0.2.4 darwin-arm64 node-v20.11.1

Prefer not to install globally? You can also run it with npx: npx usequiver sync. The CLI behaves identically; only the invocation differs.

Quick Start

From a machine that already has the skills you want to back up:

on the source machine
$ quiver login
 opens browser to github.com/login/device
 authenticated as nublson

$ quiver push
reading ~/.agents/.skill-lock.json 7 skills
writing gist://nublson/quiver-skill-lock.json
 pushed rev #23

Then, on every other machine you log into:

on the new machine
$ quiver login
 authenticated as nublson

$ quiver sync
 anthropics/skills        (2 skills, 6.4s)
 vercel-labs/agent-skills (1 skill,  7.8s)
 prisma/skills            (1 skill,  7.5s)
3 skills added, 4 already up to date

That's the whole loop. Run quiver push when you add new skills, quiver sync on machines that need to catch up.

Authentication

Quiver authenticates through GitHub's device flow — the same OAuth dance the official gh CLI uses. You'll be given a short code and a URL to paste it into. Quiver never sees your password, and the token never leaves your machine.

Required scopes

Quiver requests the minimum scopes needed to read and write a private Gist:

  • gist — to create and update the quiver-skill-lock.json Gist on your account.
  • read:user — to display your username in quiver whoami.
note

Tokens are stored in your OS keychain via keytar — never in a plaintext file. To revoke access, visit github.com/settings/applications.

Commands

Quiver exposes six commands. None of them take more than one or two flags. The signatures below use <required> for positional arguments and [--optional] for flags.

login

quiver login [--force]since 0.1.0

Starts the GitHub device flow and stores the resulting token in your OS keychain. Idempotent — running it again on an authenticated machine is a no-op unless you pass --force.

FlagTypeDefaultDescription
--forcebooleanfalseRe-authenticate even if a valid token exists.
--scopestringgist,read:userOverride requested scopes. Advanced only.

push

quiver push [--message <text>] [--dry-run]since 0.1.0

Reads ~/.agents/.skill-lock.json and writes it to your quiver-skill-lock.json Gist. Creates the Gist if it doesn't exist yet.

FlagTypeDefaultDescription
--message, -mstringautoCommit message for the Gist revision.
--dry-runbooleanfalsePrint the diff that would be pushed without actually pushing.

sync

quiver syncsince 0.1.0

Pulls the remote lock file, diffs it against the local one, and installs every missing skill. Skills are grouped by source repo so each repository is cloned at most once. All groups run concurrently with live per-source progress. Additive only — never removes or overwrites local skills.

What happens

  1. Fetches the remote lock from your private Gist
  2. Computes the diff: skills present remotely but missing locally
  3. Groups missing skills by sourceUrl — one npx skills add invocation per repo
  4. Runs all groups in parallel with a live progress line per source
  5. Re-reads the local lock file and upserts only the skills that succeeded
  6. Prints a summary: N skills added, M already up to date

If one source group fails, the others still complete and their skills are written to the lock file. The command exits with an error listing which sources failed.

Example output

terminal
$ quiver sync
 anthropics/skills          (4 skills, 9.1s)
 vercel-labs/agent-skills   (2 skills, 7.8s)
 supabase/agent-skills      (2 skills, 7.1s)
 prisma/skills              (4 skills, 7.5s)
 better-auth/skills         (2 skills, 6.7s)
25 skills added, 0 already up to date
note

In non-TTY environments (CI, piped output) listr2 falls back to plain line output — one line per source group, no spinner characters.

status

quiver status [--json]since 0.1.2

Compares the local lock file to the remote Gist. Prints a unified diff in the terminal — green for additions, red for removals, dim for unchanged entries.

example output
$ quiver status
local  rev #19 · 4 skills
remote rev #23 · 7 skills
────────────────────────────────
+ frontend-design       v1.2.0
+ pdf-reading           v0.4.1
+ react-best-practices  v2.0.0
  test-coverage         v1.1.0
  commit-style          v0.3.0

remove

quiver remove <skill> [--no-push]since 0.2.0

Removes a skill locally, repairs the lock file (the native npx skills tool leaves stale entries on uninstall), and pushes the cleaned lock to the Gist.

whoami

quiver whoamisince 0.1.0

Prints the authenticated GitHub user, the Gist ID, the device hostname, and the timestamp of the last successful sync.

example output
$ quiver whoami
user      nublson
gist      8f3a921e4b · quiver-skill-lock.json
device    work-imac (darwin-arm64)
last sync 2026-05-18 14:22:09 +00:00 · rev #23

Lock file

Quiver does not invent a new file format. It reads and writes the same ~/.agents/.skill-lock.json that npx skills already produces. A typical entry looks like this:

terminal
{
  "version": 2,
  "updated": "2026-05-18T14:22:09Z",
  "skills": {
    "frontend-design": {
      "source":  "github:anthropics/skills",
      "version": "1.2.0",
      "sha":     "4f1b…"
    }
  }
}

Quiver only writes to the skills object and the updated timestamp. It never touches keys it doesn't recognize, so it's safe to use alongside future skill-lock extensions.

Gist as storage

On first push, Quiver creates a single private Gist named quiver-skill-lock.json on your account. Every push is a new Gist revision, which gives you a free audit log: visit the Gist on github.com and you can browse every change.

There is exactly one Gist per user. Quiver finds it by listing your Gists and matching the filename — so renaming it on GitHub will break sync until you rename it back.

Conflicts

Quiver is intentionally simple: last push wins. If two machines push within the same minute, the later revision overwrites the earlier one in the Gist. The earlier revision is still visible in the Gist's history and can be recovered manually.

Sync is the safer direction. It never deletes local skills unless you pass --prune, so pulling stale data can only add — never lose — skills.

Config

Quiver reads optional configuration from ~/.config/quiver/config.json:

terminal
{
  "deviceName":    "work-imac",
  "lockFilePath":  "~/.agents/.skill-lock.json",
  "gistFilename":  "quiver-skill-lock.json",
  "autoPushOnAdd": false
}
KeyTypeDefaultDescription
deviceNamestringos.hostname()Friendly name shown in whoami output.
lockFilePathstring~/.agents/.skill-lock.jsonWhere to read/write the local lock file.
gistFilenamestringquiver-skill-lock.jsonFilename of the remote Gist.
autoPushOnAddbooleanfalseWatch the lock file and push on every change.

Environment variables

VariableDescription
QUIVER_TOKENOverride the keychain token. Useful in CI.
QUIVER_GIST_IDPin to a specific Gist instead of auto-discovering by filename.
QUIVER_LOCK_FILEOverride lockFilePath from config.
NO_COLORDisable colored output. Standard no-color.org behavior.
DEBUG=quiver:*Verbose debug logging.

Exit codes

CodeMeaning
0Success.
1Generic failure. Check stderr.
2Not authenticated — run quiver login.
3Lock file missing or unreadable.
4Remote Gist not found.
5Network error reaching GitHub API.
10Sync produced conflicts that need manual resolution.

FAQ

Can I share a lock file with my team?

Not yet. Quiver is built around your Gist on your GitHub account. Team-shared skill sets are tracked in issue #14 — open to design feedback.

Is my data private?

Yes. The Gist is created private. Quiver requests the gist scope (which covers both public and private), but only ever writes private Gists. You can verify this in gist.github.com/mine.

Does it work on Windows?

Yes — Quiver runs on macOS, Linux, and Windows (PowerShell and WSL). Paths are normalized internally, so a lock file pushed from macOS replays cleanly on Windows.

What happens if I'm offline?

quiver sync and quiver push exit with code 5 and a clear error message. Your local lock file is never touched on network failure.