The dashboard is a local web interface for managing IF Hub game projects. It runs on your machine and gives you browser-based access to the full build pipeline — compiling, testing, publishing, and registering games — without touching the command line.
The dashboard requires Python and Flask. Install Flask once, then launch:
# Install (one time)
pip install flask
# Launch (opens browser automatically)
python tools/dashboard.py
# Custom port
python tools/dashboard.py --port 8080
The dashboard opens in your default browser. It runs entirely locally
— nothing is exposed to the network. Press Ctrl-C
in the terminal to stop.
The interface has two panels:
projects/.
Click a project to select it. The + New Game button at
the bottom opens the creation panel.Click + New Game in the sidebar. The creation panel gives you two options:
new_project.py) and writes
your source to projects/<name>/story.ni.story.ni, test wrappers, workflow file, and
CLAUDE.md.johnesco.github.io/<name>/).
After creation, the project appears in the sidebar and is automatically selected. From there, use Publish New Game to compile and deploy it.
Three buttons for common tasks on the selected project:
| Button | What it does |
|---|---|
| Compile | Runs compile.py — compiles story.ni
to a Glulx binary, sets up the web player, and generates walkthrough
files if a walkthrough exists. Auto-detects sound. |
| Build & Test | Runs the pipeline with compile + test
stages — compiles and then runs walkthroughs and regtests. |
| Publish Update | Commits and pushes changes to the game’s GitHub Pages repo. Prompts for a commit message. Only available for projects with a git repo. |
The Publish New Game section (click to expand) handles the full flow from source code to a live game on GitHub Pages. Fill in the form fields and click the gold button.
| Field | Purpose |
|---|---|
| Title | Display name (pre-filled from the folder name) |
| Subtitle | Tagline shown below the title (default: “An Interactive Fiction”) |
| Description | Card description on the IF Hub landing page |
| Sound | Check if the game has Sounds/*.ogg files for blorb packaging |
The pipeline runs these steps automatically:
If story.ni contains Test me with "...",
the commands are extracted to
tests/inform7/walkthrough.txt. Nested sub-tests
(test first / test second) are expanded recursively.
Inform 7 → Inform 6 → Glulx binary. Sets up the Parchment
web player with play.html and walkthrough pages.
If a walkthrough exists, the transcript and annotated guide are
generated automatically.
Creates index.html (landing page) and
source.html (syntax-highlighted source browser)
from templates, using the title, subtitle, and description you entered.
Adds entries to games.json (game registry) and
cards.json (landing page cards) so the IF Hub
knows about the game.
Creates the GitHub repo (if first time), pushes all files, and
enables GitHub Pages. The game becomes playable at
johnesco.github.io/<name>/play.html.
Commits and pushes the updated games.json and
cards.json to the IF Hub repo so the live hub
immediately sees the new game.
The More Tools section (click to expand) provides individual access to each pipeline step. These use the same title, subtitle, and description from the Publish New Game form.
| Button | Script | What it does |
|---|---|---|
| Extract Walkthrough | extract_commands.py |
Extracts commands from Test me in source |
| Generate Pages | generate_pages.py |
Creates index.html + source.html |
| Register in Hub | register_game.py |
Adds entries to games.json + cards.json |
| Run Walkthrough | run_walkthrough.py |
Plays through the game with deterministic RNG seed |
| Run Regtests | run_tests.py |
Runs regression test suite |
| Unregister from Hub | unregister_game.py |
Removes the game from games.json + cards.json and pushes to GitHub. The game’s standalone Pages site remains live — this only hides it from IF Hub. |
tests/ directory.
The bottom panel streams live output from running commands. It shows the exact same output you would see in the terminal.
When a command finishes, the status indicator next to “Output” shows Done or Failed (exit code N), and the project list refreshes to reflect any status changes.
Each project in the sidebar shows a colored dot indicating its build state:
| Dot | Meaning | What it means |
|---|---|---|
| Green | Live | Registered in IF Hub — game appears in the hub dropdown and landing page |
| Yellow | Ready | play.html exists (compiled and web-ready) but not yet registered in the hub |
| Red | Uncompiled | Only story.ni — needs to be compiled before it can be played or published |
Below the dot, small tags show project capabilities: sound, versioned, Test me, walkthrough, regtest.
The dashboard is a single Python file (tools/dashboard.py)
that runs a Flask web server on localhost. It serves an
inline HTML page and exposes a JSON API:
| Endpoint | Method | Purpose |
|---|---|---|
/ |
GET | Serves the dashboard HTML page |
/api/projects |
GET | Returns all projects with metadata (sound, versions, status) |
/api/create |
POST | Scaffolds a new project via new_project.py, optionally with custom source |
/api/run |
POST | Starts a task — returns a job ID |
/api/stream/<id> |
GET | Server-Sent Events stream of live command output |
/api/stop/<id> |
POST | Terminates a running job |
Commands run as Python subprocesses. Output is streamed to
the browser via SSE (Server-Sent Events) — each line is sent as
a JSON event as soon as the subprocess writes it. The dashboard
delegates to the same scripts that the CLI tools use:
compile.py, publish.py,
register_game.py, etc.
127.0.0.1 only. It is a development tool, not a
production server.