herdr-mods
Skill2.1k starsChanged 2 days agoApache-2.0View on GitHub
Write Herdr UI mods: small sandboxed Luau extensions that add a status bar item, a sidebar section, a section of the right-hand mod panel, palette commands, or an app with its own activity bar icon to Herdr UI without changing its code, reloaded live when saved. Use it inside Herdr (HERDR_ENV=1) when the user asks to extend, customize, or add to Herdr UI's own interface: show a count, a list, a meter, or a button in the status bar, the sidebar, or a panel beside the terminals (like opencode's sidebar), add a palette command, add an activity bar app such as a dashboard of agents or workspaces, or write a mod, plugin, extension, or widget for Herdr UI. It covers the folder layout, the element tree, checking a mod with herdr-gpui mod check, and reading its errors and logs.
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 0 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
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 17
Ask only what you cannot infer: what it shows, where (status_bar, sidebar, panel beside the terminals, or its own app in the activity bar), …
- Very specific: line 23
Run herdr-gpui mod check DIR and fix every error it names, until it says the mod is valid.
- Very specific: line 25
Run herdr-gpui mod to see that the app loaded it and drew it, with no error.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 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
<!-- herdr-gpui-managed-skill v1: Herdr UI keeps this file up to date. Edit a copy under another name to keep your changes. -->Herdr UI mods
A mod is a folder of sandboxed Luau that Herdr UI runs and draws. Its view
returns a tree of plain tables (ui.row, ui.badge, ui.button, ...) that
the app draws in the user's theme. Mods cannot touch files, the network, or
processes; they read the app's state, keep their own, and run the app's own
commands when the user clicks. Saving a file reloads the mod.
How to make one
- Ask only what you cannot infer: what it shows, where (
status_bar,sidebar,panelbeside the terminals, or its own app in the activity bar), and what a click does. - Create
~/.config/herdr/gpui-mods/NAME/($XDG_CONFIG_HOME/herdr/gpui-modswhen that is set;%APPDATA%\herdr\gpui-modson Windows) withmod.tomlandmain.luau. The folder name must equalname. - Run
herdr-gpui mod check DIRand fix every error it names, until it says the mod is valid. It runs the mod once without the app. - Run
herdr-gpui modto see that the app loaded it and drew it, with no error. For an app,herdr-gpui mod open NAMEshows it. Edits reload within a second;herdr-gpui mod reload NAMEforces it.herdr-gpui mod logs NAMEshows whatherdr.logwrote. - Tell the user where it appears. A mod is turned off with
herdr-gpui config set mods.disabled '["NAME"]'.
A mod
mod.toml:
name = "agents-waiting" # lowercase letters, digits, hyphens
api = 1
places = ["status_bar"] # "status_bar", "sidebar"
commands = [{ id = "names", title = "Show waiting agents' names" }]main.luau:
local ui = require("@herdr/ui")
return herdr.mod({
watch = { "agents" },
init = function() return { names = false } end,
update = function(state, msg)
if msg == "toggle" or msg == "command:names" then
state.names = not state.names
end
return state
end,
view = function(state, app)
local blocked = app.agents.blocked
local row = ui.row({ gap = "small", align = "center" })
table.insert(row, ui.badge({ text = #blocked .. " waiting", tone = "attention" }))
if state.names then
local names = {}
for _, agent in blocked do table.insert(names, agent.name) end
table.insert(row, ui.text({ text = table.concat(names, ", "), truncate = true }))
end
table.insert(row, ui.button({ label = "Names", msg = "toggle" }))
return row
end,
})A mod panel section uses places = ["panel"] and an optional [panel]
table with title and order (sections are ordered by it, then by name).
Its view may return nil to show no section; watch focus to describe the
focused workspace. herdr-gpui mod panel show shows the panel.
An activity bar app adds this to mod.toml, with icon.svg beside it (a
24x24 stroke icon drawn with currentColor, which the bar tints); its
view fills the window's body under the title:
[activity]
title = "Dashboard"
icon = "icon.svg"Reference
init()returns the state (a table by default).update(state, msg)gets each message and returns the new state (nil keeps it), and optionally a list of effects:herdr.run("COMMAND")runs an app command, as the palette would (herdr-gpui commandslists them; it runs only after a click or palette pick, never from a timer), andherdr.timer(seconds, msg)sendsmsgonce after 1 to 86400 seconds.view(state, app)returns the tree, ornilto draw nothing. It runs when a watched topic changes orupdateran.- A palette command declared in
mod.tomlsendscommand:ID. - A message is nil, a boolean, a number, a string, or a table of those; never a function.
herdr.log(...)writes toherdr-gpui mod logs NAME;herdr.now()is Unix seconds.require("./parts")loadsparts.luaufrom the same folder.
app holds only the topics in watch, read-only:
| Topic | Value |
hosts | { id, name, connected } list |
workspaces | { id, host, name, focused, tabs = { { id, name, focused } } } list |
agents | { all, idle, working, blocked, done }, each a list of { id, host, workspace, name, status } |
focus | { host, workspace, tab, name, path } of the focused workspace |
| Element | Keys |
row, column | gap (none, small, normal, large), align (stretch, start, center, end), children in the list part |
list | children, divided by lines |
text | text, tone, size (small, normal, large), weight (normal, bold), truncate |
badge | text, tone |
button | label and/or name (an app icon); command (an app command) or msg; tone, disabled |
icon | name (an app icon such as terminal, chevron-right), tone |
toggle | label, on, msg |
progress, meter | value from 0 to 1 (progress may omit it), label (meter), tone |
link | label, url (https:// only) |
tooltip | text, one child |
spacer, divider | none |
Tones: normal, muted, accent, success, warning, danger,
attention (the color of an agent waiting on the user). A bare string in a
container is text, and ui.text("x") works too.
What mods cannot do
- No
os,io,print,load, files, network, processes, orrequirebeyond@herdr/uiand the mod's own.luaufiles. - Unknown elements and keys are errors, reported with their place in the
tree, such as
view: column[2].button: unknown keyfollowed by the key. - Each call gets 2 million instruction checks and 16 MiB; a view has at most 200 elements, nested 16 deep. A mod past a limit fails that call and keeps its last drawing.
- A broken save keeps the last working version drawn;
herdr-gpui modshows the error. Check the mod again after every change.
Trending
More talk lately.about the whole repository
Who's talking about penso/herdr-gpui
- kclejeune/system“build(deps): bump the dev group with 6 updates”GitHub · Oct 30, 2026
- herdrdev/herdr-app“macOS: add a setting to send Option as Alt (Option+P types π instead of Alt+P)”GitHub · Oct 29, 2026
- kclejeune/system“build(deps): bump the dev group across 1 directory with 5 updates”GitHub · Oct 29, 2026
- kclejeune/system“build(deps): bump the dev group across 1 directory with 4 updates”GitHub · Oct 27, 2026
- kclejeune/system“build(deps): bump the dev group across 1 directory with 3 updates”GitHub · Oct 26, 2026
The biggest 5 of 20 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 20
Talked about on GitHub (20 times).
On GitHub · 20
- Oct 30, 2026build(deps): bump the dev group with 6 updates — kclejeune/system0 reactions
- Oct 29, 2026macOS: add a setting to send Option as Alt (Option+P types π instead of Alt+P) — herdrdev/herdr-app0 reactions · 1 comment
- Oct 29, 2026build(deps): bump the dev group across 1 directory with 5 updates — kclejeune/system0 reactions
- Oct 27, 2026build(deps): bump the dev group across 1 directory with 4 updates — kclejeune/system0 reactions · 1 comment
- Oct 26, 2026build(deps): bump the dev group across 1 directory with 3 updates — kclejeune/system0 reactions · 1 comment
15 more on GitHub
- Oct 26, 2026build(deps): bump the dev group across 1 directory with 4 updates — kclejeune/system0 reactions · 1 comment
- Oct 24, 2026build(deps): bump the dev group across 1 directory with 6 updates — kclejeune/system0 reactions
- Oct 22, 2026build(deps): bump the dev group across 1 directory with 5 updates — kclejeune/system0 reactions · 1 comment
- Oct 22, 2026build(deps): bump the dev group with 4 updates — kclejeune/system0 reactions · 1 comment
- Oct 21, 2026build(deps): bump the dev group with 5 updates — kclejeune/system0 reactions
- Oct 19, 2026feat: add native Omo integration — herdrdev/herdr0 reactions · 2 comments
- Oct 16, 2026build(deps): bump the dev group across 1 directory with 7 updates — kclejeune/system0 reactions
- Oct 15, 2026Give external clients independent navigation and terminal-size ownership — usecornercase/cornercase-terminal0 reactions
- Oct 15, 2026Stream terminal cells and split geometry to external clients — usecornercase/cornercase-terminal0 reactions
- Oct 15, 2026Expose a versioned contract for external clients — usecornercase/cornercase-terminal0 reactions
- Oct 15, 2026build(deps): bump the dev group across 1 directory with 5 updates — kclejeune/system0 reactions · 1 comment
- Oct 9, 2026build(deps): bump the dev group across 1 directory with 12 updates — kclejeune/system0 reactions · 1 comment
- Oct 9, 2026build(deps): bump herdr-gpui from `068c317` to `cf9161b` — kclejeune/system0 reactions · 1 comment
- Oct 6, 2026feat: pin each host's header above the spaces list while its workspaces scroll — frogggias/herdr-gpui0 reactions
- Oct 6, 2026fix: sort agents by priority across hosts, as Herdr's terminal client does — frogggias/herdr-gpui0 reactions
In this repository6 other files it gives its agents.
- AGENTS.mdAGENTS.md
- site/llms.txtllms.txt
- gpui-mockupSkill
- releaseSkill
- herdr-automationsSkill
- herdr-gpui-browserSkill
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.

