[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-93528":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":9,"totalLinesOfCode":9,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":9,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":17,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":19,"hasPages":19,"topics":9,"createdAt":9,"pushedAt":9,"updatedAt":21,"readmeContent":22,"aiSummary":9,"trendingCount":16,"starSnapshotCount":16,"syncStatus":15,"lastSyncTime":23,"discoverSource":24},93528,"topcoat","tokio-rs\u002Ftopcoat","tokio-rs","A batteries-included framework for building web apps",null,"https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Ftopcoat","Rust",1065,28,8,2,0,152,79.39,false,"main","2026-07-22 04:02:09","\u003Cdiv align=\"center\">\n  \u003Ch1>Topcoat\u003C\u002Fh1>\n\u003C\u002Fdiv>\n\n\u003Cdiv align=\"center\">\n  \u003Ch3>The full full-stack framework for Rust\u003C\u002Fh3>\n\u003C\u002Fdiv>\n\n\u003Cdiv align=\"center\">\n\n[![Crates.io][crates-badge]][crates-url]\n[![Docs.rs][docs-badge]][docs-url]\n[![MIT licensed][mit-badge]][mit-url]\n[![Build Status][actions-badge]][actions-url]\n[![Discord chat][discord-badge]][discord-url]\n\n\u003C\u002Fdiv>\n\n[crates-badge]: https:\u002F\u002Fimg.shields.io\u002Fcrates\u002Fv\u002Ftopcoat.svg?style=flat-square\n[crates-url]: https:\u002F\u002Fcrates.io\u002Fcrates\u002Ftopcoat\n[docs-badge]: https:\u002F\u002Fimg.shields.io\u002Fdocsrs\u002Ftopcoat?style=flat-square\n[docs-url]: https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\n[mit-badge]: https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg?style=flat-square\n[mit-url]: https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Ftopcoat\u002Fblob\u002Fmain\u002FLICENSE\n[actions-badge]: https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Ftokio-rs\u002Ftopcoat\u002Fci.yml?branch=main&style=flat-square\n[actions-url]: https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Ftopcoat\u002Factions?query=workflow%3ACI+branch%3Amain\n[discord-badge]: https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F500028886025895936.svg?logo=discord&style=flat-square\n[discord-url]: https:\u002F\u002Fdiscord.gg\u002Ftokio\n\nTopcoat is a modular, batteries-included Rust framework for building fullstack apps. It prioritizes simplicity and productivity. See [Learn Topcoat](#learn-topcoat) to get started, or the [Roadmap](#roadmap) for what's coming next.\n\n**Early-stage and experimental. Expect breaking changes.**\n\n```rust,ignore\nuse topcoat::{\n    Result,\n    router::{Router, RouterBuilderDiscoverExt, page},\n    view::{component, view},\n};\n\n#[tokio::main]\nasync fn main() {\n    topcoat::start(Router::builder().discover().build()).await.unwrap();\n}\n\n#[page(\"\u002F\")]\nasync fn home() -> Result {\n    view! {\n        \u003C!DOCTYPE html>\n        \u003Chtml>\n            \u003Cbody>\n                hello(name: \"World\")\n            \u003C\u002Fbody>\n        \u003C\u002Fhtml>\n    }\n}\n\n#[component]\nasync fn hello(name: &str) -> Result {\n    view! { \u003Ch1>\"Hello, \" (name) \"!\"\u003C\u002Fh1> }\n}\n```\n\n## What makes Topcoat different\n\n### Client reactivity without the boilerplate\n\nTopcoat renders all markup on the server: components can be async and query the database directly, eliminating all the traditional boilerplate needed for a separate API layer. Interactivity does not have to cost a round-trip, though. A `$(...)` expression is ordinary type-checked Rust that Topcoat evaluates on the server for the initial render and also translates to JavaScript, so it re-runs instantly in the browser. No wasm bundle, no client build step:\n\n```rust,ignore\nview! {\n    signal open = false;\n\n    \u002F\u002F Runs entirely in the browser; no server round-trip.\n    \u003Cbutton @click=$(|_e| open.set(!open.get()))>\"What is Topcoat?\"\u003C\u002Fbutton>\n    \u003Cp :hidden=$(!open.get())>\"A fullstack Rust framework.\"\u003C\u002Fp>\n}\n```\n\nWhen an update does need the server, like fresh search results, mark the component as a `#[shard]`. Topcoat re-renders it on the server whenever one of its `$(...)` arguments changes and swaps the new HTML in place:\n\n```rust,ignore\n#[component]\nasync fn search() -> Result {\n    view! {\n        signal query = String::new();\n\n        \u003Cinput @input=$(|e: Event| query.set(e.target.value))>\n\n        \u002F\u002F Updates as the user types.\n        search_results(query: $(query.get()))\n    }\n}\n\n#[shard]\nasync fn search_results(cx: &Cx, query: String) -> Result {\n    view! {\n        \u003Cul>\n            \u002F\u002F Your own server-side code, like a database query:\n            for product in search_products(cx, &query).await? {\n                \u003Cli>(product.name)\u003C\u002Fli>\n            }\n        \u003C\u002Ful>\n    }\n}\n```\n\n### Powerful, unsurprising HTML templates\n\nThe `view!` macro stays true to HTML and Rust. Use familiar Rust control flow as part of your templates:\n\n```rust,ignore\nview! {\n    \u003Cnav>\n        for item in nav_items {\n            \u003Ca\n                href=(item.url)\n                if item.url == current_path {\n                    aria-current=\"page\"\n                    class=\"active\"\n                }\n            >\n                (item.label)\n            \u003C\u002Fa>\n        }\n    \u003C\u002Fnav>\n}\n```\n\nUse the `topcoat fmt` CLI command to automatically format `view!` snippets (and other macros) across your codebase.\n\n### Module-based routing\n\nTopcoat can optionally infer your route tree from your app's module structure (without a build step):\n\n```text\nsrc\u002F\n|-- app.rs              -> \u002F            (and the root \u003Chtml> layout)\n`-- app\u002F\n    |-- about.rs        -> \u002Fabout\n    |-- _marketing.rs                  (layout, no URL segment)\n    |-- _marketing\u002F\n    |   `-- pricing.rs  -> \u002Fpricing\n    |-- posts.rs        -> \u002Fposts\n    |-- posts\u002F\n    |   `-- id.rs       -> \u002Fposts\u002F{post_id}\n    `-- api\u002F\n        `-- health.rs   -> GET \u002Fapi\u002Fhealth\n```\n\n### Premade components you can edit\n\nTopcoat UI is a component library based on [Tailwind](https:\u002F\u002Ftailwindcss.com\u002F) inspired by [shadcn\u002Fui](https:\u002F\u002Fui.shadcn.com\u002F). Components are copied into your project via the `topcoat ui` CLI command, meaning you can freely change their design and functionality to fit your use case:\n\n```rust,ignore\n#[component]\nasync fn delete_card() -> Result {\n    view! {\n        card(\n            card_header(\n                card_title(\"Delete workspace\")\n                card_description(\n                    \"This permanently removes the workspace and all of its data.\"\n                )\n            )\n            card_footer(\n                attrs: attributes! { class=\"justify-end\" },\n                button(variant: ButtonVariant::Ghost, \"Cancel\")\n                button(variant: ButtonVariant::Destructive, \"Delete workspace\")\n            )\n        )\n    }\n}\n```\n\n### Asset bundling\n\nThe bundler scans your compiled binary for `asset!` calls, copies (or even downloads) every file into a local asset directory, and allows Topcoat to serve them efficiently with aggressive browser caching.\n\n```rust,ignore\nconst FERRIS: Asset = asset!(\".\u002Fferris.png\");\n\nview! { \u003Cimg src=(FERRIS)> }\n```\n\nTopcoat also ships with utilities for web fonts and icons, as well as easy integrations for [Fontsource](https:\u002F\u002Ffontsource.org\u002F) (Google Fonts) and [Iconify](https:\u002F\u002Ficon-sets.iconify.design\u002F).\n\n\n### Built-in Tailwind support\n\nEnabled the `tailwind` feature to integrate [Tailwind](https:\u002F\u002Ftailwindcss.com\u002F) into your project effortlessly:\n\n```rust,ignore\nview! { \u003Clink rel=\"stylesheet\" href=(topcoat::tailwind::stylesheet!())> }\n```\n\n## Learn Topcoat\n\n**Start here**\n- [Getting started](https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Ftopcoat\u002Fblob\u002Fmain\u002Fcrates\u002Ftopcoat\u002Fdocs\u002Fgetting_started.md): create a new project, install the CLI, run the dev server.\n- [Source code formatting](https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Ftopcoat\u002Fblob\u002Fmain\u002Fcrates\u002Ftopcoat-cli\u002Fdocs\u002Ffmt.md): `topcoat fmt` for macro bodies.\n\n**Rendering**\n- [The `view!` macro](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fview\u002Fmacro.view.html): templating syntax, control flow, conditional attributes.\n- [The `#[component]` macro](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fview\u002Fattr.component.html): async functions as components, with child content.\n- [The `attributes!` macro](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fview\u002Fmacro.attributes.html): reusable runtime attribute fragments.\n- [The `class!` macro](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fview\u002Fmacro.class.html): space-separated class lists from static and conditional entries.\n\n**Routing**\n- [Router](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Frouter\u002Findex.html): pages, layouts, and API routes; manual and auto-discovered.\n- [Module-based routing](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Frouter\u002Fmacro.module_router.html): derive the route table from your module tree.\n\n**Working with requests**\n- [Request context (`Cx`)](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fcontext\u002Findex.html): the value pages, layouts, and components read from.\n- [App context](https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Ftopcoat\u002Fblob\u002Fmain\u002Fcrates\u002Ftopcoat\u002Fdocs\u002Fapp_context.md): share long-lived values across requests, keyed by type.\n- [Memoization](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fcontext\u002Fattr.memoize.html): `#[memoize]` for per-request caching and fan-out dedup.\n- [Functions, not middlewares](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fcontext\u002Findex.html#functions-not-middlewares): the recommended way to model auth and other request-scoped concerns.\n- [Cookies](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fcookie\u002Findex.html): read and write the request cookie jar, with signed, encrypted, and prefixed cookies.\n- [Sessions](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fsession\u002Findex.html): bring-your-own-storage session authentication: login\u002Flogout lifecycle, sliding expiration, and token rotation.\n\n**Asset system**\n- [Assets](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fasset\u002Findex.html): declare assets in Rust, serve them with content-hashed URLs.\n- [Fonts](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Ffont\u002Findex.html): bundle and serve web fonts.\n- [Icons](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Ficon\u002Findex.html): download Iconify icon sets or declare your own.\n\n**Client reactivity**\n- [The runtime](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fruntime\u002Findex.html): signals, `$(...)` expressions, `@` event handlers, and `:` bind attributes.\n- [Expressions](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fruntime\u002Fmacro.expr.html): the dual Rust\u002FJavaScript expression language and its vocabulary.\n- [Procedures](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fruntime\u002Fattr.procedure.html): async server functions callable from the browser.\n- [Shards](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fruntime\u002Fattr.shard.html): components that re-render on the server when their arguments change.\n\n**UI components**\n- [Topcoat UI](https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Ftopcoat\u002Fblob\u002Fmain\u002Fcrates\u002Ftopcoat\u002Fdocs\u002Fui.md): premade components vendored into your project for you to edit.\n\n**Third-party integrations**\n- [Tailwind](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Ftailwind\u002Findex.html): Tailwind CSS without Node, wired into the asset pipeline.\n- [htmx](https:\u002F\u002Fdocs.rs\u002Ftopcoat\u002Flatest\u002Ftopcoat\u002Fhtmx\u002Findex.html): drive partial HTML swaps from the server with request\u002Fresponse header helpers.\n\n## Roadmap\n\nPlanned features we'd like to bring to Topcoat. Have an idea? [Open an issue](https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Ftopcoat\u002Fissues).\n\n- [ ] `topcoat new` CLI command to bootstrap pre-configured projects\n- [ ] Static export\n- [ ] (More) reactivity (`topcoat-runtime`)\n- [ ] More Topcoat UI components, full \"blocks\" e.g. sign-in form\n- [ ] Emailing\n- [ ] Better [Toasty](https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Ftoasty) integration (safely create\u002Fupdate records from forms without listing out all the fields)\n- [ ] Validations\n- [ ] `OpenAPI` endpoints\n- [ ] Docs for how to deploy Topcoat\n- [ ] Pre-rendering for static pages\n- [ ] Streaming SSR \u002F Suspense\n- [ ] Client-side navigation + prefetching\n- [ ] `WebSockets`\n- [ ] Server-sent events\n- [ ] Image optimization \u002F resizing\n- [ ] Easier-to-use middlewares like rate-limiting, compression, etc.\n- [ ] Authentication\n- [ ] Background jobs\n- [ ] Islands\n","2026-07-20 02:30:05","trending"]