{"id":25969068,"url":"https://github.com/fullsoak/fullsoak","last_synced_at":"2025-10-26T13:06:12.137Z","repository":{"id":276050033,"uuid":"912600272","full_name":"fullsoak/fullsoak","owner":"fullsoak","description":"a no-build TypeScript fullstack SSR-first framework for developing fast web applications with a shallow learning curve","archived":false,"fork":false,"pushed_at":"2025-03-09T23:10:02.000Z","size":102,"stargazers_count":217,"open_issues_count":2,"forks_count":6,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-28T17:11:15.102Z","etag":null,"topics":["fullstack","nobuild","ssr","web-framework"],"latest_commit_sha":null,"homepage":"https://jsr.io/@fullsoak/fullsoak","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fullsoak.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"SUPPORT.md","governance":"GOVERNANCE.md","roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-06T02:17:04.000Z","updated_at":"2025-03-27T13:20:56.000Z","dependencies_parsed_at":"2025-02-06T02:25:59.702Z","dependency_job_id":"d853e271-dbb7-47cc-886e-985dd1144240","html_url":"https://github.com/fullsoak/fullsoak","commit_stats":null,"previous_names":["fullsoak/fullsoak"],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fullsoak%2Ffullsoak","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fullsoak%2Ffullsoak/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fullsoak%2Ffullsoak/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fullsoak%2Ffullsoak/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fullsoak","download_url":"https://codeload.github.com/fullsoak/fullsoak/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247226211,"owners_count":20904465,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["fullstack","nobuild","ssr","web-framework"],"created_at":"2025-03-04T22:38:58.924Z","updated_at":"2025-10-26T13:06:12.125Z","avatar_url":"https://github.com/fullsoak.png","language":"TypeScript","funding_links":[],"categories":["TypeScript","Metaframework-like tools"],"sub_categories":[],"readme":"# FullSoak\n\n[![JSR](https://jsr.io/badges/@fullsoak/fullsoak)](https://jsr.io/@fullsoak/fullsoak)\n[![JSR Score](https://jsr.io/badges/@fullsoak/fullsoak/score)](https://jsr.io/@fullsoak/fullsoak)\n[![Built with the Deno Standard Library](https://raw.githubusercontent.com/denoland/deno_std/main/badge.svg)](https://jsr.io/@std)\n[![codecov](https://codecov.io/gh/fullsoak/fullsoak/graph/badge.svg?token=P84VP42BYB)](https://codecov.io/gh/fullsoak/fullsoak)\n![GitHub Repo stars](https://img.shields.io/github/stars/fullsoak/fullsoak)\n![Discord](https://img.shields.io/discord/1341201350108905566?style=flat)\n\nFullS(tack)oak (FullSoak for short) is a modern (born 2025), no-build TypeScript\nfullstack framework for building fast web applications with a shallow learning\ncurve. At its core is the [Oak](https://oakserver.org) http server framework\nwhich is inspired by Koa (one of the popular Node.js http frameworks).\n\n## Key Differentiators\n\n1. FullSoak is **no-build** [[1]](#nobundle). Zero, zip, zilch, nada. That\n   means: no `tsc` nor `webpack`. All files are served from where they are. No\n   surprises. Still, optimizations such as minification and mangling are\n   supported.\n\n2. FullSoak supports both JSX and HTM (Hyperscript Tagged Markup) which boasts\n   [several enhancements over JSX](https://www.npmjs.com/package/htm#improvements-over-jsx) -\n   but most importantly: both require no separate build step (back to point 1).\n   JSX transformation is automatically applied on a per-file basis.\n\n3. FullSoak is [Preact](https://preactjs.com/). So: the familiarity of React,\n   but as lean as we need it to be.\n\n4. FullSoak is SSR-first \u0026 SSR-optimized. See Deno's explanation on\n   [JSX precompile](https://docs.deno.com/runtime/reference/jsx/#jsx-precompile-transform)\n   for more details.\n\n5. FullSoak is (mostly) WYSIWYG. Compared to sophisticated frameworks such as\n   Next.js, or Remix, or Deno's Fresh, FullSoak is intended to be quite\n   \"feature-poor\": 1) you start with a \"Controller\" file (as in good old \"MVC\")\n   which 2) renders your TSX component as `text/html` content (i.e. a plain\n   string), and then 3) the content hydrates itself on the client side. For\n   isomorphic use cases, there're no \"special-purpose functions\" to remember:\n   where \u0026 how to write data fetching logic is left entirely at the disposal of\n   the developer.\n\n## Example usage\n\nAs with most frameworks, fullsoak recommends a certain directory structure.\nHere's a bare-minimum example for Deno runtime:\n\nPrerequisite:\n[Deno](https://docs.deno.com/runtime/getting_started/installation/#download-and-install)\n\n```\nfullsoak-example\n|_ src\n|  |_ components\n|  |  |_ Shared\n|  |  |  |_ styles.css\n|  |  |_ MyComponent\n|  |     |_ index.tsx\n|  |     |_ styles.css\n|  |_ main.ts\n|_ deno.jsonc\n```\n\n```jsonc\n// deno.jsonc\n{\n  \"imports\": {\n    \"fullsoak\": \"jsr:@fullsoak/fullsoak@0.18.0\",\n    \"preact\": \"npm:preact@10.26.5\"\n  },\n  \"nodeModulesDir\": \"auto\",\n  \"compilerOptions\": {\n    // see https://docs.deno.com/runtime/reference/jsx/#jsx-precompile-transform\n    \"jsx\": \"precompile\",\n    \"jsxImportSource\": \"preact\",\n    \"jsxPrecompileSkipElements\": [\"a\", \"link\"]\n  }\n}\n```\n\n```ts\n// src/main.ts\nimport { Controller, Get, ssr, useFullSoak } from \"fullsoak\";\nimport { MyComponent } from \"./components/MyComponent/index.tsx\";\n\n@Controller()\nclass MyController {\n  @Get(\"/\")\n  index() {\n    return ssr(MyComponent);\n  }\n}\n\nconst port = 3991;\n\nuseFullSoak({ port, controllers: [MyController] });\n```\n\n```tsx\n// src/components/MyComponent/index.tsx\nimport type { FunctionComponent } from \"preact\";\nexport const MyComponent: FunctionComponent = () =\u003e \u003cdiv\u003ehello, world\u003c/div\u003e;\n```\n\n```css\n/* src/components/MyComponent/styles.css */\n@import \"/components/Shared/styles.css\";\n```\n\nThen the app can be started up for local development:\n\n```bash\ndeno -A --watch src/main.ts\n```\n\nor simply served directly on production and/or inside a Docker container:\n\n```bash\n# please supply the Deno security permissions flags to your desire\n# https://docs.deno.com/runtime/fundamentals/security/#permissions\ndeno src/main.ts\n```\n\n## Route-aware Isomorphic Components\n\nRendering route-aware isomorphic components is supported via `preact-iso`. See\nexamples:\n\n- [SSR](https://github.com/fullsoak/deno-examples/blob/v0.3.0/src/main.ts#L23-L29)\n- [Isomorphic components](https://github.com/fullsoak/deno-examples/blob/v0.3.0/src/components/MyRouteAwareComponent/index.tsx#L24-L47)\n\n## Live Demo / Projects using FullSoak\n\n- https://fullsoak-examples.deno.dev (example on Deno runtime)\n- https://fullsoak.onrender.com (example on Bun runtime)\n- https://fullsoak.up.railway.app (example on Node.js runtime)\n- https://fullsoak-cloudflare-workers-examples.dklab.workers.dev (example on\n  Cloudflare Workers)\n- https://fullsoak-guestbook.deno.dev (example with authentication logic)\n- wanna list yours? please feel free to open a PR\n\n## Trade-offs\n\n**Build step**, while imposing additional cognitive loads \u0026 occasionally\nhindering a good Developer Experience, has its own benefits. Without build\n(bundling) step, the optimizations (e.g. resource loaders in build-time or\nrun-time) have to be provisioned in other manners. The high-level wish is to use\nas much standard web specs as possible (think\n[preload](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/preload),\n[prefetch](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/prefetch),\netc.) to make up for what's sacrified by dropping the build step.\n\nBesides, more benchmarks are needed on small \u0026 large scale codebases across\ndifferent use cases (e.g. MPA blog site vs rich-interactive SPA vs even large\nE-Commerce site) to get an understanding of how feasible / scalable this\napproach is, and for which scenarios.\n\n## Further Reading\n\n- Project Wiki: https://github.com/fullsoak/fullsoak/wiki\n- Code examples with Deno runtime: https://github.com/fullsoak/deno-examples\n- Code examples with Node.js runtime:\n  https://github.com/fullsoak/nodejs-examples\n- Code examples with Bun runtime: https://github.com/fullsoak/bun-examples\n- Code examples with Cloudflare Workers:\n  https://github.com/fullsoak/cloudflare-workers-examples\n- Discord announcements on\n  [library interoperability updates](https://discord.gg/6GVFxMXYCh)\n- Preact's take on\n  [No-build Workflows](https://preactjs.com/guide/v10/no-build-workflows/)\n\n---\n\n\u003ca name=\"nobundle\"\u003e[1]\u003c/a\u003e\n[no bundle](https://github.com/fullsoak/fullsoak/wiki/Concepts-\u0026-Example-Deployment#no-build)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffullsoak%2Ffullsoak","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffullsoak%2Ffullsoak","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffullsoak%2Ffullsoak/lists"}