# create-rust-app **Repository Path**: aqrun/create-rust-app ## Basic Information - **Project Name**: create-rust-app - **Description**: No description available - **Primary Language**: Rust - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-18 - **Last Updated**: 2025-09-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Create Rust App License: MIT OR Apache-2.0 Set up a modern rust+react web app by running one command. [Join us on discord](https://discord.gg/tm6Ey33ZPN). [create-rust-app.dev](https://create-rust-app.dev) ## Requirements - [Rust](https://www.rust-lang.org/tools/install) - [`diesel_cli`](http://diesel.rs/guides/getting-started#installing-diesel-cli) - For SQLite, if you don't wish to dynamically link `diesel_cli` with your system's `libsqlite3`, you may run `cargo install diesel_cli --no-default-features --features sqlite-bundled`. ## Install ```sh cargo install create-rust-app_cli ``` ## Quick start ```sh create-rust-app my-todo-app # .. select backend framework, plugins, etc. ``` ```sh # Code-gen resources for your project cd ./my-todo-app create-rust-app # .. select resource type / properties ``` ## Features ### 1. Project creation ```rust create-rust-app create ``` - Run frontend & backend with a single command: `cargo fullstack` - Rust backend - One of the following frameworks: - `actix-web` - `poem` (support temporarily on hold, use version 9.2.2: `cargo install create-rust-app_cli@9.2.2`) - Database migrations (using diesel.rs) - Generate diesel structs and types by running `cargo dsync` in your project (see codegen section below). - Sending mail - PostgreSQL, SQLite 3.35+ support - ViteJS (blazing fast frontend compile speeds) - SSR templating with an option to include bundles that are automatically code-split - The `/views` folder contains all templates - The `/frontend/bundles` folder contains all the bundles which can be included in your views via `{{bundle(name="MyBundle.tsx")}}` - Automatically route to your single page application(s) - Use `create_rust_app::render_single_page_application("/app","your_spa.html")` (if you're using Poem, the parameters are slightly different, an example is provided in the function's documentation) - React frontend (or install your own framework!) - Typescript, with backend type definition generation (run `cargo tsync` in your project folder; see codegen section below) - Routing (via `react-router-dom`) - Typed `react-query` hooks generation (`$ cd my_project && create-rust-app`, then select "Generate react-query hooks") #### Available Plugins - **Authentication (+ Authorization) plugin** - Add JWT token-based auth with a simple command - Session management: restoration of previous session, revoking of refresh tokens - Credentials management/recovery - Email validation / activation flow - Adds frontend UI + react hooks - Adds auth service, and user / session models - Block your endpoints via `Auth` guard - Follows OWASP security best practices - RBAC permissions out of the box (assign roles and permissions to users) - **Social authentication (OIDC) plugin** - Adds Oauth2-based authentication (requires auth plugin) - Just configure some OIDC providers: ```rust app.app_data(Data::new(AuthConfig { oidc_providers: vec![GOOGLE( "client_id", "client_secret", "/success/redirect", "/error/redirect", )], })) ``` Then, redirect your users to start the flow! ```jsx Login with Google ``` - **Container plugin** - Dockerfile to containerize your rust app into a single image - **Development plugin** - View your database via the admin portal at `localhost:3000/admin` (still in development) - A "devbox" on the frontend indicates when the backend is compiling or when the database is not reachable - Moreover, the devbox displays when migrations are pending + includes a "run migrations" button - In-browser compilation errors and migration checking: - **Storage plugin** - Adds `Storage` extractor which allows you to upload/download files from an S3-compatible object store - Seamlessly add single or multiple attachments to your models using `Attachment::*`! - Here are some examples: - Adding an avatar to a user in your users table: ```rust let s3_key = Attachment::attach("avatar", "users", user_id, AttachmentData { file_name: "image.png", data: bytes })?; ``` - Getting the url for the attachment ```rust let storage: Storage // retreive this via the appropriate extractor in your frameowrk of choice let url = storage.download_uri(s3_key)?; ``` (note: see `Attachment::*` and `Storage::*` for more functionality!) - **GraphQL plugin** - Adds all the boilerplate necessary to expose GraphQL - Requires the auth plugin: authentication and authorization setup out-of-the-box - Find a graphql playground at `localhost:3000/graphql` - **Utoipa plugin** - Uses the [utoipa](https://github.com/juhaku/utoipa) crate to add OpenAPI documentation and serve it in a SwaggerUI playground. - Find the playground at `http://localhost:3000/swagger-ui/` - Requires the backend be Actix (for now ;) ) - check out [this page](https://github.com/juhaku/utoipa/tree/master/examples) to see how to document your own API endpoints with a variety of backends - Has a soft dependency on the Auth plugin - **Tasks Plugin** - For running background jobs, currently only supports actix-web and postgresql - Uses [`fang`](https://github.com/ayrat555/fang) under the hood and all it's features are exposed. - Add a task to the queue with `create_rust_app::tasks::queue()` - Run the queue with `cargo run --bin tasks` - **Workspace Support** (Enabled by default, not tied to a feature flag) - allows you to organize your rust app in workspaces, and changes the defaults for the environment variables that specify paths to various important places. - to organize you project as a workspace: - enable this feature - refactor your codebase into workspaces (see [#194](https://github.com/Wulf/create-rust-app/issues/194)) - Optional: set the following environment variables (paths are relative to the directory you call cargo fullstack/backend/run from) - `CRA_MANIFEST_PATH`: default `./frontend/dist/manifest.json` when called from workspace root, `../frontend/dist/manifest.json` otherwise. - `CRA_FRONTEND_DIR`: default `./frontend` when called from workspace root, `../frontend` otherwise. - `CRA_VIEWS_GLOB`: default `backend/views/\*\*/\*.html` when called from workspace root, `views/\*\*/\*.html` otherwise. - Note that in any non-standard setup, you will need to set the above environment variables to the correct values for your project to ensure correct behavior. ### 2. Code-gen to reduce boilerplate ```sh cargo dsync ``` - Run this commmand to generate diesel model structs and queries in your `backend/models` folder! - See dsync docs [here](https://github.com/Wulf/dsync) ```sh cargo tsync ``` - Run this command to generate typescript types for your rust code marked with `#[tsync::tsync]`. You'll find the output for this command here: `frontend/src/types/rust.d.ts`. - See tsync docs [here](https://github.com/Wulf/tsync) ```sh cd my_project && create-rust-app ``` - CRUD code-gen to reduce boilerplate - Scaffolds the db model, endpoints service file, and hooks it up in your `/api`! - `react-query` hooks generation for frontend - Generates a hook for each handler function defined in the `services/` folder - Edit generated hooks afterwards -- they won't be regenerated unless you delete (or rename) the hook! ## Walkthrough (old) [![Gif](docs/create-rust-app-v2.gif)](https://github.com/Wulf/create-rust-app/blob/main/docs/create-rust-app-v2.mp4) ## Contributing Questions and comments are welcome in the issues section! If you're experiencing slow compilation time, make sure there isn't any bloat in the template files (look for `node_modules` or typescript / parcel caches and delete them). Moreover, you can try using the [mold](https://github.com/rui314/mold) linker which may also improve compilation times.