with one click
speckit-wireframe-view
Launch the interactive wireframe viewer in a browser
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Launch the interactive wireframe viewer in a browser
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Generate SVG wireframes from spec.md with light/dark/both themes
Cross-SVG consistency check for features with multiple wireframes
Load spec context and validation rules before generating wireframes
Review wireframes, classify issues as PATCH or REGENERATE, sign off approved wireframes into spec.md
Capture standardized screenshots of wireframes (requires Python or Docker)
| name | speckit-wireframe-view |
| description | Launch the interactive wireframe viewer in a browser |
| compatibility | Requires spec-kit project structure with .specify/ directory |
| metadata | {"author":"github-spec-kit","source":"wireframe:commands/view.md"} |
eightysix note: the viewer is integrated into the Next.js app at
/wireframes(src/app/wireframes/page.tsx iframespublic/wireframes/viewer.html). Wireframes auto-sync onpnpm run devandpnpm run buildviascripts/sync-wireframes.sh. To preview a local edit without rebuilding, re-run the sync script manually.
Open the interactive viewer for all wireframes in this project. Side-navigation auto-discovered from specs/*/wireframes/*.svg, with keyboard shortcuts, zoom, focus mode, and status badges derived from .issues.md files.
$ARGUMENTS
Accepts:
--port N — override default port 3000--no-open — start the server but don't auto-open the browser--rebuild-manifest — regenerate the wireframes-manifest.json before launchingThe viewer needs Python 3.9+ for the manifest generator + static server. Check:
python3 --version
If Python 3.9+ is missing, print this and stop:
═══════════════════════════════════════════
VIEWER REQUIRES PYTHON 3.9+
═══════════════════════════════════════════
The wireframe viewer uses Python's built-in http.server
for a zero-dependency static server.
Install Python 3.9+ and re-run this command.
Alternative: open
.specify/extensions/wireframe/viewer/viewer.html
directly in a browser. (Some features like manifest
auto-discovery will not work without a server.)
═══════════════════════════════════════════
Always regenerate unless --rebuild-manifest is explicitly disabled — the cost is sub-second and manifests drift when wireframes get added or reviewed.
python3 .specify/extensions/wireframe/scripts/generate-manifest.py \
--specs-dir specs \
--output .specify/extensions/wireframe/viewer/wireframes-manifest.json
Output shows feature + wireframe count:
Wrote manifest: .specify/extensions/wireframe/viewer/wireframes-manifest.json
Features: 3
Wireframes: 7
Build .specify/extensions/wireframe/viewer/viewer-config.json from what the project exposes. Two facts get captured:
Project name — current directory basename (e.g. ~/repos/my-app → "my-app"):
PROJECT_NAME=$(basename "$PWD")
Project repo URL — derive from origin remote if this is a git repo. Normalize SSH-form remotes to HTTPS so browsers can open them:
PROJECT_REPO=""
if REMOTE=$(git remote get-url origin 2>/dev/null); then
case "$REMOTE" in
git@github.com:*) PROJECT_REPO="https://github.com/${REMOTE#git@github.com:}" ;;
git@*:*) PROJECT_REPO="$REMOTE" ;; # leave non-GitHub SSH alone
http*|https*) PROJECT_REPO="$REMOTE" ;;
esac
# Strip trailing .git
PROJECT_REPO="${PROJECT_REPO%.git}"
fi
Write the JSON:
{
"project_name": "<PROJECT_NAME>",
"project_repo": "<PROJECT_REPO>"
}
If there's no git repo (or no origin remote), project_repo stays empty — the viewer degrades gracefully and the Project footer link becomes a no-op # until the user configures one.
Serve from the project root (not the viewer directory) so absolute paths like /specs/<feature>/wireframes/<svg> resolve without Python's http.server blocking .. traversal:
python3 -m http.server 3000 --bind 127.0.0.1
The viewer is then reachable at /.specify/extensions/wireframe/viewer/viewer.html and the SVGs at /specs/....
Report:
═══════════════════════════════════════════
VIEWER RUNNING
═══════════════════════════════════════════
URL: http://localhost:3000/.specify/extensions/wireframe/viewer/viewer.html
Manifest: 3 features, 7 wireframes
Keyboard shortcuts:
← → Previous / next wireframe
1-9 Jump to feature N
F Toggle focus mode
L Toggle legend
+/- Zoom
? Show all shortcuts
Stop the server with Ctrl+C.
═══════════════════════════════════════════
If --no-open was not passed, attempt to open the browser:
URL="http://localhost:3000/.specify/extensions/wireframe/viewer/viewer.html"
# Linux
xdg-open "$URL" 2>/dev/null
# macOS
open "$URL" 2>/dev/null
# Windows / WSL
start "$URL" 2>/dev/null
Fall back to printing the URL if auto-open fails.
.issues.md yet).issues.md present, status PATCH or REGENERATE).issues.md present, status PASS — signed off in spec.md)The manifest is generated fresh each /speckit.wireframe.view invocation. If wireframes change while the viewer is running, re-run this command to refresh, or refresh the browser after running:
python3 .specify/extensions/wireframe/scripts/generate-manifest.py
0.0.0.0 without explicit user consent — localhost-only by default for security