Skills saved-markdown

install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/anboias/saved-markdown" ~/.claude/skills/openclaw-skills-saved-markdown && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/anboias/saved-markdown" ~/.openclaw/skills/openclaw-skills-saved-markdown && rm -rf "$T"
manifest: skills/anboias/saved-markdown/SKILL.md
source content

saved-markdown

Publish immutable, anonymous pages to https://saved.md. Pages can be Markdown (with chart widgets), HTML (sanitized static pages with CSS), or JSX (sandboxed interactive React).


Core principle

Frontmatter decides when to use this skill.
Everything below defines how to execute once triggered.


Workflow modes

After triggering, pick the mode that best matches user intent. If unclear, default to one-shot and mention that other modes exist.

ModeWhenWhat happens
One-shotQuick reports, logs, exportsGenerate → publish → return URL
InteractiveResumes, landing pages, anything user-facingGenerate → show draft → user edits → publish
Local-onlyUser explicitly wants no publishingSave
.md
/
.html
/
.jsx
, no API call
EnhanceExisting markdown needs charts or polishRead → enhance → publish new URL

Pages are immutable — edits always produce a new URL.


Execution flow (high level)

  1. Decide mode
  2. Decide starting point (template scaffold or freehand)
  3. Decide format (Markdown / HTML / JSX)
  4. Generate or transform content
  5. Validate
  6. Publish (unless local-only)

Starting point decision

1) User explicitly asks for a scaffold

  • Read
    templates/INDEX.md
  • Show relevant templates (filter by format if known)
  • Let user choose
  • Load selected template

2) User wants a scaffold from a screenshot / description

  • Follow
    templates/create-template.md
  • Create a new template file under:
    • templates/markdowns/
      for markdown
    • templates/htmls/
      for html
    • templates/jsx/
      for jsx
  • Update
    templates/INDEX.md
  • Then continue like a normal template flow

3) User wants to enhance existing markdown

  • Analyze content
  • Identify visualization opportunities:
    • trends → line
    • categories → bar
    • proportions → pie
    • relationships → scatter
  • Add multiple charts where justified
  • Keep original structure intact
  • Publish as a new page

4) User describes content (no scaffold mentioned)

  • Match content type using routing table
  • Load corresponding scaffold template
  • Generate content from it

5) Nothing matches

  • Generate freehand:
    • title
    • structured body
    • optional footer

Format decision

FormatUse when
contentType
MarkdownReports, docs, dashboards, resumes, charts
"markdown"
(or omit)
HTMLLayout-heavy pages, visual polish, static UI
"html"
JSXInteractivity, filters, state, dynamic charts
"jsx"

Critical rule

If using HTML or JSX, always explicitly set

contentType
.
Otherwise the page renders incorrectly.


Content-type routing

Use this when generating structured Markdown or HTML content.

Content typeTriggersTemplate
Resume / CVresume, CV, profile
resume-cv.md
Reportreport, analysis, findings
report.md
Company profilecompany, about, services
company-profile.md
DashboardKPIs, metrics, scorecard
dashboard-metrics.md
Documentationdocs, guide, manual
documentation-guide.md
Proposalproposal, pitch, quote
proposal-pitch.md
Newsletternewsletter, digest, changelog
newsletter-update.md
Portfolioportfolio, projects
portfolio-showcase.md
Eventevent, invitation, RSVP
event-invitation.md
Genericeverything elsefreehand

Golden rule

Never invent content to fill sections.
Omit anything without real data.


Template scaffold workflow

When a template is selected:

  1. Read template file from
    templates/
  2. Show the scaffold skeleton to the user in a code block
  3. Ask what to change:
    • content
    • sections
    • colors
  4. Replace placeholders with user data and remove irrelevant sections
  5. Validate
  6. Publish

If the user already provided full content, skip template browsing and go straight to generation.


Markdown enhancement (charts)

When enhancing markdown:

  • Add charts using
    markdown-ui-widget
  • Use multiple charts when data supports it
  • Ensure:
    • numeric values are plain numbers (no
      $
      ,
      %
      ,
      K
      , etc.)
    • units go in labels, not values

Template guide:

templates/charts.md


Validation checklist

Before publishing:

  • Content under 100 KB
  • Correct
    contentType
  • Charts valid (if markdown)
  • HTML sanitized (no scripts)
  • JSX:
    • only allowed imports (
      react
      ,
      react-dom
      )
    • no external packages
  • No placeholder text left

Template guide:

templates/validation.md


Publishing

Preferred (script)

python scripts/publish.py --file <path> --content-type <markdown|html|jsx> --title "<title>"

Direct API contract (source-of-truth behavior)

Use

POST https://saved.md/api/pages
with JSON.

Required/expected payload fields:

  • markdown
    (string): page source body for markdown, html, or jsx pages
  • contentType
    (string):
    "markdown"
    ,
    "html"
    , or
    "jsx"

Example payload:

{
  "markdown": "# My Page\n\nPublished from skill",
  "contentType": "markdown"
}

For markdown pages,

contentType
may be omitted, but setting it explicitly is recommended for consistency.

Remixing an existing page (immutable URLs)

When users request edits to an existing saved.md URL:

  1. Parse page id from URL
  2. GET /api/pages/{id}
    and read
    markdown
    +
    contentType
  3. Apply requested edits to the returned
    markdown
  4. POST /api/pages
    using the edited
    markdown
    and the same
    contentType
  5. Return the new URL (old URL remains unchanged)

Never imply in-place updates are possible.