Build with Claude Code
The fenn-plugin skill teaches Claude Code how Fenn plugins work: the exact plugin.toml rules, every message and component with its required fields, the icon names, and the mistakes that leave a tile blank. It comes with a checker that runs your plugin the way Fenn does and reports anything Fenn would skip.
Install it
Unzip it into your personal skills folder, so Claude Code can use it in every project:
Expand-Archive "$HOME\Downloads\fenn-plugin-skill.zip" "$HOME\.claude\skills" -ForceOr put it in your plugin's repository at .claude\skills\fenn-plugin\ and commit it, so everyone who works on the plugin gets it. From a Fenn checkout you can copy it instead:
Copy-Item -Recurse skills\fenn-plugin "$HOME\.claude\skills\" -ForceRestart Claude Code (or start a new session) to pick it up.
Use it
Just describe the tile you want. Claude Code uses the skill on its own when you talk about a Fenn plugin, a tile for the notch or plugin.toml, and you can also call it by name with /fenn-plugin.
Make a Fenn plugin that shows my unread GitHub notifications on a wide tile,
with the list on the page and a pulse in the pill when new ones arrive.My Fenn tile just shows the puzzle icon and the name. Here's the folder: C:\code\fenn-weatherClaude will pick live or poll mode and a tile size, copy the Python or Node helper if it fits, write the code around a single draw() function, run the checker, and fix what it finds. Then turn on Plugin dev mode in Fenn's Settings: the new folder loads within a second, and every save restarts the plugin.
The checker
You can run the checker yourself too (Python 3.8 or later, nothing to install):
python "$HOME\.claude\skills\fenn-plugin\scripts\check_plugin.py" C:\code\my-plugins\weather --event refresh:click --event city:submit:ParisIt validates plugin.toml, finds the program in run like Fenn does, starts it with Fenn's environment, sends hello, layout, your events, page_open and shutdown, and checks every line it prints. Poll plugins are run once, then once per event with FENN_EVENT set. Your plugin's real data is never touched: it gets a temporary FENN_DATA_DIR.
| It reports | For example |
|---|---|
| Errors (Fenn would skip it) | an unknown key in plugin.toml, a bad id, a program not on PATH, a debug print on stdout, a button without id, a number where text must be a string, a live plugin that exits |
| Warnings (it works, but looks wrong) | an unknown icon or color, a typo in a field name, duplicate control ids, an input crammed onto a small tile, a redraw loop, data saved in the plugin folder |
skills/fenn-plugin/ in the Fenn repository.