[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-navigation":3,"docs-page-configuration":166},[4,38,57,65,114,138,157],{"id":5,"group":6,"pages":7},"get-started","Get started",[8,13,18,23,28,33],{"path":9,"title":10,"description":11,"navTitle":10,"group":6,"order":12},"\u002Fdocs\u002Fgetting-started","Getting started","Create your app from the kit, run it locally with no credentials, make yourself superadmin and find where your own code goes.",1,{"path":14,"title":15,"description":16,"navTitle":15,"group":6,"order":17},"\u002Fdocs\u002Flayout","Project structure","Where code lives by where it runs, and which server\u002F directories turn a new file into a route, a job or a provider.",2,{"path":19,"title":20,"description":21,"navTitle":20,"group":6,"order":22},"\u002Fdocs\u002Fconfiguration","Configuration","starter.config.ts switches each part of the kit and its providers, environment variables hold the secrets: every key and what it changes.",3,{"path":24,"title":25,"description":26,"navTitle":25,"group":6,"order":27},"\u002Fdocs\u002Ftemplate","Updating from the kit","Keep the kit as a git remote and take each update as one commit you review, with pnpm template:update, then resolve what conflicts.",4,{"path":29,"title":30,"description":31,"navTitle":30,"group":6,"order":32},"\u002Fdocs\u002Fdeployment","Deployment","Ship the app as one Cloudflare Worker: create the resources, set the secrets, deploy main from GitHub Actions or your machine.",5,{"path":34,"title":35,"description":36,"navTitle":35,"group":6,"order":37},"\u002Fdocs\u002Fmcp","MCP server","Connect Claude Code, Cursor or VS Code to https:\u002F\u002Fnuxter.app\u002Fmcp, so your agent searches and reads these docs and their design notes.",6,{"id":39,"group":40,"pages":41},"accounts","Accounts",[42,47,52],{"path":43,"title":44,"description":45,"navTitle":44,"group":40,"order":46},"\u002Fdocs\u002Fauth","Auth","Pick the sign-in methods, add an OAuth provider, protect a route, and handle sessions, second factors and account deletion.",7,{"path":48,"title":49,"description":50,"navTitle":49,"group":40,"order":51},"\u002Fdocs\u002Ftenancy","Organizations","Scope routes and pages to an organization, and work with its members, roles, seats, invitations and a second level such as branches.",8,{"path":53,"title":54,"description":55,"navTitle":54,"group":40,"order":56},"\u002Fdocs\u002Fpermissions","Roles and permissions","Routes check permissions that an account’s role or its organization’s plan grants: checking one, adding a role, and the staff tools.",9,{"id":58,"group":59,"pages":60},"payments","Payments",[61],{"path":62,"title":59,"description":63,"navTitle":59,"group":59,"order":64},"\u002Fdocs\u002Fpayments","Sell plans through Stripe, Polar, Lemon Squeezy or Creem: define plans, connect a provider, gate features, trials, coupons and refunds.",10,{"id":66,"group":67,"pages":68},"building-blocks","Building blocks",[69,74,79,84,89,94,99,104,109],{"path":70,"title":71,"description":72,"navTitle":71,"group":67,"order":73},"\u002Fdocs\u002Fdatabase","Database","Postgres through Drizzle, on Hyperdrive in production and PGlite locally: add a table, query, transactions, migrations and seed data.",11,{"path":75,"title":76,"description":77,"navTitle":76,"group":67,"order":78},"\u002Fdocs\u002Fbackground-jobs","Background jobs","Run work after the response on Cloudflare Queues with retries: add and enqueue a job, run jobs locally, and schedule cron tasks.",12,{"path":80,"title":81,"description":82,"navTitle":81,"group":67,"order":83},"\u002Fdocs\u002Fevents","Events","React to what the kit does by adding a file to server\u002Flisteners\u002F, fire events of your own, and look up every event’s payload.",13,{"path":85,"title":86,"description":87,"navTitle":86,"group":67,"order":88},"\u002Fdocs\u002Femail","Email","Set up sending, send your own mail with deliverEmail, change the templates and wording, handle unsubscribes and add a provider.",14,{"path":90,"title":91,"description":92,"navTitle":91,"group":67,"order":93},"\u002Fdocs\u002Fcontact","Contact","A \u002Fcontact page that mails you a message or shows your address after a Turnstile check: choose the channels, set the address, know the limits.",15,{"path":95,"title":96,"description":97,"navTitle":96,"group":67,"order":98},"\u002Fdocs\u002Fnotifications","Notifications","The dashboard bell: add a notification type, send one with notify(), and how categories, opt-outs and retention apply.",16,{"path":100,"title":101,"description":102,"navTitle":101,"group":67,"order":103},"\u002Fdocs\u002Fstorage","Storage","Uploads in R2 with one policy per purpose: add a purpose, accept an upload, replace or delete a file, and serve it to its owner.",17,{"path":105,"title":106,"description":107,"navTitle":106,"group":67,"order":108},"\u002Fdocs\u002Ffeature-flags","Feature flags","Declare typed flags in starter.config.ts, read them with flag() or useFlag(), roll them out by rule or percentage, and add a provider.",18,{"path":110,"title":111,"description":112,"navTitle":111,"group":67,"order":113},"\u002Fdocs\u002Fai","AI","Call models from server code by role: text, images, speech, transcription, embeddings and video, with provider fallbacks.",19,{"id":115,"group":116,"pages":117},"web","Web",[118,123,128,133],{"path":119,"title":120,"description":121,"navTitle":120,"group":116,"order":122},"\u002Fdocs\u002Fsecurity-headers","Security headers","The Content-Security-Policy and hardening headers on every response: allow another origin, keep tokens out of Referer, accept cross-site posts.",20,{"path":124,"title":125,"description":126,"navTitle":125,"group":116,"order":127},"\u002Fdocs\u002Frate-limiting","Rate limiting","Cap how often a caller hits a route with requireRateLimit, count only failures, space out sends, and protect the zone.",21,{"path":129,"title":130,"description":131,"navTitle":130,"group":116,"order":132},"\u002Fdocs\u002Fanalytics","Analytics","Product analytics and ad conversions sent from the server with no browser script: add an event, connect a provider, and handle consent.",22,{"path":134,"title":135,"description":136,"navTitle":135,"group":116,"order":137},"\u002Fdocs\u002Fobservability","Observability","Find a failed request by its id, send faults to Sentry or Better Stack, report an error you caught, and change the error page.",23,{"id":139,"group":140,"pages":141},"content-and-look","Content and look",[142,147,152],{"path":143,"title":144,"description":145,"navTitle":144,"group":140,"order":146},"\u002Fdocs\u002Fblog","Blog","Markdown posts with an RSS feed per language, and workflows that draft posts with an AI model and open each one as a pull request.",24,{"path":148,"title":149,"description":150,"navTitle":149,"group":140,"order":151},"\u002Fdocs\u002Flanguages","Languages","Add or remove a language, write copy in the locale files, and write code, refusals and links that follow the reader’s language.",25,{"path":153,"title":154,"description":155,"navTitle":154,"group":140,"order":156},"\u002Fdocs\u002Ftheme","Theme","Change the brand colour and font, and build dashboard sections, list pages, loading placeholders and charts that match the kit.",26,{"id":158,"group":159,"pages":160},"quality","Quality",[161],{"path":162,"title":163,"description":164,"navTitle":163,"group":159,"order":165},"\u002Fdocs\u002Ftesting","Testing","Unit tests in Node, component tests in a real Nuxt app and Playwright end to end: test a route or a component, and what CI runs.",27,{"page":167,"surround":2679,"linksToKit":339},{"path":19,"title":20,"description":21,"navTitle":20,"group":6,"seo":168,"body":170},{"title":169,"description":21},"Nuxt SaaS configuration and environment variables",{"type":171,"value":172,"toc":2661},"minimark",[173,177,192,197,300,304,307,467,486,490,499,529,532,619,623,630,698,713,755,779,782,1018,1022,1025,1030,1116,1118,1294,1299,1302,1418,1424,1427,1605,1609,1612,1753,1757,1761,1927,1947,1951,2129,2135,2139,2259,2263,2586,2590,2657],[174,175,20],"h1",{"id":176},"configuration",[178,179,180,191],"p",{},[181,182,187],"a",{"href":183,"rel":184,"title":186},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fstarter.config.ts",[185],"nofollow","Licensees only",[188,189,190],"code",{},"starter.config.ts"," decides which parts of the kit are\non, which providers each part bundles, and your plans, roles, permissions and\nlanguages. You edit it whenever you change one of those. Secrets and values\nthat differ between deploys go in environment variables instead.",[193,194,196],"h2",{"id":195},"how-it-works","How it works",[198,199,200,242,267,282],"ol",{},[201,202,203,206,207,210,211,214,215,218,219,222,223,230,231,222,234,241],"li",{},[188,204,205],{},"defineStarterConfig"," returns the object unchanged. It exists for its types:\nthe literals you write become unions such as ",[188,208,209],{},"PlanId",", ",[188,212,213],{},"UserRole",",\n",[188,216,217],{},"Permission"," and ",[188,220,221],{},"FlagId"," in\n",[181,224,227],{"href":225,"rel":226,"title":186},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fshared\u002Ftypes\u002Fconfig.ts",[185],[188,228,229],{},"shared\u002Ftypes\u002Fconfig.ts",", so a misspelled plan\nor permission fails typecheck. The shape is ",[188,232,233],{},"StarterConfig",[181,235,238],{"href":236,"rel":237,"title":186},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fshared\u002Ftypes\u002Fstarter.ts",[185],[188,239,240],{},"shared\u002Ftypes\u002Fstarter.ts",".",[201,243,244,247,248,255,256,218,259,262,263,266],{},[188,245,246],{},"nuxt.config.ts"," loads the file at build time.\n",[181,249,252],{"href":250,"rel":251,"title":186},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fbuild\u002Fassertions.ts",[185],[188,253,254],{},"build\u002Fassertions.ts"," checks it against\n",[188,257,258],{},"wrangler.jsonc",[188,260,261],{},"i18n\u002Flocales\u002F",", and the registries in ",[188,264,265],{},"modules\u002F"," check\nproviders, plans and roles. Every failure names the key and the fix.",[201,268,269,270,277,278,281],{},"Only the providers you list are bundled.\n",[181,271,274],{"href":272,"rel":273,"title":186},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fbuild\u002Fruntime-config.ts",[185],[188,275,276],{},"build\u002Fruntime-config.ts"," declares a\nruntime-config slot for each credential those providers read, and ",[188,279,280],{},"NUXT_*","\nenvironment variables fill the slots.",[201,283,284,285,292,293,296,297,241],{},"When a deployed Worker boots,\n",[181,286,289],{"href":287,"rel":288,"title":186},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fserver\u002Fplugins\u002Fenv-check.ts",[185],[188,290,291],{},"server\u002Fplugins\u002Fenv-check.ts"," logs one\n",[188,294,295],{},"[env]"," warning naming every variable an enabled part needs and the deploy\nlacks. It stays quiet under ",[188,298,299],{},"pnpm dev",[193,301,303],{"id":302},"read-the-config-in-code","Read the config in code",[178,305,306],{},"Import the file directly. It works the same in server routes, components and\ncomposables:",[308,309,314],"pre",{"className":310,"code":311,"language":312,"meta":313,"style":313},"language-ts shiki shiki-themes github-light github-light github-dark","import starter from '~~\u002Fstarter.config'\n\nexport const sellsYearly = Object.values(starter.payments.plans).some(\n  (plan) => plan.mode === 'subscription' && 'year' in plan.intervals,\n)\n\nexport function isTopPlan(plan: PlanId): boolean {\n  return plan === 'promax'\n}\n","ts","",[188,315,316,335,341,372,408,413,417,449,462],{"__ignoreMap":313},[317,318,320,324,328,331],"span",{"class":319,"line":12},"line",[317,321,323],{"class":322},"s8jYJ","import",[317,325,327],{"class":326},"sxrX7"," starter ",[317,329,330],{"class":322},"from",[317,332,334],{"class":333},"sIIMD"," '~~\u002Fstarter.config'\n",[317,336,337],{"class":319,"line":17},[317,338,340],{"emptyLinePlaceholder":339},true,"\n",[317,342,343,346,349,353,356,359,363,366,369],{"class":319,"line":22},[317,344,345],{"class":322},"export",[317,347,348],{"class":322}," const",[317,350,352],{"class":351},"sBjJW"," sellsYearly",[317,354,355],{"class":322}," =",[317,357,358],{"class":326}," Object.",[317,360,362],{"class":361},"snPdu","values",[317,364,365],{"class":326},"(starter.payments.plans).",[317,367,368],{"class":361},"some",[317,370,371],{"class":326},"(\n",[317,373,374,377,381,384,387,390,393,396,399,402,405],{"class":319,"line":27},[317,375,376],{"class":326},"  (",[317,378,380],{"class":379},"sP4rz","plan",[317,382,383],{"class":326},") ",[317,385,386],{"class":322},"=>",[317,388,389],{"class":326}," plan.mode ",[317,391,392],{"class":322},"===",[317,394,395],{"class":333}," 'subscription'",[317,397,398],{"class":322}," &&",[317,400,401],{"class":333}," 'year'",[317,403,404],{"class":322}," in",[317,406,407],{"class":326}," plan.intervals,\n",[317,409,410],{"class":319,"line":32},[317,411,412],{"class":326},")\n",[317,414,415],{"class":319,"line":37},[317,416,340],{"emptyLinePlaceholder":339},[317,418,419,421,424,427,430,432,435,438,441,443,446],{"class":319,"line":46},[317,420,345],{"class":322},[317,422,423],{"class":322}," function",[317,425,426],{"class":361}," isTopPlan",[317,428,429],{"class":326},"(",[317,431,380],{"class":379},[317,433,434],{"class":322},":",[317,436,437],{"class":361}," PlanId",[317,439,440],{"class":326},")",[317,442,434],{"class":322},[317,444,445],{"class":351}," boolean",[317,447,448],{"class":326}," {\n",[317,450,451,454,457,459],{"class":319,"line":51},[317,452,453],{"class":322},"  return",[317,455,456],{"class":326}," plan ",[317,458,392],{"class":322},[317,460,461],{"class":333}," 'promax'\n",[317,463,464],{"class":319,"line":56},[317,465,466],{"class":326},"}\n",[178,468,469,471,472,474,475,477,478,481,482,485],{},[188,470,209],{}," and the other unions from ",[188,473,229],{}," are auto-imported\non both sides. Because ",[188,476,209],{}," is ",[188,479,480],{},"'pro' | 'promax' | 'lifetime'",", comparing it\nwith ",[188,483,484],{},"'proMax'"," fails typecheck.",[193,487,489],{"id":488},"change-it","Change it",[178,491,492,493,495,496,498],{},"Save the file and ",[188,494,299],{}," restarts, because ",[188,497,246],{}," watches it.",[178,500,501,502,505,506,513,514,517,518,521,522,222,525,528],{},"Keep it pure data. Nuxt, Vite, ",[188,503,504],{},"@nuxt\u002Fcontent",", Vitest and the seed scripts all\nload it, and the seed scripts' loader\n(",[181,507,510],{"href":508,"rel":509,"title":186},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fscripts\u002Fseed\u002Flib\u002Fstarter-config.mjs",[185],[188,511,512],{},"scripts\u002Fseed\u002Flib\u002Fstarter-config.mjs",")\nrefuses any import other than ",[188,515,516],{},"#starter\u002Fdefine",". A function or a second import\nbreaks at least one of them. The ",[188,519,520],{},"#starter\u002F*"," entry under ",[188,523,524],{},"imports",[188,526,527],{},"package.json"," exists for that one import, so leave it there.",[178,530,531],{},"The build refuses a config that can't work:",[533,534,535,580,598],"ul",{},[201,536,537,542,543,545,546,549,550,553,554,557,558,561,562,565,566,568,569,572,573,576,577,241],{},[181,538,540],{"href":250,"rel":539,"title":186},[185],[188,541,254],{},": a declared locale with no\nfile in ",[188,544,261],{},", or a file there that no locale declares; no\n",[188,547,548],{},"HYPERDRIVE"," binding; ",[188,551,552],{},"cloudflare"," email without a ",[188,555,556],{},"send_email"," binding named\n",[188,559,560],{},"EMAIL","; the queue on without its producer, consumer and dead letter\nconsumer; ",[188,563,564],{},"workersai"," without the ",[188,567,111],{}," binding; a storage purpose whose\nbinding or bucket isn't in ",[188,570,571],{},"r2_buckets","; a deletion grace period with auth on\nand email off; notifications with auth off; a ",[188,574,575],{},"firstAccountRole"," that doesn't\ngrant ",[188,578,579],{},"users:manage",[201,581,582,589,590,593,594,597],{},[181,583,586],{"href":584,"rel":585,"title":186},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fmodules\u002Ftenancy-assert.ts",[185],[188,587,588],{},"modules\u002Ftenancy-assert.ts",": an org\npermission that a plan sells, more than two ",[188,591,592],{},"orgs.levels",", an ",[188,595,596],{},"ownerRole","\nthat can't be held at the root, invitations with email off, organizations\nwith auth off.",[201,599,600,607,608,610,611,614,615,618],{},[181,601,604],{"href":602,"rel":603,"title":186},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fmodules\u002Fpayments-registry.ts",[185],[188,605,606],{},"modules\u002Fpayments-registry.ts",": the plan\nrules on ",[181,609,59],{"href":62},", such as a plan id outside\n",[188,612,613],{},"\u002F^[a-z][a-z0-9]*$\u002F"," or ",[188,616,617],{},"trialDays"," with Creem or Lemon Squeezy enabled.",[193,620,622],{"id":621},"set-environment-variables","Set environment variables",[178,624,625,626,629],{},"Nitro fills each runtime-config key from ",[188,627,628],{},"NUXT_"," plus the key's path in upper\nsnake case:",[631,632,633,646],"table",{},[634,635,636],"thead",{},[637,638,639,643],"tr",{},[640,641,642],"th",{},"Runtime config key",[640,644,645],{},"Variable",[647,648,649,662,674,686],"tbody",{},[637,650,651,657],{},[652,653,654],"td",{},[188,655,656],{},"payments.stripe.secretKey",[652,658,659],{},[188,660,661],{},"NUXT_PAYMENTS_STRIPE_SECRET_KEY",[637,663,664,669],{},[652,665,666],{},[188,667,668],{},"payments.stripe.refs.pro_month",[652,670,671],{},[188,672,673],{},"NUXT_PAYMENTS_STRIPE_REFS_PRO_MONTH",[637,675,676,681],{},[652,677,678],{},[188,679,680],{},"ai.workersai.models.copy",[652,682,683],{},[188,684,685],{},"NUXT_AI_WORKERSAI_MODELS_COPY",[637,687,688,693],{},[652,689,690],{},[188,691,692],{},"public.siteUrl",[652,694,695],{},[188,696,697],{},"NUXT_PUBLIC_SITE_URL",[178,699,700,701,704,705,712],{},"Locally they go in ",[188,702,703],{},".env",". ",[181,706,709],{"href":707,"rel":708,"title":186},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002F.env.example",[185],[188,710,711],{},".env.example"," lists every\nvariable the kit reads and where each value comes from. On a deploy, set them\non the Worker. The Worker reads them per request, so changing one needs no\nrebuild:",[308,714,718],{"className":715,"code":716,"language":717,"meta":313,"style":313},"language-bash shiki shiki-themes github-light github-light github-dark","pnpm exec wrangler secret put NUXT_PAYMENTS_STRIPE_SECRET_KEY --name \u003Cworker>\n","bash",[188,719,720],{"__ignoreMap":313},[317,721,722,725,728,731,734,737,740,743,746,749,752],{"class":319,"line":12},[317,723,724],{"class":361},"pnpm",[317,726,727],{"class":333}," exec",[317,729,730],{"class":333}," wrangler",[317,732,733],{"class":333}," secret",[317,735,736],{"class":333}," put",[317,738,739],{"class":333}," NUXT_PAYMENTS_STRIPE_SECRET_KEY",[317,741,742],{"class":351}," --name",[317,744,745],{"class":322}," \u003C",[317,747,748],{"class":333},"worke",[317,750,751],{"class":326},"r",[317,753,754],{"class":322},">\n",[178,756,757,758,214,761,218,764,767,768,771,772,775,776,778],{},"A few are read at build time and baked into the bundle: ",[188,759,760],{},"NUXT_SITE_URL",[188,762,763],{},"NUXT_PUBLIC_TURNSTILE_SITE_KEY",[188,765,766],{},"NUXT_IMAGE_PROVIDER",". For\n",[188,769,770],{},"pnpm deploy:cf"," those go in ",[188,773,774],{},".env.production","\n(",[181,777,30],{"href":29},").",[178,780,781],{},"Each topic page lists its own variables. These belong to the app as a whole:",[631,783,784,796],{},[634,785,786],{},[637,787,788,790,793],{},[640,789,645],{},[640,791,792],{},"Read at",[640,794,795],{},"What it does",[647,797,798,810,825,842,864,882,896,908,924,936,949,965,986,1001],{},[637,799,800,804,807],{},[652,801,802],{},[188,803,760],{},[652,805,806],{},"build",[652,808,809],{},"The canonical origin, used for SEO tags, the sitemap and every mailed link.",[637,811,812,816,819],{},[652,813,814],{},[188,815,697],{},[652,817,818],{},"runtime",[652,820,821,822,824],{},"Overrides ",[188,823,760],{}," on a deploy without a rebuild.",[637,826,827,832,834],{},[652,828,829],{},[188,830,831],{},"NUXT_SESSION_PASSWORD",[652,833,818],{},[652,835,836,837,839,840,241],{},"Encrypts the session cookie. 32+ characters. The first ",[188,838,299],{}," writes a random one to ",[188,841,703],{},[637,843,844,849,851],{},[652,845,846],{},[188,847,848],{},"NUXT_SESSION_COOKIE_SECURE",[652,850,818],{},[652,852,853,856,857,860,861,241],{},[188,854,855],{},"false"," drops the cookie's ",[188,858,859],{},"Secure"," flag, for a production build served over http such as ",[188,862,863],{},"pnpm preview",[637,865,866,871,873],{},[652,867,868],{},[188,869,870],{},"NUXT_CONTACT_ADDRESS",[652,872,818],{},[652,874,875,876,879,880,778],{},"Where ",[188,877,878],{},"\u002Fcontact"," sends messages, and the address it shows after a Turnstile check. Never sent to a page (",[181,881,91],{"href":90},[637,883,884,889,891],{},[652,885,886],{},[188,887,888],{},"NUXT_BLOG_AUTHOR_EMAIL",[652,890,818],{},[652,892,893,894,778],{},"The account every blog post is bylined with (",[181,895,144],{"href":143},[637,897,898,903,905],{},[652,899,900],{},[188,901,902],{},"NUXT_OG_IMAGE_SECRET",[652,904,818],{},[652,906,907],{},"Signs OG image URLs. Unset, each build signs with its own secret.",[637,909,910,914,916],{},[652,911,912],{},[188,913,763],{},[652,915,806],{},[652,917,918,919,210,921,923],{},"Turnstile's site key. Left out of ",[188,920,703],{},[188,922,299],{}," uses Cloudflare's always-pass test keys.",[637,925,926,931,933],{},[652,927,928],{},[188,929,930],{},"NUXT_TURNSTILE_SECRET_KEY",[652,932,818],{},[652,934,935],{},"Turnstile's secret key, the pair to the site key.",[637,937,938,942,944],{},[652,939,940],{},[188,941,766],{},[652,943,806],{},[652,945,946,948],{},[188,947,552],{}," turns on image optimization. Unset, images are served as they are.",[637,950,951,956,959],{},[652,952,953],{},[188,954,955],{},"NUXT_DEV_TUNNEL_HOSTS",[652,957,958],{},"dev",[652,960,961,962,241],{},"Comma-separated hosts the dev server accepts besides ",[188,963,964],{},"*.trycloudflare.com",[637,966,967,972,974],{},[652,968,969],{},[188,970,971],{},"NUXT_DEV_REMOTE_AI",[652,973,958],{},[652,975,976,979,980,982,983,241],{},[188,977,978],{},"true"," binds Workers AI in ",[188,981,299],{},", after ",[188,984,985],{},"pnpm exec wrangler login",[637,987,988,993,995],{},[652,989,990],{},[188,991,992],{},"NUXT_DEV_PGLITE_PORT",[652,994,958],{},[652,996,997,998,1000],{},"Pins the port ",[188,999,299],{}," serves PGlite on. Unset, it takes the first free one from 5432 to 5441.",[637,1002,1003,1008,1010],{},[652,1004,1005],{},[188,1006,1007],{},"DATABASE_URL",[652,1009,958],{},[652,1011,1012,1013,1015,1016,778],{},"A Postgres for ",[188,1014,299],{}," in place of PGlite (",[181,1017,71],{"href":70},[193,1019,1021],{"id":1020},"every-key","Every key",[178,1023,1024],{},"Defaults are the shipped values. The linked page covers each part in full.",[1026,1027,1029],"h3",{"id":1028},"activity-security-legal","activity, security, legal",[631,1031,1032,1044],{},[634,1033,1034],{},[637,1035,1036,1039,1042],{},[640,1037,1038],{},"Key",[640,1040,1041],{},"Default",[640,1043,795],{},[647,1045,1046,1064,1078,1099],{},[637,1047,1048,1053,1058],{},[652,1049,1050],{},[188,1051,1052],{},"activity.retentionDays",[652,1054,1055],{},[188,1056,1057],{},"90",[652,1059,1060,1061,1063],{},"Days to keep account activity entries: sign-ins, credential changes, admin actions. ",[188,1062,855],{}," keeps everything.",[637,1065,1066,1071,1075],{},[652,1067,1068],{},[188,1069,1070],{},"security.headers",[652,1072,1073],{},[188,1074,978],{},[652,1076,1077],{},"Sends HSTS, a CSP and the other security headers. Turn off only when a proxy in front already sets them.",[637,1079,1080,1085,1090],{},[652,1081,1082],{},[188,1083,1084],{},"security.cspExtend",[652,1086,1087],{},[188,1088,1089],{},"{}",[652,1091,1092,1093,1096,1097,778],{},"Extra sources per CSP directive, such as ",[188,1094,1095],{},"{ 'img-src': ['https:\u002F\u002Fcdn.example.com'] }"," (",[181,1098,120],{"href":119},[637,1100,1101,1106,1110],{},[652,1102,1103],{},[188,1104,1105],{},"legal.termsVersion",[652,1107,1108],{},[188,1109,855],{},[652,1111,1112,1113,1115],{},"The current terms version. Changing it asks every signed-in user to accept again. ",[188,1114,855],{}," records no acceptance.",[1026,1117,58],{"id":58},[631,1119,1120,1130],{},[634,1121,1122],{},[637,1123,1124,1126,1128],{},[640,1125,1038],{},[640,1127,1041],{},[640,1129,795],{},[647,1131,1132,1146,1164,1179,1207,1221,1239,1257,1278],{},[637,1133,1134,1139,1143],{},[652,1135,1136],{},[188,1137,1138],{},"payments.enabled",[652,1140,1141],{},[188,1142,978],{},[652,1144,1145],{},"Off bundles no provider and lets every paid check pass.",[637,1147,1148,1153,1158],{},[652,1149,1150],{},[188,1151,1152],{},"payments.identity",[652,1154,1155],{},[188,1156,1157],{},"'account'",[652,1159,1160,1163],{},[188,1161,1162],{},"'guest'"," also sells one-time plans to buyers without an account.",[637,1165,1166,1171,1176],{},[652,1167,1168],{},[188,1169,1170],{},"payments.modes",[652,1172,1173],{},[188,1174,1175],{},"['one-time', 'subscription']",[652,1177,1178],{},"The purchase shapes you sell.",[637,1180,1181,1186,1191],{},[652,1182,1183],{},[188,1184,1185],{},"payments.providers",[652,1187,1188],{},[188,1189,1190],{},"['stripe']",[652,1192,1193,1194,210,1197,210,1200,210,1203,1206],{},"Any of ",[188,1195,1196],{},"stripe",[188,1198,1199],{},"polar",[188,1201,1202],{},"lemonsqueezy",[188,1204,1205],{},"creem",". The first is the default.",[637,1208,1209,1214,1218],{},[652,1210,1211],{},[188,1212,1213],{},"payments.couponField",[652,1215,1216],{},[188,1217,978],{},[652,1219,1220],{},"Whether the hosted checkout shows its own code box.",[637,1222,1223,1228,1233],{},[652,1224,1225],{},[188,1226,1227],{},"payments.pastDueGraceDays",[652,1229,1230],{},[188,1231,1232],{},"14",[652,1234,1235,1236,1238],{},"Days a subscription keeps access after its first failed renewal. ",[188,1237,855],{}," ends access at once.",[637,1240,1241,1246,1251],{},[652,1242,1243],{},[188,1244,1245],{},"payments.gate",[652,1247,1248],{},[188,1249,1250],{},"'none'",[652,1252,1253,1256],{},[188,1254,1255],{},"'plan'"," locks an organization's pages until it holds a plan.",[637,1258,1259,1264,1275],{},[652,1260,1261],{},[188,1262,1263],{},"payments.plans",[652,1265,1266,210,1269,210,1272],{},[188,1267,1268],{},"pro",[188,1270,1271],{},"promax",[188,1273,1274],{},"lifetime",[652,1276,1277],{},"The catalogue: mode, currency, displayed prices, trial.",[637,1279,1280,1285,1288],{},[652,1281,1282],{},[188,1283,1284],{},"payments.adapters",[652,1286,1287],{},"none",[652,1289,1290,1291,241],{},"Declarations for a provider you add in ",[188,1292,1293],{},"server\u002Fpayments\u002Fadapters\u002Fcustom\u002F",[178,1295,1296,1297,241],{},"Details, provider setup and the ref variables are on ",[181,1298,59],{"href":62},[1026,1300,1301],{"id":1301},"access",[631,1303,1304,1314],{},[634,1305,1306],{},[637,1307,1308,1310,1312],{},[640,1309,1038],{},[640,1311,1041],{},[640,1313,795],{},[647,1315,1316,1339,1360,1379,1399],{},[637,1317,1318,1323,1336],{},[652,1319,1320],{},[188,1321,1322],{},"access.permissions",[652,1324,1325,210,1328,210,1330,210,1333],{},[188,1326,1327],{},"users:read",[188,1329,579],{},[188,1331,1332],{},"blog:author",[188,1334,1335],{},"insights:read",[652,1337,1338],{},"Every permission a route can check. A permission exists only if it is listed here.",[637,1340,1341,1346,1357],{},[652,1342,1343],{},[188,1344,1345],{},"access.rolePermissions",[652,1347,1348,210,1351,210,1354],{},[188,1349,1350],{},"user",[188,1352,1353],{},"staff",[188,1355,1356],{},"superadmin",[652,1358,1359],{},"The app roles, keyed by role, and the permissions each grants.",[637,1361,1362,1367,1372],{},[652,1363,1364],{},[188,1365,1366],{},"access.defaultRole",[652,1368,1369],{},[188,1370,1371],{},"'user'",[652,1373,1374,1375,1378],{},"What an unrecognised ",[188,1376,1377],{},"users.role"," value reads as. Make it the least privileged role.",[637,1380,1381,1386,1391],{},[652,1382,1383],{},[188,1384,1385],{},"access.firstAccountRole",[652,1387,1388],{},[188,1389,1390],{},"'superadmin'",[652,1392,1393,1394,704,1396,1398],{},"Granted to the first account that verifies its email while nobody holds ",[188,1395,579],{},[188,1397,855],{}," turns it off.",[637,1400,1401,1406,1411],{},[652,1402,1403],{},[188,1404,1405],{},"access.planPermissions",[652,1407,1408,1410],{},[188,1409,1335],{}," on each paid plan",[652,1412,1413,1414,1417],{},"The permissions each plan sells. ",[188,1415,1416],{},"free"," is an account with no plan.",[178,1419,1420,1421,241],{},"See ",[181,1422,1423],{"href":53},"Permissions",[1026,1425,1426],{"id":1426},"orgs",[631,1428,1429,1439],{},[634,1430,1431],{},[637,1432,1433,1435,1437],{},[640,1434,1038],{},[640,1436,1041],{},[640,1438,795],{},[647,1440,1441,1455,1469,1486,1510,1538,1553,1568,1586],{},[637,1442,1443,1448,1452],{},[652,1444,1445],{},[188,1446,1447],{},"orgs.enabled",[652,1449,1450],{},[188,1451,978],{},[652,1453,1454],{},"Off registers no organization route or page. The tables still ship.",[637,1456,1457,1461,1466],{},[652,1458,1459],{},[188,1460,592],{},[652,1462,1463],{},[188,1464,1465],{},"['organization']",[652,1467,1468],{},"The ownership levels, root first. One or two. Each id keys its label in the locale files.",[637,1470,1471,1476,1480],{},[652,1472,1473],{},[188,1474,1475],{},"orgs.createAtSignup",[652,1477,1478],{},[188,1479,978],{},[652,1481,1482,1483,1485],{},"Gives each new account an organization. ",[188,1484,855],{}," leaves it without one until it creates one or buys.",[637,1487,1488,1493,1507],{},[652,1489,1490],{},[188,1491,1492],{},"orgs.permissions",[652,1494,1495,210,1498,210,1501,210,1504],{},[188,1496,1497],{},"org:manage",[188,1499,1500],{},"org:members:manage",[188,1502,1503],{},"org:billing",[188,1505,1506],{},"org:scopes:manage",[652,1508,1509],{},"Every permission an org role can hold.",[637,1511,1512,1517,1528],{},[652,1513,1514],{},[188,1515,1516],{},"orgs.roles",[652,1518,1519,210,1522,210,1525],{},[188,1520,1521],{},"owner",[188,1523,1524],{},"admin",[188,1526,1527],{},"member",[652,1529,1530,1531,1534,1535,241],{},"Each role's ",[188,1532,1533],{},"permissions"," and the levels it can be held ",[188,1536,1537],{},"at",[637,1539,1540,1545,1550],{},[652,1541,1542],{},[188,1543,1544],{},"orgs.defaultRole",[652,1546,1547],{},[188,1548,1549],{},"'member'",[652,1551,1552],{},"The role the invitation form preselects.",[637,1554,1555,1560,1565],{},[652,1556,1557],{},[188,1558,1559],{},"orgs.ownerRole",[652,1561,1562],{},[188,1563,1564],{},"'owner'",[652,1566,1567],{},"The role an organization's creator gets, and the one the last-owner guard counts.",[637,1569,1570,1575,1580],{},[652,1571,1572],{},[188,1573,1574],{},"orgs.invitations",[652,1576,1577],{},[188,1578,1579],{},"{ expiryHours: 336, maxPending: 50 }",[652,1581,1582,1583,1585],{},"How long an invitation stays valid and how many can be open per organization. ",[188,1584,855],{}," turns invitations off.",[637,1587,1588,1593,1599],{},[652,1589,1590],{},[188,1591,1592],{},"orgs.seatLimits",[652,1594,1595,1596,1598],{},"free 3, pro 10, promax ",[188,1597,855],{},", lifetime 10",[652,1600,1601,1602,1604],{},"Members each plan admits. ",[188,1603,855],{}," is unlimited. The highest limit among the plans held applies.",[178,1606,1420,1607,241],{},[181,1608,49],{"href":48},[1026,1610,1611],{"id":1611},"auth",[631,1613,1614,1624],{},[634,1615,1616],{},[637,1617,1618,1620,1622],{},[640,1619,1038],{},[640,1621,1041],{},[640,1623,795],{},[647,1625,1626,1640,1663,1697,1711,1735],{},[637,1627,1628,1633,1637],{},[652,1629,1630],{},[188,1631,1632],{},"auth.enabled",[652,1634,1635],{},[188,1636,978],{},[652,1638,1639],{},"Off registers no auth route.",[637,1641,1642,1647,1652],{},[652,1643,1644],{},[188,1645,1646],{},"auth.primary",[652,1648,1649],{},[188,1650,1651],{},"'password'",[652,1653,1654,210,1656,1659,1660,1662],{},[188,1655,1651],{},[188,1657,1658],{},"'passwordless'"," for magic links, or ",[188,1661,1250],{}," for OAuth only.",[637,1664,1665,1670,1675],{},[652,1666,1667],{},[188,1668,1669],{},"auth.oauth",[652,1671,1672],{},[188,1673,1674],{},"[]",[652,1676,1193,1677,210,1680,210,1683,1686,1687,218,1690,1693,1694,241],{},[188,1678,1679],{},"github",[188,1681,1682],{},"google",[188,1684,1685],{},"microsoft",". Each needs ",[188,1688,1689],{},"NUXT_OAUTH_\u003CPROVIDER>_CLIENT_ID",[188,1691,1692],{},"_CLIENT_SECRET",", and Microsoft also ",[188,1695,1696],{},"NUXT_OAUTH_MICROSOFT_TENANT",[637,1698,1699,1704,1708],{},[652,1700,1701],{},[188,1702,1703],{},"auth.totp",[652,1705,1706],{},[188,1707,978],{},[652,1709,1710],{},"Authenticator-app codes as a second factor.",[637,1712,1713,1718,1723],{},[652,1714,1715],{},[188,1716,1717],{},"auth.passkey",[652,1719,1720],{},[188,1721,1722],{},"'login'",[652,1724,1725,1727,1728,1731,1732,1734],{},[188,1726,1722],{}," signs in with a passkey alone, ",[188,1729,1730],{},"'second-factor'"," only confirms a session, ",[188,1733,855],{}," turns passkeys off.",[637,1736,1737,1742,1746],{},[652,1738,1739],{},[188,1740,1741],{},"auth.emailVerification",[652,1743,1744],{},[188,1745,978],{},[652,1747,1748,1749,1752],{},"A password signup confirms its address before it can buy, invite or add a way to sign in. Ignored otherwise; ",[188,1750,1751],{},"passwordless"," always waits for proof.",[178,1754,1420,1755,241],{},[181,1756,44],{"href":43},[1026,1758,1760],{"id":1759},"email-contact-and-ai","email, contact and ai",[631,1762,1763,1773],{},[634,1764,1765],{},[637,1766,1767,1769,1771],{},[640,1768,1038],{},[640,1770,1041],{},[640,1772,795],{},[647,1774,1775,1789,1813,1830,1855,1869,1892,1907],{},[637,1776,1777,1782,1786],{},[652,1778,1779],{},[188,1780,1781],{},"email.enabled",[652,1783,1784],{},[188,1785,978],{},[652,1787,1788],{},"Off, magic links and password resets are logged in development and refused in production.",[637,1790,1791,1796,1801],{},[652,1792,1793],{},[188,1794,1795],{},"email.providers",[652,1797,1798],{},[188,1799,1800],{},"['cloudflare']",[652,1802,1803,1805,1806,1808,1809,1812],{},[188,1804,552],{}," (the ",[188,1807,556],{}," binding) and ",[188,1810,1811],{},"resend",", in delivery order. A later provider only gets a failed send.",[637,1814,1815,1820,1824],{},[652,1816,1817],{},[188,1818,1819],{},"contact.enabled",[652,1821,1822],{},[188,1823,978],{},[652,1825,1826,1827,1829],{},"Off drops ",[188,1828,878],{}," and both its routes, and every support link renders nothing.",[637,1831,1832,1837,1842],{},[652,1833,1834],{},[188,1835,1836],{},"contact.channels",[652,1838,1839],{},[188,1840,1841],{},"['form', 'reveal']",[652,1843,1844,1847,1848,1851,1852,1854],{},[188,1845,1846],{},"form"," mails you a message, ",[188,1849,1850],{},"reveal"," shows your address after a Turnstile check. At least one; ",[188,1853,1846],{}," needs email on.",[637,1856,1857,1862,1866],{},[652,1858,1859],{},[188,1860,1861],{},"ai.enabled",[652,1863,1864],{},[188,1865,978],{},[652,1867,1868],{},"Turns on the model-call layer. Nothing in the kit calls a model.",[637,1870,1871,1876,1881],{},[652,1872,1873],{},[188,1874,1875],{},"ai.providers",[652,1877,1878],{},[188,1879,1880],{},"['workersai']",[652,1882,1883,1884,1886,1887,1889,1890,241],{},"In fallback order. ",[188,1885,564],{}," is the ",[188,1888,111],{}," binding in ",[188,1891,258],{},[637,1893,1894,1899,1904],{},[652,1895,1896],{},[188,1897,1898],{},"ai.gateway",[652,1900,1901],{},[188,1902,1903],{},"'default'",[652,1905,1906],{},"The AI Gateway every call goes through. Third-party models are refused without one.",[637,1908,1909,1914,1917],{},[652,1910,1911],{},[188,1912,1913],{},"ai.roles",[652,1915,1916],{},"one per modality",[652,1918,1530,1919,1922,1923,1926],{},[188,1920,1921],{},"modality"," and its model per provider. ",[188,1924,1925],{},"NUXT_AI_\u003CPROVIDER>_MODELS_\u003CROLE>"," overrides a model per deploy.",[178,1928,1929,218,1932,1935,1936,1939,1940,210,1942,1944,1945,241],{},[188,1930,1931],{},"email.adapters",[188,1933,1934],{},"ai.adapters"," declare a provider you drop into that part's\n",[188,1937,1938],{},"adapters\u002Fcustom\u002F",". See ",[181,1941,86],{"href":85},[181,1943,91],{"href":90}," and\n",[181,1946,111],{"href":110},[1026,1948,1950],{"id":1949},"i18n-and-flags","i18n and flags",[631,1952,1953,1963],{},[634,1954,1955],{},[637,1956,1957,1959,1961],{},[640,1958,1038],{},[640,1960,1041],{},[640,1962,795],{},[647,1964,1965,1984,2019,2033,2048,2072,2087,2105],{},[637,1966,1967,1972,1977],{},[652,1968,1969],{},[188,1970,1971],{},"i18n.defaultLocale",[652,1973,1974],{},[188,1975,1976],{},"'en'",[652,1978,1979,1980,1983],{},"Served at the root. Every other locale gets a ",[188,1981,1982],{},"\u002F\u003Ccode>"," prefix.",[637,1985,1986,1991,1999],{},[652,1987,1988],{},[188,1989,1990],{},"i18n.locales",[652,1992,1993,210,1996],{},[188,1994,1995],{},"en",[188,1997,1998],{},"sr",[652,2000,2001,2002,2004,2005,2008,2009,2012,2013,2016,2017,241],{},"Each has a ",[188,2003,188],{},", a BCP 47 ",[188,2006,2007],{},"language",", a ",[188,2010,2011],{},"name"," written in that language, and its ",[188,2014,2015],{},"file"," in ",[188,2018,261],{},[637,2020,2021,2026,2030],{},[652,2022,2023],{},[188,2024,2025],{},"flags.enabled",[652,2027,2028],{},[188,2029,855],{},[652,2031,2032],{},"Turns on feature flags.",[637,2034,2035,2040,2045],{},[652,2036,2037],{},[188,2038,2039],{},"flags.providers",[652,2041,2042],{},[188,2043,2044],{},"['selfhosted']",[652,2046,2047],{},"In order. The first provider that knows a flag answers, and the declared default is the last resort.",[637,2049,2050,2055,2060],{},[652,2051,2052],{},[188,2053,2054],{},"flags.driver",[652,2056,2057],{},[188,2058,2059],{},"'kv'",[652,2061,875,2062,2065,2066,614,2069,241],{},[188,2063,2064],{},"selfhosted"," reads its JSON document: ",[188,2067,2068],{},"kv",[188,2070,2071],{},"r2",[637,2073,2074,2079,2084],{},[652,2075,2076],{},[188,2077,2078],{},"flags.key",[652,2080,2081],{},[188,2082,2083],{},"'flags.json'",[652,2085,2086],{},"The KV key or R2 object key of that document.",[637,2088,2089,2094,2099],{},[652,2090,2091],{},[188,2092,2093],{},"flags.purpose",[652,2095,2096],{},[188,2097,2098],{},"'avatars'",[652,2100,2101,2102,2104],{},"The storage purpose whose bucket the ",[188,2103,2071],{}," driver reads.",[637,2106,2107,2112,2120],{},[652,2108,2109],{},[188,2110,2111],{},"flags.declarations",[652,2113,2114,210,2117],{},[188,2115,2116],{},"maintenance",[188,2118,2119],{},"newPricing",[652,2121,2122,2123,218,2126,241],{},"Every flag, with its ",[188,2124,2125],{},"type",[188,2127,2128],{},"default",[178,2130,1420,2131,218,2133,241],{},[181,2132,149],{"href":148},[181,2134,106],{"href":105},[1026,2136,2138],{"id":2137},"notifications-storage-account-queue","notifications, storage, account, queue",[631,2140,2141,2151],{},[634,2142,2143],{},[637,2144,2145,2147,2149],{},[640,2146,1038],{},[640,2148,1041],{},[640,2150,795],{},[647,2152,2153,2169,2186,2226,2243],{},[637,2154,2155,2160,2164],{},[652,2156,2157],{},[188,2158,2159],{},"notifications.enabled",[652,2161,2162],{},[188,2163,978],{},[652,2165,2166,2167,778],{},"The dashboard bell and its table (",[181,2168,96],{"href":95},[637,2170,2171,2176,2181],{},[652,2172,2173],{},[188,2174,2175],{},"notifications.retentionDays",[652,2177,2178],{},[188,2179,2180],{},"30",[652,2182,2183,2184,1063],{},"Days to keep a notification after it is read. Unread ones stay. ",[188,2185,855],{},[637,2187,2188,2193,2201],{},[652,2189,2190],{},[188,2191,2192],{},"storage.purposes",[652,2194,2195,210,2198],{},[188,2196,2197],{},"avatars",[188,2199,2200],{},"org-avatars",[652,2202,2203,2204,218,2207,210,2210,210,2213,210,2216,210,2219,210,2221,1096,2224,778],{},"One entry per kind of upload: R2 ",[188,2205,2206],{},"binding",[188,2208,2209],{},"bucket",[188,2211,2212],{},"formats",[188,2214,2215],{},"maxBytes",[188,2217,2218],{},"noun",[188,2220,1301],{},[188,2222,2223],{},"cacheControl",[181,2225,101],{"href":100},[637,2227,2228,2233,2237],{},[652,2229,2230],{},[188,2231,2232],{},"account.deletionGraceDays",[652,2234,2235],{},[188,2236,2180],{},[652,2238,2239,2240,2242],{},"Days a deleted account can still be restored. ",[188,2241,855],{}," deletes at once.",[637,2244,2245,2250,2254],{},[652,2246,2247],{},[188,2248,2249],{},"queue.enabled",[652,2251,2252],{},[188,2253,978],{},[652,2255,2256,2257,778],{},"Background jobs on Cloudflare Queues. Off, callers do the work inline (",[181,2258,76],{"href":75},[1026,2260,2262],{"id":2261},"monitoring-analytics-marketing-socialproof","monitoring, analytics, marketing, socialProof",[631,2264,2265,2275],{},[634,2266,2267],{},[637,2268,2269,2271,2273],{},[640,2270,1038],{},[640,2272,1041],{},[640,2274,795],{},[647,2276,2277,2293,2316,2332,2355,2377,2401,2427,2441,2466,2484,2511,2526,2541,2556,2571],{},[637,2278,2279,2284,2288],{},[652,2280,2281],{},[188,2282,2283],{},"monitoring.enabled",[652,2285,2286],{},[188,2287,855],{},[652,2289,2290,2291,778],{},"Forwards server faults to error trackers (",[181,2292,135],{"href":134},[637,2294,2295,2300,2305],{},[652,2296,2297],{},[188,2298,2299],{},"monitoring.providers",[652,2301,2302],{},[188,2303,2304],{},"['sentry']",[652,2306,2307,218,2310,1686,2313,241],{},[188,2308,2309],{},"sentry",[188,2311,2312],{},"betterstack",[188,2314,2315],{},"NUXT_MONITORING_\u003CPROVIDER>_DSN",[637,2317,2318,2323,2327],{},[652,2319,2320],{},[188,2321,2322],{},"analytics.enabled",[652,2324,2325],{},[188,2326,978],{},[652,2328,2329,2330,778],{},"Server-side analytics (",[181,2331,130],{"href":129},[637,2333,2334,2339,2343],{},[652,2335,2336],{},[188,2337,2338],{},"analytics.providers",[652,2340,2341],{},[188,2342,1800],{},[652,2344,2345,2347,2348,210,2351,2354],{},[188,2346,552],{}," (Workers Analytics Engine), ",[188,2349,2350],{},"umami",[188,2352,2353],{},"posthog",". Every event goes to each one.",[637,2356,2357,2362,2367],{},[652,2358,2359],{},[188,2360,2361],{},"analytics.ingestPath",[652,2363,2364],{},[188,2365,2366],{},"'\u002Fapi\u002Fe'",[652,2368,2369,2370,614,2373,2376],{},"The page-view beacon's route. Words that blockers match, such as ",[188,2371,2372],{},"track",[188,2374,2375],{},"analytic",", fail the build.",[637,2378,2379,2384,2389],{},[652,2380,2381],{},[188,2382,2383],{},"analytics.pageviews",[652,2385,2386],{},[188,2387,2388],{},"'ssr+beacon'",[652,2390,2391,2394,2395,2397,2398,2400],{},[188,2392,2393],{},"'ssr'"," counts document requests, ",[188,2396,2388],{}," adds client navigations, ",[188,2399,855],{}," counts none.",[637,2402,2403,2408,2413],{},[652,2404,2405],{},[188,2406,2407],{},"analytics.consent",[652,2409,2410],{},[188,2411,2412],{},"'implied'",[652,2414,2415,2418,2419,2422,2423,2426],{},[188,2416,2417],{},"'explicit'"," sends nothing until an ",[188,2420,2421],{},"_ac=1"," cookie is set. ",[188,2424,2425],{},"_ac=0"," stops sending under either.",[637,2428,2429,2434,2438],{},[652,2430,2431],{},[188,2432,2433],{},"marketing.enabled",[652,2435,2436],{},[188,2437,855],{},[652,2439,2440],{},"Server-side conversion events. With a provider listed, the consent banner ships.",[637,2442,2443,2448,2452],{},[652,2444,2445],{},[188,2446,2447],{},"marketing.providers",[652,2449,2450],{},[188,2451,1674],{},[652,2453,1193,2454,210,2457,210,2460,210,2463,241],{},[188,2455,2456],{},"meta",[188,2458,2459],{},"tiktok",[188,2461,2462],{},"x",[188,2464,2465],{},"reddit",[637,2467,2468,2473,2477],{},[652,2469,2470],{},[188,2471,2472],{},"socialProof.enabled",[652,2474,2475],{},[188,2476,978],{},[652,2478,2479,2480,2483],{},"Recent-purchase cards on public pages, drawn from real ",[188,2481,2482],{},"payment_events"," rows only.",[637,2485,2486,2491,2496],{},[652,2487,2488],{},[188,2489,2490],{},"socialProof.identity",[652,2492,2493],{},[188,2494,2495],{},"'first-name+country'",[652,2497,2498,2499,210,2501,210,2504,614,2507,2510],{},"What a card names: ",[188,2500,1287],{},[188,2502,2503],{},"country",[188,2505,2506],{},"first-name",[188,2508,2509],{},"first-name+country",". When a buyer's consent or data for a level is missing, the card falls back down that list.",[637,2512,2513,2518,2523],{},[652,2514,2515],{},[188,2516,2517],{},"socialProof.windowHours",[652,2519,2520],{},[188,2521,2522],{},"72",[652,2524,2525],{},"How far back a purchase counts.",[637,2527,2528,2533,2538],{},[652,2529,2530],{},[188,2531,2532],{},"socialProof.minEvents",[652,2534,2535],{},[188,2536,2537],{},"5",[652,2539,2540],{},"Below this many purchases in the window, nothing shows.",[637,2542,2543,2548,2553],{},[652,2544,2545],{},[188,2546,2547],{},"socialProof.maxPerSession",[652,2549,2550],{},[188,2551,2552],{},"4",[652,2554,2555],{},"Cards one visitor sees per browser session.",[637,2557,2558,2563,2568],{},[652,2559,2560],{},[188,2561,2562],{},"socialProof.intervalRange",[652,2564,2565],{},[188,2566,2567],{},"[30, 90]",[652,2569,2570],{},"Seconds between cards, drawn from this range.",[637,2572,2573,2578,2583],{},[652,2574,2575],{},[188,2576,2577],{},"socialProof.routes",[652,2579,2580],{},[188,2581,2582],{},"['\u002F', '\u002Fpricing']",[652,2584,2585],{},"Path prefixes the cards appear on, without the locale prefix.",[193,2587,2589],{"id":2588},"good-to-know","Good to know",[533,2591,2592,2595,2615,2628,2639],{},[201,2593,2594],{},"App code imports this file, so it ships in the browser bundle. Never put a\nsecret in it.",[201,2596,2597,2598,2600,2601,214,2604,218,2607,2610,2611,218,2613,241],{},"Ids that end up in a variable name must match ",[188,2599,613],{},": plan ids,\nAI role ids and the file name of a custom adapter. Nitro maps ",[188,2602,2603],{},"proMax",[188,2605,2606],{},"pro-max",[188,2608,2609],{},"pro_max"," to the same variable, which is why the config says\n",[188,2612,1271],{},[188,2614,564],{},[201,2616,2617,2618,2621,2622,2624,2625,2627],{},"A slot exists only for a provider that was listed when you built. Setting\n",[188,2619,2620],{},"NUXT_PAYMENTS_POLAR_SECRET_KEY"," does nothing until ",[188,2623,1199],{}," is in\n",[188,2626,1185],{}," and the app is rebuilt.",[201,2629,2630,2631,2634,2635,2638],{},"Values pass through ",[188,2632,2633],{},"destr",", and an empty line such as\n",[188,2636,2637],{},"NUXT_PAYMENTS_STRIPE_REFS_PRO_MONTH="," sets an empty string over the default.\nComment out lines you don't use.",[201,2640,2641,2642,704,2644,210,2647,218,2650,2016,2653,2656],{},"A new plan, app role or org level also needs its copy in every file in\n",[188,2643,261],{},[188,2645,2646],{},"plan-copy",[188,2648,2649],{},"role-copy",[188,2651,2652],{},"org-copy",[188,2654,2655],{},"test\u002Funit\u002F","\nfail until it is there.",[2658,2659,2660],"style",{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}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);}",{"title":313,"searchDepth":17,"depth":17,"links":2662},[2663,2664,2665,2666,2667,2678],{"id":195,"depth":17,"text":196},{"id":302,"depth":17,"text":303},{"id":488,"depth":17,"text":489},{"id":621,"depth":17,"text":622},{"id":1020,"depth":17,"text":1021,"children":2668},[2669,2670,2671,2672,2673,2674,2675,2676,2677],{"id":1028,"depth":22,"text":1029},{"id":58,"depth":22,"text":58},{"id":1301,"depth":22,"text":1301},{"id":1426,"depth":22,"text":1426},{"id":1611,"depth":22,"text":1611},{"id":1759,"depth":22,"text":1760},{"id":1949,"depth":22,"text":1950},{"id":2137,"depth":22,"text":2138},{"id":2261,"depth":22,"text":2262},{"id":2588,"depth":17,"text":2589},[2680,2681],{"path":14,"title":15,"description":16,"navTitle":15,"group":6,"order":17},{"path":24,"title":25,"description":26,"navTitle":25,"group":6,"order":27}]