{"id":50724366,"url":"https://github.com/glyndor/podup","last_synced_at":"2026-06-15T04:01:21.254Z","repository":{"id":362582080,"uuid":"1259587974","full_name":"Glyndor/podup","owner":"Glyndor","description":"podup — docker-compose translator and runner for rootless Podman. Standalone CLI and Rust library, powers the Glyndor panel.","archived":false,"fork":false,"pushed_at":"2026-06-10T03:05:12.000Z","size":452,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-10T03:19:55.924Z","etag":null,"topics":["cli","compose","containers","devops","docker-compose","podman","rootless","rust","self-hosted"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Glyndor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["Jaro-c"]}},"created_at":"2026-06-04T16:52:19.000Z","updated_at":"2026-06-10T02:43:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Glyndor/podup","commit_stats":null,"previous_names":["glyndor/podman-compose","glyndor/podup"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/Glyndor/podup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Glyndor%2Fpodup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Glyndor%2Fpodup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Glyndor%2Fpodup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Glyndor%2Fpodup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Glyndor","download_url":"https://codeload.github.com/Glyndor/podup/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Glyndor%2Fpodup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34346870,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-15T02:00:07.085Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","compose","containers","devops","docker-compose","podman","rootless","rust","self-hosted"],"created_at":"2026-06-10T03:01:23.729Z","updated_at":"2026-06-15T04:01:21.248Z","avatar_url":"https://github.com/Glyndor.png","language":"Rust","funding_links":["https://github.com/sponsors/Jaro-c"],"categories":[],"sub_categories":[],"readme":"# podup\n\n[![CI](https://github.com/Glyndor/podup/actions/workflows/ci.yml/badge.svg)](https://github.com/Glyndor/podup/actions/workflows/ci.yml)\n[![Release](https://github.com/Glyndor/podup/actions/workflows/release.yml/badge.svg)](https://github.com/Glyndor/podup/actions/workflows/release.yml)\n\n**podup** runs your `docker-compose.yml` on rootless Podman — a single static\nbinary, written in Rust, with no daemon and no Python runtime.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/podup-demo.gif\" alt=\"podup up and podup ps running a compose stack on rootless Podman\" width=\"760\"\u003e\n\u003c/p\u003e\n\n```mermaid\nflowchart LR\n\tA[\"docker-compose.yml\"] --\u003e B[\"podup\"]\n\tB --\u003e|\"parse · substitute · order\"| C[\"Podman REST API\"]\n\tC --\u003e D[\"containers\"]\n\tC --\u003e E[\"networks\"]\n\tC --\u003e F[\"volumes\"]\n```\n\n## ✨ Features\n\n- 🚀 **Drop-in workflow** — `up`, `down`, `start`, `stop`, `ps`, `logs`, `exec`, `run`, `cp`, `build`, `pull`, `restart`, `rm`, `kill`, `pause`, `unpause`, `top`, `port`, `images`, `config`, `watch`\n- 🔒 **Rootless by design** — drives rootless Podman over its native libpod REST API\n- 📄 **Compose-spec parsing** — YAML anchors, `extends`, `include`, profiles, `env_file`, variable substitution with modifiers\n- 🔁 **Dependency-aware** — `depends_on` ordering with `service_started`, `service_healthy`, and `service_completed_successfully` conditions\n- 🔢 **Replicas** — `scale:` and `deploy.replicas` with named replica containers\n- 🔐 **Secrets \u0026 configs** — inline content, file, environment, and `external: true` Podman-native secret sources, staged securely\n- 👀 **Watch mode** — sync, rebuild or restart services on file changes per `develop.watch` rules\n- ⚙️ **Systemd Quadlet export** — `generate quadlet` emits native `podman-systemd.unit` files to run your stack under systemd, no daemon\n- ⌨️ **Shell completions** — `completions \u003cshell\u003e` for bash, zsh, fish and more (the Debian package installs them)\n- 📦 **Single binary** — statically musl-linked on Linux, no runtime dependencies\n- 🦀 **Library too** — embed the parser and engine in your own Rust project\n\n## 📥 Install\n\nLinux and macOS:\n\n```bash\ncurl -fsSL https://glyndor.net/install/podup | bash\n```\n\nWindows (PowerShell):\n\n```powershell\nirm https://glyndor.net/install/podup.ps1 | iex\n```\n\nBinaries for Linux and macOS (x86_64 and arm64) plus Windows (x86_64 and\narm64), SHA-256 verified, with build provenance attestations. On macOS and\nWindows, podup talks to the `podman machine` VM through its host-side socket or\nnamed pipe. Both installers verify the Ed25519 signature over `SHA256SUMS` (or\nthe GitHub build-provenance attestation) and fail closed otherwise. Or build\nfrom source:\n\n```bash\ncargo build --release\n```\n\n### Debian / Ubuntu (apt)\n\nOn Debian and Ubuntu (amd64 and arm64), install from the Glyndor apt repository\nso updates arrive through `apt upgrade`:\n\n```bash\ncurl -fsSL https://glyndor.net/install/podup | bash -s -- --apt\n```\n\nThis installs the `glyndor-archive-keyring` package (registering the signed\nrepository at `https://apt.glyndor.net`) and then `podup`. Because the signing\nkey ships as a package, key renewals are picked up automatically by `apt\nupgrade`; the apt build omits self-update, since apt owns upgrades. To set it up\nby hand:\n\n```bash\ncurl -fsSLO https://apt.glyndor.net/glyndor-archive-keyring.deb\nsudo dpkg -i glyndor-archive-keyring.deb\nsudo apt update \u0026\u0026 sudo apt install podup\n```\n\n### Updating\n\n```bash\npodup update            # download and install the latest signed release\npodup update --check    # report whether a newer release exists, install nothing\n```\n\n`podup update` replaces the running binary in place, but only after verifying\nthe release's Ed25519 signature against the public key embedded in your build\nand matching its SHA-256 checksum. It fails closed: a bad signature, missing\nkey, or checksum mismatch aborts before the installed binary is touched. See\n[docs/self-update.md](docs/self-update.md) for the trust model. Installing into\na system directory (e.g. `/usr/local/bin`) needs elevation — re-run with `sudo`.\n\n## 🚀 Quick start\n\n```bash\npodup up --detach                      # docker-compose.yml in the current directory\npodup -f stack.yml -p myapp up -d      # explicit file and project name\npodup ps                               # list project containers\npodup logs api --follow                # follow one service's logs\npodup down --volumes                   # tear down, removing named volumes\npodup generate quadlet -o ~/.config/containers/systemd  # emit systemd Quadlet units\n```\n\n## ⚖️ vs. alternatives\n\n|  | podup | docker-compose | podman-compose (Python) |\n|---|---|---|---|\n| Engine | rootless Podman | Docker daemon | Podman |\n| Runtime | single static binary | Go binary + Docker daemon | Python + pip packages |\n| Root required | no | typically yes (daemon) | no |\n| Implementation | Rust | Go | Python |\n| Podman API | native libpod REST | n/a | Podman CLI shell-out |\n| Systemd Quadlet export | yes (`generate quadlet`) | no | no |\n| Platforms | Linux · macOS · Windows (single binary) | Linux · macOS · Windows | wherever Python runs |\n| Compose-spec depth | `extends`, profiles, `develop.watch`, inline secrets/configs | full | partial |\n\n## 🦀 Library usage\n\n```rust\nuse podup::{parse_file, podman, Engine};\n\n#[tokio::main]\nasync fn main() -\u003e podup::Result\u003c()\u003e {\n\tlet file = parse_file(std::path::Path::new(\"docker-compose.yml\"))?;\n\tlet client = podman::connect(None)?;\n\tlet engine = Engine::new(client, \"myproject\".to_string());\n\tengine.up(\u0026file).await?;\n\tOk(())\n}\n```\n\n```toml\n[dependencies]\npodup = { git = \"https://github.com/Glyndor/podup\", tag = \"v0.22.2\" }\n```\n\n## 📖 Docs\n\n- [Command reference](docs/commands.md) — every subcommand, its options, and what it does\n- [Migrating from Docker Compose](docs/docker-migration.md) — compatibility guide, rootless differences, deprecated fields\n- [Self-update](docs/self-update.md) — the `podup update` trust model and verification flow\n- [Debian packaging](docs/debian-packaging.md) — building and distributing a `.deb`\n\n## Contributing \u0026 security\n\nSee the org-wide [contributing guide](https://github.com/Glyndor/.github/blob/main/CONTRIBUTING.md).\nReport vulnerabilities privately via the Security tab — never in a public issue.\n\n## License\n\n[Apache-2.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglyndor%2Fpodup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fglyndor%2Fpodup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglyndor%2Fpodup/lists"}