{"id":22958387,"url":"https://github.com/rads/rain","last_synced_at":"2025-09-14T06:50:49.955Z","repository":{"id":177109360,"uuid":"657326918","full_name":"rads/rain","owner":"rads","description":"🌧️ A Clojure/Script library for fast and flexible web apps.","archived":false,"fork":false,"pushed_at":"2023-07-15T06:11:28.000Z","size":98,"stargazers_count":13,"open_issues_count":14,"forks_count":0,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-08-13T04:40:50.393Z","etag":null,"topics":["babashka","backend","bbin","biff","clojure","clojurescript","frontend","hydration","incremental-static-regeneration","isomorphic","javascript","jetty","nextjs","rain-clj","re-frame","react","reagent","server-side-rendering","static-site-generator"],"latest_commit_sha":null,"homepage":"","language":"Clojure","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/rads.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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}},"created_at":"2023-06-22T20:24:00.000Z","updated_at":"2024-09-20T08:05:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"f1ad2c45-df20-4ea3-a475-c639b0948799","html_url":"https://github.com/rads/rain","commit_stats":null,"previous_names":["rads/rain"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/rads/rain","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rads%2Frain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rads%2Frain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rads%2Frain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rads%2Frain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rads","download_url":"https://codeload.github.com/rads/rain/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rads%2Frain/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275071560,"owners_count":25400399,"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","status":"online","status_checked_at":"2025-09-14T02:00:10.474Z","response_time":75,"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":["babashka","backend","bbin","biff","clojure","clojurescript","frontend","hydration","incremental-static-regeneration","isomorphic","javascript","jetty","nextjs","rain-clj","re-frame","react","reagent","server-side-rendering","static-site-generator"],"created_at":"2024-12-14T17:39:51.851Z","updated_at":"2025-09-14T06:50:49.922Z","avatar_url":"https://github.com/rads.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rain [![Slack](https://img.shields.io/badge/clojurians-rain-blue.svg?logo=slack)](https://clojurians.slack.com/messages/rain/)\n\n**A Clojure/Script library for fast and flexible web apps.**\n\n\u003e *When you start architecting a new web app, one of the foundational decisions you make is - \"How and where do I want to render content?\". Should it be rendered on the web server, build server, on the Edge, or directly on the client? Should it be rendered all at once, partially, or progressively?* ([patterns.dev](https://www.patterns.dev/posts/rendering-patterns))\n\nRain helps you answer these questions. Once you decide on an approach, you can use `rain new` to create an app from scratch and deploy it to a JAMstack host or cloud VPS provider in minutes. Check out the [Installation](#installation) and [Usage](#usage) sections to get started.\n\n- Supports multiple rendering patterns in the same app:\n    - Static Site Generation (SSG)\n    - Incremental Static Generation (ISG)\n    - Server-Side Rendering (SSR)\n    - Client-Side Rendering (CSR)\n    - Hydration\n- Supports reusable code between the server and browser\n- Helpers for biff, reitit, reagent, and re-frame\n- Fast\n- Extensible\n\n**Status:** alpha\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Docs](#docs)\n- [Usage](#usage)\n- [Additional Resources](#additional-resources)\n\n## Installation\n\n### Command-Line Tool (CLI)\n\nFirst, install [`bbin`](https://github.com/babashka/bbin). Then run the following command:\n\n```\nbbin install io.github.rads/rain\n```\n\nNow you can run `rain` in your shell to see the docs for the CLI tool.\n\n### Library\n\nAdd `io.github.rads/rain` to your `deps.edn`:\n\n```clojure\nio.github.rads/rain {:git/tag \"v0.1.8\" :git/sha \"c490345\"}\n```\n\nSee the [Usage](#usage) section for examples on how to use the library to build an app.\n\n## Docs\n\n- [API Docs](docs/api.md)\n\n## Usage\n\nRain supports multiple rendering patterns. See the table below to find an example based on your needs.\n\n*Note:* This table is a work-in-progress and may change as Rain matures. For a more nuanced view of rendering patterns, see the [Additional Resources](#additional-resources) section.\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003eSSG\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003eISG\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003eCSR\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003eSSR\u003c/strong\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cstrong\u003eHydration\u003c/strong\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eExample\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"http://github.com/rads/rain.examples.ssg\"\u003erain.examples.ssg\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"http://github.com/rads/bbin-site\"\u003ebbin-site\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"#\"\u003eTODO\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"#\"\u003eTODO\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"http://github.com/rads/rain.examples.todomvc\"\u003erain.examples.todomvc\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eCommand\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003erain new -t ssg\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eTODO\u003c/td\u003e\n    \u003ctd\u003eTODO\u003c/td\u003e\n    \u003ctd\u003eTODO\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003erain new -t hydration\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eUse Cases\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eLanding pages, blogs\u003c/td\u003e\n    \u003ctd\u003eDashboards\u003c/td\u003e\n    \u003ctd\u003eFull-featured apps\u003c/td\u003e\n    \u003ctd\u003eDocument-based sites\u003c/td\u003e\n    \u003ctd\u003eSupports both CSR and SSR use cases\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eHost as a static site (JAMstack)?\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eAPI required?\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eCustom server required?\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eJavaScript required for viewing?\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eJavaScript required for interaction?\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eDynamic content on build?\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eDynamic content after deploy?\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eDynamic content based on request?\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eUser login supported?\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eFirst Content Paint (FCP)?\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eGood\u003c/td\u003e\n    \u003ctd\u003eGood\u003c/td\u003e\n    \u003ctd\u003eVaries\u003c/td\u003e\n    \u003ctd\u003eGood\u003c/td\u003e\n    \u003ctd\u003eGood\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eTime-to-Interactive (TTI)?\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eGood\u003c/td\u003e\n    \u003ctd\u003eGood\u003c/td\u003e\n    \u003ctd\u003eVaries\u003c/td\u003e\n    \u003ctd\u003eGood\u003c/td\u003e\n    \u003ctd\u003eVaries\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n## Additional Resources\n\n- [**\"Rendering Patterns\" on patterns.dev**](https://www.patterns.dev/posts/rendering-patterns)\n- [**\"Rendering on the Web\" on web.dev**](https://web.dev/rendering-on-the-web/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frads%2Frain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frads%2Frain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frads%2Frain/lists"}