{"id":23272538,"url":"https://github.com/sister-software/keywork","last_synced_at":"2026-03-11T04:32:22.379Z","repository":{"id":41357935,"uuid":"490071091","full_name":"sister-software/keywork","owner":"sister-software","description":"A library for building V8 Isolate web apps on Cloudflare Workers, Deno, and Node.JS","archived":false,"fork":false,"pushed_at":"2023-10-19T20:39:07.000Z","size":95809,"stargazers_count":56,"open_issues_count":16,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-02T07:19:27.416Z","etag":null,"topics":["cloudflare","cloudflare-workers","deno","react","react-ssr"],"latest_commit_sha":null,"homepage":"https://keywork.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sister-software.png","metadata":{"files":{"readme":"docs/README.md","changelog":null,"contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":"docs/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":"docs/SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-05-08T22:39:11.000Z","updated_at":"2025-11-08T17:21:01.000Z","dependencies_parsed_at":"2024-10-23T09:34:25.051Z","dependency_job_id":"6e69ed2f-39ca-4c3b-8b04-a2c56dd4cb80","html_url":"https://github.com/sister-software/keywork","commit_stats":{"total_commits":281,"total_committers":2,"mean_commits":140.5,"dds":0.02491103202846978,"last_synced_commit":"5da9b4f82df7256e2f681c0920af5e7725385227"},"previous_names":["nirrius/keywork"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/sister-software/keywork","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sister-software%2Fkeywork","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sister-software%2Fkeywork/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sister-software%2Fkeywork/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sister-software%2Fkeywork/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sister-software","download_url":"https://codeload.github.com/sister-software/keywork/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sister-software%2Fkeywork/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30370798,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"online","status_checked_at":"2026-03-11T02:00:07.027Z","response_time":84,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudflare","cloudflare-workers","deno","react","react-ssr"],"created_at":"2024-12-19T19:17:48.818Z","updated_at":"2026-03-11T04:32:22.353Z","avatar_url":"https://github.com/sister-software.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# What is Keywork?\n\n**Keywork** is a batteries-included library for building serverless web apps on Cloudflare Workers, Deno, and Node.JS\n\n```tsx\nimport { RequestRouter } from './router/index.js'\n\nconst app = new RequestRouter()\n\napp.get('/', () =\u003e \u003ch1\u003eHello from Keywork! 👋\u003c/h1\u003e)\n\nexport default app\n```\n\n![GitHub commit activity](https://img.shields.io/github/commit-activity/m/nirrius/keywork)\n![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/nirrius/keywork/CI/main)\n[![codecov](https://codecov.io/gh/nirrius/keywork/branch/main/graph/badge.svg?token=1SDGYMB2YN)](https://codecov.io/gh/nirrius/keywork)\n![npm](https://img.shields.io/npm/dm/keywork)\n![npm (scoped)](https://img.shields.io/npm/v/keywork)\n[![deno module](https://shield.deno.dev/x/keywork)](https://deno.land/x/keywork)\n\n## Why use Keywork?\n\n**V8 Isolates** are an emerging technology offered by cloud-computing services,\nthat allow web apps to deploy quickly, and be served from around the world.\nCompared to more traditional cloud services, V8 Isolates offer faster response times,\nand even scale at more affordable prices than virtual machines and containers.\n\n**_However_**, building a web app with V8 Isolates can come with several drawbacks,\nand may lock your code into a single platform.\n\n**Keywork is an open-source library that makes V8 Isolates easier to use.**\n\n## Serverless web apps without vendor lock-in\n\nWhether you're creating a new web app, or refactoring an existing code-base,\nchoosing a serverless provider is challenging...\n\nYou may not have enough information to make a choice between providers such as [Cloudflare Workers](https://workers.cloudflare.com) and [Deno Deploy](https://deno.com/deploy). You may want to try several providers and compare their pricing models, or even [self-host](https://lagon.app) your own V8 Isolates platform.\n\n**Keywork allows you to build V8 compatible web apps without vendor lock-in,\nand supports Cloudflare Workers, Deno Deploy, and Node.JS**\n\n## Routing\n\nKeywork has everything you need to handle incoming requests in a V8 runtime environment.\nApplication routing remains _magic-free_, and uses an Express.js inspired API that doesn't stray far from\nthe native design patterns of the Worker platform.\n\n```ts title=\"GET https://example.com/greet/jessie\"\ninterface GreetParams {\n  firstName: string\n}\n\napp.get\u003cGreetParams\u003e('/greet/:firstName', ({ params }) =\u003e {\n  return `Hello there! ${params.firstName}`\n})\n```\n\nKeywork is the next step when your routing logic outgrows [Cloudflare Pages](https://developers.cloudflare.com/pages/platform/functions/#functions-routing).\nAnd thanks to modular and type-safe API, Keywork provides an opinionated and structured\nguidence as your codebase expands, without locking you into a specific design-pattern.\n\n\u003ca href=\"https://keywork.app/modules/router/\" target=\"_blank\"\u003e\u003cstrong\u003e\u003cem\u003eTry the Router Module\u003c/em\u003e ›\u003c/strong\u003e\u003c/a\u003e\n\n### React just works\n\nAt long last, Keywork takes rendering React on V8 beyond static site generation, and into full dynamic pages.\n\nServer-side rendering is made as simple as pairing JSX with your type-safe API:\n\n```tsx title=\"Create your API routes...\"\ninterface User {\n  displayName: string\n  email: string\n}\n\nconst usersAPI = new RequestRouter()\n\nusersAPI.get('/', () =\u003e {\n  const users: User[] = [\n    { displayName: 'Coheed', email: 'coheed.k@example.com' },\n    { displayName: 'Cambria', email: 'claudio.k@example.com' },\n    { displayName: 'Ambellina', email: 'ambellina@example.com' },\n    { displayName: 'Sirus', email: 'sirus.amory@example.com' },\n  ]\n\n  return users\n})\n```\n\n```tsx title=\"Fetch your static props and return JSX!\"\nconst app = new RequestRouter({\n  middleware: [['/api/users', usersAPI]],\n})\n\napp.get('/users', async () =\u003e {\n  const response = await this.fetch('/api/users')\n  const users: User[] = await response.json()\n\n  return (\n    \u003cul\u003e\n      {users.map((user, i) =\u003e (\n        \u003cli key={i}\u003e{user.displayName}\u003c/li\u003e\n      ))}\n    \u003c/ul\u003e\n  )\n})\n```\n\nKeywork handles client-side hydration, and fits into your existing architecture without ceremony.\nAnd with built-in support for streamed responses, your app is delivered and interactive in seconds.\n\n\u003ca href=\"https://keywork.app/modules/react/\" target=\"_blank\"\u003e\u003cstrong\u003e\u003cem\u003eTry the React Module\u003c/em\u003e ›\u003c/strong\u003e\u003c/a\u003e\n\n### Isomorphic error handling, made easier.\n\nWhether you're handling errors in your V8 Worker, Node.JS, or even the browser,\nKeywork includes error utilities that pair nicely with HTTP requests.\n\n```ts\nimport { KeyworkResourceError, Status } from './errors/index.js'\n\ninterface LoginPayload {\n  email: string\n  password: string\n}\n\napp.post('/login', async ({ request }) =\u003e {\n  const payload: LoginPayload = await request.body.json()\n\n  if (!payload.email) {\n    return new KeyworkResourceError('Email is required', Status.BadRequest)\n  }\n})\n```\n\n\u003ca href=\"https://keywork.app/modules/errors\" target=\"_blank\"\u003e\u003cstrong\u003e\u003cem\u003eTry the Error Module\u003c/em\u003e ›\u003c/strong\u003e\u003c/a\u003e\n\n## Code bundling without the guesswork\n\nUsing Keywork means that you'll spend less of your precious time configuring ESBuild,\nand more on the real task at hand — building great web apps.\n\nAnd with [readymade templates](https://github.com/sister-software/keywork-starter-kit) available,\nyou can skip the boilerplate and start coding in seconds.\n\n\u003ca href=\"https://keywork.app/modules/bundling/\" target=\"_blank\"\u003e\u003cstrong\u003e\u003cem\u003eTry the Bundling Module\u003c/em\u003e ›\u003c/strong\u003e\u003c/a\u003e\n\n### Tools to manage your growing codebase\n\nCloudflare Workers are limited to [just 1 megabyte](https://developers.cloudflare.com/workers/platform/limits#worker-size) after compression, and even a modestly-sized codebase may push against this limit.\n\n**Keywork allows your web app to be split into smaller and more manageable Worker deployments**\n\n## Core utilities for building web apps\n\nIf you find yourself writing a lot of \"glue-code\",\nKeywork also includes the typical \"kitchen drawer\" stuff you usually have to implement when building a web app,\nincluding...\n\n- Logging that helps you better trace down errors as your app grows\n- Cache headers, cache responses, and even ETag generation for your own content\n- Session management to aid in authenticating users\n- Tools that let you use Cloudflare KV as a NoSQL database like MongoDB or Firebase\n- Static asset utilities with support for Cloudflare Pages and Worker Sites.\n\n**All that and much, much more!**\n\u003ca href=\"https://keywork.app/modules/\" target=\"_blank\"\u003e\u003cstrong\u003e\u003cem\u003eView all Keywork modules\u003c/em\u003e ›\u003c/strong\u003e\u003c/a\u003e\n\n## Keywork Starter Kit\n\nThe starter kit lets Keywork can be used to build a web app on [Cloudflare Pages](https://pages.cloudflare.com) with your own routing.\n\n- 🌐 React\n- 🏗️ ESBuild\n- ⚡ Cloudflare Pages\n- 💪 Written in TypeScript\n\n\u003ca href=\"https://github.com/sister-software/keywork-starter-kit\" target=\"_blank\"\u003e\u003cstrong\u003e\u003cem\u003eMore details about the starter kit\u003c/em\u003e ›\u003c/strong\u003e\u003c/a\u003e\n\n## Want to help?\n\nKeywork is made possible through the countless contributions of the open-source community.\nThere are many ways in which you can contribute to the project.\n\n\u003ca href=\"https://keywork.app/contributing\" target=\"_blank\"\u003e\u003cstrong\u003e\u003cem\u003eSee our contributing guide\u003c/em\u003e ›\u003c/strong\u003e\u003c/a\u003e\n\n## Licensing\n\nKeywork is open-source software and distributed under the [AGPL-3.0 license](https://www.gnu.org/licenses/agpl-3.0.html).\nUnder the AGPL, you can alter, duplicate redistribute, and incorporate our source code into your application for free,\nAS LONG AS you comply with the source code sharing requirements of AGPL.\n\n- [Open Source Usage](https://keywork.app/license/open-source)\n- [Commercial Usage](https://keywork.app/license/commercial)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsister-software%2Fkeywork","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsister-software%2Fkeywork","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsister-software%2Fkeywork/lists"}