mobile-prototype
Skill2 starsChanged 48 days agoMITView on GitHub
Turn a product spec, architecture and design docs into a rough, hand-drawn draw.io prototype of a native Android or iOS app — numbered screens, their states and the arrows between them — so the flow can be agreed before anything is designed or built. Use when the user wants to prototype, sketch, wireframe, mock up or map the screens or user flow of a mobile app or feature, or turn a PRD, spec, user stories, UX notes or architecture docs into screens and a flow, even if they never say "prototype" or "draw.io". Also resumes a prototype folder that has notes/STATE.md. Does not write Compose, SwiftUI or other app code.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- Xinvtech/mobile-design-ostheir own version, first seen Aug 7, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- Xinvtech/mobile-design-os★ 3same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
Show its rules and text
We split this skill into the rules it gives an agent
20 rules. About 0 are common, 5 are distinctive, and 15 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈5
Distinctive · estimate
This author's own choices. Worth a look.
15
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 31
Numbered and untangled: Every screen frame carries a serial number (S1, S2, … in flow order), and people refer to screens by it everywhere.
- Distinctive: line 48
draw.io tooling helps; it never blocks: If the draw.io MCP tools aren't loaded, say so in one line and carry on: the scripts write and open …
- Very specific: line 85
update docs/prototypes/README.md — *Where we are*, *Read now*, and each new file marked
- Very specific: line 90
Read references/stops-and-reading-guide.md at the first stop: it has what the user reads at each stop and the exact form of the guide.
- Very specific: line 95
Look for an existing prototype folder: docs/prototypes/notes/STATE.md, the older default prototype/notes/STATE.md, or a notes/STATE.md next …
- Very specific: line 102
Run node scripts/check-update.mjs.
- Very specific: line 106
Check whether the draw.io MCP tools are available in this session: a tool whose name ends in open_drawio_xml (for example …
- Very specific: line 108
If they are missing, run node scripts/check-drawio-mcp.mjs --host <this agent> and show the result.
- Very specific: line 116
If the user named files, use those.
- Very specific: line 134
Read every confirmed document in full (images too — look at them).
- Very specific: line 152
Write every item to notes/CLARIFICATIONS.md.
- Distinctive: line 161
Sketch style (P6): ask in one line under the table — it is the user's preference, not something the documents answer: wireflow (the whole …
- Very specific: line 166
Stop here (gate A): Don't write flow.json or draw anything yet, even as a draft: the flow depends on the scope the user is about to approve …
- Distinctive: line 171
Ask the C and D questions, most blocking first, at most four per round.
- Very specific: line 188
every app screen once in appScreens, with its one name.
- Distinctive: line 199
Use realistic copy from the documents, not lorem ipsum.
- Very specific: line 210
Changes: treat feedback as new clarifications — record, change flow.json, regenerate, show again.
- Distinctive: line 215
After the approval, offer the design phase in one line (design system and final-look screens, or go straight to the handoff).
- Very specific: line 220
Read references/design-phase.md and follow it.
- Very specific: line 226
Run node scripts/handoff.mjs: it creates docs/prototypes/HANDOFF.md and fills its screen inventory, transitions and pages from flow.json.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Mobile Prototype
Work out what the screens are and how they connect before anyone designs or builds them, working like a UX designer would. The prototype is a rough draw.io sketch on purpose: it keeps the discussion on features, states and branches, not on colours and spacing.
documents → proposals (gate A) → open questions (gate B) → draw.io sketch, flow locked (gate C)
→ optional: design system + final-look screens (gates D1, D2) → handoffPaths in this file are relative to this skill's directory (scripts/…, references/…,
assets/…). The user's project is the current working directory.
Non-negotiables
- Documents propose, the user decides. An answer found in a document is a proposal until the user approves it. Record who decided what.
- Ask only what changes the experience. Conflicts between documents and unknowns that change a journey, a state or navigation get asked. Cosmetic choices you decide yourself and record.
- The flow lives in one file.
docs/prototypes/flow.jsonis the source of truth; the draw.io file, the handoff's screen inventory and the final-look screens are generated from it by scripts. Never hand-write draw.io XML or HTML, and never place shapes or route arrows yourself. - Rough on purpose. The sketch uses plain boxes in a hand-drawn style. No brand colours, no real components, no pixel decisions before the flow is locked.
- Numbered and untangled. Every screen frame carries a serial number (S1, S2, … in flow
order), and people refer to screens by it everywhere. Review markup (numbers, remarks) stays
outside the phone frame or in the frame's
note.sketch.mjsrefuses to draw crossing or shared arrows, arrows over screens, overlapping screens or labels in the way: never show a sketch that didn't pass--check, and fix a failure inflow.json(see "When the check fails" inreferences/sketch-spec.md), not in the diagram. - Stop at every gate, and say what to read. At each stop, end your turn: don't start the next phase ahead of the approval. Follow Stops below.
- Stop at a locked flow. Deliver the sketch and a handoff package. Do not build a clickable app, and do not generate Compose, SwiftUI, Kotlin, Swift or production web code.
- Each platform behaves like itself. The sketch is one flow for every platform in scope
(P5); where Android and iOS differ (back, dialogs versus sheets, permission rules) say so in
the frame's
note. Followreferences/platforms/<platform>/conventions.md. - Everything lands in files in one prototype folder inside the project, chosen by the user before the first file is written, so a fresh session can resume.
- First how it works, then how it looks. The design phase is optional, starts only after the flow is locked (gate C) and only when the user chooses it, and never blocks the handoff.
- draw.io tooling helps; it never blocks. If the draw.io MCP tools aren't loaded, say so in one line and carry on: the scripts write and open the diagram without them.
Workspace (in the user's project)
This document calls the prototype folder docs/prototypes/ (the recommended location); wherever
you read that path, use the folder the user chose in Phase 1. It must be inside the project: if
the user names a path outside it (another repository, the home folder, /tmp), say the files
have to stay in this project so they travel with it, and ask again. scaffold.mjs refuses such
a path too.
docs/prototypes/
├── README.md ← the reading guide for the user
├── flow.json ← journeys, screen states, transitions (you edit this)
├── flow.drawio ← the sketch, generated from flow.json
├── HANDOFF.md ← final deliverable for the native team
├── look/ ← design phase only: generated final-look screens
└── notes/
├── STATE.md ← phase, gates passed, next step (resume point)
├── INPUTS.md ← document inventory + fact register with citations
├── CLARIFICATIONS.md ← every question: source, proposal, status, decision
├── DECISIONS.md ← approved decisions and recorded assumptions
└── DESIGN.md ← the visual direction (design phase only) + THEME-REPORT.mdnode scripts/scaffold.mjs --out <folder> --name "<App>" creates README.md, flow.json and
the four notes from templates, and never overwrites. Fill in what it creates; don't invent other
files. The other scripts find the folder by its notes/STATE.md, so they need no --out unless
the project holds more than one prototype folder.
Stops
The work pauses for the user only at these stops: Inputs (Phase 1), gate A (Phase 2), gate B (each Phase 3 round), gate C (Phase 4), D1 / D2 (Phase 5) and the handoff (Phase 6). At every stop from gate A on, before ending your turn:
- update
docs/prototypes/README.md— Where we are, Read now, and each new file marked you, reference or agent; - record the stop in
STATE.mdunder Waiting on user; - end the message with the short reading guide.
Read references/stops-and-reading-guide.md at the first stop: it has what the user reads at
each stop and the exact form of the guide. Everything the user must decide goes in the message.
Phase 0 — Setup and resume
- Look for an existing prototype folder:
docs/prototypes/notes/STATE.md, the older defaultprototype/notes/STATE.md, or anotes/STATE.mdnext to aflow.jsonelsewhere in the project. If there is one, that is the prototype folder: don't ask for it again. ReadSTATE.mdand every file innotes/, tell the user in two lines where things stand, and continue from the recorded next step; if that stop still waits on the user, repeat what it needs. Aflow.jsonwithoutappScreenspredates screen names: migrate it before drawing again (Migrating an older flow.json inreferences/sketch-spec.md). - Run
node scripts/check-update.mjs. If it reports a newer release, pass on its one line and update command, and carry on with the installed version; don't update unless the user asks. A prototype whoseSTATE.mdrecords an older skill version may need migrating (CHANGELOG.mdin the skill's repository says what changed). - Check whether the draw.io MCP tools are available in this session: a tool whose name ends
in
open_drawio_xml(for examplemcp__drawio__open_drawio_xml). - If they are missing, run
node scripts/check-drawio-mcp.mjs --host <this agent>and show the result. Ask before changing the user's configuration, then run--configure --host <this agent>(without--hostit configures every agent installed). A new server loads only after a restart: say so, record it inSTATE.md, and carry on. Details:references/drawio-setup.md.
Phase 1 — Discover the inputs
- If the user named files, use those. Otherwise run
node scripts/discover-inputs.mjs --root .to find specs, architecture, design, API contracts and images, plus platform signals with a suggestion. This step only reads; nothing is created yet. Ask where the prototype files should go (the Inputs stop), unless the user already named a folder or Phase 0 found one:
Where should I put the prototype files? I recommend
docs/prototypes(created if it doesn't exist). Reply "ok" for that, or give another folder in this project.In the same message show the availability table — Spec / Architecture / Design / API / Other, plus the platform suggestion — with the files found for each. Ask the user to confirm the target platform (don't assume both), which documents are authoritative, which to ignore, and whether anything is missing (a design folder, a Figma link). Leave the table out when the user named the files and there is nothing to ask about them. End your turn.
- "ok", "yes" or no preference means
docs/prototypes. A relative path is relative to the project root; an absolute one must be inside the project (see Workspace). Then runnode scripts/scaffold.mjs --out <folder> --name "<App>"and record the folder innotes/STATE.md. - Read every confirmed document in full (images too — look at them). Record the inventory and a
fact register (ID, fact, source file § section) in
notes/INPUTS.md. - Adjust for what is missing (
references/document-intake.md). Without a spec, get at least a written feature description from the user before going on.
Phase 2 — Answer from the documents → approval gate A
Work through references/question-bank.md. For each question in scope, try to answer it from the
fact register and classify it (full rules in references/clarification-protocol.md):
| Class | Meaning | What happens |
| A — Documented | a document states it | propose it, with a citation |
| B — Inferred | follows from documents but isn't stated | propose it as an assumption, with reasoning |
| C — Conflict | documents disagree | must ask |
| D — Open, blocking | unknown and changes a journey, state or navigation | must ask |
| E — Open, cosmetic | unknown, low impact | pick a sensible default, record it |
Write every item to notes/CLARIFICATIONS.md. Then present A and B items to the user as one
compact table (question · proposed answer · source · confidence) and ask them to approve all,
or correct by ID. Only approved items move to DECISIONS.md. Mention the E defaults in one line
so the user can object. If there are C/D items, say how many questions will follow at gate B.
Two things are always settled here or in Phase 3, and recorded in STATE.md:
- Target platforms (P5): Android, iOS or both. Propose it from the platform signals with citations; if there are none, or they disagree, ask. Never assume both.
- Sketch style (P6): ask in one line under the table — it is the user's preference, not
something the documents answer: wireflow (the whole flow on one page per journey),
click-through (a map, then one page per screen with clickable buttons) or both. With
no preference, use the wireflow; the same
flow.jsonproduces all three.
Stop here (gate A). Don't write flow.json or draw anything yet, even as a draft: the flow
depends on the scope the user is about to approve or correct.
Phase 3 — Close the gaps with the user → gate B
Ask the C and D questions, most blocking first, at most four per round. Each question gives
the evidence from the documents, two to four concrete options, and your recommended option first
with a one-line reason. Use the host's structured-question tool when there is one (for example
AskUserQuestion in Claude Code); otherwise ask as a numbered list in chat.
Record each answer immediately. Answers can raise new questions — classify and queue them the same way. If the user says "you decide" or defers, record your choice as an assumption flagged for review. Gate B passes when no blocking (C/D) item is open. After three rounds, offer to proceed with the remaining items as flagged assumptions rather than keep asking.
Each round is a stop. Once gates A and B have both passed (B passes at once when there are no C/D items), go straight on to Phase 4.
Phase 4 — Sketch the flow → gate C
Write the flow in
docs/prototypes/flow.json(format and element list:references/sketch-spec.md):- every app screen once in
appScreens, with its one name. A frame gives itsscreen, itsstateand, where it matters, itsentrycondition ("First launch"); it has no title of its own, so a state or an entry condition never becomes a second name for a screen; - one journey per user goal in scope;
- one frame per screen state the decisions require — the content state, and also empty, loading, error, offline, permission denied, validation error, and each dialog or sheet. Main path first, in the order the user meets the screens; a branch (a dialog, an error) names the screen it hangs under;
- one flow per transition, labelled with what the user does ("tap Save", "Back with changes"), starting from the control that triggers it.
Use realistic copy from the documents, not lorem ipsum.
- every app screen once in
- Generate and check:
node scripts/sketch.mjs --style <wireflow|click-through|both>writesdocs/prototypes/flow.drawio;node scripts/sketch.mjs --checkmust pass. Then go throughreferences/sketch-review.md. Fixflow.jsonand generate again; don't show a sketch with warnings you haven't looked at. - Show it:
node scripts/sketch.mjs --style <style> --open. Give the userflow.drawioas a link and how to open it and find its pages, assketch.mjsprints it (VS Code with the draw.io extension, draw.io Desktop or app.diagrams.net; not an Android Studio plugin). - Stop (gate C). In chat, give a short text outline of the journey (S-numbers and the arrows), the decisions you made on the user's behalf and the flagged assumptions, and ask them to lock the flow or say what to change.
- Changes: treat feedback as new clarifications — record, change
flow.json, regenerate, show again. If the user editedflow.drawioby hand, the script refuses to overwrite it: read their version (it is XML), carry every change intoflow.json(ask if one is unclear), then runsketch.mjs --force(it keeps their version asflow.drawio.bak). Gate C passes only on an explicit approval; record it inSTATE.mdandDECISIONS.md. - After the approval, offer the design phase in one line (design system and final-look screens, or go straight to the handoff). Don't push it.
Phase 5 — Optional design phase (only if the user chooses it)
Read references/design-phase.md and follow it. The locked flow.json is the input; the user
picks a direction from style tiles (gate D1) and approves the final-look screens (gate D2). The
design phase changes how screens look, never the flow. If it is skipped or stopped, go to Phase 6.
Phase 6 — Handoff and stop
Run node scripts/handoff.mjs: it creates docs/prototypes/HANDOFF.md and fills its screen
inventory, transitions and pages from flow.json. Write the other sections following
references/handoff-package.md; node scripts/handoff.mjs --check must pass. Update STATE.md
to complete, and README.md so Read now is HANDOFF.md alone. Tell the user where
everything is and stop — native implementation is a separate task.
When guidance conflicts
- The user's explicit decisions (in
DECISIONS.md). - The supplied documents — the spec decides what the product does; the architecture decides what is feasible. Conflicts between them are class C and go to the user.
- The platform conventions (
references/platforms/<platform>/conventions.md). - The approved visual direction (
DESIGN.md), for the look only; it never changes the flow or overrides the platform conventions. - Your own taste.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

