From d6947f4ad1a2fb1fea9beca20d0b2d5453e97829 Mon Sep 17 00:00:00 2001 From: Adam Kostarelas Date: Sun, 9 Aug 2026 00:54:01 +1000 Subject: [PATCH] Add the privacykey project status hub status.json is the single source of truth for every privacykey repo's maintenance tier, and the badges, STATUS.md and org profile project list are generated from it by the shared workflow in privacykey/gh-workflows. Each account keeps its own hub, so a privacykey badge is served from a privacykey repo and no credential has to reach across the three identities. Badges are generated for public, listed repos only. The badges directory is browsable, so one file per repo would have published an index of the unreleased privacykey products. Co-Authored-By: Claude Opus 5 --- .github/workflows/project-status.yml | 22 ++++ STATUS.md | 90 ++++++++++++++++ badges/docs-mantis.json | 8 ++ badges/gh-workflows.json | 8 ++ badges/homebrew-tap.json | 8 ++ badges/mantis.json | 8 ++ badges/privacycommand.json | 8 ++ badges/privacytracker.json | 8 ++ badges/renovate-config.json | 8 ++ badges/website-privacykey.json | 8 ++ profile/README.md | 39 ++++++- status.json | 153 +++++++++++++++++++++++++++ 12 files changed, 364 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/project-status.yml create mode 100644 STATUS.md create mode 100644 badges/docs-mantis.json create mode 100644 badges/gh-workflows.json create mode 100644 badges/homebrew-tap.json create mode 100644 badges/mantis.json create mode 100644 badges/privacycommand.json create mode 100644 badges/privacytracker.json create mode 100644 badges/renovate-config.json create mode 100644 badges/website-privacykey.json create mode 100644 status.json diff --git a/.github/workflows/project-status.yml b/.github/workflows/project-status.yml new file mode 100644 index 0000000..ea9b0f0 --- /dev/null +++ b/.github/workflows/project-status.yml @@ -0,0 +1,22 @@ +name: 📋 Project status + +on: + workflow_dispatch: # Manual + push: + branches: [main] + paths: ['status.json'] + schedule: + # Saturday 07:00 AEST (08:00 AEDT over summer) — lands before the weekend + # so there's time to act on it. + - cron: '0 21 * * 5' + +jobs: + status: + uses: privacykey/gh-workflows/.github/workflows/project-status.yml@v1 + with: + target: profile/README.md + collapsed: false + secrets: + # Read-only, scoped to privacykey alone. Without it the drift check is + # skipped and says so, rather than reporting private repos as healthy. + status-token: ${{ secrets.STATUS_TOKEN }} diff --git a/STATUS.md b/STATUS.md new file mode 100644 index 0000000..20d6151 --- /dev/null +++ b/STATUS.md @@ -0,0 +1,90 @@ +# Project status + +What I promise for each privacykey project, and what I don't. Every repo's +status badge links here. + +**Tiers last reviewed: 2026-08-08.** Set by hand — it's when I last actually +looked, not when a script last ran. + +| Tier | What it means | +| --- | --- | +| 🟢 **Active** | I'm in this most weeks. Features are landing, so expect breaking changes between releases — read the changelog before you upgrade. I read issues and generally act on them quickly. | +| 🚧 **Building** | Being built. Nothing is released, nothing is supported, and it can change shape or disappear without notice. Don't build on it — watch the repo if you want to know when it ships. | +| 🛡️ **Maintained** | I'm not adding features here. It still gets security patches, dependency bumps and fixes for anything that breaks. Safe to depend on for exactly what it does today. | +| 📦 **Parked** | Finished or paused. It does what the README says and I left it working, but nothing is watching it, so it could rot quietly. I'll answer a question. I'm not promising a fix or a release. | +| ⚠️ **Unmaintained** | I'm not watching this one. Something it advertises may already be broken, and bugs won't be fixed on a schedule. Read it, fork it, vendor it — this says nothing about whether the code is any good. | +| 📁 **Archived** | Archived on GitHub and read-only. Kept so links don't rot. | + +Private and pre-announcement projects aren't listed here. + +--- + +## privacy tools + +### mantis + +🟢 **Active** — shipping now; installable today and still gaining capability + +I'm in this most weeks. Features are landing, so expect breaking changes between releases — read the changelog before you upgrade. I read issues and generally act on them quickly. + + + +### privacycommand + +🟢 **Active** — shipping now; installable today and still gaining capability + +I'm in this most weeks. Features are landing, so expect breaking changes between releases — read the changelog before you upgrade. I read issues and generally act on them quickly. + + + +### privacytracker + +🟢 **Active** — shipping now; installable today and still gaining capability + +I'm in this most weeks. Features are landing, so expect breaking changes between releases — read the changelog before you upgrade. I read issues and generally act on them quickly. + + + +## shared infrastructure + +### gh-workflows + +🛡️ **Maintained** — feature-complete; kept working and patched, not grown + +I'm not adding features here. It still gets security patches, dependency bumps and fixes for anything that breaks. Safe to depend on for exactly what it does today. + + + +### homebrew-tap + +🛡️ **Maintained** — feature-complete; kept working and patched, not grown + +I'm not adding features here. It still gets security patches, dependency bumps and fixes for anything that breaks. Safe to depend on for exactly what it does today. + + + +### renovate-config + +🛡️ **Maintained** — feature-complete; kept working and patched, not grown + +I'm not adding features here. It still gets security patches, dependency bumps and fixes for anything that breaks. Safe to depend on for exactly what it does today. + + + +## sites & docs + +### docs-mantis + +🛡️ **Maintained** — feature-complete; kept working and patched, not grown + +I'm not adding features here. It still gets security patches, dependency bumps and fixes for anything that breaks. Safe to depend on for exactly what it does today. + + + +### website-privacykey + +📦 **Parked** — done or paused; it works, nothing is watching it + +Finished or paused. It does what the README says and I left it working, but nothing is watching it, so it could rot quietly. I'll answer a question. I'm not promising a fix or a release. + + diff --git a/badges/docs-mantis.json b/badges/docs-mantis.json new file mode 100644 index 0000000..f78ece0 --- /dev/null +++ b/badges/docs-mantis.json @@ -0,0 +1,8 @@ +{ + "schemaVersion": 1, + "label": "status", + "message": "Maintained", + "color": "1f6feb", + "style": "flat", + "cacheSeconds": 3600 +} diff --git a/badges/gh-workflows.json b/badges/gh-workflows.json new file mode 100644 index 0000000..f78ece0 --- /dev/null +++ b/badges/gh-workflows.json @@ -0,0 +1,8 @@ +{ + "schemaVersion": 1, + "label": "status", + "message": "Maintained", + "color": "1f6feb", + "style": "flat", + "cacheSeconds": 3600 +} diff --git a/badges/homebrew-tap.json b/badges/homebrew-tap.json new file mode 100644 index 0000000..f78ece0 --- /dev/null +++ b/badges/homebrew-tap.json @@ -0,0 +1,8 @@ +{ + "schemaVersion": 1, + "label": "status", + "message": "Maintained", + "color": "1f6feb", + "style": "flat", + "cacheSeconds": 3600 +} diff --git a/badges/mantis.json b/badges/mantis.json new file mode 100644 index 0000000..f0f55cf --- /dev/null +++ b/badges/mantis.json @@ -0,0 +1,8 @@ +{ + "schemaVersion": 1, + "label": "status", + "message": "Active", + "color": "2ea043", + "style": "flat", + "cacheSeconds": 3600 +} diff --git a/badges/privacycommand.json b/badges/privacycommand.json new file mode 100644 index 0000000..f0f55cf --- /dev/null +++ b/badges/privacycommand.json @@ -0,0 +1,8 @@ +{ + "schemaVersion": 1, + "label": "status", + "message": "Active", + "color": "2ea043", + "style": "flat", + "cacheSeconds": 3600 +} diff --git a/badges/privacytracker.json b/badges/privacytracker.json new file mode 100644 index 0000000..f0f55cf --- /dev/null +++ b/badges/privacytracker.json @@ -0,0 +1,8 @@ +{ + "schemaVersion": 1, + "label": "status", + "message": "Active", + "color": "2ea043", + "style": "flat", + "cacheSeconds": 3600 +} diff --git a/badges/renovate-config.json b/badges/renovate-config.json new file mode 100644 index 0000000..f78ece0 --- /dev/null +++ b/badges/renovate-config.json @@ -0,0 +1,8 @@ +{ + "schemaVersion": 1, + "label": "status", + "message": "Maintained", + "color": "1f6feb", + "style": "flat", + "cacheSeconds": 3600 +} diff --git a/badges/website-privacykey.json b/badges/website-privacykey.json new file mode 100644 index 0000000..e096418 --- /dev/null +++ b/badges/website-privacykey.json @@ -0,0 +1,8 @@ +{ + "schemaVersion": 1, + "label": "status", + "message": "Parked", + "color": "8b949e", + "style": "flat", + "cacheSeconds": 3600 +} diff --git a/profile/README.md b/profile/README.md index cf47754..d6d81b0 100644 --- a/profile/README.md +++ b/profile/README.md @@ -4,13 +4,44 @@ privacykey builds open-source tools that help people understand, protect, and take control of their personal data — small, specific apps built around a shared identity. + ## Projects -- [**privacytracker**](https://github.com/privacykey/privacytracker) — track how App Store privacy labels and policies change over time, with historical imports and scheduled syncs. -- [**Mantis**](https://github.com/privacykey/mantis) — open-source serverless tripwires for detecting unwanted access. -- [**privacycommand**](https://github.com/privacykey/privacycommand) — static and basic dynamic forensics on macOS apps: see bundled telemetry, requested permissions, and preview updates before they land. +What I promise for every privacykey project, and what I don't. Reviewed 2026-08-08. -More tools are in development — watch this organization to follow along. +Each badge links to the full promise. Private and pre-announcement projects aren't listed. + +| | Tier | What it means | +| - | - | - | +| 🟢 | **Active** | shipping now; installable today and still gaining capability | +| 🛡️ | **Maintained** | feature-complete; kept working and patched, not grown | +| 📦 | **Parked** | done or paused; it works, nothing is watching it | + +**privacy tools** + +| Project | Status | | +| - | - | - | +| [mantis](https://github.com/privacykey/mantis) | 🟢 Active | | +| [privacycommand](https://github.com/privacykey/privacycommand) | 🟢 Active | | +| [privacytracker](https://github.com/privacykey/privacytracker) | 🟢 Active | | + +**shared infrastructure** + +| Project | Status | | +| - | - | - | +| [gh-workflows](https://github.com/privacykey/gh-workflows) | 🛡️ Maintained | | +| [homebrew-tap](https://github.com/privacykey/homebrew-tap) | 🛡️ Maintained | | +| [renovate-config](https://github.com/privacykey/renovate-config) | 🛡️ Maintained | | + +**sites & docs** + +| Project | Status | | +| - | - | - | +| [docs-mantis](https://github.com/privacykey/docs-mantis) | 🛡️ Maintained | | +| [website-privacykey](https://github.com/privacykey/website-privacykey) | 📦 Parked | | + +See [STATUS.md](STATUS.md) for what each tier promises. + ## Links diff --git a/status.json b/status.json new file mode 100644 index 0000000..845a79a --- /dev/null +++ b/status.json @@ -0,0 +1,153 @@ +{ + "owner": "privacykey", + "reviewed": "2026-08-08", + "repos": { + "privacytracker": { + "tier": "Active", + "group": "privacy", + "public": true, + "listed": true, + "distribution": "open-source" + }, + "mantis": { + "tier": "Active", + "group": "privacy", + "public": true, + "listed": true, + "distribution": "open-source" + }, + "privacycommand": { + "tier": "Active", + "group": "privacy", + "public": true, + "listed": true, + "distribution": "open-source" + }, + "pt-mcp": { + "tier": "Building", + "group": "privacy", + "public": false, + "listed": false, + "distribution": "private", + "note": "Went private on 2026-08-07 after the initial audit. Flip back to public/listed when it ships." + }, + "privacysentinel": { + "tier": "Building", + "group": "privacy", + "public": false, + "listed": false, + "distribution": "private" + }, + "handseal": { + "tier": "Building", + "group": "privacy", + "public": false, + "listed": false, + "distribution": "private" + }, + "on-country": { + "tier": "Building", + "group": "apps", + "public": false, + "listed": false, + "distribution": "private", + "note": "Zero-byte README — nowhere to paste a disclosure yet." + }, + "sentinelcatalogue": { + "tier": "Parked", + "group": "privacy", + "public": false, + "listed": false, + "distribution": "private" + }, + "iOSauditor": { + "tier": "Archived", + "group": "archive", + "public": false, + "listed": false, + "distribution": "private" + }, + "gh-workflows": { + "tier": "Maintained", + "group": "infra", + "public": true, + "listed": true, + "distribution": "open-source" + }, + "renovate-config": { + "tier": "Maintained", + "group": "infra", + "public": true, + "listed": true, + "distribution": "open-source" + }, + "homebrew-tap": { + "tier": "Maintained", + "group": "infra", + "public": true, + "listed": true, + "distribution": "open-source" + }, + ".github": { + "tier": "Maintained", + "group": "infra", + "public": true, + "listed": false, + "distribution": "open-source", + "note": "Supplies SECURITY.md, CONTRIBUTING.md and CODE_OF_CONDUCT.md to every privacykey repo, plus the org profile page." + }, + "docs-privacytracker": { + "tier": "Building", + "group": "sites", + "public": false, + "listed": false, + "distribution": "private", + "note": "Mintlify source. Site not live — no DNS, not connected." + }, + "docs-privacysentinel": { + "tier": "Building", + "group": "sites", + "public": false, + "listed": false, + "distribution": "private", + "note": "Mintlify source. Both declared hosts are NXDOMAIN." + }, + "docs-mantis": { + "tier": "Maintained", + "group": "sites", + "public": true, + "listed": true, + "distribution": "open-source" + }, + "website-privacykey": { + "tier": "Parked", + "group": "sites", + "public": true, + "listed": true, + "distribution": "open-source" + }, + "website-mantis": { + "tier": "Parked", + "group": "sites", + "public": false, + "listed": false, + "distribution": "private" + }, + "website-privacytracker": { + "tier": "Unmaintained", + "group": "sites", + "public": false, + "listed": false, + "distribution": "private", + "note": "Empty git repo. Push something or delete it." + }, + "website-privacycommand": { + "tier": "Unmaintained", + "group": "sites", + "public": false, + "listed": false, + "distribution": "private", + "note": "Empty git repo. Push something or delete it." + } + } +}