{"id":47317276,"url":"https://github.com/zapstore/zapstore-cli","last_synced_at":"2026-03-17T16:01:13.851Z","repository":{"id":249291854,"uuid":"831128014","full_name":"zapstore/zapstore-cli","owner":"zapstore","description":"The permissionless package manager","archived":false,"fork":false,"pushed_at":"2026-02-13T02:28:48.000Z","size":21456,"stargazers_count":22,"open_issues_count":11,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-13T11:04:07.706Z","etag":null,"topics":["cli","dart","freedom-tech","linux","macos","nostr","nostr-protocol","package","zapstore"],"latest_commit_sha":null,"homepage":"https://zapstore.dev","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zapstore.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-07-19T18:15:27.000Z","updated_at":"2026-02-13T02:28:52.000Z","dependencies_parsed_at":"2024-07-27T21:27:43.248Z","dependency_job_id":"60fe5993-696a-4417-8042-0de3d19d7c41","html_url":"https://github.com/zapstore/zapstore-cli","commit_stats":null,"previous_names":["zapstore/zapstore-cli"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/zapstore/zapstore-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zapstore%2Fzapstore-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zapstore%2Fzapstore-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zapstore%2Fzapstore-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zapstore%2Fzapstore-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zapstore","download_url":"https://codeload.github.com/zapstore/zapstore-cli/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zapstore%2Fzapstore-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30626901,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T14:16:03.965Z","status":"ssl_error","status_checked_at":"2026-03-17T14:16:03.380Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","dart","freedom-tech","linux","macos","nostr","nostr-protocol","package","zapstore"],"created_at":"2026-03-17T16:00:51.681Z","updated_at":"2026-03-17T16:01:13.845Z","avatar_url":"https://github.com/zapstore.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# zapstore\n\nA standalone CLI package manager for [zapstore](https://zapstore.dev), built on Nostr.\n\n## Install\n\n```bash\ngo install github.com/zapstore/zapstore@latest\n```\n\nOr download a pre-built binary from the [releases page](https://github.com/zapstore/zapstore/releases).\n\n## Usage\n\n```\nzapstore [flags] \u003ccommand\u003e [arguments]\n```\n\n### Commands\n\n```bash\nzapstore install \u003capp-id\u003e      # fetch from relay, download, verify, install\nzapstore remove  \u003capp-id\u003e      # uninstall\nzapstore update  [\u003capp-id\u003e]    # update one or all installed packages\nzapstore list                  # show installed packages\nzapstore search  \u003cquery\u003e       # discover packages on relay\nzapstore cleanup               # remove old versions and free disk space\n```\n\n### Flags\n\n| Flag | Description |\n|------|-------------|\n| `-q`, `--quiet` | Suppress status output (results and errors only) |\n| `-v`, `--verbose` | Show detailed output (relay URLs, platform info) |\n| `--json` | Output results as JSON (`list`, `search`) |\n| `--no-color` | Disable colored output |\n| `--refresh-profiles` | Force refresh of cached developer profiles |\n| `--version` | Print version and exit |\n| `-h`, `--help` | Show help |\n\nFlags can appear anywhere in the command:\n\n```bash\nzapstore -q install com.example.app\nzapstore search markdown --json\nzapstore list --json -q | jq '.[].app_id'\n```\n\n### First time\n\nNo setup is required: `search` and `install` work immediately. Installed binaries are symlinked into `~/.local/bin/`. After your first install, if that directory isn't on your `PATH`, the CLI prints the exact line to add to your shell profile (e.g. `export PATH=\"$HOME/.local/bin:$PATH\"`).\n\n### Examples\n\n```bash\n# Search for packages\nzapstore search jq\n\n# Search and pipe JSON to jq\nzapstore search jq --json | jq '.[].app_id'\n\n# Install a package\nzapstore install com.github.jqlang.jq\n\n# Install quietly (for scripts)\nzapstore install -q com.github.jqlang.jq\n\n# List installed packages\nzapstore list\n\n# List as JSON\nzapstore list --json\n\n# Update all packages\nzapstore update\n\n# Remove a package\nzapstore remove com.github.jqlang.jq\n\n# Clean up old versions\nzapstore cleanup\n```\n\n## How it works\n\n1. Queries the zapstore relay (`wss://relay.zapstore.dev`) for app, release, and asset metadata (Nostr kinds 32267, 30063, 3063)\n2. Filters assets by your current platform and architecture\n3. Downloads the binary and verifies its SHA-256 hash against the signed event\n4. Places the binary in `\u003cdata-dir\u003e/packages/\u003chex-pubkey\u003e-\u003capp-id\u003e/\u003cversion\u003e/` and symlinks `~/.local/bin/\u003capp-id\u003e` to it\n\n### Output design\n\nThe CLI uses a Cargo-inspired action-verb prefix pattern. Status messages go to stderr, data to stdout:\n\n```\n   Resolving  com.github.jqlang.jq\n       Found  jq v1.7.1\n Downloading  jq (2.1 MB)\n   Verifying  SHA-256 ✓\n  Installing  ~/.local/share/zapstore/bin/jq\n    Finished  installed jq v1.7.1 in 1.8s\n```\n\nThis means piping works correctly:\n\n```bash\n# Status on stderr, JSON data on stdout\nzapstore search markdown --json 2\u003e/dev/null | jq .\n\n# Quiet mode for scripting\nzapstore list -q --json | jq -r '.[].app_id' | xargs -I{} zapstore update {}\n```\n\n### Filesystem layout\n\nzapstore follows the [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/latest/). The filesystem is the sole source of truth -- there is no separate state file.\n\n| Path | Purpose | Default |\n|------|---------|---------|\n| `$XDG_DATA_HOME/zapstore/packages/\u003chex\u003e-\u003cappid\u003e/\u003cversion\u003e/` | Installed binaries | `~/.local/share/zapstore/packages/` |\n| `~/.local/bin/\u003capp-id\u003e` | Symlinks to active binary | `~/.local/bin/` |\n| `$XDG_CACHE_HOME/zapstore/` | Profile cache | `~/.cache/zapstore/` |\n| `$XDG_CONFIG_HOME/zapstore/config.env` | User-level configuration | `~/.config/zapstore/config.env` |\n\nPackage directories are prefixed with the publisher's hex pubkey for namespacing:\n\n```\n~/.local/share/zapstore/packages/\n  79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798-zapstore/\n    0.4.0/\n      zapstore-darwin-arm64\n\n~/.local/bin/zapstore  →  ~/.local/share/zapstore/packages/79be6...-zapstore/0.4.0/zapstore-darwin-arm64\n```\n\nAdd the bin directory to your `PATH`:\n\n```bash\nexport PATH=\"$HOME/.local/bin:$PATH\"\n```\n\n## Configuration\n\nzapstore automatically loads environment files in this priority order:\n\n1. Existing environment variables (highest priority)\n2. `.env.local` in current directory\n3. `.env` in current directory\n4. `~/.config/zapstore/config.env` (user-level defaults)\n\nExample `config.env`:\n\n```bash\nRELAY_URLS=wss://relay.zapstore.dev,wss://backup-relay.example.com\n```\n\n## Building from source\n\n```bash\ngit clone https://github.com/zapstore/zapstore.git\ncd zapstore\ngo build -o zapstore .\n\n# With version info:\ngo build -ldflags \"-X main.buildVersion=0.1.0\" -o zapstore .\n```\n\n## Environment variables\n\n| Variable | Description |\n|----------|-------------|\n| `RELAY_URLS` | Comma-separated Nostr relay URLs (default: `wss://relay.zapstore.dev`). Use e.g. `ws://localhost:4334` or multiple relays. |\n| `XDG_DATA_HOME` | Override data directory (default: `~/.local/share`) |\n| `XDG_CACHE_HOME` | Override cache directory (default: `~/.cache`) |\n| `XDG_CONFIG_HOME` | Override config directory (default: `~/.config`) |\n| `NO_COLOR` | Disable colored terminal output |\n| `FORCE_COLOR` | Force colored output even when not a TTY |\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzapstore%2Fzapstore-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzapstore%2Fzapstore-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzapstore%2Fzapstore-cli/lists"}