View Demo · Report Bug · Request Feature
Local-first secrets dashboard and GitOps `.env` injector.
Table of Contents
Rage UI is a local-first web dashboard for managing shared and per-project secrets. It stores secrets as SOPS/Age-encrypted JSON files, lets you edit them from a React UI, and injects them into project .env files from templates.
Built for personal infrastructure, homelabs, and small project fleets where the same tokens or API keys are reused across several apps but should stay encrypted in Git.
graph LR
UI[React UI] --> API[Bun + Express API]
API --> SOPS[SOPS / Age]
API --> Git[Git]
SOPS --> Global[global/secrets.enc.json]
SOPS --> Project[project/secrets.enc.json]
Global --> Inject[Template injector]
Project --> Inject
Template[.env.template] --> Inject
Inject --> Env[generated .env]
— JavaScript runtime & backend
— UI framework
— HTTP server
— Frontend build tool
— Backend type safety
— Secrets encryption
— Container deployment
— E2E testing
— Unit testing
git clone https://github.com/Sofian-bll/Rage-UI.git
cd Rage-UI
# Backend (Bun)
cd backend && bun install && bun run server.ts
# Frontend (Vite + React) — second terminal
cd frontend && npm install && npm run devBackend: http://localhost:3000 · Frontend: http://localhost:5173
- Keep shared secrets in
global/ - Define
.env.templatewith{{GLOBAL.KEY}}and{{KEY}}placeholders - Click Inject .env to merge global + local into a generated
.env - Sync encrypted files through Git from the UI
PROJECTS_DIR/
├── global/secrets.enc.json
├── pokedex/.env.template + secrets.enc.json
└── api_meteo/.env.template
| Variable | Purpose | Default |
|---|---|---|
PROJECTS_DIR |
Projects directory | ./projects |
APP_API_KEY |
Optional API key for write routes | unset |
SOPS_AGE_KEY_FILE |
Age key path | SOPS default |
docker-compose up -d --buildMounts: SOPS Age key, SSH key, projects directory.
| Method | Route | Auth |
|---|---|---|
GET |
/api/projects |
public |
GET |
/api/secrets/:project |
public |
POST |
/api/secrets/:project |
API key |
POST |
/api/inject/:project |
API key |
GET |
/api/git/status |
public |
POST |
/api/git/sync |
API key |
Rage-UI/
├── docs/
│ ├── assets/ (logo + screenshot)
│ ├── superpowers/ (plans & specs)
│ └── index.html (landing page)
├── backend/
│ ├── app.ts (API routes)
│ ├── app.test.ts
│ ├── server.ts (entry point)
│ ├── projects/ (sample data: api_meteo, pokedex)
│ └── secrets.json (dev secrets)
├── e2e/
│ ├── tests/ (app.spec.ts, screenshot.spec.ts)
│ └── playwright.config.ts
├── frontend/
│ ├── src/ (App, editor, gitpanel, shell, settings)
│ └── vite.config.js
├── Dockerfile
├── docker-compose.yml
├── LICENSE
├── README.md
└── README.fr.md
| Resource | Description |
|---|---|
README.fr.md |
French version |
docs/index.html |
Landing page |
backend/README.md |
Backend notes |
frontend/README.md |
Frontend notes |
cd backend && bun test # Backend
cd frontend && npm run test # Frontend
cd e2e && npm run test # E2E (needs backend + frontend running)Rage UI is released under the MIT License.
Issues and improvements welcome. Keep changes focused, update tests, and never commit real secrets or .env files.
