PulseDB is a modern, open-source PostgreSQL management tool with a clean, powerful web interface. Manage databases, browse tables, run SQL queries, and visualize your schema — all from your browser with zero configuration.
[Screenshot Coming Soon]
Tree view of schemas, tables, columns, indexes, constraints, and relations. Navigate your database structure effortlessly.
Browse, filter, search, sort, and paginate through table data with a responsive, spreadsheet-like interface.
Edit cell values directly in the table view — click, type, and save. Changes are committed instantly.
Full-featured editor with syntax highlighting, code completion, query history, and multi-tab support powered by CodeMirror.
View and copy CREATE TABLE statements for any table in your database.
Import SQL files and export database schemas and data with a single click.
Quick overview of database health, active connections, size, and server activity.
Connect with SSL-enabled PostgreSQL instances for secure remote connections.
Built-in light/dark theme that respects your system preference.
Connection passwords encrypted at rest with AES-256-GCM encryption. Passwords never leave the server.
One-command deployment with Docker Compose. Persistent volumes, auto-generated encryption keys.
git clone https://github.com/elmoziml/pulsedb.git
cd pulsedb
docker compose up -dOpen http://localhost:5433 in your browser, create your first connection, and start exploring.
git clone https://github.com/elmoziml/pulsedb.git
cd pulsedb
npm install
npm run devOpen http://localhost:3000 in your browser.
services:
pulsedb:
build: .
ports:
- "5433:3000"
volumes:
- pulsedb-data:/data
restart: always
volumes:
pulsedb-data:The default port is 5433 (a nod to PostgreSQL's 5432). Change it in docker-compose.yml:
ports:
- "8080:3000" # change 8080 to any port you preferPulseDB stores encrypted connection configs and the encryption key in a Docker volume at /data:
/data
├── connections.json # Encrypted connection configurations
└── encryption.key # Auto-generated AES-256 key
The encryption key is generated automatically on first launch. To use your own:
services:
pulsedb:
environment:
- ENCRYPTION_KEY=your-64-char-hex-key| Variable | Required | Default | Description |
|---|---|---|---|
ENCRYPTION_KEY |
No | Auto-generated | 32-byte hex key for AES-256-GCM |
Connection passwords are encrypted at rest using AES-256-GCM:
- Key derived via SHA-256 from
ENCRYPTION_KEYor the auto-generated key - Unique random initialization vector (IV) per encryption
- Passwords never sent to the frontend — API returns
"••••••••" - Legacy plaintext passwords automatically migrated on read
- Node.js 20+
- npm
npm install
npm run dev| Command | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Build for production |
npm start |
Start production server |
npm run lint |
Run ESLint |
src/
├── app/ # Next.js App Router pages & API routes
│ ├── api/ # Backend API endpoints
│ └── connections/ # Connection management pages
├── components/ # React components
├── lib/ # Utilities, store, crypto, database
└── types/ # TypeScript type definitions
| Framework | Next.js 16 (App Router) |
| UI Library | React 19, Ant Design 6 |
| Styling | Tailwind CSS 4 |
| Database | PostgreSQL via pg |
| Code Editor | CodeMirror with SQL language support |
| State Management | Zustand |
| Encryption | Node.js crypto (AES-256-GCM) |
| Font | Inter via next/font |
| Language | TypeScript 5 (strict mode) |
We welcome contributions! Please see our Contributing Guide for details.
- Encryption at rest — AES-256-GCM with random IV per connection
- No password leaks — Passwords masked in API responses
- Encryption key — Auto-generated or user-provided via
ENCRYPTION_KEY - Local storage — Connections stored in a Docker volume, not in the database
See SECURITY.md for full details.
MIT © elmoziml.com