$ show Atarity/deploy-your-own-saas
This repository is a curated directory of self-hosted, open-source alternatives to popular SaaS products (VPN, photo hosting, cloud storage, email, chat, notes, password managers, kanban, etc.). The primary deliverable, README.md, is not hand-maintained: it is generated by readme-gen.py from a structured JSON dataset (dyos-db.json) containing roughly 180 projects grouped into ~37 service categories. Each project record stores name, description, GitHub URL, site URL, star count, last-push timestamp, and an ETag cache key. The repo answers: 'What self-hosted services exist for any given SaaS category, and how actively maintained is each option?' A GitHub Actions cron (maintenance.yml) runs daily. keep-alive.py iterates every GitHub-hosted project, queries the GitHub REST API for current star counts and pushed_at dates, and uses If-None-Match/ETag conditional requests so unchanged repos return cheap HTTP 304 responses - a genuinely thoughtful pattern that avoids rate-limit exhaustion across ~150 repos. Results are written back to dyos-db.json, then readme-gen.py regenerates the README with relative recency labels (🟢 under a month, 🟠 under a year, 🔴 older) and per-category star sorting. Both scripts use only the Python standard library, so the dependency surface is zero. Hybrid note: although it contains application-style CLI automation scripts, the dominant character is data curation - the JSON dataset and its rendered markdown output are the product, not the scripts. Data lineage is GitHub API plus manual community submissions (via the issue template) into dyos-db.json, transformed into README.md. Reproducibility is high: cloning and running readme-gen.py regenerates the README offline with no dependencies; keep-alive.py needs only a GitHub token loaded from environment or .env. The codebase is small, has no tests, and its value lies in the curated data and the clean maintainability tooling rather than in complex engineering.
The LLM identified 2 files worth highlighting for reuse:
Batch GitHub metadata refresher that walks every project in dyos-db.json, calls the GitHub REST API per repo, and persists returned ETags so subsequent runs send If-None-Match conditional requests. Unchanged repos return HTTP 304, keeping the ~150-repo daily poll comfortably within API rate limits. It degrades gracefully (per-project error capture, archived-project skip, .env token fallback) and writes enriched fields back into the JSON. This is an isolated, stdlib-only script that could be extracted as-is into any maintenance bot that must keep GitHub-derived stats fresh in a data file without burning rate limits.
Renders the curated dataset as categorized markdown tables sorted by star count. The format_relative_time() helper converts ISO-8601 push timestamps into compact human durations ('3d', '6mo', '2y') and maps them to green/orange/red activity signals - a clean, pure, reusable utility. The script is idempotent (full regeneration from JSON each run, no mutable state) and produces the repo's only user-facing deliverable, demonstrating a neat data-to-documentation pattern for keeping READMEs honest and automatically up to date.