New Example
go-gui-org/go-gui
Scaffold a new go-gui example app with standard boilerplate. An agent skill from go-gui-org/go-gui.
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.
$ npx skills add arandu-io/arandu --skill arandu-module -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install arandu-io/arandu arandu-module --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-module .claude/skills/arandu-module && 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-module" agent skill from https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-module into .claude/skills/arandu-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "arandu-module", 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-moduleType 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-module -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install arandu-io/arandu arandu-module --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-module .agents/skills/arandu-module && 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-module" agent skill from https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-module into .agents/skills/arandu-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "arandu-module", 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-module -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install arandu-io/arandu arandu-module --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-module .cursor/skills/arandu-module && 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-module" agent skill from https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-module into .cursor/skills/arandu-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "arandu-module", 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-module--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-module -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install arandu-io/arandu arandu-module --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-module .gemini/skills/arandu-module && 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-module" agent skill from https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-module into .gemini/skills/arandu-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "arandu-module", 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-moduleInstalls 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-module -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-module .github/skills/arandu-module && 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-module" agent skill from https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-module into .github/skills/arandu-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "arandu-module", 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-module -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-module --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-module .opencode/skills/arandu-module && 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-module" agent skill from https://github.com/arandu-io/arandu/tree/main/.agents/skills/arandu-module into .opencode/skills/arandu-module/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "arandu-module", 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-moduleAdds a new entity, resource or CRUD module to an Arandu Go application by writing a YAML specification instead of hand-writing the Go code.
In Arandu, a model never writes the entity, policy, service or migration by hand; it writes one YAML specification, and a deterministic generator produces the Go for the entity and its table, a typed query helper, the policy, service, request, controller, migration, screens and tests, printing the route lines and wiring for a person to paste in rather than writing them itself. The stated reasoning is that a new framework can't be in any model's training data, so asking a model for Go directly tends to borrow patterns from frameworks Arandu doesn't use.
The procedure is to read the schema, generated from the validator's own constants so it can't drift from what the generator accepts, write the specification as one YAML file with six top-level properties, check it to see every validation problem at once, then generate for real; the specification is saved beside the generated code. A bundled example module called notes shows the shape to copy, including an ownership rule in the policy's custom block and feature tests proving a cross-tenant read returns 404 and another member's edit returns 403.
6 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 Module Generator loads about 2.4k tokens when it runs. Until then it costs about 169 tokens; SKILL.md has 1,003 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). 1,003 words, ~2,429 tokens.
.claude/skills/arandu-module/SKILL.md (or your agent's skills folder).A new kind of record, a column, a transition of a record's state, a query the
generated builder says, a factory or a seeder, or the service method that
reads and writes them. Who may run the method is arandu-policy; what calls
the service over HTTP is arandu-http.
app/Models/Note.go, and its service,
app/Services/NoteService.go. app/Models/Comment.go is the same shape
generated under a parent.arandu-ecosystem first: a balance, a
role, a tag or rendered Markdown already has an owner and gets no table here.| piece | where | contract |
|---|---|---|
| entity | app/Models/<Entity>.go | a struct embedding model.Model (github.com/arandu-io/hesape/database/model) with db: tags, and var <entity>Table = model.NewTable(model.TableSpec{...}) beside it |
| query | app/Models/<Entity>Query.go | generated by aru model:build: models.<Entities>(db), *<Entity>Query, <Entity>Collection. Every terminal -- Get, First, FindOrFail, SimplePaginate, Count, Exists -- takes an auth.Grant |
| write | the entity | Save(ctx, g) and Delete(ctx, g) on a row that came from a query or from models.<Entities>(db).New() |
| rule of the entity | the custom block of <Entity>.go | a method that changes only this row's fields; no database, network, clock or Grant |
| scope | the custom block of <Entity>.go | a method on *<Entity>Query |
| relation | an init in <Entity>.go | <entity>Table.Relate(name, func(*model.Model) model.Relation) |
| migration | database/migrations/<id>.go | registers itself in init; Up and Down over schema.Blueprint |
| factory, seeder | database/factories, database/seeders | factories.<Entities>(db).Count(n).Create(ctx, g); a seeder runs twice safely |
| service | app/Services/<Entity>Service.go | New<Entity>Service(db *database.DB); methods `(ctx, actor auth.Subject, in requests.X |
aru make:module note --fields "title:string!,body:text,pinned:bool" --tenant writes the migration, the
entity and its query, the factory, the policy, the request, the service, the
controller, the four screens and the tests, and prints the wiring. Under a
parent, add --parent=notes: the service then loads the parent through the
parent's own service and filters by the row it loaded, which is how
CommentService reads a note.aru schema prints the schema,
aru generate invoice.yaml --check reports every problem at once, and
aru generate invoice.yaml writes the tree and keeps the specification in
database/specs/.aru make:migration add_published_at_to_notes --table=notes --fields "published_at:timestamp". A column added to a table that has rows is
nullable or has a default, because the previous binary is still inserting
during a rollout.HTTPStatus() int, as
Note.Publish does with ErrNoteAlreadyPublished (409).arandu-policy), apply the entity's
rule, save with the Grant, and store the events of the write in the same
transaction (arandu-async). NoteService.Publish is that order, in full.aru model:build after any change to an entity, and never edit what
it writes.aru make:module <name> --fields "..." --tenant [--parent=<resource>] [--force] [--dry-run]aru generate <spec.yaml> --check, aru generate <spec.yaml>, aru schemaaru make:model <Name> --fields "..." [--tenant] [--migration] [--factory] [--seed] [--policy] [--requests] [--controller] [--all]aru make:migration <name> --create=<table> or --table=<table>, with --fieldsaru make:service <Name>, aru make:factory <Name>, aru make:seeder <Name>, aru make:enum <Name> --values draft,sentaru model:build, and aru model:build --check in a pipelinearu migrate, aru migrate:rollback, aru migrate:status, aru migrate:fresh (development only), aru db:seedThe column types are a closed set -- string text int decimal money
bool date timestamp uuid email -- and so are a specification's actions:
view create update delete list. money is an integer of cents.
A read through the generated query and a write through the entity's rule, the two halves of every service method:
package example
import (
"context"
"time"
"github.com/arandu-io/hesape/auth"
"github.com/arandu-io/hesape/database"
models "<module>/app/Models"
policies "<module>/app/Policies"
)
// PinnedDrafts reads the tenant's pinned drafts, newest first, one page at a
// time: the generated query, finished by a terminal that takes the Grant.
func PinnedDrafts(ctx context.Context, db *database.DB, g auth.Grant) (models.NoteCollection, error) {
if err := g.Check(policies.NoteList); err != nil {
return nil, err
}
return models.Notes(db).Where("pinned", true).WhereNull("published_at").
Latest().Limit(25).Get(ctx, g)
}
// PublishAt applies the entity's transition and saves the row with the Grant
// the policy issued for it.
func PublishAt(ctx context.Context, g auth.Grant, note *models.Note, at time.Time) error {
if err := note.Publish(at); err != nil {
return err
}
_, err := note.Save(ctx, g)
return err
}model.NewTable, a
*model.Builder, what Base() returns -- outside app/Models. It answers
untyped rows and is a second way to reach the table; aru doctor reports it
as model-core-outside-models.aru doctor reports it as model-rule-touches-io.Save returns model.ErrUnwired; set the fields.<Entity>Query.go or a factory outside its custom block: the next
aru model:build writes over it, and aru doctor reports a stale one as
model-query-stale.app/Services, or grow a service past what one
aggregate needs: service-subpackage and service-file-too-large.Between // arandu:begin custom and // arandu:end custom: table settings
inside the TableSpec (Hidden, PerPage, SoftDeletes, Scopes, Events),
rules, scopes and relations at the end of the entity's file, named states in a
factory, use cases beyond CRUD at the end of a service. --force rewrites
everything outside the blocks; the example's files were finished by hand
outside them and are changed by hand.
aru make:module prints three lines and the claim:
// routes/web.go, the field on Deps
Note *controllers.NoteController
// bootstrap/app.go, in the routes.Deps literal
Note: controllers.NewNoteController(services.NewNoteService(db)),The route is in arandu-http. A migration needs nothing: the blank import of
database/migrations in bootstrap/app.go links every one. A seeder goes in
the registry of database/seeders/seeders.go.
tests/Feature/<Entity>TenantScope_test.go, which --tenant generates, and
the claim of the table in tests/Feature/TenantScope_test.go, written after
reading every query of it.TestANoteOfAnotherTenantIsNotFound.TestANoteIsPublishedOnceAtTheTimeItIsGiven does.The generator knows columns, not meaning: it writes no author, no ownership
rule and no transition. A table with no tenant column -- a pivot keyed by two
ids -- is invisible to the tenant test, and its isolation rests on the Grant of
every query that reads it. The query builder covers what one aggregate needs; a
report or a join belongs in a repository (app/Repositories) with its own
policy, never in a second query path.
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-module of arandu-io/arandu.
Open the folder on GitHubat commit b8a4273
Arandu Module Generator 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 Module Generator this skillarandu-io/arandu | 281 | — | ~2.4k | Automated safety check: Pass | MIT | |
| New Examplego-gui-org/go-gui | 128 | — | ~377 | Automated safety check: Pass | MIT | |
| Autospec Worktree Setupariel-frischer/autospec | 144 | — | ~1.5k | Automated safety check: Notes | MIT | |
| Init Projectmicrobus-io/fabric | 172 | — | ~664 | Automated safety check: Pass | Apache-2.0 | |
| Nx Generatenomcopter/react-mosaic | 4.8k | 7 repos | ~1.9k | Automated safety check: Pass | Custom licence | |
| PonytailDavidObando/gsharp | 565 | 7 repos | ~1.7k | Automated safety check: Pass | MIT |
go-gui-org/go-gui
Scaffold a new go-gui example app with standard boilerplate. An agent skill from go-gui-org/go-gui.
ariel-frischer/autospec
Generate project-specific worktree setup script based on project analysis.
microbus-io/fabric
TRIGGER when user asks to initialize, set up, or bootstrap a Microbus project.
nomcopter/react-mosaic
Generate code using nx generators. An agent skill from nomcopter/react-mosaic.
DavidObando/gsharp
Forces the laziest solution that actually works, simplest, shortest, most minimal.
redis/go-redis
Walks through adding a new Redis or Redis module command to the go-redis client, from fetching the spec and docs to the type, interface wiring, parsing and tests.
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
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-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…
Works with
Categories
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. In Arandu, a model never writes the entity, policy, service or migration by hand; it writes one YAML specification, and a deterministic generator produces the Go for the entity and its table, a typed query helper, the policy, service, request, controller, migration, screens and tests, printing the route lines and wiring for a person to paste in rather than writing them itself. The stated reasoning is that a new framework can't be in any model's training data, so asking a model for Go directly tends to borrow patterns from frameworks Arandu doesn't use.
Arandu Module Generator fits situations like: adding a new database-backed resource to an Arandu application; scaffolding CRUD for a new domain object with access rules; checking a module specification before generating its code.
Run `npx skills add arandu-io/arandu --skill arandu-module -a claude-code`. Or copy the skill folder (.agents/skills/arandu-module in arandu-io/arandu) into .claude/skills/arandu-module in your project. Claude Code loads it when a task matches its description.
Run `npx skills add arandu-io/arandu --skill arandu-module -a codex`. Or copy the skill folder (.agents/skills/arandu-module in arandu-io/arandu) into .agents/skills/arandu-module 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-module -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-module, .gemini/skills/arandu-module, .github/skills/arandu-module and .opencode/skills/arandu-module in your project.
Going by SKILL.md and its folder, Arandu Module Generator needs the command-line tools its instructions call (go and bash). Our summary lists: The `aru` CLI.
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 Module Generator 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.4k tokens (SKILL.md is roughly 9.7k 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 Module Generator: New Example (go-gui-org/go-gui, 128 stars), Autospec Worktree Setup (ariel-frischer/autospec, 144 stars), Init Project (microbus-io/fabric, 172 stars) and Nx Generate (nomcopter/react-mosaic, 4.8k 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.