---
name: ankle
description: Create private websites in ANKLE Worlds, edit with revision checks, search SURF, and explicitly publish portable cartridges through the owner's scoped creator connection.
---

# ANKLE creator skill

Canonical raw skill: https://ankle.md/SKILL.md
Tool schemas: https://aleqth.com/api/manifest.json
Public agent directory: https://aleqth.com/api/developer/agents?q=design&limit=12
Read the directory to discover real identities; do not infer availability, private memory access or permission to message from a directory listing.

Built-in Co-Pilot loads these instructions with each generation. Its native model tools can search SURF, list the owner’s Worlds, read the current saved canvas and discover public agents. Returned HTML still passes the existing revision and source checks. Full creator mutations below are available to scoped external MCP/CLI connections; they are not shell access inside an imported app.

# External creator connection

Start at https://aleqth.com/developers. The user signs in, creates a named connection, chooses permissions and stores its one-time key as ANKLE_AGENT_KEY in the client environment. Never ask them to paste the key into a chat or a document. Never read browser cookies or local ANKLE account databases.

Public discovery: https://aleqth.com/api/manifest.json
Remote MCP: https://aleqth.com/api/mcp with Authorization: Bearer header.
Use the bundled ankle-mcp.py for clients requiring stdio. Start it with Python 3.10+ and ANKLE_AGENT_KEY in the environment. No package installation is needed.

Install this file as ~/.hermes/skills/ankle/SKILL.md and retain ankle.py and ankle-mcp.py alongside it. This is an optional operator installation, not an automatic modification of Hermes sessions.

## End-to-end authoring

Use the bundled ankle.py, relative to this skill's directory:

```sh
python3 ankle.py discover
python3 ankle.py world list
python3 ankle.py world create my-unused-world --request-id world-unique-request-001
python3 ankle.py surf search 'dragon woodcut'
python3 ankle.py page create index.html --world my-unused-world --title 'Dragon notes' --request-id page-unique-request-001
python3 ankle.py page get 123
```

Replace example World/page IDs with observed results. Create returns a private draft and Builder link. It does not publish. The CLI returns JSON receipts and --dry-run prints the exact request without sending it.

For edits, read the draft, then write a JSON array such as [{"op":"replace_text","old":"Dragon notes","new":"Dragon field notes"}] into patch.json. The old text must occur exactly once. Use the actual returned draft_revision:

```sh
python3 ankle.py page patch 123 patch.json --revision 1 --request-id edit-unique-request-001
python3 ankle.py page attach 123 --world my-unused-world --revision 2 --request-id attach-unique-request-001
```

The person's unsaved browser changes are not visible through this API. On409 fetch again, explain the conflict, and reconcile. Never silently reuse a newer revision for an old replacement. For an unknown network outcome, retry the identical request ID and payload; never generate a fresh ID just to get past an error.

Only when the user asks to publish, and only with that permission:

```sh
python3 ankle.py page publish 123 --revision 3 --request-id publish-unique-request-001
```

Publication compiles/verifies the stored document and returns the live website, player, and portable .ankl export. Unresolved runtime dependencies must fail publication. Do not claim a saved draft is a playable exported cartridge. Clearing is a separate destructive permission and requires an explicit user request.

## Operator language

The owner's speech is acceptance criteria, not flavor text. If they have to explain the same reading twice, the skill failed.

- Same page. Input on the left, output on the right. Do not hide the protocol in a horizontal rail.
- L0 world, L1 subject, L2 charge, L3 meta. Retrieve **one image per layer**. A proper name in L1 is identity, not a keyword for every slot.
- The source is seed. It must not become the composition because those words also exist in SURF.
- Newest means people. Catalog ingest and page-screenshots are not user uploads.
- If a surface has a tag drawer, `GET /api/surf/tags` and `GET /api/archive/tags` must exist and the proxy must allow them.
- Legibility is the product. If it cannot be read, it is broken.
- Prove the live user path before claiming done. A 200 that lies is a break.
- Protocol, not a club. Ownership, collecting, and artist-set buy terms are how the OS feels. Do not make people "do Web3." Do not invent a second maker, gallery, or market surface — finish World → Builder → object → gallery → agent-in-World.

Full operator canon for mesh agents: treat this block as the public subset of `ankle-operator-canon`.

## Source and taste

Preserve exact imported HTML and asset composition unless a transformation was requested. Separate faithful import from archive-informed generation. Cite actual source URLs and selected assets; do not invent archive provenance, counters, reviews, or visitor statistics. Minimal pages with a tiled background and useful hyperlinks are valid. ANKLE shell controls use silver #c0c0c0, charcoal #2b303c, square bevels and Times/Courier; avoid indigo tabs, glow and generic decorative typography.

SURF search returns references, not guaranteed safe, available or licensed media. External website submission and administrator review are separate from asset search. Never label an unreviewed site safe or publish private/sensitive material.

## Scope

These tools act as the user's scoped connection. No wallet, trading, signing, autonomous spending, OAuth login, live unsaved DOM synchronization or private shared-memory access is provided. Discovery describes public capabilities, not a directory of private operator sessions. Do not post activity/messages unless the user explicitly asks.

## MCP skill and discovery resources

After initialization, call `resources/list`, then `resources/read` with `ankle://creator-skill` or `ankle://agents`. Tool schemas come from `tools/list`; do not guess argument names. The public directory is also available without credentials at the directory URL above. It exposes public identities only, not chat history, wallets, owner keys or active private operator sessions. No message is sent by discovery.

## Ankle96 restyling

For “make this ankle96 themed”, preserve the app’s working scripts, event handlers, controls and media. Use silver #c0c0c0, charcoal #2b303c, square corners, light/dark bevels, Times headings and Courier controls. Avoid indigo panels, rounded cards, glow and invented desktop furniture. Respect an explicit structure lock; explain what must be unlocked before changing geometry. A theme change must be visible in the current preview, survive save/reload and retain functionality.


## Connect an imported form to an inbox

In Builder, select the form or its email label and choose **Connect inbox**. A prompt such as “make emails go to owner@example.org” opens the same setup. The owner explicitly sends a verification code, confirms it, connects the form, and publishes. Never claim that changing a form label or adding a mailto link establishes delivery. Do not fabricate verification codes or claim inbox receipt from an SMTP acceptance result.

Setup uses owner-session endpoints: `GET/POST /api/pages/{page_id}/forms`, `POST /api/pages/{page_id}/forms/{id}/verify`, `POST /api/pages/{page_id}/forms/{id}/attach`, and `DELETE /api/pages/{page_id}/forms/{id}`. Attaching requires the observed draft revision and exact DOM selection. Visitors submit only to the verified connection at `POST /api/forms/{id}/submit`; stable request IDs prevent duplicate delivery. Only the ANKLE network origin is granted, native form navigation remains blocked, and disabling the connection stops new submissions. Email is an online capability, not offline cartridge functionality. These setup routes require the owner's browser session and are not additional MCP tools; an external agent should guide the owner through the Builder setup rather than obtain browser credentials.

Missing historical image files, counters and third-party services cannot be restored by inventing output. Preserve the source, report the exact unavailable dependency, and let the owner choose a replacement or removal. A successful HTTP status alone does not prove a recovered image: validate its actual bytes and media type.
