see-ui
Skill20 starsChanged 16 days agoMITView on GitHub
Look at any web UI you build or change — render it headless with `botference see` and read the screenshots — because layout and design failures produce NO errors or warnings. Use after every UI change, before declaring done, and whenever a human says something "looks wrong".
In this repository12 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- grill-meSkill
- paper-reviewSkill
- plain-speechSkill
- review-docSkill
- tufte-vizSkill
- grill-meSkill
- paper-reviewSkill
- plain-speechSkill
- review-docSkill
- see-uiSkill
- tufte-vizSkill
The file
We split this skill into the rules it gives an agent
5 rules. About 0 are common, 2 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 25
Never hand-roll rendering via ImageMagick/qlmanage/rsvg to check a chart — their SVG engines have artifacts Chrome does not.
- Very specific: line 28
Default viewports: 390x844 (phone) and 1440x900 (desktop).
- Distinctive: line 45
After ANY change that affects rendered UI, screenshot both default viewports and look at them before reporting the change as done.
- Very specific: line 47
When a human reports something "looks wrong/bad/off", screenshot FIRST, at the viewport they used (phone screenshots → 390x844), and …
- Distinctive: line 51
If the app has a login form, your screenshot will show only the gate.
≈ “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
see-ui — look at the page before you say it's done
Layout and design failures are invisible to your normal loop: the DOM is valid, the CSS applied, the console silent — and the page is still broken to a human eye (a chart squashed into 5% of its width renders "successfully"). Code and logs cannot catch "technically correct but looks wrong". Pixels can, and you can read pixels.
The command
botference see <target> [label] [--viewport WxH]... [--basic-auth U:P] [--out DIR]<target>: a URL, a bare:port(localhost), a local file path (HTML, SVG — rendered via file://, no server needed: the way to verify charts, reports, and mockups you just wrote), or the NAME of a runningbotference service— its listening port is discovered from the live process, you never need to know it.- Never hand-roll rendering via ImageMagick/qlmanage/rsvg to check a
chart — their SVG engines have artifacts Chrome does not;
seeis the trustworthy lane and works from your sandbox. - Default viewports:
390x844(phone) and1440x900(desktop). Any width under 500 px is shot as an emulated phone screen of exactly that size: the page seesinnerWidth390, a device pixel ratio of 3, a mobile user agent and touch input, and the PNG is 390 by 844 pixels. (Before 2026-10-30 this was not true: headless Chrome will not make a window narrower than 500 px, so "phone" shots were a 500 px layout with the right edge cut off. Do not trust overflow findings from older phone shots.) A page with no<meta name="viewport">lays out 980 px wide and is zoomed out to fit, as on a real phone. Ifseeprints "NOT a real phone layout", the emulation failed and that shot is the old cut-off kind. - It prints
wrote: <path>.pnglines. Read those images. That is the entire point — do not run the command and skip looking. - Output defaults to
.botference/shots/(gitignored by convention).
Protocol
- After ANY change that affects rendered UI, screenshot both default viewports and look at them before reporting the change as done.
- When a human reports something "looks wrong/bad/off", screenshot
FIRST, at the viewport they used (phone screenshots →
390x844), and compare with what they see. Do not reason about CSS from source alone. - If the app has a login form, your screenshot will show only the
gate. Fix that properly: let bare-localhost requests through
unauthenticated (the review engine's rule — anyone on the loopback
port already owns the machine).
--basic-authhelps only for HTTP basic auth, not form gates. - Charts and figures: vision discovers a failure class once — then lock it out forever with a deterministic test on the generated SVG/scales, no browser needed. Assert data coverage (observed data spans ≥ ~half the x-range; projections must not compress history), containment (points inside the plot area, y-domain spans the data, no NaN coordinates), and legibility (labels don't collide, sane tick counts, markers above minimum visible size). Every visual chart fix ships with the invariant test that would have failed on the bad render.
Notes
- Engine: headless system Chrome — no Playwright, nothing to install.
A
--virtual-time-budgetis applied so client-drawn charts finish rendering before the shot. - Sandboxes are handled — run the command yourself. Your sandbox
cannot launch Chrome (seatbelt kills it);
botference seedetects that and hands the job to the see-broker service automatically, printing the samewrote:paths. Do not retry Chrome by hand and do not ask a human for pixels. If it reports "no see-broker service is alive", relay exactly this to the machine owner:botference service start see-broker -- botference see --serve - Emulation caveat: it is Chrome at phone size, not iOS Safari. If a bug reproduces on a real iPhone but not in your render, say so — that is the one case that justifies installing Playwright (for its WebKit engine), a decision for the human, not you.
botference service listshows what is running if you are unsure of a service name.
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.

