[{"data":1,"prerenderedAt":509},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fdevelopers\u002Fwhat-gets-built":254,"surround-\u002Fdevelopers\u002Fwhat-gets-built":506},[4,33,86,114,173,212,231],{"title":5,"path":6,"stem":7,"children":8},"Start","\u002Fstart","1.start",[9,13,18,23,28],{"title":10,"path":6,"stem":11,"description":12},"Start here","1.start\u002Findex","What Desifex is, and how to get an application of your own running.",{"title":14,"path":15,"stem":16,"description":17},"What Desifex is","\u002Fstart\u002Fwhat-desifex-is","1.start\u002F1.what-desifex-is","An application factory where conversation is the interface — and the handful of things it deliberately will not do.",{"title":19,"path":20,"stem":21,"description":22},"Your first application","\u002Fstart\u002Fyour-first-application","1.start\u002F2.your-first-application","From a sentence to something running, in about twenty minutes, with nothing to install.",{"title":24,"path":25,"stem":26,"description":27},"The workbench","\u002Fstart\u002Fthe-workbench","1.start\u002F3.the-workbench","A tour of the screen you will spend your time on — the conversation, the six tabs, and the menu.",{"title":29,"path":30,"stem":31,"description":32},"What to expect","\u002Fstart\u002Fwhat-to-expect","1.start\u002F4.what-to-expect","How long things take, what a good working rhythm looks like, and the parts that genuinely go wrong.",{"title":34,"path":35,"stem":36,"children":37},"Building","\u002Fbuilding","2.building",[38,41,46,51,56,61,66,71,76,81],{"title":34,"path":35,"stem":39,"description":40},"2.building\u002Findex","Getting what you actually wanted out of the conversation.",{"title":42,"path":43,"stem":44,"description":45},"Describing what you need","\u002Fbuilding\u002Fdescribing-what-you-need","2.building\u002F1.describing-what-you-need","How to phrase a request so that what comes back is what you meant.",{"title":47,"path":48,"stem":49,"description":50},"Watching a build","\u002Fbuilding\u002Fwatching-a-build","2.building\u002F2.watching-a-build","What the steps mean, what is happening underneath, and why you are not shown a log.",{"title":52,"path":53,"stem":54,"description":55},"Changing your mind","\u002Fbuilding\u002Fchanging-your-mind","2.building\u002F3.changing-your-mind","Interrupting a build, correcting a misunderstanding, and undoing something you asked for.",{"title":57,"path":58,"stem":59,"description":60},"When a build fails","\u002Fbuilding\u002Fwhen-a-build-fails","2.building\u002F4.when-a-build-fails","What a failure actually means, what to try, and when to ask us.",{"title":62,"path":63,"stem":64,"description":65},"Showing it a file","\u002Fbuilding\u002Fshowing-it-files","2.building\u002F5.showing-it-files","Attaching a screenshot, a spreadsheet or a document to the conversation — often faster than describing it.",{"title":67,"path":68,"stem":69,"description":70},"Choosing a design system","\u002Fbuilding\u002Fchoosing-a-design-system","2.building\u002F6.choosing-a-design-system","What a design system decides, how to pick one, and what changing it later does.",{"title":72,"path":73,"stem":74,"description":75},"Asking for settings","\u002Fbuilding\u002Fasking-for-settings","2.building\u002F7.asking-for-settings","The conversation reaches the whole platform — addresses, icons, redirects, users, integrations and shipping. If you do not know where a setting is, ask.",{"title":77,"path":78,"stem":79,"description":80},"When it asks you","\u002Fbuilding\u002Fwhen-it-asks-you","2.building\u002F8.when-it-asks-you","Some decisions arrive as a screen rather than a message — a table to correct, a list to choose from — and the build waits for your answer.",{"title":82,"path":83,"stem":84,"description":85},"Starting from what you have","\u002Fbuilding\u002Fstarting-from-what-you-have","2.building\u002F9.starting-from-what-you-have","A spreadsheet, a document, a picture or a page of your own site — attached, read, and built from.",{"title":87,"path":88,"stem":89,"children":90},"Shipping","\u002Fshipping","3.shipping",[91,94,99,104,109],{"title":87,"path":88,"stem":92,"description":93},"3.shipping\u002Findex","Getting what you built in front of people, and getting back to an earlier version.",{"title":95,"path":96,"stem":97,"description":98},"Versions","\u002Fshipping\u002Fversions","3.shipping\u002F1.versions","Every build is kept, named after what was asked for, and can be compared and restored.",{"title":100,"path":101,"stem":102,"description":103},"Environments","\u002Fshipping\u002Fenvironments","3.shipping\u002F2.environments","Preview, test and live — what each one is, who can reach it, and why their data is separate.",{"title":105,"path":106,"stem":107,"description":108},"Deploying","\u002Fshipping\u002Fdeploying","3.shipping\u002F3.deploying","Putting a version into test or live, what happens while it deploys, and what happens if it fails.",{"title":110,"path":111,"stem":112,"description":113},"Going back","\u002Fshipping\u002Fgoing-back","3.shipping\u002F4.going-back","Restoring an earlier version when a change turned out to be wrong.",{"title":115,"path":116,"stem":117,"children":118},"Running","\u002Frunning","4.running",[119,123,128,133,138,143,148,153,158,163,168],{"title":120,"path":116,"stem":121,"description":122},"Running it","4.running\u002Findex","Everything in Settings — addresses, access, people, files, integrations and what crawlers are told.",{"title":124,"path":125,"stem":126,"description":127},"Addresses and domains","\u002Frunning\u002Faddresses-and-domains","4.running\u002F01.addresses-and-domains","The address an application gets, and how to put it on a domain you own.",{"title":129,"path":130,"stem":131,"description":132},"Who can reach it","\u002Frunning\u002Fwho-can-reach-it","4.running\u002F02.who-can-reach-it","Open, behind one shared password, or accounts — and why the choice is enforced in front of the application.",{"title":134,"path":135,"stem":136,"description":137},"People who sign in","\u002Frunning\u002Fpeople-who-sign-in","4.running\u002F03.people-who-sign-in","The workspace's user directory — adding the people who use your applications, which ones each may open, what you can keep about them, and two-step sign-in.",{"title":139,"path":140,"stem":141,"description":142},"Published files","\u002Frunning\u002Fpublished-files","4.running\u002F04.published-files","Documents your application hands to its users — a price list, a brochure, a form — with a stable address and no build to change them.",{"title":144,"path":145,"stem":146,"description":147},"Integrations","\u002Frunning\u002Fintegrations","4.running\u002F05.integrations","Email, SMS and Google — connected once, used by the application without it ever holding a credential.",{"title":149,"path":150,"stem":151,"description":152},"Appearance","\u002Frunning\u002Fappearance","4.running\u002F06.appearance","The browser tab, the icon, what a link looks like when somebody pastes it, and adding it to a phone's home screen.",{"title":154,"path":155,"stem":156,"description":157},"Redirects and search engines","\u002Frunning\u002Fredirects-and-search-engines","4.running\u002F07.redirects-and-search-engines","Old addresses that still get visited, and what crawlers are told about each environment.",{"title":159,"path":160,"stem":161,"description":162},"Configuration values","\u002Frunning\u002Fconfiguration-values","4.running\u002F08.configuration-values","Named values the application needs but must not contain — API keys, account numbers, thresholds.",{"title":164,"path":165,"stem":166,"description":167},"Your data","\u002Frunning\u002Fyour-data","4.running\u002F09.your-data","The Data tab — reading, correcting, adding to and clearing out what your application has stored, one environment at a time.",{"title":169,"path":170,"stem":171,"description":172},"Visitors","\u002Frunning\u002Fvisitors","4.running\u002F10.visitors","Who is using the application, counted without identifying anybody and with nothing to set up.",{"title":174,"path":175,"stem":176,"children":177},"Workspace","\u002Fworkspace","5.workspace",[178,182,187,192,197,202,207],{"title":179,"path":175,"stem":180,"description":181},"Your workspace","5.workspace\u002Findex","What every application in it shares — the domain, the design systems, the people, the user directory and, if you want it, one set of records — and how to be in more than one.",{"title":183,"path":184,"stem":185,"description":186},"People and roles","\u002Fworkspace\u002Fpeople-and-roles","5.workspace\u002F1.people-and-roles","Three roles, what each can do, how they apply to the builder as well as to the buttons, and why they belong to a workspace rather than to an account.",{"title":188,"path":189,"stem":190,"description":191},"More than one workspace","\u002Fworkspace\u002Fmore-than-one-workspace","5.workspace\u002F2.more-than-one-workspace","Belonging to several, switching between them, the role you hold in each, and why nothing crosses over.",{"title":193,"path":194,"stem":195,"description":196},"Organising applications","\u002Fworkspace\u002Ffolders-and-organising","5.workspace\u002F3.folders-and-organising","Folders on the dashboard, and how to keep a growing list navigable.",{"title":198,"path":199,"stem":200,"description":201},"Your own design systems","\u002Fworkspace\u002Fyour-own-design-systems","5.workspace\u002F4.your-own-design-systems","Authoring a design system for your brand, or a client's, by importing guidelines, a website or a Figma library.",{"title":203,"path":204,"stem":205,"description":206},"Your profile","\u002Fworkspace\u002Fyour-profile","5.workspace\u002F5.your-profile","Your name, your password, your picture, and the theme.",{"title":208,"path":209,"stem":210,"description":211},"Where records live","\u002Fworkspace\u002Fwhere-records-live","5.workspace\u002F6.where-records-live","One store per environment, one across an application's environments, or one the whole workspace shares — what each costs you, and how to change it.",{"title":213,"path":214,"stem":215,"children":216},"Developers","\u002Fdevelopers","6.developers",[217,221,226],{"title":218,"path":214,"stem":219,"description":220},"For developers","6.developers\u002Findex","What is actually generated, and what to do when you inherit one.",{"title":222,"path":223,"stem":224,"description":225},"What gets built","\u002Fdevelopers\u002Fwhat-gets-built","6.developers\u002F1.what-gets-built","The stack, the shape of the repository, and the parts the platform provides rather than the application.",{"title":227,"path":228,"stem":229,"description":230},"Taking one over","\u002Fdevelopers\u002Ftaking-it-over","6.developers\u002F2.taking-it-over","For the developer who has just been handed an application built here.",{"title":232,"path":233,"stem":234,"children":235},"Reference","\u002Freference","7.reference",[236,239,244,249],{"title":232,"path":233,"stem":237,"description":238},"7.reference\u002Findex","Terms, limits, and what to do when something specific has gone wrong.",{"title":240,"path":241,"stem":242,"description":243},"Glossary","\u002Freference\u002Fglossary","7.reference\u002F1.glossary","Every term this documentation uses, in one place.",{"title":245,"path":246,"stem":247,"description":248},"Limits","\u002Freference\u002Flimits","7.reference\u002F2.limits","The boundaries that are real, so you do not discover them at an inconvenient moment.",{"title":250,"path":251,"stem":252,"description":253},"Troubleshooting","\u002Freference\u002Ftroubleshooting","7.reference\u002F3.troubleshooting","Specific symptoms, and what each one usually means.",{"id":255,"title":222,"body":256,"description":225,"extension":499,"hidden":500,"meta":501,"navTitle":502,"navigation":503,"path":223,"seo":504,"stem":224,"__hash__":505},"docs\u002F6.developers\u002F1.what-gets-built.md",{"type":257,"value":258,"toc":489},"minimark",[259,263,268,342,345,349,352,363,367,370,415,419,426,429,433,436,447,451,454],[260,261,262],"p",{},"Every application built here is the same shape. That is the constraint the\nplatform is built on, and it is what makes one of these reviewable in an hour.",[264,265,267],"h2",{"id":266},"the-stack","The stack",[269,270,271,282],"table",{},[272,273,274],"thead",{},[275,276,277,280],"tr",{},[278,279],"th",{},[278,281],{},[283,284,285,294,302,310,318,326,334],"tbody",{},[275,286,287,291],{},[288,289,290],"td",{},"Framework",[288,292,293],{},"Nuxt 4 — Vue 3, server routes on Nitro",[275,295,296,299],{},[288,297,298],{},"Styling",[288,300,301],{},"Tailwind CSS v4, with the design system's tokens rendered into the stylesheet",[275,303,304,307],{},[288,305,306],{},"Database",[288,308,309],{},"MongoDB or PostgreSQL, chosen at creation",[275,311,312,315],{},[288,313,314],{},"Cache and sessions",[288,316,317],{},"Redis",[275,319,320,323],{},[288,321,322],{},"File storage",[288,324,325],{},"S3-compatible object storage, one bucket per environment",[275,327,328,331],{},[288,329,330],{},"Package manager",[288,332,333],{},"pnpm",[275,335,336,339],{},[288,337,338],{},"Runtime",[288,340,341],{},"Node 24",[260,343,344],{},"No choices beyond the database. Not React, not a different CSS framework, not a\ndifferent server.",[264,346,348],{"id":347},"the-shape-of-the-repository","The shape of the repository",[260,350,351],{},"Ordinary Nuxt, with a few directories that are the platform's:",[353,354,359],"pre",{"className":355,"code":357,"language":358},[356],"language-text","app\u002F\n  components\u002Fui\u002F    the shared design-system components\n  pages\u002F            the screens\n  assets\u002Fcss\u002F       the design system's tokens, rendered\nserver\u002F\n  api\u002F              server routes\n  utils\u002F\n    platform.ts     email, SMS, Google — through the platform\n    auth.ts         sign-in for the application's own users\n    storage.ts      the application's own object storage\nSTACK.md            the rules the builder follows\n.platform\u002F          uploads and the design-system reference kit\n","text",[360,361,357],"code",{"__ignoreMap":362},"",[264,364,366],{"id":365},"what-the-application-does-not-contain","What the application does not contain",[260,368,369],{},"Deliberately absent, and this is the interesting part of the design:",[371,372,373,385,399,409],"ul",{},[374,375,376,380,381,384],"li",{},[377,378,379],"strong",{},"No third-party credentials."," Email, SMS and Google go through\n",[360,382,383],{},"server\u002Futils\u002Fplatform.ts",", which calls the platform with a capability token.\nThe provider's key never reaches the container.",[374,386,387,390,391,394,395,398],{},[377,388,389],{},"No password hashing and no session logic."," ",[360,392,393],{},"server\u002Futils\u002Fauth.ts"," asks the\nplatform. ",[360,396,397],{},"requireUser(event)"," at the top of a protected route is the whole\npattern.",[374,400,401,404,405,408],{},[377,402,403],{},"No page-title or meta management"," for the values set in\n",[406,407,149],"a",{"href":150},". A scaffolded Nitro plugin applies those\nfrom the environment, so a build cannot undo them.",[374,410,411,414],{},[377,412,413],{},"No analytics code."," A scaffolded middleware reports page views; the builder\nis told the file is not its to touch.",[264,416,418],{"id":417},"where-things-run","Where things run",[260,420,421,422,425],{},"Each application has its own container, its own database container, its own\nRedis and its own storage bucket — ",[377,423,424],{},"per environment",", not per application. Its\ncontainer has no access to the host's container runtime and no platform\ncredentials in it.",[260,427,428],{},"The storage credential it is given is scoped to one bucket by policy, so\nalthough one object store serves every application, none can read another's\nfiles.",[264,430,432],{"id":431},"environment-variables","Environment variables",[260,434,435],{},"The platform sets the database address, the storage credentials and the\ncapability token. Those names are reserved and cannot be overridden.",[260,437,438,439,442,443,446],{},"Everything else comes from ",[406,440,441],{"href":160},"Configuration"," and is\nread with ",[360,444,445],{},"useRuntimeConfig()",".",[264,448,450],{"id":449},"files","Files",[260,452,453],{},"Three kinds, kept apart because they have different lifetimes:",[371,455,456,466,475],{},[374,457,458,461,462,465],{},[377,459,460],{},"Conversation attachments"," — under ",[360,463,464],{},".platform\u002Fuploads\u002F",", for the builder.",[374,467,468,470,471,474],{},[377,469,139],{}," — served by the platform at ",[360,472,473],{},"\u002F_files\u002F\u003Cslug>",", not in the\nrepository and not part of a version.",[374,476,477,480,481,484,485,488],{},[377,478,479],{},"What the application's users upload"," — the application's own bucket,\nthrough ",[360,482,483],{},"server\u002Futils\u002Fstorage.ts",". Never in ",[360,486,487],{},"public\u002F",", never in the database\nas base64, never on the container filesystem — the first two end up in the\nbuild and the third is replaced on every deployment.",{"title":362,"searchDepth":490,"depth":490,"links":491},3,[492,494,495,496,497,498],{"id":266,"depth":493,"text":267},2,{"id":347,"depth":493,"text":348},{"id":365,"depth":493,"text":366},{"id":417,"depth":493,"text":418},{"id":431,"depth":493,"text":432},{"id":449,"depth":493,"text":450},"md",false,{},null,true,{"title":222,"description":225},"mmeJvz6pbsuRv6Bz0LT9AtFlFAM0Qqo7Jny0TB9C-ys",[507,508],{"title":218,"path":214,"stem":219,"description":220,"children":-1},{"title":227,"path":228,"stem":229,"description":230,"children":-1},1790202296897]