Earcon
Falling cue: finding Rising cue: clean
For blind and low-vision developers.
A live MCP server (spec 2025-11-25) answering a simulated Alexa+ front end, per the hackathon FAQ.
user.role == 'admin' became user.role != 'admin'.”Not an Alexa skill. GitHub: dry-run.
One press plays three renderings: earcon, speech, Braille.
Falling cue: finding Rising cue: clean
Nothing spoken yet. Select Hear this code review and the sentence the server returns appears here as it is spoken.
Server's real answer, not played yet.
Synthesis engine. The button asks the server's default engine: Amazon Bedrock
when AWS credentials resolve and anthropic[bedrock] is installed, the local
heuristic otherwise. The meter under the button names which one answered.
No cells yet. Select Hear this code review and the server's Braille for this patch arrives here, one row per line, for a refreshable display.
Paste any git diff output, or pick one of the patches below.
Pressing Hear this code review sends the first 3000 characters of the patch to
Amazon Bedrock when a model is available; the local rules always read the whole patch.
Each reaches one rule Volcan ships, except the last, the control, where the right
answer is no finding at all. Each label names the sentence the server will speak back, and
tests/e2e/test_shipped_presets_reach_their_rule.py fails the build if a
preset stops producing it.
By voice or by keyboard
Open a public pull request, ask what changed, hear the exact lines, spell one out
symbol by symbol. Every turn posts to POST /api/review/turn and reads back
what it understood before it acts. The review write is dry-run by default: the server
re-reads the head commit, records the exact request it would send, and sends nothing
unless it runs with VOLCAN_GITHUB_WRITE=1 and a token.
A public GitHub pull request, read without a token; Enter opens it. Leave it empty and Open reviews the patch above instead, which can be discussed line by line but not submitted, because a pasted patch has no pull request behind it.
Leave empty for the public dry-run demo. For live reviews, use your reviewer credential from the server operator, never a GitHub token. It stays in this page's memory and goes only to the review API. Reload to clear it and start a new session when changing reviewer.
By voice, say "request changes" followed by the comment. The server binds the review to the head commit it read and waits for confirm; nothing leaves this machine until you say it.
No review staged. Say request changes followed by your comment. The server binds the review to the head commit it read, issues a single-use grant with a 300 second lease, and waits for confirm. The outcome printed here is the server's: submitted, recorded and not sent, or refused with the reason.
Press Enter to send. Say or type help for the list. A new command interrupts whatever is still being spoken. Microphone: microphone off
Or say one of these
On a Mac, Alt is the Option key.
Drawn by this page. No Echo Show and no Alexa+
has rendered this card, and the frame is a drawing, not a device. The card itself is
the server's own ui://volcan/review-card, an MCP Apps view this page
reads with resources/read over POST /mcp and hands each
turn's result as structuredContent, the way an MCP Apps host would.
Its Confirm and Cancel send the same confirm and cancel as the buttons above, through the same grant check, so the card adds no second way to release a review. Inside the card only Tab, Shift+Tab, Enter, Space and Escape work; the other shortcuts work again once focus leaves it.
No card yet. It appears after the first review turn, when this page reads the card from the server.
For reviewers
Every claim above, checkable against the server this page is talking to. Nothing here is prewritten: each panel fills from a real response.
Requesting GET /health on this origin. Nothing here claims a server until that request answers.
POST /mcpMCP 2025-11-25, Streamable HTTP; the handshake below checks it
Written by hand against revision 2025-11-25 over Streamable HTTP, with no MCP
SDK. This button sends a real initialize,
notifications/initialized and tools/list to
POST /mcp and prints what came back: stateful or stateless
transport, and every tool's JSON Schema as published.
Where this server keeps dialogue and pending approvals is
read from GET /health, and stated here once it answers. Check it independently with
python scripts/mcp_conformance.py http://127.0.0.1:8000/mcp.
The tool catalog appears here after the handshake. Each entry expands to the exact inputSchema the server published, generated from the model that parses that tool's arguments.
Amazon documents its Alexa+ client's request bodies, not its headers. This button
sends them to POST /mcp as three clients: one follows the version
rules, one declares the revision it asked for, one never sends
MCP-Protocol-Version. Alexa+ did not send them.
One line per client appears here after the replay: the header it sent, the HTTP status of each step, and the tool call's round trip as this browser timed it.
A high-consequence command is bound by HMAC-SHA256 to its own payload hash and to
a lease. Volcan plans the command and does not run it. The countdown below is
computed from the expires_at_epoch the server returned, not from a
timer this page invented.
Nothing staged. Select Stage an action to open a 300 second lease on the server.
Hear this code review calls the live digest and Braille endpoints, plays the returned WAV and reports this browser's measured round trip. No result is prewritten into the page, and there is no second implementation of the product in the browser to fall back on.
Volcan sends a rising three-note cue, DIFF_READY, when a digest is ready,
and a falling two-note cue, SECURITY_FINDING, when the patch touches
security, so the verdict arrives before the sentence does. The waveform on the stage is
drawn from the 16-bit PCM samples of the WAV the server returned, and the contour beside
it is measured from those same samples by counting zero crossings in each note. The two
cues are different audio: switch between the first and the fourth patch and the
waveform, the contour and the caption all change with the bytes.
Audio plays through your speakers. Replay the cue plays it again, and every cue also carries a written description from the server in the same live region.
Words brighten as the browser's speech engine reports reaching them. When the engine reports no word positions, the whole sentence brightens when speech starts; when it has no voice at all, the sentence is shown in full at once. No word timing is invented.
Volcan renders the patch as Unicode Braille in the U+2800 block for a refreshable
display. The default is eight-dot code fidelity, one cell per printable character, so
(, ) and = keep their own cells; six-dot literary
Braille is lossy for code, and the server names what it lost in this patch. The large
cells on the stage are the server's own code points drawn dot by dot, and the cells
that differ between the removed and the added line are marked.
Synthesis engine is read from the synthesis_mode field of
the response, with synthesis_fallback_reason printed when no model answered.
Round trip is wall clock across fetch and the JSON parse,
from performance.now(). Change size is counted by the
server's unified diff parser, not by this page.