dev-cockpit

module
v1.54.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 22, 2026 License: MIT

README

dev-cockpit

Disclaimer

This is a personal, internal productivity tool, and it is 100% vibe coded. The agent writes the code, tests every feature directly in the browser, and runs integration tests. From time to time I do an architecture and security review, but not on every change. Run it only on machines and networks you trust.

What it is

Manage your projects from the browser, including your phone: run CLI coding agents (GitHub Copilot CLI, Claude Code, or both), open shells, and edit files in a small built-in editor. Everything runs in tmux on the host, the browser attaches over a live stream, so sessions survive dropped connections and you can start on your phone and continue on your laptop. It is the persistence tmux already gives you over SSH, with a web UI in front of it.

  • Create projects from the UI; git repos show their branch and remote.
  • Start coder sessions, attach in the browser, resume earlier ones.
  • Open shell sessions, rename them, run several at once.
  • Edit files (browse, create, rename, delete), upload and download.
  • Edit each coder's global config: instructions, custom agents, skills.

One server instance serves every coder whose CLI is installed on the host.

Requirements

  • Linux or macOS.
  • tmux on the host.
  • At least one coder CLI installed and logged in: copilot or claude.

The server refuses to start without tmux or without any coder CLI; a coder whose CLI is missing is skipped. The UI edits each coder's config under your home directory:

Coder Instructions file Agents dir Skills dir
copilot ~/.copilot/copilot-instructions.md ~/.copilot/agents ~/.copilot/skills
claude ~/.claude/CLAUDE.md ~/.claude/agents ~/.claude/skills

Install

Quick install (curl)

This resolves the latest release, downloads the archive for your platform, extracts the dev-cockpit binary into ~/.local/bin, and makes it executable. To pin a version, replace the first line with VERSION=1.6.0.

~/.local/bin is user-writable, so the in-app self-update can replace the binary in place without sudo. A root-owned path like /usr/local/bin works for self-update only if dev-cockpit runs as root.

VERSION=$(curl -fsSL https://api.github.com/repos/marein/dev-cockpit/releases/latest | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p')
os=$(uname -s | tr '[:upper:]' '[:lower:]')
arch=$(uname -m); case "$arch" in x86_64) arch=amd64 ;; aarch64) arch=arm64 ;; esac

mkdir -p ~/.local/bin
curl -fsSL "https://github.com/marein/dev-cockpit/releases/download/${VERSION}/dev-cockpit_${VERSION}_${os}_${arch}.tar.gz" \
  | tar -xzf - -C ~/.local/bin dev-cockpit
chmod +x ~/.local/bin/dev-cockpit

Make sure ~/.local/bin is on your PATH so you can run it from anywhere; add this to your shell's rc file (~/.bashrc, ~/.zshrc, …) if needed:

export PATH="$HOME/.local/bin:$PATH"

On macOS, the binary is unsigned. If Gatekeeper blocks it, clear the quarantine flag once:

xattr -d com.apple.quarantine ~/.local/bin/dev-cockpit
Manual

Download the archive for your platform from the releases and extract it:

tar -xzf dev-cockpit_*.tar.gz

Move the dev-cockpit binary into a directory on your PATH so you can run it from anywhere. Use a user-writable path like ~/.local/bin if you want the in-app self-update to work; /usr/local/bin needs sudo to install, and self-update there only works when dev-cockpit runs as root.

mkdir -p ~/.local/bin && mv dev-cockpit ~/.local/bin/

Run

See all options with ./dev-cockpit serve --help. The main ones:

Flag Default Meaning
--addr 0.0.0.0:80 listen address
--projects-dir ~/projects root directory of your projects
./dev-cockpit serve --addr 0.0.0.0:3000 --projects-dir ~/projects

The default --addr uses port 80, which needs root; the examples use 3000. Then open the server address in your browser and log in.

Login

The default login is admin / password. Change it before exposing the server. Generate a bcrypt hash with ./dev-cockpit hash-password, then pass it along with a random cookie key:

./dev-cockpit serve --addr 0.0.0.0:3000 \
  --auth-user admin \
  --auth-password-hash '<hash>' \
  --session-cookie-key '<random-secret>'
HTTPS

Serve TLS directly, or terminate it in a reverse proxy: drop the TLS flags, bind locally (e.g. --addr 127.0.0.1:3000), and set --trusted-proxies to your proxy's address.

Self-signed certificate and TLS flags

Adjust CN/subjectAltName for a real domain or IP:

mkdir -p ~/.config/dev-cockpit/tls
openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes \
  -keyout ~/.config/dev-cockpit/tls/dev-cockpit.key \
  -out ~/.config/dev-cockpit/tls/dev-cockpit.crt \
  -subj "/CN=localhost" \
  -addext "subjectAltName=DNS:localhost,IP:127.0.0.1"

./dev-cockpit serve --addr 0.0.0.0:3000 \
  --tls-cert-file ~/.config/dev-cockpit/tls/dev-cockpit.crt \
  --tls-key-file ~/.config/dev-cockpit/tls/dev-cockpit.key

Custom distributions

A distribution ships its own version, source link, and update feed. It is a module of your own (go mod init, go get github.com/marein/dev-cockpit) with a main.go (example below). An empty field keeps the default of a plain build.

package main

import "github.com/marein/dev-cockpit/distro"

func main() {
	distro.Main(distro.Build{
		Version:          "1.2.3",
		RepoURL:          "https://example.com/you/your-distribution",
		UpdateFeedURL:    "https://gitlab.example.com/api/v4/projects/42/releases?per_page=100",
		UpdateFeedFormat: "gitlab",
	})
}

UpdateFeedFormat is github or gitlab. The feed must follow this repository's release conventions: semver tags, dev-cockpit_<version>_<os>_<arch>.tar.gz containing dev-cockpit, plus dev-cockpit_<version>_checksums.txt. dev-cockpit --version prints what a binary was built with.

Plugins

Plugins are highly experimental and not yet part of the stable contract, examples will follow. A distribution adds them through the ServePlugins field on distro.Build. See the plugin package for what a plugin can contribute.

Directories

Path Synopsis
cmd
dev-cockpit command
Command dev-cockpit runs the tmux-backed developer cockpit.
Command dev-cockpit runs the tmux-backed developer cockpit.
Package distro is the importable entry point of dev-cockpit.
Package distro is the importable entry point of dev-cockpit.
internal
askpass
Package askpass bridges the questions ssh and git ask into the browser.
Package askpass bridges the questions ssh and git ask into the browser.
assistant
Package assistant is the cockpit's own conversation: one conversation with an installed coder that is bound to the cockpit instead of to a project.
Package assistant is the cockpit's own conversation: one conversation with an installed coder that is bound to the cockpit instead of to a project.
backup
Package backup exports selected cockpit and host state into one archive and applies such an archive back, so a freshly set up server continues where the old one stopped.
Package backup exports selected cockpit and host state into one archive and applies such an archive back, so a freshly set up server continues where the old one stopped.
cli
Package cli is the dev-cockpit CLI.
Package cli is the dev-cockpit CLI.
clirun
Package clirun executes external commands with structured error reporting.
Package clirun executes external commands with structured error reporting.
coder
DisplayName and ShortID format fallback labels for coder sessions.
DisplayName and ShortID format fallback labels for coder sessions.
config
Package config defines runtime configuration defaults.
Package config defines runtime configuration defaults.
detach
Package detach runs a program that outlives the cockpit.
Package detach runs a program that outlives the cockpit.
docker
Package docker shows what the Docker daemon runs next to the projects.
Package docker shows what the Docker daemon runs next to the projects.
editorintelligence
Package editorintelligence provides code navigation for the project editor: go to definition and find usages answered by language servers over stdio JSON-RPC.
Package editorintelligence provides code navigation for the project editor: go to definition and find usages answered by language servers over stdio JSON-RPC.
eventbus
Package eventbus is a tiny in-process publish/subscribe hub for the server to client push channel.
Package eventbus is a tiny in-process publish/subscribe hub for the server to client push channel.
git
Package git reads what a repository says about a project's working copy, and writes it in a deliberately short list of places: Commit, Push (plain, or force-with-lease, setting the upstream where the branch has none), Fetch, the fast forward Pull, the two branch moves Checkout and CreateBranch, Tag and the PushTag that sends one tag, Clone into a directory that holds nothing yet, and Revert, which takes one path back to HEAD.
Package git reads what a repository says about a project's working copy, and writes it in a deliberately short list of places: Commit, Push (plain, or force-with-lease, setting the upstream where the branch has none), Fetch, the fast forward Pull, the two branch moves Checkout and CreateBranch, Tag and the PushTag that sends one tag, Clone into a directory that holds nothing yet, and Revert, which takes one path back to HEAD.
hostinfo
Package hostinfo reads what the machine the cockpit runs on is up to: how busy it is, how much memory is in use, and how full the disk under the projects is.
Package hostinfo reads what the machine the cockpit runs on is up to: how busy it is, how much memory is in use, and how full the disk under the projects is.
keys
Package keys decodes browser-supplied terminal input into tmux send events.
Package keys decodes browser-supplied terminal input into tmux send events.
localapi
Package localapi is how a process on this machine reaches the running cockpit.
Package localapi is how a process on this machine reaches the running cockpit.
notify
Package notify records that a target has news, whether it finished the current request, asks a question, or waits for a permission, and fans that out to the web UI.
Package notify records that a target has news, whether it finished the current request, asks a question, or waits for a permission, and fans that out to the web UI.
pluginhost
Package pluginhost is the cockpit's side of the plugin package: the public package is contract only, and the implementations behind its interfaces live here, construction, sealing and collection included.
Package pluginhost is the cockpit's side of the plugin package: the public package is contract only, and the implementations behind its interfaces live here, construction, sealing and collection included.
proctree
Package proctree inspects process trees across supported platforms.
Package proctree inspects process trees across supported platforms.
project
Package project manages project directories under a configured root.
Package project manages project directories under a configured root.
push
Package push forwards notification news to external channels: Web Push to registered devices (the installed web app on iPhone, or any browser) and registered webhooks.
Package push forwards notification news to external channels: Web Push to registered devices (the installed web app on iPhone, or any browser) and registered webhooks.
recent
Package recent persists last-used timestamps for named items so a list can offer a "recently used" sort that survives restarts.
Package recent persists last-used timestamps for named items so a list can offer a "recently used" sort that survives restarts.
restore
Package restore brings the working set of terminals back after the tmux server died (host reboot, tmux kill-server): coders are resumed, shells are recreated.
Package restore brings the working set of terminals back after the tmux server died (host reboot, tmux kill-server): coders are resumed, shells are recreated.
settings
Package settings persists small cross-device user settings as a JSON map (key to value) in the state directory.
Package settings persists small cross-device user settings as a JSON map (key to value) in the state directory.
statefile
Package statefile reads and writes the small JSON state files in the dev-cockpit state directory.
Package statefile reads and writes the small JSON state files in the dev-cockpit state directory.
terminalstate
Package terminalstate answers one question in one place: what is a terminal id right now.
Package terminalstate answers one question in one place: what is a terminal id right now.
tmux
Package tmux is a thin domain client around the tmux CLI.
Package tmux is a thin domain client around the tmux CLI.
web
web/render
Package render contains HTML template models and parsing.
Package render contains HTML template models and parsing.
Package plugin is dev-cockpit's compile time extension point, and it is contract only: the interfaces a plugin is handed, the wiring pair a distribution builds, the slot names and the one sentinel error.
Package plugin is dev-cockpit's compile time extension point, and it is contract only: the interfaces a plugin is handed, the wiring pair a distribution builds, the slot names and the one sentinel error.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL