Agent skill

Screen Angel

by SimHacker in SimHacker/MicropolisCore

Read and act on a live desktop through its accessibility tree.

MITAuto-check passedFrontend & Design

Install Screen Angel

skills CLI
$ npx skills add SimHacker/MicropolisCore --skill screen-angel -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install SimHacker/MicropolisCore screen-angel --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/SimHacker/MicropolisCore.git skills-src && mkdir -p .claude/skills && cp -r skills-src/apps/screen-angel/skills/screen-angel .claude/skills/screen-angel && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
screen-angel
GitHub stars
208
Token cost
~6.2k tokens
SKILL.md length
2,787 words
Files
4
Skills in repo
3
Repo updated
First seen
Licence
MIT

At a glance

Read and act on a live desktop through its accessibility tree.

  • You need to see
  • SKILL.md covers The resolution pyramid, Quick start, The model and Selectors, plus 13 more sections
  • Calls jq
  • Point at what is actually on someones screen rather than guess

What it does

Screen Angel is an agent skill from SimHacker/MicropolisCore. Read and act on a live desktop through its accessibility tree. Query widgets with CSS-like selectors, outline them on the user's screen, capture parts of windows and controls as images, and watch focus change. Use when you need to see or point at what is actually on someone's screen rather than guess.

Its SKILL.md is about 6.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files (for example `CARD.yml`, `GLANCE.yml` and `README.md`).

It sits in Frontend & Design. The repository describes itself as: Micropolis C++ Core (based on the original SimCity Classic by Maxis/EA). The licence is MIT.

When your agent uses it

  • You need to see
  • Point at what is actually on someones screen rather than guess

Example prompts

  • “/screen-angel”

Requirements

  • Python 3
  • Pre-approved tools (allowed-tools): run_terminal_cmd, read_file

What it can do on your machine

Read from SKILL.md and the folder at commit 5e78c58. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • run_terminal_cmd
    • read_file

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • jq

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Screen Angel loads about 6.2k tokens when it runs. Until then it costs about 79 tokens; SKILL.md has 2,787 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~79
When it runs · the whole SKILL.md, loaded when a task matches
~6.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from SimHacker/MicropolisCore at commit 5e78c58, republished under its MIT licence (© SimHacker). 2,787 words, ~6,205 tokens.

Download SKILL.mdSave it as .claude/skills/screen-angel/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
screen-angel
description
Read and act on a live desktop through its accessibility tree. Query widgets with CSS-like selectors, outline them on the user's screen, capture parts of windows and controls as images, and watch focus change. Use when you need to see or point at what is actually on someone's screen rather than guess.
allowed-tools
run_terminal_cmd, read_file
permissions
read, terminal
related
sniffable-python, sister-script, yaml-jazz, postel, cursor-mirror, design-sense
moollm_compatible
true
respects
yaml-jazz, postel, sniffable-python, path
supports
play-learn-lift
composes_with
cursor-mirror, sister-script, design-sense
license
MIT
tags
accessibility, automation, desktop, mcp, cli, screen, ui, electron
credits
Don Hopkins — Screen Angel, and the pie-menu/SimCity lineage this grew out of, Richard Potter — Triggers, in Cypher (ed.), Watch What I Do: Programming by…
moollm.ecosystem
false

Screen Angel

Part of MOOLLM · This skill's directory

Read and act on a live desktop through the platform accessibility APIs. Ask what is on screen, match widgets with CSS-like selectors, outline them where the user can see, grab images of particular windows and controls, and watch focus change.

The 1990s desktop assistant had every part of this except the one that mattered. It could enumerate the widgets and could not tell what they were for. That part is you. This skill is the socket where a recognizer plugs into a desktop.


The resolution pyramid

Four files, same subject, increasing detail. Read down only as far as you need.

LevelFileAnswers
👁️ GlanceGLANCE.ymlIs this relevant, and what are the verbs?
📇 CardCARD.ymlWhat is the full interface, and how does it fail?
📜 Skillthis fileHow do I actually use it, and what will bite me?
📚 DeepREADME.mdWhy is it built this way, and what is the design argument?

Beyond the skill, in the app itself: PROTOCOL.yml is the wire format both implementations must agree on, and SCREEN-ANGEL.yml is the layer's own design document.

Nothing below requires MOOLLM. This file carries the whole protocol in its body. The CLI is standard-library Python. The only real dependency is a running Screen Angel.


Quick start

bash
cd apps/screen-angel

./cli/screen-angel info                 # can I see anything at all?
./cli/screen-angel windows              # what is open?
./cli/screen-angel query 'button'       # what buttons are in the focused app?
./cli/screen-angel show 'button'        # ...and outline them on the real screen
./cli/screen-angel say "I see 7 buttons"

No install, no virtualenv, no pip. If info reports a missing permission, stop and fix that first: every query will otherwise return empty rather than failing, which looks exactly like a broken selector.


The model

One Electron app binds the platform accessibility APIs — AXUIElement on macOS, UI Automation on Windows — and listens on a local socket. Everything else is a client.

   your agent  ──┐
   CLI         ──┼─→  local socket  ─→  Electron main  ─→  native addon  ─→  the OS
   MCP server  ──┘                            │
                                              └─→  transparent overlay window

Three properties of that shape matter to you:

Queries see the focused application only. There is no way to walk a background app's tree. That is a property of the platform APIs, not of this interface. Use windows to see what else exists, and ask the user to switch.

The overlay is ours, not the application's. Anything you highlight or say is drawn on a transparent window floating above everything. It is honest about being an addition. It never modifies the application underneath.

Nothing types or clicks. See What this cannot do. Do not tell a user you pressed something.


Selectors

A deliberate subset of CSS. If you know CSS you already know this, with two omissions that are the interesting part.

Combinators
SyntaxMeans
a bb at any depth below a
a > bb is a direct child of a
a, beither — the union of both

Union is worth reaching for more than it sounds. The question you usually have is not "where are the buttons" but "what can I interact with here", and that is several roles at once: button, checkbox, combobox, textfield, radiobutton. Each branch is matched independently, and the results come back deduplicated and in walk order, so a union reads exactly like a single-role query — an element two branches both match appears once.

Predicates
SyntaxMeans
[name=Save]equals
[name!=Save]not equals
[name*=Sav]contains
[name^=Sa]starts with
[name$=ve]ends with
[value]present and non-empty

Attributes: name, value, role. Values may be bare, 'single', or "double" quoted. Quote anything containing a space.

Pseudo-classes

:focused, :enabled, :disabled

What is deliberately missing

No sibling combinators (+, ~) and no :nth-child. Sibling order is not stable between releases of the application you are pointing at. A selector that depends on position is a selector that breaks on the day the app updates, silently, by matching the wrong thing rather than nothing. Match on what a widget is, not where it sits.

If you find yourself wanting :nth-child, the answer is usually a name or value predicate on the row itself, or query the container and read its children from the returned paths.

Examples
button                              every button
button[name=Save]                   exact name
button[name*=Sav]                   Save, Save As…, Saved
window > toolbar button             buttons directly inside a toolbar inside a window
textfield:focused                   the field with the caret
menuitem[name*=Export]              anything exporty in a menu
row text[value]                     non-empty text cells inside rows
checkbox:disabled                   greyed-out checkboxes

button, checkbox, combobox          anything clickable, in walk order
textfield, checkbox:focused         whichever of the two has the caret
dialog button, dialog checkbox      the controls of a dialog and nothing else

Roles

Platform roles are normalized into one lowercase vocabulary, so a selector written on a Mac has a chance on Windows. AXButton and UIA control type 50000 both arrive as button.

The full vocabulary is 41 names, taken from UI Automation's control types because that set already exists and is documented:

appbar     button      calendar   checkbox  combobox   custom     datagrid  dataitem
document   group       header     headeritem hyperlink image      list      listitem
menu       menubar     menuitem   pane      progressbar radiobutton scrollbar semanticzoom
separator  slider      spinner    splitbutton statusbar tab       tabitem   table
text       textfield   thumb      titlebar  toolbar    tooltip    tree      treeitem
window

Four of these are worth knowing before you guess:

You might writeIt is actuallyBecause
statictexttextAXStaticText → text
scrollareapaneAXScrollArea → pane
textareatextfieldAXTextArea and AXTextField both land here — UIA uses one edit control type for both, so keeping them apart would break cross-platform parity
linkhyperlinkUIA's name

macOS additions that have no UIA equivalent keep their own names, e.g. colorwell, ruler, rulermarker, radiogroup. When in doubt, run tree and read the roles that come back rather than guessing — nativeRole sits beside role on every element for exactly that reason.

UIA's localized control-type names are deliberately unused: they change with the display language, and a selector that only works in English is a selector that fails in Amsterdam.


Commands

Global flags work on either side of the subcommand: --json, --socket PATH, --timeout SEC.

Looking
CommandWhat
infoVersion, backend, permissions, modules, active bridge, Steam. Call first.
permissionsGrant state alone.
windowsEvery on-screen window: pid, app, title, bounds.
focusedThe one window a query will walk.
query <selector>Match a selector. --depth N, --nodes N, --limit N.
treeEverything up to budget. Start here on an unfamiliar app.
at <x> <y>The element under a screen coordinate. Cheap; no walk.
Showing
CommandWhat
show <selector>query, then outline the matches on the overlay.
highlight x,y,w,h ...Outline arbitrary rectangles. --clear to remove.
say <text>One line on the overlay. --ttl MS.
overlayToggle the overlay window.
Watching and serving
CommandWhat
watchBlock, printing focus changes and bridge attachments.
mcpRun the MCP stdio server.

Output is a human table on a terminal and JSON when piped, so screen-angel windows reads well and screen-angel windows | jq parses. --json forces it either way.

Exit codes: 0 success, 1 request failed, 3 no app listening. The third is separate because the fix is to launch the app, not to change the command.


Reading a query result

PATH      ROLE        NAME          VALUE        BOUNDS          
0.3.12    button      Save                       1204,88 64×24   f
0.3.14    button      Cancel                     1276,88 64×24   

2 matched · 524 visited · 250ms
  • path — walk-order handle, e.g. [0, 3, 12]. This is what other calls take.
  • visited / durationMs — what the walk cost. Not decoration: see budgets.
  • f flag — focused. d means disabled.
path is a handle, not an identity

path is valid until the tree changes. It is not an id. Do not store it and expect it to mean the same widget after the user scrolls, resizes, or opens a menu. Re-query instead. Containment is computed from path prefixes, which is why a > b needs no parent pointers and no tree reconstruction.


Budgets

Every accessibility attribute read is a synchronous round trip to another process. An unbounded walk of a browser window takes seconds and can make the target application appear to hang.

So walks are budgeted: maxDepth 12 and maxNodes 4000 by default.

2 matched · 3998 visited · 4120ms · TRUNCATED — budget ran out, raise --nodes or narrow the selector

truncated: true does not mean the application has no more widgets. It means the walk stopped. Treating a truncated empty result as "the button isn't there" is the single most likely wrong conclusion available here. Narrow the selector — a specific role prefix prunes enormous amounts of tree — or raise --nodes deliberately.


Images

A capture never returns pixels. It returns a descriptor: size, format, byte length, a sha256, and which transports this connection may use. You fetch the bytes in a second request, in the encoding you can actually use.

That indirection exists because the common question — "did a dialog appear", "is Save enabled" — is answered by the tree in a few hundred bytes. An interface that answered it with a 4K screenshot would charge every caller for pixels most of them did not want.

Grabbing part of the screen

One method, and every argument has a default that means "the whole thing, at a size a model can read".

jsonc
{"method": "capture.grab", "params": {"target": {"element": [0, 3, 12]}}}

Targets are handles you already hold from a JSON reply, never rectangles you had to compute: {element: path}, {selector: "..."}, {window: pid | "focused"}, {screen: n | "focused"}, or {rect: {...}} as an escape hatch.

region names a part of the target instead of measuring it: all (default), top, bottom, left, right, thirds, ninths (top-left … bottom-right), title-bar, status-bar. Resolved against current bounds at capture time, so it cannot go stale between the query and the grab the way a computed rectangle can.

size is fit (1024px longest edge, the default), full, or a number. 1024 is not a compromise: a 4K screenshot is more expensive and worse for recognition than a 1024px one. If you need detail, ask for a smaller region, not a bigger image.

pad is tight, snug (default, 8px), loose (48px), or a number. A control captured at exactly its bounds is often unrecognizable — a checkbox becomes a grey square and its label, the only thing saying what it does, is outside the crop.

marks draws numbered markers on matching elements and returns a legend:

jsonc
{"method": "capture.grab",
 "params": {"target": {"screen": "focused"}, "marks": "button"}}

You get an image with 1, 2, 3 drawn on the real widgets plus marks: [{n, path, role, name, bounds}]. Now "the third one" is unambiguous without a single coordinate crossing the wire. The markers are ours and vanish when cleared.

capture.batch takes several grabs and answers in one round trip. Six separate grabs cost six times the latency for no reason when you knew all six targets up front. A failed grab returns an error in its own slot rather than failing the batch.

Show full SKILL.md (1,240 more words)Show less
Format

format is selectable — png, jpeg, raw-bgra — and defaults to auto. Leave it alone. The two decisions that matter are which region and how big; format follows.

auto picks PNG for an element or window and JPEG for a screen, a region over ~1.5 megapixels, or a window with a game bridge attached. The descriptor reports formatReason, so a surprise explains itself.

The reason it matters: PNG is not just lossless on UI, it is usually smaller, because flat regions and repeated edges are what its filters are for — and JPEG is actively bad on text, with ringing around glyphs and chroma subsampling that smears coloured type. At 1024px a glyph is 8-10px tall, which is exactly where that stops being cosmetic. On game frames the arithmetic reverses completely: several megabytes as PNG against roughly 90-180 KB as JPEG, for a difference no recognizer can see.

quality applies to JPEG, defaults to 82, and should not go below 70. raw-bgra exists for a local consumer about to re-encode anyway and is offered only over the file transport — 1920×1080 raw is 8.3 MB, and if you are willing to compress it you have described PNG.

There is no separate compression layer. Gzipping a PNG spends CPU to save one percent of something already entropy-coded. The format is the compression.

Full reasoning, including why binary frames are counted rather than delimited: PROTOCOL.yml.

Capture is specified and not yet built. PROTOCOL.yml marks exactly which parts of the protocol are live; angel.info reports can.capture at runtime. Check it rather than assuming.


The protocol

You rarely need this directly — the CLI and the Python client cover it — but it is small enough to use from anything.

Socket. $SCREEN_ANGEL_SOCKET, else $XDG_RUNTIME_DIR/screen-angel-$UID.sock, else \\.\pipe\screen-angel-$USERNAME on Windows. A Unix socket rather than a localhost port, because a port is reachable by every process on the machine including a browser tab, and this is a service that reads the user's screen.

Wire. Newline-delimited JSON, so the whole thing is debuggable with nc.

jsonc
→ {"id": 1, "method": "query.select", "params": {"selector": "button[name=Save]"}}
← {"id": 1, "ok": true, "result": {"elements": [...], "visited": 524, "truncated": false}}
← {"id": 2, "ok": false, "error": {"message": "unexpected ']'", "code": "parse"}}
← {"event": "window-focus", "payload": {"pid": 6247, "app": "Cursor", "title": "…"}}

Events arrive unbidden and can land in the middle of waiting for a reply. Clients queue them and drain later; that is what lets watch and query share a connection.

Methods. angel.info, angel.permissions, query.select, query.tree, query.at, window.focused, window.list, overlay.highlight, overlay.say, overlay.toggle.

The read-only subset is a constant in the source, not a comment (READ_ONLY_METHODS in src/common/protocol.ts), because granting an agent permission to look is a different decision from granting it permission to change the screen, and those halves have to be grantable separately.


Python API

python
from screen_angel.client import open_angel

with open_angel() as angel:
    if not angel.info()["permissions"]["accessibility"] == "granted":
        raise SystemExit("grant accessibility first")

    result = angel.show('button[name*=Save]')      # find and outline in one call
    angel.say(f'{len(result["elements"])} save buttons')

    for event in angel.watch():                     # blocks
        print(event.name, event.payload)
ModuleRole
protocol.pyTransport, framing, socket location. Standard library only.
client.pyAngel — one method per verb. The module worth importing.
render.pyHuman tables and trees. The only module that formats.
cli.pyThin argparse wrapper. No logic.
mcp_server.pyMCP stdio server. Needs the mcp package; nothing else does.

Results are plain dicts, not dataclasses. When the app grows a field, a dict forwards it and a dataclass drops it, and a client that silently discards new information is worse than one that passes it through unread.

find_one(selector) returns the first match or None. show(selector) queries and outlines. Neither adds capability; both save a round trip of thinking.


Using it as an MCP server

Add to your MCP configuration:

json
{
  "mcpServers": {
    "screen-angel": {
      "command": "python3",
      "args": ["/absolute/path/to/apps/screen-angel/cli/screen-angel", "mcp"]
    }
  }
}

Tools: screen_angel_info, screen_angel_windows, screen_angel_query, screen_angel_tree, screen_angel_element_at.

Read-only by default. screen_angel_highlight, screen_angel_clear_highlights and screen_angel_say are registered only when SCREEN_ANGEL_MCP_ACT is set in the environment. An MCP server is configured once in a JSON file and then forgotten, and the thing that gets forgotten should be the safe one.

Tree results are trimmed to 60 elements before reaching a model, with a note saying so. A 4000-node dump is both unusable and expensive; narrowing the selector is the skill the selector language exists to reward.


Recipes

Find out where you are.

bash
./cli/screen-angel info && ./cli/screen-angel focused

Learn an unfamiliar application. Dump shallow first, then go deeper where it looks interesting. Depth 4 across a whole window is usually more informative than depth 12 down one branch.

bash
./cli/screen-angel tree --depth 4

Prove you found the right thing. Do this before telling the user anything about a widget. If the wrong four things light up, they will see it immediately, and so will you.

bash
./cli/screen-angel show 'button[name*=Export]'

Point at something in place, rather than describing it.

bash
./cli/screen-angel show 'checkbox[name*=Backup]'
./cli/screen-angel say "This is the one that is off"

Wait for the user to switch to the app you need.

bash
./cli/screen-angel watch --json | jq -r 'select(.payload.app == "Photoshop") | .payload.title'

Check a condition from a script, by exit code and count.

bash
if [ "$(./cli/screen-angel query 'button[name=Save]' --json | jq '.elements | length')" -gt 0 ]; then
  echo "there is a save button"
fi

What will bite you

Permissions, silently. Without accessibility permission, queries return empty rather than erroring. Always info first. On macOS the app must be listed in System Settings → Privacy & Security → Accessibility; requestPermissions prompts once, and after the first denial the user must go there by hand.

windows means the current Space, on macOS. On-screen excludes minimized windows and windows on other Spaces. A full-screen application lives on its own Space, so screen-angel windows from a terminal inside one may honestly report only that application's windows. It is not a filter and not a bug.

Empty titles are a permission symptom. macOS withholds window names until Screen Recording is granted. An untitled window in the list usually means that, not an untitled window.

Windows: elevated targets are unreadable, and permissions still say granted. An unelevated client cannot read an elevated application's tree at all. You get an empty tree and a cheerful permission state. If a UAC-elevated app looks empty, that is why.

Roots differ across platforms. query.tree roots at the whole application on macOS and at a top-level window on Windows, because UIA's root is the desktop. A selector starting window > ... behaves differently on the two. Prefer descendant matching near the root.

Electron and Java applications are often sparse. Chromium exposes its tree only when accessibility is switched on, so a query against another Electron app can legitimately return nothing while a native app in the same session returns hundreds of nodes.


What this cannot do

No input injection. Nothing here types, clicks, or moves the pointer. The native addons are capable of it and the protocol deliberately does not expose it, because consent for injection is a per-grant question and that machinery does not exist yet. A protocol that grows the capability before the consent ships it by accident. Do not tell a user you clicked something.

No background application trees. Focused window only.

No arbitrary overlay UI. say is text and an expiry: no markup, no buttons, no styling. Anything that could draw a convincing dialog on top of another application's window is a phishing kit, so it cannot.

No mascot. The overlay shows a word and a glyph. Clippy was rendered at the wrong altitude of abstraction — detailed enough to be unmistakably somebody else, in the room, watching. The layer should read as a property of the screen, not a character on it.


  • sniffable-python — the CLI follows its depth conventions, so # UPPERCASE section comments give a glance-level outline of each module.
  • sister-script — doc-first automation. This file and the CLI were written together; where they disagree, this file is the spec.
  • postel — selectors, coordinates and profile files are accepted liberally; JSON is emitted strictly.
  • cursor-mirror — introspects the agent's own session. Screen Angel watches the screen, cursor-mirror watches the watcher.
  • design-sense — the lenses behind the overlay decisions above, particularly the argument about altitude of abstraction.

Part of MOOLLM

This skill's directory (browse and fetch everything): apps/screen-angel/skills/screen-angel/

This skill ships with the application it drives, in MicropolisCore, because it has to version with the protocol. It follows MOOLLM conventions and works without MOOLLM.

MIT.

© SimHacker, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files in apps/screen-angel/skills/screen-angel of SimHacker/MicropolisCore.

  • SKILL.md
  • CARD.yml
  • GLANCE.yml
  • README.md

Open the folder on GitHubat commit 5e78c58

Compare with similar skills

Screen Angel next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Screen Angel compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Screen Angel this skillSimHacker/MicropolisCore208—~6.2kAutomated safety check: PassMIT
Web Artifacts Builderanthropics/skills180k41 repos~769Automated safety check: PassApache-2.0
React Doctormakeplane/plane61k12 repos~657Automated safety check: PassAGPL-3.0
Impeccablebestofjs/bestofjs3.1k27 repos~2.6kAutomated safety check: PassMIT
Figma Design System Builderwarpdotdev/warp65k2 repos~4.4kAutomated safety check: PassAGPL-3.0
Web Interface Guidelines Reviewervercel-labs/openreview1.7k98 repos~308Automated safety check: PassNone

Similar skills

  • Web Artifacts Builder

    anthropics/skills

    Official

    Builds multi-component claude.ai HTML artifacts as a small React, TypeScript and Tailwind project, then bundles it into one shareable HTML file.

    180k GitHub starsUsed in 41 repos~769 tokens
    Frontend & DesignAuto-check passed
  • React Doctor

    makeplane/plane

    Scans React code for lint, accessibility, bundle size and architecture issues, reports a health score and checks that changes do not lower it.

    61k GitHub starsUsed in 12 repos~657 tokens
    Frontend & DesignAuto-check passed
  • Impeccable

    bestofjs/bestofjs

    A skill your agent uses when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a…

    3.1k GitHub starsUsed in 27 repos~2.6k tokens
    Frontend & DesignAuto-check passed
  • Builds or updates a design system in Figma from a codebase in ordered phases: discovery, variables and tokens, components, theming and documentation, with checkpoints.

    65k GitHub starsUsed in 2 repos~4.4k tokens
    Frontend & DesignAuto-check passed
  • Web Interface Guidelines Reviewer

    vercel-labs/openreview

    Official

    Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my…

    1.7k GitHub starsUsed in 98 repos~308 tokens
    Frontend & DesignAuto-check passed
  • Tailwindcss Development

    anonaddy/anonaddy

    Always invoke when the user's message includes 'tailwind' in any form.

    4.9k GitHub starsUsed in 10 repos~865 tokens
    Frontend & DesignAuto-check passed

More from SimHacker/MicropolisCore

  • Micropolis Command Bus

    SimHacker/MicropolisCore

    Routes all Micropolis UI, CLI, MCP, chat, pie menu, and LLM actions through a safe command bus with preview/proposal/approval.

    208 GitHub stars~1.5k tokensUpdated today
    Auto-check passed
  • Micropolis

    SimHacker/MicropolisCore

    Parent MicropolisCore skill exposing the unified CLI, C++/WASM simulator, save-file tools, renderer/content workflows, command bus, and MOOLLM integration protocols.

    208 GitHub stars~5.2k tokensUpdated today
    Auto-check passed

Questions about Screen Angel

What does Screen Angel do?

Read and act on a live desktop through its accessibility tree. Screen Angel is an agent skill from SimHacker/MicropolisCore. Read and act on a live desktop through its accessibility tree.

When should I use Screen Angel?

Screen Angel fits situations like: you need to see; point at what is actually on someones screen rather than guess.

How do I install Screen Angel in Claude Code?

Run `npx skills add SimHacker/MicropolisCore --skill screen-angel -a claude-code`. Or copy the skill folder (apps/screen-angel/skills/screen-angel in SimHacker/MicropolisCore) into .claude/skills/screen-angel in your project. Claude Code loads it when a task matches its description.

How do I install Screen Angel in Codex?

Run `npx skills add SimHacker/MicropolisCore --skill screen-angel -a codex`. Or copy the skill folder (apps/screen-angel/skills/screen-angel in SimHacker/MicropolisCore) into .agents/skills/screen-angel in your project. Codex loads it when a task matches its description.

Can I use Screen Angel in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add SimHacker/MicropolisCore --skill screen-angel -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/screen-angel, .gemini/skills/screen-angel, .github/skills/screen-angel and .opencode/skills/screen-angel in your project.

What does Screen Angel need to run?

Going by SKILL.md and its folder, Screen Angel needs the command-line tools its instructions call (jq). Our summary lists: Python 3. Its frontmatter pre-approves these tools: run_terminal_cmd, read_file.

Does Screen Angel access the network?

SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.

Is Screen Angel safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Screen Angel use?

Screen Angel is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Screen Angel use?

About 6.2k tokens (SKILL.md is roughly 25k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Screen Angel?

Skills that share tags, products or a category with Screen Angel: Web Artifacts Builder (anthropics/skills, 180k stars), React Doctor (makeplane/plane, 61k stars), Impeccable (bestofjs/bestofjs, 3.1k stars) and Figma Design System Builder (warpdotdev/warp, 65k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Screen Angel?

SimHacker (a GitHub user) maintains it in SimHacker/MicropolisCore, which has 208 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 7, 2026.

Source: SimHacker/MicropolisCore on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.