{"id":28340590,"url":"https://github.com/devyatsu/express_rs","last_synced_at":"2026-03-08T05:31:30.120Z","repository":{"id":291344934,"uuid":"977346165","full_name":"DevYatsu/express_rs","owner":"DevYatsu","description":"express.js but in rust","archived":false,"fork":false,"pushed_at":"2025-05-25T14:49:44.000Z","size":117,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-03T14:46:28.302Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DevYatsu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2025-05-04T01:40:38.000Z","updated_at":"2025-05-20T21:00:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"2324570a-e220-4ffb-bcf7-d45b1cc419d6","html_url":"https://github.com/DevYatsu/express_rs","commit_stats":null,"previous_names":["devyatsu/express_rs"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevYatsu%2Fexpress_rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevYatsu%2Fexpress_rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevYatsu%2Fexpress_rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevYatsu%2Fexpress_rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DevYatsu","download_url":"https://codeload.github.com/DevYatsu/express_rs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevYatsu%2Fexpress_rs/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":258701946,"owners_count":22743727,"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":[],"created_at":"2025-05-27T03:20:38.458Z","updated_at":"2026-03-08T05:31:30.114Z","avatar_url":"https://github.com/DevYatsu.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# express_rs\n\n\u003e A minimal and blazing-fast web framework for Rust, inspired by [Express.js](https://expressjs.com/)\n\n## 🚀 Overview\n\n**express_rs** aims to provide a clean, expressive, and flexible web framework modeled after the ergonomics of Express.js, but with the performance and safety guarantees of Rust.\n\nThe goal is to keep things simple, fast, and ergonomic — no macros, no ceremony — just modular, async-first routing, middlewares, and handler composition.\n\n---\n\n## ✅ Features (Implemented)\n\n- [x] Express-style routing with `.get()`, `.post()`, etc.\n- [x] Middleware system (`app.use(...)`) with layered composition\n- [x] Minimal `App` type (no macro or derive required)\n- [x] Request + Response types with mutable APIs\n- [x] Route parameter extraction (`/user/:id`)\n- [x] Route handler abstraction (`Handler`) with `Next`\n- [x] Logging with method, path and elapsed time\n- [x] Built-in response helpers (e.g., `.send()`, `.json()`, `.status()`)\n- [x] File serving with streaming optimization + LRU cache\n- [x] MIME type detection (via [`mime_guess`] and [`infer`])\n- [x] Route matching via fast radix tree (`matchthem`)\n- [x] Global string interner for path and param deduplication\n- [x] Type-safe per-request parameter access via extension API\n- [x] MethodKind enum + method bitflag support\n\n---\n\n## 🛠️ Goals \u0026 Roadmap\n\n### Core Architecture\n\n- [x] Internal `App` struct with lazy router initialization\n- [x] `Router` type with per-method route trees\n- [x] Middleware pipeline with early return support\n- [x] Symbol-based interned parameters\n\n### Developer Experience\n\n- [ ] Static type-safe API for request extensions (`.locals`, etc.)\n- [ ] Global `AppState\u003cT\u003e` support like Actix\n- [ ] Built-in logging/tracing macros with levels\n- [ ] Built-in `.env` support for config (optional)\n- [ ] Pluggable middleware (logger, body-parser, etc.)\n\n### Advanced Routing\n\n- [ ] Path prefix mounting (`app.use('/api', apiApp)`)\n- [ ] Route grouping (`router.route('/users').get(...).post(...)`)\n- [ ] Optional trailing slash handling\n- [ ] Regex or wildcard segments (`*` / `.*`)\n\n### Performance\n\n- [ ] Benchmarks against Axum/Actix/Warp\n- [ ] Zero-copy response body writing\n- [ ] Avoid all heap allocations in hot path\n- [x] Smallvec for handler/index lists\n\n---\n\n## 🧪 Example\n\n```rust\nuse express_rs::App;\n\nfn main() {\n    let mut app = App::default();\n\n    app.get(\"/\", |req, res, _| {\n        res.send(\"Hello from Rust!\");\n    });\n\n    app.listen(3000, || {\n        println!(\"🚀 Listening on http://localhost:3000\");\n    });\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevyatsu%2Fexpress_rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevyatsu%2Fexpress_rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevyatsu%2Fexpress_rs/lists"}