ManUp is an open-source, self-hosted Secrets Management platform
1.6K
ManUp is an open-source, self-hosted Secrets Management platform designed to securely store, manage, and orchestrate environment secrets across your projects, teams, and environments. Built with a modern, responsive user experience and robust Role-Based Access Control (RBAC), ManUp provides a lightweight, developer-friendly alternative to Infisical and HashiCorp Vault.
Owner, Admin, Viewer) to restrict access. Ensure only authorized users perform destructive actions (editing environments, managing API keys, deleting secrets).full (read/write) or read-only scopes, optionally restricted to a specific project or organization-wide.GET /api/secrets?env=...&project=...&format=dotenv or JSON format, perfect for CI/CD pipelines and headless scripts..env files for bulk secret creation/updates, with auto-wrapping, auto-resizing text fields for certificates and long configuration values.PGLITE).httpOnly secure cookies to mitigate token interception/XSS vulnerabilities, complete with user session logout confirmation.| š Dark Mode | āļø Light Mode |
|---|---|
![]() | ![]() |
ManUp is structured as a monorepo consisting of two primary packages:
/client): A premium Single-Page Application (SPA) built with React 19, TypeScript, TailwindCSS v4, and Vite. Features a modern, collapsible icon-only sidebar, dedicated project workspaces, light/dark themes, responsive data tables, and interactive confirmation overlays./server): A robust REST API server built with Node.js, Express, and TypeScript. Relies on Drizzle ORM for database interaction and uses PGLite (embedded PostgreSQL in Node.js) for simple, serverless-like data persistence.When packaged for production, the client SPA is compiled and served directly by the Express backend server as a single lightweight container.
ManUp includes an official, standalone Command Line Interface: manup-cliā (npm install -g manup-cli).
The CLI allows developers, CI/CD pipelines, and server scripts to seamlessly authenticate with your self-hosted ManUp Vault server, sync environment variables, and inject secrets directly into application processes.
Install globally via npm or run statelessly using npx:
# Global installation
npm install -g manup-cli
# Or run statelessly
npx manup-cli --help
Authenticate with your self-hosted ManUp server instance:
# Interactive login (Direct Email/Username & Password or API Key)
manup login
# Non-interactive direct login
manup login --server http://localhost:7780 --user [email protected] --password adminpassword123
# Non-interactive API key login
manup login --server http://localhost:7780 --api-key mp_your_api_key
~/.config/manup-cli-nodejs/ are encrypted with AES-256-CBC using a key derived from your machine identity with strict POSIX permissions (0600).MANUP_SERVER_URL and MANUP_API_KEY (or MANUP_TOKEN) in environment variables.# 1. Link current directory interactively or scriptably by name
cd /path/to/my-app
manup init
manup init -p my-project -e dev
# 2. List, view, or export decrypted secrets by environment name
manup secrets ls -e dev
manup secrets ls -e prod --reveal
manup secrets export -e prod --out .env
# 3. Inject secrets directly into runtime processes without writing secrets to disk
manup run -- npm start
manup run -e dev -- npm start
manup run -p backend -e prod -- npm test
# 4. Provision and manage API keys (including project-scoped keys)
manup keys ls
manup keys create ci-token --scope full --project backend

š View full CLI source code and documentation: github.com/Amanbig/manup-cliā
Ensure you have Dockerā and Docker Composeā installed.
Clone the Repository:
git clone https://github.com/Amanbig/ManUp.git
cd ManUp
Configure Environment Variables:
Create a .env file or configure values directly in your container orchestration setup.
Key environment variables inside docker-compose.yml:
MASTER_KEY: A 32-character hexadecimal key used to encrypt/decrypt secrets.JWT_SECRET: Secret token signature key.PORT: Server port (default: 7780).Start the Platform:
docker compose up --build -d
Access the Web Dashboard: Open http://localhost:7780ā in your browser.
ManUp images are automatically built and published via GitHub Actions to GitHub Container Registry (GHCR) and Docker Hub.
Images are tagged by release version (e.g. 1.0.0), with latest always pointing at the newest stable release.
# From Docker Hub
docker pull procoder588/manup:latest
docker pull procoder588/manup:0.4.0
# From GitHub Container Registry (GHCR)
docker pull ghcr.io/amanbig/manup:latest
docker pull ghcr.io/amanbig/manup:0.4.0
Run a self-contained vault instance on port 7780 with automated local storage (optionally seeding a default admin user to skip the signup flow):
docker run -d \
--name manup-vault \
-p 7780:7780 \
-e DB_TYPE="PGLITE" \
-e MASTER_KEY="your_32_character_hexadecimal_key" \
-e JWT_SECRET="your_jwt_signing_secret_key" \
-e REFRESH_TOKEN_SECRET="a_different_jwt_signing_secret_key" \
-e DEFAULT_ADMIN_EMAIL="[email protected]" \
-e DEFAULT_ADMIN_PASSWORD="adminpassword123" \
-e DEFAULT_ADMIN_NAME="Admin User" \
-e DEFAULT_ADMIN_USERNAME="admin" \
-v manup_data:/app/manup \
--restart always \
procoder588/manup:latest
| Variable | Description | Default Value | Required |
|---|---|---|---|
PORT | Port the backend server listens on. | 7780 | No |
DB_TYPE | Type of Postgres DB. Choose PGLITE or leave blank for external DB. | PGLITE | Yes |
DB_DIR | Path to persist SQLite-like files when using PGLITE. | /app/manup | Only for PGLITE |
DATABASE_URL | Connection string to external Postgres instance. | ā | Only if DB_TYPE !== PGLITE |
MASTER_KEY | 32-character hex key for secret encryption. | ā | Yes |
JWT_SECRET | Secret key for signing access-token cookies. | ā | Yes |
REFRESH_TOKEN_SECRET | Secret key for signing refresh-token cookies. Must be different from JWT_SECRET. | ā | Yes |
ENABLE_SIGNUP | true/false ā whether the public signup form/endpoint is enabled. If unset, defaults to disabled once DEFAULT_ADMIN_EMAIL/DEFAULT_ADMIN_PASSWORD are set, enabled otherwise. | ā | No |
DEFAULT_ADMIN_EMAIL | The default administrator email to pre-seed on first startup. | ā | No |
DEFAULT_ADMIN_PASSWORD | The default administrator password to pre-seed on first startup. | ā | No |
DEFAULT_ADMIN_NAME | The default administrator display name override (used with email/password). | Admin | No |
DEFAULT_ADMIN_USERNAME | The default administrator username override (used with email/password). | admin | No |
More variables (SMTP, admin name/username overrides, ALLOWED_ORIGINS) are documented on the Wikiā .
To run both client and server locally without Docker:
Install Dependencies: From the root directory, install all client and server dependencies:
cd client && npm install
cd ../server && npm install
Setup Server Config:
Create server/.env with the following variables:
PORT=7780
DB_TYPE=PGLITE
DB_DIR=./manup_dev
MASTER_KEY=9a8b7c6d5e4f3g2h1i0j9k8l7m6n5o4p
JWT_SECRET=super_secret_jwt_sign_key_manup_2026
REFRESH_TOKEN_SECRET=a_different_refresh_token_sign_key_2026
Run Services:
cd server
npm run dev
cd client
npm run dev
Contributions are welcome ā bug fixes, features, or docs. See CONTRIBUTING.mdā for the development workflow, code style (Prettier/ESLint), commit conventions, and the PR process. Check the Wikiā for deeper guides beyond this README.
ManUp handles secrets, so security reports get priority. Do not open a public issue for vulnerabilities. See SECURITY.mdā for how to report privately and what's in scope.
This project follows the Contributor Covenant Code of Conductā . By participating, you're expected to uphold it.
ManUp is released under the MIT Licenseā .
Content type
Image
Digest
sha256:5afa1baebā¦
Size
71.1 MB
Last updated
11 days ago
docker pull procoder588/manup