├── public └── .assetsignore ├── src ├── style.css ├── client │ ├── main.tsx │ ├── App.tsx │ └── Chat.tsx └── server │ ├── index.tsx │ ├── renderer.tsx │ └── api.ts ├── wrangler.jsonc ├── tsconfig.client.json ├── tsconfig.server.json ├── vite.config.ts ├── tsconfig.json ├── .gitignore └── package.json /public/.assetsignore: -------------------------------------------------------------------------------- 1 | .vite -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-family: Arial, Helvetica, sans-serif; 3 | } 4 | -------------------------------------------------------------------------------- /src/client/main.tsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from 'react-dom/client' 2 | import App from './App' 3 | 4 | createRoot(document.getElementById('root')!).render() 5 | -------------------------------------------------------------------------------- /src/client/App.tsx: -------------------------------------------------------------------------------- 1 | import Chat from './Chat' 2 | 3 | export default function App() { 4 | return ( 5 | <> 6 |

Chatbot

7 | 8 | 9 | ) 10 | } 11 | -------------------------------------------------------------------------------- /wrangler.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "node_modules/wrangler/config-schema.json", 3 | "name": "ai-sdk-with-hono", 4 | "compatibility_date": "2025-08-03", 5 | "main": "./src/server/index.tsx" 6 | } -------------------------------------------------------------------------------- /tsconfig.client.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "lib": [ 6 | "ESNext", 7 | "DOM" 8 | ] 9 | }, 10 | "include": [ 11 | "src/client/**/*.tsx", 12 | "src/client/**/*.ts" 13 | ] 14 | } -------------------------------------------------------------------------------- /tsconfig.server.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "lib": [ 6 | "ESNext" 7 | ], 8 | }, 9 | "include": [ 10 | "src/server/**/*.tsx", 11 | "src/server/**/*.ts", 12 | "worker-configuration.d.ts" 13 | ] 14 | } -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { cloudflare } from '@cloudflare/vite-plugin' 2 | import { defineConfig } from 'vite' 3 | import ssrPlugin from 'vite-ssr-components/plugin' 4 | 5 | export default defineConfig({ 6 | build: { 7 | minify: true 8 | }, 9 | plugins: [cloudflare(), ssrPlugin()] 10 | }) 11 | -------------------------------------------------------------------------------- /src/server/index.tsx: -------------------------------------------------------------------------------- 1 | import { Hono } from 'hono' 2 | import { renderer } from './renderer' 3 | import apiApp from './api' 4 | 5 | const app = new Hono() 6 | 7 | app.use(renderer) 8 | 9 | app.get('/', (c) => { 10 | return c.render(
) 11 | }) 12 | 13 | app.route('/api', apiApp) 14 | 15 | export default app 16 | -------------------------------------------------------------------------------- /src/server/renderer.tsx: -------------------------------------------------------------------------------- 1 | import { reactRenderer } from '@hono/react-renderer' 2 | import { Link, Script, ViteClient } from 'vite-ssr-components/react' 3 | 4 | export const renderer = reactRenderer(({ children }) => { 5 | return ( 6 | 7 | 8 | 9 |