Control UI
openclaw/openclaw
Operate and troubleshoot the OpenClaw Control UI: navigate connected clients, organize sessions, build session dashboards, and handle direct or Tailscale-hosted Gateways.
Controllers, requests and routes of an Arandu (Go) application -- the seven resource actions, a resource nested under another, a singleton, a single-action (invokable) controller, a named action…
$ npx skills add arandu-io/arandu --skill arandu-http -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install arandu-io/arandu arandu-http --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/arandu-io/arandu.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/arandu-http .claude/skills/arandu-http && rm -rf skills-srcUse ~/.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/
Install the "arandu-http" agent skill from https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-http into .claude/skills/arandu-http/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "arandu-http", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-httpType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add arandu-io/arandu --skill arandu-http -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install arandu-io/arandu arandu-http --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/arandu-io/arandu.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/arandu-http .agents/skills/arandu-http && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "arandu-http" agent skill from https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-http into .agents/skills/arandu-http/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "arandu-http", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add arandu-io/arandu --skill arandu-http -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install arandu-io/arandu arandu-http --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/arandu-io/arandu.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/arandu-http .cursor/skills/arandu-http && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "arandu-http" agent skill from https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-http into .cursor/skills/arandu-http/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "arandu-http", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/arandu-io/arandu.git --path .agents/skills/arandu-http--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add arandu-io/arandu --skill arandu-http -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install arandu-io/arandu arandu-http --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/arandu-io/arandu.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/arandu-http .gemini/skills/arandu-http && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "arandu-http" agent skill from https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-http into .gemini/skills/arandu-http/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "arandu-http", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install arandu-io/arandu arandu-httpInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add arandu-io/arandu --skill arandu-http -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/arandu-io/arandu.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/arandu-http .github/skills/arandu-http && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "arandu-http" agent skill from https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-http into .github/skills/arandu-http/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "arandu-http", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add arandu-io/arandu --skill arandu-http -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install arandu-io/arandu arandu-http --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/arandu-io/arandu.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/arandu-http .opencode/skills/arandu-http && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "arandu-http" agent skill from https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-http into .opencode/skills/arandu-http/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "arandu-http", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
arandu-httpControllers, requests and routes of an Arandu (Go) application -- the seven resource actions, a resource nested under another, a singleton, a single-action (invokable) controller, a named action…
Arandu HTTP is an agent skill from arandu-io/arandu. Controllers, requests and routes of an Arandu (Go) application -- the seven resource actions, a resource nested under another, a singleton, a single-action (invokable) controller, a named action such as publish or approve, the request struct and its validation, route guards and route names. Use when the request is to "add a route", "add an endpoint", "add an action", "publish/approve/cancel a record", "nest X under Y", "validate this form", "who can reach this page", or when ctx.Bind, ctx.User, r.Resource…
Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The repository describes itself as: The Arandu project skeleton, which aru new clones. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit b8a4273. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gobashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Arandu HTTP loads about 2.5k tokens when it runs. Until then it costs about 176 tokens; SKILL.md has 975 words of instructions outside code blocks.
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.
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.
The full file from arandu-io/arandu at commit b8a4273, republished under its MIT licence (© arandu-io). 975 words, ~2,547 tokens.
.claude/skills/arandu-http/SKILL.md (or your agent's skills folder).Anything between the router and the service: which address answers, behind
which guard, which controller method takes it, and how the input becomes a
request struct. What the answer looks like is arandu-view for a page and
arandu-api for a program; what the service does is arandu-module.
routes/web.go -- its custom block is the whole table of what this
application answers -- and app/Http/Controllers/NoteController.go.| piece | contract |
|---|---|
| action | func (c *X) Name(ctx *hhttp.Context) error, with hhttp "github.com/arandu-io/hesape/http" |
| resource controller | the seven actions, each asserted: var _ fhttp.Indexer = (*X)(nil) and Creator, Storer, Shower, Editor, Updater, Destroyer, with fhttp "github.com/arandu-io/framework/http"; Resource registers only what is implemented |
| invokable controller | Invoke(ctx *hhttp.Context) error, asserted with var _ fhttp.Invoker = (*X)(nil) |
| request | app/Http/Requests/<Entity>Request.go: fields with form:"..." tags, func (r X) Validate() validation.Errors, var _ validation.Validatable = X{} |
| who is asking | who, _ := ctx.User(), put there by the route's guard |
| input | ctx.Bind(&in), which reads only the tagged fields; a conversion error comes back as validation.Errors |
| path | ctx.Param("id") on a flat resource's member; ctx.Param("note") and ctx.Param("comment") under a nested one |
| an address | ctx.URL("notes.show", id) and ctx.RedirectRoute("notes.show", id), by route name |
| an error | returned; the router answers validation.Errors with a redirect back to the form (a 422 problem document to a JSON client), a missing row 404, a refusal 403, a duplicate key 409, and an error with HTTPStatus() int that status |
The routes, in the custom block of routes/web.go:
| shape | registration | addresses and names |
|---|---|---|
| resource | r.Resource("notes", d.Note) | /notes, /notes/{id}; notes.index ... notes.destroy |
| nested, shallow | r.Resource("notes.comments", d.Comment) | index, create, store under /notes/{note}/comments; show, edit, update, destroy at /comments/{comment}; notes.comments.* |
| named action | r.ResourceAction("POST", "notes", "publish", d.Note.Publish) | POST /notes/{id}/publish, notes.publish |
| singleton | r.Singleton("settings", d.Settings) | show, edit, update at /settings, no id |
| invokable | r.Invokable("POST", "/reports", d.RunReport).Name("reports") | one address |
| one action | r.Action("GET", "/dashboard", d.Home.Index, guard).Name("dashboard") | one address |
A guard goes on the group or the route -- r.Group("", middleware.RequireAuth(d.Sessions))
-- with middleware "github.com/arandu-io/framework/http/middleware", never at
the top of an action.
Pick the shape. CRUD on a record is a resource. A record reached through another is nested, and the parent in the path is where the person navigated -- the service loads it through the Grant. A verb on one record is a named action of its resource. One thing with no id per account is a singleton. One operation that is not a record's is an invokable controller.
Generate it. aru make:module writes the resource controller with the
module; one controller alone is aru make:controller Note --resource,
--parent=notes, --singleton or --invokable, and --action=publish
adds a named action. Each prints the route lines.
Write the action thin: read who is asking, bind the input, call the
service, answer. NoteController.Publish is the whole shape of a named
action:
func (c *NoteController) Publish(ctx *hhttp.Context) error {
who, _ := ctx.User()
published, err := c.svc.Publish(ctx.Ctx(), who, ctx.Param("id"))
if err != nil {
return err
}
return ctx.RedirectRoute("notes.show", published.ID)
}Write the request's rules in Validate, and leave calling it to the
service, so a job and a command that call the same service pass the same
validation.
Register the route in the custom block, behind its guard, and give it a name if the generator did not.
aru make:controller <Name> --resource, --singleton, --invokable, with --parent=<resource> and --action=<name>aru make:request <Name> --fields "title:string!,body:text"aru make:middleware <Name>aru route:list, the table the router builtaru make:controller --force rewrites the file and keeps only its custom block:
on a controller finished by hand, as NoteController is, run it in a scratch
copy and move the new method into the custom block.
A single-action controller and the routes of every shape, as they compile against this project:
package example
import (
fhttp "github.com/arandu-io/framework/http"
"github.com/arandu-io/framework/http/middleware"
"github.com/arandu-io/framework/security"
hhttp "github.com/arandu-io/hesape/http"
controllers "<module>/app/Http/Controllers"
services "<module>/app/Services"
)
// PublishNote is one operation with one address: an invokable controller.
type PublishNote struct {
notes *services.NoteService
}
// NewPublishNote takes the service it calls, built in bootstrap/app.go.
func NewPublishNote(notes *services.NoteService) *PublishNote {
return &PublishNote{notes: notes}
}
var _ fhttp.Invoker = (*PublishNote)(nil)
// Invoke publishes the note the form names in its path.
func (c *PublishNote) Invoke(ctx *hhttp.Context) error {
who, _ := ctx.User()
published, err := c.notes.Publish(ctx.Ctx(), who, ctx.Param("id"))
if err != nil {
return err
}
return ctx.RedirectRoute("notes.show", published.ID)
}
// Routes registers each shape behind the sign-in guard.
func Routes(r *fhttp.Router, sessions *security.SessionStore, note *controllers.NoteController,
comment *controllers.CommentController, publish *PublishNote) {
signedIn := r.Group("", middleware.RequireAuth(sessions))
signedIn.Resource("notes", note)
signedIn.ResourceAction("POST", "notes", "publish", note.Publish)
signedIn.Resource("notes.comments", comment)
signedIn.Invokable("POST", "/notes/{id}/publish-now", publish).Name("notes.publish-now")
}input-read-by-hand. ctx.Bind into the request is the one conversion.Validate() in the controller: validate-called-by-controller.invalid-form-answered-by-hand, redirect-to-literal-path.app/Http/Controllers/Auth:
session-loaded-in-controller. ctx.User() is who is asking.handler-reaches-the-model, controller-reaches-repository.operation-chosen-by-form-field), put a
state change behind GET, or grow a controller past twelve actions
(controller-too-many-actions): a verb is a named action or its own
controller.Actions beyond the seven go in the controller's custom block, and their route
lines in the custom block of routes/web.go. Rules a request needs beyond the
generated ones -- a range, a format, a field that depends on another -- go in
the custom block of Validate.
routes/web.go: the controller's field on Deps, and the route lines in the
custom block, behind a guard.bootstrap/app.go: the constructor in the routes.Deps literal, with the
service built once and shared -- the example builds notes once and hands it
to both controllers that need it.bootstrap/app.go and
put on the route or the group that needs it.A feature test through the router, signed in with tests.SignedIn:
Location it redirects to;HX-Redirect to htmx,
422 problem document to JSON;tests/Feature/Notes_test.go and tests/Feature/Comments_test.go hold each.
ctx.View(name, ...) and route names are strings: a typo compiles, and is found
by aru doctor (view-does-not-exist) and by the tests, not by the compiler.
The router answers the errors it knows; a domain error it should answer with
another status carries HTTPStatus() int rather than being mapped in the
action.
Run them all, in this order, as AGENTS.md lists them:
export GOWORK=off
aru model:build --check
aru view:build
gofmt -l $(find . -name '*.go' -not -path '*/testdata/*' -not -name '*.kyse.go')
go vet ./...
bash tests/test-layout-guard.sh
go test -race ./...
go build ./...
aru doctor<!-- arandu:begin custom -->
<!-- arandu:end custom -->
© arandu-io, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/arandu-http of arandu-io/arandu.
Open the folder on GitHubat commit b8a4273
Arandu HTTP 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Arandu HTTP this skillarandu-io/arandu | 281 | — | ~2.5k | Automated safety check: Pass | MIT | |
| Control UIopenclaw/openclaw | 392k | — | ~1.8k | Automated safety check: Pass | MIT | |
| OmniRoute Routing CLIdiegosouzapw/OmniRoute | 75k | — | ~342 | Automated safety check: Pass | MIT | |
| OmniRoute Combo Routingdiegosouzapw/OmniRoute | 75k | — | ~2.1k | Automated safety check: Pass | MIT | |
| Intelligence Routeruvnet/ruflo | 74k | — | ~874 | Automated safety check: Notes | MIT | |
| Control UI Solidopenclaw/openclaw | 392k | — | ~3.9k | Automated safety check: Pass | MIT |
openclaw/openclaw
Operate and troubleshoot the OpenClaw Control UI: navigate connected clients, organize sessions, build session dashboards, and handle direct or Tailscale-hosted Gateways.
diegosouzapw/OmniRoute
Creates, switches, and inspects OmniRoute model-routing combos, plus a suggestion command with cost and latency constraints.
diegosouzapw/OmniRoute
Manages OmniRoute routing combos through its REST API: create and update combos, choose from 19 strategies, set fallback chains, test outcomes and read metrics.
ruvnet/ruflo
Route tasks via the 3-tier model selector and learned patterns; emits a routing rationale via hooksexplain
openclaw/openclaw
Port or review OpenClaw Control UI code moving from Lit 3 and Web Awesome to Solid 2, including components, projections, lifecycle boundaries, and migration proof.
openclaw/openclaw
A skill your agent uses when designing, testing, fixing, or extending the OpenClaw Control UI GUI, including UI stress-test galleries with feedback inputs, Vitest + Playwright end-to-end checks…
arandu-io/arandu
Answering a program rather than a person in an Arandu (Go) application -- a JSON Resource, a JSON answer from the same routes the pages use, problem+json errors, bearer-token authentication and…
arandu-io/arandu
Work that does not happen inside the request in an Arandu (Go) application -- background jobs and the worker, scheduled tasks, domain events through the outbox, listeners, notifications, mail and…
arandu-io/arandu
Decides whether a feature belongs in the application or in one of five shared Arandu modules before adding permissions, wallets, tags, Markdown rendering or API docs.
arandu-io/arandu
Start here for any change to an Arandu (Go) application that adds or changes behaviour -- "add invoices", "let users publish a post", "send a weekly report", "call the payment provider", "expose…
arandu-io/arandu
Reaching other systems from an Arandu (Go) application, and letting them reach it -- the client of an external API with its interface and fake, webhooks sent and received, and tools, resources and…
arandu-io/arandu
Adds a new entity, resource or CRUD module to an Arandu Go application by writing a YAML specification instead of hand-writing the Go code.
Controllers, requests and routes of an Arandu (Go) application -- the seven resource actions, a resource nested under another, a singleton, a single-action (invokable) controller, a named action…. Arandu HTTP is an agent skill from arandu-io/arandu. Controllers, requests and routes of an Arandu (Go) application -- the seven resource actions, a resource nested under another, a singleton, a single-action (invokable) controller, a named action such as publish or approve, the request struct and its validation, route guards and route names.
Arandu HTTP fits situations like: the request is to add a route; add an endpoint; publish/approve/cancel a record; validate this form.
Run `npx skills add arandu-io/arandu --skill arandu-http -a claude-code`. Or copy the skill folder (.agents/skills/arandu-http in arandu-io/arandu) into .claude/skills/arandu-http in your project. Claude Code loads it when a task matches its description.
Run `npx skills add arandu-io/arandu --skill arandu-http -a codex`. Or copy the skill folder (.agents/skills/arandu-http in arandu-io/arandu) into .agents/skills/arandu-http in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add arandu-io/arandu --skill arandu-http -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/arandu-http, .gemini/skills/arandu-http, .github/skills/arandu-http and .opencode/skills/arandu-http in your project.
Going by SKILL.md and its folder, Arandu HTTP needs the command-line tools its instructions call (go and bash).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
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.
Arandu HTTP is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.5k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Arandu HTTP: Control UI (openclaw/openclaw, 392k stars), OmniRoute Routing CLI (diegosouzapw/OmniRoute, 75k stars), OmniRoute Combo Routing (diegosouzapw/OmniRoute, 75k stars) and Intelligence Route (ruvnet/ruflo, 74k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
arandu-io (a GitHub organization) maintains it in arandu-io/arandu, which has 281 GitHub stars. The repository holds 12 skills in this directory. The repository was last updated on October 10, 2026.
Source: arandu-io/arandu on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.