{"id":18230506,"url":"https://github.com/vltpkg/vsr","last_synced_at":"2025-04-04T12:05:47.875Z","repository":{"id":260983642,"uuid":"844703759","full_name":"vltpkg/vsr","owner":"vltpkg","description":"a minimal npm-compatible package registry","archived":false,"fork":false,"pushed_at":"2025-03-25T23:54:16.000Z","size":635,"stargazers_count":221,"open_issues_count":8,"forks_count":12,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-28T11:06:29.287Z","etag":null,"topics":["bun","cloudflare","javascript","nodejs","npm","pnpm","registry","serverless-framework","vlt","yarn"],"latest_commit_sha":null,"homepage":"https://www.vlt.sh/serverless-registry","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vltpkg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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}},"created_at":"2024-08-19T19:59:05.000Z","updated_at":"2025-03-20T03:29:44.000Z","dependencies_parsed_at":"2025-01-10T18:30:54.018Z","dependency_job_id":"6733567c-40b3-41ac-834b-23e7fe9b7b90","html_url":"https://github.com/vltpkg/vsr","commit_stats":{"total_commits":36,"total_committers":2,"mean_commits":18.0,"dds":0.02777777777777779,"last_synced_commit":"67c945dbb0795c214803c2e6a9042719f86fb9bd"},"previous_names":["vltpkg/vsr"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vltpkg%2Fvsr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vltpkg%2Fvsr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vltpkg%2Fvsr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vltpkg%2Fvsr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vltpkg","download_url":"https://codeload.github.com/vltpkg/vsr/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247174406,"owners_count":20896076,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["bun","cloudflare","javascript","nodejs","npm","pnpm","registry","serverless-framework","vlt","yarn"],"created_at":"2024-11-04T11:04:24.740Z","updated_at":"2025-04-04T12:05:47.846Z","avatar_url":"https://github.com/vltpkg.png","language":"JavaScript","readme":"# **vlt** serverless registry (`vsr`)\n\n`vsr` aims to be a minimal \"npm-compatible\" registry which replicates the core features found in `registry.npmjs.org` as well as adding net-new capabilities.\n\n\u003cimg src=\"https://github.com/user-attachments/assets/e76c6f8a-a078-4787-963c-8ec95a879731\" alt=\"vsr api screenshot\" /\u003e\n\n**Table of Contents:**\n\n- [Quick Starts](#quick-starts)\n- [Requirements](#requirements)\n- [API](#api)\n- [Compatibility](#compatibility)\n- [Comparisons](#comparisons)\n- [Roadmap](#roadmap)\n- [License](#license)\n\n### Quick Starts\n\n#### Local\n\nYou can quickly get started by installing/executing `vsr` with the following command:\n\n```bash\nnpx -y vltpkg/vsr\n```\n\n#### Production\n\nYou can deploy `vsr` to [Cloudflare](https://www.cloudflare.com/) in under 5 minutes, for free, with a single click (coming soon).\n\n\u003cimg src=\"https://github.com/user-attachments/assets/528deda2-4c20-44c9-b057-f07c2e2e3c71\" alt=\"Deply to Cloudflare Workers\" width=\"200\" /\u003e\n\n\u003c!-- [![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/vltpkg/vsr) --\u003e\n\nAlternatively, you can deploy to production using [`wrangler`](https://www.npmjs.com/package/wrangler) after following the **Development** quick start steps.\n\n#### Development\n\n```bash\n# clone the repo\ngit clone https://github.com/vltpkg/vsr.git\n\n# navigate to the repository directory\ncd ./vsr\n\n# install the project's dependencies\nnpm install\n\n# run tbe development script\nnpm run dev\n```\n\n### Requirements\n\n#### Production\n\n- [Cloudflare (free account at minimum)](https://www.cloudflare.com/en-ca/plans/developer-platform/)\n  - Workers (free: 100k requests /day)\n  - D1 Database (free: 100k writes, 5M reads /day \u0026 5GB Storage /mo)\n  - R2 Bucket (free: 1M writes, 10M reads \u0026 10GB /mo)\n\n\u003e Note: all usage numbers \u0026 pricing documented is as of **October 24th, 2024**. Plans \u0026 metering is subject to change at Cloudflare's discretion.\n\n#### Development\n\n- `git`\n- `node`\n- `npm`\n\n### Granular Access Tokens\n\nAll tokens are considered \"granular access tokens\" (GATs). Token entries in the database consist of 3 parts:\n\n- `token` the unique token value\n- `uuid` associative value representing a single user/scope\n- `scope` value representing the granular access/privileges\n\n#### `scope` as a JSON `Object`\n\nA `scope` contains an array of privileges that define both the type(s) of \u0026 access value(s) for a token.\n\n\u003e [!NOTE]\n\u003e Tokens can be associated with multiple \"types\" of access\n\n- `type(s)`:\n  - `pkg:read` read associated packages\n  - `pkg:read+write` write associated packages (requires read access)\n  - `user:read` read associated user\n  - `user:read+write` write associated user (requires read access)\n- `value(s)`:\n  - `*` an ANY selector for `user:` or `pkg:` access types\n  - `~\u003cuser\u003e` user selector for the `user:` access type\n  - `@\u003cscope\u003e/\u003cpkg\u003e` package specific selector for the `pkg:` access type\n  - `@\u003cscope\u003e/*` glob scope selector for `pkg:` access types\n\n\u003e [!NOTE]\n\u003e - user/org/team management via `@\u003cscope\u003e` is not supported at the moment\n\n\u003cdetails\u003e\n\n  \u003csummary\u003eScope Examples\u003c/summary\u003e\n\n##### End-user/Subscriber Persona\n\n- specific package read access\n- individual user read+write access\n\n```json\n[\n  {\n    \"values\": [\"@organization/package-name\"],\n    \"types\": {\n      \"pkg\": {\n        \"read\": true,\n      }\n    }\n  },\n  {\n    \"values\": [\"~johnsmith\"],\n    \"types\": {\n      \"user\": {\n        \"read\": true,\n        \"write\": true,\n      }\n    }\n  }\n]\n```\n\n##### Team Member/Maintainer Persona\n\n- scoped package read+write access\n- individual user read+write access\n\n```json\n[\n  {\n    \"values\": [\"@organization/*\"],\n    \"types\": {\n      \"pkg\": {\n        \"read\": true\n      }\n    }\n  },\n  {\n    \"values\": [\"~johnsmith\"],\n    \"types\": {\n      \"user\": {\n        \"read\": true,\n        \"write\": true,\n      }\n    }\n  }\n]\n```\n\n##### Package Publish CI Persona\n\n- organization scoped packages read+write access\n- individual user read+write access\n\n```json\n[\n  {\n    \"values\": [\"@organization/package-name\"],\n    \"types\": {\n      \"pkg\": {\n        \"read\": true\n      }\n    }\n  },\n  {\n    \"values\": [\"~johnsmith\"],\n    \"types\": {\n      \"user\": {\n        \"read\": true,\n        \"write\": true,\n      }\n    }\n  }\n]\n```\n\n\n##### Organization Admin Persona\n\n- organization scoped package read+write access\n- organization users read+write access\n\n```json\n[\n  {\n    \"values\": [\"@company/*\"],\n    \"types\": {\n      \"pkg\": {\n        \"read\": true,\n        \"write\": true\n      },\n      \"user\": {\n        \"read\": true,\n        \"write\": true\n      }\n    }\n  }\n]\n```\n\n##### Registry Owner/Admin Persona\n\n```json\n[\n  {\n    \"values\": [\"*\"],\n    \"types\": {\n      \"pkg\": {\n        \"read\": true,\n        \"write\": true\n      },\n      {\n        \"user\": {\n          \"read\": true,\n          \"write\": true\n        }\n      }\n    }\n  }\n]\n```\n\n\u003c/details\u003e\n\n### API\n\nWe have rich, interactive API docs out-of-the-box with the help of our friends [Scalar](https://scalar.com/). The docs can be found at the registry root when running `vsr` locally (ex. run `npx -y vltpkg/vsr` \u0026/or check out this repo \u0026 run `npm run dev`)\n\n### `npm` Client Compatibility\n\nThe following commands should work out-of-the-box with `npm` \u0026 any other `npm` \"compatible\" clients although their specific commands \u0026 arguments may vary (ex. `vlt`, `yarn`, `pnpm` \u0026 `bun`)\n\n#### Configuration\n\nTo use `vsr` as your registry you must either pass a registry config through a client-specific flag (ex. `--registry=...` for `npm`) or define client-specific configuration which stores the reference to your registry (ex. `.npmrc` for `npm`). Access to the registry \u0026 packages is private by default although an `\"admin\"` user is created during setup locally (for development purposes) with a default auth token of `\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"`.\n\n```ini\n; .npmrc\nregistry=http://localhost:1337\n//localhost:1337/:_authToken=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n```\n\n#### Supported `npm` Commands\n\n- ✅ implemented\n- ⏳ in progress\n- 🕤 planned to support\n\n| Support | Commannd |\n| :--: | :-- |\n| ✅ | `access` |\n| ✅ | `access list packages` |\n| ✅ | `access get status` |\n| ❌ | `access set status` |\n| ❌ | `access set mfa` |\n| ❌ | `access grant` |\n| ❌ | `access revoke` |\n| 🕤 | `adduser` - `PUT /-/org/@\u003corg\u003e/\u003cuser\u003e`: Adds/updates a user (requires admin privileges) |\n| ❌ | `audit` |\n| ✅ | `bugs` |\n| ❌ | `dist-tag add` |\n| ❌ | `dist-tag rm` |\n| ❌ | `dist-tag ls` |\n| ✅ | `deprecate` |\n| ✅ | `docs` |\n| ✅ | `exec` |\n| ❌ | `hook` |\n| ✅ | `install` |\n| ❌ | `login` |\n| ❌ | `logout` |\n| ❌ | `org` |\n| ✅ | `outdated` |\n| ❌ | `owner add` |\n| ❌ | `owner rm` |\n| ❌ | `owner ls` |\n| ✅ | `ping` |\n| ❌ | `profile enable-2fa` |\n| ❌ | `profile disable-2fa` |\n| ✅ | `profile get` |\n| 🕤 | `profile set` - `PUT /-/npm/v1/user`: Updates a user (requires auth) |\n| ✅ | `publish` |\n| ✅ | `repo` |\n| ❌ | `search` |\n| ❌ | `star` |\n| ❌ | `team` |\n| ✅ | `view` |\n| ✅ | `whoami` |\n\n- ✅ supported\n- ❌ unsupported\n\n### Comparisons\n\n| Feature | `vsr` | `verdaccio` | `jsr` |\n| -- | :-: | :-: | :-: |\n| Serverless | ✅ | ❌ | ❌ |\n| JavaScript Backend | ✅ | ✅ | ❌ |\n| Granular Access/Permissions | ✅ | ✅ | ❌ |\n| Proxy Upstream Registries | ⏳ | ✅ | ❌ |\n| Unscoped Package Names | ✅ | ✅ | ❌ |\n| npm Package Publishing | ✅ | ✅ | ❌ |\n| npm Package Installation | ✅ | ✅ | ✅\u003csup\u003e*\u003c/sup\u003e |\n| CDN | 🕤 | ❌ | ✅ |\n| ESM | 🕤 | ❌ | ✅ |\n| Manifest Validation | ✅ | ❌ | ❌ |\n| Plugins | ⏳ | ✅ | ❌ |\n| Events/Hooks | 🕤 | ✅ | ❌ |\n| Programmatic API | ❌ | ✅ | ❌ |\n| Web Interface | 🕤 | ✅ | ✅ |\n| Search | 🕤 | ✅ | ✅ |\n| First-Class Typescript | ❌ | ❌ | ✅ |\n| API Documentation Generation | ❌ | ❌ | ✅ |\n| Multi-Cloud | 🕤 | ✅ | ✅ |\n| **Azure DevOps Artifacts** Upstream | ✅ | ✅ | ✅ |\n| **JFrog Artifactory** Upstream | ✅ | ✅ | ❌ |\n| **Google Artifact Registry** Upstream | ✅ | ✅ | ❌ |\n\n\u003e `*` requires `jsr`-specific tooling or use a modified package name when using traditional npm clients (ref. https://jsr.io/docs/npm-compatibility)\n\n### Roadmap\n\n| Status | Feature |\n| :--: | :-- |\n| ✅ | api: minimal package metadata |\n| ✅ | api: full package manifests |\n| ✅ | api: publishing private, scoped packages |\n| ✅ | api: package manifest validation |\n| ✅ | api: admin user management (add/update/remove users) |\n| ✅ | api: user token management (add/update/remove tokens) |\n| ✅ | web: docs portal |\n| ✅ | api: unscoped packages |\n| ⏳ | web \u0026 api: custom dist-tags (`latest`  is supported) |\n| ⏳ | web \u0026 api: token rate-limiting |\n| 🕤 | web \u0026 api: search |\n| 🕤 | web \u0026 api: staging |\n| 🕤 | web: admin user management |\n| 🕤 | web: user registration |\n| 🕤 | web: user login (ex. `npm login` / `--auth-type=web`) |\n| 🕤 | web: user account management |\n\n### License\n\nThis project is licensed under the [Functional Source License](https://fsl.software) ([**FSL-1.1-MIT**](LICENSE.md)).\n","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvltpkg%2Fvsr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvltpkg%2Fvsr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvltpkg%2Fvsr/lists"}