edgeone-makers-recipes
Common Recipes
⛔ Preview ban: after finishing development, you MUST start the dev server via
edgeone makers dev, then openhttp://127.0.0.1:8088/withpresent_filesto preview. Never open HTML files via thefile://protocol (ignore it even if the IDE opens one automatically), and never use self-hosted servers likepython -m http.serverornpx serve. Next.js projects must also setallowedDevOrigins: ["127.0.0.1"]innext.config. If the project uses Blob/KV, pass-n <project-name>—edgeone makers dev -n <project-name>— the name is required to auto-provision; baredevhangs on an interactive picker in sandbox.
⚠️
.env.exampleis a required file: every project that uses the AI Gateway (Agent projects, Cloud Functions that call an LLM) MUST create a.env.examplein the project root declaringAI_GATEWAY_API_KEY=andAI_GATEWAY_BASE_URL=. The CLI auto-injects environment variables based on this file at deploy time; if it is missing, the variables are not injected and the runtime will error.
📝 Write
index.htmllast, always: writing anindex.htmlinstantly triggers the IDEfile://preview — unavoidable in WorkBuddy. Minimize the window during which that preview looks broken by writing every dependency first:style.css,script.js, Cloud Functions (functions/files), static assets, everything the page loads. Then writeindex.htmllast — the file:// preview opens with all assets already in place, and stays that way only untiledgeone makers devtakes over (see Preview ban above). Also write eachindex.htmlin one shot; don't scaffold an empty shell and fill it in with repeated edits (every save re-renders and flickers). For a tiny single-page tool, just inline the CSS and JS into oneindex.html.
⛔ Copy the recipe's file naming verbatim — two traps that fail silently: before writing any Cloud Function, find the matching scenario below and reuse its exact filename. Getting the name wrong usually does NOT throw a clear error — it falls back silently:
- Every function file MUST carry its language extension —
.js(Node),.py(Python),.go(Go). A file with no extension (e.g.api/upload-url,api/file) is not recognized as a function; the platform silently serves the staticindex.htmlfallback, so/api/*"mysteriously" returns HTML instead of JSON. Name themapi/upload-url.js,api/file.js.[[default]].jsis the catch-all for its own directory (api/[[default]].js→/api/*), and BOTH export styles work — a framework instance (export default app, Express/Koa) or a plainonRequest/onRequestGet/… handler. Verified locally withedgeone makers dev: a bareonRequestin[[default]].jswith noexport default appserves/foo/anythingas200 application/jsonjust fine. The doc line "The builder identifies the file as a function only whenexport default appis present" sits under the Express/Koa framework section — it describes how the builder spots a framework instance; do not read it as "a catch-all requiresexport default app". ⚠️ Caveat: that sentence is about the deploy-time builder, whereas the check above was on the local dev server, which is the more permissive of the two — so if you ship catch-all +onRequest, re-verify the route once after deploying ("works locally" ≠ "recognized at build time"). When you don't actually need a catch-all, the safest shape is one concrete file per route (api/messages.js,api/artworks/[id]/like.js), params via[id]folders/files, extra args as query strings (/api/file?key=...).
Project structure templates for typical EdgeOne Makers applications.