| name | tlon |
| description | Interact with Tlon/Urbit API. Use for reading activity, message history, contacts, channels, and groups. Also for group/channel administration, profile management, and exposing content to the clearweb. |
Tlon Skill
Use the tlon command for reading data, managing channels/groups/contacts, and administration.
Hermes
When running as a Hermes plugin skill, the tlon tool is a wrapper around the
tlon CLI for reading data, administration, management, and proactive posts.
For exact command syntax, use the command sections below or run
tlon <subcommand> --help through the tool.
When a Tlon user asks you to create a group for them, use
tlon groups create-owned "Name" --owner ~requester [--description "..."].
This invites the requester and makes them an admin. Do not use plain
tlon groups create for user-requested groups; that creates a bot-owned group
that does not automatically include the requester.
For a normal text reply in the current Tlon conversation, respond with final
assistant text and let Hermes deliver it through TlonAdapter.send(). To post
to a different channel or one-to-one DM (a proactive send), use posts send
with that target (chat/~host/slug for channels, ~ship for one-to-one DMs).
Reserve dms send <club-id> for group DMs, whose club IDs start with 0v.
Gallery channels use heap/~host/name. A normal reply in a gallery becomes a
comment on the triggering post. Use posts send heap/~host/name "..." to
create a distinct new top-level gallery item, including when that gallery is
the current conversation; gallery items can use --title "...".
Blocked in Hermes' tlon tool: plain-text posts reply/dms send/dms reply
and posts send to a current chat/DM conversation (reply normally instead).
Current-gallery posts send creates a new item and is allowed. Image sends
(--image) are allowed anywhere,
including the current conversation: tlon upload <direct-image-url>, then
posts send <target> [caption] --image <uploaded-url>.
OpenClaw
When running as an OpenClaw skill, use the built-in message tool for sending outbound messages (DMs and channel posts). The tlon command is for reading data, administration, and management — not for sending messages. The message tool routes through the proper delivery infrastructure (threading, bot profile, rate limiting).
Removed: diary/notebook channels. The %diary backend has been removed.
tlon notebook, --kind diary, and any diary/... nest now fail with an
explanatory error pointing at %notes. Use the tlon notes family for
Markdown notebooks instead.
Installation
npm (Node.js):
npm install @tloncorp/tlon-skill
tlon channels groups
Direct binary (no Node required):
curl -L https://registry.npmjs.org/@tloncorp/tlon-skill-darwin-arm64/-/tlon-skill-darwin-arm64-0.4.0.tgz | tar -xz
./package/tlon channels groups
Replace darwin-arm64 with darwin-x64, linux-x64, or linux-arm64 as needed.
Configuration
CLI Flags (highest priority):
tlon --url https://your-ship.tlon.network --cookie "urbauth-~your-ship=0v..." <command>
tlon --url https://your-ship.tlon.network --ship ~your-ship \
--cookie "urbauth-~your-ship=0v..." --code sampel-ticlyt-migfun-falmel <command>
tlon --url https://your-ship.tlon.network --ship ~your-ship --code sampel-ticlyt-migfun-falmel <command>
tlon --ship ~your-ship <command>
tlon --config ~/ships/my-ship.json <command>
Valid CLI credential forms are --config <file>, --url <url> --cookie <cookie> with optional --ship and fallback --code, --url <url> --ship <ship> --code <code>, and --ship <ship> when available in TLON_SKILL_DIR or cache. Incomplete or conflicting credential flag sets fail locally instead of merging with environment variables.
Config file format:
{"url": "...", "cookie": "urbauth-~ship=..."}
{"url": "...", "ship": "~...", "code": "..."}
Environment Variables:
export URBIT_URL="https://your-ship.tlon.network"
export URBIT_COOKIE="urbauth-~your-ship=0v..."
export URBIT_URL="https://your-ship.tlon.network"
export URBIT_SHIP="~your-ship"
export URBIT_CODE="sampel-ticlyt-migfun-falmel"
URBIT_* aliases take precedence over TLON_* aliases for the same field. Partial ambient credentials fail locally except ship-only env, which is used for TLON_SHIP + TLON_SKILL_DIR or cache lookup.
Skill directory: When TLON_SHIP and TLON_SKILL_DIR are set, the CLI loads ships/<ship>.json from that skill directory before checking cached credentials.
OpenClaw: If configured with a Tlon channel, credentials load automatically from JSON config. The default path is ~/.openclaw/openclaw.json; OPENCLAW_CONFIG can point to an explicit JSON config path and is parsed as JSON regardless of extension.
Resolution order: CLI credential flags → TLON_CONFIG_FILE → URL + cookie env → URL + ship + code env → TLON_SHIP + TLON_SKILL_DIR → ship-only cache lookup → OpenClaw JSON → single cached ship.
Cookie vs Code:
- Cookie-based: Uses pre-authenticated session cookie. Ship is parsed from the cookie name (
urbauth-~ship=...). Fastest option.
- Code-based: Performs login to get a fresh session cookie. Requires URL + ship + code.
You can provide both cookie and code — cookie is used first, code serves as fallback if cookie expires.
Cookie Caching
The skill caches fresh auth cookies from code login and code fallback to ~/.tlon/cache/<ship>.json. Provided-cookie flows validate the cookie but do not copy that cookie into cache. This makes subsequent invocations much faster by skipping the login request.
How it works:
$ tlon --url https://zod.tlon.network --ship ~zod --code abcd-efgh contacts self
~zod
Note: Credentials cached for ~zod. Next time run: tlon --ship ~zod <command>
$ tlon --ship ~zod contacts self
~zod
$ tlon --ship ~zod contacts self
$ tlon --ship ~bus contacts self
Cache behavior:
- Cached cookies are URL-specific (won't use a cookie for the wrong host)
- If only one ship is cached, it's auto-selected (no flags needed)
- If multiple ships are cached, you'll be prompted to specify with
--ship
- Code login and code fallback cache fresh cookies; provided-cookie flows do not copy cookies into cache
Clear cache: rm ~/.tlon/cache/*.json
Multi-Ship Usage
If you have credentials for multiple ships, you can use this skill to operate on behalf of any of them. This is useful for:
- Managing multiple identities — switch between ships without changing environment variables
- Bot operations — act as a bot ship while authenticated as yourself
- Moon management — operate moons from their parent planet
Simply pass the target ship's credentials via CLI flags:
tlon --url https://other-ship.tlon.network --ship ~other-ship --code their-access-code \
channels groups
tlon --config ~/ships/bot.json channels groups
tlon --config ~/ships/moon.json contacts self
Commands
Help and usage errors are handled locally before credential lookup, so tlon <command> --help works without a configured ship.
Activity
Check recent notifications and unread counts. Ships are shown with nicknames when available.
tlon activity mentions --limit 10
tlon activity replies --limit 10
tlon activity all --limit 10
tlon activity unreads
Channels
List and manage channels. DMs show nicknames when available.
tlon channels dms
tlon channels groups
tlon channels all
tlon channels info chat/~host/slug
tlon channels create ~host/slug "Projects" --kind chat
tlon channels create ~host/slug "Notes" --kind notes
tlon channels rename chat/~host/slug "New Title"
tlon channels update chat/~host/slug --title "New Title"
tlon channels delete chat/~host/slug
tlon channels add-writers chat/~host/slug admin member
tlon channels del-writers chat/~host/slug member
tlon channels add-readers ~host/group chat/~host/slug admin
tlon channels del-readers ~host/group chat/~host/slug admin
Help works for both the command and subcommands:
tlon channels --help
tlon channels create --help
tlon channels rename --help
Notes on permissions:
- Empty writers list = anyone in the group can post (default for chat)
- Empty readers list = anyone in the group can view (default)
- Roles must exist in the group (use
tlon groups add-role first)
Contacts
Manage contacts and profiles.
tlon contacts list
tlon contacts self
tlon contacts get ~sampel
tlon contacts sync ~ship1 ~ship2
tlon contacts add ~sampel
tlon contacts remove ~sampel
tlon contacts update-profile --nickname "My Name"
Options: --nickname, --bio, --status, --avatar, --cover
Groups
Full group management.
tlon groups list
tlon groups info ~host/slug
tlon groups create-owned "Name" --owner ~ship [--description "..."]
tlon groups create "Name" [--description "..."]
tlon groups join ~host/slug
tlon groups request-invite ~host/slug
tlon groups accept-invite ~host/slug
tlon groups reject-invite ~host/slug
tlon groups cancel-join ~host/slug
tlon groups rescind-request ~host/slug
tlon groups leave ~host/slug
tlon groups delete ~host/slug
tlon groups update ~host/slug --title "..." [--description "..."]
tlon groups invite ~host/slug ~ship1 ~ship2
tlon groups revoke-invite ~host/slug ~ship1
tlon groups kick ~host/slug ~ship1
tlon groups ban ~host/slug ~ship1
tlon groups unban ~host/slug ~ship1
tlon groups accept-join ~host/slug ~ship1
tlon groups reject-join ~host/slug ~ship1
tlon groups set-privacy ~host/slug public|private|secret
tlon groups add-role ~host/slug role-id --title "..."
tlon groups delete-role ~host/slug role-id
tlon groups update-role ~host/slug role-id --title "..."
tlon groups assign-role ~host/slug role-id ~ship1
tlon groups remove-role ~host/slug role-id ~ship1
tlon groups promote ~host/slug ~ship1 [~ship2 ...]
tlon groups demote ~host/slug ~ship1 [~ship2 ...]
Roles vs Admin:
- Regular roles are for organizing members and controlling channel read/write permissions.
- Admin is a special privilege on top of a role. Admins can manage group settings,
channels, members, and roles.
- `promote` creates an "admin" role (if one doesn't exist), grants it admin privileges,
and assigns it to the specified members. `demote` removes that role from them.
- To grant admin to members who already share a role, use `set-admin` on that role
via the backend directly (not yet exposed in the Tlon app UI).
# Channels
tlon groups add-channel ~host/slug "Name" [--kind chat|heap|notes]
tlon groups add-channel remains supported, but for agent/tool use prefer the more discoverable channel-centric form:
tlon channels create ~host/slug "Projects" --kind chat
Help works here too:
tlon groups --help
tlon groups add-channel --help
Group format: ~host-ship/group-slug
Join behavior:
join first checks whether you are already a member, then checks foreign/unjoined group state for a valid invite.
- Invited groups and public groups use the backend join action.
- Private groups without an invite use the invite-request action.
- Secret groups require an invite.
Hooks
Manage channel hooks — functions that run on triggers (posts, replies, reactions, crons).
tlon hooks list
tlon hooks get 0v1a.2b3c4
tlon hooks init my-hook --type on-post
tlon hooks add my-hook ./my-hook.hoon
tlon hooks edit 0v1a.2b3c4 --name "New Name"
tlon hooks edit 0v1a.2b3c4 --src ./updated.hoon
tlon hooks delete 0v1a.2b3c4
tlon hooks order chat/~host/slug 0v1a 0v2b 0v3c
tlon hooks config 0v1a chat/~host/slug key1=val1
tlon hooks cron 0v1a ~h1
tlon hooks cron 0v1a ~m30 --nest chat/~host/slug
tlon hooks rest 0v1a
Notes:
- Hook IDs are @uv format (e.g.,
0v1a.2b3c4...)
- Schedules use @dr format:
~h1 (1 hour), ~m30 (30 minutes), ~d1 (1 day)
- Hooks run in order when triggered; use
order to set priority
- Use
config to pass channel-specific settings to a hook instance
Writing Hooks: See references/hooks.md for full documentation on writing hooks, including:
- Event types (
on-post, on-reply, cron, wake)
- Bowl context (channel, group, config access)
- Effects (channel actions, group actions, scheduled wakes)
- Config handling with clam (
;;)
Examples: See references/hooks-examples/ for starter templates:
auto-react.hoon — React to new posts with emoji
delete-old-posts.hoon — Cron job to clean up old messages
word-filter.hoon — Block posts containing banned words
Messages
Read and search message history. Authors are shown with nicknames when available.
tlon messages dm ~sampel --limit 20
tlon messages channel chat/~host/slug --limit 20
tlon messages search "query" --channel chat/~host/slug
tlon messages context chat/~host/slug 170.141... --limit 5
tlon messages post chat/~host/slug 170.141...
Options: --limit N, --resolve-cites
The context command fetches N messages before and after a given post ID — useful for
finding surrounding conversation when you have a post from search or activity.
For DMs, use the ship name as the channel: tlon messages context ~sampel 170.141...
The post command fetches a single post with its replies/thread. For DM posts,
pass --author ~ship (required for DM lookups).
Tip: Use search to find a message, then context with its ID to see the surrounding conversation.
DMs
Manage direct messages — reactions, invites, and deletions.
tlon dms react ~sampel ~author/170.141... "👍"
tlon dms unreact ~sampel ~author/170.141...
tlon dms react ~sampel ~author/reply-id "👍" --parent ~author/root-id
tlon dms delete ~sampel ~author/170.141...
tlon dms accept ~sampel
tlon dms decline ~sampel
tlon dms send 0v5.abcde "hello"
tlon dms send 0v5.abcde "look" --image https://...
tlon posts send ~sampel "hello"
Expose
Publish Tlon content to the clearweb via the %expose agent.
tlon expose list
tlon expose show chat/~host/slug/170.141...
tlon expose hide chat/~host/slug/170.141...
tlon expose check heap/~host/gallery/170.141...
tlon expose url heap/~host/gallery/170.141...
Cite path formats:
- Simplified:
chat/~host/channel/170.141... (auto-expands)
- Full:
/1/chan/chat/~host/channel/msg/170.141...
Channel kinds map to content types: chat→msg, heap→curio
Posts
Manage channel posts (sends, reactions, edits, deletes).
tlon posts send chat/~host/slug "Hello"
tlon posts send ~sampel "Hello"
tlon posts send chat/~host/slug "Look" --image https://storage.../x.png
tlon posts send chat/~host/slug --image https://...
tlon posts send heap/~host/gallery "A link or caption" --title "Gallery item"
tlon posts reply heap/~host/gallery 170.141... "Nice work"
tlon posts react chat/~host/slug 170.141... "👍"
tlon posts unreact chat/~host/slug 170.141...
tlon posts react chat/~host/slug reply-id "👍" --parent root-id
tlon posts react heap/~host/gallery comment-id "🔥" --parent post-id
tlon posts edit chat/~host/slug 170.141... "New text"
tlon posts delete chat/~host/slug 170.141...
tlon posts delete heap/~host/gallery 170.141...
Send --image takes a direct png/jpeg/gif/webp URL — normally the URL returned by tlon upload — and attaches it as an inline image block (dimensions are read from the image bytes). The message becomes an optional caption.
posts edit edits message text only. The former notebook-only
--title/--image/--content edit flags are removed (they refuse with an
explanatory error) along with diary/notebook channels.
Notes
Manage %notes notebooks (Markdown-first). Notebooks are nests of the form
notes/~host/name; note bodies are plain Markdown (not Tlon Story).
tlon notes status
tlon notes request 0vabc
tlon notes list
tlon notes show notes/~host/name
tlon notes notes notes/~host/name
tlon notes note notes/~host/name 12
tlon notes note-create notes/~host/name root "Title" --body post.md
tlon notes note-create notes/~host/name root "Title" --markdown post.md
tlon notes note-create notes/~host/name 7 "Title" --stdin
tlon notes note-update notes/~host/name 12 --body new.md --expected-revision 3
tlon notes note-rename notes/~host/name 12 "New Title"
tlon notes note-move notes/~host/name 12 3
tlon notes note-delete notes/~host/name 12
tlon notes history notes/~host/name 12
tlon notes folders notes/~host/name
tlon notes folder notes/~host/name 3
tlon notes folder-create notes/~host/name "Drafts" --parent 3
tlon notes folder-rename notes/~host/name 4 "Archive"
tlon notes folder-move notes/~host/name 4 3
tlon notes folder-delete notes/~host/name 4 --recursive
tlon notes members notes/~host/name
tlon notes join notes/~host/name
tlon notes leave notes/~host/name
Note bodies come from exactly one content source. note-create accepts
--body <file>, --markdown <file> (alias), or --stdin. note-update
accepts --body <file> or --stdin; use --body, not --markdown, for
file-backed updates. note-create places the note in a folder id, or root
(resolved to the notebook's root folder). --expected-revision on note-update
is optional (last-write-wins by default).
To create a group-backed notes channel for the Tlon app, use tlon channels create ~host/slug "Title" --kind notes — %notes owns the listing, so
--description and writer roles aren't accepted there. Do not use
tlon notes create for app/group channels; it creates a standalone %notes
notebook only.
Upload
Upload files to Tlon storage from a URL, local path, or stdin.
tlon upload https://example.com/image.png
tlon upload ./photo.jpg
tlon upload ~/Pictures/screenshot.png
tlon upload ./mystery-file -t image/webp
cat image.png | tlon upload --stdin -t image/png
Options: -t/--type (override MIME type), --stdin (read from stdin)
Content type is auto-detected from file extension for local files. For stdin, -t is recommended (defaults to application/octet-stream).
Returns the uploaded URL for use in posts, profiles, etc.
Settings (OpenClaw)
Manage OpenClaw's Tlon plugin config via Urbit settings-store. Changes apply immediately without gateway restart.
tlon settings get
tlon settings set <key> <json-value>
tlon settings delete <key>
tlon settings allow-dm ~ship
tlon settings remove-dm ~ship
tlon settings allow-channel chat/~host/slug
tlon settings remove-channel chat/~host/slug
tlon settings open-channel chat/~host/slug
tlon settings restrict-channel chat/~host/slug [~ship1]
tlon settings authorize-ship ~ship
tlon settings deauthorize-ship ~ship
Notes
- Ship names should include
~ prefix
- Post IDs are @ud format with dots (e.g.
170.141.184.507...)
- DM post IDs include author prefix (
~ship/170.141...)
- Channel nests:
<kind>/~<host>/<name> (chat, heap, or notes)
Limits
- Activity: max 25 items
- Messages: max 50 items