https://github.com/Wulf/create-rust-app
Set up a modern rust+react web app by running one command.
https://github.com/Wulf/create-rust-app
Last synced: about 1 month ago
JSON representation
Set up a modern rust+react web app by running one command.
- Host: GitHub
- URL: https://github.com/Wulf/create-rust-app
- Owner: Wulf
- License: apache-2.0
- Created: 2021-05-08T22:33:18.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2025-03-10T09:31:13.000Z (about 1 month ago)
- Last Synced: 2025-03-14T06:05:11.211Z (about 1 month ago)
- Language: Rust
- Homepage: https://wulf.github.io/create-rust-app/
- Size: 42.7 MB
- Stars: 1,562
- Watchers: 16
- Forks: 66
- Open Issues: 25
-
Metadata Files:
- Readme: README.md
- License: LICENSE-APACHE
Awesome Lists containing this project
- awesome - Wulf/create-rust-app - Set up a modern rust+react web app by running one command. (Rust)
- fucking-awesome-vite - create-rust-app - Integration for Rust web apps. (Integrations with Backends / Rust)
- awesome-rust - create-rust-app - rust-app.svg)](https://crates.io/crates/create-rust-app) (Development tools / Web Servers)
- awesome-rust-cn - create-rust-app
- awesome-vite - create-rust-app - Integration for Rust web apps. (Integrations with Backends / Rust)
- awesome-rust - create-rust-app - Set up a modern rust+react web app by running one command. [](https://crates.io/crates/create-rust-app) (Development tools / Web Servers)
- fucking-awesome-rust - create-rust-app - Set up a modern rust+react web app by running one command. [](https://crates.io/crates/create-rust-app) (Development tools / Web Servers)
- fucking-awesome-rust - create-rust-app - Set up a modern rust+react web app by running one command. [](https://crates.io/crates/create-rust-app) (Development tools / Web Servers)
README
#
Create Rust App
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)
[](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.