{"_id":"@airnauts/airside-server","_rev":"7-15fd637a1be735445c8953341a01e6df","name":"@airnauts/airside-server","dist-tags":{"latest":"0.10.1"},"versions":{"0.8.0":{"name":"@airnauts/airside-server","version":"0.8.0","keywords":["comments","commenting","annotations","feedback","airnauts","server"],"author":{"name":"Airnauts"},"license":"MIT","_id":"@airnauts/airside-server@0.8.0","maintainers":[{"name":"jkrzemie","email":"hello@airnauts.com"},{"name":"mateuszpaulski","email":"mateusz@airnauts.com"}],"homepage":"https://github.com/Airnauts/airside#readme","bugs":{"url":"https://github.com/Airnauts/airside/issues"},"dist":{"shasum":"07f823e142becfd16b85e68392690250648ab1cf","tarball":"https://registry.npmjs.org/@airnauts/airside-server/-/airside-server-0.8.0.tgz","fileCount":73,"integrity":"sha512-VJgSSgdHPAh0Joaf7JU36orTwAYM/ellIV/pbA9ALiJjn8X5h97D5KZXQzV500vLdSbmslLu2lGp2wkgN61eIQ==","signatures":[{"sig":"MEQCIFbAlSCPiSDYx0yTy74WMo583qiZiYGF4tnUYOze3oVOAiAzoyqBpY7Ux12ig+LMktUGEjQVQAQO0qbnzzjvnYfKng==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155657},"type":"module","_from":"file:airnauts-airside-server-0.8.0.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dev":{"types":"./dist/dev.d.ts","import":"./dist/dev.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"}},"scripts":{"test":"vitest run","build":"tsup && tsc --build --force","typecheck":"tsc --build"},"_npmUser":{"name":"mateuszpaulski","email":"mateusz@airnauts.com"},"_resolved":"/tmp/d13cdd46f90c08cc5db36a0d5090217f/airnauts-airside-server-0.8.0.tgz","_integrity":"sha512-VJgSSgdHPAh0Joaf7JU36orTwAYM/ellIV/pbA9ALiJjn8X5h97D5KZXQzV500vLdSbmslLu2lGp2wkgN61eIQ==","repository":{"url":"git+https://github.com/Airnauts/airside.git","type":"git","directory":"packages/server"},"_npmVersion":"10.9.8","description":"Server runtime for the Airnauts embeddable commenting tool: HTTP router, use-cases, CORS/security, and framework adapters (dev server, generic Node bridge).","directories":{},"_nodeVersion":"22.22.3","dependencies":{"nanoid":"^5.1.11","@airnauts/airside-core":"^0.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@airnauts/airside-test-support":"0.0.0","@airnauts/airside-adapter-memory":"0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/airside-server_0.8.0_1781601750721_0.32232426628288224","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@airnauts/airside-server","version":"0.8.1","keywords":["comments","commenting","annotations","feedback","airnauts","server"],"author":{"name":"Airnauts"},"license":"MIT","_id":"@airnauts/airside-server@0.8.1","maintainers":[{"name":"jkrzemie","email":"hello@airnauts.com"},{"name":"mateuszpaulski","email":"mateusz@airnauts.com"}],"homepage":"https://github.com/Airnauts/airside#readme","bugs":{"url":"https://github.com/Airnauts/airside/issues"},"dist":{"shasum":"1f3274f6fff56c6ad2589331110a670e31fca5e8","tarball":"https://registry.npmjs.org/@airnauts/airside-server/-/airside-server-0.8.1.tgz","fileCount":73,"integrity":"sha512-FwytVdubV7i5HU7SpCJLq2KDYnNSi12s0NvEgDBoP/P5mVDMTjYCxZ3d40wiR0lYdvtImb1zeXzs25nA9T11NQ==","signatures":[{"sig":"MEUCIHv0XD2lDIKw2u2ke1EiuyMiuVa4U4c8HDDBDQzlJbeSAiEA0rwcbGZVv8HMS8UxSb9Cjg+6IkJrfPOlfHYcdBMvEtg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156134},"type":"module","_from":"file:airnauts-airside-server-0.8.1.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dev":{"types":"./dist/dev.d.ts","import":"./dist/dev.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"}},"scripts":{"test":"vitest run","build":"tsup && tsc --build --force","typecheck":"tsc --build"},"_npmUser":{"name":"mateuszpaulski","email":"mateusz@airnauts.com"},"_resolved":"/tmp/79c5d0f58d8bab8f4406b7ee4c50ba3b/airnauts-airside-server-0.8.1.tgz","_integrity":"sha512-FwytVdubV7i5HU7SpCJLq2KDYnNSi12s0NvEgDBoP/P5mVDMTjYCxZ3d40wiR0lYdvtImb1zeXzs25nA9T11NQ==","repository":{"url":"git+https://github.com/Airnauts/airside.git","type":"git","directory":"packages/server"},"_npmVersion":"10.9.8","description":"Server runtime for the Airnauts embeddable commenting tool: HTTP router, use-cases, CORS/security, and framework adapters (dev server, generic Node bridge).","directories":{},"_nodeVersion":"22.22.3","dependencies":{"nanoid":"^5.1.11","@airnauts/airside-core":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@airnauts/airside-test-support":"0.0.0","@airnauts/airside-adapter-memory":"0.8.1"},"_npmOperationalInternal":{"tmp":"tmp/airside-server_0.8.1_1781606536145_0.4281947016565546","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"@airnauts/airside-server","version":"0.8.2","keywords":["comments","commenting","annotations","feedback","airnauts","server"],"author":{"name":"Airnauts"},"license":"MIT","_id":"@airnauts/airside-server@0.8.2","maintainers":[{"name":"jkrzemie","email":"hello@airnauts.com"},{"name":"mateuszpaulski","email":"mateusz@airnauts.com"}],"homepage":"https://github.com/Airnauts/airside#readme","bugs":{"url":"https://github.com/Airnauts/airside/issues"},"dist":{"shasum":"b4f37786583632de71ff1186a713c09a88808fe4","tarball":"https://registry.npmjs.org/@airnauts/airside-server/-/airside-server-0.8.2.tgz","fileCount":73,"integrity":"sha512-PCorF2Tv+ew4lOMTe635Q/Gatb7z3nwLkEde/63GmMxlmSRGu3tY33wfMIlvrAnuAgfpbe2P3e6QyNsAtcz5PQ==","signatures":[{"sig":"MEQCIGLyhu3vInG4g9EiUnmK2YKHLBpwD+blgbCLRzgtU/EvAiAo5ADDBQFckj6P9KIfMxQubWI5HWvkGu1Ka6fXoH2dgA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156134},"type":"module","_from":"file:airnauts-airside-server-0.8.2.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dev":{"types":"./dist/dev.d.ts","import":"./dist/dev.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"}},"scripts":{"test":"vitest run","build":"tsup && tsc --build --force","typecheck":"tsc --build"},"_npmUser":{"name":"mateuszpaulski","email":"mateusz@airnauts.com"},"_resolved":"/tmp/0ca4341127698e733385c4c940b9558a/airnauts-airside-server-0.8.2.tgz","_integrity":"sha512-PCorF2Tv+ew4lOMTe635Q/Gatb7z3nwLkEde/63GmMxlmSRGu3tY33wfMIlvrAnuAgfpbe2P3e6QyNsAtcz5PQ==","repository":{"url":"git+https://github.com/Airnauts/airside.git","type":"git","directory":"packages/server"},"_npmVersion":"10.9.8","description":"Server runtime for the Airnauts embeddable commenting tool: HTTP router, use-cases, CORS/security, and framework adapters (dev server, generic Node bridge).","directories":{},"_nodeVersion":"22.22.3","dependencies":{"nanoid":"^5.1.11","@airnauts/airside-core":"^0.8.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@airnauts/airside-test-support":"0.0.0","@airnauts/airside-adapter-memory":"0.8.2"},"_npmOperationalInternal":{"tmp":"tmp/airside-server_0.8.2_1781610337034_0.20739558811101966","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@airnauts/airside-server","version":"0.9.0","keywords":["comments","commenting","annotations","feedback","airnauts","server"],"author":{"name":"Airnauts"},"license":"MIT","_id":"@airnauts/airside-server@0.9.0","maintainers":[{"name":"jkrzemie","email":"hello@airnauts.com"},{"name":"mateuszpaulski","email":"mateusz@airnauts.com"}],"homepage":"https://github.com/Airnauts/airside#readme","bugs":{"url":"https://github.com/Airnauts/airside/issues"},"dist":{"shasum":"596de9c2886aa5bd3413fea5da6e2904c347a6f2","tarball":"https://registry.npmjs.org/@airnauts/airside-server/-/airside-server-0.9.0.tgz","fileCount":73,"integrity":"sha512-eo57AGkrI7CxNMyCNorSPeuUS0x1YoK8HukBGRynb193HyY4cFAqFyiCUK5fvZ3z5c5mHe2f94LLgCHT2unIKw==","signatures":[{"sig":"MEUCIC9Zr4fS37DWL+tAKvHB4iPlVBoae65/ZiEMsJ0Ya7sBAiEA/7gOPfxlxSbpVcOPaqVUD+ZB0r6MCZdcf+tcLPemes4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156134},"type":"module","_from":"file:airnauts-airside-server-0.9.0.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dev":{"types":"./dist/dev.d.ts","import":"./dist/dev.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"}},"scripts":{"test":"vitest run","build":"tsup && tsc --build --force","typecheck":"tsc --build"},"_npmUser":{"name":"mateuszpaulski","email":"mateusz@airnauts.com"},"_resolved":"/tmp/13ae9b5d532bfc380efc44d4cd189337/airnauts-airside-server-0.9.0.tgz","_integrity":"sha512-eo57AGkrI7CxNMyCNorSPeuUS0x1YoK8HukBGRynb193HyY4cFAqFyiCUK5fvZ3z5c5mHe2f94LLgCHT2unIKw==","repository":{"url":"git+https://github.com/Airnauts/airside.git","type":"git","directory":"packages/server"},"_npmVersion":"10.9.8","description":"Server runtime for the Airnauts embeddable commenting tool: HTTP router, use-cases, CORS/security, and framework adapters (dev server, generic Node bridge).","directories":{},"_nodeVersion":"22.22.3","dependencies":{"nanoid":"^5.1.11","@airnauts/airside-core":"^0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@airnauts/airside-test-support":"0.0.0","@airnauts/airside-adapter-memory":"0.9.0"},"_npmOperationalInternal":{"tmp":"tmp/airside-server_0.9.0_1781622017743_0.6372228124509507","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@airnauts/airside-server","version":"0.9.1","keywords":["comments","commenting","annotations","feedback","airnauts","server"],"author":{"name":"Airnauts"},"license":"MIT","_id":"@airnauts/airside-server@0.9.1","maintainers":[{"name":"jkrzemie","email":"hello@airnauts.com"},{"name":"mateuszpaulski","email":"mateusz@airnauts.com"}],"homepage":"https://github.com/Airnauts/airside#readme","bugs":{"url":"https://github.com/Airnauts/airside/issues"},"dist":{"shasum":"7a317b24f43ee5b155a27163d43c212ba29e5eee","tarball":"https://registry.npmjs.org/@airnauts/airside-server/-/airside-server-0.9.1.tgz","fileCount":73,"integrity":"sha512-CaPmF8J3znKxrm9iRhNLolWgfDpSJiiKIKtST08AhwWxQNQ3qOwHi4syxaYMQj+WzQL9mswGHlnod0MyNwzyOw==","signatures":[{"sig":"MEYCIQCfy7WnR3VR7Yc3CHk7iOC0GfM1bKdng67TzpkRh23QjAIhALP5T9NQoyCl50oRtgW+zgQgDx9oH9T+04lRhpPsiedY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156134},"type":"module","_from":"file:airnauts-airside-server-0.9.1.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dev":{"types":"./dist/dev.d.ts","import":"./dist/dev.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"}},"scripts":{"test":"vitest run","build":"tsup && tsc --build --force","typecheck":"tsc --build"},"_npmUser":{"name":"mateuszpaulski","email":"mateusz@airnauts.com"},"_resolved":"/tmp/f239cf0740c7f1cd0ce8bc35cdf05504/airnauts-airside-server-0.9.1.tgz","_integrity":"sha512-CaPmF8J3znKxrm9iRhNLolWgfDpSJiiKIKtST08AhwWxQNQ3qOwHi4syxaYMQj+WzQL9mswGHlnod0MyNwzyOw==","repository":{"url":"git+https://github.com/Airnauts/airside.git","type":"git","directory":"packages/server"},"_npmVersion":"10.9.8","description":"Server runtime for the Airnauts embeddable commenting tool: HTTP router, use-cases, CORS/security, and framework adapters (dev server, generic Node bridge).","directories":{},"_nodeVersion":"22.22.3","dependencies":{"nanoid":"^5.1.11","@airnauts/airside-core":"^0.9.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@airnauts/airside-test-support":"0.0.0","@airnauts/airside-adapter-memory":"0.9.1"},"_npmOperationalInternal":{"tmp":"tmp/airside-server_0.9.1_1781770415911_0.5851913800442876","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@airnauts/airside-server","version":"0.10.0","keywords":["comments","commenting","annotations","feedback","airnauts","server"],"author":{"name":"Airnauts"},"license":"MIT","_id":"@airnauts/airside-server@0.10.0","maintainers":[{"name":"jkrzemie","email":"hello@airnauts.com"},{"name":"mateuszpaulski","email":"mateusz@airnauts.com"}],"homepage":"https://github.com/Airnauts/airside#readme","bugs":{"url":"https://github.com/Airnauts/airside/issues"},"dist":{"shasum":"08586e21c5f108d32114acab635ba1726fe81ac3","tarball":"https://registry.npmjs.org/@airnauts/airside-server/-/airside-server-0.10.0.tgz","fileCount":75,"integrity":"sha512-dm4DMHf2maPp4WFKQ1stUcsHDy7cH71odqNy6lV57QCoHPTN/rfUlk/oavYVlQ3C89SBlcLv5yAuABsjPQ0LuQ==","signatures":[{"sig":"MEUCIACjYI9Csc+YOv2O0uV9rx88saeHMjHsknKYkqp2LMY8AiEAn4liHvyrQDiwVgPzShoTYGkWZsGJKTgDqogrGXbvvCQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":159898},"type":"module","_from":"file:airnauts-airside-server-0.10.0.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dev":{"types":"./dist/dev.d.ts","import":"./dist/dev.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"}},"scripts":{"test":"vitest run","build":"tsup && tsc --build --force","typecheck":"tsc --build"},"_npmUser":{"name":"mateuszpaulski","email":"mateusz@airnauts.com"},"_resolved":"/tmp/4ed2a51c06243b16461ad882477fa0f8/airnauts-airside-server-0.10.0.tgz","_integrity":"sha512-dm4DMHf2maPp4WFKQ1stUcsHDy7cH71odqNy6lV57QCoHPTN/rfUlk/oavYVlQ3C89SBlcLv5yAuABsjPQ0LuQ==","repository":{"url":"git+https://github.com/Airnauts/airside.git","type":"git","directory":"packages/server"},"_npmVersion":"10.9.8","description":"Server runtime for the Airnauts embeddable commenting tool: HTTP router, use-cases, CORS/security, and framework adapters (dev server, generic Node bridge).","directories":{},"_nodeVersion":"22.23.0","dependencies":{"nanoid":"^5.1.11","@airnauts/airside-core":"^0.10.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@airnauts/airside-test-support":"0.0.0","@airnauts/airside-adapter-memory":"0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/airside-server_0.10.0_1782730558240_0.8039175277821211","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@airnauts/airside-server","version":"0.10.1","description":"Server runtime for the Airnauts embeddable commenting tool: HTTP router, use-cases, CORS/security, and framework adapters (dev server, generic Node bridge).","keywords":["comments","commenting","annotations","feedback","airnauts","server"],"license":"MIT","author":{"name":"Airnauts"},"homepage":"https://github.com/Airnauts/airside#readme","repository":{"type":"git","url":"git+https://github.com/Airnauts/airside.git","directory":"packages/server"},"bugs":{"url":"https://github.com/Airnauts/airside/issues"},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dev":{"types":"./dist/dev.d.ts","import":"./dist/dev.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"}},"publishConfig":{"access":"public"},"dependencies":{"nanoid":"^5.1.11","@airnauts/airside-core":"^0.10.1"},"devDependencies":{"@airnauts/airside-adapter-memory":"0.10.1","@airnauts/airside-test-support":"0.0.0"},"scripts":{"build":"tsup && tsc --build --force","typecheck":"tsc --build","test":"vitest run"},"_id":"@airnauts/airside-server@0.10.1","_integrity":"sha512-sbj49zQ3helHsDL+uoXfShVNY2ide4SNy4g88/40v/7qVgAYT5Lzl2QzcDh1ig+2AhDGkIcY/oeV54OcQMdFDg==","_resolved":"/tmp/562f43f1062962369d1cb387ff913dd2/airnauts-airside-server-0.10.1.tgz","_from":"file:airnauts-airside-server-0.10.1.tgz","_nodeVersion":"22.23.0","_npmVersion":"10.9.8","dist":{"integrity":"sha512-sbj49zQ3helHsDL+uoXfShVNY2ide4SNy4g88/40v/7qVgAYT5Lzl2QzcDh1ig+2AhDGkIcY/oeV54OcQMdFDg==","shasum":"308ca4ec4a0ef15c8775dd112aeaae36249f6e53","tarball":"https://registry.npmjs.org/@airnauts/airside-server/-/airside-server-0.10.1.tgz","fileCount":75,"unpackedSize":159914,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIC2HaPmvHaLdoSVNPhPB+2PB9ymLN93pzLhUlDUScbCeAiEA4AcDiH7sDebDtFyVYG08ITjS8eUgG2mzPGGCYdOQrnk="}]},"_npmUser":{"name":"mateuszpaulski","email":"mateusz@airnauts.com"},"directories":{},"maintainers":[{"name":"jkrzemie","email":"hello@airnauts.com"},{"name":"mateuszpaulski","email":"mateusz@airnauts.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/airside-server_0.10.1_1782737644699_0.9534824051392083"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-16T09:22:30.461Z","modified":"2026-06-29T12:54:04.972Z","0.8.0":"2026-06-16T09:22:30.850Z","0.8.1":"2026-06-16T10:42:16.285Z","0.8.2":"2026-06-16T11:45:37.171Z","0.9.0":"2026-06-16T15:00:17.926Z","0.9.1":"2026-06-18T08:13:36.055Z","0.10.0":"2026-06-29T10:55:58.370Z","0.10.1":"2026-06-29T12:54:04.833Z"},"bugs":{"url":"https://github.com/Airnauts/airside/issues"},"author":{"name":"Airnauts"},"license":"MIT","homepage":"https://github.com/Airnauts/airside#readme","keywords":["comments","commenting","annotations","feedback","airnauts","server"],"repository":{"type":"git","url":"git+https://github.com/Airnauts/airside.git","directory":"packages/server"},"description":"Server runtime for the Airnauts embeddable commenting tool: HTTP router, use-cases, CORS/security, and framework adapters (dev server, generic Node bridge).","maintainers":[{"name":"jkrzemie","email":"hello@airnauts.com"},{"name":"mateuszpaulski","email":"mateusz@airnauts.com"}],"readme":"<p align=\"center\">\n  <a href=\"https://github.com/Airnauts/airside\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/Airnauts/airside/main/assets/airside-logo-dark.svg\">\n      <img src=\"https://raw.githubusercontent.com/Airnauts/airside/main/assets/airside-logo-light.svg\" alt=\"Airside\" height=\"40\">\n    </picture>\n  </a>\n  <h1 align=\"center\">\nEmbeddable Commenting Tool\n</h1>\n</p>\n\n# @airnauts/airside-server\n\nServer runtime for [Airside](https://github.com/Airnauts/airside): Web-standard `Request → Response` HTTP handler, use cases, CORS/security, and the adapter interfaces for persistence and storage.\n\n## Installation\n\n```bash\npnpm add @airnauts/airside-server\n```\n\n## Quick start\n\n```ts\nimport { createAirsideServer } from '@airnauts/airside-server'\nimport { createMemoryRepository } from '@airnauts/airside-adapter-memory'\nimport { createFileSystemStorage } from '@airnauts/airside-storage-fs'\n\nconst server = createAirsideServer({\n  secretKey: process.env.AIRSIDE_SECRET!,\n  projectId: 'my-app',\n  allowedOrigins: ['https://my-app.example.com'],\n  repository: createMemoryRepository(),\n  storage: createFileSystemStorage({ rootDir: './uploads', baseUrl: '/uploads' }),\n})\n\n// server.handle is a Web-standard (Request) => Promise<Response> handler.\n// Mount it in any framework — Next.js, Hono, bare Node http, etc.\n```\n\nFor Next.js (App Router or Pages Router), prefer `@airnauts/airside-integration-next` which wraps the above into single one-call integrations: `createAirsideAppRoute(config)` for the App Router and `createAirsidePagesRoute(config)` for the Pages Router.\n\n## API reference\n\n### `createAirsideServer(options)`\n\nReturns a `AirsideServer` with a single `handle(req: Request): Promise<Response>` method.\n\n#### `CreateAirsideServerOptions`\n\n| Option | Type | Required | Description |\n|---|---|---|---|\n| `secretKey` | `string` | ✓ | Shared bearer token; clients send it as `x-airside-key` |\n| `projectId` | `string` | ✓ | Namespace for all threads in this mount |\n| `allowedOrigins` | `string[]` | ✓ | CORS origin allowlist; requests from other origins get 403 |\n| `repository` | `Repository` | ✓ | Persistence adapter (mongo, postgres, memory, …) |\n| `storage` | `StorageAdapter` | ✓ | File/blob storage adapter |\n| `env` | `string` | | Optional sub-namespace (e.g. `\"staging\"`) within a project |\n| `extensions` | `ServerExtension[]` | | Notification and thread-action plugins; see below |\n| `notifiers` | `Notifier[]` | | **Deprecated** — use `extensions` |\n| `threadParam` | `string` | | URL param for thread deep-links (default `\"airside-thread\"`) |\n| `rateLimit` | `RateLimitConfig \\| false` | | Per-key/IP rate limit; default `{ writesPerMin: 60, readsPerMin: 600 }`; `false` disables |\n| `rateLimiter` | `RateLimiter` | | Override the rate-limiter implementation |\n| `uploads` | `{ maxBytes?: number }` | | Per-upload size cap (default 5 MB) |\n| `extractIp` | `(req: Request) => string` | | Override IP extraction (default: first hop of `x-forwarded-for`) |\n\n### Extensions (`ServerExtension`)\n\nExtensions come in two kinds, both passed to `extensions: [...]`.\n\n**Notification extensions** (`NotificationExtension`) receive a `NotificationEvent` after each write (thread created or comment added). Failures are isolated — they never break the write.\n\n```ts\nimport { slackExtension } from '@airnauts/airside-extension-slack'\nimport { emailExtension } from '@airnauts/airside-extension-email'\n\ncreateAirsideServer({\n  // ...\n  extensions: [\n    ...slackExtension({ webhookUrl: process.env.SLACK_WEBHOOK! }),\n    ...emailExtension({ transport, from: 'noreply@acme.com' }),\n  ],\n})\n```\n\n**Thread-action extensions** (`ThreadActionExtension`) add reviewer-triggered actions to the thread toolbar (e.g. \"Create Jira issue\"). Each action declares an `id`, `label`, `slot`, optional `visibleWhen` predicate, and a `run` handler that may persist an `externalLink` back on the thread.\n\n```ts\nimport { jiraExtension } from '@airnauts/airside-extension-jira'\n\ncreateAirsideServer({\n  // ...\n  extensions: jiraExtension({ siteUrl: '...', email: '...', apiToken: '...', projectKey: 'PROJ' }),\n})\n```\n\n### Adapter interfaces\n\nThe types below are what custom adapters must implement:\n\n```ts\nimport type { Repository, StorageAdapter } from '@airnauts/airside-server'\n```\n\n**`Repository`** — persistence; implement `createThread`, `getThread`, `listThreads`, `addComment`, `setStatus`, `deleteThread`, `updateAnchor`, `upsertExternalLink`, `putAttachment`, `getAttachments`.\n\n**`StorageAdapter`** — file storage; implement `put(blob: PutBlob): Promise<PutResult>`.\n\nOther exported types: `NewThread`, `NewComment`, `AnchorPatch`, `ListQuery`, `ListResult`, `Scope`, `PutBlob`, `PutResult`. Utility functions: `readAllBytes`, `sanitizeName`.\n\n### `lazyRepository(connect, opts?)`\n\nWraps a `() => Promise<Repository>` factory so it connects lazily on first use and optionally memoizes the connection under a `cacheKey` (useful for hot-reload / warm serverless environments).\n\n### Rate limiting\n\n`InMemoryRateLimiter` is exported for use with the `rateLimiter` option or in tests. Implement the `RateLimiter` interface to plug in Redis or any other store.\n\n### Error classes\n\n`AuthInvalidKeyError`, `ConflictError`, `NotFoundError`, `OriginNotAllowedError`, `RateLimitedError`, `UploadTooLargeError`, `ValidationError`, `DomainError`, `IntegrationError`, `toResponse`.\n\n## Subpath exports\n\n### `@airnauts/airside-server/node`\n\nGeneric Node↔Web bridge for mounting the server on any Node host (Express, bare `node:http`, etc.). Usually consumed via `@airnauts/airside-integration-next` for Next.js hosts.\n\n```ts\nimport { nodeRequestToWeb, webToNode } from '@airnauts/airside-server/node'\n\n// In an Express/http handler — bridge the Node req/res to the Web standard:\napp.use('/api/airside', async (req, res) => {\n  const url = new URL(req.url, `http://${req.headers.host}`)\n  const webRes = await server.handle(await nodeRequestToWeb(req, url))\n  await webToNode(webRes, res)\n})\n```\n\n### `@airnauts/airside-server/dev`\n\nMinimal Node `http` server that bridges Web `Request/Response` — for local development of non-Next.js consumers.\n\n```ts\nimport { createDevServer } from '@airnauts/airside-server/dev'\n\nconst dev = createDevServer((req) => server.handle(req), { port: 4321 })\nconst { port } = await dev.listen()\n// dev.close() to shut down\n```\n\n## Requirements\n\n- Node.js ≥ 18 (Web `Request`/`Response` are built in)\n\n## Related packages\n\n- **`@airnauts/airside-integration-next`** — one-call Next.js App and Pages Router integration (`createAirsideAppRoute` / `createAirsidePagesRoute`)\n- **`@airnauts/airside-adapter-mongo`** — MongoDB repository\n- **`@airnauts/airside-adapter-postgres`** — PostgreSQL repository\n- **`@airnauts/airside-adapter-memory`** — in-memory repository for dev/tests\n- **`@airnauts/airside-storage-vercel-blob`** — Vercel Blob storage\n- **`@airnauts/airside-storage-fs`** — filesystem storage\n- **`@airnauts/airside-extension-slack`** — Slack notification extension\n- **`@airnauts/airside-extension-email`** — email notification extension\n- **`@airnauts/airside-extension-jira`** — Jira thread-action extension\n- **`@airnauts/airside-core`** — shared types and schemas (consumed transitively)\n\nSee [docs/architecture.md](https://github.com/Airnauts/airside/blob/main/docs/architecture.md) and the [integration guide](https://github.com/Airnauts/airside/blob/main/docs/integration.md).\n\n## License\n\nMIT © Airnauts\n","readmeFilename":"README.md"}