app-creator
Skill42 starsChanged 7 days agoMITView on GitHub
Builds a hosted mini-app (index.html + app.json + a generated SVG icon) in your workspace and installs it to public/apps/{slug}/ via the app_install tool — delegates the build to the ACP coding harness (pi/claude/codex via runtime=acp) by default, falling back to a direct build only when no harness is available. The app then appears on the JClaw Apps page.
In this repository29 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- bento-slidesSkill
- brochure-designerSkill
- business-card-readerSkill
- claude-designerSkill
- codebase-to-courseSkill
- daily-briefingSkill
- diagram-designSkill
- fable-modeSkill
- ffmpeg-video-processingSkill
- frontend-designSkill
- gamma-presenterSkill
- gitSkill
- hotel-finderSkill
- humanizerSkill
- in-depth-researchSkill
- jclaw-apiSkill
- jira-operationsSkill
- powerpoint-pptxSkill
- research-paper-writer-proSkill
- restaurant-recommenderSkill
- skill-creatorSkill
- ui-ux-pro-maxSkill
- visual-explainerSkill
- whatsapp-wacli-linuxSkill
- whatsapp-wacli-macSkill
- writing-standardsSkill
- youtube-transcriptSkill
The file
We split this skill into the rules it gives an agent
5 rules. About 0 are common, 2 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
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
- Distinctive: line 36
Default to self-contained static unless the requirements clearly demand Nuxt — a smaller, buildless bundle is easier to host and can't trip …
- Very specific: line 65
Write <slug>/app.json in your workspace (it travels into public/apps/<slug>/ on install):
- Very specific: line 92
Never try to write public/apps/ with your filesystem or exec tools — it is outside your workspace and will be rejected.
- Distinctive: line 100
When the operator asks to update an existing app — the Apps page's per-card update affordance sends a request naming the app, its slug, and …
- Very specific: line 110
Static only: Never wire the app into a JClaw route or the JClaw DB.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 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
App Creator
Build a small, self-contained web app and install it as a JClaw hosted app — a static site served at /apps/<slug>/ that shows up on the Apps page — or update one that's already there. Use this when the operator asks to "create an app", "build an app", or describes a mini-tool they want hosted (e.g. an RFP/proposal builder, a calculator, a form), or asks to "update" / change an existing app (see Updating an existing app below).
How hosting works — build in your workspace, then install
Your filesystem tools are confined to your workspace — you cannot write public/apps/ directly (a direct write there fails with "escapes the workspace"). So the flow is always two steps:
- Build the app inside your workspace, in a directory named for the slug:
<slug>/index.html,<slug>/app.json, and a generated<slug>/icon.svg. - Install it with the
app_installtool, which copies your workspace<slug>/intopublic/apps/<slug>/(running as trusted JClaw code) so the Apps page serves it.
A hosted app is a static bundle: no server, no database. It may use client-side storage (localStorage/IndexedDB) or call an external API, but it must not depend on a JClaw backend.
1. Clarify + name
Pin down what the app does (its pages, the core action) and a display name. Derive <slug> = the name lowercased, spaces → hyphens, non-alphanumerics stripped (e.g. "Proposal Generator" → proposal-generator); it must match ^[a-z0-9][a-z0-9-]*$. Confirm it if ambiguous. Capture: name, creator (default the operator), version (default 1.0.0), an optional price/plan label (metadata only), and an optional designated agent id (JCLAW-763 — the one agent the app may invoke; passed by the Create/Update form). An icon.svg is generated by default from the app's description (see §2/§3) — no operator input needed.
2. Build the app (in your workspace)
Pick the app shape first
- Self-contained static — the default. A single
index.htmlwith inline<style>+<script>and client-side storage (localStorage/IndexedDB), written to<slug>/index.htmlin your workspace (plus an optionalicon.svg). Use it for single-page tools: forms, calculators, generators, dashboards over local data — the large majority of hosted mini-apps. No build step, no framework runtime, and no/_nuxt/asset paths to break, so it's the most robust way to host a small app. - Nuxt 4 static build — only when genuinely warranted. Reach for Nuxt when the app really needs it: multiple routes, shared reactive state, or a component-heavy UI. Scaffold a Nuxt 4 app (Vue 3 + TypeScript + Tailwind v4 to match the JClaw frontend) in a workspace build dir, set
ssr: false+app.baseURL: '/apps/<slug>/',nuxi generate, then place.output/public/*into your workspace<slug>/.
Default to self-contained static unless the requirements clearly demand Nuxt — a smaller, buildless bundle is easier to host and can't trip the baseURL asset trap.
Build posture — harness first, always. The ACP coding harness (runtime=acp) is the default builder, not a preference: whenever a harness is available you MUST delegate the whole build to it. Building it yourself with your own exec/filesystem tools is a fallback used only when a runtime=acp spawn reports that no harness is configured — never build directly while a harness is available. (Either app shape.) Either way, the app is built into your workspace <slug>/, never into public/apps/.
Default — delegate to the ACP coding harness (runtime=acp)
A coding harness (pi -p, claude -p, codex, …) is a far stronger multi-file coder than inline tool calls. Hand it the whole build with the subagent_spawn tool using runtime: "acp" and a fully self-contained task — the harness sees only the task string (not this skill), so spell out the exact files and the exact manifest. For a self-contained static app:
Build a self-contained static web app for:
<the operator's requirements>. A singleindex.htmlwith inline<style>and<script>— no framework, no build step, no external CDN/font/image requests (embed assets). Persist data client-side (localStorage) — there is no backend. Create a<slug>/directory in your current working directory and write exactly these three files into it, and nothing else:<slug>/index.html,<slug>/app.json, and<slug>/icon.svg.<slug>/icon.svgis a small square app icon you design from the app's purpose — a single clear glyph or shape relevant to what the app does, on a solid or subtle-gradient background, with aviewBox(e.g.0 0 64 64). Keep it simple and self-contained (no external references).<slug>/app.jsonmust be EXACTLY this object — these keys only, and no others (do NOT addslug,entry, or any extra key):{"name": "<Display Name>", "version": "1.0.0", "creator": "<creator>", "description": "<one-sentence summary>", "icon": "icon.svg", "price": "", "agent": <id>}Leave
priceas""for a free app. Setagentto the designated agent id when one is given, otherwise omit theagentkey entirely.
For the Nuxt shape, instead instruct: build a Nuxt 4 app with ssr: false and app: { baseURL: '/apps/<slug>/' } (trailing slash required — without it the assets break), run nuxi generate, and place .output/public/* into the <slug>/ directory.
Where the harness writes — and how to install it. A runtime=acp harness runs in its OWN per-session directory under coding/<name>/ in your workspace (JCLAW-666), not your workspace root — so it writes the app to coding/<name>/<slug>/. You don't need to track that: after the harness finishes, just call app_install action: "validate" then action: "install" with slug: "<slug>". It auto-locates the built app — the workspace-root <slug>/ (direct build) or the newest coding/<session>/<slug>/ (harness build) — and copies it to public/apps/<slug>/. (The install result echoes the source it used.)
runtime=acp runs the operator-configured harness (subagent.acp.command). Only if a runtime=acp spawn reports that no harness is configured do you fall through to the direct path below — and do NOT ask the operator to configure one unless they want the harness.
Fallback — build it yourself (ONLY when no harness is available)
Reach this path only after a runtime=acp spawn reported no harness — otherwise you must delegate (see the posture above). Build directly with your exec + filesystem tools, writing into your workspace <slug>/. Self-contained static: author <slug>/index.html (inline CSS/JS, client-side storage) and <slug>/icon.svg (a simple app icon derived from the description — same guidance as the harness task above). Nuxt shape: scaffold a lean Nuxt 4 app in a workspace build dir, set ssr: false + app.baseURL: '/apps/<slug>/', npx nuxi generate, place .output/public/* into <slug>/, plus an icon.svg. Either way, write the manifest with "icon": "icon.svg", then install (section 4).
3. The app.json manifest
Write <slug>/app.json in your workspace (it travels into public/apps/<slug>/ on install):
{
"name": "Proposal Generator",
"version": "1.0.0",
"creator": "<operator>",
"icon": "icon.svg",
"price": "$9/mo",
"description": "Create RFPs and proposals.",
"agent": 3
}iconis a path relative to the app dir. Generate anicon.svgby default — a simple square SVG icon derived from the app's description (a relevant glyph/shape on a solid or subtle-gradient background) — and set"icon": "icon.svg". Only omit it (and drop the file) if the operator explicitly wants no icon; then the Apps page shows its default tile.priceis a display label only — no payments or access control. Omit for free apps.name,version,creatorare shown on the card.nameandversionare required — install refuses a manifest missing either.agent(JCLAW-763) is the designated agent id the app is allowed to invoke — the numeric id fromGET /api/agents. Set it to exactly the id the operator's request names (the Create/Update App form passes it as "Designated agent id … :<id>"). Omit the field when the request names no agent (or says to remove it) — the app is then non-invoking. Never invent an id.- Use exactly these keys —
name,version,creator,description, and the optionalicon/price/agent. Do NOT add non-standard keys (slug,entry, …); the Apps page reads only these.
4. Install
With the app built in your workspace <slug>/, publish it with the app_install tool:
- (Optional but recommended)
app_installwithaction: "validate",slug: "<slug>"— confirms<slug>/is well-formed (parseableapp.jsonwith name + version,index.htmlpresent). Fix any reported issues before installing. app_installwithaction: "install",slug: "<slug>"— copies your workspace<slug>/topublic/apps/<slug>/, replacing any existing app at that slug, and returns the/apps/<slug>/url. (sourcedefaults to<slug>; pass it only if you built under a different workspace dir.)
Never try to write public/apps/ with your filesystem or exec tools — it is outside your workspace and will be rejected. app_install is the only path in.
5. Confirm
Tell the operator it's installed: it now appears on the Apps page and launches in a new tab at /apps/<slug>/. (The Apps page enumerates public/apps/*/ via GET /api/apps.)
Updating an existing app
When the operator asks to update an existing app — the Apps page's per-card update affordance sends a request naming the app, its slug, and the current version — edit it in place and bump its version; do NOT create a new app:
- Stage it into your workspace. Call
app_installwithaction: "stage",slug: "<slug>"— it copiespublic/apps/<slug>/into your workspace<slug>/(idempotent; passoverwrite: trueto refresh an existing workspace copy). Now read<slug>/app.json(currentname,version,creator,price,icon,agent) and<slug>/index.htmlso you change the right app and keep its identity. - Apply the changes in your workspace
<slug>/, keeping the SAME shape it already uses (a self-containedindex.html, or a Nuxt rebuild with the sameapp.baseURL: '/apps/<slug>/'). Preserve the slug, name, creator, price, andicon.svgunless the operator asked to change them. If the request sets, changes, or removes the designated agent, write (or delete) theagentfield in<slug>/app.jsonto match the named id. Delegate the edits to the harness (runtime=acp) with the staged files as context — the same harness-first posture as a new build; edit directly only when no harness is available. - Bump the version in
<slug>/app.json: patch for small fixes, minor for new features, major for breaking changes or a redesign. - Install the updated app:
app_installwithaction: "install",slug: "<slug>"(validate first if unsure). The bumped version shows on the app's card immediately (the Apps page re-readsapp.jsonviaGET /api/apps).
Guardrails
- Never write
public/apps/directly. Your filesystem/exec tools are workspace-confined;public/apps/is off-limits to them by design. Build in your workspace<slug>/, then useapp_install— it is the only writer ofpublic/apps/. - Static only. Never wire the app into a JClaw route or the JClaw DB. Persistence = client-side storage or a third-party API the operator provides.
- Base path is mandatory for the Nuxt shape. If you build with Nuxt,
app.baseURL = '/apps/<slug>/'is required — without it the generated assets point at/_nuxt/…(JClaw's own SPA assets) and the app breaks. Always set it, and pass it to the harness in the task. (Self-contained static apps use relative paths and sidestep this entirely — another reason it's the default.) - Trusted, same-origin. The app runs on JClaw's origin; only build apps the operator authored or asked for.
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.

