A native container manager built for developers who use Podman. No forced sign-ins. No Electron. No bloat. Just a fast desktop app that stays out of your way.
container-demo.mp4
compose-demo.mp4
misc-demo.mp4
Requires: Rust stable, Node.js 22+, pnpm 10+, Podman. See building from source for full setup.
# Linux — enable Podman socket and install compose
systemctl --user enable --now podman.socket
pip install podman-compose
# Clone, install, build, run
git clone https://github.com/harbr-hq/harbr-app
cd harbr && pnpm install && pnpm tauri build
./src-tauri/target/release/harbrmacOS / Windows: see macos/ and windows/ for guided setup scripts.
Once Harbr is running, here are two ways to kick the tyres.
Save this as ~/compose/demo/compose.yaml:
services:
web:
image: docker.io/library/nginx:alpine
ports:
- "8080:80"
api:
image: docker.io/library/node:22-alpine
working_dir: /app
command: sh -c "node -e \"const h=require('http');h.createServer((_,r)=>{r.writeHead(200);r.end('Hello from Harbr demo API')}).listen(3000)\""
ports:
- "3000:3000"
db:
image: docker.io/library/postgres:16-alpine
environment:
POSTGRES_PASSWORD: demo
POSTGRES_DB: harbr_demo
volumes:
- pgdata:/var/lib/postgresql/data
cache:
image: docker.io/library/redis:7-alpine
ports:
- "6379:6379"
volumes:
pgdata:Then in Harbr:
- Open Preferences (sidebar footer) → Compose Directories → add
~/compose - Click Compose in the sidebar — the
demoproject appears automatically - Click into the project → hit Up → watch all four containers stream to life in real time
- Switch to Containers — you'll see them all running with live CPU and memory bars
- Click any container → Logs for live output, Terminal to drop into a shell
- In Containers, click Run Container (top-right button)
- Image:
docker.io/library/nginx:alpine - Name:
my-nginx - Add a port mapping: host
8080→ container80 - Hit Run — the container appears in the list immediately
- Click it → Logs to see nginx startup output, or Terminal to explore the filesystem
Note: Podman requires fully-qualified image names —
docker.io/library/nginx:alpinenot justnginx. Harbr's Run Container sheet will remind you if the pull fails.
Hit Help in the sidebar. Every feature has its own documentation page with screenshots. Type anything into the search box at the top of the Help sidebar and results jump straight to the relevant section — no browser, no Googling, no leaving the app.
Docker Desktop is slow, requires a sign-in, and doesn't feel native. Rancher Desktop is clunky. Neither was built with developer experience as a first principle.
Harbr is different:
- Podman — daemonless, rootless by default, OCI-compliant, fully Docker API compatible
- Native desktop app — Tauri v2, not Electron, not a web app wrapped in Chrome
- No forced accounts — auth via bearer token, you control the token
- Persistent log search — full-text search across all containers, not just tailing the last 100 lines
- Single binary — desktop app and daemon in one, no separate installer
- Live container list with status indicators (animated pulse dot for running containers)
- Start, stop, pause, unpause, and remove containers
- Inline CPU and memory usage bars in the list view
- Port mappings at a glance
- Bulk start / stop across multiple containers
- Search and filter by name, running-only toggle
- Run container with port mapping, environment variables, and command override
- Grouped view — containers grouped by Compose project or custom group, with drag-and-drop reorder
- Copy container ID from the list
- Live log streaming via WebSocket
- Pause / resume with buffered catch-up (up to 1000 lines held while paused)
- Wildcard filter (
*and?) applied client-side in real time — no reconnect needed - Highlighted matches in the log output
stdout/stderrcolour coding
- Live CPU and memory area charts, seeded immediately on open
- Persistent logging toggle — opt individual containers into log storage
- Retention policy: by disk size (MB) or by age (days)
The headline feature. Once persistent logging is enabled for a container, every log line is stored locally and becomes searchable.
- Full-text search across all containers simultaneously
- Filter by container (coloured token chips — add and remove individually)
- Filter by stream (
stdout/stderr) - Time range presets: 1h, 6h, 24h, 7d, or all time
- Results show container, stream, timestamp, and highlighted matching line
- Paginated load more — no artificial result caps
- Filter state persists in the URL
- Full interactive terminal into any running container
- Powered by xterm.js v6
- Session persists across tab switches
- Project discovery — scans configured directories and pulls in Podman-label-tracked projects
- YAML editor with syntax highlighting and validation (CodeMirror 6)
- Streaming output for
up,down,restart, andpulloperations - Fan-in log view across all services in a project
- File management — view and edit compose files in the UI
- List, inspect, and remove images, volumes, and networks
- Container membership view for networks
- Volume usage and file browser
- Daemon health indicator
- Container and Compose actions from the tray menu
- Crash notifications when a running container exits unexpectedly
- Close-to-tray preference
- Searchable help covering every feature, with screenshots
- Type any term in the search box — results link directly to the relevant heading
- Troubleshooting guide for common Podman and Compose errors
- Light / dark / system theme
- Collapsible sidebar (icon rail with tooltips when collapsed)
- Bearer token auth — loopback connections bypass auth automatically
- Layered config: system → user → environment variables → CLI flags
| Library | Version | Purpose |
|---|---|---|
| Tauri | v2 | Native desktop shell — Rust backend, WebView frontend, no Electron |
| React | 19 | UI framework |
| TypeScript | 5.8 | Type safety across the entire frontend |
| Vite | 7 | Frontend build tool and dev server |
| Library | Version | Purpose |
|---|---|---|
| TanStack Router | v1 | File-based routing with type-safe search params |
| TanStack Query | v5 | Server state, caching, and background refetching |
| Tailwind CSS | v4 | Utility-first styling |
| shadcn/ui | — | Accessible component primitives (Radix UI based) |
| xterm.js | v5 | In-app container terminal |
| CodeMirror | v6 | YAML editor for Compose files |
| date-fns | v4 | Date formatting |
| Sonner | v2 | Toast notifications |
| Lucide React | — | Icon set |
| dnd kit | v6 | Drag-and-drop for container group reordering |
| Recharts | v2 | CPU and memory area charts |
| Crate | Version | Purpose |
|---|---|---|
| Axum | 0.8 | HTTP and WebSocket server |
| Tokio | 1 | Async runtime |
| Bollard | 0.20 | Podman/Docker API client |
| SurrealDB | 3 | Embedded local database (log storage, settings, groups) |
| Figment | 0.10 | Layered configuration (TOML → env → CLI) |
| Clap | 4 | CLI argument parsing |
| Anyhow | 1 | Error handling |
| Serde | 1 | Serialisation/deserialisation |
| Tracing | 0.1 | Structured logging |
There are no pre-built binaries. You'll need to build from source.
Disk space: Allow at least 20 GB. Rust's dependency cache and Tauri build artifacts are the main culprits. Run
./clean.shto recover space after a build.
# Enable Podman user socket
systemctl --user enable --now podman.socket
# Install podman-compose (Podman 5.x ships without a compose backend)
pip install podman-compose
# Install dependencies and build
pnpm install
pnpm tauri buildThe daemon binds to 127.0.0.1:9090 on startup.
Auth token is generated at ~/.config/harbr/token on first run.
See docs/building-on-macos.md for the full guide, or use the scripts in macos/:
cd macos
chmod +x Step1-Prerequisites.sh Step2-Build.sh
./Step1-Prerequisites.sh
./Step2-Build.shSee docs/building-on-windows.md for the full guide, or use the scripts in windows/:
cd windows
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\Step1-Prerequisites.ps1 # run as Admin
.\Step2-Build.ps1Layered config — each level overrides the previous:
/etc/harbr/config.toml— system-wide~/.config/harbr/config.toml— userHARBR_*environment variables--config /path/to/config.tomlCLI flag
[server]
host = "127.0.0.1"
port = 9090
[auth]
enabled = true
token_file = "~/.config/harbr/token"
[podman]
socket = "/run/user/1000/podman/podman.sock"
[logging]
level = "info"Harbr ships with full documentation baked into the app — no browser required.
Click Help in the sidebar to open the docs. A search box at the top lets you type any term — feature name, error message, config key — and get an instant list of matching entries. Click a result and the app navigates directly to that section and scrolls to the relevant heading. Each section also includes screenshots so you can orient yourself quickly.
Covered in full:
- Containers — list view, status indicators, grouped view, running a container
- Logs — live streaming, pause/resume, filtering,
stdout/stderrcolour coding - Log Search — enabling persistence, full-text search, filters, time ranges
- Insights — CPU/memory charts, retention policies, restart policy
- Terminal — opening a shell, session persistence
- Compose — project discovery, YAML editor, up/down/restart, log fan-in, restart policy
- Images, Volumes, Networks — browsing, inspecting, removing
- Preferences — compose directories, close-to-tray, auth token
- Troubleshooting — Podman socket, image name format, common errors
If you're new to Podman or just new to Harbr, Help is the right place to start.
See CONTRIBUTING.md.