[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-11373":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":15,"starSnapshotCount":15,"syncStatus":13,"lastSyncTime":27,"discoverSource":28},11373,"kakera","yusukebe\u002Fkakera","yusukebe","A file-based routing framework with Cloudflare Dynamic Workers","",null,"TypeScript",125,2,57,0,1,7,3,41.63,false,"main",true,[],"2026-06-12 04:00:54","# Kakera\n\n> **Kakera** (欠片) is Japanese for \"fragment\" or \"shard\" — each route is its own little fragment, sandboxed and loaded on demand.\n\nA file-based routing framework for Cloudflare Workers. Each route file runs as an **independent Dynamic Worker** — fully isolated, loaded via the Worker Loader binding.\n\n> **Status:** experimental.\n\n## Install\n\n```sh\nnpm i kakera-worker\n```\n\n## How it looks\n\n```\nmy-app\u002F\n  routes\u002F\n    index.ts        # GET \u002F\n    users.ts        # \u002Fusers\u002F*\n    posts.ts        # \u002Fposts\u002F*\n  src\u002F\n    app.ts          # host worker entry\n  build.ts          # bun build script\n  wrangler.jsonc\n  package.json\n```\n\nEach route is just a worker — typically a Hono app:\n\n```ts\n\u002F\u002F routes\u002Fusers.ts\nimport { Hono } from 'hono'\n\nconst app = new Hono()\napp.get('\u002F', (c) => c.json({ users: [] }))\napp.get('\u002F:id', (c) => c.json({ id: c.req.param('id') }))\n\nexport default app\n```\n\nThe host Worker dispatches by the first path segment (`\u002Fusers\u002F123` → `users.ts`, then forwards `\u002F123`). Routes are sandboxed from each other.\n\n## Host worker\n\n```ts\n\u002F\u002F src\u002Fapp.ts\nexport { app as default } from 'kakera-worker'\n```\n\nThat's it. Or with options:\n\n```ts\nimport { kakera } from 'kakera-worker'\nexport default kakera({ dir: 'subdir' }) \u002F\u002F fetches subdir\u002F\u003Cname>.js via ASSETS\n```\n\n`extensions` option (default `['js']`):\n\n```ts\nkakera({ extensions: ['js', 'mjs'] })\n```\n\n## Build script\n\n`build.ts` uses Bun's `Glob` API so route discovery is shell-independent and works whether you have only `.ts`, only `.tsx`, or both:\n\n```ts\n\u002F\u002F build.ts\nimport { Glob } from 'bun'\n\nconst entrypoints = [...new Glob('routes\u002F*.{ts,tsx}').scanSync('.')]\n\nconst result = await Bun.build({\n  entrypoints,\n  outdir: '.\u002Fdist',\n  target: 'browser',\n  format: 'esm'\n})\n\nif (!result.success) {\n  for (const log of result.logs) console.error(log)\n  process.exit(1)\n}\n```\n\n## Wrangler config\n\nRoutes are pre-bundled per-file by `bun build`, and the output directory is served via the ASSETS binding. Wrangler's `[build]` runs the bundler on startup and re-runs it when `watch_dir` changes — `wrangler dev` is the only command you need.\n\n```jsonc\n\u002F\u002F wrangler.jsonc\n{\n  \"name\": \"my-app\",\n  \"main\": \"src\u002Fapp.ts\",\n  \"build\": {\n    \"command\": \"bun run build\",\n    \"watch_dir\": \"routes\"\n  },\n  \"assets\": { \"directory\": \"dist\", \"binding\": \"ASSETS\" },\n  \"worker_loaders\": [{ \"binding\": \"LOADER\" }],\n  \"compatibility_date\": \"2026-03-17\"\n}\n```\n\n## Scripts\n\n```json\n{\n  \"scripts\": {\n    \"dev\": \"wrangler dev\",\n    \"build\": \"bun run build.ts\",\n    \"deploy\": \"wrangler deploy\"\n  }\n}\n```\n\n- `wrangler dev` — runs `[build].command` (= `bun run build`), then starts workerd. Edits in `routes\u002F` trigger a re-bundle and reload.\n- `wrangler deploy` — same flow, but ships to Cloudflare.\n\n## Try the example\n\n```sh\ncd example\nbun install\nbun run dev\n```\n\n## Why\n\n- **Isolation by default.** Each route is its own Worker — bugs, deps, and runtime crashes can't leak between routes.\n- **Tiny host bundle.** The host worker is ~1.6 KiB. No runtime bundler shipped.\n- **Standard tooling.** Bundling is `bun build`. Watch-and-rebuild is Wrangler's `[build]`. Nothing magic.\n- **Per-route bindings (planned).** Each route can eventually have its own scoped set of bindings.\n\n## How it works\n\n| Step                     |                                                                          |\n| ------------------------ | ------------------------------------------------------------------------ |\n| Host entry               | `src\u002Fapp.ts` (re-exports `app` from `kakera-worker`)                     |\n| Route source on disk     | `routes\u002F\u003Cname>.ts(x)` → `dist\u002F\u003Cname>.js` (built by `build.ts`)           |\n| ASSETS binding directory | `dist`                                                                   |\n| Bundling                 | `bun build` invoked by Wrangler `[build]` on startup and on file changes |\n| LOADER cache key         | `\u003Cname>` (Worker Loader binding caches by key)                           |\n| Host bundle size         | ~1.6 KiB                                                                 |\n\n## References\n\n- [Dynamic Workers](https:\u002F\u002Fdevelopers.cloudflare.com\u002Fdynamic-workers\u002F)\n- [Worker Loader binding](https:\u002F\u002Fdevelopers.cloudflare.com\u002Fworkers\u002Fruntime-apis\u002Fbindings\u002Fworker-loader\u002F)\n- [Wrangler custom builds](https:\u002F\u002Fdevelopers.cloudflare.com\u002Fworkers\u002Fwrangler\u002Fconfiguration\u002F#custom-builds)\n- [Hono](https:\u002F\u002Fhono.dev\u002F)\n","Kakera 是一个基于文件的路由框架，专为 Cloudflare Workers 设计。每个路由作为一个独立的动态 Worker 运行，完全隔离且按需加载，支持 TypeScript 编写，并通过 Hono 应用实现具体功能。项目利用 Bun 构建工具进行打包，确保跨平台兼容性与高效部署。适用于需要高度模块化和隔离性的 Web 应用场景，特别是在开发微服务架构或希望提高代码组织性和维护性的项目中。尽管目前仍处于实验阶段，但 Kakera 以其简洁的设计理念和强大的隔离特性，为开发者提供了构建云端应用的新选择。","2026-06-11 03:31:44","CREATED_QUERY"]