{"id":36967463,"url":"https://github.com/moinsen-dev/devhub","last_synced_at":"2026-01-13T20:04:15.559Z","repository":{"id":328954765,"uuid":"1117473430","full_name":"moinsen-dev/devhub","owner":"moinsen-dev","description":" Start, stop, and monitor all your local development services from one place.","archived":false,"fork":false,"pushed_at":"2025-12-17T14:43:26.000Z","size":467,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"develop","last_synced_at":"2025-12-20T01:52:31.270Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://moinsen-dev.github.io/devhub/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/moinsen-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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}},"created_at":"2025-12-16T11:10:35.000Z","updated_at":"2025-12-17T14:43:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/moinsen-dev/devhub","commit_stats":null,"previous_names":["moinsen-dev/devhub"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/moinsen-dev/devhub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moinsen-dev%2Fdevhub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moinsen-dev%2Fdevhub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moinsen-dev%2Fdevhub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moinsen-dev%2Fdevhub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/moinsen-dev","download_url":"https://codeload.github.com/moinsen-dev/devhub/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moinsen-dev%2Fdevhub/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28399529,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T14:36:09.778Z","status":"ssl_error","status_checked_at":"2026-01-13T14:35:19.697Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2026-01-13T20:04:14.799Z","updated_at":"2026-01-13T20:04:15.553Z","avatar_url":"https://github.com/moinsen-dev.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DevHub\n\n**Multi-project development environment manager** - Start, stop, and monitor all your local development services from one place.\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Rust](https://img.shields.io/badge/rust-1.75+-orange.svg)](https://www.rust-lang.org)\n[![Release](https://img.shields.io/github/v/release/moinsen-dev/devhub)](https://github.com/moinsen-dev/devhub/releases)\n[![Docs](https://img.shields.io/badge/docs-mdbook-blue)](https://moinsen-dev.github.io/devhub/)\n\n## The Problem\n\nWorking on multiple projects means juggling multiple terminals:\n\n```bash\n# Project A\ncd ~/work/project-a \u0026\u0026 npm run dev        # Terminal 1\ncd ~/work/project-a \u0026\u0026 cargo run          # Terminal 2\n\n# Project B\ncd ~/work/project-b \u0026\u0026 docker compose up  # Terminal 3\ncd ~/work/project-b \u0026\u0026 npm start          # Terminal 4\n\n# Which ports? Which commands? Where's that README again?\n```\n\n## The Solution\n\n```bash\ndevhub start project-a    # Starts all services\ndevhub start project-b    # Starts all services\ndevhub status             # See everything at a glance\n\n# Or open http://devhub.localhost for the dashboard\n```\n\n## Features\n\n- **One command to rule them all** - `devhub start` launches your entire stack\n- **Bulk discovery** - Scan directories and register 100+ projects at once\n- **Monorepo support** - Auto-detects multi-service projects (frontend + backend + packages)\n- **Environment file loading** - Automatic `.env` and `.env.local` support with variable interpolation\n- **Web dashboard** - Visual status, start/stop buttons, log viewer, real-time updates\n- **Fuzzy search** - Find projects fast with `devhub search`\n- **Favorites \u0026 Recent** - Star projects, track recently used\n- **Batch operations** - `devhub start --all` or `--favorites`\n- **Auto-discovery** - Detects Rust, Node, Python, Go, Docker, Flutter projects\n- **Port conflict detection** - Know before you crash with `devhub ports --resolve`\n- **PM2 integration** - Node.js services managed properly\n- **Docker Compose support** - First-class container orchestration\n- **Health checks** - Wait for services to be truly ready\n- **Reverse proxy integration** - Pretty URLs like `http://myproject.localhost`\n- **Shell completions** - Tab completion for bash, zsh, and fish\n- **Developer shortcuts** - `devhub code`, `devhub open`, `devhub path`\n- **Zero lock-in** - Simple TOML config, works with any stack\n\n---\n\n## Quick Start\n\n### 1. Install DevHub\n\n```bash\n# Homebrew (macOS)\nbrew tap moinsen-dev/tap\nbrew install devhub\n\n# Or download pre-built binary\ncurl -sL https://github.com/moinsen-dev/devhub/releases/latest/download/devhub-aarch64-apple-darwin.tar.gz | tar xz\nsudo mv devhub /usr/local/bin/\n\n# Or from source\ngit clone https://github.com/moinsen-dev/devhub.git \u0026\u0026 cd devhub\ncargo build --release \u0026\u0026 cp target/release/devhub ~/.local/bin/\n```\n\n### 2. Discover Your Projects\n\n```bash\n# Scan your project directories\ndevhub scan --dry-run ~/work\n\n# Found 50 projects? Register them all!\ndevhub scan --auto-register ~/work\n```\n\n### 3. Install Shell Completions\n\n```bash\n# Zsh (most common on macOS)\ndevhub completions zsh \u003e ~/.zfunc/_devhub\n\n# Bash\ndevhub completions bash \u003e ~/.local/share/bash-completion/completions/devhub\n\n# Fish\ndevhub completions fish \u003e ~/.config/fish/completions/devhub.fish\n```\n\n### 4. Start Working\n\n```bash\n# Start a project\ndevhub start my-project\n\n# Check status\ndevhub status\n\n# Quick navigation\ncd $(devhub path my-project)  # Jump to project directory\ndevhub code my-project        # Open in VS Code\ndevhub open my-project        # Open in browser\n\n# Check for port conflicts\ndevhub ports --check\n```\n\n### 5. Launch the Dashboard (Optional)\n\n```bash\n# Start the daemon as a background service\ndevhub daemon start\n\n# Or if installed via Homebrew\nbrew services start devhub\n\n# Start the UI\ncd devhub-ui \u0026\u0026 npm install \u0026\u0026 npm run dev\n\n# Open http://localhost:5173\n```\n\n---\n\n## CLI Reference\n\n### Project Management\n\n```bash\ndevhub init                    # Create devhub.toml in current directory\ndevhub discover                # Auto-detect and generate devhub.toml\ndevhub discover --dry-run      # Preview discovery without writing files\ndevhub register [path]         # Register project with DevHub\ndevhub unregister \u003cname\u003e       # Remove project from registry\ndevhub list                    # List all registered projects\n```\n\n### Bulk Operations\n\n```bash\ndevhub scan [paths...]         # Scan directories for projects\ndevhub scan --dry-run          # Preview what would be discovered\ndevhub scan --auto-register    # Discover and register in one step\ndevhub scan --depth 3          # Scan deeper into subdirectories\n```\n\n### Service Control\n\n```bash\ndevhub start [project]         # Start project services\ndevhub start --all             # Start ALL registered projects\ndevhub start --favorites       # Start all favorite projects\ndevhub stop [project]          # Stop project services\ndevhub restart [project]       # Restart project services\ndevhub status                  # Show status of all projects\ndevhub logs \u003cproject\u003e [-f]     # Stream logs (with follow mode)\n```\n\n### Discovery \u0026 Search\n\n```bash\ndevhub search \u003cquery\u003e          # Fuzzy search for projects\ndevhub recent                  # Show recently used projects\ndevhub fav add \u003cproject\u003e       # Add to favorites\ndevhub fav list                # List favorites\ndevhub fav toggle \u003cproject\u003e    # Toggle favorite status\n```\n\n### Port Management\n\n```bash\ndevhub ports                   # Show all port allocations\ndevhub ports --check           # Detect port conflicts\ndevhub ports --resolve         # Suggest fixes for conflicts\n```\n\n### Developer Shortcuts\n\n```bash\ndevhub open \u003cproject\u003e          # Open project in browser\ndevhub open \u003cproject\u003e -s api   # Open specific service\ndevhub code \u003cproject\u003e          # Open project in VS Code\ndevhub path \u003cproject\u003e          # Print project path (for cd integration)\n```\n\n### Environment \u0026 Utilities\n\n```bash\ndevhub env \u003cproject\u003e           # Show resolved environment variables\ndevhub env \u003cproject\u003e -s api    # Show env for specific service\ndevhub env \u003cproject\u003e -f export # Output in shell export format\ndevhub completions \u003cshell\u003e     # Generate shell completions (bash/zsh/fish)\n```\n\n### Daemon Management\n\n```bash\ndevhub daemon                  # Run daemon in foreground (default)\ndevhub daemon start            # Start daemon as background service\ndevhub daemon stop             # Stop running daemon\ndevhub daemon restart          # Restart daemon\ndevhub daemon status           # Show daemon status and version\ndevhub daemon --port 9876      # Run on custom port\n```\n\n---\n\n## Configuration\n\nEach project gets a `devhub.toml` file:\n\n```toml\n[project]\nname = \"my-app\"\ndescription = \"My awesome application\"\ntags = [\"rust\", \"web\"]\nenv_files = [\".env\", \".env.local\"]  # Environment files to load\n\n[[services]]\nname = \"api\"\ntype = \"rust-binary\"\ncommand = \"cargo run --release\"\nport = 8080\nhealth_check = \"/health\"\nsubdomain = \"api\"           # http://api.my-app.localhost\nenv_file = \"api/.env\"       # Service-specific env file\n\n[[services]]\nname = \"frontend\"\ntype = \"node\"\ncommand = \"npm run dev\"\ncwd = \"frontend\"            # Relative working directory\nport = 3000\nmain = true                 # http://my-app.localhost (no subdomain)\ndepends_on = [\"api\"]        # Start order\n\n[environment]\nRUST_LOG = \"info\"\nDATABASE_URL = \"postgres://localhost/myapp\"\n```\n\n### Environment Loading Priority\n\nEnvironment variables are loaded in this order (later sources override earlier):\n\n1. System environment variables\n2. Project root `.env` file\n3. Project root `.env.local` file\n4. Files listed in `env_files`\n5. `[environment]` section in manifest\n6. Service-specific `env_file`\n7. Service `cwd/.env` file\n8. Service `cwd/.env.local` file\n9. Service `env = {}` section\n10. **DevHub service URL injection** (see below)\n\nVariable interpolation is supported: `DATABASE_URL=$DB_HOST:$DB_PORT/mydb`\n\n### Service URL Environment Variables\n\nDevHub automatically injects environment variables for **service-to-service communication**. This solves the common problem of hardcoding `localhost:PORT` in your `.env` files.\n\n#### Auto-Injected Variables\n\nFor every service in your project, DevHub injects:\n\n| Variable | Example | Description |\n|----------|---------|-------------|\n| `DEVHUB_\u003cSERVICE\u003e_URL` | `http://api.myapp.localhost` | External URL via Caddy reverse proxy |\n| `DEVHUB_\u003cSERVICE\u003e_INTERNAL_URL` | `http://myapp-api:8080` | Internal URL for container-to-container |\n| `DEVHUB_\u003cSERVICE\u003e_PORT` | `8080` | Service port |\n\nExample for a project with `api` and `frontend` services:\n```bash\nDEVHUB_API_URL=http://api.myapp.localhost\nDEVHUB_API_INTERNAL_URL=http://myapp-api:8080\nDEVHUB_API_PORT=8080\nDEVHUB_FRONTEND_URL=http://myapp.localhost\nDEVHUB_FRONTEND_INTERNAL_URL=http://myapp-frontend:3000\nDEVHUB_FRONTEND_PORT=3000\n```\n\n#### Service Reference Syntax\n\nYou can reference other services in your `devhub.toml` using the `${service.property}` syntax:\n\n```toml\n[[services]]\nname = \"frontend\"\ntype = \"node\"\ncommand = \"npm run dev\"\nport = 3000\nmain = true\n\n[services.env]\n# These get auto-expanded by DevHub:\nNEXT_PUBLIC_API_URL = \"${api.url}\"           # → http://api.myapp.localhost\nINTERNAL_API_URL = \"${api.internal}\"         # → http://myapp-api:8080\nAPI_PORT = \"${api.port}\"                     # → 8080\n```\n\nAvailable properties:\n- `${service.url}` - External URL (via Caddy, for browser/client-side)\n- `${service.internal}` - Internal URL (for container-to-container communication)\n- `${service.port}` - Service port number\n\n#### Use Case: Next.js + Python Backend\n\n```toml\n[project]\nname = \"demo-app\"\nmode = \"container\"\n\n[[services]]\nname = \"backend\"\ntype = \"python\"\ncommand = \"uvicorn main:app --host 0.0.0.0 --port 8081\"\nport = 8081\nsubdomain = \"api\"\n\n[[services]]\nname = \"frontend\"\ntype = \"node\"\ncommand = \"npm run dev\"\nport = 3000\nmain = true\n\n[services.env]\n# Client-side API calls go through Caddy\nNEXT_PUBLIC_API_URL = \"${backend.url}\"\n```\n\nYour frontend automatically gets `NEXT_PUBLIC_API_URL=http://api.demo-app.localhost` - no more hardcoded `localhost:8081`!\n\n### Service Types\n\n| Type | Detection | Default Command |\n|------|-----------|-----------------|\n| `rust-binary` | `Cargo.toml` with `[[bin]]` | `cargo run` |\n| `node` | `package.json` | `npm run dev` (uses PM2 if available) |\n| `python` | `pyproject.toml` | `uvicorn` or `python -m` |\n| `go` | `go.mod` | `go run .` |\n| `docker-compose` | `docker-compose.yml` | `docker compose up -d` |\n| `shell` | Any | Custom command |\n\n---\n\n## Dashboard\n\nThe web dashboard provides:\n\n- Project cards with running status indicators\n- One-click start/stop/restart buttons\n- **Log viewer** with auto-refresh and syntax highlighting\n- **Service-level controls** (start/stop individual services on hover)\n- Real-time auto-refresh (5-second polling)\n- Search and filter by name or status\n- Service metrics (X/Y services running)\n- Open in Terminal / VS Code buttons\n\n**Access:**\n- `http://devhub.localhost` (with Caddy proxy)\n- `http://localhost:5173` (development mode)\n\n---\n\n## Reverse Proxy Setup\n\nDevHub auto-generates Caddy configurations for pretty `.localhost` URLs.\n\n### Quick Setup\n\n```bash\ncd proxy\ndocker compose up -d\n```\n\nThis gives you:\n- `http://projectname.localhost` - Your main service\n- `http://api.projectname.localhost` - API services\n- `http://devhub.localhost` - Dashboard\n\n### Custom Proxy Location\n\n```bash\nmkdir -p ~/.devhub\ncat \u003e ~/.devhub/config.toml \u003c\u003c EOF\ncaddy_sites_dir = \"/path/to/your/proxy/sites.d\"\ncaddy_reload_command = \"docker exec caddy-proxy caddy reload --config /etc/caddy/Caddyfile\"\nEOF\n```\n\n---\n\n## Project Structure\n\n```\ndevhub/\n├── src/                  # Rust CLI + daemon\n│   ├── main.rs           # CLI entry (clap)\n│   ├── api.rs            # REST API (axum)\n│   ├── process.rs        # Service management (PM2, Docker, native)\n│   ├── discovery.rs      # Auto-detection (6 project types)\n│   ├── manifest.rs       # TOML parsing\n│   ├── registry.rs       # Project registry (+ favorites, recent)\n│   ├── ports.rs          # Port allocation \u0026 conflict detection\n│   ├── caddy.rs          # Proxy config generation\n│   └── config.rs         # Global settings\n├── devhub-ui/            # SvelteKit dashboard (Svelte 5)\n├── proxy/                # Caddy reverse proxy setup\n└── Cargo.toml            # Rust dependencies\n```\n\n---\n\n## Troubleshooting\n\n### Port shows as \"not running\" but service is up\n\nDevHub checks both IPv4 and IPv6. If issues persist:\n\n```bash\nlsof -i :3000\n```\n\n### PM2 not being used\n\nPM2 must be installed globally:\n\n```bash\nnpm install -g pm2\n```\n\n### Service won't start\n\n```bash\n# Check logs\ndevhub logs my-project my-service\n\n# Or directly\ncat ~/Library/Application\\ Support/com.moinsen.devhub/logs/my-project/my-service.err.log\n```\n\n### Caddy not reloading\n\n```bash\ndocker exec caddy-proxy caddy reload --config /etc/caddy/Caddyfile\ndocker logs caddy-proxy\n```\n\n---\n\n## Installation\n\n### Homebrew (macOS)\n\n```bash\nbrew tap moinsen-dev/tap\nbrew install devhub\n\n# Start as background service (optional)\nbrew services start devhub\n```\n\n### Pre-built Binaries\n\nDownload from [GitHub Releases](https://github.com/moinsen-dev/devhub/releases):\n\n```bash\n# macOS Apple Silicon\ncurl -sL https://github.com/moinsen-dev/devhub/releases/latest/download/devhub-aarch64-apple-darwin.tar.gz | tar xz\nsudo mv devhub /usr/local/bin/\n\n# macOS Intel\ncurl -sL https://github.com/moinsen-dev/devhub/releases/latest/download/devhub-x86_64-apple-darwin.tar.gz | tar xz\nsudo mv devhub /usr/local/bin/\n\n# Linux x64\ncurl -sL https://github.com/moinsen-dev/devhub/releases/latest/download/devhub-x86_64-unknown-linux-gnu.tar.gz | tar xz\nsudo mv devhub /usr/local/bin/\n\n# Linux ARM64\ncurl -sL https://github.com/moinsen-dev/devhub/releases/latest/download/devhub-aarch64-unknown-linux-gnu.tar.gz | tar xz\nsudo mv devhub /usr/local/bin/\n```\n\n### From Source\n\n```bash\ngit clone https://github.com/moinsen-dev/devhub.git\ncd devhub\ncargo build --release\ncp target/release/devhub ~/.local/bin/\n```\n\n### Cargo (crates.io) - Coming Soon\n\n```bash\ncargo install devhub\n```\n\n---\n\n## Contributing\n\nContributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n---\n\n## Acknowledgments\n\n- [Caddy](https://caddyserver.com/) - The reverse proxy that makes this possible\n- [axum](https://github.com/tokio-rs/axum) - Excellent Rust web framework\n- [clap](https://github.com/clap-rs/clap) - CLI argument parsing with completions\n- [PM2](https://pm2.keymetrics.io/) - Node.js process management\n- [SvelteKit](https://kit.svelte.dev/) - Clean, fast UI framework\n\n---\n\n*\"Stop remembering. Start building.\"*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoinsen-dev%2Fdevhub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmoinsen-dev%2Fdevhub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoinsen-dev%2Fdevhub/lists"}