← NeonCONTENT HISTORY

Update to Neon

Snapshot Oct 4, 2026 · 18:02 UTC · version 2.1.0

WHAT CHANGED · RULE-BASED ANALYSIS

Package or technical metadata updated

Package contents changed in 34 files: .app.json, .codex-plugin/plugin.json, LICENSE, …. Open the file diff to inspect the edits.

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Package file

Before

{"sha256":"7f6c3217c0c1795ec3aa09993b8227c989e2aa116352b60c0e305ad0558657dc","size":104}

After

Not present

Package file

Before

{"sha256":"107930b82cec1cf0418b9b9c54b2b85739f17e95671e088c419872387227c48a","size":1153}

After

Not present

Package file

Before

Not present

After

{"sha256":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","size":11358}

Package file

Before

Not present

After

{"sha256":"6ea32cfd68df51adbf06156bc7282cf6c5eece06b684b163ea612fcec8521d2a","size":427}

Compare saved observations

Download comparison JSON

skills/neon-functions/references/native-binaries.md

--- before
+++ after
@@ -0,0 +1,188 @@
+# Shipping native binaries with a Function
+
+The default deploy bundles `source` into a single `index.mjs` with esbuild. A compiled binary cannot be inlined into that file, so it has to ship as a separate file in the deploy archive. There are three ways to put it there. Pick by what the binary is:
+
+| The binary is                                                                              | Use                                                            |
+| ------------------------------------------------------------------------------------------ | -------------------------------------------------------------- |
+| An npm package backed by a Node-API addon (`sharp`, most `@napi-rs/*` packages)             | [`externalPackages`](#externalpackages-npm-packages-with-a-node-addon) |
+| A file your own build step produces: a `.node` addon, a `.so`, a `.wasm`, model weights    | [`bundler: "none"`](#bundler-none-ship-a-prebuilt-directory) or a [custom `bundler`](#custom-bundler-return-the-file-map) |
+| A standalone executable you spawn (`ffmpeg`, a Go or Rust CLI)                              | A custom `bundler` or `"none"`, plus [a copy to `/run` at startup](#standalone-executables) |
+
+The examples use top-level `functions`, which needs `neon` CLI 4.20 or newer and `@neon/config` 1.6 or newer.
+
+## The runtime a binary lands on
+
+- **linux, arm64, glibc**, Node.js 24. A binary built for macOS or x64 cannot load there.
+- The archive is extracted to `/opt/function`, a read-only filesystem. `import.meta.url` in the root `index.mjs` points there, so `new URL("./bin/tool", import.meta.url)` resolves to `/opt/function/bin/tool`.
+- **Every file arrives with mode `644`.** Unix permission bits in the zip are dropped on extraction, and `chmod` in place fails with `EROFS`. A `.node` or `.so` loads fine (it is `dlopen`ed, not executed). Spawning a file from `/opt/function` fails with `EACCES`.
+- `/tmp` is writable and mounted `noexec`: a copied binary still fails with `EACCES` after `chmod 755`.
+- `/run` is a writable tmpfs that allows exec (about 990 MiB, backed by the function's 2048 MiB of memory).
+
+The filesystem layout is observed behavior, not documented by Neon. Re-check it if spawning starts failing.
+
+## `externalPackages`: npm packages with a Node addon
+
+```typescript
+// neon.ts
+import { defineConfig } from "@neon/config/v1";
+
+export default defineConfig({
+  functions: {
+    resize: {
+      name: "Resize",
+      source: "./src/resize.ts",
+      externalPackages: ["sharp"],
+    },
+  },
+});
+```
+
+esbuild leaves `import sharp from "sharp"` unresolved. At deploy, the CLI installs the version of `sharp` from your project with `npm install --cpu=arm64 --os=linux --libc=glibc --ignore-scripts` into a temp directory, traces the files it reaches with `@vercel/nft`, and copies them into the archive under `node_modules/` with the tree layout intact. Only the installed version is read from your `node_modules`; the shipped files come from the temp install, and your `node_modules` is not modified.
+
+The deploy fails with a named error when:
+
+- the package is not installed in your project (no version to pin)
+- the declared package itself does not install for linux-arm64 glibc (`EBADPLATFORM`)
+- a staged `.node` or `.so` is not an AArch64 ELF binary
+- `npm` is not on `PATH`
+- the archive exceeds the [size limits](#size-limits)
+
+It does not fail when a platform-specific optional dependency is silently skipped, or when a package that compiles from source at install time ships no binary (the staging install runs with `--ignore-scripts`). Those deploy and then fail at invoke. Use packages that publish a linux-arm64 glibc prebuild (`sharp` does), and invoke the deployed function once to confirm the addon loads.
+
+A deploy and `neon dev` print an advisory warning for any bundled package that carries native code and is not declared. A package with a working JavaScript fallback (`ws` with `bufferutil`) triggers it too and needs no change. Do not silence it with `{ name, includeFiles: false }`: that externalizes the package and ships nothing, so a reached import throws `Cannot find module` on every invoke. `includeFiles: false` is only for an import the function never evaluates.
+
+Under `neon dev`, the package is only kept out of the bundle and resolves from your own `node_modules` for your host.
+
+Pros: one line in `neon.ts`; the target-platform install, file tracing, arch check, and size check are automatic; local dev uses your host build.
+
+Cons: only for npm packages that publish a linux-arm64 glibc prebuild; transitive pins, overrides, and patches from your lockfile are not carried into the staged install; esbuild bundler only (`externalPackages` with `bundler: "none"` or a function fails validation).
+
+## `bundler: "none"`: ship a prebuilt directory
+
+Run your own build, then point `source` at its output. The directory root must contain `index.mjs` or `index.js`. Everything else in the directory ships as-is:
+
+```text
+dist/fn/
+  index.mjs        # built by your step, reads ./native/addon.node
+  native/addon.node
+```
+
+```typescript
+// neon.ts
+import { defineConfig } from "@neon/config/v1";
+
+export default defineConfig({
+  functions: {
+    api: { name: "API", source: "./dist/fn", bundler: "none" },
+  },
+});
+```
+
+```bash
+npm run build:fn && neon deploy --env .env.local
+neon functions deploy api --src dist/fn --no-bundle   # same thing, without neon.ts
+```
+
+`neon deploy` does not run your build step. Run it first, or use a [custom `bundler`](#custom-bundler-return-the-file-map) to keep the build inside `neon deploy`.
+
+Pros: works with any build tool or framework output (`.mastra/output` is the common one); full control over the archive layout.
+
+Cons: no architecture check, so a binary built for your laptop deploys and then fails at invoke; the build step is yours to keep in sync with `neon deploy`; TypeScript cannot ship unbundled.
+
+## Custom `bundler`: return the file map
+
+An inline function in `neon.ts` returns archive paths mapped to bytes. `neon deploy` zips the map, and `neon dev` serves the same map locally:
+
+```typescript
+// neon.ts
+import { readFile } from "node:fs/promises";
+import { build } from "esbuild";
+import { defineConfig } from "@neon/config/v1";
+
+export default defineConfig({
+  functions: {
+    transcode: {
+      name: "Transcode",
+      source: "./src/transcode.ts",
+      bundler: async (fn) => {
+        const out = await build({
+          entryPoints: [fn.source],
+          bundle: true,
+          platform: "node",
+          format: "esm",
+          write: false,
+          outfile: "index.mjs",
+          // CommonJS dependencies call require(); ESM output has none in scope.
+          banner: {
+            js: "import{createRequire}from'module';const require=createRequire(import.meta.url);",
+          },
+        });
+        return {
+          "index.mjs": out.outputFiles[0].contents,
+          "bin/ffmpeg": new Uint8Array(
+            await readFile(new URL("./vendor/linux-arm64/ffmpeg", import.meta.url)),
+          ),
+        };
+      },
+    },
+  },
+});
+```
+
+`esbuild` must be a dependency of your project. The map needs `index.mjs` or `index.js` at the root.
+
+Pros: the build lives in `neon.ts`, so `neon deploy` and `neon dev` always build the same thing; any file from anywhere can go in the archive.
+
+Cons: no architecture check; `externalPackages` cannot be combined with it, so an npm addon has to be copied into the map by hand, with its `node_modules/` layout.
+
+## Standalone executables
+
+Ship the executable with a custom `bundler` or `bundler: "none"`, then copy it to `/run` and mark it executable once per isolate:
+
+```typescript
+// src/transcode.ts
+import { execFile } from "node:child_process";
+import { chmod, copyFile, mkdir } from "node:fs/promises";
+import { promisify } from "node:util";
+
+const run = promisify(execFile);
+
+let ffmpeg: Promise<string> | undefined;
+function ffmpegPath(): Promise<string> {
+  if (process.env.FFMPEG_PATH) return Promise.resolve(process.env.FFMPEG_PATH);
+  ffmpeg ??= (async () => {
+    await mkdir("/run/bin", { recursive: true });
+    await copyFile(new URL("./bin/ffmpeg", import.meta.url), "/run/bin/ffmpeg");
+    await chmod("/run/bin/ffmpeg", 0o755);
+    return "/run/bin/ffmpeg";
+  })();
+  return ffmpeg;
+}
+
+export default {
+  async fetch() {
+    const { stdout } = await run(await ffmpegPath(), ["-version"]);
+    return new Response(stdout);
+  },
+};
+```
+
+`neon dev` runs this code on your machine, where `/run` may not exist and a linux-arm64 binary cannot execute. Point it at a host install from the shell, and leave `FFMPEG_PATH` out of the function's deployed `env`:
+
+```bash
+FFMPEG_PATH="$(command -v ffmpeg)" neon dev
+```
+
+The binary must be statically linked, or its shared libraries must exist in the runtime image. The copy costs memory: `/run` is RAM-backed and counts against the function's 2048 MiB.
+
+## Size limits
+
+`bundler: "none"`, a custom `bundler`, and `externalPackages` staging check the archive before upload:
+
+| Limit                    | Value   |
+| ------------------------ | ------- |
+| Compressed zip           | 10 MiB  |
+| Total uncompressed bytes | 64 MiB  |
+| Files in the archive     | 4,096   |
+
+Exceeding one fails the deploy. The byte-limit errors list the four largest files. Check an executable's size before building around it: a single static binary can use most of the 64 MiB.
Full technical diff · 44 changed fields

removed /files/.app.json

BEFORE
{
  "sha256": "7f6c3217c0c1795ec3aa09993b8227c989e2aa116352b60c0e305ad0558657dc",
  "size": 104
}
AFTER
Field is absent

removed /files/.codex-plugin~1plugin.json

BEFORE
{
  "sha256": "107930b82cec1cf0418b9b9c54b2b85739f17e95671e088c419872387227c48a",
  "size": 1153
}
AFTER
Field is absent

added /files/LICENSE

BEFORE
Field was absent
AFTER
{
  "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
  "size": 11358
}

added /files/assets~1neon-logomark-dark.svg

BEFORE
Field was absent
AFTER
{
  "sha256": "6ea32cfd68df51adbf06156bc7282cf6c5eece06b684b163ea612fcec8521d2a",
  "size": 427
}

added /files/assets~1neon-logomark-light.svg

BEFORE
Field was absent
AFTER
{
  "sha256": "8154bfde92038629bc1c35e9888a5aafafbf4dc6ebaa55eb328075a9ebbe4e27",
  "size": 427
}

added /files/mcp.json

BEFORE
Field was absent
AFTER
{
  "sha256": "496c89ba28e7628b2f7c477c4ed7a890504f7d5772ab22ce8426f369129b43a4",
  "size": 192
}

added /files/plugin.json

BEFORE
Field was absent
AFTER
{
  "sha256": "3dc352f4107acf80b61e07955619c8937d3677ba8d1089b9763d518f93f901d6",
  "size": 2175
}

changed /files/skills~1neon-ai-gateway~1SKILL.md/sha256

BEFORE
"5f7b7d3f9490fda3d3e78ade52f8df053a0f0ce9fad38d6f17d47c5d92ba4ce4"
AFTER
"eab0545d5ee7626847ce5b5cdd5f4f03afad0ca5859ffd281389721b06c2bce0"

changed /files/skills~1neon-ai-gateway~1SKILL.md/size

BEFORE
20612
AFTER
20643

added /files/skills~1neon-auth~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "5f91f328235382f3e9afef449729e304a531848a90c02b40c4fd1192709e0319",
  "size": 12404
}

added /files/skills~1neon-auth~1references~1managed-auth.md

BEFORE
Field was absent
AFTER
{
  "sha256": "382c00feeb2f3cc12dbe9b881a43339eef25741d4bc4b70d43c63d2311587dd9",
  "size": 9309
}

added /files/skills~1neon-auth~1references~1self-managed.md

BEFORE
Field was absent
AFTER
{
  "sha256": "2c53afcd667a9d3e9df9d7bf3eef2aec94ae4a0ec01c7f65852a965267bc127a",
  "size": 2033
}

changed /files/skills~1neon-functions~1SKILL.md/sha256

BEFORE
"92b3a6a025885d45b7976e9d4338ea98712e091afac5309aa59ba9c9771706fa"
AFTER
"ef17cab6c81fba6e5545037205889dcb1b2dcd9748d5fbbf50465ee0a8a88d8d"

changed /files/skills~1neon-functions~1SKILL.md/size

BEFORE
39778
AFTER
49106

changed /files/skills~1neon-functions~1references~1ai-sdk.md/sha256

BEFORE
"11f963c0dac8ef0aaa6cd49a3e9dbf7b1dc85dba3dba76bd964d5e42de002c7d"
AFTER
"3bca13c980a6634ce3dd53533145c9b93f5b3f87f777b62b66ed5f582dce3370"

changed /files/skills~1neon-functions~1references~1ai-sdk.md/size

BEFORE
6772
AFTER
6744

added /files/skills~1neon-functions~1references~1function-triggers.md

BEFORE
Field was absent
AFTER
{
  "sha256": "a54ed9599ebdcd340141f6a6f3b9770ef1d8406a936515c929444fc6a9c695eb",
  "size": 10837
}

changed /files/skills~1neon-functions~1references~1mastra-studio.md/sha256

BEFORE
"58b7b6067e2dd7c991b3b640fe69a47b6078069f0d1fb97b213ae2a9389bc02a"
AFTER
"01b7d421a36e64a704854b9fafe99ddc3d262d6d1da4af6eb44b12968064a0b0"

changed /files/skills~1neon-functions~1references~1mastra-studio.md/size

BEFORE
6365
AFTER
6347

changed /files/skills~1neon-functions~1references~1mcp.md/sha256

BEFORE
"22ce58566b5479801621a61d65467b28bf566837611095c2b7f4f579bd553010"
AFTER
"45c7a48c22b4cdb2deaecae40a17cd9d55755c36ae288d2ddad0dfcf111f03e9"

changed /files/skills~1neon-functions~1references~1mcp.md/size

BEFORE
9138
AFTER
9123

added /files/skills~1neon-functions~1references~1native-binaries.md

BEFORE
Field was absent
AFTER
{
  "sha256": "04d39d8dc2e822e6e2189752ae01fdff5d85f175059b6209df1c77e105941ae0",
  "size": 9385
}

added /files/skills~1neon-functions~1references~1production-hardening.md

BEFORE
Field was absent
AFTER
{
  "sha256": "1b3f0eb3e13aae1d1bdea3e32b476b6e1135276da6b8b51d4db30df0326b71c8",
  "size": 15301
}

changed /files/skills~1neon-functions~1references~1sse.md/sha256

BEFORE
"3b6fd889d08642ee2dc40788c7e56945b3ed0ab3e912626bd8d89c3e57b4b3c7"
AFTER
"a032699cfa2e361f8f7a9dc6e0b5e66e284f39fa0de455d5506b3e3686fa0b56"

changed /files/skills~1neon-functions~1references~1sse.md/size

BEFORE
8211
AFTER
8310

changed /files/skills~1neon-object-storage~1SKILL.md/sha256

BEFORE
"1d3d9f662b6caafb640d45583a1505ec7433ed4ba6ba5c61e1765aa7c16c03a9"
AFTER
"fce96952845dfcf4b0c560fcf1ff0d2c0867931fd34ddb3acf0ec24fd118fd11"

changed /files/skills~1neon-object-storage~1SKILL.md/size

BEFORE
14116
AFTER
14253

added /files/skills~1neon-postgres-branches~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "9f47d5a49553a465837c1e8b2d90a90aac72a5313a996c081027290f259a8d71",
  "size": 13663
}

added /files/skills~1neon-postgres-egress-optimizer~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "d7536270b6dd59a66fa5daf1578cc55a5b761d7163f6f6b1596662481b8d5d9b",
  "size": 10227
}

changed /files/skills~1neon-postgres~1SKILL.md/sha256

BEFORE
"eb8081a09e25ff2062e8f8de7cba00c38123aeb259771605c988ca0245389886"
AFTER
"83d3c75651bd81f06e5e8c47ffc306936cc4d2a1ac84d288e8f6a15fcfb724b4"

changed /files/skills~1neon-postgres~1SKILL.md/size

BEFORE
9176
AFTER
16595

added /files/skills~1neon-postgres~1references~1full-text-search.md

BEFORE
Field was absent
AFTER
{
  "sha256": "025d4380ccfe8e2c745687d82ed6182d501d5678a3941112f37f58bac38e7db4",
  "size": 3901
}

added /files/skills~1neon-postgres~1references~1hybrid-search.md

BEFORE
Field was absent
AFTER
{
  "sha256": "80b9b1a9974c41eea80bfa4159c5be2b89ca0caaf96b06356ce60d49b2443f90",
  "size": 4451
}

added /files/skills~1neon-postgres~1references~1lakebase-search-drizzle.md

BEFORE
Field was absent
AFTER
{
  "sha256": "9d5193830642719ecd325dd60f2ffc7c1104055e9c7c4f4828963299adb234b7",
  "size": 6716
}

added /files/skills~1neon-postgres~1references~1vector-search.md

BEFORE
Field was absent
AFTER
{
  "sha256": "4d7c14f1940033e2c379be62f00ef5ba5e17878a44bc11957a5176f91c2aa0ac",
  "size": 6244
}

changed /files/skills~1neon~1SKILL.md/sha256

BEFORE
"9540789af742962ecab2626a73434b8f906f99cec02f2e152791535ee89705f1"
AFTER
"1071b8789dea0cb41c795059e728821756181ce55ae34f3f904120bfbfa8ff22"

changed /files/skills~1neon~1SKILL.md/size

BEFORE
31147
AFTER
32812

added /files/skills~1neon~1references~1auth.md

BEFORE
Field was absent
AFTER
{
  "sha256": "c2c609f25d6936c8df52989889ffff738f55b5100259e9193173ed07891f49f0",
  "size": 730
}

changed /files/skills~1neon~1references~1claimable-neon.md/sha256

BEFORE
"5d220f032995a44dbd618b807a0c6a6814d1e69ea32014285c62ddd23cfaeefd"
AFTER
"1f510be025b1841231b8ee40f69f8b38a348336b258be43b943cc94f2d88bcf8"

changed /files/skills~1neon~1references~1claimable-neon.md/size

BEFORE
7788
AFTER
8163

added /files/skills~1neon~1references~1function-triggers.md

BEFORE
Field was absent
AFTER
{
  "sha256": "a72aadc3e63464db7f618abb6daa7f119eb76cf213f27a88c84f7aa92b4dd254",
  "size": 3249
}

added /files/skills~1neon~1references~1logs-loki.md

BEFORE
Field was absent
AFTER
{
  "sha256": "fb338ad4d75e3d6c594945bd24d64a4134860fc2f554cd3273c27dd79769c889",
  "size": 4044
}

added /files/skills~1neon~1references~1parse-env.md

BEFORE
Field was absent
AFTER
{
  "sha256": "f43eb0d40570b06437ea3a93662ab528bad4d5c44c9c28c45f993aaa269e10bd",
  "size": 1406
}

added /files/skills~1neon~1references~1sdk.md

BEFORE
Field was absent
AFTER
{
  "sha256": "b9376b5bb1658d9d926a560a7be632a0aaa4fd12e60f38c3ba5050bd35989da0",
  "size": 806
}
Full snapshot data
{
  "files": {
    "LICENSE": {
      "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
      "size": 11358
    },
    "assets/neon-logomark-dark.svg": {
      "sha256": "6ea32cfd68df51adbf06156bc7282cf6c5eece06b684b163ea612fcec8521d2a",
      "size": 427
    },
    "assets/neon-logomark-light.svg": {
      "sha256": "8154bfde92038629bc1c35e9888a5aafafbf4dc6ebaa55eb328075a9ebbe4e27",
      "size": 427
    },
    "mcp.json": {
      "sha256": "496c89ba28e7628b2f7c477c4ed7a890504f7d5772ab22ce8426f369129b43a4",
      "size": 192
    },
    "plugin.json": {
      "sha256": "3dc352f4107acf80b61e07955619c8937d3677ba8d1089b9763d518f93f901d6",
      "size": 2175
    },
    "skills/neon-ai-gateway/SKILL.md": {
      "sha256": "eab0545d5ee7626847ce5b5cdd5f4f03afad0ca5859ffd281389721b06c2bce0",
      "size": 20643
    },
    "skills/neon-auth/SKILL.md": {
      "sha256": "5f91f328235382f3e9afef449729e304a531848a90c02b40c4fd1192709e0319",
      "size": 12404
    },
    "skills/neon-auth/references/managed-auth.md": {
      "sha256": "382c00feeb2f3cc12dbe9b881a43339eef25741d4bc4b70d43c63d2311587dd9",
      "size": 9309
    },
    "skills/neon-auth/references/self-managed.md": {
      "sha256": "2c53afcd667a9d3e9df9d7bf3eef2aec94ae4a0ec01c7f65852a965267bc127a",
      "size": 2033
    },
    "skills/neon-functions/SKILL.md": {
      "sha256": "ef17cab6c81fba6e5545037205889dcb1b2dcd9748d5fbbf50465ee0a8a88d8d",
      "size": 49106
    },
    "skills/neon-functions/references/ai-sdk.md": {
      "sha256": "3bca13c980a6634ce3dd53533145c9b93f5b3f87f777b62b66ed5f582dce3370",
      "size": 6744
    },
    "skills/neon-functions/references/function-triggers.md": {
      "sha256": "a54ed9599ebdcd340141f6a6f3b9770ef1d8406a936515c929444fc6a9c695eb",
      "size": 10837
    },
    "skills/neon-functions/references/mastra-studio.md": {
      "sha256": "01b7d421a36e64a704854b9fafe99ddc3d262d6d1da4af6eb44b12968064a0b0",
      "size": 6347
    },
    "skills/neon-functions/references/mcp.md": {
      "sha256": "45c7a48c22b4cdb2deaecae40a17cd9d55755c36ae288d2ddad0dfcf111f03e9",
      "size": 9123
    },
    "skills/neon-functions/references/native-binaries.md": {
      "sha256": "04d39d8dc2e822e6e2189752ae01fdff5d85f175059b6209df1c77e105941ae0",
      "size": 9385
    },
    "skills/neon-functions/references/production-hardening.md": {
      "sha256": "1b3f0eb3e13aae1d1bdea3e32b476b6e1135276da6b8b51d4db30df0326b71c8",
      "size": 15301
    },
    "skills/neon-functions/references/sentry.md": {
      "sha256": "be93790a9b62e0a78a575cebbc094ee7d93af57dbb1cdd88fe011595407b9e58",
      "size": 15424
    },
    "skills/neon-functions/references/sse.md": {
      "sha256": "a032699cfa2e361f8f7a9dc6e0b5e66e284f39fa0de455d5506b3e3686fa0b56",
      "size": 8310
    },
    "skills/neon-object-storage/SKILL.md": {
      "sha256": "fce96952845dfcf4b0c560fcf1ff0d2c0867931fd34ddb3acf0ec24fd118fd11",
      "size": 14253
    },
    "skills/neon-postgres-branches/SKILL.md": {
      "sha256": "9f47d5a49553a465837c1e8b2d90a90aac72a5313a996c081027290f259a8d71",
      "size": 13663
    },
    "skills/neon-postgres-egress-optimizer/SKILL.md": {
      "sha256": "d7536270b6dd59a66fa5daf1578cc55a5b761d7163f6f6b1596662481b8d5d9b",
      "size": 10227
    },
    "skills/neon-postgres/SKILL.md": {
      "sha256": "83d3c75651bd81f06e5e8c47ffc306936cc4d2a1ac84d288e8f6a15fcfb724b4",
      "size": 16595
    },
    "skills/neon-postgres/references/full-text-search.md": {
      "sha256": "025d4380ccfe8e2c745687d82ed6182d501d5678a3941112f37f58bac38e7db4",
      "size": 3901
    },
    "skills/neon-postgres/references/hybrid-search.md": {
      "sha256": "80b9b1a9974c41eea80bfa4159c5be2b89ca0caaf96b06356ce60d49b2443f90",
      "size": 4451
    },
    "skills/neon-postgres/references/lakebase-search-drizzle.md": {
      "sha256": "9d5193830642719ecd325dd60f2ffc7c1104055e9c7c4f4828963299adb234b7",
      "size": 6716
    },
    "skills/neon-postgres/references/vector-search.md": {
      "sha256": "4d7c14f1940033e2c379be62f00ef5ba5e17878a44bc11957a5176f91c2aa0ac",
      "size": 6244
    },
    "skills/neon/SKILL.md": {
      "sha256": "1071b8789dea0cb41c795059e728821756181ce55ae34f3f904120bfbfa8ff22",
      "size": 32812
    },
    "skills/neon/references/auth.md": {
      "sha256": "c2c609f25d6936c8df52989889ffff738f55b5100259e9193173ed07891f49f0",
      "size": 730
    },
    "skills/neon/references/claimable-neon.md": {
      "sha256": "1f510be025b1841231b8ee40f69f8b38a348336b258be43b943cc94f2d88bcf8",
      "size": 8163
    },
    "skills/neon/references/function-triggers.md": {
      "sha256": "a72aadc3e63464db7f618abb6daa7f119eb76cf213f27a88c84f7aa92b4dd254",
      "size": 3249
    },
    "skills/neon/references/logs-loki.md": {
      "sha256": "fb338ad4d75e3d6c594945bd24d64a4134860fc2f554cd3273c27dd79769c889",
      "size": 4044
    },
    "skills/neon/references/parse-env.md": {
      "sha256": "f43eb0d40570b06437ea3a93662ab528bad4d5c44c9c28c45f993aaa269e10bd",
      "size": 1406
    },
    "skills/neon/references/sdk.md": {
      "sha256": "b9376b5bb1658d9d926a560a7be632a0aaa4fd12e60f38c3ba5050bd35989da0",
      "size": 806
    }
  }
}

SHA-256 of public snapshot: c9876b496aaceb343c82ca2a351b8eb2a4630bb8572e1fcf8296b1ff854ef284