π± phantom_ci
βοΈ Secure, Headless, Self-Hosted CI Runner
π§ Summary
phantom_ci is a fully self-hosted CI runner that detects changes in Git repositories and executes pipeline steps defined in a per-branch TOML workflow file.
All execution happens locally, as the user who runs phantom_ci. No external services are contacted unless explicitly configured.
This project was built with isolation and security in mind β specifically to prevent granting inbound or outbound access to unowned servers.
π« Common CI Tradeoffs vs phantom_ci
| Approach | Tradeoff |
|---|---|
| GitHub Actions / SaaS Runners | Inbound access from GitHub into your servers |
| GitHubβs Self-Hosted Runners | Outbound access to GitHub's infra |
| 3rd-party Runners | Implicit outbound connections or exposed APIs |
β
phantom_ci |
No inbound or outbound access required |
π‘οΈ Security Posture
- Workflows are only run from a locally configured branch (
target_branch). - Branch execution config is stored outside the repo, reducing tampering risk.
- CLI-based only β no API, no sockets, no network listeners.
- Workflow steps are executed via
std::process::Command.
Default target_branch is master β configure this explicitly and enforce restrictions via Git to avoid unauthorized command execution.
π¦ Workflow Location and Format
Place workflows under the repository root at:
$REPO_ROOT/workflow/<branch>.toml
Example for branch master:
[] # step index must be numeric and define execution order
= "pwd"
[]
= "make build"
[]
= "make deploy"
Rules:
- Only numeric tables are supported (e.g.,
[0],[1], ...). Lower numbers run first. - Each step supports a single key:
run(a shell command invoked without a shell). - Commands run with the working directory set to the checked-out repo directory.
See examples/workflow.toml for a more complete example.
π Repo Configuration
Monitored repositories are defined in a Repo.toml inside your user config directory.
- Linux:
~/.config/phantom_ci/Repo.toml - macOS:
~/Library/Application Support/com.helloimalemur.phantom_ci/Repo.toml
[]
= "https://github.com/helloimalemur/sys-compare"
= "master"
[]
= "https://github.com/helloimalemur/ELKTool"
= "master"
[] # section headers must be unique
= "git@github.com:helloimalemur/ELKTool" # SSH recommended
= "test-branch" # ensure the branch exists
π Webhook Notifications (Optional)
Create a .env file in your user config directory to enable webhooks:
- Linux:
~/.config/phantom_ci/.env - macOS:
~/Library/Application Support/com.helloimalemur.phantom_ci/.env
Supported variables:
# Discord
DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/..."
# Slack
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/..."
π Installation
Requires Rust:
βοΈ Usage
# Run normally (polls repos and executes workflows on changes)
# Add a repo (path + branch are required)
# or via SSH (recommended)
# Install systemd service (Linux)
# Inspect state
π‘ Notes on Workflows
- Place files at
$REPO_ROOT/workflow/<branch>.toml. - Steps run sequentially in numeric order.
- Each step exposes only
runand does not spawn a shell; if you need shell features, invokebash -lc "..."explicitly. - Output is captured and printed to stdout. Webhooks (if configured) receive command output.
π£ Development & Contribution
Contributions welcome β PRs encouraged!