{"id":43765893,"url":"https://github.com/xfyyzy/soffio","last_synced_at":"2026-04-02T11:57:56.528Z","repository":{"id":322545270,"uuid":"1089912767","full_name":"xfyyzy/soffio","owner":"xfyyzy","description":"Rust-native publishing platform pairing statically rendered public pages with a productivity-focused admin experience.","archived":false,"fork":false,"pushed_at":"2026-03-24T08:11:30.000Z","size":2636,"stargazers_count":13,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-25T10:08:53.234Z","etag":null,"topics":["ai-agents","askama","blog","cms","datastar","docker-compose","headless-cms","musl","rust","soffio","ssr"],"latest_commit_sha":null,"homepage":"https://soffio.xfyyzy.xyz","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xfyyzy.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-11-05T01:30:34.000Z","updated_at":"2026-03-24T08:11:05.000Z","dependencies_parsed_at":"2026-01-08T12:11:58.583Z","dependency_job_id":null,"html_url":"https://github.com/xfyyzy/soffio","commit_stats":null,"previous_names":["xfyyzy/soffio"],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/xfyyzy/soffio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xfyyzy%2Fsoffio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xfyyzy%2Fsoffio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xfyyzy%2Fsoffio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xfyyzy%2Fsoffio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xfyyzy","download_url":"https://codeload.github.com/xfyyzy/soffio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xfyyzy%2Fsoffio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31305967,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T09:48:21.550Z","status":"ssl_error","status_checked_at":"2026-04-02T09:48:19.196Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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-agents","askama","blog","cms","datastar","docker-compose","headless-cms","musl","rust","soffio","ssr"],"created_at":"2026-02-05T16:00:55.001Z","updated_at":"2026-04-02T11:57:56.523Z","avatar_url":"https://github.com/xfyyzy.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Soffio\n\n[![CI](https://github.com/xfyyzy/soffio/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/xfyyzy/soffio/actions/workflows/ci.yml)\n[![Release](https://github.com/xfyyzy/soffio/actions/workflows/release.yml/badge.svg)](https://github.com/xfyyzy/soffio/actions/workflows/release.yml)\n[![Rust Edition](https://img.shields.io/badge/Rust%20Edition-2024-orange?logo=rust\u0026logoColor=white)](https://doc.rust-lang.org/edition-guide/)\n[![Public Site](https://img.shields.io/website?url=https%3A%2F%2Fsoffio.xfyyzy.xyz\u0026label=public%20site)](https://soffio.xfyyzy.xyz)\n[![Admin Site](https://img.shields.io/website?url=https%3A%2F%2Fadmin.soffio.xfyyzy.xyz\u0026label=admin%20site)](https://admin.soffio.xfyyzy.xyz)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/xfyyzy/soffio)\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.producthunt.com/products/soffio?embed=true\u0026utm_source=badge-featured\u0026utm_medium=badge\u0026utm_source=badge-soffio\" target=\"_blank\"\u003e\u003cimg src=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1037444\u0026theme=light\u0026t=1763008766261\" alt=\"Soffio - Rust\u0026#0045;native\u0026#0032;publishing\u0026#0032;with\u0026#0032;a\u0026#0032;calm\u0026#0044;\u0026#0032;focused\u0026#0032;admin | Product Hunt\" style=\"width: 250px; height: 54px;\" width=\"250\" height=\"54\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nEnglish | [中文](README.zh.md)\n\nSoffio is a Rust-powered publishing platform. The public site renders posts statically and sprinkles interactive widgets, while the admin console focuses on writing, editing, and releasing content. The stack centers on Axum, Askama, and SQLx, and the codebase enforces a domain/application/infra layering model (see `AGENTS.md`). Soffio is released under the BSD-2-Clause license.\n\n## Demo Environments\n\n- Public site: \u003chttps://soffio.xfyyzy.xyz\u003e\n- Admin site: \u003chttps://admin.soffio.xfyyzy.xyz\u003e\n\nThe demo database resets at the top of every hour.\n\n## Repository Layout\n\n```\nsrc/\n├── domain        # domain entities, invariants, value objects\n├── application   # use-case services, repo traits, job scheduling\n├── infra         # Postgres repos, HTTP adapters, telemetry\n├── presentation  # view models, templates, layouts\n├── util          # supporting utilities (time zones, ids, etc.)\n└── main.rs       # CLI / service entry point\n```\n\n## Prerequisites\n\n- Rust stable ≥ 1.91 (2024 Edition ready)\n- PostgreSQL 18 (default DSN `postgres://soffio:soffio_local_dev@localhost:5432/soffio_dev`)\n- TypeScript Compiler 6.x (`tsc --version`, validated with 6.0.2)\n\n## Quick Start\n\n1. Install the prerequisites above and create the `soffio_dev` database.\n2. Launch the service:\n   ```bash\n   SOFFIO__DATABASE__URL=postgres://soffio:soffio_local_dev@localhost:5432/soffio_dev cargo run --bin soffio\n   ```\n3. Browse the defaults:\n   - Public site at `http://127.0.0.1:3000`\n   - Admin site at `http://127.0.0.1:3001`\n   - Override addresses via CLI flags or environment variables when needed.\n\n## Runtime Components\n\n- **HTTP services** — Axum 0.8 with separate listeners for public and admin traffic (`src/infra/http/public.rs` and `src/infra/http/admin/`).\n- **Database access** — SQLx (Postgres); concrete repos live in `src/infra/db`, while traits are defined in `src/application/repos.rs`.\n- **Telemetry** — `tracing` + `tracing-subscriber`, bootstrapped via `src/infra/telemetry.rs`.\n\n## Headless API\n\n- Base path: `/api/v1` on the public listener.\n- Auth: `Authorization: Bearer \u003capi_key\u003e` (obtain/manage keys in the admin UI under “API keys”; keys are shown once). Admin workflow documented in [`docs/admin/api-keys.md`](docs/admin/api-keys.md).\n- Scopes control access (snake_case): `post_read`, `post_write`, `page_read`, `page_write`, `tag_read`, `tag_write`, `navigation_read`, `navigation_write`, `upload_read`, `upload_write`, `settings_read`, `settings_write`, `job_read`, `audit_read`.\n- Rate limit: configured via `api_rate_limit` (default: 120 requests per 60s per key).\n- Specification: [`docs/api/openapi.yaml`](docs/api/openapi.yaml).\n\n## soffio-cli\n\nHeadless API CLI for admins and automation. See [`docs/cli.md`](docs/cli.md) for the generated command matrix and full usage guide.\n\nQuick start:\n\n```\ncargo build -p soffio-cli --release\nSOFFIO_SITE_URL=https://your.site \\\nSOFFIO_API_KEY_FILE=~/.config/soffio/key \\\n./target/release/soffio-cli api-keys me\n```\n\nCreate a post from files:\n\n```\n./target/release/soffio-cli posts create \\\n  --title \"Title\" --excerpt \"Summary\" \\\n  --body-file ./post.md --summary-file ./post.summary.md \\\n  --status published\n```\n\n## Development Workflow\n\n1. Run the baseline quality gates:\n   ```bash\n   # point DATABASE_URL to your writable instance; SQLX_TEST_DATABASE_URL is used by `#[sqlx::test]` to create temp DBs\n   export DATABASE_URL=postgres://soffio:soffio_local_dev@localhost:5432/soffio_dev\n   export SQLX_TEST_DATABASE_URL=postgres://soffio:soffio_local_dev@127.0.0.1:5432/postgres\n\n   # default fast loop\n   ./scripts/gate-fast.sh\n\n   # before PR/merge\n   ./scripts/gate-full.sh\n\n   # periodic dependency hygiene (for example weekly)\n   ./scripts/gate-hygiene.sh\n   ```\n2. Consult `CONTRIBUTING.md` for branching strategy, commit format, and review expectations.\n3. Follow `.github/PULL_REQUEST_TEMPLATE.md` and ensure CI stays green before merging.\n\n## Deployment\n\nProduction deployments are typically containerized. Refer to [`docs/deploy/docker.md`](docs/deploy/docker.md) for compose files, environment variables, health checks, and operational tips.\n\n## Releases \u0026 Changelog\n\n- Every tagged release is documented in `CHANGELOG.md`.\n- Each release should ship with:\n  1. Migration scripts plus backward-compatibility notes.\n  2. A list of new/changed configuration keys and their defaults.\n\n## Support, Community \u0026 Security\n\n- Support channels and FAQs: `SUPPORT.md`\n- Security disclosure process: `SECURITY.md`\n- Code of Conduct: `CODE_OF_CONDUCT.md`\n\n## License\n\nBSD-2-Clause — see `LICENSE` for the full text.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxfyyzy%2Fsoffio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxfyyzy%2Fsoffio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxfyyzy%2Fsoffio/lists"}