From quickshow
Play tic-tac-toe with the user in a floating QuickShow HUD panel. The board is rendered as an SVG; the user marks their move by drawing on the panel and pressing Send; Claude reads the annotated PNG, identifies the cell, plays back, and re-renders. Use when the user asks to play tic-tac-toe, wants a demo of the QuickShow markup feedback loop, or asks for a quick game.
How this skill is triggered — by the user, by Claude, or both
Slash command
/quickshow:tic-tac-toeThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A fun, self-contained demo of the QuickShow markup feedback loop.
A fun, self-contained demo of the QuickShow markup feedback loop. The user plays X. Claude plays O. The board lives in a single HUD panel that updates in place after each move.
Decide who goes first. Default: the user is X and moves first. If they ask Claude to go first, swap roles and start with O on cell 5 (center) — strong opening.
Render the empty board:
show_svg(name: "ttt-board", content: <empty board SVG>, width: 600)
Arm markup events once:
enable_markup_events()
The response includes the Monitor command to start. Start it.
Wait. The first markup_sent event is the user's first move.
On every markup_sent:
get_markup(artifact_id) — fetch the annotated PNG.name: "ttt-board". The panel updates in place.markup_sent. Repeat.Cells are numbered 1–9 row-major:
1 | 2 | 3
---+---+---
4 | 5 | 6
---+---+---
7 | 8 | 9
Render the SVG so each empty cell shows its number faintly in the center (low-opacity gray) — that way the user knows where to draw, and you have a clear reference for cell identification when you read the markup back. Played cells show a crisp X or O instead of the number.
A 600×600 board with cells ~200×200. Adapt freely — the only constraint is that the cells are visually distinct so the cell- identification step is robust.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600">
<rect width="600" height="600" fill="#fafafa"/>
<!-- grid lines -->
<g stroke="#1a1a1a" stroke-width="6" stroke-linecap="round">
<line x1="200" y1="40" x2="200" y2="560"/>
<line x1="400" y1="40" x2="400" y2="560"/>
<line x1="40" y1="200" x2="560" y2="200"/>
<line x1="40" y1="400" x2="560" y2="400"/>
</g>
<!-- cell numbers (faded) — drop for played cells -->
<g font-family="-apple-system, Helvetica" font-size="28"
fill="#bbb" text-anchor="middle" dominant-baseline="middle">
<text x="100" y="100">1</text>
<text x="300" y="100">2</text>
<text x="500" y="100">3</text>
<text x="100" y="300">4</text>
<text x="300" y="300">5</text>
<text x="500" y="300">6</text>
<text x="100" y="500">7</text>
<text x="300" y="500">8</text>
<text x="500" y="500">9</text>
</g>
<!-- played moves: draw thick X (user) or O (Claude) over the cell
in place of its number -->
</svg>
For an X glyph, draw two diagonal strokes inside the cell box. For
an O, draw a circle centered in the cell. Use distinct colors
(e.g. user X in dark ink #1a1a1a; Claude O in a strong accent
like #d83a2c) — makes the board readable at a glance and easy to
talk about.
This is a fun demo, not a Minimax engine. A simple heuristic is plenty:
This makes Claude a competent opponent without making the game unwinnable — the user can still beat you with a fork. That's fine. The point is the loop, not the AI.
Searches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.
npx claudepluginhub zolat/quickshow --plugin quickshow