Repository navigation
Releases
redeploy 2.0.0
Renamed from pideploy → redeploy (deploys to any Linux host, not just a Pi). BREAKING: command, state/config paths, runner service & label, env vars, and the repo are all renamed — no backward-compat alias. Adds redeploy update self-update. See CHANGELOG. 236 hermetic tests.
pideploy v1.2.0
Commit-identity guard
init and deploy now refuse to commit unless a real git identity is set. A missing, malformed, or generic address — notably noreply@users.noreply.github.com — is rejected, because GitHub attributes such commits to whatever account has claimed that email (your commits can appear as a stranger's).
Fix if blocked: git config --global user.email you@example.com (and user.name).
- New
doctorgit-identitycheck (text +--json) surfaces this before your first commit. - Pure-Bash, no package deps; pinned Actions on latest majors. 224 hermetic checks.
Install: curl -fsSL https://raw.githubusercontent.com/Traves-Theberge/pideploy/main/install.sh | bash
Full notes: CHANGELOG.md
pideploy v1.1.0
Added
- Remote mode — set
runner_host=you@hoston a dev machine andpideploy init
registers the runner on the host over SSH (via the new host-sideregister
command), then only scaffolds + pushes locally. So you can onboard repos to your
Pi from your laptop — no Docker or systemd needed there. Needs SSH to the host
(e.g. Tailscale SSH) and pideploy installed there. The generated workflow uses the
host-resolved runner label;--servein remote mode prints the host-side command. pideploy register <owner/repo>— host-side: enroll a self-hosted runner for a
repo and assign/record its port (returnsrunner/port/label/registered).
pideploy v1.0.0
First public release. pideploy turns any git repo into push-to-deploy on a
self-hosted Linux Docker host (built for a Raspberry Pi): on every git push, a
per-repo self-hosted GitHub Actions runner builds the repo's image and runs it via
docker compose. Apps appear in Portainer and are exposed over Tailscale HTTPS.
Added
- Push-to-deploy core —
initscaffolds aDockerfile(node/python/go/static
autodetect),docker-compose.yml,.github/workflows/deploy.yml, and
.pideploy.conf; registers a per-repo runner as a user systemd service; commits
and pushes (first deploy). The runner dials GitHub outbound, so the host needs
no inbound ports and works on a tailnet-only network. - Label-based routing — deploys are routed to the host by GitHub runner label
(no IP/SSH/target config).runner_labelselects a specific host when you have many. - Host-scoped config (
~/.config/pideploy/config) reused by every repo, with
config template→ a committedconfig.example(placeholders); precedence is
flags → per-repo.pideploy.conf→ host config → built-in. onboard <repo>— clone a repo onto the host andinitit in one step.- Port registry —
initauto-assigns a distinct, stable port per repo
(~/.pideploy/ports); explicit--portcollisions fail;portslists,rmfrees.
Compose setsPORTso apps listen on the assigned port. - Secrets via
.env— a local.env(source of truth) is synced to a GitHub
Actions secret (gh secret set); the workflow recreates it on the runner and wipes
it after..envis never committed.envre-syncs after edits. - Multi-app serve —
serveis path-based by default (tailscale serve --set-path),
so many apps coexist athttps://<host>/<app>;--port-modeserves at
https://<host>:<port>/for apps that can't handle a sub-path.unserveremoves one route. url/open— print (or open) an app's endpoint URL.status(runners, stacks, serve routes, linger, deploy target),deploy
(trigger now),logs,setup(host prep),doctor(prereq check).- AI-ready —
--agent(operating manual),--skill(installable Claude Code
skill),AGENTS.md, and per-commandhelp. Plain output contract: data→stdout,
diagnostics→stderr, exit codes 0/1/2,--jsonon data commands, never prompts. - Quality — 209-check hermetic test suite +
shellcheck, both run in CI on every
push/PR. MIT licensed. Verified end-to-end on real hardware (fresh repo → live app →
push-to-deploy → clean teardown), with no secret leakage in public Actions logs.