{"id":50821529,"url":"https://github.com/thijsrijkers/torso","last_synced_at":"2026-06-13T14:12:39.080Z","repository":{"id":354495329,"uuid":"1223682819","full_name":"thijsrijkers/torso","owner":"thijsrijkers","description":"A self-hosted infrastructure engine","archived":false,"fork":false,"pushed_at":"2026-05-23T14:55:24.000Z","size":43,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-23T16:27:30.916Z","etag":null,"topics":["cloudformation","go","hosting","open-source","self","self-host","self-hosted","self-hosting"],"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/thijsrijkers.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":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-28T14:54:19.000Z","updated_at":"2026-05-23T14:55:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/thijsrijkers/torso","commit_stats":null,"previous_names":["thijsrijkers/torstol"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/thijsrijkers/torso","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thijsrijkers%2Ftorso","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thijsrijkers%2Ftorso/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thijsrijkers%2Ftorso/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thijsrijkers%2Ftorso/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thijsrijkers","download_url":"https://codeload.github.com/thijsrijkers/torso/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thijsrijkers%2Ftorso/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34287342,"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":["cloudformation","go","hosting","open-source","self","self-host","self-hosted","self-hosting"],"created_at":"2026-06-13T14:12:38.281Z","updated_at":"2026-06-13T14:12:39.074Z","avatar_url":"https://github.com/thijsrijkers.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Torso\n\n**Torso** is an open source, self-hosted infrastructure orchestration engine written in Rust. Define your infrastructure, databases, applications, DNS, load balancers, and more in a declarative `.Torso` file, and let Torso handle the rest.\n\nThink of it as CloudFormation, but one you own, run yourself, and extend however you want.\n\n---\n\n## How it works\n\nTorso runs as a long lived HTTP server on your infrastructure. You bootstrap it once using the CLI with an initial environment file. After that, everything is driven by HTTP request an `.Torso` file to the server, and Torso will reconcile your desired state with reality.\n\n```\nTorso init --file environment.Torso   # Bootstrap your environment\nTorso serve                          # Start the Torso HTTP server\n\ncurl -X POST http://localhost:7070/apply \\\n  -H \"Content-Type: application/x-Torso\" \\\n  --data-binary @my-service.Torso    # Deploy a new service\n```\n\nNo proprietary dashboards. No cloud lock in. Just Rust, HTTP, and a file.\n\n---\n\n## The Torso File\n\nAn `.Torso` file is a declarative YAML based configuration that describes the desired state of a resource or environment. It follows a simple `kind` + `spec` structure:\n\n```yaml\nkind: Database\nmetadata:\n  name: my_postgres\nspec:\n  engine: postgres\n  version: \"15\"\n  storage: 20Gi\n  replicas: 1\n```\n\n```yaml\nkind: App\nmetadata:\n  name: my_api\nspec:\n  image: ghcr.io/myorg/api:latest\n  port: 8080\n  replicas: 2\n  env:\n    - name: DATABASE_URL\n      value: postgres://...\n```\n\nTorso reads the `kind` field and routes it to the correct provisioner under the hood.\n\n---\n\n## Design Principles\n\n- **Self hosted first** — Torso runs on your hardware, your cloud, your rules.\n- **File driven** — everything is defined in an `.Torso` file. No hidden state in a UI.\n- **HTTP native** — the engine is an API. Automate it, wrap it, integrate it.\n- **Pluggable** — providers are first-class. Torso doesn't dictate where you run.\n- **Rust all the way** — single binary, fast startup, easy to deploy Torso itself.\n\n---\n\n## Roadmap\n\n### Phase 1 — Core Engine\n- [ ] Define the `.Torso` file specification (YAML-based, `kind` + `spec` pattern)\n- [ ] Build the CLI (`Torso init`, `Torso serve`, `Torso apply`, `Torso status`, `Torso destroy`)\n- [ ] Bootstrap environment from an initial `.Torso` file via `Torso init`\n- [ ] Start the Torso HTTP server via `Torso init`\n- [ ] Accept `.Torso` file payloads over HTTP `POST /apply`\n- [ ] Parse, validate, and route resource kinds to their provisioners\n- [ ] Basic state tracking, know what has been created, updated, or removed\n\n---\n\n### Phase 2 — Database Provisioning\n- [ ] Provision PostgreSQL instances\n- [ ] Provision MySQL instances\n- [ ] Provision Redis instances\n- [ ] Support configurable storage size, version, and replica count\n- [ ] Lifecycle management, create, update, and destroy\n- [ ] Connection string output exposed after provisioning\n\n---\n\n### Phase 3 — Application Hosting\n- [ ] Deploy containerized applications from an image registry\n- [ ] Configure environment variables and secrets\n- [ ] Set replica count and resource limits (CPU/memory)\n- [ ] Rolling deploy support, update without downtime\n- [ ] Health check configuration (HTTP or TCP)\n- [ ] Restart policies and crash recovery\n\n---\n\n### Phase 4 — DNS Management\n- [ ] Register and manage DNS records (A, CNAME, TXT, MX)\n- [ ] Attach a domain to a deployed application automatically\n- [ ] Support multiple DNS providers (Cloudflare, Route53, etc.) via pluggable drivers\n- [ ] TTL configuration per record\n- [ ] Automatic DNS cleanup on resource destroy\n\n---\n\n### Phase 5 — Load Balancer\n- [ ] Create and configure HTTP/HTTPS load balancers\n- [ ] Route traffic to one or more application instances\n- [ ] Support round-robin and least-connections strategies\n- [ ] SSL/TLS termination with automatic certificate provisioning (via Let's Encrypt)\n- [ ] Health-check-aware routing, remove unhealthy instances automatically\n\n---\n\n### Phase 6 — Secrets \u0026 Configuration\n- [ ] Secrets store, store and inject secrets into apps at deploy time\n- [ ] Support referencing secrets inside `.Torso` files via `${{ secret.name }}` syntax\n- [ ] Encryption at rest for stored secrets\n- [ ] Secret rotation support\n\n---\n\n### Phase 7 — Networking \u0026 Firewalls\n- [ ] Define virtual private networks (VPNs/VPCs) and subnets\n- [ ] Configure firewall rules, allow/deny by port, protocol, and CIDR\n- [ ] Private networking between services (service discovery by name)\n- [ ] Public/private toggle per service\n\n---\n\n### Phase 8 — Object Storage\n- [ ] Provision and manage object storage buckets\n- [ ] Configure bucket policies (public read, private, etc.)\n- [ ] Mount buckets as volumes in application containers\n- [ ] S3 compatible API support\n\n---\n\n### Phase 9 — Observability\n- [ ] Expose resource status via `GET /status/:name`\n- [ ] Structured event log per resource (created, updated, failed, destroyed)\n- [ ] Metrics endpoint (`/metrics`) compatible with Prometheus\n- [ ] Deploy time dry run mode, validate a file without applying it (`POST /plan`)\n\n---\n\n### Phase 10 — Provider System\n- [ ] Pluggable provider architecture, write your own provisioner in Rust\n- [ ] Official providers: Docker, Kubernetes, DigitalOcean, Hetzner, AWS\n- [ ] Provider registry, install providers via `Torso provider add \u003cname\u003e`\n- [ ] Provider versioning and pinning inside `.Torso` files\n\n---\n\n\n## Contributing\n\nTorso is in early development. Contributions, ideas, and feedback are very welcome. Open an issue or a pull request.\n\n---\n\n## License\n\nApache 2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthijsrijkers%2Ftorso","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthijsrijkers%2Ftorso","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthijsrijkers%2Ftorso/lists"}