[{"data":1,"prerenderedAt":61},["ShallowReactive",2],{"blog-this-site-ships-without-a-backend":3},{"id":4,"title":5,"body":6,"date":48,"description":49,"extension":50,"meta":51,"navigation":52,"path":53,"seo":54,"stem":55,"tags":56,"__hash__":60},"blog\u002Fblog\u002Fthis-site-ships-without-a-backend.md","This site ships without a backend",{"type":7,"value":8,"toc":44},"minimark",[9,13,16,19,41],[10,11,12],"p",{},"The AI Builder public site is a Nuxt app with Markdown in git. That is the product for now.",[10,14,15],{},"There will be a self-hosted Appwrite instance on Coolify. There is not one today. Pretending otherwise would mean a Cloud endpoint in the repo, a project ID that is not ours, or a contact form that dies in production. None of that is acceptable.",[10,17,18],{},"So the contract is:",[20,21,22,26,29],"ul",{},[23,24,25],"li",{},"Runtime config comes from the environment: endpoint, project ID, site URL.",[23,27,28],{},"Empty values are valid. The site builds. The pages render.",[23,30,31,32,36,37,40],{},"When Appwrite exists, it will be ",[33,34,35],"code",{},"https:\u002F\u002F…"," on our metal, not ",[33,38,39],{},"*.cloud.appwrite.io",".",[10,42,43],{},"If you are waiting for a CMS before you publish, you are waiting on the wrong thing. Put the words in a file. Deploy the container. Wire the database when it has a job to do.",{"title":45,"searchDepth":46,"depth":46,"links":47},"",2,[],"2026-08-28","Content first, Appwrite later. The public site should not wait on a console that does not exist yet.","md",{},true,"\u002Fblog\u002Fthis-site-ships-without-a-backend",{"title":5,"description":49},"blog\u002Fthis-site-ships-without-a-backend",[57,58,59],"shipping","appwrite","coolify","QytrP489IE8Kav-inn3d-8Tyr_O4i0Wv8dWv96o7dJM",1788208326796]