{"id":51167069,"url":"https://github.com/pjonaszik/rustbase","last_synced_at":"2026-06-26T20:30:22.161Z","repository":{"id":360748474,"uuid":"1251521907","full_name":"pjonaszik/rustbase","owner":"pjonaszik","description":"A multi-tenant Backend-as-a-Service in Rust — realms, apps, collections, auth, hooks, files, realtime, dashboard.","archived":false,"fork":false,"pushed_at":"2026-06-04T20:10:54.000Z","size":1914,"stargazers_count":1,"open_issues_count":10,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-04T21:05:22.407Z","etag":null,"topics":["axum","baas","backend","backend-as-a-service","multi-tenant","rust","self-hosted","sqlite"],"latest_commit_sha":null,"homepage":"https://pjonaszik.github.io/rustbase/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pjonaszik.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE-APACHE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":["https://www.paypal.com/ncp/payment/5L8KUWE8F2PSU"]}},"created_at":"2026-05-27T16:57:57.000Z","updated_at":"2026-06-04T20:05:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pjonaszik/rustbase","commit_stats":null,"previous_names":["pjonaszik/rustbase"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/pjonaszik/rustbase","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pjonaszik%2Frustbase","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pjonaszik%2Frustbase/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pjonaszik%2Frustbase/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pjonaszik%2Frustbase/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pjonaszik","download_url":"https://codeload.github.com/pjonaszik/rustbase/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pjonaszik%2Frustbase/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34832916,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-26T02:00:06.560Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["axum","baas","backend","backend-as-a-service","multi-tenant","rust","self-hosted","sqlite"],"created_at":"2026-06-26T20:30:21.432Z","updated_at":"2026-06-26T20:30:22.154Z","avatar_url":"https://github.com/pjonaszik.png","language":"Rust","funding_links":["https://www.paypal.com/ncp/payment/5L8KUWE8F2PSU"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"docs/public/logo-512.png\" alt=\"RustBase\" width=\"120\" /\u003e\n\n# RustBase\n\n**Multi-tenant backend. Single binary. Real isolation.**\n\nA multi-tenant Backend-as-a-Service in Rust. Drop one executable on a server, run the setup wizard, and you have workspaces, apps, collections, auth, realtime, file storage, a dashboard, and a REST API.\n\n\u003cimg src=\"docs/public/screenshot-dashboard.png\" alt=\"RustBase dashboard sign-in page\" width=\"780\" /\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n\n\n\u003c!-- status row --\u003e\n[![CI](https://img.shields.io/github/actions/workflow/status/pjonaszik/rustbase/ci.yml?branch=main\u0026label=CI\u0026style=for-the-badge\u0026logo=githubactions\u0026logoColor=white)](https://github.com/pjonaszik/rustbase/actions/workflows/ci.yml)\n[![Docs](https://img.shields.io/github/actions/workflow/status/pjonaszik/rustbase/docs.yml?branch=main\u0026label=Docs\u0026style=for-the-badge\u0026logo=readthedocs\u0026logoColor=white)](https://pjonaszik.github.io/rustbase/)\n[![Release](https://img.shields.io/github/v/release/pjonaszik/rustbase?include_prereleases\u0026sort=semver\u0026style=for-the-badge\u0026logo=github\u0026logoColor=white)](https://github.com/pjonaszik/rustbase/releases)\n[![Licence](https://img.shields.io/badge/licence-MIT%20OR%20Apache--2.0-blue?style=for-the-badge)](#licence)\n\n\u003c!-- platform + community row --\u003e\n[![Rust](https://img.shields.io/badge/Rust-1.88%2B-dea584?style=for-the-badge\u0026logo=rust\u0026logoColor=white)](https://www.rust-lang.org)\n[![axum](https://img.shields.io/badge/axum-0.8-FFA500?style=for-the-badge\u0026logo=tokio\u0026logoColor=white)](https://github.com/tokio-rs/axum)\n[![SQLite](https://img.shields.io/badge/SQLite-WAL-003B57?style=for-the-badge\u0026logo=sqlite\u0026logoColor=white)](https://www.sqlite.org/wal.html)\n[![Discussions](https://img.shields.io/badge/Discussions-open-2188ff?style=for-the-badge\u0026logo=github)](https://github.com/pjonaszik/rustbase/discussions)\n\n\u003c!-- vitals + funding row --\u003e\n[![Stars](https://img.shields.io/github/stars/pjonaszik/rustbase?style=for-the-badge\u0026logo=github)](https://github.com/pjonaszik/rustbase/stargazers)\n[![Last commit](https://img.shields.io/github/last-commit/pjonaszik/rustbase/main?style=for-the-badge\u0026logo=git\u0026logoColor=white)](https://github.com/pjonaszik/rustbase/commits/main)\n[![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen?style=for-the-badge\u0026logo=github)](https://github.com/pjonaszik/rustbase/blob/main/CONTRIBUTING.md)\n[![Support](https://img.shields.io/badge/Support%20us-PayPal-00457C?style=for-the-badge\u0026logo=paypal\u0026logoColor=white)](https://www.paypal.com/ncp/payment/5L8KUWE8F2PSU)\n\n📖 [Docs](https://pjonaszik.github.io/rustbase/) \u0026nbsp;·\u0026nbsp; 🐛 [Issues](https://github.com/pjonaszik/rustbase/issues) \u0026nbsp;·\u0026nbsp; 💬 [Discussions](https://github.com/pjonaszik/rustbase/discussions) \u0026nbsp;·\u0026nbsp; 🔒 [Security](SECURITY.md) \u0026nbsp;·\u0026nbsp; 📝 [Changelog](CHANGELOG.md)\n\n\u003c/div\u003e\n\n---\n\n## Who this is for\n\nYou ship **multiple small apps** under one organisational tenant — agency\nprojects for several clients, an indie portfolio of side products, a fleet of\ninternal tools — and you want **real isolation** between them without running a\nfleet of containers.\n\nConcretely, RustBase suits you if:\n\n- You'd otherwise deploy one PocketBase per app (and dread the ops).\n- You'd otherwise reach for Supabase but don't want a managed Postgres bill,\n  RLS soup, or Edge Functions running someone else's JS runtime.\n- You'd otherwise build \"one Postgres + Redis + S3 + auth-service + admin UI\"\n  stack but you ship by yourself and your time is the constraint.\n\nRustBase gives you, in one binary, the multi-tenant primitive\n(`System → Workspace → App`) baked into the storage layer. Each `App` gets its own\nSQLite file. Delete an app — `rm -rf` its folder. Take a backup — `tar` the\nfolder. No managed services, no orchestration, no container Tetris.\n\nSee [Positioning](https://pjonaszik.github.io/rustbase/concepts/positioning)\nand [the comparison vs PocketBase / Supabase / Appwrite](https://pjonaszik.github.io/rustbase/guide/comparison)\nin the docs for the honest tradeoffs.\n\n## Features\n\n- **Multi-tenant by design** — `System → Workspace → App`. Each app's data lives\n  in its own SQLite file under `data/workspaces/\u003cworkspace\u003e/apps/\u003capp\u003e/data.db`,\n  with its own user pool, OAuth providers, files, hooks, and audit log.\n- **Three admin tiers** — master, workspace, and app admins, each scoped exactly\n  to what they manage.\n- **Auth that fits a SaaS** — email + password, email OTP (passwordless), TOTP\n  second factor, and OAuth2 / OIDC (Google, GitHub, Microsoft presets shipped).\n- **Realtime** — SSE subscriptions on every collection. Hooks publish on\n  every create / update / delete.\n- **File storage** — local disk or any S3-compatible bucket (AWS, R2, MinIO)\n  via `object_store`.\n- **JS/TS hooks** — embedded QuickJS runtime. Drop a `.js` or `.ts` file into\n  `data/hooks/\u003cworkspace\u003e/\u003capp\u003e/` and lifecycle handlers, custom HTTP routes, and\n  scheduled jobs light up. No Node.js required, ever.\n- **Hierarchical policies** — master sets bounds, workspaces tighten, apps pick\n  values. Auto-clamp + audit when a parent narrows.\n- **Audit log per scope**, append-only.\n- **Embedded SvelteKit dashboard** at `/_/`, served straight from the binary.\n- **Optional Litestream replication** to any S3 endpoint.\n\n## Status\n\n`v0.1` ships the core surface — auth, collections, hooks, files, realtime,\ndashboard, CI/release pipeline, multi-arch Docker image. `v0.2` adds the\nproduction-hardening pack (rate limits, JWKS, PKCE, observability). See\n[`ROADMAP.md`](ROADMAP.md) for the trajectory and [`CHANGELOG.md`](CHANGELOG.md)\nfor what landed.\n\nNot yet a fit for: high-write workloads (\u003e100 RPS sustained, the SQLite write\nlock kicks in), multi-region deployments, or compliance-sensitive workloads\nwithout an external review. See the [deployment guide](https://pjonaszik.github.io/rustbase/guide/deployment)\nfor what \"production\" means here in concrete terms.\n\n## Quick start\n\n### Docker (fastest)\n\n```sh\ndocker run --rm -p 8080:8080 -v $(pwd)/data:/home/rustbase/data \\\n  ghcr.io/pjonaszik/rustbase:latest\n```\n\n### Native binary\n\nDownload the binary for your platform from the\n[latest release](https://github.com/pjonaszik/rustbase/releases/latest), or\nbuild from source:\n\n```sh\ngit clone https://github.com/pjonaszik/rustbase.git\ncd rustbase\ncargo build --release\n./target/release/rustbase\n```\n\nThen:\n\n1. Open \u003chttp://localhost:8080/_/\u003e in your browser.\n2. The server auto-seeded an `admin` master-admin row at first boot with no\n   password — the **setup wizard** asks you to set one. Submit it.\n3. You're signed in. Create your first workspace and your first app.\n4. Hit the REST API: `/api/workspaces/\u003cworkspace\u003e/apps/\u003capp\u003e/collections/...`.\n\nThe full walkthrough lives at\n[**docs / first-app**](https://pjonaszik.github.io/rustbase/guide/first-app).\n\n## Build from source\n\nYou need:\n\n- Rust ≥ 1.88 (stable). Install via [`rustup`](https://rustup.rs/).\n- [Bun](https://bun.sh/) for the embedded dashboard and the docs site.\n\n```sh\ncargo build --release           # produces ./target/release/rustbase\ncargo test --workspace          # ≈ 20 s\nbun --cwd ui run dev            # dashboard dev server, proxies API on :8080\nbun --cwd docs run dev          # docs dev server (VitePress)\n```\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for the full dev guide, hook setup, and\nconventions.\n\n## Architecture in 60 seconds\n\n```\nSystem\n  └── Workspace  (organization boundary — admins live here)\n        └── App  (data product — collections, records, files, end-users, OAuth live here)\n```\n\nStorage layout:\n\n```\ndata/\n  system.db                     # workspaces registry, master admins\n  workspaces/\n    \u003cworkspace_id\u003e/\n      workspace.db                  # apps, workspace/app admins, admin refresh tokens\n      apps/\n        \u003capp_id\u003e/\n          data.db               # collections, records, users, oauth, app audit\n          storage/              # file blobs\n  hooks/\n    \u003cworkspace_id\u003e/\u003capp_id\u003e/        # JS/TS hook source\n```\n\nOne binary. One `data/` folder. Backups are object storage; restores are a\ndirectory copy.\n\nFull mental model: \u003chttps://pjonaszik.github.io/rustbase/concepts/mental-model\u003e.\n\n## Contributing\n\nBugs, feature ideas, and PRs are welcome. Please read\n[CONTRIBUTING.md](CONTRIBUTING.md) first — it covers the dev workflow,\nthe conventions the code expects, and how to ship a clean PR.\n\nBy participating you agree to the [Code of Conduct](CODE_OF_CONDUCT.md).\n\nFor security issues, see [SECURITY.md](SECURITY.md) — please do **not** open a\npublic issue for those.\n\n## Support us\n\nRustBase is built and maintained on personal time. If it helps you ship — or\nif you just want to encourage more work on it — contributions are welcome\nthrough PayPal. The link is a payment link, so you enter the amount yourself\n(no fixed tiers, no recurring trap, just a one-off transfer of whatever feels\nright):\n\n[**→ Support RustBase on PayPal**](https://www.paypal.com/ncp/payment/5L8KUWE8F2PSU)\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.paypal.com/ncp/payment/5L8KUWE8F2PSU\"\u003e\n    \u003cimg src=\"docs/public/donation-qrcode.png\" alt=\"Scan to support RustBase via PayPal\" width=\"180\" /\u003e\n  \u003c/a\u003e\n  \u003cbr\u003e\n  \u003cem\u003eScan to support — opens the PayPal payment page.\u003c/em\u003e\n\u003c/p\u003e\n\nEvery contribution — code, docs, bug reports, PayPal — keeps the project\nmoving. Thank you.\n\n## Licence\n\nDual-licensed under either of:\n\n- MIT License ([LICENSE-MIT](LICENSE-MIT) or\n  \u003chttps://opensource.org/licenses/MIT\u003e)\n- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or\n  \u003chttps://www.apache.org/licenses/LICENSE-2.0\u003e)\n\nat your option.\n\nUnless you explicitly state otherwise, any contribution intentionally\nsubmitted for inclusion in the work by you, as defined in the Apache-2.0\nlicence, shall be dual licensed as above, without any additional terms or\nconditions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpjonaszik%2Frustbase","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpjonaszik%2Frustbase","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpjonaszik%2Frustbase/lists"}