[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-navigation":3,"docs-page-blog":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":1906,"linksToKit":392},{"path":143,"title":144,"description":145,"navTitle":144,"group":140,"seo":168,"body":170},{"title":169,"description":145},"Nuxt blog with RSS and AI-drafted posts",{"type":171,"value":172,"toc":1893},"minimark",[173,177,194,199,259,263,274,399,446,453,457,475,501,508,541,544,548,551,597,603,636,716,731,745,756,784,796,800,810,865,885,889,912,919,957,988,992,1032,1045,1093,1097,1103,1146,1180,1194,1238,1258,1262,1275,1393,1399,1402,1809,1813,1890],[174,175,144],"h1",{"id":176},"blog",[178,179,180,181,185,186,189,190,193],"p",{},"The blog is Nuxt Content: Markdown posts in ",[182,183,184],"code",{},"content\u002F\u003Clocale>\u002Fblog\u002F",", served at\n",[182,187,188],{},"\u002Fblog"," and ",[182,191,192],{},"\u002F\u003Clocale>\u002Fblog",", with an RSS feed per language. Two GitHub\nworkflows can also write posts with an AI model and open each one as a pull\nrequest. You work here when you write or review posts, set the byline, or tune\nthe generator.",[195,196,198],"h2",{"id":197},"how-it-works","How it works",[200,201,202,224,235,242,252],"ol",{},[203,204,205,215,216,219,220,223],"li",{},[206,207,212],"a",{"href":208,"rel":209,"title":211},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fcontent.config.ts",[210],"nofollow","Licensees only",[182,213,214],{},"content.config.ts"," defines a ",[182,217,218],{},"blog_\u003Clocale>","\ncollection for every locale in ",[182,221,222],{},"i18n.locales"," and validates each post's\nfrontmatter.",[203,225,226,227,234],{},"The pages in ",[206,228,231],{"href":229,"rel":230,"title":211},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Ftree\u002Fmain\u002Fapp\u002Fpages\u002Fblog",[210],[182,232,233],{},"app\u002Fpages\u002Fblog\u002F"," list posts, render a\npost, and list posts per tag. Route rules cache them for an hour,\nstale-while-revalidate.",[203,236,237,238,241],{},"The byline comes from an account in your database, named by\n",[182,239,240],{},"NUXT_BLOG_AUTHOR_EMAIL",", unless a post names its own author.",[203,243,244,247,248,251],{},[182,245,246],{},"\u002Fblog\u002Frss.xml",", and ",[182,249,250],{},"\u002F\u003Clocale>\u002Fblog\u002Frss.xml"," for every other locale, list\nthe 50 newest posts.",[203,253,254,255,258],{},"The ",[182,256,257],{},"blog-post"," workflow writes a post in every language through Cloudflare\nAI Gateway, draws a cover, uploads it to Cloudflare Images and opens a pull\nrequest. Nothing is published until you merge it.",[195,260,262],{"id":261},"write-a-post","Write a post",[178,264,265,266,269,270,273],{},"The file name is the slug. ",[182,267,268],{},"content\u002Fen\u002Fblog\u002Ffirst-release.md"," is served at\n",[182,271,272],{},"\u002Fblog\u002Ffirst-release",":",[275,276,281],"pre",{"className":277,"code":278,"language":279,"meta":280,"style":280},"language-md shiki shiki-themes github-light github-light github-dark","---\ntitle: Shipping the first release\ndescription: What went into 1.0, and what we cut to get there.\nimage:\n  src: https:\u002F\u002Fimagedelivery.net\u002F\u003Chash>\u002F\u003Cimage-id>\u002Fw=1200,h=630,fit=cover\n  alt: A cardboard box on a loading dock at dawn.\ncreatedAt: 2026-09-28\nupdatedAt: 2026-09-28\ntags:\n  - release\n  - product\n---\n\nThe body is Markdown with MDC components.\n","md","",[182,282,283,291,304,314,322,332,342,353,362,369,377,384,388,394],{"__ignoreMap":280},[284,285,287],"span",{"class":286,"line":12},"line",[284,288,290],{"class":289},"sxrX7","---\n",[284,292,293,297,300],{"class":286,"line":17},[284,294,296],{"class":295},"sovSZ","title",[284,298,299],{"class":289},": ",[284,301,303],{"class":302},"sIIMD","Shipping the first release\n",[284,305,306,309,311],{"class":286,"line":22},[284,307,308],{"class":295},"description",[284,310,299],{"class":289},[284,312,313],{"class":302},"What went into 1.0, and what we cut to get there.\n",[284,315,316,319],{"class":286,"line":27},[284,317,318],{"class":295},"image",[284,320,321],{"class":289},":\n",[284,323,324,327,329],{"class":286,"line":32},[284,325,326],{"class":295},"  src",[284,328,299],{"class":289},[284,330,331],{"class":302},"https:\u002F\u002Fimagedelivery.net\u002F\u003Chash>\u002F\u003Cimage-id>\u002Fw=1200,h=630,fit=cover\n",[284,333,334,337,339],{"class":286,"line":37},[284,335,336],{"class":295},"  alt",[284,338,299],{"class":289},[284,340,341],{"class":302},"A cardboard box on a loading dock at dawn.\n",[284,343,344,347,349],{"class":286,"line":46},[284,345,346],{"class":295},"createdAt",[284,348,299],{"class":289},[284,350,352],{"class":351},"sBjJW","2026-09-28\n",[284,354,355,358,360],{"class":286,"line":51},[284,356,357],{"class":295},"updatedAt",[284,359,299],{"class":289},[284,361,352],{"class":351},[284,363,364,367],{"class":286,"line":56},[284,365,366],{"class":295},"tags",[284,368,321],{"class":289},[284,370,371,374],{"class":286,"line":64},[284,372,373],{"class":289},"  - ",[284,375,376],{"class":302},"release\n",[284,378,379,381],{"class":286,"line":73},[284,380,373],{"class":289},[284,382,383],{"class":302},"product\n",[284,385,386],{"class":286,"line":78},[284,387,290],{"class":289},[284,389,390],{"class":286,"line":83},[284,391,393],{"emptyLinePlaceholder":392},true,"\n",[284,395,396],{"class":286,"line":88},[284,397,398],{"class":289},"The body is Markdown with MDC components.\n",[400,401,402,412,418,425],"ul",{},[203,403,404,407,408,411],{},[182,405,406],{},"draft: true"," keeps a post out of the listing, the tag pages, the feed and\nthe sitemap. Its URL still renders, with ",[182,409,410],{},"noindex",".",[203,413,414,417],{},[182,415,416],{},"readingTime"," is minutes and optional. The generator fills it in.",[203,419,420,189,422,424],{},[182,421,346],{},[182,423,357],{}," are days, and the pages render them in UTC, so\nevery reader sees the same date.",[203,426,427,430,431,434,435,438,439,411],{},[182,428,429],{},"image.src"," is a Cloudflare Images delivery URL or a path under ",[182,432,433],{},"public\u002F",", as\nin the sample post. An Images URL gets a blurred placeholder and a smaller\nthumbnail on the cards, using the variants in ",[182,436,437],{},"blogImages"," in\n",[206,440,443],{"href":441,"rel":442,"title":211},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fapp\u002Fapp.config.ts",[210],[182,444,445],{},"app\u002Fapp.config.ts",[178,447,448,449,452],{},"Translate a post by adding the same file name under ",[182,450,451],{},"content\u002Fsr\u002Fblog\u002F",". A post\nwith no translation is served from the default locale at the prefixed URL, and\nlisted there too.",[195,454,456],{"id":455},"set-the-byline","Set the byline",[275,458,462],{"className":459,"code":460,"language":461,"meta":280,"style":280},"language-sh shiki shiki-themes github-light github-light github-dark","NUXT_BLOG_AUTHOR_EMAIL=you@example.com\n","sh",[182,463,464],{"__ignoreMap":280},[284,465,466,468,472],{"class":286,"line":12},[284,467,240],{"class":289},[284,469,471],{"class":470},"s8jYJ","=",[284,473,474],{"class":302},"you@example.com\n",[178,476,477,478,481,482,189,485,488,489,492,493,496,497,500],{},"Every post shows that account's name and the avatar it uploaded, so renaming\nthe account or changing its photo updates every post. The account's role must\ngrant ",[182,479,480],{},"blog:author",", which ",[182,483,484],{},"staff",[182,486,487],{},"superadmin"," do in the shipped\n",[182,490,491],{},"access.rolePermissions",". If the address has no account, or the role lacks the\npermission, a post shows a byline only when its frontmatter names an author.\n",[182,494,495],{},"pnpm dev"," logs a ",[182,498,499],{},"[blog]"," warning saying which case it is. The variable is read at\nstartup, so restart the dev server after changing it.",[178,502,503,504,507],{},"A guest post carries an ",[182,505,506],{},"author"," block, which wins over the account:",[275,509,513],{"className":510,"code":511,"language":512,"meta":280,"style":280},"language-yaml shiki shiki-themes github-light github-light github-dark","author:\n  name: Ada Lovelace\n  to: https:\u002F\u002Fexample.com\u002Fada\n","yaml",[182,514,515,521,531],{"__ignoreMap":280},[284,516,517,519],{"class":286,"line":12},[284,518,506],{"class":295},[284,520,321],{"class":289},[284,522,523,526,528],{"class":286,"line":17},[284,524,525],{"class":295},"  name",[284,527,299],{"class":289},[284,529,530],{"class":302},"Ada Lovelace\n",[284,532,533,536,538],{"class":286,"line":22},[284,534,535],{"class":295},"  to",[284,537,299],{"class":289},[284,539,540],{"class":302},"https:\u002F\u002Fexample.com\u002Fada\n",[178,542,543],{},"A guest byline shows initials. There is no avatar field, because the content\nsecurity policy admits images only from the app and the Images delivery host.",[195,545,547],{"id":546},"generate-posts-with-ai","Generate posts with AI",[178,549,550],{},"Set this up once:",[200,552,553,564,581,587,594],{},[203,554,555,556,559,560,563],{},"Add the repository secrets ",[182,557,558],{},"CLOUDFLARE_API_TOKEN"," and\n",[182,561,562],{},"CLOUDFLARE_ACCOUNT_ID",", the same two the deploy workflow uses. The token\nneeds the Workers AI, AI Gateway and Images permissions.",[203,565,566,567,570,571,438,574,411],{},"Add the repository variable ",[182,568,569],{},"CLOUDFLARE_IMAGES_ACCOUNT_HASH",", from Images →\nOverview, or set ",[182,572,573],{},"images.accountHash",[206,575,578],{"href":576,"rel":577,"title":211},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fscripts\u002Fblog\u002Fblog.config.mjs",[210],[182,579,580],{},"scripts\u002Fblog\u002Fblog.config.mjs",[203,582,583,584,411],{},"Turn on flexible variants under Images → Variants. Cover URLs end in a\nvariant string such as ",[182,585,586],{},"w=1200,h=630,fit=cover",[203,588,589,590,593],{},"Load credits under AI Gateway → Credits. The default models, Claude Opus\nand Grok Imagine, are billed to your Cloudflare account through Unified\nBilling, which is prepaid. Workers AI models (",[182,591,592],{},"workers-ai\u002F@cf\u002F…",") are billed\nas ordinary Workers AI usage and need no credits.",[203,595,596],{},"Turn on Settings → Actions → General → Allow GitHub Actions to create and\napprove pull requests.",[178,598,599,600,602],{},"Then run Actions → ",[182,601,257],{}," → Run workflow, or from a terminal:",[275,604,608],{"className":605,"code":606,"language":607,"meta":280,"style":280},"language-bash shiki shiki-themes github-light github-light github-dark","gh workflow run blog-post -f topics=\"Caching on Workers; Picking a payment provider\" -f style=isometric\n","bash",[182,609,610],{"__ignoreMap":280},[284,611,612,616,619,622,625,628,631,633],{"class":286,"line":12},[284,613,615],{"class":614},"snPdu","gh",[284,617,618],{"class":302}," workflow",[284,620,621],{"class":302}," run",[284,623,624],{"class":302}," blog-post",[284,626,627],{"class":351}," -f",[284,629,630],{"class":302}," topics=\"Caching on Workers; Picking a payment provider\"",[284,632,627],{"class":351},[284,634,635],{"class":302}," style=isometric\n",[637,638,639,652],"table",{},[640,641,642],"thead",{},[643,644,645,649],"tr",{},[646,647,648],"th",{},"Input",[646,650,651],{},"What it takes",[653,654,655,673,686,706],"tbody",{},[643,656,657,663],{},[658,659,660],"td",{},[182,661,662],{},"topics",[658,664,665,666,669,670],{},"One post per topic, separated by ",[182,667,668],{},";",". Empty lets the model pick one not already on ",[182,671,672],{},"main",[643,674,675,680],{},[658,676,677],{},[182,678,679],{},"style",[658,681,682,683],{},"A cover style from ",[182,684,685],{},"images.styles",[643,687,688,697],{},[658,689,690,693,694],{},[182,691,692],{},"text_model",", ",[182,695,696],{},"image_model",[658,698,699,700,189,703],{},"A model from ",[182,701,702],{},"models.text",[182,704,705],{},"models.image",[643,707,708,713],{},[658,709,710],{},[182,711,712],{},"dry_run",[658,714,715],{},"Writes fixture posts without calling any API",[178,717,718,719,722,723,726,727,730],{},"Each topic runs as its own job, one after another, and opens a pull request\nfrom ",[182,720,721],{},"blog\u002F\u003Cslug>"," holding ",[182,724,725],{},"content\u002F\u003Clocale>\u002Fblog\u002F\u003Cslug>.md"," for every locale\nin the generator's ",[182,728,729],{},"locales",". The pull request body shows the cover, the style\nand both models. The article, its translations and its metadata are all\nwritten before the cover is drawn, so a run that fails on the text never pays\nfor an image.",[178,732,733,734,737,738,411],{},"The workflow only runs when you start it. For a weekly post, add a ",[182,735,736],{},"schedule","\ntrigger to ",[206,739,742],{"href":740,"rel":741,"title":211},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fblog-post.yml",[210],[182,743,744],{},"blog-post.yml",[178,746,747,748,751,752,755],{},"To run the generator on your machine, put the two Cloudflare variables in\n",[182,749,750],{},".env",". It writes the files into ",[182,753,754],{},"content\u002F"," and opens no pull request:",[275,757,759],{"className":605,"code":758,"language":607,"meta":280,"style":280},"node --env-file-if-exists=.env scripts\u002Fblog\u002Fgenerate-post.mjs --topic \"Caching on Workers\" --style minimal\n",[182,760,761],{"__ignoreMap":280},[284,762,763,766,769,772,775,778,781],{"class":286,"line":12},[284,764,765],{"class":614},"node",[284,767,768],{"class":351}," --env-file-if-exists=.env",[284,770,771],{"class":302}," scripts\u002Fblog\u002Fgenerate-post.mjs",[284,773,774],{"class":351}," --topic",[284,776,777],{"class":302}," \"Caching on Workers\"",[284,779,780],{"class":351}," --style",[284,782,783],{"class":302}," minimal\n",[178,785,786,787,693,790,189,793,411],{},"It also takes ",[182,788,789],{},"--text-model",[182,791,792],{},"--image-model",[182,794,795],{},"--dry-run",[195,797,799],{"id":798},"regenerate-or-edit-a-post-under-review","Regenerate or edit a post under review",[178,801,802,803,806,807,809],{},"Run Actions → ",[182,804,805],{},"blog-post-regenerate"," with the pull request's branch\n(",[182,808,721],{},"), what to regenerate, and optional feedback for the prompt. It\ncommits to that branch, so the pull request updates in place.",[637,811,812,824],{},[640,813,814],{},[643,815,816,821],{},[646,817,818],{},[182,819,820],{},"regenerate",[646,822,823],{},"What it does",[653,825,826,836,845,855],{},[643,827,828,833],{},[658,829,830],{},[182,831,832],{},"article",[658,834,835],{},"Rewrites the post in every locale and keeps the cover",[643,837,838,842],{},[658,839,840],{},[182,841,318],{},[658,843,844],{},"Draws a new cover and rewrites its alt text in every locale",[643,846,847,852],{},[658,848,849],{},[182,850,851],{},"both",[658,853,854],{},"Both of the above",[643,856,857,862],{},[658,858,859],{},[182,860,861],{},"edit",[658,863,864],{},"Runs the editing skills over the post as it stands, with your feedback, and keeps any hand edits",[178,866,867,868,870,871,189,873,875,876,878,879,881,882,884],{},"A replaced cover is deleted from Images once the new one is on the branch.\n",[182,869,861],{}," leaves the cover alone and changes only ",[182,872,357],{},[182,874,416],{}," in\nthe frontmatter. To edit a post that is already merged, push a ",[182,877,721],{},"\nbranch from ",[182,880,672],{},", run ",[182,883,861],{}," on it, then open a pull request from that\nbranch.",[195,886,888],{"id":887},"add-an-editing-skill","Add an editing skill",[178,890,891,892,895,896,903,904,907,908,911],{},"After the article is written, and again after each translation, the generator\nruns the passes listed in ",[182,893,894],{},"article.skills",". Each is a folder in\n",[206,897,900],{"href":898,"rel":899,"title":211},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Ftree\u002Fmain\u002Fscripts\u002Fblog\u002Fskills",[210],[182,901,902],{},"scripts\u002Fblog\u002Fskills\u002F"," holding a ",[182,905,906],{},"SKILL.md",", which\nbecomes the system prompt of one call that edits the post. The kit ships\n",[182,909,910],{},"humanizer",", which removes common patterns of AI writing.",[178,913,914,915,918],{},"For a house style guide, write its rules into\n",[182,916,917],{},"scripts\u002Fblog\u002Fskills\u002Fhouse-style\u002FSKILL.md"," and add the folder name:",[275,920,924],{"className":921,"code":922,"language":923,"meta":280,"style":280},"language-js shiki shiki-themes github-light github-light github-dark","article: {\n  skills: ['humanizer', 'house-style'],\n},\n","js",[182,925,926,933,952],{"__ignoreMap":280},[284,927,928,930],{"class":286,"line":12},[284,929,832],{"class":614},[284,931,932],{"class":289},": {\n",[284,934,935,938,941,944,946,949],{"class":286,"line":17},[284,936,937],{"class":614},"  skills",[284,939,940],{"class":289},": [",[284,942,943],{"class":302},"'humanizer'",[284,945,693],{"class":289},[284,947,948],{"class":302},"'house-style'",[284,950,951],{"class":289},"],\n",[284,953,954],{"class":286,"line":22},[284,955,956],{"class":289},"},\n",[400,958,959,962,968,978,981],{},[203,960,961],{},"Passes run in array order, each on the previous one's output, so the pass\nthat should have the last word goes last.",[203,963,964,965,967],{},"Write the rules for editing a finished post. Frontmatter in ",[182,966,906],{}," is\ndropped, and nothing else in the folder is read or run.",[203,969,970,971,974,975,977],{},"A folder name must match ",[182,972,973],{},"\u002F^[a-z0-9][a-z0-9-]*$\u002F",". A missing or empty\n",[182,976,906],{}," stops the run before its first model call.",[203,979,980],{},"A pass that changes a fenced code block is discarded with a workflow warning,\nand the post keeps the text it had before that pass.",[203,982,983,984,987],{},"Each skill costs one call per locale that sends the skill and the whole\narticle. ",[182,985,986],{},"skills: []"," turns the passes off.",[195,989,991],{"id":990},"add-a-model-or-a-cover-style","Add a model or a cover style",[178,993,994,995,693,997,999,1000,1002,1003,1006,1007,1010,1011,559,1016,1023,1024,1031],{},"Add it to ",[182,996,702],{},[182,998,705],{}," or ",[182,1001,685],{}," in ",[182,1004,1005],{},"blog.config.mjs",",\nand to the matching ",[182,1008,1009],{},"options"," list in both\n",[206,1012,1014],{"href":740,"rel":1013,"title":211},[210],[182,1015,744],{},[206,1017,1020],{"href":1018,"rel":1019,"title":211},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fblog-post-regenerate.yml",[210],[182,1021,1022],{},"blog-post-regenerate.yml",".\nThe first entry is the default in each.\n",[206,1025,1028],{"href":1026,"rel":1027,"title":211},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Ftest\u002Funit\u002Fblog-workflow-choices.test.ts",[210],[182,1029,1030],{},"test\u002Funit\u002Fblog-workflow-choices.test.ts","\nfails when the config and the workflows disagree.",[178,1033,1034,1035,1038,1039,1044],{},"Models are named ",[182,1036,1037],{},"{provider}\u002F{model}"," from Cloudflare's\n",[206,1040,1043],{"href":1041,"rel":1042},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fai\u002Fmodels\u002F",[210],"model catalog",". An image model\nmaps to the parameters sent with it, unchanged:",[275,1046,1048],{"className":921,"code":1047,"language":923,"meta":280,"style":280},"image: {\n  'xai\u002Fgrok-imagine-image': { aspect_ratio: '16:9', response_format: 'b64_json' },\n  'workers-ai\u002F@cf\u002Fblack-forest-labs\u002Fflux-1-schnell': { steps: 8 },\n},\n",[182,1049,1050,1056,1076,1089],{"__ignoreMap":280},[284,1051,1052,1054],{"class":286,"line":12},[284,1053,318],{"class":614},[284,1055,932],{"class":289},[284,1057,1058,1061,1064,1067,1070,1073],{"class":286,"line":17},[284,1059,1060],{"class":302},"  'xai\u002Fgrok-imagine-image'",[284,1062,1063],{"class":289},": { aspect_ratio: ",[284,1065,1066],{"class":302},"'16:9'",[284,1068,1069],{"class":289},", response_format: ",[284,1071,1072],{"class":302},"'b64_json'",[284,1074,1075],{"class":289}," },\n",[284,1077,1078,1081,1084,1087],{"class":286,"line":22},[284,1079,1080],{"class":302},"  'workers-ai\u002F@cf\u002Fblack-forest-labs\u002Fflux-1-schnell'",[284,1082,1083],{"class":289},": { steps: ",[284,1085,1086],{"class":351},"8",[284,1088,1075],{"class":289},[284,1090,1091],{"class":286,"line":27},[284,1092,956],{"class":289},[195,1094,1096],{"id":1095},"upload-images-yourself","Upload images yourself",[178,1098,1099,1102],{},[182,1100,1101],{},"pnpm images:upload"," tags images the way the generator does and prints their\ndelivery URLs:",[275,1104,1106],{"className":605,"code":1105,"language":607,"meta":280,"style":280},"pnpm images:upload .\u002Fdiagram.png .\u002Fscreenshot.png\npnpm images:upload .\u002Fcover.png --kind cover --slug hello-world --replace\n",[182,1107,1108,1122],{"__ignoreMap":280},[284,1109,1110,1113,1116,1119],{"class":286,"line":12},[284,1111,1112],{"class":614},"pnpm",[284,1114,1115],{"class":302}," images:upload",[284,1117,1118],{"class":302}," .\u002Fdiagram.png",[284,1120,1121],{"class":302}," .\u002Fscreenshot.png\n",[284,1123,1124,1126,1128,1131,1134,1137,1140,1143],{"class":286,"line":17},[284,1125,1112],{"class":614},[284,1127,1115],{"class":302},[284,1129,1130],{"class":302}," .\u002Fcover.png",[284,1132,1133],{"class":351}," --kind",[284,1135,1136],{"class":302}," cover",[284,1138,1139],{"class":351}," --slug",[284,1141,1142],{"class":302}," hello-world",[284,1144,1145],{"class":351}," --replace\n",[178,1147,1148,1149,693,1151,1153,1154,1156,1157,1160,1161,1164,1165,1168,1169,1172,1173,1175,1176,1179],{},"It reads ",[182,1150,562],{},[182,1152,558],{}," and the account hash\nfrom ",[182,1155,750],{},". The token needs the Images permission, which a ",[182,1158,1159],{},"wrangler login","\nsession does not carry. ",[182,1162,1163],{},"--replace"," deletes the images already in that slot,\nmeaning the same ",[182,1166,1167],{},"--slug"," and the same ",[182,1170,1171],{},"--kind"," or none, and it takes one file\nand requires ",[182,1174,1167],{},". ",[182,1177,1178],{},"--variant"," changes the variant in the printed URL.",[178,1181,1182,1183,1186,1187,189,1190,1193],{},"Every image gets an id from Cloudflare, your project id as its ",[182,1184,1185],{},"creator",", and\n",[182,1188,1189],{},"kind",[182,1191,1192],{},"slug"," as metadata. List Images V2 finds them:",[637,1195,1196,1206],{},[640,1197,1198],{},[643,1199,1200,1203],{},[646,1201,1202],{},"To find",[646,1204,1205],{},"Query",[653,1207,1208,1218,1228],{},[643,1209,1210,1213],{},[658,1211,1212],{},"Every image of this project",[658,1214,1215],{},[182,1216,1217],{},"?creator=\u003Cproject-id>",[643,1219,1220,1223],{},[658,1221,1222],{},"Every blog cover",[658,1224,1225],{},[182,1226,1227],{},"&meta.kind[eq]=cover",[643,1229,1230,1233],{},[658,1231,1232],{},"One post's images",[658,1234,1235],{},[182,1236,1237],{},"&meta.slug[eq]=\u003Cslug>",[178,1239,1240,1241,1244,1245,1002,1248,1250,1251,1002,1254,1257],{},"The project id is ",[182,1242,1243],{},"BLOG_PROJECT_ID",", then ",[182,1246,1247],{},"projectId",[182,1249,1005],{},",\nthen ",[182,1252,1253],{},"name",[182,1255,1256],{},"package.json",". An image dragged into the dashboard carries no\ntags and never shows up in these queries.",[195,1259,1261],{"id":1260},"remove-the-blog","Remove the blog",[178,1263,1264,1265,1268,1269,189,1271,1274],{},"There is no switch in ",[182,1266,1267],{},"starter.config.ts",", so removing the blog means deleting\nit. Keep Nuxt Content, ",[182,1270,214],{},[182,1272,1273],{},"content\u002F\u003Clocale>\u002Flegal\u002F",": the\nlegal pages use them.",[400,1276,1277,1301,1310,1333,1354,1364,1374,1386],{},[203,1278,1279,693,1281,693,1284,1287,1288,693,1291,1287,1294,189,1297,1002,1299],{},[182,1280,233],{},[182,1282,1283],{},"app\u002Fcomposables\u002FuseBlogAuthor.ts",[182,1285,1286],{},"app\u002Futils\u002Fbyline.ts",",\n",[182,1289,1290],{},"app\u002Fcomponents\u002FBlurImage.vue",[182,1292,1293],{},"app\u002Fcomponents\u002Fcontent\u002FProseImg.vue",[182,1295,1296],{},"app\u002Futils\u002Fcf-images.ts",[182,1298,437],{},[182,1300,445],{},[203,1302,1303,1304,189,1307],{},"The blog links in ",[182,1305,1306],{},"app\u002Flayouts\u002Fdefault.vue",[182,1308,1309],{},"app\u002Fpages\u002Findex.vue",[203,1311,1312,693,1315,693,1318,1287,1321,693,1324,1287,1327,189,1330],{},[182,1313,1314],{},"server\u002Fapi\u002Fblog\u002F",[182,1316,1317],{},"server\u002Froutes\u002Fblog\u002F",[182,1319,1320],{},"server\u002Froutes\u002F[locale]\u002Fblog\u002F",[182,1322,1323],{},"server\u002Futils\u002Ffeed.ts",[182,1325,1326],{},"server\u002Ftypes\u002Fplatform-feed.ts",[182,1328,1329],{},"shared\u002Futils\u002Fblog-posts.ts",[182,1331,1332],{},"build\u002Fblog-feed.ts",[203,1334,1335,1336,1339,1340,1343,1344,1347,1348,1350,1351,1353],{},"In ",[182,1337,1338],{},"nuxt.config.ts",": the ",[182,1341,1342],{},"blogFeedCopy"," import, the ",[182,1345,1346],{},"handlers"," block for the\nprefixed feeds, the ",[182,1349,188],{}," route rules and the ",[182,1352,176],{}," runtime config",[203,1355,1356,1358,1359,1361,1362],{},[182,1357,184],{}," and the ",[182,1360,218],{}," collections in\n",[182,1363,214],{},[203,1365,1366,1369,1370,1373],{},[182,1367,1368],{},"scripts\u002Fblog\u002F",", the ",[182,1371,1372],{},"images:upload"," script and both blog workflows",[203,1375,1376,1002,1378,247,1380,189,1382,1385],{},[182,1377,480],{},[182,1379,1267],{},[182,1381,176],{},[182,1383,1384],{},"nav.blog"," in every\nlocale file",[203,1387,1388,1389,1392],{},"The blog tests, ",[182,1390,1391],{},"test\u002Funit\u002Fblog-*.test.ts"," among them",[178,1394,1395,1396,1398],{},"Nothing checks the list, so search the repository for ",[182,1397,176],{}," when you are done.",[195,1400,20],{"id":1401},"configuration",[637,1403,1404,1419],{},[640,1405,1406],{},[643,1407,1408,1411,1414,1417],{},[646,1409,1410],{},"Key or variable",[646,1412,1413],{},"Where",[646,1415,1416],{},"Default",[646,1418,823],{},[653,1420,1421,1438,1459,1486,1511,1530,1548,1571,1594,1615,1638,1669,1687,1706,1725,1745,1766,1784],{},[643,1422,1423,1427,1432,1435],{},[658,1424,1425],{},[182,1426,240],{},[658,1428,1429,1431],{},[182,1430,750],{},", Worker",[658,1433,1434],{},"unset",[658,1436,1437],{},"The account every post is bylined with",[643,1439,1440,1445,1449,1452],{},[658,1441,1442],{},[182,1443,1444],{},"NUXT_SITE_URL",[658,1446,1447],{},[182,1448,750],{},[658,1450,1451],{},"none",[658,1453,1454,1455,1458],{},"Origin of the feed's links, read at build. Without it, or ",[182,1456,1457],{},"NUXT_PUBLIC_SITE_URL"," on the Worker, the feed answers 500",[643,1460,1461,1466,1470,1475],{},[658,1462,1463],{},[182,1464,1465],{},"context",[658,1467,1468],{},[182,1469,1005],{},[658,1471,1472],{},[182,1473,1474],{},"''",[658,1476,1477,1478,1481,1482,1002,1484],{},"One sentence on what the site is, sent with every prompt. ",[182,1479,1480],{},"BLOG_CONTEXT"," overrides it; empty falls back to ",[182,1483,308],{},[182,1485,1256],{},[643,1487,1488,1492,1496,1500],{},[658,1489,1490],{},[182,1491,1247],{},[658,1493,1494],{},[182,1495,1005],{},[658,1497,1498],{},[182,1499,1474],{},[658,1501,254,1502,1504,1505,1481,1507,1002,1509],{},[182,1503,1185],{}," tag on uploaded images. ",[182,1506,1243],{},[182,1508,1253],{},[182,1510,1256],{},[643,1512,1513,1517,1521,1527],{},[658,1514,1515],{},[182,1516,702],{},[658,1518,1519],{},[182,1520,1005],{},[658,1522,1523,1526],{},[182,1524,1525],{},"anthropic\u002Fclaude-opus-5"," first",[658,1528,1529],{},"Text models a run may pick",[643,1531,1532,1536,1540,1545],{},[658,1533,1534],{},[182,1535,705],{},[658,1537,1538],{},[182,1539,1005],{},[658,1541,1542,1526],{},[182,1543,1544],{},"xai\u002Fgrok-imagine-image",[658,1546,1547],{},"Image models a run may pick, with their parameters",[643,1549,1550,1555,1559,1564],{},[658,1551,1552],{},[182,1553,1554],{},"gateway",[658,1556,1557],{},[182,1558,1005],{},[658,1560,1561],{},[182,1562,1563],{},"'default'",[658,1565,1566,1567,1570],{},"AI Gateway id. Cloudflare creates ",[182,1568,1569],{},"default"," on the first request",[643,1572,1573,1577,1581,1589],{},[658,1574,1575],{},[182,1576,729],{},[658,1578,1579],{},[182,1580,1005],{},[658,1582,1583,693,1586],{},[182,1584,1585],{},"en",[182,1587,1588],{},"sr",[658,1590,1591,1592],{},"The first is written, the rest translated. Keep it in step with ",[182,1593,222],{},[643,1595,1596,1604,1608,1612],{},[658,1597,1598,693,1601],{},[182,1599,1600],{},"author.name",[182,1602,1603],{},"author.to",[658,1605,1606],{},[182,1607,1005],{},[658,1609,1610],{},[182,1611,1474],{},[658,1613,1614],{},"A guest byline written into every generated post. Empty uses the account byline",[643,1616,1617,1625,1629,1635],{},[658,1618,1619,693,1622],{},[182,1620,1621],{},"article.system",[182,1623,1624],{},"article.guidelines",[658,1626,1627],{},[182,1628,1005],{},[658,1630,1631,1632],{},"staff-writer persona, ",[182,1633,1634],{},"[]",[658,1636,1637],{},"The writer's system prompt and extra rules",[643,1639,1640,1651,1655,1666],{},[658,1641,1642,693,1645,693,1648],{},[182,1643,1644],{},"article.words",[182,1646,1647],{},".description",[182,1649,1650],{},".tags",[658,1652,1653],{},[182,1654,1005],{},[658,1656,1657,693,1660,693,1663],{},[182,1658,1659],{},"[900, 1400]",[182,1661,1662],{},"[120, 160]",[182,1664,1665],{},"[3, 5]",[658,1667,1668],{},"Target ranges for length, description characters and tag count, sent in the prompt",[643,1670,1671,1675,1679,1684],{},[658,1672,1673],{},[182,1674,894],{},[658,1676,1677],{},[182,1678,1005],{},[658,1680,1681],{},[182,1682,1683],{},"['humanizer']",[658,1685,1686],{},"Editing passes, in order",[643,1688,1689,1694,1698,1703],{},[658,1690,1691],{},[182,1692,1693],{},"article.maxTokens",[658,1695,1696],{},[182,1697,1005],{},[658,1699,1700],{},[182,1701,1702],{},"16000",[658,1704,1705],{},"Output cap of each text call",[643,1707,1708,1715,1719,1722],{},[658,1709,1710,693,1712],{},[182,1711,685],{},[182,1713,1714],{},"images.rules",[658,1716,1717],{},[182,1718,1005],{},[658,1720,1721],{},"five styles, no lettering",[658,1723,1724],{},"Cover style presets, and the rules added to every cover prompt",[643,1726,1727,1731,1735,1739],{},[658,1728,1729],{},[182,1730,573],{},[658,1732,1733],{},[182,1734,1005],{},[658,1736,1737],{},[182,1738,1474],{},[658,1740,1741,1742,1744],{},"Builds delivery URLs. ",[182,1743,569],{}," overrides it",[643,1746,1747,1752,1756,1760],{},[658,1748,1749],{},[182,1750,1751],{},"images.deliveryBase",[658,1753,1754],{},[182,1755,1005],{},[658,1757,1758],{},[182,1759,1474],{},[658,1761,1762,1763,1744],{},"A custom delivery prefix with the hash in its path. ",[182,1764,1765],{},"CLOUDFLARE_IMAGES_DELIVERY_BASE",[643,1767,1768,1773,1777,1781],{},[658,1769,1770],{},[182,1771,1772],{},"images.variant",[658,1774,1775],{},[182,1776,1005],{},[658,1778,1779],{},[182,1780,586],{},[658,1782,1783],{},"The variant stored in a cover's URL",[643,1785,1786,1794,1798,1806],{},[658,1787,1788,693,1791],{},[182,1789,1790],{},"blogImages.thumb",[182,1792,1793],{},"blogImages.placeholder",[658,1795,1796],{},[182,1797,445],{},[658,1799,1800,693,1803],{},[182,1801,1802],{},"w=640,h=336,fit=cover",[182,1804,1805],{},"w=32,blur=25,fit=cover",[658,1807,1808],{},"Variants for card thumbnails and the blurred placeholder",[195,1810,1812],{"id":1811},"good-to-know","Good to know",[400,1814,1815,1836,1862,1884],{},[203,1816,1817,1818,1821,1822,1825,1826,1829,1830,1832,1833,411],{},"A pull request the workflow opens gets no ",[182,1819,1820],{},"ci"," run, because GitHub starts no\nworkflow from ",[182,1823,1824],{},"GITHUB_TOKEN",". Close and reopen it, or push to its branch. To\nget checks automatically, give the Open pull request step a personal access\ntoken through ",[182,1827,1828],{},"GH_TOKEN",", and the checkout step of\n",[182,1831,1022],{}," the same token through ",[182,1834,1835],{},"token:",[203,1837,1838,1839,693,1842,559,1845,1848,1849,693,1852,693,1855,999,1858,1861],{},"The feed's title and description are ",[182,1840,1841],{},"brand.name",[182,1843,1844],{},"blog.title",[182,1846,1847],{},"blog.description"," from each locale file, read at build. Keep them plain\ntext: a ",[182,1850,1851],{},"{",[182,1853,1854],{},"}",[182,1856,1857],{},"@",[182,1859,1860],{},"|"," in one fails the build.",[203,1863,1864,1865,1867,1868,1002,1871,1877,1878,1880,1881,1883],{},"A new language needs its code in the generator's ",[182,1866,729],{}," and in\n",[182,1869,1870],{},"BLOG_COLLECTIONS",[206,1872,1875],{"href":1873,"rel":1874,"title":211},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fserver\u002Futils\u002Ffeed.ts",[210],[182,1876,1323],{},", on\ntop of ",[182,1879,222],{}," (",[206,1882,149],{"href":148},").",[203,1885,1886,1887,1889],{},"On a model with a small context window, such as Workers AI's Llama 3.3 at\n24,000 tokens, the humanizer (about 7,000 tokens), the article and a\n16,000-token reply don't fit. Lower ",[182,1888,1693],{}," or drop the skill.",[679,1891,1892],{},"html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}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);}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sovSZ, html code.shiki .sovSZ{--shiki-light:#22863A;--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":280,"searchDepth":17,"depth":17,"links":1894},[1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905],{"id":197,"depth":17,"text":198},{"id":261,"depth":17,"text":262},{"id":455,"depth":17,"text":456},{"id":546,"depth":17,"text":547},{"id":798,"depth":17,"text":799},{"id":887,"depth":17,"text":888},{"id":990,"depth":17,"text":991},{"id":1095,"depth":17,"text":1096},{"id":1260,"depth":17,"text":1261},{"id":1401,"depth":17,"text":20},{"id":1811,"depth":17,"text":1812},[1907,1908],{"path":134,"title":135,"description":136,"navTitle":135,"group":116,"order":137},{"path":148,"title":149,"description":150,"navTitle":149,"group":140,"order":151}]