Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Optional local-only export targets.
# Leave unset in public CI and ordinary GitHub Pages builds.
STACKSCOUT_PRIVATE_EXPORT_DIR=
STACKSCOUT_PRIVATE_EXPORT_FILE=
STACKSCOUT_PRIVATE_STATUS_DIR=
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ planning-local/
.local-notes/

# Local screenshots and scratch files
.serve.log
.serve.err.log
tmp-*.png
tmp-*.jpg
tmp-*.jpeg
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

`stackscout` builds **Stack Scout**, the public-facing tools destination for curated builder tools, services, APIs, MCPs, and CLIs.

This repo remains the GitHub Pages implementation base, but the visible product is no longer a simple internal "Tools Hub" brochure. The private operational console stays separate in `W:\Repos\_local\surfaces\tools-hub-local`.
This repo remains the GitHub Pages implementation base, but the visible product is no longer a simple internal "Tools Hub" brochure. The private operational console stays outside this public repo.

## Public vs private

- This repo is public-facing only.
- The local launcher, manager inbox, review evidence, session state, and leak-check operations belong in `tools-hub-local`.
- Local launchers, operations state, and review artefacts belong in the private local surface, not this repo.
- Public content must stay safe for GitHub Pages and public browsing.
- Do not rely on `.gitignore` alone to protect private data. Public output is generated from an allowlisted shared source layer.

Expand All @@ -23,7 +23,7 @@ These source files drive:

- public manifests in `data/`
- generated static pages across the public site
- a private preview export written to `W:\Repos\_local\surfaces\tools-hub-local\data\stackscout-publishing.json`
- an optional private preview export when `STACKSCOUT_PRIVATE_EXPORT_DIR` or `STACKSCOUT_PRIVATE_EXPORT_FILE` is set locally

## Build

Expand Down Expand Up @@ -68,9 +68,9 @@ Before a public refresh, bump `CACHE_NAME` in `service-worker.js` when generated
npm run refresh:site
```

This runs the site build, runs checks, and writes private refresh status to `W:\Repos\_local\surfaces\tools-hub-local\data\stackscout-refresh-status.json`.
This runs the site build, runs checks, and optionally writes private refresh status when `STACKSCOUT_PRIVATE_STATUS_DIR` is set locally.

For unattended Windows refreshes without visible terminal focus theft, use the local-only launcher at `W:\Repos\_My Tools\LOCAL-ONLY\stackscout-refresh\run-stackscout-refresh.cmd`.
For unattended Windows refreshes without visible terminal focus theft, use a local-only launcher outside this public repo and set the optional private export/status environment variables there.

## Site structure

Expand Down
2 changes: 1 addition & 1 deletion catalog/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -676,7 +676,7 @@ <h3>SyncPad</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion categories/apis/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ <h3>Anthropic API</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion categories/clis/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ <h3>Wrangler</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion categories/desktop-apps/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ <h3>SyncPad</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion categories/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ <h3>Desktop Apps</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion categories/mcps/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ <h3>Playwright MCP</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion categories/web-apps/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ <h3>Strudel Studio</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion categories/web-services/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ <h3>Make</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion categories/websites/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ <h3>Hugging Face</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion collections/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ <h3>From the Stack Scout Lab</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../pwa.js"></script>
Expand Down
4 changes: 2 additions & 2 deletions data/categories-manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"title": "Stack Scout // Categories",
"generatedAt": "2026-05-25",
"updatedAt": "2026-05-25",
"generatedAt": "2026-06-04",
"updatedAt": "2026-06-04",
"categories": [
{
"slug": "websites",
Expand Down
4 changes: 2 additions & 2 deletions data/collections-manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"title": "Stack Scout // Collections",
"generatedAt": "2026-05-25",
"updatedAt": "2026-05-25",
"generatedAt": "2026-06-04",
"updatedAt": "2026-06-04",
"collections": [
{
"slug": "creator-stack",
Expand Down
4 changes: 2 additions & 2 deletions data/methodology-manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"title": "Stack Scout // Methodology",
"generatedAt": "2026-05-25",
"updatedAt": "2026-05-25",
"generatedAt": "2026-06-04",
"updatedAt": "2026-06-04",
"thesis": "Stack Scout is a public guide, not a benchmark lab. We badge selectively, update from official sources where possible, and avoid pretending every fast-moving tool deserves a fixed numeric score.",
"principles": [
{
Expand Down
2 changes: 1 addition & 1 deletion data/page-registry.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"title": "Stack Scout // Page Registry",
"generatedAt": "2026-05-25",
"generatedAt": "2026-06-04",
"pages": [
{
"key": "home",
Expand Down
4 changes: 2 additions & 2 deletions data/radar-manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"title": "Stack Scout // Radar",
"generatedAt": "2026-05-25",
"updatedAt": "2026-05-25",
"generatedAt": "2026-06-04",
"updatedAt": "2026-06-04",
"items": [
{
"title": "Azure MCP Server",
Expand Down
4 changes: 2 additions & 2 deletions data/tools-manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"title": "Stack Scout // Tools Manifest",
"generatedAt": "2026-05-25",
"updatedAt": "2026-05-25",
"generatedAt": "2026-06-04",
"updatedAt": "2026-06-04",
"summary": "Public-safe catalog for Stack Scout.",
"counts": {
"total": 14,
Expand Down
4 changes: 2 additions & 2 deletions data/updates-manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"title": "Stack Scout // Updates",
"generatedAt": "2026-05-25",
"updatedAt": "2026-05-25",
"generatedAt": "2026-06-04",
"updatedAt": "2026-06-04",
"summary": "Public-safe activity stream seeded from official or first-party sources.",
"items": [
{
Expand Down
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,7 @@ <h3>From the Stack Scout Lab</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="./pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion method/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ <h2>Verdict language</h2>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion radar/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ <h3>GitHub skills ecosystem</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../pwa.js"></script>
Expand Down
24 changes: 9 additions & 15 deletions scripts/build-stackscout.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,6 @@ const path = require('path')
const ROOT_DIR = path.resolve(__dirname, '..')
const SOURCE_DIR = path.join(ROOT_DIR, 'content', 'stackscout')
const DATA_DIR = path.join(ROOT_DIR, 'data')
const PRIVATE_PREVIEW_EXPORT_CANDIDATES = [
'W:\\Repos\\_local\\surfaces\\tools-hub-local\\data\\stackscout-publishing.json',
'\\\\nas_storage_1\\Workspaces\\Repos\\_local\\surfaces\\tools-hub-local\\data\\stackscout-publishing.json',
]
const BUILD_NOW = new Date()
const GENERATED_AT = BUILD_NOW.toISOString().slice(0, 10)
const GENERATED_AT_ISO = BUILD_NOW.toISOString()
Expand Down Expand Up @@ -54,17 +50,16 @@ function writeExternalJson(absolutePath, value) {
fs.writeFileSync(absolutePath, `${JSON.stringify(value, null, 2)}\n`, 'utf8')
}

function resolveWritableExternalPath(candidates) {
for (const candidate of candidates) {
try {
ensureParent(candidate)
return candidate
} catch (error) {
continue
}
function resolvePrivatePreviewExportPath() {
if (process.env.STACKSCOUT_PRIVATE_EXPORT_FILE) {
return path.resolve(process.env.STACKSCOUT_PRIVATE_EXPORT_FILE)
}

throw new Error(`Unable to resolve writable external path from candidates: ${candidates.join(', ')}`)
if (process.env.STACKSCOUT_PRIVATE_EXPORT_DIR) {
return path.join(path.resolve(process.env.STACKSCOUT_PRIVATE_EXPORT_DIR), 'stackscout-publishing.json')
}

return null
}

function escapeHtml(value) {
Expand Down Expand Up @@ -1279,8 +1274,7 @@ ${routes.map((route) => ` <url><loc>${PUBLIC_BASE_URL}${route}</loc></url>`).jo
}

function main() {
const privatePreviewExport =
process.platform === 'win32' ? resolveWritableExternalPath(PRIVATE_PREVIEW_EXPORT_CANDIDATES) : null
const privatePreviewExport = resolvePrivatePreviewExportPath()
const site = readJson('site-source.json')
const tools = readJson('tools-source.json')
const updates = readJson('updates-source.json').sort((a, b) => b.publishedAt.localeCompare(a.publishedAt))
Expand Down
40 changes: 21 additions & 19 deletions scripts/refresh-stackscout.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,24 @@ param(
$ErrorActionPreference = 'Stop'

$repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..')).Path
$privateDataDirCandidates = @(
'W:\Repos\_local\surfaces\tools-hub-local\data',
'\\nas_storage_1\Workspaces\Repos\_local\surfaces\tools-hub-local\data'
)
$privateDataDir = $null
foreach ($candidate in $privateDataDirCandidates) {
try {
if (-not (Test-Path $candidate)) {
New-Item -ItemType Directory -Path $candidate -Force | Out-Null
}
$privateDataDirInput = if ($env:STACKSCOUT_PRIVATE_STATUS_DIR) {
$env:STACKSCOUT_PRIVATE_STATUS_DIR
} elseif ($env:STACKSCOUT_PRIVATE_EXPORT_DIR) {
$env:STACKSCOUT_PRIVATE_EXPORT_DIR
} else {
$null
}

$privateDataDir = (Resolve-Path $candidate).Path
break
} catch {
continue
$privateDataDir = $null
if ($privateDataDirInput) {
if (-not (Test-Path $privateDataDirInput)) {
New-Item -ItemType Directory -Path $privateDataDirInput -Force | Out-Null
}
}

if (-not $privateDataDir) {
throw 'Unable to resolve a writable private data directory for Stack Scout refresh status.'
$privateDataDir = (Resolve-Path $privateDataDirInput).Path
}

$statusFile = Join-Path $privateDataDir 'stackscout-refresh-status.json'
$statusFile = if ($privateDataDir) { Join-Path $privateDataDir 'stackscout-refresh-status.json' } else { $null }
$toolsManifestFile = Join-Path $repoRoot 'data\tools-manifest.json'
$updatesManifestFile = Join-Path $repoRoot 'data\updates-manifest.json'
$categoriesManifestFile = Join-Path $repoRoot 'data\categories-manifest.json'
Expand All @@ -38,10 +33,13 @@ $durationStopwatch = [System.Diagnostics.Stopwatch]::StartNew()

function Read-JsonFile {
param(
[Parameter(Mandatory = $true)]
[string]$Path
)

if (-not $Path) {
return $null
}

if (-not (Test-Path $Path)) {
return $null
}
Expand Down Expand Up @@ -82,6 +80,10 @@ function Write-RefreshStatus {
$payload[$entry.Key] = $entry.Value
}

if (-not $statusFile) {
return
}

$directory = Split-Path -Parent $statusFile
if (-not (Test-Path $directory)) {
New-Item -ItemType Directory -Path $directory -Force | Out-Null
Expand Down
2 changes: 1 addition & 1 deletion service-worker.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const CACHE_NAME = 'stackscout-2026-05-25'
const CACHE_NAME = 'stackscout-2026-06-04'
const APP_SHELL = [
'',
'index.html',
Expand Down
2 changes: 1 addition & 1 deletion tools/anthropic-api/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ <h3>n8n</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion tools/canvas-planner/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ <h3>SyncPad</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion tools/gh-cli/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ <h3>Wrangler</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../../pwa.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion tools/github-mcp-server/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ <h3>Wrangler</h3>
</div>
<div class="site-footer__meta">
<p><span class="live-dot" aria-hidden="true"></span><span id="utcClock">Live UTC</span></p>
<p>Updated 25 May 2026 from the Stack Scout shared source layer.</p>
<p>Updated 4 Jun 2026 from the Stack Scout shared source layer.</p>
</div>
</footer>
<script src="../../pwa.js"></script>
Expand Down
Loading