{"_id":"@axnic/pulumi-garage","_rev":"3-94c0fee608cea70ddc4c33b43f08cb6c","name":"@axnic/pulumi-garage","dist-tags":{"next":"1.0.0-alpha.0","latest":"1.0.1"},"versions":{"1.0.0-alpha.0":{"name":"@axnic/pulumi-garage","version":"1.0.0-alpha.0","keywords":["garage","s3","object-storage","self-hosted"],"license":"Apache-2.0","_id":"@axnic/pulumi-garage@1.0.0-alpha.0","maintainers":[{"name":"anicolaie","email":"zt5w54gaz@mozmail.com"}],"homepage":"https://github.com/axnic/pulumi-garage","bugs":{"url":"https://github.com/axnic/pulumi-garage/issues"},"dist":{"shasum":"94239fc3bb1bf67edf3c033d24426a6a229b97de","tarball":"https://registry.npmjs.org/@axnic/pulumi-garage/-/pulumi-garage-1.0.0-alpha.0.tgz","fileCount":15,"integrity":"sha512-zH3zAYC6DdL5EklE6SXqA/3+wqlPpHGNqAo9cPayTE6WCE/oe2SbL7+BFeYFQLRUPm16PJOAUobqMYZ0g5wsag==","signatures":[{"sig":"MEUCIBpDrOrFeiqJxKNvXmzrc53KtZeWHhRi9l/JnRiFnHMKAiEA2fJ2lZxqh6J3dZ468PxumwFMupR6VzteNzs52xIxwZM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26562},"pulumi":{"name":"garage","server":"github://api.github.com/axnic/pulumi-garage","version":"1.0.0-alpha.0+dev","resource":true},"gitHead":"e633aeed392c9d35e7245dff91ca6a59409a4063","scripts":{"build":"tsc"},"_npmUser":{"name":"anicolaie","email":"zt5w54gaz@mozmail.com"},"repository":{"url":"git+https://github.com/axnic/pulumi-garage.git","type":"git"},"_npmVersion":"11.16.0","description":"A Pulumi provider to manage Garage S3-compatible object storage.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@pulumi/pulumi":"^3.142.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.3.5","@types/node":"^18"},"_npmOperationalInternal":{"tmp":"tmp/pulumi-garage_1.0.0-alpha.0_1784066796178_0.4914371912074402","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@axnic/pulumi-garage","version":"1.0.0","keywords":["garage","s3","object-storage","self-hosted"],"license":"Apache-2.0","_id":"@axnic/pulumi-garage@1.0.0","maintainers":[{"name":"anicolaie","email":"zt5w54gaz@mozmail.com"}],"homepage":"https://github.com/axnic/pulumi-garage","bugs":{"url":"https://github.com/axnic/pulumi-garage/issues"},"dist":{"shasum":"45fb593343c6e29968ad5176e208ab9c22970ac1","tarball":"https://registry.npmjs.org/@axnic/pulumi-garage/-/pulumi-garage-1.0.0.tgz","fileCount":36,"integrity":"sha512-HpAqLrUwtENX8AkWtpc9VszldM/xcb5sCVb0GwtYeB8TcSgEiHR2kKGRDkoX2KJvgm62PY87nwX7ofxS/6Tn1A==","signatures":[{"sig":"MEQCIBqLo6zM6VYFHejDHOpde4jaEdB+xflp2ICSqOhVBlA1AiAPI2pyCSJqg68AOVzExvnhe4xC8EXd9fVXBV89WOOgaQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@axnic%2fpulumi-garage@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":63182},"types":"./index.d.ts","pulumi":{"name":"garage","server":"github://api.github.com/axnic/pulumi-garage","version":"1.0.0","resource":true},"gitHead":"8a0cf4d68de8014a58d8554ca48660acfbd7cb82","scripts":{"build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:841e2f57-682a-489f-8e98-efdedee6df6e"}},"repository":{"url":"git+https://github.com/axnic/pulumi-garage.git","type":"git"},"_npmVersion":"11.16.0","description":"[![GitHub release](https://img.shields.io/github/v/release/axnic/pulumi-garage?logo=github&sort=semver)](https://github.com/axnic/pulumi-garage/releases/latest) [![Go Reference](https://pkg.go.dev/badge/github.com/axnic/pulumi-garage/sdk/go/pulumi-garage.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@pulumi/pulumi":"^3.142.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.3.5","@types/node":"^18"},"_npmOperationalInternal":{"tmp":"tmp/pulumi-garage_1.0.0_1784071059723_0.8164866661873713","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@axnic/pulumi-garage","version":"1.0.1","keywords":["garage","s3","object-storage","self-hosted"],"homepage":"https://github.com/axnic/pulumi-garage","repository":{"type":"git","url":"git+https://github.com/axnic/pulumi-garage.git"},"license":"Apache-2.0","scripts":{"build":"tsc"},"dependencies":{"@pulumi/pulumi":"^3.142.0"},"devDependencies":{"@types/node":"^18","typescript":"^4.3.5"},"pulumi":{"resource":true,"name":"garage","version":"1.0.1","server":"github://api.github.com/axnic/pulumi-garage"},"gitHead":"af1a02ce631d23b0937b924ad56a31d1564debb1","types":"./index.d.ts","_id":"@axnic/pulumi-garage@1.0.1","description":"[![GitHub release](https://img.shields.io/github/v/release/axnic/pulumi-garage?logo=github&sort=semver)](https://github.com/axnic/pulumi-garage/releases/latest) [![Go Reference](https://pkg.go.dev/badge/github.com/axnic/pulumi-garage/sdk/go/pulumi-garage.","bugs":{"url":"https://github.com/axnic/pulumi-garage/issues"},"_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-3Kaob/uMaUEyyaWBliEyHhbFDGHyXzAFb0lqmKBl6/Wxp2IeTEa+81oLUeK6wbjctlAQudvtZdJnyInv4je6AA==","shasum":"b26701ed41314ea49afc465fec79604ef7b59634","tarball":"https://registry.npmjs.org/@axnic/pulumi-garage/-/pulumi-garage-1.0.1.tgz","fileCount":36,"unpackedSize":63200,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@axnic%2fpulumi-garage@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAUsww0ykePkclij4vk+7k/uGY40bCso8toFgdlK/W+EAiAp+W6m18FWN/rnBwdbt9Nfqtd5mOT1xxbE+vCuAlST1A=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:841e2f57-682a-489f-8e98-efdedee6df6e"}},"directories":{},"maintainers":[{"name":"anicolaie","email":"zt5w54gaz@mozmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pulumi-garage_1.0.1_1784072514650_0.35368364858321"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-14T22:06:35.955Z","modified":"2026-07-14T23:41:55.162Z","1.0.0-alpha.0":"2026-07-14T22:06:36.309Z","1.0.0":"2026-07-14T23:17:39.856Z","1.0.1":"2026-07-14T23:41:54.832Z"},"bugs":{"url":"https://github.com/axnic/pulumi-garage/issues"},"license":"Apache-2.0","homepage":"https://github.com/axnic/pulumi-garage","keywords":["garage","s3","object-storage","self-hosted"],"repository":{"type":"git","url":"git+https://github.com/axnic/pulumi-garage.git"},"description":"[![GitHub release](https://img.shields.io/github/v/release/axnic/pulumi-garage?logo=github&sort=semver)](https://github.com/axnic/pulumi-garage/releases/latest) [![Go Reference](https://pkg.go.dev/badge/github.com/axnic/pulumi-garage/sdk/go/pulumi-garage.","maintainers":[{"name":"anicolaie","email":"zt5w54gaz@mozmail.com"}],"readme":"[![GitHub release](https://img.shields.io/github/v/release/axnic/pulumi-garage?logo=github&sort=semver)](https://github.com/axnic/pulumi-garage/releases/latest)\n[![Go Reference](https://pkg.go.dev/badge/github.com/axnic/pulumi-garage/sdk/go/pulumi-garage.svg)](https://pkg.go.dev/github.com/axnic/pulumi-garage/sdk/go/pulumi-garage)\n[![npm version](https://img.shields.io/npm/v/%40axnic%2Fpulumi-garage.svg)](https://www.npmjs.com/package/@axnic/pulumi-garage)\n[![PyPI version](https://img.shields.io/pypi/v/pulumi_garage.svg)](https://pypi.org/project/pulumi_garage/)\n[![NuGet version](https://img.shields.io/nuget/v/Axnic.Pulumi.Garage.svg)](https://www.nuget.org/packages/Axnic.Pulumi.Garage/)\n[![License](https://img.shields.io/github/license/axnic/pulumi-garage.svg)](LICENSE)\n\n# Pulumi Garage Provider\n\nA Pulumi native provider for managing [Garage](https://garagehq.deuxfleurs.fr), a\nself-hosted, S3-compatible distributed object storage system, through its Admin API.\n\nIt manages three resources: **`Bucket`** (with an optional global alias, static-website\nhosting, and storage quotas), **`Key`** (an S3 access key), and\n**`BucketKeyPermission`** (a read/write/owner grant of a `Key` on a `Bucket`). Cluster\nbootstrapping (nodes, zones, capacity, layout) is out of scope - see\n[Known limitations](#known-limitations).\n\n> [!NOTE]\n> **Provenance.** This provider was built end-to-end by an AI coding agent (Claude)\n> in an autonomous, \"vibe coded\" session, without a human reviewing the implementation\n> line by line. That's a deliberate reason the project leans hard on automated testing\n> rather than manual review for confidence: unit tests for the Admin API client and\n> each resource's create/read/update/delete logic, plus a real end-to-end suite that\n> stands up an actual Garage cluster in Docker and exercises it (including a genuine S3\n> object upload/download through a granted permission) - see [CONTRIBUTING.md](CONTRIBUTING.md).\n> Review the code yourself before trusting it with production data.\n\n## Installing\n\nThis package is available in several languages. Only the Go and YAML SDKs are\nexercised by this repo's own examples and E2E tests (see\n[Known limitations](#known-limitations)); the others are generated and published for\nconvenience but are otherwise untested by this project beyond schema-level checks.\n\n### Node.js (JavaScript/TypeScript)\n\n```bash\nnpm install @axnic/pulumi-garage\n```\n\n### Python\n\n```bash\npip install pulumi_garage\n```\n\n### Go\n\n```bash\ngo get github.com/axnic/pulumi-garage/sdk/go/pulumi-garage\n```\n\n### .NET\n\n```bash\ndotnet add package Axnic.Pulumi.Garage\n```\n\nThe provider binary itself doesn't require any of the above - `pulumi plugin install\nresource garage <version>` (or the engine's automatic resolution) fetches it directly\nfrom this repo's [GitHub Releases](https://github.com/axnic/pulumi-garage/releases), no\nPulumi Registry listing required.\n\n## Quickstart\n\nPoint the provider at your Garage cluster's Admin API, either via stack config:\n\n```bash\npulumi config set garage:endpoint http://localhost:3903\npulumi config set garage:adminToken <token> --secret\n```\n\nor the `GARAGE_ADMIN_ENDPOINT` / `GARAGE_ADMIN_TOKEN` environment variables. This\nprovider does not bootstrap a Garage cluster for you - see\n[garagehq.deuxfleurs.fr](https://garagehq.deuxfleurs.fr) for setting one up\n(`garage layout assign`/`apply`, or `--single-node` for a single-node cluster).\n\nThen, a minimal YAML program (see [`examples/yaml/Pulumi.yaml`](examples/yaml/Pulumi.yaml),\nor [`examples/go/main.go`](examples/go/main.go) for the Go equivalent):\n\n```yaml\nname: garage-example-yaml\nruntime: yaml\n\nresources:\n  myKey:\n    type: garage:Key\n    properties:\n      name: my-app-key\n  myBucket:\n    type: garage:Bucket\n    properties:\n      globalAlias: my-app-bucket\n  myPermission:\n    type: garage:BucketKeyPermission\n    properties:\n      bucketId: ${myBucket.id}\n      accessKeyId: ${myKey.accessKeyId}\n      permissions:\n        read: true\n        write: true\n\noutputs:\n  bucketId: ${myBucket.id}\n  accessKeyId: ${myKey.accessKeyId}\n  secretAccessKey: ${myKey.secretAccessKey}\n```\n\n## Configuration\n\n| Key | Env var fallback | Description |\n|---|---|---|\n| `garage:endpoint` | `GARAGE_ADMIN_ENDPOINT` | The base URL of the Garage Admin API, e.g. `\"http://localhost:3903\"`. |\n| `garage:adminToken` (secret) | `GARAGE_ADMIN_TOKEN` | A bearer token authorized against the Garage Admin API. |\n\nBoth are required, one way or the other - the provider fails to configure if neither\nthe config key nor its env var fallback is set.\n\n## Compatibility\n\nThis provider talks to Garage's Admin API v2, introduced in Garage v2.0.0. Each\nversion below is tested against the full example-program lifecycle (create/update/delete\nplus a real S3 object upload/download) in its own CI workflow, so its badge reflects\nthat version alone rather than an aggregate:\n\n| Garage version | Status |\n|---|---|\n| v2.0.0 | [![E2E (Garage v2.0.0)](https://github.com/axnic/pulumi-garage/actions/workflows/merge_group%2Cpull_request%2Cpush.e2e-garage-2.0.yaml/badge.svg?branch=main)](https://github.com/axnic/pulumi-garage/actions/workflows/merge_group%2Cpull_request%2Cpush.e2e-garage-2.0.yaml) |\n| v2.1.0 | [![E2E (Garage v2.1.0)](https://github.com/axnic/pulumi-garage/actions/workflows/merge_group%2Cpull_request%2Cpush.e2e-garage-2.1.yaml/badge.svg?branch=main)](https://github.com/axnic/pulumi-garage/actions/workflows/merge_group%2Cpull_request%2Cpush.e2e-garage-2.1.yaml) |\n| v2.2.0 | [![E2E (Garage v2.2.0)](https://github.com/axnic/pulumi-garage/actions/workflows/merge_group%2Cpull_request%2Cpush.e2e-garage-2.2.yaml/badge.svg?branch=main)](https://github.com/axnic/pulumi-garage/actions/workflows/merge_group%2Cpull_request%2Cpush.e2e-garage-2.2.yaml) |\n| v2.3.0 | [![E2E (Garage v2.3.0)](https://github.com/axnic/pulumi-garage/actions/workflows/merge_group%2Cpull_request%2Cpush.e2e-garage-2.3.yaml/badge.svg?branch=main)](https://github.com/axnic/pulumi-garage/actions/workflows/merge_group%2Cpull_request%2Cpush.e2e-garage-2.3.yaml) |\n\nEach workflow (`.github/workflows/merge_group,pull_request,push.e2e-garage-2.*.yaml`) is\na thin wrapper calling the reusable `_reusable-e2e.yaml` job with that version pinned -\nGitHub Actions status badges are per-workflow-file, not per-matrix-leg, which is why\nthis is four small files rather than one `strategy.matrix` job. `--single-node` (the\nfast layout-bootstrap path) only exists from Garage v2.3.0 onward, so\n`docker-compose.yml` and `scripts/bootstrap-garage.sh` always use the manual\n`layout assign`/`apply` bootstrap instead, which works identically across all four\nversions.\n\n## Known limitations\n\nThis is a v1, personal/small-org provider - scope is intentionally narrow:\n\n- **No cluster layout management.** Assigning nodes, zones, and capacity is not\n  managed by this provider; it's a one-shot bootstrap operation that doesn't fit\n  cleanly into idempotent IaC. Bootstrap your Garage cluster yourself (e.g.\n  `garage layout assign`/`apply`, or `--single-node` on Garage v2.3.0+) before\n  pointing this provider at it.\n- **`Bucket` supports only a single global alias.** No local (per-key) aliases, no\n  multiple global aliases.\n- **`Key`'s global `createBucket` permission is not modelled**, deliberately - it\n  wasn't reliable enough to model without further verification against a live API.\n- **Deleting a non-empty `Bucket` fails.** This mirrors Garage's (and S3's) own native\n  behavior; it's by design, not a bug.\n- **Only YAML and Go example programs are exercised in CI/E2E.** The nodejs, python,\n  and dotnet SDKs are generated and published (see [Installing](#installing)) but\n  aren't covered by this repo's example programs or lifecycle tests.\n- **No Java/Maven SDK.** Pulumi's Java support has too little adoption to justify the\n  extra setup cost (Sonatype namespace verification, GPG-signed releases); the nodejs,\n  python, dotnet, and go SDKs cover the ecosystem's actual usage.\n\n## Reference\n\nThis provider isn't (yet) listed on the [Pulumi Registry](https://www.pulumi.com/registry/),\nso there's no `pulumi.com/registry/packages/garage` page to link to for generated,\nper-resource API docs. Until then:\n\n- The **Go SDK reference** on [pkg.go.dev](https://pkg.go.dev/github.com/axnic/pulumi-garage/sdk/go/pulumi-garage)\n  is generated from the same schema descriptions the Pulumi Registry would render, and\n  is the most complete field-by-field reference available (populated after the first\n  tagged release - see [RELEASING.md](RELEASING.md)).\n- The [`Quickstart`](#quickstart) and [`Configuration`](#configuration) sections above\n  cover the three resources and provider config end to end; the underlying schema is\n  `provider/cmd/pulumi-resource-garage/schema.json` (generated, not hand-maintained).\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for building the provider, the test layers\n(including how to run the E2E suite locally), generating the SDKs, and the devcontainer\nsetup. See also our [Code of Conduct](CODE-OF-CONDUCT.md).\n\n## License\n\n[Apache-2.0](LICENSE)\n","readmeFilename":"README.md"}