Simple, portable, single-binary CI/CD server + agent.
WIP. NOT SUITABLE FOR PUBLIC SERVERS. ONLY FOR PRIVATE NETWORKS AND HOMELAB STYLE PROJECTS.
ciwi started as a practical replacement for Jenkins/TeamCity for private projects.
- Install server/agent with scripts in
docs/installation.md. - Open UI at
http://127.0.0.1:8112/. - Import a project that contains
ciwi-project.yaml. - Run pipeline and inspect jobs.
Detailed guide: docs/getting-started.md.
Note on agent workdir:
CIWI_AGENT_WORKDIRis optional. If unset, the agent defaults to.ciwi-agent/workrelative to its working directory.- Installer-based deployments set an absolute workdir (Linux:
/var/lib/ciwi-agent/work, macOS:$HOME/.ciwi-agent/work, Windows:%ProgramData%\\ciwi-agent\\work). - The agent normalizes the workdir to an absolute path at runtime.
Note on artifact log verbosity:
- Agent artifact upload logs are compact by default (
CIWI_ARTIFACT_LOG_LEVEL=summary). - Use
CIWI_ARTIFACT_LOG_LEVEL=verboseand optionallyCIWI_ARTIFACT_LOG_MAX_INCLUDE_LINESfor per-file include lines. - Dependency artifact restore logs are also compact by default (
CIWI_DEP_ARTIFACT_LOG_LEVEL=summary), with optionalCIWI_DEP_ARTIFACT_LOG_MAX_RESTORED_LINESinverbosemode. - See
docs/configuration.mdfor details.
- Getting started:
docs/getting-started.md - Installation scripts:
docs/installation.md - Env vars, prerequisites, tool requirements:
docs/configuration.md - Pipeline config and runtime model:
docs/pipelines.md - Backend API reference (grouped by consumer):
docs/api.md - Vault/AppRole integration:
docs/vault.md - Operations (update policy, maintenance, troubleshooting):
docs/operations.md - Architecture and flows:
docs/architecture.md - Domain terminology:
terminology.md
ciwi intentionally avoids fragile behavior that depends on parsing human-readable logs.
- ciwi is designed around explicit API contracts and structured payloads between server, agent, and UI.
- Features should use dedicated fields/endpoints instead of scraping job output text.
- Job output remains for humans; machine behavior should rely on typed data.
Example ciwi-project.yaml files:
ciwi-project.yamlfor building/publishing cupuacu.ciwi-project.yamlfor building ciwi itself.
