{"id":29603106,"url":"https://github.com/sjc5/river","last_synced_at":"2025-07-20T14:05:41.209Z","repository":{"id":195901539,"uuid":"693901126","full_name":"river-now/river","owner":"river-now","description":"A Go / TypeScript meta-framework with first-class support for React, Solid, and Preact – built on Vite.","archived":false,"fork":false,"pushed_at":"2025-07-16T22:18:21.000Z","size":2334,"stargazers_count":357,"open_issues_count":0,"forks_count":5,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-07-19T17:49:07.729Z","etag":null,"topics":["framework","go","kit","library","next","nextjs","preact","preactjs","react","reactjs","remix","router","solid","solidjs","typescript"],"latest_commit_sha":null,"homepage":"https://river.now","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/river-now.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-09-20T00:11:53.000Z","updated_at":"2025-07-16T22:18:04.000Z","dependencies_parsed_at":"2023-09-26T07:00:36.388Z","dependency_job_id":"8c6b5809-d887-48cb-a220-db541ee07648","html_url":"https://github.com/river-now/river","commit_stats":{"total_commits":137,"total_committers":2,"mean_commits":68.5,"dds":"0.029197080291970767","last_synced_commit":"9493eaa7757bec57f9baba902d3427473232b541"},"previous_names":["hwy-js/hwy","sjc5/river","river-now/river","sjc5/hwy"],"tags_count":155,"template":false,"template_full_name":null,"purl":"pkg:github/river-now/river","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/river-now%2Friver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/river-now%2Friver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/river-now%2Friver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/river-now%2Friver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/river-now","download_url":"https://codeload.github.com/river-now/river/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/river-now%2Friver/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266135685,"owners_count":23881803,"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":["framework","go","kit","library","next","nextjs","preact","preactjs","react","reactjs","remix","router","solid","solidjs","typescript"],"created_at":"2025-07-20T14:05:40.396Z","updated_at":"2025-07-20T14:05:41.193Z","avatar_url":"https://github.com/river-now.png","language":"Go","readme":"# River\n\n\u003cimg src=\"site/frontend/__static/river-banner.webp\" alt=\"River logo banner\"\u003e\n\n## Introduction\n\nRiver is a Go / TypeScript meta-framework with first-class support for React,\nSolid, and Preact – built on Vite.\n\nRiver provides the benefits of modern web development frameworks without the\ndownsides of isomorphic JavaScript and component hydration patterns.\n\nCore Features:\n\n- Seamless Vite integration\n- Nested routing with concurrent Go-based loaders\n- Blazing fast TypeScript type generation\n- Hybrid-SSR architecture\n- React, Preact, and Solid support\n\nOptional Extras:\n\n- Global critical CSS inlining\n- Link pre-fetching on hover\n- Ability to deeply integrate the build and dev refresh cycle with any upstream\n  dependencies in any language, via our Wave build tool\n- Much, much more\n\nWhile River currently supports React, Preact, and Solid, 95% of River's client\narchitecture just uses vanilla browser APIs, making it pretty trivial to support\nany client UI library while still providing the same underlying development\nmodel. Even our Link components are light wrappers over a vanilla core.\n\nOur core philosophy is simple: You don't need backend JS to build a fully modern\nand performant web application.\n\nYes, it is possible to get great performance and SEO scores, a fully type-safe\napplication, and a frictionless full-stack developer experience, all without\nbackend JS.\n\nNow, River doesn't think that all backend JS is bad _per se_. TypeScript in\nparticular is a wonderfully dynamic language, and it can be great for writing\nmany backend services. But what we _do_ reject is the modern myth that you need\nto use a full SSR and hydration or component streaming model to achieve the\nrequirements of a modern full-stack web application. It just doesn't need to be\nthat complex.\n\nNow, let me explain the hybrid-SSR architecture and how it recreates the\nbenefits of traditional full SSR without technically doing full SSR.\n\nIt's quite simple really. The hybrid-SSR architecture has four ingredients:\n\n1. Fully populated document head with all necessary and appropriate tags and\n   data, generated dynamically on a per-route basis.\n2. Pre-loaded route data immediately available for your client components to\n   consume.\n3. Properly hashed, immutably edge-cached, and parallel-loaded static\n   dependencies.\n4. Client-rendered document body inside the dynamic outer shell (ready to\n   execute and paint almost immediately thanks to items 1-3 above).\n\nThe fourth item (client-rendered document body) is what will make many of you\nskeptical about this architecture. That's OK! We welcome skepticism.\n\nWe feel that once you try it out and deploy an app or two using the River\nhybrid-SSR architecture, you'll realize that as long as you have items 1-3 in\nplace, item 4 is not actually a real-world problem. We think you'll be reminded\nthat client-side rendering is really nice, actually (especially when it sits on\ntop of the dynamic scaffolding you get with River). It greatly simplifies your\napplication architecture, frees you up to use cheaper and more performant\nbackend languages, and rids you of those annoying hydration errors.\nWin-win-win-win-win. You get the _actual_ benefits of full SSR without the\ndownsides.\n\nOK, so we have covered initial page loads. What about subsequent navigations?\nWell, we just do the same thing, except with a smaller JSON payload.\n\nWe know all your dependencies (including both JS and CSS) at a route level, so\nit's trivial to preload it all and block navigations for a few milliseconds\nuntil everything is loaded and ready. And if you choose to use link pre-fetching\non hover, the route transition will feel instant for anyone with a decent\ninternet connection.\n\nAdditionally, all navigations are performed using a single request. No\nwaterfalls or jank. No request-per-route-segment model. Just a fast navigation\nthat feels solid and familiar to users.\n\nTo sum up, River provides many benefits over popular full-SSR frameworks.\nFaster, cheaper server. Smaller all-around payloads. No hydration errors. No\nsubtle JS runtime incompatabilities. Yet it also provides many of the same\nbenefits, just using a different architecture. Excellent SEO. Wonderful and\nblazing fast user experience. Fully type-safe and frictionless developer\nexperience. All yours for the taking.\n\n## Installation\n\n## Go\n\n```sh\ngo get github.com/river-now/river\n```\n\n## TypeScript\n\n```sh\nnpm i -D river.now\n```\n\nWhy a dev dependency? Because it is more explicit about what is actually\nhappening. The `\"dependencies\"`/`\"devDependencies\"` distinction in your\n`package.json` is a NodeJS concept, not a browser JavaScript concept. For\nexplicitness, and because River's npm modules are targeted at browsers (not\nNodeJS), River projects will usually declare all dependencies as dev\ndependencies to make it clear that they are being transformed before being\nshipped to the browser.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsjc5%2Friver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsjc5%2Friver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsjc5%2Friver/lists"}