---
name: memo-guest-writer
description: Join Dwarves Memo (memo.d.foundation) as a guest writer. Use when a
  person asks you to get their blog onto Dwarves Memo or shares this link. Files a
  join request, publishes the domain proof, and checks the result.
---

# Join Dwarves Memo as a guest writer

Guest posts become native memo notes in the normal folders, with the writer credited on their contributor page at https://memo.d.foundation/contributor/<handle>. The writer's own site stays the canonical home of every post.

The page address can change after joining: a writer whom an editor links to a Dwarves member profile is credited on that member page, and the old contributor URL redirects there. Never tell the writer a page address from memory; read it from the API (Verify below).

## Routing

- The writer wants to JOIN: follow Steps below.
- The writer already joined and wants a post on memo: read https://memo.d.foundation/writers/join#posts.
- The writer asks where their memo page is: GET https://memo.d.foundation/api/writers/<domain> and report writer.contributor_url.
- The writer wants interactive figures in a post: read Rich figures below.
- The writer wants to LINK A WALLET for rewards: read https://memo.d.foundation/writers/join#wallet. Wallet linking opens later; the writer can skip it now.
- Anything else: stop and tell the writer to contact the editors at team@d.foundation.

## Collect from the writer first

- Domain they control (example: truonghan.com).
- Handle they want on memo, used for their contributor page https://memo.d.foundation/contributor/<handle>. Rules: lowercase a-z, 0-9 and single hyphens; 3 to 30 characters; no hyphen at the start or end; reserved route names such as admin, guest, api, writers and join are blocked. Example: han-ngo. The handle is optional. If it is missing, invalid or taken, memo assigns one from the display name in kebab case (han-ngo), then adds a number if that is taken (han-ngo-2). The handle never appears in a post URL, so changing it later breaks no link.
- Display name and a contact email.
- Consent scope. Ask the writer to pick one, in these words, then send the machine value in brackets, never the sentence:
  - "Everything I have published" [everything]: memo may list any post you published before today, and editors pick which to import.
  - "Only posts I name" [named]: memo lists only the URLs you give us. Also collect those post URLs (at least one https URL, sent in urls).
  - "New posts only" [new]: nothing from before today; memo may suggest posts you publish from now on.
- Wallet: optional. Do not ask for one. Skip it unless the writer offers; wallet linking opens later.

Every scope keeps the writer's right to remove any post: delete or unpublish it on their own site and memo takes it down at the next freshness check.

## Steps

1. Read https://memo.d.foundation/writers/join for the rules and rewards.
2. POST https://memo.d.foundation/api/memo/join with JSON
   {"domain", "handle"?, "display_name", "email", "consent_scope", "urls"?, "wallet"?}.
   consent_scope is exactly one of "everything", "named" or "new". "named" needs at least one https URL in urls.
   A 201 reply returns request_id, verification_code, assigned_handle and expires_at. Keep request_id, verification_code and assigned_handle from the reply.
3. On the writer's site, publish https://<domain>/.well-known/dwarves.json:
   {"name": "...", "avatar": "https://...", "feed": "https://.../feed.xml",
   "memo_verification": "<verification_code>"}
   The code expires 24 hours after step 2.
4. Validate the file against https://memo.d.foundation/schemas/dwarves.json.
5. Tell the writer the assigned handle, that an editor reviews the request, that published posts appear as normal memo notes, and that you will check the request status for the result. Memo sends no email today.

## Verify (read-only, the only calls after step 2)

GET https://memo.d.foundation/api/memo/join/<request_id>

Expect "pending_verification", then "domain_verified", then "approved". "declined" carries a reason. Report the state, the handle or the reason to the writer. For anything else, contact the editors at team@d.foundation.

Once approved, read the writer's page address and report it, then stop:

GET https://memo.d.foundation/api/writers/<domain>

The reply's writer object is {"handle", "contributor_url", "native"}. Report contributor_url. "native": true means the writer is credited on a Dwarves member page. writer is null until the domain is active.

## Rich figures

memo renders a post's `figure.fig` blocks natively with its own copy of figkit, so tooltips, highlights and motion work with no script from the writer's site. Read https://memo.d.foundation/figures.md for the allowed markup, attributes and CSS rules. Markup outside that contract is dropped; the rest of the post still imports.

## Blockers: report them, never improvise

- You cannot write to /.well-known/ on the site: tell the writer, stop.
- 409: the domain already joined, or a verified request for it is already waiting for an editor. Report it; do not file a second request.
- 422: the reply is {"errors": [...]} listing every problem at once. Fix every listed error, then retry once.
- 429: too many requests. Wait for the Retry-After seconds, then retry once.
- The state is "declined" with reason "expired": the code passed 24 hours. Ask the writer before starting again from step 2.
- Never invent a wallet address. Never sign anything for the writer.
- The routes under /api/memo/ other than join and join/<id> are for Dwarves operators. Do not call them.

## Links

- Join guide: https://memo.d.foundation/writers/join
- Schema: https://memo.d.foundation/schemas/dwarves.json
- Figures contract: https://memo.d.foundation/figures.md
- Site index for agents: https://memo.d.foundation/llms.txt
