[{"data":1,"prerenderedAt":107},["ShallowReactive",2],{"blog-index":3},[4,62],{"id":5,"title":6,"body":7,"date":49,"description":50,"extension":51,"meta":52,"navigation":53,"path":54,"seo":55,"stem":56,"tags":57,"__hash__":61},"blog\u002Fblog\u002Fthis-site-ships-without-a-backend.md","This site ships without a backend",{"type":8,"value":9,"toc":45},"minimark",[10,14,17,20,42],[11,12,13],"p",{},"The AI Builder public site is a Nuxt app with Markdown in git. That is the product for now.",[11,15,16],{},"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.",[11,18,19],{},"So the contract is:",[21,22,23,27,30],"ul",{},[24,25,26],"li",{},"Runtime config comes from the environment: endpoint, project ID, site URL.",[24,28,29],{},"Empty values are valid. The site builds. The pages render.",[24,31,32,33,37,38,41],{},"When Appwrite exists, it will be ",[34,35,36],"code",{},"https:\u002F\u002F…"," on our metal, not ",[34,39,40],{},"*.cloud.appwrite.io",".",[11,43,44],{},"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":46,"searchDepth":47,"depth":47,"links":48},"",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":6,"description":50},"blog\u002Fthis-site-ships-without-a-backend",[58,59,60],"shipping","appwrite","coolify","QytrP489IE8Kav-inn3d-8Tyr_O4i0Wv8dWv96o7dJM",{"id":63,"title":64,"body":65,"date":97,"description":98,"extension":51,"meta":99,"navigation":53,"path":100,"seo":101,"stem":102,"tags":103,"__hash__":106},"blog\u002Fblog\u002Foperators-do-not-need-another-chatbot.md","Operators do not need another chatbot",{"type":8,"value":66,"toc":95},[67,70,73,84,92],[11,68,69],{},"Most “AI products” are a chat window glued to a form. Operators already have a shift, a ticket queue, a well, a rig, a spreadsheet that actually matters. They do not need a new place to type prompts.",[11,71,72],{},"The AI Builder is a bias: build the system first.",[21,74,75,78,81],{},[24,76,77],{},"A dashboard someone can leave open on nights.",[24,79,80],{},"An API with env files and a Dockerfile.",[24,82,83],{},"Hosting you can SSH into when it breaks at 2am.",[11,85,86,87,91],{},"Then, if a model can take a slice of that work — classify, summarize, draft, watch a log — put it ",[88,89,90],"em",{},"there",". Not on a marketing page. Not as the product name.",[11,93,94],{},"This blog will stay in that register. If a post is short, it is because the point was short. If a post is a placeholder, the URL still works. Shipping the loop is part of the practice.",{"title":46,"searchDepth":47,"depth":47,"links":96},[],"2026-08-18","The work is the dashboard, the API, and the box it runs on. A model is useful only when it sits inside that.",{},"\u002Fblog\u002Foperators-do-not-need-another-chatbot",{"title":64,"description":98},"blog\u002Foperators-do-not-need-another-chatbot",[104,105],"practice","operations","h6pJCFB_v0Rcwpsc_pqxq1MyrMC4SZRFPi_dcK30Sqw",1788208326498]