From 164bb214617c51a14fa4b7597fb0326661608f62 Mon Sep 17 00:00:00 2001 From: Tom X Nguyen Date: Fri, 2 Jan 2026 00:20:27 +0700 Subject: [PATCH] fix(server): add Content-Type headers for proxied static assets Cloudflare doesn't return Content-Type headers for static assets served from app.opencode.ai, causing browsers to reject module scripts with MIME type errors. This adds automatic Content-Type detection based on file extension when proxying responses. --- packages/opencode/src/server/server.ts | 34 +++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index f31b8ec44f50..acd4ad5c44b7 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -2657,12 +2657,44 @@ export namespace Server { }, ) .all("/*", async (c) => { - return proxy(`https://app.opencode.ai${c.req.path}`, { + const path = c.req.path + const response = await proxy(`https://app.opencode.ai${path}`, { ...c.req, headers: { host: "app.opencode.ai", }, }) + // Cloudflare doesn't return Content-Type for static assets, so we need to add it + const mimeTypes: Record = { + ".js": "application/javascript", + ".mjs": "application/javascript", + ".css": "text/css", + ".json": "application/json", + ".wasm": "application/wasm", + ".svg": "image/svg+xml", + ".png": "image/png", + ".jpg": "image/jpeg", + ".jpeg": "image/jpeg", + ".gif": "image/gif", + ".ico": "image/x-icon", + ".webp": "image/webp", + ".woff": "font/woff", + ".woff2": "font/woff2", + ".ttf": "font/ttf", + ".eot": "application/vnd.ms-fontobject", + } + for (const [ext, mime] of Object.entries(mimeTypes)) { + if (path.endsWith(ext)) { + const headers = new Headers(response.headers) + headers.set("Content-Type", mime) + return new Response(response.body, { + status: response.status, + statusText: response.statusText, + headers, + }) + } + } + return response }), )