penman. rtd marketplace ↗

Claude writes it clean. You paste it into Teams. Your team sees a mess.

Penman bridges the gap.

Claude's answer is good. Now it has to land in front of someone else. Tell penman where it's going and get rich text on your clipboard, styled for that app: fonts matched, code highlighted, tables that survive the paste. ⌘V. Done.

Before · raw paste
# Q3 launch notes Ship date is **Oct 14**. The `--dark` flag is live. | metric | target | | ------- | ------ | | signups | 4,000 | | churn | < 2% | ```js const html = penman(notes, { for: "word" }); ```

claude's markdown, pasted as-is. the recipient scrolls past it.

After · penman

Q3 launch notes

Ship date is Oct 14. The --dark flag is live.

metrictarget
signups4,000
churn< 2%
const html = penman(notes, { for: "word" });

actual output of penman --for word, unedited.

13

places your reader already is. Chat, docs, email, wikis, decks, notes.

1

thing you do: name the target. penman handles the formatting.

0

cleanup after you paste. It lands the way Claude meant it.

The platforms

It knows what Slack renders.

Thirteen styled targets: chat, documents, email, wikis, decks, notes — plus a plain-text terminal mode for commands. Real values pulled from src/tokens.js, not approximations. This is what each app actually renders, so it never looks off to the person reading it.

Per-platform typography recipes
PlatformKindBodySizeLeadingCode
slackchatLato15px1.46668*Monaco · 12px
teamschatSegoe UI14px1.5Consolas · 12px
discordchatgg sans16px1.375Consolas · 12px
worddocumentCalibri11pt1.6Consolas · 10pt
google-docsdocumentArial11pt1.5Consolas · 10pt
notiondocumentsystem-ui16px1.5SFMono-Regular · 14px
outlookemailCalibri11pt1.5Consolas · 10pt
gmailemailArial14px1.5monospace · 13px
confluencewiki-apple-system…14px1.714SFMono-Medium · 12px
jirawiki-apple-system…14px1.714SFMono-Medium · 12px
powerpointdeckCalibri18pt1.4Consolas · 14pt
google-slidesdeckArial18pt1.4Courier New · 14pt
craftnotesui-sans-serif17px1.5ui-monospace · 14px

* 1.46668. Yes, really: Slack's actual line height.

The hard part

Slack eats your <h1>.

Teams collapses your <p>. Discord dumps your table's cells into one line. Chat apps strip structure on paste, so penman doesn't send them structure. Your terminal wants the opposite extreme — no formatting at all — so penman strips it back to the bare command.

Chat targets

<strong> for headings, <br> for spacing, and tables re-set as aligned text inside <pre>. That's the one table layout Slack can't ruin:

metric | target --------+------- signups | 4,000 churn | < 2%

the same table, set for slack.

Document & email targets

Real semantic HTML with explicit inline styles on every element. Absolute pt/px sizes, not em. Word doesn't do relative.

metrictarget
signups4,000
churn< 2%

the same table, set for word.

Terminal targets

No formatting at all — just the command. penman lifts it out of the code fence, drops the prose, and copies plain text. The trailing newline is trimmed, so the last line waits for your Enter instead of running on paste.

bun install bun run build

the command, set for your shell.

How it works

Three steps. No magic.

Tokens

Resolve the platform's recipe (fonts, sizes, colors, code styling) for light or dark. Your ~/.penman.json5 overrides merge in.

Render

marked parses the markdown, highlight.js colors the code, and every element gets explicit inline styles. Nothing left to strip.

Clipboard

The HTML is hex-encoded and set as «class HTML» via osascript, with a plain-text fallback for targets that want none of it.

Customize

Your shop, your type.

Every token (fonts, sizes, colors, code styling) can be overridden in ~/.penman.json5. Globally, or per platform.

{
  // everywhere
  tokens: { codeFontFamily: 'Fira Code, monospace' },

  // just slack
  platforms: {
    slack: { tokens: { fontFamily: 'Inter, sans-serif' } },
  },
}

penman --for slack --tokens lists everything you can touch.

For Claude Code

Just say where it's going.

No flags to remember. The penman MCP tools hand Claude the converter, so you just talk like a person.

you

"pen that for teams"

claude

On your clipboard, styled for Teams: Segoe UI, 14px, the works. ⌘V away.

also works: "penman the release notes for slack" · "make this paste-ready for word, dark mode" · "pen this command for the terminal" · "what platforms can you style?"

  • penmanconvert and copy to the clipboard (the everyday one)
  • penman_htmlconvert and return the HTML, clipboard untouched
  • penman_craftconvert to Craft blocks (JSON) for writing straight into Craft
  • penman_platformslist every platform and its recipe

Install once, from the RTD marketplace:

/plugin marketplace add ryanthedev/rtd-claude-inn
/plugin install penman@rtd
/penman:install

Prefer ceremony? /penman:pen --slack ./notes.md works too. So does the CLI: penman --for word --theme dark notes.md