app
Hero Studio
Public Made by Adomby adom
The hero-image lab with a human gate: `hero-studio pose <owner/slug>` opens the studio in front of the human, posed for their package, and blocks until they click Generate, producing the provenance-stamped 2000x1250 PNG the registry's hero gate requires. The image carries the title and artwork; the exported image also bakes the type pill (top right) and full wiki slug (bottom right); the page shows the hero bare, and only the homepage marquee overlays its own dynamic info. Every hero wears its P
← Commit history
Publish 0.22.1
7 files changed
+17−6
bin/hero-studiodoctor.mjs+6−1@@ -344,5 +344,10 @@ if (process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.a } console.log(JSON.stringify({ ok: report.ok, renderer: report.renderer, checks: report.checks, ...(brand ? { brand: { ok: brand.ok, owner: brand.owner, status: brand.status, checks: brand.checks } } : {}) }));- process.exit(report.ok ? 0 : 1);+ // exitCode, not process.exit(): on Windows, exiting while fetch's sockets+ // are still closing trips a libuv assertion (UV_HANDLE_CLOSING) and prints+ // a crash line after a clean report. The unref'd timer only fires if+ // something else were to hold the loop open.+ process.exitCode = report.ok ? 0 : 1;+ setTimeout(() => process.exit(process.exitCode), 8000).unref(); }
install.sh+6−2@@ -18,7 +18,10 @@ if [ -n "$ON_WINDOWS" ]; then chmod +x "$HOME/.local/bin/hero-studio" # PowerShell and cmd: run the same launcher through Git's bash. WINBIN="$(cygpath -w "$PWD/bin/hero-studio" 2>/dev/null || echo "$PWD/bin/hero-studio")"- printf '@echo off\r\nwhere bash >nul 2>nul && (bash "%s" %%*) || ("%%ProgramFiles%%\\Git\\bin\\bash.exe" "%s" %%*)\r\n' "$WINBIN" "$WINBIN" > "$HOME/.local/bin/hero-studio.cmd"+ # Git's own bash first: the first `bash` on PATH is usually WSL's launcher+ # (System32), a different machine. Exactly one interpreter runs, so a+ # failing command is never retried by a fallback.+ printf '@echo off\r\nif exist "%%ProgramFiles%%\\Git\\bin\\bash.exe" (\r\n "%%ProgramFiles%%\\Git\\bin\\bash.exe" "%s" %%*\r\n) else if exist "%%LOCALAPPDATA%%\\Programs\\Git\\bin\\bash.exe" (\r\n "%%LOCALAPPDATA%%\\Programs\\Git\\bin\\bash.exe" "%s" %%*\r\n) else (\r\n bash "%s" %%*\r\n)\r\nexit /b %%ERRORLEVEL%%\r\n' "$WINBIN" "$WINBIN" "$WINBIN" > "$HOME/.local/bin/hero-studio.cmd" echo "installed: hero-studio (wrapper + hero-studio.cmd in ~/.local/bin; add it to PATH for PowerShell)" echo "run 'hero-studio', then open http://127.0.0.1:8846/ in a browser (pose: --surface browser)" else@@ -59,7 +62,8 @@ fi DOCTOR_JSON="$(node "$PKG/doctor.mjs" 2>/dev/null || true)" case "$DOCTOR_JSON" in *'"renderer":"local"'*)- echo "renderer: OK (local headless Chrome verified; Generate renders in-container)" ;;+ if [ -n "$ON_WINDOWS" ]; then WHERE_RENDER="on this machine"; else WHERE_RENDER="in-container"; fi+ echo "renderer: OK (local headless Chrome verified; Generate renders $WHERE_RENDER)" ;; *'"renderer":"pup"'*) echo "" echo "!! renderer: PUP FALLBACK ONLY. The local headless-Chrome stack is missing, !!"
package.json+1−1@@ -2,7 +2,7 @@ "slug": "hero-studio", "title": "Hero Studio", "type": "app",- "version": "0.22.0",+ "version": "0.22.1", "description": "The hero-image lab with a human gate: `hero-studio pose <owner/slug>` opens the studio in front of the human, posed for their package, and blocks until they click Generate, producing the provenance-stamped 2000x1250 PNG the registry's hero gate requires. The image carries the title and artwork; the exported image also bakes the type pill (top right) and full wiki slug (bottom right); the page shows the hero bare, and only the homepage marquee overlays its own dynamic info. Every hero wears its PAGE OWNER's brand guide (<owner>/brand): colors, type, logo and background themes, Adom's included; an unresolved guide holds unbranded rather than borrowing Adom's look. Placement is fixed for all. The floating app window is the showcase: it auto-loads a real screenshot from the package's wiki page (screenshots/, docs/), takes a manual import, or a full-hero import (the human-ratified re-stamp path for existing heroes). The pose gate opens in verification mode: per-item checklist (title, subtitle, showcase, type match) and a Generate that unlocks only fully confirmed. Includes showcase bleeds, brand tile themes, gradient angles, pixel-faithful wiki marquee and index-card previews, and a component-hero mode with a photo/raytrace/phong fallback ladder.", "license": "MIT", "tags": [
page.json+1−1@@ -2,7 +2,7 @@ "slug": "hero-studio", "title": "Hero Studio", "type": "app",- "version": "0.22.0",+ "version": "0.22.1", "description": "The hero-image lab with a human gate: `hero-studio pose <owner/slug>` opens the studio in front of the human, posed for their package, and blocks until they click Generate, producing the provenance-stamped 2000x1250 PNG the registry's hero gate requires. The image carries the title and artwork; the exported image also bakes the type pill (top right) and full wiki slug (bottom right); the page shows the hero bare, and only the homepage marquee overlays its own dynamic info. Every hero wears its PAGE OWNER's brand guide (<owner>/brand): colors, type, logo and background themes, Adom's included; an unresolved guide holds unbranded rather than borrowing Adom's look. Placement is fixed for all. The floating app window is the showcase: it auto-loads a real screenshot from the package's wiki page (screenshots/, docs/), takes a manual import, or a full-hero import (the human-ratified re-stamp path for existing heroes). The pose gate opens in verification mode: per-item checklist (title, subtitle, showcase, type match) and a Generate that unlocks only fully confirmed. Includes showcase bleeds, brand tile themes, gradient angles, pixel-faithful wiki marquee and index-card previews, and a component-hero mode with a photo/raytrace/phong fallback ladder.", "license": "MIT", "tags": [
platform.cjs+3−1@@ -92,7 +92,9 @@ function authHeader() { /// Returns { cmd, args } (args to put before -c), or null. let pythonCache; function pythonWithPillow({ fresh = false } = {}) {- if (pythonCache !== undefined && !fresh) return pythonCache;+ // Only a FOUND interpreter is cached: after `pip install pillow` the next+ // Generate must find it without a server restart.+ if (pythonCache && !fresh) return pythonCache; const order = IS_WIN ? [['python', []], ['py', ['-3']], ['python3', []]] : [['python3', []], ['python', []]];
pose.mjs