diff --git a/README.md b/README.md
index 5ae9968..75f8ce2 100644
--- a/README.md
+++ b/README.md
@@ -5,13 +5,13 @@ project registry that several tools consume.
## project-manifest.json is an API
-`project-manifest.json` is the canonical registry of every project in the
-account. It is consumed by:
+`project-manifest.json` is the canonical public registry of projects backed
+by public DaveHomeAssist repositories. Private inventory is never published
+through this repository. The public registry is consumed by:
- **This hub** (`index.html`) to render the portfolio
- **graph-explorer** to visualize the ecosystem
-- **command-center-061eed** (mirror of the private `ops-hub`) to monitor live
- surfaces and git sync state
+- **command-center-061eed** to monitor public live surfaces and git sync state
Treat changes to it as API changes: keep `id` values stable, update
`meta.lastUpdated` on any edit, and never delete an entry for a repo that
@@ -24,7 +24,7 @@ still exists on GitHub (mark it `archived` instead).
| `id` | Stable slug; never reuse or rename |
| `status` | `active`, `wip`, `archived`, or `candidate` (added by sweep, pending curation) |
| `featured` | Mirrors the `featured-product` GitHub topic; exactly the set pinned on the profile |
-| `visibility` | `public` or `unlisted` (published but not surfaced in hub navigation) |
+| `visibility` | Catalog visibility: `public`, `unlisted`, or `isolated`; private values are forbidden in public output |
| `hosting` / `url` | Where the live surface runs, if any |
| `repo` | GitHub URL; update on renames even though GitHub redirects |
diff --git a/index.html b/index.html
index a0ba78a..41cd778 100644
--- a/index.html
+++ b/index.html
@@ -981,7 +981,7 @@
Useful things that got out of hand.
- AgentDeck
+ PixelForge
Garden OS
Ballparks
Recipes
@@ -1069,7 +1069,7 @@ Project directory
"meta": {
"owner": "DaveHomeAssist",
"github": "https://github.com/DaveHomeAssist",
- "lastUpdated": "2026-08-16",
+ "lastUpdated": "2026-08-23",
"hub": "https://davehomeassist.github.io"
},
"projects": [
@@ -1820,7 +1820,7 @@ Project directory
{
"id": "stereo-field-compressor",
"name": "Stereo Field Compressor",
- "description": "Sidechain driven spatial compression plugin (public prototype, archived; canonical source is the private StereoFieldCompressor repo)",
+ "description": "Sidechain-driven spatial compression plugin (public prototype, archived; canonical source pending duplicate-resolution review)",
"category": "audio-music-tools",
"status": "archived",
"visibility": "public",
@@ -1970,25 +1970,6 @@ Project directory
"shared"
]
},
- {
- "id": "agentdeck",
- "name": "AgentDeck",
- "description": "Local-first registry, inspector, and evaluation bench for AI agents, skills, prompt packages, fixtures, and backend adapters.",
- "category": "ai-agent-systems",
- "status": "active",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "agents",
- "evals",
- "local-first"
- ]
- },
{
"id": "recipe-tracker",
"name": "Recipe Tracker",
@@ -2008,25 +1989,6 @@ Project directory
"family"
]
},
- {
- "id": "content-automation",
- "name": "Content Automation",
- "description": "Local content engine for discovery, trend scoring, script generation, critique, repurposing, and review-gated publishing.",
- "category": "ai-agent-systems",
- "status": "active",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "automation",
- "content",
- "workflow"
- ]
- },
{
"id": "code-dashboard",
"name": "Code Dashboard",
@@ -2046,78 +2008,6 @@ Project directory
"automation"
]
},
- {
- "id": "llm-log-candidate",
- "name": "LLM Log",
- "description": "Private snapshot dashboard of DB | Discussion Log",
- "category": "ai-agent-systems",
- "status": "archived",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html"
- ]
- },
- {
- "id": "bpmdelay-calc-candidate",
- "name": "BPM Delay Calc",
- "description": "JUCE BPM delay calculator plugin with Windows GitHub Actions build artifacts",
- "category": "audio-music-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "c++"
- ]
- },
- {
- "id": "stereo-field-compressor-private-candidate",
- "name": "Stereo Field Compressor",
- "description": "JUCE VST3/Standalone spatial compressor — mid/side, cone-weighted gain reduction",
- "category": "audio-music-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "c++"
- ]
- },
- {
- "id": "cueforge-candidate",
- "name": "CueForge",
- "description": "Live cue control software: audio, video, lighting (DMX), MIDI, and OSC in a single timeline",
- "category": "av-show-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "typescript"
- ]
- },
{
"id": "plotforge-candidate",
"name": "PlotForge",
@@ -2157,7 +2047,7 @@ Project directory
{
"id": "command-center-061eed-candidate",
"name": "Command Center",
- "description": "Single-page ops dashboard: one-screen view of project status, git sync state, and domain health (mirror of ops-hub)",
+ "description": "Public operations dashboard for project status, git sync state, and domain health",
"category": "command-center-ops",
"status": "candidate",
"visibility": "public",
@@ -2172,95 +2062,6 @@ Project directory
"html"
]
},
- {
- "id": "ops-hub-candidate",
- "name": "Ops Hub",
- "description": "Local generator workspace for the Ops Hub switchboard; canonical source behind the command center",
- "category": "command-center-ops",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html"
- ]
- },
- {
- "id": "secrets-inventory-candidate",
- "name": "Secrets Inventory",
- "description": "Cross-project API credentials and env-var inventory. Tracker, not a vault.",
- "category": "command-center-ops",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate"
- ]
- },
- {
- "id": "chip-signals-webapp-candidate",
- "name": "Chip Signals Webapp",
- "description": "Web interface for the daily chip-signals report: 2-minute briefing plus valuation and catalyst data",
- "category": "content-signals",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "typescript"
- ]
- },
- {
- "id": "frontier-signals-candidate",
- "name": "Frontier Signals",
- "description": "Astro source for frontiersignals.io, editorial site of record for AI infrastructure research",
- "category": "content-signals",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "astro"
- ]
- },
- {
- "id": "frontier-signals-pipeline-candidate",
- "name": "Frontier Signals Pipeline",
- "description": "Quantum news scraper + dashboard. Daily Task Scheduler 7:30 AM ET.",
- "category": "content-signals",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html"
- ]
- },
{
"id": "hat-in-ring-candidate",
"name": "Hat In Ring Archive",
@@ -2333,24 +2134,6 @@ Project directory
"catalog-candidate"
]
},
- {
- "id": "aoe2-clone-candidate",
- "name": "AOE2 Clone",
- "description": "Deterministic C++ RTS in the Age of Empires II lineage. Headless sim core plus optional SDL3 app. Lockstep multiplayer over TCP.",
- "category": "games-interactive-play",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "typescript"
- ]
- },
{
"id": "clever-paws-candidate",
"name": "Clever Paws",
@@ -2443,117 +2226,6 @@ Project directory
"local-first",
"pwa"
]
- },
- {
- "id": "streamdeck-icon-server-candidate",
- "name": "Stream Deck Icon Server",
- "description": "Local icon server for Stream Deck profiles (private; no description on GitHub yet)",
- "category": "av-show-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html",
- "stream-deck"
- ]
- },
- {
- "id": "arena-ops-candidate",
- "name": "Arena Ops",
- "description": "Native macOS readiness dashboard for Resolume Arena",
- "category": "av-show-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "swift",
- "resolume"
- ]
- },
- {
- "id": "world-cup-app-candidate",
- "name": "World Cup App",
- "description": "Interactive FIFA World Cup 2026 bracket predictor - standalone System by Dave app.",
- "category": "games-interactive-play",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "typescript"
- ]
- },
- {
- "id": "tradetron-candidate",
- "name": "Tradetron",
- "description": "Self-contained crypto trading bot: pure Python strategy engine plus Tkinter desktop dashboard",
- "category": "research-developer-utility",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "python"
- ]
- },
- {
- "id": "marsscape-candidate",
- "name": "Marsscape",
- "description": "Tick-based Mars colony skiller: gather, craft, build, survive on the RuneScape XP curve",
- "category": "games-interactive-play",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html"
- ]
- },
- {
- "id": "sbd-core-candidate",
- "name": "SBD Core",
- "description": "System by Dave shared core library: zero-dependency local-first primitives extracted from the portfolio",
- "category": "ai-agent-systems",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "javascript",
- "library"
- ]
}
],
"categories": {
diff --git a/package.json b/package.json
index f41acc4..cef3b51 100644
--- a/package.json
+++ b/package.json
@@ -3,6 +3,7 @@
"private": true,
"type": "module",
"scripts": {
- "sync-manifest": "node scripts/sync-manifest.mjs"
+ "validate-manifest": "node scripts/validate-public-manifest.mjs",
+ "sync-manifest": "npm run validate-manifest && node scripts/sync-manifest.mjs"
}
}
diff --git a/private-hub.html b/private-hub.html
index 3b91831..c9f9798 100644
--- a/private-hub.html
+++ b/private-hub.html
@@ -953,7 +953,7 @@ Project details
"meta": {
"owner": "DaveHomeAssist",
"github": "https://github.com/DaveHomeAssist",
- "lastUpdated": "2026-08-16",
+ "lastUpdated": "2026-08-23",
"hub": "https://davehomeassist.github.io"
},
"projects": [
@@ -1704,7 +1704,7 @@ Project details
{
"id": "stereo-field-compressor",
"name": "Stereo Field Compressor",
- "description": "Sidechain driven spatial compression plugin (public prototype, archived; canonical source is the private StereoFieldCompressor repo)",
+ "description": "Sidechain-driven spatial compression plugin (public prototype, archived; canonical source pending duplicate-resolution review)",
"category": "audio-music-tools",
"status": "archived",
"visibility": "public",
@@ -1854,25 +1854,6 @@ Project details
"shared"
]
},
- {
- "id": "agentdeck",
- "name": "AgentDeck",
- "description": "Local-first registry, inspector, and evaluation bench for AI agents, skills, prompt packages, fixtures, and backend adapters.",
- "category": "ai-agent-systems",
- "status": "active",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "agents",
- "evals",
- "local-first"
- ]
- },
{
"id": "recipe-tracker",
"name": "Recipe Tracker",
@@ -1892,25 +1873,6 @@ Project details
"family"
]
},
- {
- "id": "content-automation",
- "name": "Content Automation",
- "description": "Local content engine for discovery, trend scoring, script generation, critique, repurposing, and review-gated publishing.",
- "category": "ai-agent-systems",
- "status": "active",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "automation",
- "content",
- "workflow"
- ]
- },
{
"id": "code-dashboard",
"name": "Code Dashboard",
@@ -1930,78 +1892,6 @@ Project details
"automation"
]
},
- {
- "id": "llm-log-candidate",
- "name": "LLM Log",
- "description": "Private snapshot dashboard of DB | Discussion Log",
- "category": "ai-agent-systems",
- "status": "archived",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html"
- ]
- },
- {
- "id": "bpmdelay-calc-candidate",
- "name": "BPM Delay Calc",
- "description": "JUCE BPM delay calculator plugin with Windows GitHub Actions build artifacts",
- "category": "audio-music-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "c++"
- ]
- },
- {
- "id": "stereo-field-compressor-private-candidate",
- "name": "Stereo Field Compressor",
- "description": "JUCE VST3/Standalone spatial compressor — mid/side, cone-weighted gain reduction",
- "category": "audio-music-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "c++"
- ]
- },
- {
- "id": "cueforge-candidate",
- "name": "CueForge",
- "description": "Live cue control software: audio, video, lighting (DMX), MIDI, and OSC in a single timeline",
- "category": "av-show-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "typescript"
- ]
- },
{
"id": "plotforge-candidate",
"name": "PlotForge",
@@ -2041,7 +1931,7 @@ Project details
{
"id": "command-center-061eed-candidate",
"name": "Command Center",
- "description": "Single-page ops dashboard: one-screen view of project status, git sync state, and domain health (mirror of ops-hub)",
+ "description": "Public operations dashboard for project status, git sync state, and domain health",
"category": "command-center-ops",
"status": "candidate",
"visibility": "public",
@@ -2056,95 +1946,6 @@ Project details
"html"
]
},
- {
- "id": "ops-hub-candidate",
- "name": "Ops Hub",
- "description": "Local generator workspace for the Ops Hub switchboard; canonical source behind the command center",
- "category": "command-center-ops",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html"
- ]
- },
- {
- "id": "secrets-inventory-candidate",
- "name": "Secrets Inventory",
- "description": "Cross-project API credentials and env-var inventory. Tracker, not a vault.",
- "category": "command-center-ops",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate"
- ]
- },
- {
- "id": "chip-signals-webapp-candidate",
- "name": "Chip Signals Webapp",
- "description": "Web interface for the daily chip-signals report: 2-minute briefing plus valuation and catalyst data",
- "category": "content-signals",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "typescript"
- ]
- },
- {
- "id": "frontier-signals-candidate",
- "name": "Frontier Signals",
- "description": "Astro source for frontiersignals.io, editorial site of record for AI infrastructure research",
- "category": "content-signals",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "astro"
- ]
- },
- {
- "id": "frontier-signals-pipeline-candidate",
- "name": "Frontier Signals Pipeline",
- "description": "Quantum news scraper + dashboard. Daily Task Scheduler 7:30 AM ET.",
- "category": "content-signals",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html"
- ]
- },
{
"id": "hat-in-ring-candidate",
"name": "Hat In Ring Archive",
@@ -2217,24 +2018,6 @@ Project details
"catalog-candidate"
]
},
- {
- "id": "aoe2-clone-candidate",
- "name": "AOE2 Clone",
- "description": "Deterministic C++ RTS in the Age of Empires II lineage. Headless sim core plus optional SDL3 app. Lockstep multiplayer over TCP.",
- "category": "games-interactive-play",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "typescript"
- ]
- },
{
"id": "clever-paws-candidate",
"name": "Clever Paws",
@@ -2327,117 +2110,6 @@ Project details
"local-first",
"pwa"
]
- },
- {
- "id": "streamdeck-icon-server-candidate",
- "name": "Stream Deck Icon Server",
- "description": "Local icon server for Stream Deck profiles (private; no description on GitHub yet)",
- "category": "av-show-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html",
- "stream-deck"
- ]
- },
- {
- "id": "arena-ops-candidate",
- "name": "Arena Ops",
- "description": "Native macOS readiness dashboard for Resolume Arena",
- "category": "av-show-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "swift",
- "resolume"
- ]
- },
- {
- "id": "world-cup-app-candidate",
- "name": "World Cup App",
- "description": "Interactive FIFA World Cup 2026 bracket predictor - standalone System by Dave app.",
- "category": "games-interactive-play",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "typescript"
- ]
- },
- {
- "id": "tradetron-candidate",
- "name": "Tradetron",
- "description": "Self-contained crypto trading bot: pure Python strategy engine plus Tkinter desktop dashboard",
- "category": "research-developer-utility",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "python"
- ]
- },
- {
- "id": "marsscape-candidate",
- "name": "Marsscape",
- "description": "Tick-based Mars colony skiller: gather, craft, build, survive on the RuneScape XP curve",
- "category": "games-interactive-play",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html"
- ]
- },
- {
- "id": "sbd-core-candidate",
- "name": "SBD Core",
- "description": "System by Dave shared core library: zero-dependency local-first primitives extracted from the portfolio",
- "category": "ai-agent-systems",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "javascript",
- "library"
- ]
}
],
"categories": {
diff --git a/project-manifest.json b/project-manifest.json
index 78c9cc0..2b5ea51 100644
--- a/project-manifest.json
+++ b/project-manifest.json
@@ -2,7 +2,7 @@
"meta": {
"owner": "DaveHomeAssist",
"github": "https://github.com/DaveHomeAssist",
- "lastUpdated": "2026-08-16",
+ "lastUpdated": "2026-08-23",
"hub": "https://davehomeassist.github.io"
},
"projects": [
@@ -753,7 +753,7 @@
{
"id": "stereo-field-compressor",
"name": "Stereo Field Compressor",
- "description": "Sidechain driven spatial compression plugin (public prototype, archived; canonical source is the private StereoFieldCompressor repo)",
+ "description": "Sidechain-driven spatial compression plugin (public prototype, archived; canonical source pending duplicate-resolution review)",
"category": "audio-music-tools",
"status": "archived",
"visibility": "public",
@@ -903,25 +903,6 @@
"shared"
]
},
- {
- "id": "agentdeck",
- "name": "AgentDeck",
- "description": "Local-first registry, inspector, and evaluation bench for AI agents, skills, prompt packages, fixtures, and backend adapters.",
- "category": "ai-agent-systems",
- "status": "active",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "agents",
- "evals",
- "local-first"
- ]
- },
{
"id": "recipe-tracker",
"name": "Recipe Tracker",
@@ -941,25 +922,6 @@
"family"
]
},
- {
- "id": "content-automation",
- "name": "Content Automation",
- "description": "Local content engine for discovery, trend scoring, script generation, critique, repurposing, and review-gated publishing.",
- "category": "ai-agent-systems",
- "status": "active",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "automation",
- "content",
- "workflow"
- ]
- },
{
"id": "code-dashboard",
"name": "Code Dashboard",
@@ -979,78 +941,6 @@
"automation"
]
},
- {
- "id": "llm-log-candidate",
- "name": "LLM Log",
- "description": "Private snapshot dashboard of DB | Discussion Log",
- "category": "ai-agent-systems",
- "status": "archived",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html"
- ]
- },
- {
- "id": "bpmdelay-calc-candidate",
- "name": "BPM Delay Calc",
- "description": "JUCE BPM delay calculator plugin with Windows GitHub Actions build artifacts",
- "category": "audio-music-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "c++"
- ]
- },
- {
- "id": "stereo-field-compressor-private-candidate",
- "name": "Stereo Field Compressor",
- "description": "JUCE VST3/Standalone spatial compressor — mid/side, cone-weighted gain reduction",
- "category": "audio-music-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "c++"
- ]
- },
- {
- "id": "cueforge-candidate",
- "name": "CueForge",
- "description": "Live cue control software: audio, video, lighting (DMX), MIDI, and OSC in a single timeline",
- "category": "av-show-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "typescript"
- ]
- },
{
"id": "plotforge-candidate",
"name": "PlotForge",
@@ -1090,7 +980,7 @@
{
"id": "command-center-061eed-candidate",
"name": "Command Center",
- "description": "Single-page ops dashboard: one-screen view of project status, git sync state, and domain health (mirror of ops-hub)",
+ "description": "Public operations dashboard for project status, git sync state, and domain health",
"category": "command-center-ops",
"status": "candidate",
"visibility": "public",
@@ -1105,95 +995,6 @@
"html"
]
},
- {
- "id": "ops-hub-candidate",
- "name": "Ops Hub",
- "description": "Local generator workspace for the Ops Hub switchboard; canonical source behind the command center",
- "category": "command-center-ops",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html"
- ]
- },
- {
- "id": "secrets-inventory-candidate",
- "name": "Secrets Inventory",
- "description": "Cross-project API credentials and env-var inventory. Tracker, not a vault.",
- "category": "command-center-ops",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate"
- ]
- },
- {
- "id": "chip-signals-webapp-candidate",
- "name": "Chip Signals Webapp",
- "description": "Web interface for the daily chip-signals report: 2-minute briefing plus valuation and catalyst data",
- "category": "content-signals",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "typescript"
- ]
- },
- {
- "id": "frontier-signals-candidate",
- "name": "Frontier Signals",
- "description": "Astro source for frontiersignals.io, editorial site of record for AI infrastructure research",
- "category": "content-signals",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "astro"
- ]
- },
- {
- "id": "frontier-signals-pipeline-candidate",
- "name": "Frontier Signals Pipeline",
- "description": "Quantum news scraper + dashboard. Daily Task Scheduler 7:30 AM ET.",
- "category": "content-signals",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html"
- ]
- },
{
"id": "hat-in-ring-candidate",
"name": "Hat In Ring Archive",
@@ -1266,24 +1067,6 @@
"catalog-candidate"
]
},
- {
- "id": "aoe2-clone-candidate",
- "name": "AOE2 Clone",
- "description": "Deterministic C++ RTS in the Age of Empires II lineage. Headless sim core plus optional SDL3 app. Lockstep multiplayer over TCP.",
- "category": "games-interactive-play",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "typescript"
- ]
- },
{
"id": "clever-paws-candidate",
"name": "Clever Paws",
@@ -1376,117 +1159,6 @@
"local-first",
"pwa"
]
- },
- {
- "id": "streamdeck-icon-server-candidate",
- "name": "Stream Deck Icon Server",
- "description": "Local icon server for Stream Deck profiles (private; no description on GitHub yet)",
- "category": "av-show-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html",
- "stream-deck"
- ]
- },
- {
- "id": "arena-ops-candidate",
- "name": "Arena Ops",
- "description": "Native macOS readiness dashboard for Resolume Arena",
- "category": "av-show-tools",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "swift",
- "resolume"
- ]
- },
- {
- "id": "world-cup-app-candidate",
- "name": "World Cup App",
- "description": "Interactive FIFA World Cup 2026 bracket predictor - standalone System by Dave app.",
- "category": "games-interactive-play",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "typescript"
- ]
- },
- {
- "id": "tradetron-candidate",
- "name": "Tradetron",
- "description": "Self-contained crypto trading bot: pure Python strategy engine plus Tkinter desktop dashboard",
- "category": "research-developer-utility",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "python"
- ]
- },
- {
- "id": "marsscape-candidate",
- "name": "Marsscape",
- "description": "Tick-based Mars colony skiller: gather, craft, build, survive on the RuneScape XP curve",
- "category": "games-interactive-play",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "html"
- ]
- },
- {
- "id": "sbd-core-candidate",
- "name": "SBD Core",
- "description": "System by Dave shared core library: zero-dependency local-first primitives extracted from the portfolio",
- "category": "ai-agent-systems",
- "status": "candidate",
- "visibility": "private",
- "featured": false,
- "hosting": "none",
- "url": "",
- "repo": "",
- "localPath": "",
- "runCommand": "",
- "tags": [
- "catalog-candidate",
- "javascript",
- "library"
- ]
}
],
"categories": {
@@ -1582,4 +1254,4 @@
"color": "#adb5bd"
}
}
-}
\ No newline at end of file
+}
diff --git a/scripts/validate-public-manifest.mjs b/scripts/validate-public-manifest.mjs
new file mode 100644
index 0000000..4d0b118
--- /dev/null
+++ b/scripts/validate-public-manifest.mjs
@@ -0,0 +1,37 @@
+#!/usr/bin/env node
+
+import { readFileSync } from 'node:fs';
+import { fileURLToPath } from 'node:url';
+import { dirname, resolve } from 'node:path';
+
+const __dirname = dirname(fileURLToPath(import.meta.url));
+const manifestPath = resolve(__dirname, '..', 'project-manifest.json');
+const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
+const projects = Array.isArray(manifest.projects) ? manifest.projects : null;
+const allowedVisibilities = new Set(['public', 'unlisted', 'isolated']);
+
+if (!projects) {
+ throw new Error('Public manifest must contain a projects array.');
+}
+
+const ids = new Set();
+for (const project of projects) {
+ if (!project.id || ids.has(project.id)) {
+ throw new Error(`Public manifest contains a missing or duplicate id: ${project.id || '(missing)'}`);
+ }
+ ids.add(project.id);
+
+ if (!allowedVisibilities.has(project.visibility)) {
+ throw new Error(`Public manifest rejects visibility "${project.visibility}" for ${project.id}.`);
+ }
+
+ if (!/^https:\/\/github\.com\/DaveHomeAssist\/[A-Za-z0-9._-]+\/?$/.test(project.repo || '')) {
+ throw new Error(`Public manifest requires a DaveHomeAssist GitHub repository URL for ${project.id}.`);
+ }
+
+ if (project.localPath || project.runCommand) {
+ throw new Error(`Public manifest rejects localPath/runCommand values for ${project.id}.`);
+ }
+}
+
+console.log(`Validated ${projects.length} public-safe projects across ${new Set(projects.map((project) => project.repo)).size} repositories.`);