Zero-config developer tools. One click to install. One click to run.
⚠️ Warning Most Code generated By AI.
| Main Dashboard | Running Tool | Tool Settings | Dark Mode |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- ForgeDesk icon:
static/forgedesk-icon.svg(vector, dark steel desk with forge spark)
- 🚀 Zero Configuration - No YAML, no JSON, no .env to edit
- 🖱️ One Click Operations - Install, start, stop, remove - all one click
- ✨ Sensible Defaults - Everything works out of the box
- ⚙️ In-App Settings - Change ports, passwords via GUI (no config files!)
- 🌙 Dark/Light Theme - Toggle between themes
- 🐳 Docker Powered - All tools run in isolated containers
┌─────────────────────────────────────────────────────────────┐
│ 🛠️ ForgeDesk [⚙️] [🌙] │
├─────────────────────────────────────────────────────────────┤
│ [All] [📧 Email] [🔍 Search] [🗄️ Database] [📦 Storage] │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ 📧 Mailpit │ │ 🗄️ MySQL │ │ 🚀 Redis │ │
│ │ ● Running │ │ ○ Stopped │ │ ● Running │ │
│ │ Port: 8025 │ │ Port: 3306 │ │ Port: 6379 │ │
│ │ [Open] [Stop] │ │ [Start] │ │ [Open] [Stop] │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │
│ ┌───────────────┐ ┌───────────────┐ │
│ │ 🐘 PostgreSQL │ │ 🦀 RustFS │ │
│ │ ○ Not Installed│ │ ○ Not Installed│ │
│ │ Port: 5432 │ │ Port: 9000 │ │
│ │ [Install] │ │ [Install] │ │
│ └───────────────┘ └───────────────┘ │
│ │
├─────────────────────────────────────────────────────────────┤
│ 🐳 Docker: Connected │ 2 running │ v0.1.0 │
└─────────────────────────────────────────────────────────────┘
| Tool | Description | Default Ports | Credentials |
|---|---|---|---|
| 📧 Mailpit | Email testing for developers | SMTP: 1025, Web: 8025 | - |
| 📧 MailHog | Classic email testing tool | SMTP: 1026, Web: 8026 | - |
| Tool | Description | Default Ports | Credentials |
|---|---|---|---|
| 🦀 RustFS | S3-compatible object storage | API: 9000 | rustfsadmin / rustfsadmin |
| 📦 MinIO | S3-compatible object storage | API: 9000, Console: 9001 | minioadmin / minioadmin |
| Note: MinIO maintenance announced to end in 2026. RustFS is included as a forward-looking alternative. |
| Tool | Description | Default Ports | Credentials |
|---|---|---|---|
| 🗄️ MySQL | Relational database | 3306 | root / root |
| 🐘 PostgreSQL | Advanced SQL database | 5432 | postgres / postgres |
| 🍃 MongoDB | Document database for modern apps | 27017 | - |
| Tool | Description | Default Ports | Credentials |
|---|---|---|---|
| ⚡ Redis | In-memory data store | 6379 | - |
| Tool | Description | Default Ports | Credentials |
|---|---|---|---|
| 🔍 Meilisearch | Fast, typo-tolerant search engine | 7700 | masterKey |
| 🔎 Elasticsearch | Search and analytics engine | HTTP: 9200, Transport: 9300 | - |
| Tool | Description | Default Ports | Credentials |
|---|---|---|---|
| 🐰 RabbitMQ | Message broker for async communication | AMQP: 5672, Web: 15672 | guest / guest |
| 📨 Kafka | Distributed event streaming platform | Broker: 9092, Controller: 9093 | - |
| Tool | Description | Default Ports | Credentials |
|---|---|---|---|
| 🔐 Keycloak | Identity and access management | 8180 | admin / admin |
| Tool | Description | Default Ports | Credentials |
|---|---|---|---|
| ☁️ LocalStack | AWS cloud services emulator (S3, SQS, SNS, DynamoDB, Lambda) | Gateway: 4566 | test / test |
| Tool | Description | Default Ports | Credentials |
|---|---|---|---|
| 🔥 Prometheus | Metrics and alerting toolkit | 9090 | - |
| 📈 Grafana | Visualization and dashboards | 3000 | admin / admin |
| Tool | Description | Default Ports | Credentials |
|---|---|---|---|
| 🔧 Adminer | Universal database management UI | 8080 | - |
| 🐘 pgAdmin | PostgreSQL management UI | 5050 | [email protected] / admin |
| 🍃 Mongo Express | MongoDB web admin interface | 8081 | admin / pass |
| ⚡ Redis Commander | Redis management web UI | 8082 | - |
| 📊 Kafka UI | Web UI for Apache Kafka | 8083 | - |
- Install Docker Desktop - Download here
- Download ForgeDesk - Get the latest release for your platform
- Launch the app - Tools are ready to install with one click!
Once tools are running, use these connection strings in your applications:
# Mailpit SMTP
smtp://localhost:1025
# MailHog SMTP
smtp://localhost:1026
# Redis
redis://localhost:6379
# MySQL
mysql://root:root@localhost:3306/dev
# PostgreSQL
postgresql://postgres:postgres@localhost:5432/dev
# MongoDB
mongodb://localhost:27017
# RabbitMQ
amqp://guest:guest@localhost:5672
# Meilisearch
http://localhost:7700 (Master Key: masterKey)
# Elasticsearch
http://localhost:9200
# RustFS S3
http://rustfsadmin:rustfsadmin@localhost:9000
# MinIO S3
http://minioadmin:minioadmin@localhost:9000
# Kafka
localhost:9092
# LocalStack (AWS Services)
AWS_ENDPOINT_URL=http://localhost:4566
AWS_ACCESS_KEY_ID=test
AWS_SECRET_ACCESS_KEY=test
# Keycloak
http://localhost:8180 (admin / admin)
# Prometheus
http://localhost:9090
# Grafana
http://localhost:3000 (admin / admin)If you plan to run RustFS and MinIO at the same time, change one of the host ports in Settings to avoid a 9000 clash.
-
Docker mode (container ↔ container): Put your app and MySQL on the same Docker network and use the MySQL container name as host (e.g.,
mysql:3306). Attach withdocker network connect devtools <your_app_container>or share the network in compose:networks: devtools: external: true services: app: networks: [devtools]
-
Host mode (container ↔ host): Use
host.docker.internal:3306or your host IP when MySQL runs on the host. Ensure MySQL binds to0.0.0.0and your firewall allows the port. -
Proxy/tunnel (optional): Only needed when networks cannot be shared. Use HAProxy/SSH/WireGuard to bridge isolated networks; otherwise skip the proxy.
- Docker Desktop must be installed and running
- Rust (for development)
- Node.js (for development)
# Install dependencies
npm install
# Run in development mode
npm run tauri dev
# Run backend tests
cd src-tauri && cargo test# Build for production
npm run tauri build| Platform | Format |
|---|---|
| macOS | .dmg, .app |
| Windows | .msi, .exe |
| Linux | .deb, .AppImage |
The project includes comprehensive tests for the Rust backend:
# Run all tests
cd src-tauri && cargo test
# Run tests with output
cd src-tauri && cargo test -- --nocapture
# Run specific test module
cd src-tauri && cargo test tools::tests
cd src-tauri && cargo test database_tests- Tool Definitions: Tests for all 6 tools (Mailpit, MySQL, Redis, PostgreSQL, MinIO, RustFS)
- Tool Registry: Tests for tool lookup and listing
- Database Operations: Tests for installation tracking, port configuration, auto-start settings
- Serialization: Tests for JSON serialization/deserialization of all data types
- GUI Framework: Tauri 2.x + Svelte 5
- Backend: Rust with Bollard (Docker API)
- Styling: TailwindCSS v4
- Config Storage: SQLite
developer-tools/
├── src/ # Svelte frontend
│ ├── routes/ # SvelteKit routes
│ └── lib/
│ ├── components/ # Svelte components
│ ├── stores/ # State management
│ └── types/ # TypeScript types
│
├── src-tauri/ # Rust backend
│ └── src/
│ ├── lib.rs # Tauri commands
│ ├── docker.rs # Docker integration
│ ├── database.rs # SQLite storage
│ ├── error.rs # Error types
│ └── tools/ # Tool definitions
│ ├── mod.rs # Tool registry
│ ├── mailpit.rs # Mailpit tool
│ ├── mysql.rs # MySQL tool
│ ├── postgres.rs # PostgreSQL tool
│ ├── redis.rs # Redis tool
│ ├── minio.rs # MinIO tool
│ └── tests.rs # Tool tests
│
└── docs/
└── screenshots/ # App screenshots
Screenshots can be captured in two ways:
- Run the app:
npm run tauri dev - Use your OS screenshot tool:
- macOS:
Cmd + Shift + 4then select window - Windows:
Win + Shift + S - Linux:
gnome-screenshot -worscrot
- macOS:
- Save to
docs/screenshots/with these names:main-dashboard.png- Main app windowinstalling-tool.png- During installationrunning-tool.png- Tool with connection infotool-settings.png- Settings modaldark-mode.png- Dark theme
# Run the screenshot helper (interactive prompts)
./scripts/screenshots.sh
# Or show manual instructions only
./scripts/screenshots.sh manualThe script will guide you through capturing each required screenshot.
Note:
tauri-driveronly works on Linux. On macOS/Windows, the script uses native screenshot tools with interactive prompts.
Recommended dimensions: 1200x800 pixels
- Tool Definitions: Each tool is defined in Rust with its Docker image, ports, and configuration
- Docker Management: The app communicates with Docker via the Bollard library
- State Storage: Tool installation status and settings are stored in SQLite
- Real-time Updates: The frontend polls for status changes and receives progress events
┌─────────────────┐ IPC ┌─────────────────┐
│ Svelte Frontend │ ◄──────────► │ Rust Backend │
└─────────────────┘ └─────────────────┘
│
▼
┌────────────────────────────┐
│ Docker API │
│ (via Bollard library) │
└────────────────────────────┘
│
▼
┌────────────────────────────┐
│ Docker Containers │
│ (MySQL, Redis, etc.) │
└────────────────────────────┘
- Ensure Docker Desktop is installed and running
- On macOS, grant Docker access in System Preferences > Security & Privacy
- Use the Settings dialog to change the port
- Or stop the service using the conflicting port
- Check Docker Desktop for container logs
- Ensure you have enough disk space for Docker images
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests:
cd src-tauri && cargo test - Submit a pull request
Want to add a new tool like MongoDB, RabbitMQ, or Meilisearch? Follow these steps:
Create a new file src-tauri/src/tools/mongodb.rs:
use super::{Tool, ToolCategory, ToolPort, ToolEnvVar};
pub fn definition() -> Tool {
Tool {
id: "mongodb".to_string(),
name: "MongoDB".to_string(),
description: "Document database for modern applications".to_string(),
category: ToolCategory::Database,
icon: "🍃".to_string(),
image: "mongo:7".to_string(),
// Define ports
ports: vec![
ToolPort {
name: "MongoDB".to_string(),
host_port: 27017,
container_port: 27017,
protocol: "tcp".to_string(),
},
],
// Environment variables (optional)
env_vars: vec![
// Add if authentication is needed:
// ToolEnvVar {
// name: "MONGO_INITDB_ROOT_USERNAME".to_string(),
// value: "root".to_string(),
// },
// ToolEnvVar {
// name: "MONGO_INITDB_ROOT_PASSWORD".to_string(),
// value: "root".to_string(),
// },
],
// Volume for data persistence
volumes: vec![
("mongodb-data".to_string(), "/data/db".to_string()),
],
// Custom command (optional, use None for default)
command: None,
// Web UI URL (None if no web interface)
web_url: None,
// Connection string template
connection_string: Some("mongodb://localhost:27017".to_string()),
// Default credentials (for display in UI)
default_credentials: None, // or Some(("username", "password"))
}
}Edit src-tauri/src/tools/mod.rs:
// Add the module
mod mongodb;
// In the get_all_tools() function, add:
pub fn get_all_tools() -> Vec<Tool> {
vec![
mailpit::definition(),
mysql::definition(),
postgres::definition(),
redis::definition(),
minio::definition(),
mongodb::definition(), // Add this line
]
}Add to src-tauri/src/tools/tests.rs:
#[test]
fn test_mongodb_definition() {
let tool = super::mongodb::definition();
assert_eq!(tool.id, "mongodb");
assert_eq!(tool.category, ToolCategory::Database);
assert!(!tool.ports.is_empty());
}# Run tests
cd src-tauri && cargo test
# Run the app to see your new tool
npm run tauri dev| Field | Type | Description |
|---|---|---|
id |
String | Unique identifier (lowercase, no spaces) |
name |
String | Display name |
description |
String | Short description |
category |
ToolCategory | Email, Database, Cache, Search, Storage, Queue |
icon |
String | Emoji icon |
image |
String | Docker image (e.g., redis:alpine) |
ports |
Vec | Port mappings |
env_vars |
Vec | Environment variables |
volumes |
Vec<(String, String)> | Volume name → container path |
command |
Option | Custom container command |
web_url |
Option | URL pattern for web UI (use {port} placeholder) |
connection_string |
Option | Connection string template |
default_credentials |
Option<(String, String)> | Default username/password |
Here are some popular tools you might want to add:
// RabbitMQ (Message Queue)
Tool {
id: "rabbitmq",
image: "rabbitmq:3-management",
ports: [(5672, "AMQP"), (15672, "Web UI")],
web_url: Some("http://localhost:15672"),
default_credentials: Some(("guest", "guest")),
}
// Meilisearch (Search Engine)
Tool {
id: "meilisearch",
image: "getmeili/meilisearch:latest",
ports: [(7700, "HTTP API")],
web_url: Some("http://localhost:7700"),
env_vars: [("MEILI_ENV", "development")],
}
// Elasticsearch
Tool {
id: "elasticsearch",
image: "elasticsearch:8.11.0",
ports: [(9200, "HTTP"), (9300, "Transport")],
env_vars: [
("discovery.type", "single-node"),
("xpack.security.enabled", "false"),
],
}
// Adminer (Database Web UI)
Tool {
id: "adminer",
image: "adminer:latest",
ports: [(8080, "Web UI")],
web_url: Some("http://localhost:8080"),
}MIT




