+ OpenCode
+ The open source AI coding agent
+ The new opencode.ai SSR site is running. The V2 documentation is available now.
+
+ Read the docs
+
+
+ )
+}
diff --git a/packages/www/src/styles.css b/packages/www/src/styles.css
new file mode 100644
index 0000000000..89cebe5b74
--- /dev/null
+++ b/packages/www/src/styles.css
@@ -0,0 +1,79 @@
+@import "tailwindcss";
+@import "fumadocs-ui/css/neutral.css";
+@import "fumadocs-ui/css/preset.css";
+
+:root {
+ --site-background: #f7f7f5;
+ --site-foreground: #171717;
+ --site-border: #d8d8d2;
+ --site-accent: #3b7dd8;
+ --fd-layout-width: 90rem;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+html,
+body {
+ min-height: 100%;
+}
+
+body {
+ margin: 0;
+}
+
+.home {
+ min-height: 100vh;
+ display: grid;
+ align-content: center;
+ justify-items: start;
+ gap: 1.5rem;
+ padding: clamp(1.5rem, 7vw, 7rem);
+ color: var(--site-foreground);
+ background: var(--site-background);
+}
+
+.home-kicker,
+.home-copy,
+.home h1 {
+ margin: 0;
+}
+
+.home-kicker {
+ font:
+ 600 0.75rem/1.2 ui-monospace,
+ monospace;
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
+}
+
+.home h1 {
+ max-width: 13ch;
+ font:
+ 500 clamp(3rem, 9vw, 8rem) / 0.92 ui-monospace,
+ monospace;
+ letter-spacing: -0.07em;
+}
+
+.home-copy {
+ max-width: 42rem;
+ font:
+ 400 clamp(1rem, 2vw, 1.25rem) / 1.5 ui-monospace,
+ monospace;
+}
+
+.home-link {
+ display: inline-block;
+ padding: 0.8rem 1rem;
+ color: var(--site-background);
+ background: var(--site-foreground);
+ font:
+ 500 0.875rem/1 ui-monospace,
+ monospace;
+ text-decoration: none;
+}
+
+.home-link:hover {
+ background: var(--site-accent);
+}
diff --git a/packages/www/tsconfig.json b/packages/www/tsconfig.json
new file mode 100644
index 0000000000..fa688da72b
--- /dev/null
+++ b/packages/www/tsconfig.json
@@ -0,0 +1,24 @@
+{
+ "include": ["src/**/*.ts", "src/**/*.tsx", "source.config.ts", "vite.config.ts", ".source/**/*.ts"],
+ "compilerOptions": {
+ "target": "ES2022",
+ "jsx": "react-jsx",
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "noEmit": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true,
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
+ "types": ["vite/client"],
+ "paths": {
+ "@/*": ["./src/*"],
+ "collections/*": ["./.source/*"]
+ }
+ }
+}
diff --git a/packages/www/vite.config.ts b/packages/www/vite.config.ts
new file mode 100644
index 0000000000..1fdc270427
--- /dev/null
+++ b/packages/www/vite.config.ts
@@ -0,0 +1,22 @@
+import { cloudflare } from "@cloudflare/vite-plugin"
+import tailwindcss from "@tailwindcss/vite"
+import { tanstackStart } from "@tanstack/react-start/plugin/vite"
+import viteReact from "@vitejs/plugin-react"
+import mdx from "fumadocs-mdx/vite"
+import { defineConfig } from "vite"
+
+export default defineConfig({
+ resolve: {
+ tsconfigPaths: true,
+ },
+ plugins: [
+ cloudflare({
+ viteEnvironment: { name: "ssr" },
+ configPath: process.env.SST_WRANGLER_PATH,
+ }),
+ tailwindcss(),
+ mdx(),
+ tanstackStart(),
+ viteReact(),
+ ],
+})
diff --git a/packages/www/wrangler.jsonc b/packages/www/wrangler.jsonc
new file mode 100644
index 0000000000..b1b96c9934
--- /dev/null
+++ b/packages/www/wrangler.jsonc
@@ -0,0 +1,7 @@
+{
+ "$schema": "node_modules/wrangler/config-schema.json",
+ "name": "opencode-www",
+ "compatibility_date": "2026-07-12",
+ "compatibility_flags": ["nodejs_compat"],
+ "main": "@tanstack/react-start/server-entry",
+}