[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-neon-neon-object-storage":3,"mdc-j3ubau-key":35,"related-repo-neon-neon-object-storage":2937,"related-org-neon-neon-object-storage":3048},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":28,"topics":29,"repo":30,"sourceUrl":33,"mdContent":34},"neon-object-storage","manage Neon object storage","S3-compatible object storage that branches with your Neon project, so files and the database stay in sync across every branch. Use when a user wants object storage, a bucket, blob\u002Ffile storage, or somewhere to put uploads, images, documents, avatars, or user-generated files for their app or agent — especially when they already use (or are setting up) Neon Postgres and don't want to add a separate storage provider like AWS S3, Cloudflare R2, or Supabase Storage. Triggers include \"object storage\", \"bucket\", \"blob storage\", \"file storage\", \"store uploads\u002Fimages\u002Ffiles\", \"S3-compatible storage\", \"presigned URL\", \"where do I put files\", \"Neon Object Storage\", \"Neon Storage\", and \"storage that branches with my database\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"neon","Neon","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fneon.png","neondatabase",[13,15,18,21],{"name":9,"slug":8,"type":14},"tag",{"name":16,"slug":17,"type":14},"File Storage","file-storage",{"name":19,"slug":20,"type":14},"Database","database",{"name":22,"slug":23,"type":14},"Storage","storage",81,"https:\u002F\u002Fgithub.com\u002Fneondatabase\u002Fagent-skills","2026-07-27T06:07:57.150892",null,12,[],{"repoUrl":25,"stars":24,"forks":28,"topics":31,"description":32},[],"Agent Skills for Neon Severless Postgres","https:\u002F\u002Fgithub.com\u002Fneondatabase\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fneon-object-storage","---\nname: neon-object-storage\ndescription: >-\n  S3-compatible object storage that branches with your Neon project, so files\n  and the database stay in sync across every branch. Use when a user wants\n  object storage, a bucket, blob\u002Ffile storage, or somewhere to put uploads,\n  images, documents, avatars, or user-generated files for their app or agent —\n  especially when they already use (or are setting up) Neon Postgres and don't\n  want to add a separate storage provider like AWS S3, Cloudflare R2, or\n  Supabase Storage. Triggers include \"object storage\", \"bucket\", \"blob\n  storage\", \"file storage\", \"store uploads\u002Fimages\u002Ffiles\", \"S3-compatible\n  storage\", \"presigned URL\", \"where do I put files\", \"Neon Object Storage\",\n  \"Neon Storage\", and \"storage that branches with my database\".\nmetadata:\n  parent: neon\n---\n\n**FIRST**: Use the parent `neon` skill for a Neon platform overview, getting started with Neon, Neon development best practices, and more.\n\nIf the `neon` skill is not installed, fetch it from https:\u002F\u002Fneon.com\u002Fdocs\u002Fai\u002Fskills\u002Fneon\u002FSKILL.md or install it with:\n\n```bash\nnpx skills add neondatabase\u002Fagent-skills --skill neon\n```\n\n# Neon Object Storage\n\nThis is a public beta feature and only available in `us-east-2`.\n\nNeon Object Storage is S3-compatible object storage that branches with your projects: every branch gets its own isolated storage state, so files and database rows stay in sync across dev, preview, staging, and production.\n\nUse this skill to help the user store and serve files that branch alongside their database. Deliver a working bucket and upload\u002Fdownload flow, a branch-aware S3 client wired to the injected env vars, or a precise answer from the official Neon docs.\n\n## When to Use\n\nReach for Neon Object Storage when the user needs to store files (images, uploads, generated assets, documents, backups) and any of the following are true:\n\n- **They already use Neon Postgres and don't want a second provider.** One backend, one bill, one CLI, one set of branches — instead of standing up and wiring a separate AWS S3 \u002F R2 \u002F Supabase Storage account. The same Neon credential that backs the database backs storage.\n- **Files must stay in sync with the database across environments.** Storage branches _together with_ your Postgres data. Fork a branch and the child instantly inherits the parent's buckets and objects at that point in time — copy-on-write, so no data is duplicated. This is what makes agent, dev, preview, and test environments seamless: a preview branch gets a consistent snapshot of _both_ the rows and the files they reference, and writes on the child never touch the parent.\n- **They want safe, throwaway environments.** Upload, overwrite, and delete files in a preview\u002FCI branch without any risk to production data, then drop the branch.\n- **They want standard S3 tooling.** It's built on S3 semantics and speaks the S3 API, so the AWS SDKs, `boto3`, the AWS CLI, and presigned URLs all work — reliable and familiar, with no proprietary client.\n\nIf the user has no Neon project, isn't on Postgres, and just needs a standalone CDN-backed asset store, a dedicated object store may fit better — but the moment branch-consistent files + rows matter, this is the reason to use it.\n\n## What It Does\n\n- **S3-compatible** — Works with existing S3 SDKs, `boto3`, the AWS CLI, and presigned URLs. Path-style addressing and SigV4 only.\n- **Branches with your database** — Every Neon branch gets its own isolated, copy-on-write storage state. Forking copies no data.\n- **Two access modes** — `private` buckets require a credential for every operation; `public_read` buckets allow anonymous reads with authenticated writes.\n- **One credential system** — The same Neon credential system used by Functions and the AI Gateway.\n\n## Availability\n\nCheck this precondition before setting anything up: Neon Object Storage is a public beta feature available only on new projects in the `us-east-2` region. Confirm the user's Neon project is a new project in `us-east-2` before proceeding; it can't be enabled on existing projects.\n\n## Setup\n\nObject storage is part of the `neon.ts` infrastructure-as-code config (see the `neon` skill for the branch-first workflow, `link`\u002F`checkout`, and `neon.ts` basics). Declare buckets under `preview.buckets`, keyed by bucket name:\n\n```typescript\n\u002F\u002F neon.ts\nimport { defineConfig } from \"@neon\u002Fconfig\u002Fv1\";\n\nexport default defineConfig({\n  preview: {\n    buckets: {\n      images: {}, \u002F\u002F private by default\n      \"public-assets\": { access: \"public_read\" },\n    },\n  },\n});\n```\n\nProvision the declared buckets on the linked branch:\n\n```bash\nneon deploy   # alias for `neon config apply`\n```\n\n## Neon Infrastructure as Code (`neon.ts`)\n\nThe `preview.buckets` block above is part of `neon.ts`, Neon's infrastructure-as-code file — one TypeScript file declares your buckets alongside every other service the branch should have (see the `neon` skill for the full reference). Reconcile the declaration against a branch the Terraform way:\n\n```bash\nneon config status   # print the branch's live config (which buckets exist)\nneon config plan     # dry-run diff of what apply would change\nneon config apply    # create the declared buckets  (neon deploy is an alias)\n```\n\nBuckets are **branch-scoped**: when a `neon.ts` is present, `neon checkout` applies the policy as it _creates_ a branch, so a fresh preview\u002FCI branch comes up with its buckets already provisioned (and copy-on-write objects inherited from the parent). Checking out an _existing_ branch doesn't reconcile it — run `neon deploy` to apply changes. Provisioning (`config apply` \u002F `deploy`), `link`, and `checkout` also pull the branch's S3 credentials into your local `.env.local`, so the same `env pull` step shown below happens for you on those commands.\n\n## Environment Variables\n\nWhen `preview.buckets` is declared, Neon injects **AWS-standard** S3 env vars so the AWS SDKs work from the environment with zero extra config. Inside a deployed Neon Function these are injected automatically; locally, pull them onto disk (or inject them at runtime) via the CLI:\n\n```bash\nneon env pull            # writes the branch's vars into .env (or .env.local)\n# or, without writing a file, inject at runtime:\nneon-env run -- \u003Cyour dev command>\n```\n\n| Variable                | Meaning                                             |\n| ----------------------- | --------------------------------------------------- |\n| `AWS_ACCESS_KEY_ID`     | S3 Access Key ID (the branch credential's token id) |\n| `AWS_SECRET_ACCESS_KEY` | S3 Secret Access Key                                |\n| `AWS_ENDPOINT_URL_S3`   | Branch S3 endpoint URL                              |\n| `AWS_REGION`            | Region, e.g. `us-east-2`                            |\n\nBecause the names are AWS-standard, the AWS SDK picks up the credentials, endpoint, and region from the environment automatically. Credentials are branch-scoped and valid for that branch and all its descendants.\n\nFor typed, validated access to these credentials instead of reading `process.env` directly, pass the same `neon.ts` config object to `parseEnv` from `@neon\u002Fenv` — it returns an `env.storage` namespace (`accessKeyId`, `secretAccessKey`, `endpoint`, `region`) derived from your config. See the `neon` skill.\n\n## Working with Objects: the Files SDK (Recommended)\n\nThe simplest, most portable way to read and write objects is the [Files SDK](https:\u002F\u002Ffiles-sdk.dev) with its `neon` adapter — a small, unified storage API (`upload`, `download`, `url`, `list`, `exists`, `copy`, `delete`, `signedUploadUrl`) over web-standard I\u002FO. It uses the AWS S3 client under the hood, configured appropriately for Neon, and relabels errors as `Neon error` — so there's nothing to misconfigure. Reach for this first.\n\nInstall it alongside the AWS S3 peer dependencies the adapter uses internally:\n\n```bash\nnpm install files-sdk @aws-sdk\u002Fclient-s3 @aws-sdk\u002Fs3-presigned-post @aws-sdk\u002Fs3-request-presigner\n```\n\nThe adapter resolves its endpoint, region, and credentials from the same injected `AWS_*` env vars — pass only the bucket name:\n\n```typescript\nimport { Files } from \"files-sdk\";\nimport { neon } from \"files-sdk\u002Fneon\";\n\nconst files = new Files({ adapter: neon({ bucket: \"images\" }) });\n\n\u002F\u002F Upload — body may be a Buffer, Uint8Array, Blob, File, ReadableStream, or string\nawait files.upload(\"generated\u002Fcat.jpg\", fileBuffer, { contentType: \"image\u002Fjpeg\" });\n\n\u002F\u002F Download\nconst file = await files.download(\"generated\u002Fcat.jpg\");\nconst bytes = new Uint8Array(await file.arrayBuffer());\n\n\u002F\u002F Presigned GET — share without exposing credentials (defaults to a 1h expiry)\nconst url = await files.url(\"generated\u002Fcat.jpg\", { expiresIn: 3600 });\n\n\u002F\u002F Plus: files.exists(), files.list({ prefix }), files.copy(), files.delete(), files.signedUploadUrl()\n```\n\nSwap the adapter import (`files-sdk\u002Fs3`, `files-sdk\u002Fr2`, `files-sdk\u002Fgcs`, …) and the rest of your code is unchanged.\n\n## Working with Objects: the AWS S3 Client (Alternative)\n\nNeon speaks the S3 API directly, so you can drop down to the AWS SDK whenever you prefer the native client or already depend on it. The credentials, endpoint, and region are read from the standard AWS env chain, so the only setting you pass is `forcePathStyle: true` — Neon requires path-style addressing, so the S3 client **must** set it:\n\n```typescript\nimport { S3Client } from \"@aws-sdk\u002Fclient-s3\";\n\nconst s3 = new S3Client({\n  forcePathStyle: true, \u002F\u002F required: Neon uses path-style addressing\n});\n```\n\nThen upload, download, and presign with the raw command objects:\n\n```typescript\nimport { PutObjectCommand, GetObjectCommand } from \"@aws-sdk\u002Fclient-s3\";\nimport { getSignedUrl } from \"@aws-sdk\u002Fs3-request-presigner\";\n\nconst BUCKET = \"images\";\n\n\u002F\u002F Upload\nawait s3.send(\n  new PutObjectCommand({\n    Bucket: BUCKET,\n    Key: \"generated\u002Fcat.jpg\",\n    Body: fileBuffer,\n    ContentType: \"image\u002Fjpeg\",\n  }),\n);\n\n\u002F\u002F Download\nconst res = await s3.send(\n  new GetObjectCommand({ Bucket: BUCKET, Key: \"generated\u002Fcat.jpg\" }),\n);\nconst bytes = await res.Body?.transformToByteArray();\n\n\u002F\u002F Presigned GET — share without exposing credentials\nconst url = await getSignedUrl(\n  s3,\n  new GetObjectCommand({ Bucket: BUCKET, Key: \"generated\u002Fcat.jpg\" }),\n  { expiresIn: 3600 },\n);\n```\n\n## Pairing Storage with the Database on a Branch\n\nThe canonical pattern: an agent generates an image → `PutObject` into the `images` bucket → a row is inserted in Postgres → a presigned URL is returned on read. Store the bucket **key** (not the bytes) in a Postgres column, and presign on read. Because both the row and the object live on the same branch, they branch together and never drift.\n\n## CLI Bucket and Object Commands\n\n`neon` also has first-class bucket\u002Fobject commands (`neon bucket create|list|delete`, `neon bucket object put|get|list|delete`) for scripting and one-off operations.\n\n## Neon Documentation\n\nThe Neon documentation is the source of truth and Object Storage is evolving rapidly, so always verify against the official docs. Any doc page can be fetched as markdown by appending `.md` to the URL or by requesting `Accept: text\u002Fmarkdown`. Find the right page from the docs index (https:\u002F\u002Fneon.com\u002Fdocs\u002Fllms.txt) and the changelog announcements.\n\n## Further Reading\n\n- https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Foverview.md\n- https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Fget-started.md\n- https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Fbuckets.md\n- https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Fobjects.md\n- https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Fauthentication.md\n- https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Fs3-compatibility.md\n- https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Ftroubleshooting.md\n- https:\u002F\u002Ffiles-sdk.dev — Files SDK docs (the `neon` adapter)\n",{"data":36,"body":38},{"name":4,"description":6,"metadata":37},{"parent":8},{"type":39,"children":40},"root",[41,63,85,134,140,153,158,163,170,175,243,248,254,320,326,345,351,402,659,664,688,700,726,797,891,897,916,1001,1102,1107,1188,1194,1280,1285,1325,1338,1885,1912,1918,1938,2067,2072,2743,2749,2776,2782,2807,2813,2842,2848,2931],{"type":42,"tag":43,"props":44,"children":45},"element","p",{},[46,53,55,61],{"type":42,"tag":47,"props":48,"children":49},"strong",{},[50],{"type":51,"value":52},"text","FIRST",{"type":51,"value":54},": Use the parent ",{"type":42,"tag":56,"props":57,"children":59},"code",{"className":58},[],[60],{"type":51,"value":8},{"type":51,"value":62}," skill for a Neon platform overview, getting started with Neon, Neon development best practices, and more.",{"type":42,"tag":43,"props":64,"children":65},{},[66,68,73,75,83],{"type":51,"value":67},"If the ",{"type":42,"tag":56,"props":69,"children":71},{"className":70},[],[72],{"type":51,"value":8},{"type":51,"value":74}," skill is not installed, fetch it from ",{"type":42,"tag":76,"props":77,"children":81},"a",{"href":78,"rel":79},"https:\u002F\u002Fneon.com\u002Fdocs\u002Fai\u002Fskills\u002Fneon\u002FSKILL.md",[80],"nofollow",[82],{"type":51,"value":78},{"type":51,"value":84}," or install it with:",{"type":42,"tag":86,"props":87,"children":92},"pre",{"className":88,"code":89,"language":90,"meta":91,"style":91},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx skills add neondatabase\u002Fagent-skills --skill neon\n","bash","",[93],{"type":42,"tag":56,"props":94,"children":95},{"__ignoreMap":91},[96],{"type":42,"tag":97,"props":98,"children":101},"span",{"class":99,"line":100},"line",1,[102,108,114,119,124,129],{"type":42,"tag":97,"props":103,"children":105},{"style":104},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[106],{"type":51,"value":107},"npx",{"type":42,"tag":97,"props":109,"children":111},{"style":110},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[112],{"type":51,"value":113}," skills",{"type":42,"tag":97,"props":115,"children":116},{"style":110},[117],{"type":51,"value":118}," add",{"type":42,"tag":97,"props":120,"children":121},{"style":110},[122],{"type":51,"value":123}," neondatabase\u002Fagent-skills",{"type":42,"tag":97,"props":125,"children":126},{"style":110},[127],{"type":51,"value":128}," --skill",{"type":42,"tag":97,"props":130,"children":131},{"style":110},[132],{"type":51,"value":133}," neon\n",{"type":42,"tag":135,"props":136,"children":137},"h1",{"id":4},[138],{"type":51,"value":139},"Neon Object Storage",{"type":42,"tag":43,"props":141,"children":142},{},[143,145,151],{"type":51,"value":144},"This is a public beta feature and only available in ",{"type":42,"tag":56,"props":146,"children":148},{"className":147},[],[149],{"type":51,"value":150},"us-east-2",{"type":51,"value":152},".",{"type":42,"tag":43,"props":154,"children":155},{},[156],{"type":51,"value":157},"Neon Object Storage is S3-compatible object storage that branches with your projects: every branch gets its own isolated storage state, so files and database rows stay in sync across dev, preview, staging, and production.",{"type":42,"tag":43,"props":159,"children":160},{},[161],{"type":51,"value":162},"Use this skill to help the user store and serve files that branch alongside their database. Deliver a working bucket and upload\u002Fdownload flow, a branch-aware S3 client wired to the injected env vars, or a precise answer from the official Neon docs.",{"type":42,"tag":164,"props":165,"children":167},"h2",{"id":166},"when-to-use",[168],{"type":51,"value":169},"When to Use",{"type":42,"tag":43,"props":171,"children":172},{},[173],{"type":51,"value":174},"Reach for Neon Object Storage when the user needs to store files (images, uploads, generated assets, documents, backups) and any of the following are true:",{"type":42,"tag":176,"props":177,"children":178},"ul",{},[179,190,215,225],{"type":42,"tag":180,"props":181,"children":182},"li",{},[183,188],{"type":42,"tag":47,"props":184,"children":185},{},[186],{"type":51,"value":187},"They already use Neon Postgres and don't want a second provider.",{"type":51,"value":189}," One backend, one bill, one CLI, one set of branches — instead of standing up and wiring a separate AWS S3 \u002F R2 \u002F Supabase Storage account. The same Neon credential that backs the database backs storage.",{"type":42,"tag":180,"props":191,"children":192},{},[193,198,200,206,208,213],{"type":42,"tag":47,"props":194,"children":195},{},[196],{"type":51,"value":197},"Files must stay in sync with the database across environments.",{"type":51,"value":199}," Storage branches ",{"type":42,"tag":201,"props":202,"children":203},"em",{},[204],{"type":51,"value":205},"together with",{"type":51,"value":207}," your Postgres data. Fork a branch and the child instantly inherits the parent's buckets and objects at that point in time — copy-on-write, so no data is duplicated. This is what makes agent, dev, preview, and test environments seamless: a preview branch gets a consistent snapshot of ",{"type":42,"tag":201,"props":209,"children":210},{},[211],{"type":51,"value":212},"both",{"type":51,"value":214}," the rows and the files they reference, and writes on the child never touch the parent.",{"type":42,"tag":180,"props":216,"children":217},{},[218,223],{"type":42,"tag":47,"props":219,"children":220},{},[221],{"type":51,"value":222},"They want safe, throwaway environments.",{"type":51,"value":224}," Upload, overwrite, and delete files in a preview\u002FCI branch without any risk to production data, then drop the branch.",{"type":42,"tag":180,"props":226,"children":227},{},[228,233,235,241],{"type":42,"tag":47,"props":229,"children":230},{},[231],{"type":51,"value":232},"They want standard S3 tooling.",{"type":51,"value":234}," It's built on S3 semantics and speaks the S3 API, so the AWS SDKs, ",{"type":42,"tag":56,"props":236,"children":238},{"className":237},[],[239],{"type":51,"value":240},"boto3",{"type":51,"value":242},", the AWS CLI, and presigned URLs all work — reliable and familiar, with no proprietary client.",{"type":42,"tag":43,"props":244,"children":245},{},[246],{"type":51,"value":247},"If the user has no Neon project, isn't on Postgres, and just needs a standalone CDN-backed asset store, a dedicated object store may fit better — but the moment branch-consistent files + rows matter, this is the reason to use it.",{"type":42,"tag":164,"props":249,"children":251},{"id":250},"what-it-does",[252],{"type":51,"value":253},"What It Does",{"type":42,"tag":176,"props":255,"children":256},{},[257,274,284,310],{"type":42,"tag":180,"props":258,"children":259},{},[260,265,267,272],{"type":42,"tag":47,"props":261,"children":262},{},[263],{"type":51,"value":264},"S3-compatible",{"type":51,"value":266}," — Works with existing S3 SDKs, ",{"type":42,"tag":56,"props":268,"children":270},{"className":269},[],[271],{"type":51,"value":240},{"type":51,"value":273},", the AWS CLI, and presigned URLs. Path-style addressing and SigV4 only.",{"type":42,"tag":180,"props":275,"children":276},{},[277,282],{"type":42,"tag":47,"props":278,"children":279},{},[280],{"type":51,"value":281},"Branches with your database",{"type":51,"value":283}," — Every Neon branch gets its own isolated, copy-on-write storage state. Forking copies no data.",{"type":42,"tag":180,"props":285,"children":286},{},[287,292,294,300,302,308],{"type":42,"tag":47,"props":288,"children":289},{},[290],{"type":51,"value":291},"Two access modes",{"type":51,"value":293}," — ",{"type":42,"tag":56,"props":295,"children":297},{"className":296},[],[298],{"type":51,"value":299},"private",{"type":51,"value":301}," buckets require a credential for every operation; ",{"type":42,"tag":56,"props":303,"children":305},{"className":304},[],[306],{"type":51,"value":307},"public_read",{"type":51,"value":309}," buckets allow anonymous reads with authenticated writes.",{"type":42,"tag":180,"props":311,"children":312},{},[313,318],{"type":42,"tag":47,"props":314,"children":315},{},[316],{"type":51,"value":317},"One credential system",{"type":51,"value":319}," — The same Neon credential system used by Functions and the AI Gateway.",{"type":42,"tag":164,"props":321,"children":323},{"id":322},"availability",[324],{"type":51,"value":325},"Availability",{"type":42,"tag":43,"props":327,"children":328},{},[329,331,336,338,343],{"type":51,"value":330},"Check this precondition before setting anything up: Neon Object Storage is a public beta feature available only on new projects in the ",{"type":42,"tag":56,"props":332,"children":334},{"className":333},[],[335],{"type":51,"value":150},{"type":51,"value":337}," region. Confirm the user's Neon project is a new project in ",{"type":42,"tag":56,"props":339,"children":341},{"className":340},[],[342],{"type":51,"value":150},{"type":51,"value":344}," before proceeding; it can't be enabled on existing projects.",{"type":42,"tag":164,"props":346,"children":348},{"id":347},"setup",[349],{"type":51,"value":350},"Setup",{"type":42,"tag":43,"props":352,"children":353},{},[354,356,362,364,369,371,377,379,385,387,392,394,400],{"type":51,"value":355},"Object storage is part of the ",{"type":42,"tag":56,"props":357,"children":359},{"className":358},[],[360],{"type":51,"value":361},"neon.ts",{"type":51,"value":363}," infrastructure-as-code config (see the ",{"type":42,"tag":56,"props":365,"children":367},{"className":366},[],[368],{"type":51,"value":8},{"type":51,"value":370}," skill for the branch-first workflow, ",{"type":42,"tag":56,"props":372,"children":374},{"className":373},[],[375],{"type":51,"value":376},"link",{"type":51,"value":378},"\u002F",{"type":42,"tag":56,"props":380,"children":382},{"className":381},[],[383],{"type":51,"value":384},"checkout",{"type":51,"value":386},", and ",{"type":42,"tag":56,"props":388,"children":390},{"className":389},[],[391],{"type":51,"value":361},{"type":51,"value":393}," basics). Declare buckets under ",{"type":42,"tag":56,"props":395,"children":397},{"className":396},[],[398],{"type":51,"value":399},"preview.buckets",{"type":51,"value":401},", keyed by bucket name:",{"type":42,"tag":86,"props":403,"children":407},{"className":404,"code":405,"language":406,"meta":91,"style":91},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F neon.ts\nimport { defineConfig } from \"@neon\u002Fconfig\u002Fv1\";\n\nexport default defineConfig({\n  preview: {\n    buckets: {\n      images: {}, \u002F\u002F private by default\n      \"public-assets\": { access: \"public_read\" },\n    },\n  },\n});\n","typescript",[408],{"type":42,"tag":56,"props":409,"children":410},{"__ignoreMap":91},[411,420,472,482,511,531,548,571,623,632,641],{"type":42,"tag":97,"props":412,"children":413},{"class":99,"line":100},[414],{"type":42,"tag":97,"props":415,"children":417},{"style":416},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[418],{"type":51,"value":419},"\u002F\u002F neon.ts\n",{"type":42,"tag":97,"props":421,"children":423},{"class":99,"line":422},2,[424,430,436,442,447,452,457,462,467],{"type":42,"tag":97,"props":425,"children":427},{"style":426},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[428],{"type":51,"value":429},"import",{"type":42,"tag":97,"props":431,"children":433},{"style":432},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[434],{"type":51,"value":435}," {",{"type":42,"tag":97,"props":437,"children":439},{"style":438},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[440],{"type":51,"value":441}," defineConfig",{"type":42,"tag":97,"props":443,"children":444},{"style":432},[445],{"type":51,"value":446}," }",{"type":42,"tag":97,"props":448,"children":449},{"style":426},[450],{"type":51,"value":451}," from",{"type":42,"tag":97,"props":453,"children":454},{"style":432},[455],{"type":51,"value":456}," \"",{"type":42,"tag":97,"props":458,"children":459},{"style":110},[460],{"type":51,"value":461},"@neon\u002Fconfig\u002Fv1",{"type":42,"tag":97,"props":463,"children":464},{"style":432},[465],{"type":51,"value":466},"\"",{"type":42,"tag":97,"props":468,"children":469},{"style":432},[470],{"type":51,"value":471},";\n",{"type":42,"tag":97,"props":473,"children":475},{"class":99,"line":474},3,[476],{"type":42,"tag":97,"props":477,"children":479},{"emptyLinePlaceholder":478},true,[480],{"type":51,"value":481},"\n",{"type":42,"tag":97,"props":483,"children":485},{"class":99,"line":484},4,[486,491,496,501,506],{"type":42,"tag":97,"props":487,"children":488},{"style":426},[489],{"type":51,"value":490},"export",{"type":42,"tag":97,"props":492,"children":493},{"style":426},[494],{"type":51,"value":495}," default",{"type":42,"tag":97,"props":497,"children":499},{"style":498},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[500],{"type":51,"value":441},{"type":42,"tag":97,"props":502,"children":503},{"style":438},[504],{"type":51,"value":505},"(",{"type":42,"tag":97,"props":507,"children":508},{"style":432},[509],{"type":51,"value":510},"{\n",{"type":42,"tag":97,"props":512,"children":514},{"class":99,"line":513},5,[515,521,526],{"type":42,"tag":97,"props":516,"children":518},{"style":517},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[519],{"type":51,"value":520},"  preview",{"type":42,"tag":97,"props":522,"children":523},{"style":432},[524],{"type":51,"value":525},":",{"type":42,"tag":97,"props":527,"children":528},{"style":432},[529],{"type":51,"value":530}," {\n",{"type":42,"tag":97,"props":532,"children":534},{"class":99,"line":533},6,[535,540,544],{"type":42,"tag":97,"props":536,"children":537},{"style":517},[538],{"type":51,"value":539},"    buckets",{"type":42,"tag":97,"props":541,"children":542},{"style":432},[543],{"type":51,"value":525},{"type":42,"tag":97,"props":545,"children":546},{"style":432},[547],{"type":51,"value":530},{"type":42,"tag":97,"props":549,"children":551},{"class":99,"line":550},7,[552,557,561,566],{"type":42,"tag":97,"props":553,"children":554},{"style":517},[555],{"type":51,"value":556},"      images",{"type":42,"tag":97,"props":558,"children":559},{"style":432},[560],{"type":51,"value":525},{"type":42,"tag":97,"props":562,"children":563},{"style":432},[564],{"type":51,"value":565}," {},",{"type":42,"tag":97,"props":567,"children":568},{"style":416},[569],{"type":51,"value":570}," \u002F\u002F private by default\n",{"type":42,"tag":97,"props":572,"children":574},{"class":99,"line":573},8,[575,580,585,589,593,597,602,606,610,614,618],{"type":42,"tag":97,"props":576,"children":577},{"style":432},[578],{"type":51,"value":579},"      \"",{"type":42,"tag":97,"props":581,"children":582},{"style":517},[583],{"type":51,"value":584},"public-assets",{"type":42,"tag":97,"props":586,"children":587},{"style":432},[588],{"type":51,"value":466},{"type":42,"tag":97,"props":590,"children":591},{"style":432},[592],{"type":51,"value":525},{"type":42,"tag":97,"props":594,"children":595},{"style":432},[596],{"type":51,"value":435},{"type":42,"tag":97,"props":598,"children":599},{"style":517},[600],{"type":51,"value":601}," access",{"type":42,"tag":97,"props":603,"children":604},{"style":432},[605],{"type":51,"value":525},{"type":42,"tag":97,"props":607,"children":608},{"style":432},[609],{"type":51,"value":456},{"type":42,"tag":97,"props":611,"children":612},{"style":110},[613],{"type":51,"value":307},{"type":42,"tag":97,"props":615,"children":616},{"style":432},[617],{"type":51,"value":466},{"type":42,"tag":97,"props":619,"children":620},{"style":432},[621],{"type":51,"value":622}," },\n",{"type":42,"tag":97,"props":624,"children":626},{"class":99,"line":625},9,[627],{"type":42,"tag":97,"props":628,"children":629},{"style":432},[630],{"type":51,"value":631},"    },\n",{"type":42,"tag":97,"props":633,"children":635},{"class":99,"line":634},10,[636],{"type":42,"tag":97,"props":637,"children":638},{"style":432},[639],{"type":51,"value":640},"  },\n",{"type":42,"tag":97,"props":642,"children":644},{"class":99,"line":643},11,[645,650,655],{"type":42,"tag":97,"props":646,"children":647},{"style":432},[648],{"type":51,"value":649},"}",{"type":42,"tag":97,"props":651,"children":652},{"style":438},[653],{"type":51,"value":654},")",{"type":42,"tag":97,"props":656,"children":657},{"style":432},[658],{"type":51,"value":471},{"type":42,"tag":43,"props":660,"children":661},{},[662],{"type":51,"value":663},"Provision the declared buckets on the linked branch:",{"type":42,"tag":86,"props":665,"children":667},{"className":88,"code":666,"language":90,"meta":91,"style":91},"neon deploy   # alias for `neon config apply`\n",[668],{"type":42,"tag":56,"props":669,"children":670},{"__ignoreMap":91},[671],{"type":42,"tag":97,"props":672,"children":673},{"class":99,"line":100},[674,678,683],{"type":42,"tag":97,"props":675,"children":676},{"style":104},[677],{"type":51,"value":8},{"type":42,"tag":97,"props":679,"children":680},{"style":110},[681],{"type":51,"value":682}," deploy",{"type":42,"tag":97,"props":684,"children":685},{"style":416},[686],{"type":51,"value":687},"   # alias for `neon config apply`\n",{"type":42,"tag":164,"props":689,"children":691},{"id":690},"neon-infrastructure-as-code-neonts",[692,694,699],{"type":51,"value":693},"Neon Infrastructure as Code (",{"type":42,"tag":56,"props":695,"children":697},{"className":696},[],[698],{"type":51,"value":361},{"type":51,"value":654},{"type":42,"tag":43,"props":701,"children":702},{},[703,705,710,712,717,719,724],{"type":51,"value":704},"The ",{"type":42,"tag":56,"props":706,"children":708},{"className":707},[],[709],{"type":51,"value":399},{"type":51,"value":711}," block above is part of ",{"type":42,"tag":56,"props":713,"children":715},{"className":714},[],[716],{"type":51,"value":361},{"type":51,"value":718},", Neon's infrastructure-as-code file — one TypeScript file declares your buckets alongside every other service the branch should have (see the ",{"type":42,"tag":56,"props":720,"children":722},{"className":721},[],[723],{"type":51,"value":8},{"type":51,"value":725}," skill for the full reference). Reconcile the declaration against a branch the Terraform way:",{"type":42,"tag":86,"props":727,"children":729},{"className":88,"code":728,"language":90,"meta":91,"style":91},"neon config status   # print the branch's live config (which buckets exist)\nneon config plan     # dry-run diff of what apply would change\nneon config apply    # create the declared buckets  (neon deploy is an alias)\n",[730],{"type":42,"tag":56,"props":731,"children":732},{"__ignoreMap":91},[733,755,776],{"type":42,"tag":97,"props":734,"children":735},{"class":99,"line":100},[736,740,745,750],{"type":42,"tag":97,"props":737,"children":738},{"style":104},[739],{"type":51,"value":8},{"type":42,"tag":97,"props":741,"children":742},{"style":110},[743],{"type":51,"value":744}," config",{"type":42,"tag":97,"props":746,"children":747},{"style":110},[748],{"type":51,"value":749}," status",{"type":42,"tag":97,"props":751,"children":752},{"style":416},[753],{"type":51,"value":754},"   # print the branch's live config (which buckets exist)\n",{"type":42,"tag":97,"props":756,"children":757},{"class":99,"line":422},[758,762,766,771],{"type":42,"tag":97,"props":759,"children":760},{"style":104},[761],{"type":51,"value":8},{"type":42,"tag":97,"props":763,"children":764},{"style":110},[765],{"type":51,"value":744},{"type":42,"tag":97,"props":767,"children":768},{"style":110},[769],{"type":51,"value":770}," plan",{"type":42,"tag":97,"props":772,"children":773},{"style":416},[774],{"type":51,"value":775},"     # dry-run diff of what apply would change\n",{"type":42,"tag":97,"props":777,"children":778},{"class":99,"line":474},[779,783,787,792],{"type":42,"tag":97,"props":780,"children":781},{"style":104},[782],{"type":51,"value":8},{"type":42,"tag":97,"props":784,"children":785},{"style":110},[786],{"type":51,"value":744},{"type":42,"tag":97,"props":788,"children":789},{"style":110},[790],{"type":51,"value":791}," apply",{"type":42,"tag":97,"props":793,"children":794},{"style":416},[795],{"type":51,"value":796},"    # create the declared buckets  (neon deploy is an alias)\n",{"type":42,"tag":43,"props":798,"children":799},{},[800,802,807,809,814,816,822,824,829,831,836,838,844,846,852,854,860,862,867,868,873,875,881,883,889],{"type":51,"value":801},"Buckets are ",{"type":42,"tag":47,"props":803,"children":804},{},[805],{"type":51,"value":806},"branch-scoped",{"type":51,"value":808},": when a ",{"type":42,"tag":56,"props":810,"children":812},{"className":811},[],[813],{"type":51,"value":361},{"type":51,"value":815}," is present, ",{"type":42,"tag":56,"props":817,"children":819},{"className":818},[],[820],{"type":51,"value":821},"neon checkout",{"type":51,"value":823}," applies the policy as it ",{"type":42,"tag":201,"props":825,"children":826},{},[827],{"type":51,"value":828},"creates",{"type":51,"value":830}," a branch, so a fresh preview\u002FCI branch comes up with its buckets already provisioned (and copy-on-write objects inherited from the parent). Checking out an ",{"type":42,"tag":201,"props":832,"children":833},{},[834],{"type":51,"value":835},"existing",{"type":51,"value":837}," branch doesn't reconcile it — run ",{"type":42,"tag":56,"props":839,"children":841},{"className":840},[],[842],{"type":51,"value":843},"neon deploy",{"type":51,"value":845}," to apply changes. Provisioning (",{"type":42,"tag":56,"props":847,"children":849},{"className":848},[],[850],{"type":51,"value":851},"config apply",{"type":51,"value":853}," \u002F ",{"type":42,"tag":56,"props":855,"children":857},{"className":856},[],[858],{"type":51,"value":859},"deploy",{"type":51,"value":861},"), ",{"type":42,"tag":56,"props":863,"children":865},{"className":864},[],[866],{"type":51,"value":376},{"type":51,"value":386},{"type":42,"tag":56,"props":869,"children":871},{"className":870},[],[872],{"type":51,"value":384},{"type":51,"value":874}," also pull the branch's S3 credentials into your local ",{"type":42,"tag":56,"props":876,"children":878},{"className":877},[],[879],{"type":51,"value":880},".env.local",{"type":51,"value":882},", so the same ",{"type":42,"tag":56,"props":884,"children":886},{"className":885},[],[887],{"type":51,"value":888},"env pull",{"type":51,"value":890}," step shown below happens for you on those commands.",{"type":42,"tag":164,"props":892,"children":894},{"id":893},"environment-variables",[895],{"type":51,"value":896},"Environment Variables",{"type":42,"tag":43,"props":898,"children":899},{},[900,902,907,909,914],{"type":51,"value":901},"When ",{"type":42,"tag":56,"props":903,"children":905},{"className":904},[],[906],{"type":51,"value":399},{"type":51,"value":908}," is declared, Neon injects ",{"type":42,"tag":47,"props":910,"children":911},{},[912],{"type":51,"value":913},"AWS-standard",{"type":51,"value":915}," S3 env vars so the AWS SDKs work from the environment with zero extra config. Inside a deployed Neon Function these are injected automatically; locally, pull them onto disk (or inject them at runtime) via the CLI:",{"type":42,"tag":86,"props":917,"children":919},{"className":88,"code":918,"language":90,"meta":91,"style":91},"neon env pull            # writes the branch's vars into .env (or .env.local)\n# or, without writing a file, inject at runtime:\nneon-env run -- \u003Cyour dev command>\n",[920],{"type":42,"tag":56,"props":921,"children":922},{"__ignoreMap":91},[923,945,953],{"type":42,"tag":97,"props":924,"children":925},{"class":99,"line":100},[926,930,935,940],{"type":42,"tag":97,"props":927,"children":928},{"style":104},[929],{"type":51,"value":8},{"type":42,"tag":97,"props":931,"children":932},{"style":110},[933],{"type":51,"value":934}," env",{"type":42,"tag":97,"props":936,"children":937},{"style":110},[938],{"type":51,"value":939}," pull",{"type":42,"tag":97,"props":941,"children":942},{"style":416},[943],{"type":51,"value":944},"            # writes the branch's vars into .env (or .env.local)\n",{"type":42,"tag":97,"props":946,"children":947},{"class":99,"line":422},[948],{"type":42,"tag":97,"props":949,"children":950},{"style":416},[951],{"type":51,"value":952},"# or, without writing a file, inject at runtime:\n",{"type":42,"tag":97,"props":954,"children":955},{"class":99,"line":474},[956,961,966,971,976,981,986,991,996],{"type":42,"tag":97,"props":957,"children":958},{"style":104},[959],{"type":51,"value":960},"neon-env",{"type":42,"tag":97,"props":962,"children":963},{"style":110},[964],{"type":51,"value":965}," run",{"type":42,"tag":97,"props":967,"children":968},{"style":110},[969],{"type":51,"value":970}," --",{"type":42,"tag":97,"props":972,"children":973},{"style":432},[974],{"type":51,"value":975}," \u003C",{"type":42,"tag":97,"props":977,"children":978},{"style":110},[979],{"type":51,"value":980},"your",{"type":42,"tag":97,"props":982,"children":983},{"style":110},[984],{"type":51,"value":985}," dev",{"type":42,"tag":97,"props":987,"children":988},{"style":110},[989],{"type":51,"value":990}," comman",{"type":42,"tag":97,"props":992,"children":993},{"style":438},[994],{"type":51,"value":995},"d",{"type":42,"tag":97,"props":997,"children":998},{"style":432},[999],{"type":51,"value":1000},">\n",{"type":42,"tag":1002,"props":1003,"children":1004},"table",{},[1005,1024],{"type":42,"tag":1006,"props":1007,"children":1008},"thead",{},[1009],{"type":42,"tag":1010,"props":1011,"children":1012},"tr",{},[1013,1019],{"type":42,"tag":1014,"props":1015,"children":1016},"th",{},[1017],{"type":51,"value":1018},"Variable",{"type":42,"tag":1014,"props":1020,"children":1021},{},[1022],{"type":51,"value":1023},"Meaning",{"type":42,"tag":1025,"props":1026,"children":1027},"tbody",{},[1028,1046,1063,1080],{"type":42,"tag":1010,"props":1029,"children":1030},{},[1031,1041],{"type":42,"tag":1032,"props":1033,"children":1034},"td",{},[1035],{"type":42,"tag":56,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":51,"value":1040},"AWS_ACCESS_KEY_ID",{"type":42,"tag":1032,"props":1042,"children":1043},{},[1044],{"type":51,"value":1045},"S3 Access Key ID (the branch credential's token id)",{"type":42,"tag":1010,"props":1047,"children":1048},{},[1049,1058],{"type":42,"tag":1032,"props":1050,"children":1051},{},[1052],{"type":42,"tag":56,"props":1053,"children":1055},{"className":1054},[],[1056],{"type":51,"value":1057},"AWS_SECRET_ACCESS_KEY",{"type":42,"tag":1032,"props":1059,"children":1060},{},[1061],{"type":51,"value":1062},"S3 Secret Access Key",{"type":42,"tag":1010,"props":1064,"children":1065},{},[1066,1075],{"type":42,"tag":1032,"props":1067,"children":1068},{},[1069],{"type":42,"tag":56,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":51,"value":1074},"AWS_ENDPOINT_URL_S3",{"type":42,"tag":1032,"props":1076,"children":1077},{},[1078],{"type":51,"value":1079},"Branch S3 endpoint URL",{"type":42,"tag":1010,"props":1081,"children":1082},{},[1083,1092],{"type":42,"tag":1032,"props":1084,"children":1085},{},[1086],{"type":42,"tag":56,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":51,"value":1091},"AWS_REGION",{"type":42,"tag":1032,"props":1093,"children":1094},{},[1095,1097],{"type":51,"value":1096},"Region, e.g. ",{"type":42,"tag":56,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":51,"value":150},{"type":42,"tag":43,"props":1103,"children":1104},{},[1105],{"type":51,"value":1106},"Because the names are AWS-standard, the AWS SDK picks up the credentials, endpoint, and region from the environment automatically. Credentials are branch-scoped and valid for that branch and all its descendants.",{"type":42,"tag":43,"props":1108,"children":1109},{},[1110,1112,1118,1120,1125,1127,1133,1135,1141,1143,1149,1151,1157,1159,1165,1166,1172,1173,1179,1181,1186],{"type":51,"value":1111},"For typed, validated access to these credentials instead of reading ",{"type":42,"tag":56,"props":1113,"children":1115},{"className":1114},[],[1116],{"type":51,"value":1117},"process.env",{"type":51,"value":1119}," directly, pass the same ",{"type":42,"tag":56,"props":1121,"children":1123},{"className":1122},[],[1124],{"type":51,"value":361},{"type":51,"value":1126}," config object to ",{"type":42,"tag":56,"props":1128,"children":1130},{"className":1129},[],[1131],{"type":51,"value":1132},"parseEnv",{"type":51,"value":1134}," from ",{"type":42,"tag":56,"props":1136,"children":1138},{"className":1137},[],[1139],{"type":51,"value":1140},"@neon\u002Fenv",{"type":51,"value":1142}," — it returns an ",{"type":42,"tag":56,"props":1144,"children":1146},{"className":1145},[],[1147],{"type":51,"value":1148},"env.storage",{"type":51,"value":1150}," namespace (",{"type":42,"tag":56,"props":1152,"children":1154},{"className":1153},[],[1155],{"type":51,"value":1156},"accessKeyId",{"type":51,"value":1158},", ",{"type":42,"tag":56,"props":1160,"children":1162},{"className":1161},[],[1163],{"type":51,"value":1164},"secretAccessKey",{"type":51,"value":1158},{"type":42,"tag":56,"props":1167,"children":1169},{"className":1168},[],[1170],{"type":51,"value":1171},"endpoint",{"type":51,"value":1158},{"type":42,"tag":56,"props":1174,"children":1176},{"className":1175},[],[1177],{"type":51,"value":1178},"region",{"type":51,"value":1180},") derived from your config. See the ",{"type":42,"tag":56,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":51,"value":8},{"type":51,"value":1187}," skill.",{"type":42,"tag":164,"props":1189,"children":1191},{"id":1190},"working-with-objects-the-files-sdk-recommended",[1192],{"type":51,"value":1193},"Working with Objects: the Files SDK (Recommended)",{"type":42,"tag":43,"props":1195,"children":1196},{},[1197,1199,1206,1208,1213,1215,1221,1222,1228,1229,1235,1236,1242,1243,1249,1250,1256,1257,1263,1264,1270,1272,1278],{"type":51,"value":1198},"The simplest, most portable way to read and write objects is the ",{"type":42,"tag":76,"props":1200,"children":1203},{"href":1201,"rel":1202},"https:\u002F\u002Ffiles-sdk.dev",[80],[1204],{"type":51,"value":1205},"Files SDK",{"type":51,"value":1207}," with its ",{"type":42,"tag":56,"props":1209,"children":1211},{"className":1210},[],[1212],{"type":51,"value":8},{"type":51,"value":1214}," adapter — a small, unified storage API (",{"type":42,"tag":56,"props":1216,"children":1218},{"className":1217},[],[1219],{"type":51,"value":1220},"upload",{"type":51,"value":1158},{"type":42,"tag":56,"props":1223,"children":1225},{"className":1224},[],[1226],{"type":51,"value":1227},"download",{"type":51,"value":1158},{"type":42,"tag":56,"props":1230,"children":1232},{"className":1231},[],[1233],{"type":51,"value":1234},"url",{"type":51,"value":1158},{"type":42,"tag":56,"props":1237,"children":1239},{"className":1238},[],[1240],{"type":51,"value":1241},"list",{"type":51,"value":1158},{"type":42,"tag":56,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":51,"value":1248},"exists",{"type":51,"value":1158},{"type":42,"tag":56,"props":1251,"children":1253},{"className":1252},[],[1254],{"type":51,"value":1255},"copy",{"type":51,"value":1158},{"type":42,"tag":56,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":51,"value":1262},"delete",{"type":51,"value":1158},{"type":42,"tag":56,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":51,"value":1269},"signedUploadUrl",{"type":51,"value":1271},") over web-standard I\u002FO. It uses the AWS S3 client under the hood, configured appropriately for Neon, and relabels errors as ",{"type":42,"tag":56,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":51,"value":1277},"Neon error",{"type":51,"value":1279}," — so there's nothing to misconfigure. Reach for this first.",{"type":42,"tag":43,"props":1281,"children":1282},{},[1283],{"type":51,"value":1284},"Install it alongside the AWS S3 peer dependencies the adapter uses internally:",{"type":42,"tag":86,"props":1286,"children":1288},{"className":88,"code":1287,"language":90,"meta":91,"style":91},"npm install files-sdk @aws-sdk\u002Fclient-s3 @aws-sdk\u002Fs3-presigned-post @aws-sdk\u002Fs3-request-presigner\n",[1289],{"type":42,"tag":56,"props":1290,"children":1291},{"__ignoreMap":91},[1292],{"type":42,"tag":97,"props":1293,"children":1294},{"class":99,"line":100},[1295,1300,1305,1310,1315,1320],{"type":42,"tag":97,"props":1296,"children":1297},{"style":104},[1298],{"type":51,"value":1299},"npm",{"type":42,"tag":97,"props":1301,"children":1302},{"style":110},[1303],{"type":51,"value":1304}," install",{"type":42,"tag":97,"props":1306,"children":1307},{"style":110},[1308],{"type":51,"value":1309}," files-sdk",{"type":42,"tag":97,"props":1311,"children":1312},{"style":110},[1313],{"type":51,"value":1314}," @aws-sdk\u002Fclient-s3",{"type":42,"tag":97,"props":1316,"children":1317},{"style":110},[1318],{"type":51,"value":1319}," @aws-sdk\u002Fs3-presigned-post",{"type":42,"tag":97,"props":1321,"children":1322},{"style":110},[1323],{"type":51,"value":1324}," @aws-sdk\u002Fs3-request-presigner\n",{"type":42,"tag":43,"props":1326,"children":1327},{},[1328,1330,1336],{"type":51,"value":1329},"The adapter resolves its endpoint, region, and credentials from the same injected ",{"type":42,"tag":56,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":51,"value":1335},"AWS_*",{"type":51,"value":1337}," env vars — pass only the bucket name:",{"type":42,"tag":86,"props":1339,"children":1341},{"className":404,"code":1340,"language":406,"meta":91,"style":91},"import { Files } from \"files-sdk\";\nimport { neon } from \"files-sdk\u002Fneon\";\n\nconst files = new Files({ adapter: neon({ bucket: \"images\" }) });\n\n\u002F\u002F Upload — body may be a Buffer, Uint8Array, Blob, File, ReadableStream, or string\nawait files.upload(\"generated\u002Fcat.jpg\", fileBuffer, { contentType: \"image\u002Fjpeg\" });\n\n\u002F\u002F Download\nconst file = await files.download(\"generated\u002Fcat.jpg\");\nconst bytes = new Uint8Array(await file.arrayBuffer());\n\n\u002F\u002F Presigned GET — share without exposing credentials (defaults to a 1h expiry)\nconst url = await files.url(\"generated\u002Fcat.jpg\", { expiresIn: 3600 });\n\n\u002F\u002F Plus: files.exists(), files.list({ prefix }), files.copy(), files.delete(), files.signedUploadUrl()\n",[1342],{"type":42,"tag":56,"props":1343,"children":1344},{"__ignoreMap":91},[1345,1386,1427,1434,1535,1542,1550,1640,1647,1655,1712,1768,1775,1784,1868,1876],{"type":42,"tag":97,"props":1346,"children":1347},{"class":99,"line":100},[1348,1352,1356,1361,1365,1369,1373,1378,1382],{"type":42,"tag":97,"props":1349,"children":1350},{"style":426},[1351],{"type":51,"value":429},{"type":42,"tag":97,"props":1353,"children":1354},{"style":432},[1355],{"type":51,"value":435},{"type":42,"tag":97,"props":1357,"children":1358},{"style":438},[1359],{"type":51,"value":1360}," Files",{"type":42,"tag":97,"props":1362,"children":1363},{"style":432},[1364],{"type":51,"value":446},{"type":42,"tag":97,"props":1366,"children":1367},{"style":426},[1368],{"type":51,"value":451},{"type":42,"tag":97,"props":1370,"children":1371},{"style":432},[1372],{"type":51,"value":456},{"type":42,"tag":97,"props":1374,"children":1375},{"style":110},[1376],{"type":51,"value":1377},"files-sdk",{"type":42,"tag":97,"props":1379,"children":1380},{"style":432},[1381],{"type":51,"value":466},{"type":42,"tag":97,"props":1383,"children":1384},{"style":432},[1385],{"type":51,"value":471},{"type":42,"tag":97,"props":1387,"children":1388},{"class":99,"line":422},[1389,1393,1397,1402,1406,1410,1414,1419,1423],{"type":42,"tag":97,"props":1390,"children":1391},{"style":426},[1392],{"type":51,"value":429},{"type":42,"tag":97,"props":1394,"children":1395},{"style":432},[1396],{"type":51,"value":435},{"type":42,"tag":97,"props":1398,"children":1399},{"style":438},[1400],{"type":51,"value":1401}," neon",{"type":42,"tag":97,"props":1403,"children":1404},{"style":432},[1405],{"type":51,"value":446},{"type":42,"tag":97,"props":1407,"children":1408},{"style":426},[1409],{"type":51,"value":451},{"type":42,"tag":97,"props":1411,"children":1412},{"style":432},[1413],{"type":51,"value":456},{"type":42,"tag":97,"props":1415,"children":1416},{"style":110},[1417],{"type":51,"value":1418},"files-sdk\u002Fneon",{"type":42,"tag":97,"props":1420,"children":1421},{"style":432},[1422],{"type":51,"value":466},{"type":42,"tag":97,"props":1424,"children":1425},{"style":432},[1426],{"type":51,"value":471},{"type":42,"tag":97,"props":1428,"children":1429},{"class":99,"line":474},[1430],{"type":42,"tag":97,"props":1431,"children":1432},{"emptyLinePlaceholder":478},[1433],{"type":51,"value":481},{"type":42,"tag":97,"props":1435,"children":1436},{"class":99,"line":484},[1437,1443,1448,1453,1458,1462,1466,1471,1476,1480,1484,1488,1492,1497,1501,1505,1510,1514,1518,1523,1527,1531],{"type":42,"tag":97,"props":1438,"children":1440},{"style":1439},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1441],{"type":51,"value":1442},"const",{"type":42,"tag":97,"props":1444,"children":1445},{"style":438},[1446],{"type":51,"value":1447}," files ",{"type":42,"tag":97,"props":1449,"children":1450},{"style":432},[1451],{"type":51,"value":1452},"=",{"type":42,"tag":97,"props":1454,"children":1455},{"style":432},[1456],{"type":51,"value":1457}," new",{"type":42,"tag":97,"props":1459,"children":1460},{"style":498},[1461],{"type":51,"value":1360},{"type":42,"tag":97,"props":1463,"children":1464},{"style":438},[1465],{"type":51,"value":505},{"type":42,"tag":97,"props":1467,"children":1468},{"style":432},[1469],{"type":51,"value":1470},"{",{"type":42,"tag":97,"props":1472,"children":1473},{"style":517},[1474],{"type":51,"value":1475}," adapter",{"type":42,"tag":97,"props":1477,"children":1478},{"style":432},[1479],{"type":51,"value":525},{"type":42,"tag":97,"props":1481,"children":1482},{"style":498},[1483],{"type":51,"value":1401},{"type":42,"tag":97,"props":1485,"children":1486},{"style":438},[1487],{"type":51,"value":505},{"type":42,"tag":97,"props":1489,"children":1490},{"style":432},[1491],{"type":51,"value":1470},{"type":42,"tag":97,"props":1493,"children":1494},{"style":517},[1495],{"type":51,"value":1496}," bucket",{"type":42,"tag":97,"props":1498,"children":1499},{"style":432},[1500],{"type":51,"value":525},{"type":42,"tag":97,"props":1502,"children":1503},{"style":432},[1504],{"type":51,"value":456},{"type":42,"tag":97,"props":1506,"children":1507},{"style":110},[1508],{"type":51,"value":1509},"images",{"type":42,"tag":97,"props":1511,"children":1512},{"style":432},[1513],{"type":51,"value":466},{"type":42,"tag":97,"props":1515,"children":1516},{"style":432},[1517],{"type":51,"value":446},{"type":42,"tag":97,"props":1519,"children":1520},{"style":438},[1521],{"type":51,"value":1522},") ",{"type":42,"tag":97,"props":1524,"children":1525},{"style":432},[1526],{"type":51,"value":649},{"type":42,"tag":97,"props":1528,"children":1529},{"style":438},[1530],{"type":51,"value":654},{"type":42,"tag":97,"props":1532,"children":1533},{"style":432},[1534],{"type":51,"value":471},{"type":42,"tag":97,"props":1536,"children":1537},{"class":99,"line":513},[1538],{"type":42,"tag":97,"props":1539,"children":1540},{"emptyLinePlaceholder":478},[1541],{"type":51,"value":481},{"type":42,"tag":97,"props":1543,"children":1544},{"class":99,"line":533},[1545],{"type":42,"tag":97,"props":1546,"children":1547},{"style":416},[1548],{"type":51,"value":1549},"\u002F\u002F Upload — body may be a Buffer, Uint8Array, Blob, File, ReadableStream, or string\n",{"type":42,"tag":97,"props":1551,"children":1552},{"class":99,"line":550},[1553,1558,1563,1567,1571,1575,1579,1584,1588,1593,1598,1602,1606,1611,1615,1619,1624,1628,1632,1636],{"type":42,"tag":97,"props":1554,"children":1555},{"style":426},[1556],{"type":51,"value":1557},"await",{"type":42,"tag":97,"props":1559,"children":1560},{"style":438},[1561],{"type":51,"value":1562}," files",{"type":42,"tag":97,"props":1564,"children":1565},{"style":432},[1566],{"type":51,"value":152},{"type":42,"tag":97,"props":1568,"children":1569},{"style":498},[1570],{"type":51,"value":1220},{"type":42,"tag":97,"props":1572,"children":1573},{"style":438},[1574],{"type":51,"value":505},{"type":42,"tag":97,"props":1576,"children":1577},{"style":432},[1578],{"type":51,"value":466},{"type":42,"tag":97,"props":1580,"children":1581},{"style":110},[1582],{"type":51,"value":1583},"generated\u002Fcat.jpg",{"type":42,"tag":97,"props":1585,"children":1586},{"style":432},[1587],{"type":51,"value":466},{"type":42,"tag":97,"props":1589,"children":1590},{"style":432},[1591],{"type":51,"value":1592},",",{"type":42,"tag":97,"props":1594,"children":1595},{"style":438},[1596],{"type":51,"value":1597}," fileBuffer",{"type":42,"tag":97,"props":1599,"children":1600},{"style":432},[1601],{"type":51,"value":1592},{"type":42,"tag":97,"props":1603,"children":1604},{"style":432},[1605],{"type":51,"value":435},{"type":42,"tag":97,"props":1607,"children":1608},{"style":517},[1609],{"type":51,"value":1610}," contentType",{"type":42,"tag":97,"props":1612,"children":1613},{"style":432},[1614],{"type":51,"value":525},{"type":42,"tag":97,"props":1616,"children":1617},{"style":432},[1618],{"type":51,"value":456},{"type":42,"tag":97,"props":1620,"children":1621},{"style":110},[1622],{"type":51,"value":1623},"image\u002Fjpeg",{"type":42,"tag":97,"props":1625,"children":1626},{"style":432},[1627],{"type":51,"value":466},{"type":42,"tag":97,"props":1629,"children":1630},{"style":432},[1631],{"type":51,"value":446},{"type":42,"tag":97,"props":1633,"children":1634},{"style":438},[1635],{"type":51,"value":654},{"type":42,"tag":97,"props":1637,"children":1638},{"style":432},[1639],{"type":51,"value":471},{"type":42,"tag":97,"props":1641,"children":1642},{"class":99,"line":573},[1643],{"type":42,"tag":97,"props":1644,"children":1645},{"emptyLinePlaceholder":478},[1646],{"type":51,"value":481},{"type":42,"tag":97,"props":1648,"children":1649},{"class":99,"line":625},[1650],{"type":42,"tag":97,"props":1651,"children":1652},{"style":416},[1653],{"type":51,"value":1654},"\u002F\u002F Download\n",{"type":42,"tag":97,"props":1656,"children":1657},{"class":99,"line":634},[1658,1662,1667,1671,1676,1680,1684,1688,1692,1696,1700,1704,1708],{"type":42,"tag":97,"props":1659,"children":1660},{"style":1439},[1661],{"type":51,"value":1442},{"type":42,"tag":97,"props":1663,"children":1664},{"style":438},[1665],{"type":51,"value":1666}," file ",{"type":42,"tag":97,"props":1668,"children":1669},{"style":432},[1670],{"type":51,"value":1452},{"type":42,"tag":97,"props":1672,"children":1673},{"style":426},[1674],{"type":51,"value":1675}," await",{"type":42,"tag":97,"props":1677,"children":1678},{"style":438},[1679],{"type":51,"value":1562},{"type":42,"tag":97,"props":1681,"children":1682},{"style":432},[1683],{"type":51,"value":152},{"type":42,"tag":97,"props":1685,"children":1686},{"style":498},[1687],{"type":51,"value":1227},{"type":42,"tag":97,"props":1689,"children":1690},{"style":438},[1691],{"type":51,"value":505},{"type":42,"tag":97,"props":1693,"children":1694},{"style":432},[1695],{"type":51,"value":466},{"type":42,"tag":97,"props":1697,"children":1698},{"style":110},[1699],{"type":51,"value":1583},{"type":42,"tag":97,"props":1701,"children":1702},{"style":432},[1703],{"type":51,"value":466},{"type":42,"tag":97,"props":1705,"children":1706},{"style":438},[1707],{"type":51,"value":654},{"type":42,"tag":97,"props":1709,"children":1710},{"style":432},[1711],{"type":51,"value":471},{"type":42,"tag":97,"props":1713,"children":1714},{"class":99,"line":643},[1715,1719,1724,1728,1732,1737,1741,1745,1750,1754,1759,1764],{"type":42,"tag":97,"props":1716,"children":1717},{"style":1439},[1718],{"type":51,"value":1442},{"type":42,"tag":97,"props":1720,"children":1721},{"style":438},[1722],{"type":51,"value":1723}," bytes ",{"type":42,"tag":97,"props":1725,"children":1726},{"style":432},[1727],{"type":51,"value":1452},{"type":42,"tag":97,"props":1729,"children":1730},{"style":432},[1731],{"type":51,"value":1457},{"type":42,"tag":97,"props":1733,"children":1734},{"style":498},[1735],{"type":51,"value":1736}," Uint8Array",{"type":42,"tag":97,"props":1738,"children":1739},{"style":438},[1740],{"type":51,"value":505},{"type":42,"tag":97,"props":1742,"children":1743},{"style":426},[1744],{"type":51,"value":1557},{"type":42,"tag":97,"props":1746,"children":1747},{"style":438},[1748],{"type":51,"value":1749}," file",{"type":42,"tag":97,"props":1751,"children":1752},{"style":432},[1753],{"type":51,"value":152},{"type":42,"tag":97,"props":1755,"children":1756},{"style":498},[1757],{"type":51,"value":1758},"arrayBuffer",{"type":42,"tag":97,"props":1760,"children":1761},{"style":438},[1762],{"type":51,"value":1763},"())",{"type":42,"tag":97,"props":1765,"children":1766},{"style":432},[1767],{"type":51,"value":471},{"type":42,"tag":97,"props":1769,"children":1770},{"class":99,"line":28},[1771],{"type":42,"tag":97,"props":1772,"children":1773},{"emptyLinePlaceholder":478},[1774],{"type":51,"value":481},{"type":42,"tag":97,"props":1776,"children":1778},{"class":99,"line":1777},13,[1779],{"type":42,"tag":97,"props":1780,"children":1781},{"style":416},[1782],{"type":51,"value":1783},"\u002F\u002F Presigned GET — share without exposing credentials (defaults to a 1h expiry)\n",{"type":42,"tag":97,"props":1785,"children":1787},{"class":99,"line":1786},14,[1788,1792,1797,1801,1805,1809,1813,1817,1821,1825,1829,1833,1837,1841,1846,1850,1856,1860,1864],{"type":42,"tag":97,"props":1789,"children":1790},{"style":1439},[1791],{"type":51,"value":1442},{"type":42,"tag":97,"props":1793,"children":1794},{"style":438},[1795],{"type":51,"value":1796}," url ",{"type":42,"tag":97,"props":1798,"children":1799},{"style":432},[1800],{"type":51,"value":1452},{"type":42,"tag":97,"props":1802,"children":1803},{"style":426},[1804],{"type":51,"value":1675},{"type":42,"tag":97,"props":1806,"children":1807},{"style":438},[1808],{"type":51,"value":1562},{"type":42,"tag":97,"props":1810,"children":1811},{"style":432},[1812],{"type":51,"value":152},{"type":42,"tag":97,"props":1814,"children":1815},{"style":498},[1816],{"type":51,"value":1234},{"type":42,"tag":97,"props":1818,"children":1819},{"style":438},[1820],{"type":51,"value":505},{"type":42,"tag":97,"props":1822,"children":1823},{"style":432},[1824],{"type":51,"value":466},{"type":42,"tag":97,"props":1826,"children":1827},{"style":110},[1828],{"type":51,"value":1583},{"type":42,"tag":97,"props":1830,"children":1831},{"style":432},[1832],{"type":51,"value":466},{"type":42,"tag":97,"props":1834,"children":1835},{"style":432},[1836],{"type":51,"value":1592},{"type":42,"tag":97,"props":1838,"children":1839},{"style":432},[1840],{"type":51,"value":435},{"type":42,"tag":97,"props":1842,"children":1843},{"style":517},[1844],{"type":51,"value":1845}," expiresIn",{"type":42,"tag":97,"props":1847,"children":1848},{"style":432},[1849],{"type":51,"value":525},{"type":42,"tag":97,"props":1851,"children":1853},{"style":1852},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1854],{"type":51,"value":1855}," 3600",{"type":42,"tag":97,"props":1857,"children":1858},{"style":432},[1859],{"type":51,"value":446},{"type":42,"tag":97,"props":1861,"children":1862},{"style":438},[1863],{"type":51,"value":654},{"type":42,"tag":97,"props":1865,"children":1866},{"style":432},[1867],{"type":51,"value":471},{"type":42,"tag":97,"props":1869,"children":1871},{"class":99,"line":1870},15,[1872],{"type":42,"tag":97,"props":1873,"children":1874},{"emptyLinePlaceholder":478},[1875],{"type":51,"value":481},{"type":42,"tag":97,"props":1877,"children":1879},{"class":99,"line":1878},16,[1880],{"type":42,"tag":97,"props":1881,"children":1882},{"style":416},[1883],{"type":51,"value":1884},"\u002F\u002F Plus: files.exists(), files.list({ prefix }), files.copy(), files.delete(), files.signedUploadUrl()\n",{"type":42,"tag":43,"props":1886,"children":1887},{},[1888,1890,1896,1897,1903,1904,1910],{"type":51,"value":1889},"Swap the adapter import (",{"type":42,"tag":56,"props":1891,"children":1893},{"className":1892},[],[1894],{"type":51,"value":1895},"files-sdk\u002Fs3",{"type":51,"value":1158},{"type":42,"tag":56,"props":1898,"children":1900},{"className":1899},[],[1901],{"type":51,"value":1902},"files-sdk\u002Fr2",{"type":51,"value":1158},{"type":42,"tag":56,"props":1905,"children":1907},{"className":1906},[],[1908],{"type":51,"value":1909},"files-sdk\u002Fgcs",{"type":51,"value":1911},", …) and the rest of your code is unchanged.",{"type":42,"tag":164,"props":1913,"children":1915},{"id":1914},"working-with-objects-the-aws-s3-client-alternative",[1916],{"type":51,"value":1917},"Working with Objects: the AWS S3 Client (Alternative)",{"type":42,"tag":43,"props":1919,"children":1920},{},[1921,1923,1929,1931,1936],{"type":51,"value":1922},"Neon speaks the S3 API directly, so you can drop down to the AWS SDK whenever you prefer the native client or already depend on it. The credentials, endpoint, and region are read from the standard AWS env chain, so the only setting you pass is ",{"type":42,"tag":56,"props":1924,"children":1926},{"className":1925},[],[1927],{"type":51,"value":1928},"forcePathStyle: true",{"type":51,"value":1930}," — Neon requires path-style addressing, so the S3 client ",{"type":42,"tag":47,"props":1932,"children":1933},{},[1934],{"type":51,"value":1935},"must",{"type":51,"value":1937}," set it:",{"type":42,"tag":86,"props":1939,"children":1941},{"className":404,"code":1940,"language":406,"meta":91,"style":91},"import { S3Client } from \"@aws-sdk\u002Fclient-s3\";\n\nconst s3 = new S3Client({\n  forcePathStyle: true, \u002F\u002F required: Neon uses path-style addressing\n});\n",[1942],{"type":42,"tag":56,"props":1943,"children":1944},{"__ignoreMap":91},[1945,1986,1993,2025,2052],{"type":42,"tag":97,"props":1946,"children":1947},{"class":99,"line":100},[1948,1952,1956,1961,1965,1969,1973,1978,1982],{"type":42,"tag":97,"props":1949,"children":1950},{"style":426},[1951],{"type":51,"value":429},{"type":42,"tag":97,"props":1953,"children":1954},{"style":432},[1955],{"type":51,"value":435},{"type":42,"tag":97,"props":1957,"children":1958},{"style":438},[1959],{"type":51,"value":1960}," S3Client",{"type":42,"tag":97,"props":1962,"children":1963},{"style":432},[1964],{"type":51,"value":446},{"type":42,"tag":97,"props":1966,"children":1967},{"style":426},[1968],{"type":51,"value":451},{"type":42,"tag":97,"props":1970,"children":1971},{"style":432},[1972],{"type":51,"value":456},{"type":42,"tag":97,"props":1974,"children":1975},{"style":110},[1976],{"type":51,"value":1977},"@aws-sdk\u002Fclient-s3",{"type":42,"tag":97,"props":1979,"children":1980},{"style":432},[1981],{"type":51,"value":466},{"type":42,"tag":97,"props":1983,"children":1984},{"style":432},[1985],{"type":51,"value":471},{"type":42,"tag":97,"props":1987,"children":1988},{"class":99,"line":422},[1989],{"type":42,"tag":97,"props":1990,"children":1991},{"emptyLinePlaceholder":478},[1992],{"type":51,"value":481},{"type":42,"tag":97,"props":1994,"children":1995},{"class":99,"line":474},[1996,2000,2005,2009,2013,2017,2021],{"type":42,"tag":97,"props":1997,"children":1998},{"style":1439},[1999],{"type":51,"value":1442},{"type":42,"tag":97,"props":2001,"children":2002},{"style":438},[2003],{"type":51,"value":2004}," s3 ",{"type":42,"tag":97,"props":2006,"children":2007},{"style":432},[2008],{"type":51,"value":1452},{"type":42,"tag":97,"props":2010,"children":2011},{"style":432},[2012],{"type":51,"value":1457},{"type":42,"tag":97,"props":2014,"children":2015},{"style":498},[2016],{"type":51,"value":1960},{"type":42,"tag":97,"props":2018,"children":2019},{"style":438},[2020],{"type":51,"value":505},{"type":42,"tag":97,"props":2022,"children":2023},{"style":432},[2024],{"type":51,"value":510},{"type":42,"tag":97,"props":2026,"children":2027},{"class":99,"line":484},[2028,2033,2037,2043,2047],{"type":42,"tag":97,"props":2029,"children":2030},{"style":517},[2031],{"type":51,"value":2032},"  forcePathStyle",{"type":42,"tag":97,"props":2034,"children":2035},{"style":432},[2036],{"type":51,"value":525},{"type":42,"tag":97,"props":2038,"children":2040},{"style":2039},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[2041],{"type":51,"value":2042}," true",{"type":42,"tag":97,"props":2044,"children":2045},{"style":432},[2046],{"type":51,"value":1592},{"type":42,"tag":97,"props":2048,"children":2049},{"style":416},[2050],{"type":51,"value":2051}," \u002F\u002F required: Neon uses path-style addressing\n",{"type":42,"tag":97,"props":2053,"children":2054},{"class":99,"line":513},[2055,2059,2063],{"type":42,"tag":97,"props":2056,"children":2057},{"style":432},[2058],{"type":51,"value":649},{"type":42,"tag":97,"props":2060,"children":2061},{"style":438},[2062],{"type":51,"value":654},{"type":42,"tag":97,"props":2064,"children":2065},{"style":432},[2066],{"type":51,"value":471},{"type":42,"tag":43,"props":2068,"children":2069},{},[2070],{"type":51,"value":2071},"Then upload, download, and presign with the raw command objects:",{"type":42,"tag":86,"props":2073,"children":2075},{"className":404,"code":2074,"language":406,"meta":91,"style":91},"import { PutObjectCommand, GetObjectCommand } from \"@aws-sdk\u002Fclient-s3\";\nimport { getSignedUrl } from \"@aws-sdk\u002Fs3-request-presigner\";\n\nconst BUCKET = \"images\";\n\n\u002F\u002F Upload\nawait s3.send(\n  new PutObjectCommand({\n    Bucket: BUCKET,\n    Key: \"generated\u002Fcat.jpg\",\n    Body: fileBuffer,\n    ContentType: \"image\u002Fjpeg\",\n  }),\n);\n\n\u002F\u002F Download\nconst res = await s3.send(\n  new GetObjectCommand({ Bucket: BUCKET, Key: \"generated\u002Fcat.jpg\" }),\n);\nconst bytes = await res.Body?.transformToByteArray();\n\n\u002F\u002F Presigned GET — share without exposing credentials\nconst url = await getSignedUrl(\n  s3,\n  new GetObjectCommand({ Bucket: BUCKET, Key: \"generated\u002Fcat.jpg\" }),\n  { expiresIn: 3600 },\n);\n",[2076],{"type":42,"tag":56,"props":2077,"children":2078},{"__ignoreMap":91},[2079,2128,2169,2176,2208,2215,2223,2249,2269,2291,2319,2339,2367,2383,2394,2401,2408,2445,2515,2527,2580,2588,2597,2625,2638,2706,2731],{"type":42,"tag":97,"props":2080,"children":2081},{"class":99,"line":100},[2082,2086,2090,2095,2099,2104,2108,2112,2116,2120,2124],{"type":42,"tag":97,"props":2083,"children":2084},{"style":426},[2085],{"type":51,"value":429},{"type":42,"tag":97,"props":2087,"children":2088},{"style":432},[2089],{"type":51,"value":435},{"type":42,"tag":97,"props":2091,"children":2092},{"style":438},[2093],{"type":51,"value":2094}," PutObjectCommand",{"type":42,"tag":97,"props":2096,"children":2097},{"style":432},[2098],{"type":51,"value":1592},{"type":42,"tag":97,"props":2100,"children":2101},{"style":438},[2102],{"type":51,"value":2103}," GetObjectCommand",{"type":42,"tag":97,"props":2105,"children":2106},{"style":432},[2107],{"type":51,"value":446},{"type":42,"tag":97,"props":2109,"children":2110},{"style":426},[2111],{"type":51,"value":451},{"type":42,"tag":97,"props":2113,"children":2114},{"style":432},[2115],{"type":51,"value":456},{"type":42,"tag":97,"props":2117,"children":2118},{"style":110},[2119],{"type":51,"value":1977},{"type":42,"tag":97,"props":2121,"children":2122},{"style":432},[2123],{"type":51,"value":466},{"type":42,"tag":97,"props":2125,"children":2126},{"style":432},[2127],{"type":51,"value":471},{"type":42,"tag":97,"props":2129,"children":2130},{"class":99,"line":422},[2131,2135,2139,2144,2148,2152,2156,2161,2165],{"type":42,"tag":97,"props":2132,"children":2133},{"style":426},[2134],{"type":51,"value":429},{"type":42,"tag":97,"props":2136,"children":2137},{"style":432},[2138],{"type":51,"value":435},{"type":42,"tag":97,"props":2140,"children":2141},{"style":438},[2142],{"type":51,"value":2143}," getSignedUrl",{"type":42,"tag":97,"props":2145,"children":2146},{"style":432},[2147],{"type":51,"value":446},{"type":42,"tag":97,"props":2149,"children":2150},{"style":426},[2151],{"type":51,"value":451},{"type":42,"tag":97,"props":2153,"children":2154},{"style":432},[2155],{"type":51,"value":456},{"type":42,"tag":97,"props":2157,"children":2158},{"style":110},[2159],{"type":51,"value":2160},"@aws-sdk\u002Fs3-request-presigner",{"type":42,"tag":97,"props":2162,"children":2163},{"style":432},[2164],{"type":51,"value":466},{"type":42,"tag":97,"props":2166,"children":2167},{"style":432},[2168],{"type":51,"value":471},{"type":42,"tag":97,"props":2170,"children":2171},{"class":99,"line":474},[2172],{"type":42,"tag":97,"props":2173,"children":2174},{"emptyLinePlaceholder":478},[2175],{"type":51,"value":481},{"type":42,"tag":97,"props":2177,"children":2178},{"class":99,"line":484},[2179,2183,2188,2192,2196,2200,2204],{"type":42,"tag":97,"props":2180,"children":2181},{"style":1439},[2182],{"type":51,"value":1442},{"type":42,"tag":97,"props":2184,"children":2185},{"style":438},[2186],{"type":51,"value":2187}," BUCKET ",{"type":42,"tag":97,"props":2189,"children":2190},{"style":432},[2191],{"type":51,"value":1452},{"type":42,"tag":97,"props":2193,"children":2194},{"style":432},[2195],{"type":51,"value":456},{"type":42,"tag":97,"props":2197,"children":2198},{"style":110},[2199],{"type":51,"value":1509},{"type":42,"tag":97,"props":2201,"children":2202},{"style":432},[2203],{"type":51,"value":466},{"type":42,"tag":97,"props":2205,"children":2206},{"style":432},[2207],{"type":51,"value":471},{"type":42,"tag":97,"props":2209,"children":2210},{"class":99,"line":513},[2211],{"type":42,"tag":97,"props":2212,"children":2213},{"emptyLinePlaceholder":478},[2214],{"type":51,"value":481},{"type":42,"tag":97,"props":2216,"children":2217},{"class":99,"line":533},[2218],{"type":42,"tag":97,"props":2219,"children":2220},{"style":416},[2221],{"type":51,"value":2222},"\u002F\u002F Upload\n",{"type":42,"tag":97,"props":2224,"children":2225},{"class":99,"line":550},[2226,2230,2235,2239,2244],{"type":42,"tag":97,"props":2227,"children":2228},{"style":426},[2229],{"type":51,"value":1557},{"type":42,"tag":97,"props":2231,"children":2232},{"style":438},[2233],{"type":51,"value":2234}," s3",{"type":42,"tag":97,"props":2236,"children":2237},{"style":432},[2238],{"type":51,"value":152},{"type":42,"tag":97,"props":2240,"children":2241},{"style":498},[2242],{"type":51,"value":2243},"send",{"type":42,"tag":97,"props":2245,"children":2246},{"style":438},[2247],{"type":51,"value":2248},"(\n",{"type":42,"tag":97,"props":2250,"children":2251},{"class":99,"line":573},[2252,2257,2261,2265],{"type":42,"tag":97,"props":2253,"children":2254},{"style":432},[2255],{"type":51,"value":2256},"  new",{"type":42,"tag":97,"props":2258,"children":2259},{"style":498},[2260],{"type":51,"value":2094},{"type":42,"tag":97,"props":2262,"children":2263},{"style":438},[2264],{"type":51,"value":505},{"type":42,"tag":97,"props":2266,"children":2267},{"style":432},[2268],{"type":51,"value":510},{"type":42,"tag":97,"props":2270,"children":2271},{"class":99,"line":625},[2272,2277,2281,2286],{"type":42,"tag":97,"props":2273,"children":2274},{"style":517},[2275],{"type":51,"value":2276},"    Bucket",{"type":42,"tag":97,"props":2278,"children":2279},{"style":432},[2280],{"type":51,"value":525},{"type":42,"tag":97,"props":2282,"children":2283},{"style":438},[2284],{"type":51,"value":2285}," BUCKET",{"type":42,"tag":97,"props":2287,"children":2288},{"style":432},[2289],{"type":51,"value":2290},",\n",{"type":42,"tag":97,"props":2292,"children":2293},{"class":99,"line":634},[2294,2299,2303,2307,2311,2315],{"type":42,"tag":97,"props":2295,"children":2296},{"style":517},[2297],{"type":51,"value":2298},"    Key",{"type":42,"tag":97,"props":2300,"children":2301},{"style":432},[2302],{"type":51,"value":525},{"type":42,"tag":97,"props":2304,"children":2305},{"style":432},[2306],{"type":51,"value":456},{"type":42,"tag":97,"props":2308,"children":2309},{"style":110},[2310],{"type":51,"value":1583},{"type":42,"tag":97,"props":2312,"children":2313},{"style":432},[2314],{"type":51,"value":466},{"type":42,"tag":97,"props":2316,"children":2317},{"style":432},[2318],{"type":51,"value":2290},{"type":42,"tag":97,"props":2320,"children":2321},{"class":99,"line":643},[2322,2327,2331,2335],{"type":42,"tag":97,"props":2323,"children":2324},{"style":517},[2325],{"type":51,"value":2326},"    Body",{"type":42,"tag":97,"props":2328,"children":2329},{"style":432},[2330],{"type":51,"value":525},{"type":42,"tag":97,"props":2332,"children":2333},{"style":438},[2334],{"type":51,"value":1597},{"type":42,"tag":97,"props":2336,"children":2337},{"style":432},[2338],{"type":51,"value":2290},{"type":42,"tag":97,"props":2340,"children":2341},{"class":99,"line":28},[2342,2347,2351,2355,2359,2363],{"type":42,"tag":97,"props":2343,"children":2344},{"style":517},[2345],{"type":51,"value":2346},"    ContentType",{"type":42,"tag":97,"props":2348,"children":2349},{"style":432},[2350],{"type":51,"value":525},{"type":42,"tag":97,"props":2352,"children":2353},{"style":432},[2354],{"type":51,"value":456},{"type":42,"tag":97,"props":2356,"children":2357},{"style":110},[2358],{"type":51,"value":1623},{"type":42,"tag":97,"props":2360,"children":2361},{"style":432},[2362],{"type":51,"value":466},{"type":42,"tag":97,"props":2364,"children":2365},{"style":432},[2366],{"type":51,"value":2290},{"type":42,"tag":97,"props":2368,"children":2369},{"class":99,"line":1777},[2370,2375,2379],{"type":42,"tag":97,"props":2371,"children":2372},{"style":432},[2373],{"type":51,"value":2374},"  }",{"type":42,"tag":97,"props":2376,"children":2377},{"style":438},[2378],{"type":51,"value":654},{"type":42,"tag":97,"props":2380,"children":2381},{"style":432},[2382],{"type":51,"value":2290},{"type":42,"tag":97,"props":2384,"children":2385},{"class":99,"line":1786},[2386,2390],{"type":42,"tag":97,"props":2387,"children":2388},{"style":438},[2389],{"type":51,"value":654},{"type":42,"tag":97,"props":2391,"children":2392},{"style":432},[2393],{"type":51,"value":471},{"type":42,"tag":97,"props":2395,"children":2396},{"class":99,"line":1870},[2397],{"type":42,"tag":97,"props":2398,"children":2399},{"emptyLinePlaceholder":478},[2400],{"type":51,"value":481},{"type":42,"tag":97,"props":2402,"children":2403},{"class":99,"line":1878},[2404],{"type":42,"tag":97,"props":2405,"children":2406},{"style":416},[2407],{"type":51,"value":1654},{"type":42,"tag":97,"props":2409,"children":2411},{"class":99,"line":2410},17,[2412,2416,2421,2425,2429,2433,2437,2441],{"type":42,"tag":97,"props":2413,"children":2414},{"style":1439},[2415],{"type":51,"value":1442},{"type":42,"tag":97,"props":2417,"children":2418},{"style":438},[2419],{"type":51,"value":2420}," res ",{"type":42,"tag":97,"props":2422,"children":2423},{"style":432},[2424],{"type":51,"value":1452},{"type":42,"tag":97,"props":2426,"children":2427},{"style":426},[2428],{"type":51,"value":1675},{"type":42,"tag":97,"props":2430,"children":2431},{"style":438},[2432],{"type":51,"value":2234},{"type":42,"tag":97,"props":2434,"children":2435},{"style":432},[2436],{"type":51,"value":152},{"type":42,"tag":97,"props":2438,"children":2439},{"style":498},[2440],{"type":51,"value":2243},{"type":42,"tag":97,"props":2442,"children":2443},{"style":438},[2444],{"type":51,"value":2248},{"type":42,"tag":97,"props":2446,"children":2448},{"class":99,"line":2447},18,[2449,2453,2457,2461,2465,2470,2474,2478,2482,2487,2491,2495,2499,2503,2507,2511],{"type":42,"tag":97,"props":2450,"children":2451},{"style":432},[2452],{"type":51,"value":2256},{"type":42,"tag":97,"props":2454,"children":2455},{"style":498},[2456],{"type":51,"value":2103},{"type":42,"tag":97,"props":2458,"children":2459},{"style":438},[2460],{"type":51,"value":505},{"type":42,"tag":97,"props":2462,"children":2463},{"style":432},[2464],{"type":51,"value":1470},{"type":42,"tag":97,"props":2466,"children":2467},{"style":517},[2468],{"type":51,"value":2469}," Bucket",{"type":42,"tag":97,"props":2471,"children":2472},{"style":432},[2473],{"type":51,"value":525},{"type":42,"tag":97,"props":2475,"children":2476},{"style":438},[2477],{"type":51,"value":2285},{"type":42,"tag":97,"props":2479,"children":2480},{"style":432},[2481],{"type":51,"value":1592},{"type":42,"tag":97,"props":2483,"children":2484},{"style":517},[2485],{"type":51,"value":2486}," Key",{"type":42,"tag":97,"props":2488,"children":2489},{"style":432},[2490],{"type":51,"value":525},{"type":42,"tag":97,"props":2492,"children":2493},{"style":432},[2494],{"type":51,"value":456},{"type":42,"tag":97,"props":2496,"children":2497},{"style":110},[2498],{"type":51,"value":1583},{"type":42,"tag":97,"props":2500,"children":2501},{"style":432},[2502],{"type":51,"value":466},{"type":42,"tag":97,"props":2504,"children":2505},{"style":432},[2506],{"type":51,"value":446},{"type":42,"tag":97,"props":2508,"children":2509},{"style":438},[2510],{"type":51,"value":654},{"type":42,"tag":97,"props":2512,"children":2513},{"style":432},[2514],{"type":51,"value":2290},{"type":42,"tag":97,"props":2516,"children":2518},{"class":99,"line":2517},19,[2519,2523],{"type":42,"tag":97,"props":2520,"children":2521},{"style":438},[2522],{"type":51,"value":654},{"type":42,"tag":97,"props":2524,"children":2525},{"style":432},[2526],{"type":51,"value":471},{"type":42,"tag":97,"props":2528,"children":2530},{"class":99,"line":2529},20,[2531,2535,2539,2543,2547,2552,2556,2561,2566,2571,2576],{"type":42,"tag":97,"props":2532,"children":2533},{"style":1439},[2534],{"type":51,"value":1442},{"type":42,"tag":97,"props":2536,"children":2537},{"style":438},[2538],{"type":51,"value":1723},{"type":42,"tag":97,"props":2540,"children":2541},{"style":432},[2542],{"type":51,"value":1452},{"type":42,"tag":97,"props":2544,"children":2545},{"style":426},[2546],{"type":51,"value":1675},{"type":42,"tag":97,"props":2548,"children":2549},{"style":438},[2550],{"type":51,"value":2551}," res",{"type":42,"tag":97,"props":2553,"children":2554},{"style":432},[2555],{"type":51,"value":152},{"type":42,"tag":97,"props":2557,"children":2558},{"style":438},[2559],{"type":51,"value":2560},"Body",{"type":42,"tag":97,"props":2562,"children":2563},{"style":432},[2564],{"type":51,"value":2565},"?.",{"type":42,"tag":97,"props":2567,"children":2568},{"style":498},[2569],{"type":51,"value":2570},"transformToByteArray",{"type":42,"tag":97,"props":2572,"children":2573},{"style":438},[2574],{"type":51,"value":2575},"()",{"type":42,"tag":97,"props":2577,"children":2578},{"style":432},[2579],{"type":51,"value":471},{"type":42,"tag":97,"props":2581,"children":2583},{"class":99,"line":2582},21,[2584],{"type":42,"tag":97,"props":2585,"children":2586},{"emptyLinePlaceholder":478},[2587],{"type":51,"value":481},{"type":42,"tag":97,"props":2589,"children":2591},{"class":99,"line":2590},22,[2592],{"type":42,"tag":97,"props":2593,"children":2594},{"style":416},[2595],{"type":51,"value":2596},"\u002F\u002F Presigned GET — share without exposing credentials\n",{"type":42,"tag":97,"props":2598,"children":2600},{"class":99,"line":2599},23,[2601,2605,2609,2613,2617,2621],{"type":42,"tag":97,"props":2602,"children":2603},{"style":1439},[2604],{"type":51,"value":1442},{"type":42,"tag":97,"props":2606,"children":2607},{"style":438},[2608],{"type":51,"value":1796},{"type":42,"tag":97,"props":2610,"children":2611},{"style":432},[2612],{"type":51,"value":1452},{"type":42,"tag":97,"props":2614,"children":2615},{"style":426},[2616],{"type":51,"value":1675},{"type":42,"tag":97,"props":2618,"children":2619},{"style":498},[2620],{"type":51,"value":2143},{"type":42,"tag":97,"props":2622,"children":2623},{"style":438},[2624],{"type":51,"value":2248},{"type":42,"tag":97,"props":2626,"children":2628},{"class":99,"line":2627},24,[2629,2634],{"type":42,"tag":97,"props":2630,"children":2631},{"style":438},[2632],{"type":51,"value":2633},"  s3",{"type":42,"tag":97,"props":2635,"children":2636},{"style":432},[2637],{"type":51,"value":2290},{"type":42,"tag":97,"props":2639,"children":2641},{"class":99,"line":2640},25,[2642,2646,2650,2654,2658,2662,2666,2670,2674,2678,2682,2686,2690,2694,2698,2702],{"type":42,"tag":97,"props":2643,"children":2644},{"style":432},[2645],{"type":51,"value":2256},{"type":42,"tag":97,"props":2647,"children":2648},{"style":498},[2649],{"type":51,"value":2103},{"type":42,"tag":97,"props":2651,"children":2652},{"style":438},[2653],{"type":51,"value":505},{"type":42,"tag":97,"props":2655,"children":2656},{"style":432},[2657],{"type":51,"value":1470},{"type":42,"tag":97,"props":2659,"children":2660},{"style":517},[2661],{"type":51,"value":2469},{"type":42,"tag":97,"props":2663,"children":2664},{"style":432},[2665],{"type":51,"value":525},{"type":42,"tag":97,"props":2667,"children":2668},{"style":438},[2669],{"type":51,"value":2285},{"type":42,"tag":97,"props":2671,"children":2672},{"style":432},[2673],{"type":51,"value":1592},{"type":42,"tag":97,"props":2675,"children":2676},{"style":517},[2677],{"type":51,"value":2486},{"type":42,"tag":97,"props":2679,"children":2680},{"style":432},[2681],{"type":51,"value":525},{"type":42,"tag":97,"props":2683,"children":2684},{"style":432},[2685],{"type":51,"value":456},{"type":42,"tag":97,"props":2687,"children":2688},{"style":110},[2689],{"type":51,"value":1583},{"type":42,"tag":97,"props":2691,"children":2692},{"style":432},[2693],{"type":51,"value":466},{"type":42,"tag":97,"props":2695,"children":2696},{"style":432},[2697],{"type":51,"value":446},{"type":42,"tag":97,"props":2699,"children":2700},{"style":438},[2701],{"type":51,"value":654},{"type":42,"tag":97,"props":2703,"children":2704},{"style":432},[2705],{"type":51,"value":2290},{"type":42,"tag":97,"props":2707,"children":2709},{"class":99,"line":2708},26,[2710,2715,2719,2723,2727],{"type":42,"tag":97,"props":2711,"children":2712},{"style":432},[2713],{"type":51,"value":2714},"  {",{"type":42,"tag":97,"props":2716,"children":2717},{"style":517},[2718],{"type":51,"value":1845},{"type":42,"tag":97,"props":2720,"children":2721},{"style":432},[2722],{"type":51,"value":525},{"type":42,"tag":97,"props":2724,"children":2725},{"style":1852},[2726],{"type":51,"value":1855},{"type":42,"tag":97,"props":2728,"children":2729},{"style":432},[2730],{"type":51,"value":622},{"type":42,"tag":97,"props":2732,"children":2734},{"class":99,"line":2733},27,[2735,2739],{"type":42,"tag":97,"props":2736,"children":2737},{"style":438},[2738],{"type":51,"value":654},{"type":42,"tag":97,"props":2740,"children":2741},{"style":432},[2742],{"type":51,"value":471},{"type":42,"tag":164,"props":2744,"children":2746},{"id":2745},"pairing-storage-with-the-database-on-a-branch",[2747],{"type":51,"value":2748},"Pairing Storage with the Database on a Branch",{"type":42,"tag":43,"props":2750,"children":2751},{},[2752,2754,2760,2762,2767,2769,2774],{"type":51,"value":2753},"The canonical pattern: an agent generates an image → ",{"type":42,"tag":56,"props":2755,"children":2757},{"className":2756},[],[2758],{"type":51,"value":2759},"PutObject",{"type":51,"value":2761}," into the ",{"type":42,"tag":56,"props":2763,"children":2765},{"className":2764},[],[2766],{"type":51,"value":1509},{"type":51,"value":2768}," bucket → a row is inserted in Postgres → a presigned URL is returned on read. Store the bucket ",{"type":42,"tag":47,"props":2770,"children":2771},{},[2772],{"type":51,"value":2773},"key",{"type":51,"value":2775}," (not the bytes) in a Postgres column, and presign on read. Because both the row and the object live on the same branch, they branch together and never drift.",{"type":42,"tag":164,"props":2777,"children":2779},{"id":2778},"cli-bucket-and-object-commands",[2780],{"type":51,"value":2781},"CLI Bucket and Object Commands",{"type":42,"tag":43,"props":2783,"children":2784},{},[2785,2790,2792,2798,2799,2805],{"type":42,"tag":56,"props":2786,"children":2788},{"className":2787},[],[2789],{"type":51,"value":8},{"type":51,"value":2791}," also has first-class bucket\u002Fobject commands (",{"type":42,"tag":56,"props":2793,"children":2795},{"className":2794},[],[2796],{"type":51,"value":2797},"neon bucket create|list|delete",{"type":51,"value":1158},{"type":42,"tag":56,"props":2800,"children":2802},{"className":2801},[],[2803],{"type":51,"value":2804},"neon bucket object put|get|list|delete",{"type":51,"value":2806},") for scripting and one-off operations.",{"type":42,"tag":164,"props":2808,"children":2810},{"id":2809},"neon-documentation",[2811],{"type":51,"value":2812},"Neon Documentation",{"type":42,"tag":43,"props":2814,"children":2815},{},[2816,2818,2824,2826,2832,2834,2840],{"type":51,"value":2817},"The Neon documentation is the source of truth and Object Storage is evolving rapidly, so always verify against the official docs. Any doc page can be fetched as markdown by appending ",{"type":42,"tag":56,"props":2819,"children":2821},{"className":2820},[],[2822],{"type":51,"value":2823},".md",{"type":51,"value":2825}," to the URL or by requesting ",{"type":42,"tag":56,"props":2827,"children":2829},{"className":2828},[],[2830],{"type":51,"value":2831},"Accept: text\u002Fmarkdown",{"type":51,"value":2833},". Find the right page from the docs index (",{"type":42,"tag":76,"props":2835,"children":2838},{"href":2836,"rel":2837},"https:\u002F\u002Fneon.com\u002Fdocs\u002Fllms.txt",[80],[2839],{"type":51,"value":2836},{"type":51,"value":2841},") and the changelog announcements.",{"type":42,"tag":164,"props":2843,"children":2845},{"id":2844},"further-reading",[2846],{"type":51,"value":2847},"Further Reading",{"type":42,"tag":176,"props":2849,"children":2850},{},[2851,2860,2869,2878,2887,2896,2905,2914],{"type":42,"tag":180,"props":2852,"children":2853},{},[2854],{"type":42,"tag":76,"props":2855,"children":2858},{"href":2856,"rel":2857},"https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Foverview.md",[80],[2859],{"type":51,"value":2856},{"type":42,"tag":180,"props":2861,"children":2862},{},[2863],{"type":42,"tag":76,"props":2864,"children":2867},{"href":2865,"rel":2866},"https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Fget-started.md",[80],[2868],{"type":51,"value":2865},{"type":42,"tag":180,"props":2870,"children":2871},{},[2872],{"type":42,"tag":76,"props":2873,"children":2876},{"href":2874,"rel":2875},"https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Fbuckets.md",[80],[2877],{"type":51,"value":2874},{"type":42,"tag":180,"props":2879,"children":2880},{},[2881],{"type":42,"tag":76,"props":2882,"children":2885},{"href":2883,"rel":2884},"https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Fobjects.md",[80],[2886],{"type":51,"value":2883},{"type":42,"tag":180,"props":2888,"children":2889},{},[2890],{"type":42,"tag":76,"props":2891,"children":2894},{"href":2892,"rel":2893},"https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Fauthentication.md",[80],[2895],{"type":51,"value":2892},{"type":42,"tag":180,"props":2897,"children":2898},{},[2899],{"type":42,"tag":76,"props":2900,"children":2903},{"href":2901,"rel":2902},"https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Fs3-compatibility.md",[80],[2904],{"type":51,"value":2901},{"type":42,"tag":180,"props":2906,"children":2907},{},[2908],{"type":42,"tag":76,"props":2909,"children":2912},{"href":2910,"rel":2911},"https:\u002F\u002Fneon.com\u002Fdocs\u002Fstorage\u002Ftroubleshooting.md",[80],[2913],{"type":51,"value":2910},{"type":42,"tag":180,"props":2915,"children":2916},{},[2917,2922,2924,2929],{"type":42,"tag":76,"props":2918,"children":2920},{"href":1201,"rel":2919},[80],[2921],{"type":51,"value":1201},{"type":51,"value":2923}," — Files SDK docs (the ",{"type":42,"tag":56,"props":2925,"children":2927},{"className":2926},[],[2928],{"type":51,"value":8},{"type":51,"value":2930}," adapter)",{"type":42,"tag":2932,"props":2933,"children":2934},"style",{},[2935],{"type":51,"value":2936},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2938,"total":550},[2939,2951,2970,2988,3007,3014,3033],{"slug":2940,"name":2940,"fn":2941,"description":2942,"org":2943,"tags":2944,"stars":24,"repoUrl":25,"updatedAt":2950},"claimable-postgres","provision temporary Postgres databases","Provision instant temporary Postgres databases via Claimable Postgres by Neon (neon.new) with no login, signup, or credit card. Supports REST API, CLI, and SDK. Use when users ask for a quick Postgres environment, a throwaway DATABASE_URL for prototyping\u002Ftests, or \"just give me a DB now\". Triggers include: \"quick postgres\", \"temporary postgres\", \"no signup database\", \"no credit card database\", \"instant DATABASE_URL\", \"npx neon-new\", \"neon.new\", \"neon.new API\", \"claimable postgres API\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2945,2946,2947],{"name":19,"slug":20,"type":14},{"name":9,"slug":8,"type":14},{"name":2948,"slug":2949,"type":14},"PostgreSQL","postgresql","2026-07-27T06:07:56.160588",{"slug":8,"name":8,"fn":2952,"description":2953,"org":2954,"tags":2955,"stars":24,"repoUrl":25,"updatedAt":2969},"build applications on the Neon platform","Overview of the Neon platform for apps and agents, spanning Postgres, Auth, the Data API, Object Storage, Compute Functions, and the AI Gateway. Start here to route to the right Neon skill, set up the CLI or MCP server, and follow the branch-first workflow. Use when \"Neon\" is mentioned, or when any of its individual capabilities are the trigger: \"object storage\" or \"S3\", \"buckets\", \"serverless functions\", \"AI gateway\", \"call an LLM\", \"postgres\", \"database\", or \"backend\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2956,2959,2962,2963,2964,2965,2968],{"name":2957,"slug":2958,"type":14},"AI Infrastructure","ai-infrastructure",{"name":2960,"slug":2961,"type":14},"Authentication","authentication",{"name":19,"slug":20,"type":14},{"name":9,"slug":8,"type":14},{"name":2948,"slug":2949,"type":14},{"name":2966,"slug":2967,"type":14},"Serverless","serverless",{"name":22,"slug":23,"type":14},"2026-07-27T06:08:01.383115",{"slug":2971,"name":2971,"fn":2972,"description":2973,"org":2974,"tags":2975,"stars":24,"repoUrl":25,"updatedAt":2987},"neon-ai-gateway","call LLMs via Neon AI Gateway","One API and one credential for frontier and open-source LLMs, built into your Neon branch and powered by Databricks. Use when a user wants to call an LLM, add AI\u002Fchat\u002Fan agent to their app, route between model providers (OpenAI, Anthropic, Google\u002FGemini, Meta, Alibaba, DeepSeek), or avoid juggling separate provider API keys and accounts — especially when they already use Neon and want AI requests to branch with their project. Works with the OpenAI SDK, Anthropic SDK, google-genai, the Vercel AI SDK, and Mastra by changing only the base URL. Triggers include \"call an LLM\", \"add AI to my app\", \"chat completion\", \"model routing\", \"LLM proxy\u002Fgateway\", \"one API for all models\", \"use Claude\u002FGPT\u002FGemini\", \"AI SDK\", \"Mastra agent\", \"Neon AI Gateway\", and \"log\u002Frate-limit AI calls\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2976,2977,2980,2983,2986],{"name":2957,"slug":2958,"type":14},{"name":2978,"slug":2979,"type":14},"API Development","api-development",{"name":2981,"slug":2982,"type":14},"Databricks","databricks",{"name":2984,"slug":2985,"type":14},"LLM","llm",{"name":9,"slug":8,"type":14},"2026-07-27T06:08:00.288175",{"slug":2989,"name":2989,"fn":2990,"description":2991,"org":2992,"tags":2993,"stars":24,"repoUrl":25,"updatedAt":3006},"neon-functions","deploy serverless functions on Neon","Long-running, serverless Node.js HTTP functions deployed onto your Neon branch, with DATABASE_URL injected automatically and compute that runs next to your data. Use when a user wants to host an API, an AI agent with long streaming responses, a WebSocket or server-sent-events (SSE) server, a webhook handler, a Discord bot, an MCP server, or any request\u002Fresponse workload that risks timing out on short, lambda-style serverless functions — and wants it to branch with their database. Triggers include \"serverless function\", \"deploy an API\", \"long-running function\", \"streaming agent\", \"SSE server\", \"WebSocket server\", \"webhook handler\", \"MCP server\", \"run code next to my database\", \"function that won't time out\", \"Neon Functions\", and \"Neon Compute\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2994,2995,2998,3001,3002,3005],{"name":2978,"slug":2979,"type":14},{"name":2996,"slug":2997,"type":14},"Backend","backend",{"name":2999,"slug":3000,"type":14},"Edge Functions","edge-functions",{"name":9,"slug":8,"type":14},{"name":3003,"slug":3004,"type":14},"Node.js","node-js",{"name":2966,"slug":2967,"type":14},"2026-07-27T06:07:59.147675",{"slug":4,"name":4,"fn":5,"description":6,"org":3008,"tags":3009,"stars":24,"repoUrl":25,"updatedAt":26},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3010,3011,3012,3013],{"name":19,"slug":20,"type":14},{"name":16,"slug":17,"type":14},{"name":9,"slug":8,"type":14},{"name":22,"slug":23,"type":14},{"slug":3015,"name":3015,"fn":3016,"description":3017,"org":3018,"tags":3019,"stars":24,"repoUrl":25,"updatedAt":3032},"neon-postgres-branches","manage Neon PostgreSQL database branches","Choose and create the right Neon branch type for testing and development. Use when users ask about Neon branching, migration testing with real data, isolated test environments, schema-only branch workflows for sensitive data, resetting a branch from its parent, branch expiration and CI\u002FCD branch lifecycles, or branch creation via Neon CLI or Neon MCP. Triggers include \"Neon branch\", \"test migrations safely\", \"branch production data\", \"schema-only branch\", \"reset branch\", \"branch per PR\" and \"sensitive data testing\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3020,3021,3024,3027,3028,3029],{"name":19,"slug":20,"type":14},{"name":3022,"slug":3023,"type":14},"DevOps","devops",{"name":3025,"slug":3026,"type":14},"Migration","migration",{"name":9,"slug":8,"type":14},{"name":2948,"slug":2949,"type":14},{"name":3030,"slug":3031,"type":14},"Testing","testing","2026-07-27T06:07:55.162249",{"slug":3034,"name":3034,"fn":3035,"description":3036,"org":3037,"tags":3038,"stars":24,"repoUrl":25,"updatedAt":3047},"neon-postgres-egress-optimizer","diagnose and fix Postgres egress costs","Diagnose and fix excessive Postgres egress (network data transfer) in a codebase. Use when a user mentions high database bills, unexpected data transfer costs, network transfer charges, egress spikes, \"why is my Neon bill so high\", \"database costs jumped\", SELECT * optimization, query overfetching, reduce Neon costs, optimize database usage, or wants to reduce data sent from their database to their application. Also use when reviewing query patterns for cost efficiency, even if the user doesn't explicitly mention egress or data transfer.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3039,3042,3043,3046],{"name":3040,"slug":3041,"type":14},"Cost Optimization","cost-optimization",{"name":9,"slug":8,"type":14},{"name":3044,"slug":3045,"type":14},"Performance","performance",{"name":2948,"slug":2949,"type":14},"2026-07-27T06:07:58.159412",{"items":3049,"total":2517},[3050,3063,3077,3089,3105,3117,3129,3142,3148,3158,3166,3175],{"slug":3051,"name":3051,"fn":3052,"description":3053,"org":3054,"tags":3055,"stars":3060,"repoUrl":3061,"updatedAt":3062},"neon-postgres","build apps with Neon serverless Postgres","Guides and best practices for working with Neon Serverless Postgres. Covers setup, connection methods and drivers, pooled vs direct connections, branching, autoscaling, scale-to-zero, instant restore, read replicas, connection pooling, IP allow lists, and logical replication. Use when users ask about \"Neon setup\", \"connect to Neon\", \"Neon project\", \"DATABASE_URL\", \"serverless Postgres\", \"Neon CLI\", \"neon\", \"Neon MCP\", \"Neon Auth\", \"@neondatabase\u002Fserverless\", \"@neondatabase\u002Fneon-js\", \"scale to zero\", \"Neon autoscaling\", \"Neon read replica\", or \"Neon connection pooling\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3056,3057,3058,3059],{"name":19,"slug":20,"type":14},{"name":9,"slug":8,"type":14},{"name":2948,"slug":2949,"type":14},{"name":2966,"slug":2967,"type":14},321,"https:\u002F\u002Fgithub.com\u002Fneondatabase\u002Fwebsite","2026-07-27T06:08:14.168734",{"slug":3064,"name":3064,"fn":3065,"description":3066,"org":3067,"tags":3068,"stars":3074,"repoUrl":3075,"updatedAt":3076},"add-neon-docs","add Neon docs to project AI docs","Use this skill when the user asks to add documentation, add docs, add references, or install documentation about Neon. Adds Neon best practices reference links to project AI documentation (CLAUDE.md, AGENTS.md, or Cursor rules). Does not install packages or modify code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3069,3070,3073],{"name":19,"slug":20,"type":14},{"name":3071,"slug":3072,"type":14},"Documentation","documentation",{"name":9,"slug":8,"type":14},86,"https:\u002F\u002Fgithub.com\u002Fneondatabase\u002Fai-rules","2026-04-06T18:38:53.722898",{"slug":3078,"name":3078,"fn":3079,"description":3080,"org":3081,"tags":3082,"stars":3074,"repoUrl":3075,"updatedAt":3088},"neon-auth","set up Neon Auth for apps","Sets up Neon Auth for your application. Configures authentication, creates auth routes, and generates UI components. Use when adding authentication to Next.js, React SPA, or Node.js projects.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3083,3086,3087],{"name":3084,"slug":3085,"type":14},"Auth","auth",{"name":19,"slug":20,"type":14},{"name":9,"slug":8,"type":14},"2026-04-06T18:38:52.386193",{"slug":3090,"name":3090,"fn":3091,"description":3092,"org":3093,"tags":3094,"stars":3074,"repoUrl":3075,"updatedAt":3104},"neon-drizzle","set up Drizzle ORM with Neon","Creates a fully functional Drizzle ORM setup with a provisioned Neon database. Installs dependencies, provisions database credentials, configures connections, generates schemas, and runs migrations. Results in working code that can immediately connect to and query the database. Use when creating new projects with Drizzle, adding ORM to existing applications, or modifying database schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3095,3096,3099,3100,3103],{"name":19,"slug":20,"type":14},{"name":3097,"slug":3098,"type":14},"Drizzle","drizzle",{"name":9,"slug":8,"type":14},{"name":3101,"slug":3102,"type":14},"ORM","orm",{"name":2948,"slug":2949,"type":14},"2026-04-06T18:38:56.217495",{"slug":3106,"name":3106,"fn":3107,"description":3108,"org":3109,"tags":3110,"stars":3074,"repoUrl":3075,"updatedAt":3116},"neon-js","set up the Neon JS SDK for auth and queries","Sets up the full Neon JS SDK with unified auth and PostgREST-style database queries. Configures auth client, data client, and type generation. Use when building apps that need both authentication and database access in one SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3111,3112,3113,3114],{"name":3084,"slug":3085,"type":14},{"name":19,"slug":20,"type":14},{"name":9,"slug":8,"type":14},{"name":3115,"slug":406,"type":14},"TypeScript","2026-04-06T18:38:51.116041",{"slug":3118,"name":3118,"fn":3119,"description":3120,"org":3121,"tags":3122,"stars":3074,"repoUrl":3075,"updatedAt":3128},"neon-serverless","configure Neon serverless driver","Configures Neon Serverless Driver for Next.js, Vercel Edge Functions, AWS Lambda, and other serverless environments. Installs @neondatabase\u002Fserverless, sets up environment variables, and creates working API route examples with TypeScript types. Use when users need to connect their application to Neon, fetch or query data from a Neon database, integrate Neon with Next.js or serverless frameworks, or set up database access in edge\u002Fserverless environments where traditional PostgreSQL clients don't work.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3123,3124,3125,3126,3127],{"name":19,"slug":20,"type":14},{"name":2999,"slug":3000,"type":14},{"name":9,"slug":8,"type":14},{"name":2948,"slug":2949,"type":14},{"name":2966,"slug":2967,"type":14},"2026-04-06T18:38:54.97085",{"slug":3130,"name":3130,"fn":3131,"description":3132,"org":3133,"tags":3134,"stars":3074,"repoUrl":3075,"updatedAt":3141},"neon-toolkit","create ephemeral Neon databases for testing","Creates and manages ephemeral Neon databases for testing, CI\u002FCD pipelines, and isolated development environments. Use when building temporary databases for automated tests or rapid prototyping.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3135,3138,3139,3140],{"name":3136,"slug":3137,"type":14},"CI\u002FCD","cicd",{"name":19,"slug":20,"type":14},{"name":9,"slug":8,"type":14},{"name":3030,"slug":3031,"type":14},"2026-04-06T18:38:57.490782",{"slug":2940,"name":2940,"fn":2941,"description":2942,"org":3143,"tags":3144,"stars":24,"repoUrl":25,"updatedAt":2950},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3145,3146,3147],{"name":19,"slug":20,"type":14},{"name":9,"slug":8,"type":14},{"name":2948,"slug":2949,"type":14},{"slug":8,"name":8,"fn":2952,"description":2953,"org":3149,"tags":3150,"stars":24,"repoUrl":25,"updatedAt":2969},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3151,3152,3153,3154,3155,3156,3157],{"name":2957,"slug":2958,"type":14},{"name":2960,"slug":2961,"type":14},{"name":19,"slug":20,"type":14},{"name":9,"slug":8,"type":14},{"name":2948,"slug":2949,"type":14},{"name":2966,"slug":2967,"type":14},{"name":22,"slug":23,"type":14},{"slug":2971,"name":2971,"fn":2972,"description":2973,"org":3159,"tags":3160,"stars":24,"repoUrl":25,"updatedAt":2987},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3161,3162,3163,3164,3165],{"name":2957,"slug":2958,"type":14},{"name":2978,"slug":2979,"type":14},{"name":2981,"slug":2982,"type":14},{"name":2984,"slug":2985,"type":14},{"name":9,"slug":8,"type":14},{"slug":2989,"name":2989,"fn":2990,"description":2991,"org":3167,"tags":3168,"stars":24,"repoUrl":25,"updatedAt":3006},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3169,3170,3171,3172,3173,3174],{"name":2978,"slug":2979,"type":14},{"name":2996,"slug":2997,"type":14},{"name":2999,"slug":3000,"type":14},{"name":9,"slug":8,"type":14},{"name":3003,"slug":3004,"type":14},{"name":2966,"slug":2967,"type":14},{"slug":4,"name":4,"fn":5,"description":6,"org":3176,"tags":3177,"stars":24,"repoUrl":25,"updatedAt":26},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3178,3179,3180,3181],{"name":19,"slug":20,"type":14},{"name":16,"slug":17,"type":14},{"name":9,"slug":8,"type":14},{"name":22,"slug":23,"type":14}]