The fastest CMS, easiest to deploy.
Rust-powered high-performance BaaS and headless CMS · Built-in blog / ecommerce / wallet / payment / workflow / multi-tenant SaaS
JS / Rhai / Lua / WASM plugin engines · MCP-native · Single binary · Zero GC
Website ·
Docs ·
Download ·
Discussions ·
Quick Start
Early Alpha — API may change before v1.0. Targeting stable v1.0 in Q3 2026.
Admin UI — click the screenshot or here for the live demo
Single binary, full capability One binary, no Node.js, no Docker, no runtime. Blog, ecommerce, wallet, and payment are native built-in — not plugin assemblies, but the skeleton itself.
Rust performance, zero-GC stability Sub-millisecond reads, zero performance degradation over time. No GC pauses, no memory leaks, no 3 AM OOM alerts.
4 plugin engines, inspired by Strapi JS, Rhai, Lua, and WASM — a full spectrum from scripting to compiled. Dynamic language productivity on a Rust performance foundation.
Built for AI Native MCP (Model Context Protocol) server. AI clients like Claude Desktop can read/write content and invoke tools directly.
| Module | Features |
|---|---|
| Blog / CMS | Posts, pages, categories, tags, comments, media, RSS, sitemap |
| Ecommerce | Cart, orders, product variants, coupons, shipping templates |
| Wallet & Payment | Multi-currency wallet; Alipay / WeChat Pay / Stripe / Dodo / Creem via unified payment routing |
| Workflow | Workflow engine + job queue + cron scheduler + event bus |
| Content Types | Dynamic schema via TOML, grouping, batch ops, rule engine, auto CRUD API |
| Auth | JWT (HS256) + Refresh tokens + API tokens + multi-role RBAC |
| OAuth | GitHub / Google / WeChat and more social login |
| MCP | Model Context Protocol server (Streamable HTTP + stdio) for AI clients |
| GraphQL | Optional GraphQL API (async-graphql) |
| Webhook | Event-driven webhook delivery |
| Notifier | Email (SMTP) / SMS notifications |
| Multi-tenant | Optional tenant isolation + built-in reverse proxy for SaaS |
| Plugin Engine | JS (QuickJS) / Rhai / Lua (mlua) / WASM (wasmtime), VFS, hot reload |
| Search | Full-text search (Tantivy) |
| Admin UI | React 19 + shadcn/ui dashboard (embedded in binary) |
| Desktop | Tauri cross-platform desktop app |
| Tunnel | Built-in tunnel client — expose local ports to the internet |
| Multi-DB | SQLite / PostgreSQL / MySQL — zero code changes |
| Observability | Structured logging, Prometheus metrics, request ID, audit log, panic webhook |
# SQLite (default — zero config)
curl -fsSL https://raw.githubusercontent.com/RaisFast/raisfast/main/scripts/install.sh | sh
# PostgreSQL
curl -fsSL https://raw.githubusercontent.com/RaisFast/raisfast/main/scripts/install.sh | sh -s -- postgres
# MySQL
curl -fsSL https://raw.githubusercontent.com/RaisFast/raisfast/main/scripts/install.sh | sh -s -- mysqlThis downloads the latest prebuilt binary to ~/.local/bin/raisfast.
# Start the server
raisfast
# Server starts at http://localhost:9898
# Admin UI at /admin
# Swagger at /swagger-ui
# Health at /api/v1/healthz# Clone
git clone https://github.com/RaisFast/raisfast.git
cd raisfast
# Prepare config (edit .env as needed)
cp .env.example .env
# Build and run (default features: SQLite + search + JS/Lua/Rhai + OpenAPI + Proxy + Tunnel + MCP)
cargo run
# Server starts at http://localhost:9898
# Admin UI at /admin
# Swagger at /swagger-ui
# Health at /api/v1/healthzWant everything (adds WASM engine, payments, S3 storage)?
cargo run --features "plugin-wasm payment-all storage-s3"
On first startup, raisfast automatically:
- Creates all database tables (embeds
SCHEMA_SQL) - Seeds default roles, permissions, and site options
- Starts serving API + Admin UI
Create an admin user (CLI subcommand):
cargo run -- user create --email admin@example.com --username admin --password your-password --role adminThe repo ships a justfile wrapping common build / test / DB commands:
just dev # dev with live SQL compile-time validation
just build # release build
just qa # fmt check + clippy
just test # run all tests
just db-init # create DB and load schema
just db-migrate # run migrationsSwitch backend with one env var: RAISFAST_DB=postgres just test (default postgres; also sqlite / mysql).
Single container (SQLite local storage):
docker build -t raisfast .
docker run -p 9898:9898 -v ./data:/app/data raisfastFull stack (docker-compose.yml, with RustFS / S3-compatible storage):
docker compose up -d
# backend → http://localhost:9898
# frontend → http://localhost:3000
# rustfs (S3) → http://localhost:9001raisfast is a Cargo workspace:
raisfast/
├── crates/
│ ├── core/ # main crate (raisfast): business & services
│ └── derive/ # proc-macro crate (raisfast-derive): CRUD / Where DSL
├── frontend/
│ ├── admin/ # React + shadcn admin UI (build output embedded in binary)
│ ├── sdk/ # official TypeScript SDK
│ ├── registry/ # plugin / content-type registry (Cloudflare Workers)
│ ├── templates/ # starters (blog / ecommerce / payment, etc.)
│ └── raisfast.com/ # marketing & docs site
├── migrations/ # three schemas (sqlite / postgres / mysql)
├── extensions/ # built-in examples: content_types/ + plugins/
├── plugin-sdk/ # plugin SDK (JS / Lua types & helpers)
├── plugin-wit/ # WASM component interface (.wit)
├── adminui/ # prebuilt admin UI assets (embedded via rust-embed)
├── templates/ # app / plugin / email / codegen templates
├── locales/ # i18n (en / zh-CN)
├── deploy/ # Fly.io / Vercel deploy configs
└── docs/ · dev-docs/ # architecture docs / design notes
crates/core/src/ module overview:
src/
├── main.rs · lib.rs · app.rs # entry + AppState composition
├── server/ # HTTP server + route registration + OpenAPI
├── cli/ # subcommands (server/db/user/ct/plugin/...)
├── handlers/ # route handlers (thin: extract → service → respond)
├── services/ # business logic (ownership / Policy checks)
├── models/ # data structures + SQL queries (sqlx + CRUD macros)
├── dto/ # data transfer objects
├── commands/ # CQRS command handlers
├── middleware/ # auth / rate limit / CORS / tenant / metrics / security headers
├── plugins/ # 4-engine plugin system (JS/Rhai/Lua/WASM) + VFS
├── content_type/ # dynamic content types + rule engine + import/export
├── payment/ # payment providers + routing + crypto
├── workflow/ # workflow engine
├── worker/ # job queue + cron scheduler
├── graphql/ # GraphQL API
├── mcp/ # MCP (Model Context Protocol) server
├── proxy/ # multi-tenant reverse proxy
├── tauri/ # Tauri desktop integration
├── oauth/ # OAuth providers
├── notifier/ # email / SMS notifications
├── event/ · eventbus.rs # event bus
├── webhook/ # webhook system
├── audit.rs · cache.rs # audit log / cache (moka)
├── protocols/ # AOP protocols (ownable / tenantable / timestampable …)
├── db/ # connection pool / dialect / schema / multi-tenant / write lock
├── storage/ # file storage (local / S3)
├── search/ # full-text search (Tantivy)
├── config/ # env-based configuration
├── errors/ # unified AppError (thiserror)
├── types/ · utils/ # shared types / helpers
└── admin_spa.rs # embedded admin UI (rust-embed)
Handler → Service → Model (SQL)
↘ External: Storage / Cache / Search / EventBus / Webhook
- Handlers contain no business logic; they are the only auth entry point (
ensure_*) - Services orchestrate models and external services; they only do resource ownership checks (Policy)
- Models hold only data structures and SQL queries, with
tx_*variants for transactions
raisfast ships a full command-line (clap):
raisfast # same as: raisfast server start
raisfast server start|stop|restart|status
raisfast db migrate|rollback|backup
raisfast user create|list|passwd|delete|disable|enable
raisfast ct new|check|types # content-type mgmt + TS type generation
raisfast plugin new|check # plugin scaffolding + validation
raisfast codegen model # scaffold models from schema.sql
raisfast route ... # route inspection
raisfast doctor # system diagnostics
raisfast mcp serve # run MCP server over stdio (for Claude Desktop, etc.)
raisfast proxy start|check # multi-tenant reverse proxy
raisfast tunnel <local-port> # expose a local port to the internetZero code changes — just change the feature flag:
# SQLite (default)
cargo build --no-default-features --features "db-sqlite"
# PostgreSQL
cargo build --no-default-features --features "db-postgres"
# MySQL
cargo build --no-default-features --features "db-mysql"Note:
BIGINT PRIMARY KEYdoes not auto-increment on PostgreSQL/MySQL, and sqlx proc-macros need a live database at compile time. SeeAGENTS.mdfor "Postgres first-run" and cross-DB development rules.
# Database backend (pick one; default db-sqlite)
--features "db-sqlite | db-postgres | db-mysql"
# Plugin runtimes (plugin-js / plugin-lua / plugin-rhai are on by default)
--features "plugin-all" # adds the WASM engine
--features "plugin-wasm" # WASM only
# Payments (off by default)
--features "payment-all" # Alipay + WeChat + Stripe + Dodo + Creem
--features "payment-stripe" # or pick individually
# Other optional capabilities
--features "storage-s3" # S3 / RustFS object storage
--features "tls" # built-in HTTPS (rustls)
--features "cron-system" # system shell-script cron
--features "tauri" # Tauri desktop mode
--features "export-types" # export TypeScript types (ts-rs)Defaults on: db-sqlite, search-tantivy, plugin-js, plugin-lua, plugin-rhai, openapi, proxy, tunnel, mcp
extensions/plugins/
└── my-plugin/
├── plugin.toml # manifest
├── main.js # JavaScript (QuickJS)
├── main.lua # Lua (mlua)
├── main.rhai # Rhai
└── main.wasm # WASM (wasmtime, conforms to plugin-wit/plugin.wit)
Example plugin.toml:
[plugin]
name = "my-plugin"
version = "0.1.0"
entry = "main.js"
[permissions]
http = ["GET"]
db = ["read"]
hooks = ["post_created", "comment_created"]- Plugin SDK:
plugin-sdk/provides JS / Lua types and helpers; WASM plugins conform to theplugin-wit/plugin.witcontract. - Virtual filesystem: each plugin gets an isolated VFS (tunable via
PLUGIN_VFS_*quotas). - Examples:
extensions/ships sample plugins (crm, forum, seo-rhai) and content types you can study.
All configuration is via environment variables or .env (see .env.example for the full list):
# ── Server ──────────────────────────────
APP_HOST=0.0.0.0
APP_PORT=9898 # default 9898
APP_ENV=development # development | production
APP_TIMEZONE=UTC # IANA, e.g. Asia/Shanghai
# APP_KEY= # auto-generated on first start (AES-GCM)
# CORS_ORIGINS=https://your.domain # comma-separated
# BASE_URL=http://localhost:9898 # public URL (for RSS / media links)
# ── Database ────────────────────────────
DATABASE_URL=sqlite:./storage/db/raisfast.db?mode=rwc
# DB_POOL_SIZE=5
# STORAGE_ROOT_DIR=./storage # local root (uploads/logs/search_index/vfs/db)
# ── Auth ────────────────────────────────
JWT_SECRET=change-me-in-production-at-least-32-chars
JWT_ACCESS_EXPIRES=900 # 15 minutes
JWT_REFRESH_EXPIRES=604800 # 7 days
# ── Storage ─────────────────────────────
# STORAGE_DRIVER=local # local | s3
# MAX_UPLOAD_SIZE=104857600
# S3_ENDPOINT=http://rustfs:9000 # only when STORAGE_DRIVER=s3
# S3_ACCESS_KEY= · S3_SECRET_KEY= · S3_BUCKET= · S3_REGION= · S3_PUBLIC_URL=
# ── Plugins ─────────────────────────────
# PLUGIN_DIR=./extensions/plugins
# PLUGIN_VFS_ROOT= · PLUGIN_VFS_MAX_FILE_SIZE= · PLUGIN_VFS_MAX_TOTAL_SIZE=
# PLUGIN_WASM_POOL_SIZE=4 · PLUGIN_LUA_POOL_SIZE=4 · PLUGIN_JS_POOL_SIZE=4
# ── Worker / Cron ───────────────────────
# WORKER_ENABLED=false · WORKER_CONCURRENCY=2
# CRON_SEED_ENABLED=false · CRON_LOG_RETENTION_DAYS=30
# CRON_SCHEDULES=[{"label":"...","job_type":"...","cron_expr":"...","enabled":true}]
# ── API toggles ─────────────────────────
# GRAPHQL_ENABLED=true # /api/v1/graphql
# WEBSOCKET_ENABLED=true # /api/v1/ws
# ── Built-in modules ────────────────────
# BUILTIN_BLOG=true · BUILTIN_PAGES=true · BUILTIN_MEDIA=true
# BUILTIN_FULLTEXT=true · BUILTIN_WORKFLOW=true · BUILTIN_TENANTABLE=false
# ── Rate limit (max_requests/window_secs)
# RATE_LIMIT_GLOBAL_MAX=60 · RATE_LIMIT_LOGIN_MAX=10 ...| Platform | How |
|---|---|
| Docker | docker build or docker compose up (with RustFS) |
| Fly.io | just deploy-fly (config in deploy/fly/) |
| Vercel | script deploy/vercel.sh |
| Bare metal / binary | cargo build --release, single-file distribution |
| Layer | Technology |
|---|---|
| Language | Rust (edition 2024) |
| HTTP Framework | Axum 0.8 |
| Database | SQLx 0.9 (SQLite / PostgreSQL / MySQL) |
| GraphQL | async-graphql 7 |
| Auth | JWT (HS256) + Argon2 |
| Cache | moka |
| Search | Tantivy 0.26 |
| Plugin Runtime | wasmtime / rquickjs / mlua / rhai |
| ID generation | ferroid (Snowflake + multiplicative inverse cipher + base62) |
| Email / Templating | lettre / Tera / Comrak (Markdown) |
| Admin UI | React 19 + Vite + shadcn/ui (Base UI) |
| Desktop | Tauri 2 |
| Object storage | AWS SDK for S3 / RustFS |
| Embedded assets | rust-embed |
| Component | Status |
|---|---|
| Core API + Admin UI | ✅ Working |
| Auth (JWT + OAuth + API Token + RBAC) | ✅ Working |
| Multi-database (SQLite / PG / MySQL) | ✅ Working |
| Plugin engine (JS / Rhai / Lua / WASM) | ✅ Working |
| Content Type system (+ rule engine) | ✅ Working |
| Ecommerce (cart / orders / shipping templates) | ✅ Working |
| Wallet + unified payment routing | ✅ Working |
| Workflow engine | ✅ Working |
| Job queue + Cron | ✅ Working |
| MCP server | ✅ Working |
| GraphQL API | ✅ Working |
| Webhook + Notifier | ✅ Working |
| Multi-tenant + reverse proxy | ✅ Working |
| Tunnel | ✅ Working |
| Tauri desktop | 🔧 In development |
| Plugin marketplace | 📋 Planned |
Licensed under Apache License 2.0.
We welcome contributions! Please read CONTRIBUTING.md and AGENTS.md (architecture constraints and cross-DB development rules) for details.
Built with ❤️ and Rust