A small, native desktop app for running and managing multiple local dev servers.
English · 한국어
Start, stop, and restart servers written in any language or framework, watch their logs live, and catch port clashes — all from one window. Built in Rust with egui, so it's a single lightweight binary (~9 MB) with no runtime to install.
- Any server — run anything via a shell command (
npm run dev,./gradlew bootRun,go run ., …) - Presets — Spring Boot, Flink, Next.js, Go, or a blank Custom entry that pre-fill the command and a default port
- Folder detection — selecting a folder fills its name and default command:
Node
dev/startscripts with npm, pnpm, Yarn, or Bun; GradlebootRun/run; Cargo binaries; and Go modules with a root main package (go run .). Edited commands and saved projects are preserved - Per-server config — working directory, port, environment variables, a
.envfile, and an optional shell override - Lifecycle — start / stop / restart with whole-process-tree shutdown
(graceful
SIGINT, a grace period, thenSIGKILL), so nothing is orphaned; press Stop again to force-quit immediately - Reorder — drag project cards up or down to change their order; it's saved
- Workspaces — drag a card into the log area to open its log; up to four logs in resizable panes, bundled into tabs. Open log arranges three or four panes in two rows; compact windows switch between logs without losing the layout
- Live logs — ANSI colors rendered, plus search, follow (tail), wrap toggle, an unseen-lines badge, and clear, over a bounded 5 MiB ring buffer
- Ready / crash notices — a server shows starting until its port is listening, then a banner says it's ready; a crash reports the exit code
- Open in browser — click a project's
:portto openlocalhost:port - Port awareness — warns when a port is already in use or assigned to two
servers; injects both
PORTandSERVER_PORT - Resource usage — per-server CPU and memory shown live on each project card, summed over the whole process subtree
- Cross-platform — macOS and Windows
- Local and private — everything runs on your machine; config is a plain TOML file
Download the macOS Apple Silicon or Windows x64 ZIP from Releases. Extract it, then move bundle/Campfire.app to Applications on macOS or run campfire.exe on Windows. Rust is only needed to build from source.
The macOS binary requires macOS 11 or later. Downloads are not signed with a distribution certificate or notarized, so your OS may block or warn on first launch. SHA-256 checksums are included in each release.
- Rust (stable)
- macOS or Windows
The sidebar, dialogs, and notifications use egui_glass with the wgpu renderer.
They sample a static gradient uploaded once at startup; log panes stay opaque
for readability. A wgpu-compatible graphics adapter is required.
# run in development
cargo run
# build an optimized release binary (-> target/release/campfire)
cargo build --release- Click + Add and choose the working directory (Browse…).
- Review the detected name and command. Choose a script / binary when there are several targets, or enter a command / pick a preset manually.
- Optionally set a port, environment variables, or a
.envfile. - Select the server and press Start. Watch the logs; Stop or Restart as needed.
The in-app Help button has the rest. A few notes:
- Detection — reads local files only; it does not install dependencies or
run Gradle/Cargo during registration. Gradle uses the local platform wrapper,
falling back to
gradleon PATH. Cargo respectsdefault-run, explicit bins, andautobins; feature-gated targets require a manual command. Workspace members, Gradle subprojects, plugin aliases, and custom tasks are not discovered recursively: choose the runnable package folder or enter the command. Detection does not set a port. Go detection skips test files, build-tagged and OS/architecture-specific entry points; commands undercmd/require manual input. Project runtimes and dependencies must already be available to launch. - Ports — the port you set is injected as both
PORT(Node/Next) andSERVER_PORT(Spring Boot). If your framework reads neither, put the port in the command (e.g.--server.port=8080) or an env var. - Shell / PATH — commands run through your login shell. If a version
manager (nvm, sdkman) isn't found, set the Shell field to
zsh -licso it sources~/.zshrc. - Config — servers are saved under your OS app-config directory
(
com.heonny.campfire/servers.toml).
Campfire keeps only two files — your server list (servers.toml) and its
running-state (running.json). Deleting the app leaves them behind; remove them
too for a clean uninstall.
| OS | Where they live |
|---|---|
| macOS | ~/Library/Application Support/com.heonny.campfire/ |
| Windows | %APPDATA%\heonny\campfire\ and %LOCALAPPDATA%\heonny\campfire\ |
The matching script clears them for you. It prints the paths and asks first;
pass --yes (macOS) or -Yes (Windows) to skip the prompt.
# macOS
./scripts/uninstall-macos.sh
# Windows (PowerShell)
.\scripts\uninstall-windows.ps1Then remove the app itself: move Campfire.app to the Trash (macOS) or delete
the campfire binary (Windows). The scripts never touch the app — only its data.
Rust · egui / eframe · egui_extras · command-group · sysinfo · rfd
The application code is under the MIT License — see LICENSE.
The bundled Pretendard font is
under the SIL Open Font License (assets/fonts/Pretendard-LICENSE.txt).
The Lucide icons are under the ISC License
(assets/icons/LICENSE).
