{"record":{"id":"b452e9c5dbf1c792","repo":"anomalyco/sst","slug":"no-aws-lambda-preset-detected-for-tanstack-start","errorCode":null,"errorMessage":"No AWS-Lambda preset detected for TanStack Start.\n\nAdd the nitro preset to your `vite.config.ts`:\n  // vite.config.ts\n  import { nitro } from \"nitro/vite\"\n\n  export default defineConfig({\n    server: {\n      preset: \"aws-lambda\",\n    },\n  });\n\nDetected preset: \"${nitro.preset ?? \"undefined\"}\"","messagePattern":"No AWS-Lambda preset detected for TanStack Start\\.\n\nAdd the nitro preset to your `vite\\.config\\.ts`:\n  // vite\\.config\\.ts\n  import (.+?) from \"nitro/vite\"\n\n  export default defineConfig\\((.+?),\n  \\}\\);\n\nDetected preset: \"(.+?)\"","errorType":"validation","errorClass":"VisibleError","httpStatus":null,"severity":"error","filePath":"platform/src/components/aws/tan-stack-start.ts","lineNumber":375,"sourceCode":"  protected normalizeBuildCommand() { }\n\n  protected buildPlan(outputPath: Output<string>): Output<Plan> {\n    return outputPath.apply((outputPath) => {\n      const nitro = JSON.parse(\n        fs.readFileSync(\n          path.join(outputPath, \".output\", \"nitro.json\"),\n          \"utf-8\",\n        ),\n      );\n\n      if (![\"aws-lambda\"].includes(nitro.preset)) {\n        const projectRoot = path.dirname(outputPath);\n        const isViteProject =\n          fs.existsSync(path.join(projectRoot, \"vite.config.ts\")) ||\n          fs.existsSync(path.join(projectRoot, \"vite.config.js\"));\n\n        if (isViteProject) {\n          throw new VisibleError(\n            [\n              \"No AWS-Lambda preset detected for TanStack Start.\",\n              \"\",\n              \"Add the nitro preset to your `vite.config.ts`:\",\n              \"  // vite.config.ts\",\n              '  import { nitro } from \"nitro/vite\"',\n              \"\",\n              \"  export default defineConfig({\",\n              \"    plugins: [nitro(), tanstackStart(), ...],\",\n              \"    nitro: {\",\n              '      preset: \"aws-lambda\",',\n              \"      awsLambda: { streaming: true }, // optional\",\n              \"    },\",\n              \"  });\",\n              \"\",\n              `Detected preset: \"${nitro.preset ?? \"undefined\"}\"`,\n            ].join(\"\\n\"),\n          );","sourceCodeStart":357,"sourceCodeEnd":393,"githubUrl":"https://github.com/anomalyco/sst/blob/a0bd20f762883e72a35caccb4896c42ce5b3f707/platform/src/components/aws/tan-stack-start.ts#L357-L393","documentation":"SST's `TanStackStart` component deploys the app as a Nitro AWS Lambda function, so the build output (`.output/nitro.json`) must report the `aws-lambda` preset. In `buildPlan` (platform/src/components/aws/tan-stack-start.ts:359), when the detected preset differs and the project root contains a `vite.config.ts`/`vite.config.js` (Nitro/Vite-style project), SST throws this VisibleError telling you to set the preset in `vite.config.ts`.","triggerScenarios":"Running `sst deploy` for a TanStack Start app whose `vite.config.ts` exists but whose Nitro config does not set `nitro.preset` (or sets it to something other than `\"aws-lambda\"`), so the built `.output/nitro.json` has `preset: undefined` or another value.","commonSituations":"Scaffolding a new TanStack Start app with `tanstackStart()` but no nitro plugin options; upgrading TanStack Start to the Vite/Nitro pipeline and missing the preset migration; setting the preset only in a `.env` or CLI flag that isn't reflected in `nitro.json`.","solutions":["Add `import { nitro } from \"nitro/vite\"` and configure `nitro: { preset: \"aws-lambda\" }` in `vite.config.ts`, then rebuild and redeploy.","Optionally enable streaming with `nitro: { preset: \"aws-lambda\", awsLambda: { streaming: true } }`.","Verify the fix by checking that `.output/nitro.json` in the build output reports `\"preset\": \"aws-lambda\"` before deploying."],"exampleFix":"// before (vite.config.ts)\nimport { defineConfig } from \"vite\";\nimport { tanstackStart } from \"@tanstack/react-start/plugin/vite\";\nexport default defineConfig({ plugins: [tanstackStart()] });\n\n// after\nimport { defineConfig } from \"vite\";\nimport { nitro } from \"nitro/vite\";\nimport { tanstackStart } from \"@tanstack/react-start/plugin/vite\";\nexport default defineConfig({\n  plugins: [nitro(), tanstackStart(), ...],\n  nitro: { preset: \"aws-lambda\" },\n});","handlingStrategy":"validation","validationCode":"import fs from \"node:fs\";\nconst nitro = JSON.parse(fs.readFileSync(\".output/nitro.json\", \"utf-8\"));\nif (nitro.preset !== \"aws-lambda\")\n  throw new Error(`Set nitro preset to \"aws-lambda\" (got: ${nitro.preset ?? \"undefined\"})`);","typeGuard":"null","tryCatchPattern":"// VisibleError aborts the Pulumi deploy rather than a call you can wrap;\n// guard at build time instead:\nimport { execSync } from \"node:child_process\";\nexecSync(\"npm run build\");\nconst nitro = JSON.parse(require(\"fs\").readFileSync(\".output/nitro.json\", \"utf-8\"));\nif (nitro.preset !== \"aws-lambda\") process.exit(1);","preventionTips":["Always configure `nitro: { preset: \"aws-lambda\" }` in vite.config.ts for SST deployments.","After a local build, check `.output/nitro.json` reports `\"preset\": \"aws-lambda\"` before running `sst deploy`.","Keep the nitro vite plugin ordered before tanstackStart in the plugins array.","Don't rely on NITRO_PRESET env vars alone; set the preset in config so it lands in nitro.json."],"tags":["tanstack-start","nitro","deployment","config"],"backgroundTag":"missing-nitro-preset","analyzedSha":"a0bd20f762883e72a35caccb4896c42ce5b3f707","analyzedAt":"2026-08-30T11:26:00.383Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}