{"id":50684722,"url":"https://github.com/ryanravn/ryra","last_synced_at":"2026-06-13T02:02:30.866Z","repository":{"id":357840083,"uuid":"1183596852","full_name":"ryanravn/ryra","owner":"ryanravn","description":"A CLI-tool to test and deploy self-hosted services on a Linux server using rootless Podman and systemd. Built-in VM testing gives AI agents fast feedback loops for building infrastructure and deploying apps.","archived":false,"fork":false,"pushed_at":"2026-06-11T00:29:10.000Z","size":3355,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-11T02:02:44.962Z","etag":null,"topics":["ai","cli","linux","podman","rust","self-hosting","server","systemd","tdd"],"latest_commit_sha":null,"homepage":"https://ryra.dev","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ryanravn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"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":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-16T19:10:36.000Z","updated_at":"2026-06-11T00:27:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ryanravn/ryra","commit_stats":null,"previous_names":["ryanravn/ryra"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/ryanravn/ryra","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanravn%2Fryra","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanravn%2Fryra/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanravn%2Fryra/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanravn%2Fryra/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ryanravn","download_url":"https://codeload.github.com/ryanravn/ryra/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanravn%2Fryra/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34269364,"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-13T02:00:06.617Z","response_time":62,"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":["ai","cli","linux","podman","rust","self-hosting","server","systemd","tdd"],"created_at":"2026-06-08T22:00:26.330Z","updated_at":"2026-06-13T02:02:30.860Z","avatar_url":"https://github.com/ryanravn.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ryra\n\n[![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENCE.md)\n[![CI](https://github.com/ryanravn/ryra/actions/workflows/ci.yml/badge.svg)](https://github.com/ryanravn/ryra/actions/workflows/ci.yml)\n\n\u003e Self-host anything, automatically test it works.\n\nServices arrive wired: **SSO**, **mail**, **encrypted backups**, **monitoring**. Plain rootless podman and systemd underneath, in files you can read. Every service in the [registry](https://github.com/ryanravn/ryra-registry) proven by **end-to-end tests** in a fresh VM.\n\n```sh\n$ ryra add prometheus grafana\n→ wires grafana into prometheus (scrape target)\n→ provisions prometheus datasource in grafana\n→ starts grafana on http://127.0.0.1:3000\n```\n\n[Website](https://ryra.dev) · [Docs](https://ryra.dev/intro/) · [Services](https://ryra.dev/services/)\n\n## Install\n\n```sh\ncurl -fsSL https://ryra.dev/install.sh | sh\n```\n\nOr with Rust:\n\n```sh\ncargo install ryra\n```\n\nWorks on any Linux with systemd and podman \u003e= 5.3 (current Debian-based, Fedora, and Arch releases all qualify). `ryra doctor` checks your setup.\n\n## Quickstart\n\n```sh\nryra search           # browse the registry\nryra add \u003cservice\u003e    # install one\n\nryra init             # ...or scaffold your own project\nryra add .            # and run your own code on ryra\n```\n\n## What it does\n\n`ryra add \u003cservice\u003e` reads a recipe from a curated registry and writes:\n\n- A **rootless Podman** container, owned by your user\n- A **systemd quadlet**, so `systemctl --user` and `journalctl --user` work like normal\n- Optionally: a **Caddy** route with auto-HTTPS, and an **Authelia** OIDC client for SSO\n\nService data lives at `~/.local/share/services/\u003cname\u003e/`. Back it up with `tar`. Uninstall ryra and your stack keeps running, because the systemd units and containers stay.\n\n## Why\n\nSaaS prices keep climbing and the products keep moving slower than you want. Self-hosting is the way out, but the operational cost (compose files, reverse proxies, expiring certs, half-finished install scripts) is what stops most people from leaving.\n\nNo other self-hosting toolkit ships the full combination: rootless **podman quadlets** for security and clean systemd integration, **automated VM tests** that prove every registry service works before you install it, and a TOML-based recipe format that an AI can read and extend without hand-holding. You stay in control: customise per host, add your own services, and grow your stack at the pace your vendors won't.\n\n## Philosophy\n\nRyra is a scaffolding tool, not a runtime. It writes plain files and exits, so the box ends up looking like a sysadmin set it up by hand.\n\n### A service is a folder\n\n\u003cimg src=\"site/public/screenshots/services-folder.webp\" alt=\"Tree listing of ~/.local/share/services showing each service as its own folder containing quadlets, configs, and bind-mounted data dirs\" width=\"700\" /\u003e\n\nEvery quadlet, env file, network, and bind-mounted data directory for a service lives under `~/.local/share/services/\u003cname\u003e/`. Back up the whole folder with `tar`, or just the data dirs like `db-data/` and `upload/`. Move the folder to another box, the service comes with it.\n\n### One file of preferences\n\n\u003cimg src=\"site/public/screenshots/preferences-file.webp\" alt=\"Tree listing of ~/.config/services showing a single preferences.toml file\" width=\"700\" /\u003e\n\nSMTP credentials, OIDC provider, Tailscale key, custom registries: all the cross-service settings ryra reads at startup live in a single TOML file. The rest is just service folders.\n\n### Symlinked into systemd\n\n\u003cimg src=\"site/public/screenshots/systemd-symlinks.webp\" alt=\"Tree listing of ~/.config/containers/systemd showing each .container and .network as a symlink back into the service's folder\" width=\"900\" /\u003e\n\nEach `.container` and `.network` is symlinked from its service folder into `~/.config/containers/systemd/`, where systemd's user generator picks it up. Remove the service and the symlink goes with it. Uninstall ryra and the symlinks plus the services keep running, because there is no ryra runtime.\n\n## Examples\n\n### Replace your cloud storage\n\n\u003cimg src=\"site/public/screenshots/seafile.webp\" alt=\"Seafile file storage UI\" width=\"900\" /\u003e\n\n```sh\nryra add seafile\n```\n\n### Replace your todo list\n\n\u003cimg src=\"site/public/screenshots/vikunja.webp\" alt=\"Vikunja task manager UI\" width=\"900\" /\u003e\n\n```sh\nryra add vikunja\n```\n\n### Run your own AI gateway\n\n\u003cimg src=\"site/public/screenshots/openclaw.webp\" alt=\"OpenClaw AI gateway UI\" width=\"900\" /\u003e\n\n```sh\nryra add openclaw\n```\n\n### Install anything\n\n\u003cimg src=\"site/public/screenshots/custom.webp\" alt=\"A service.toml definition\" width=\"900\" /\u003e\n\nThe registry is plain TOML and quadlet files. Drop a definition in for your own app, point ryra at your registry, and install it the same way as anything in the default registry.\n\n## Services\n\nRun `ryra search` for the full list, or browse the [services catalog](https://ryra.dev/services/). The default registry includes Immich, Forgejo, Vaultwarden, Nextcloud, Twenty CRM, Paperless-ngx, Synapse, Supabase, Open WebUI, Authelia, Uptime Kuma, Caddy, DocuSeal, Zammad, Seafile, Vikunja, OpenClaw, and more.\n\n## Documentation\n\nFull docs at [ryra.dev/intro](https://ryra.dev/intro/).\n\n## License\n\nAGPL-3.0-or-later. See [LICENCE.md](LICENCE.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryanravn%2Fryra","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryanravn%2Fryra","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryanravn%2Fryra/lists"}