Install
openclaw skills install @anboias/saved-markdownPublish content to saved.md and return a public shareable URL. Use when the user wants to publish, host, or share a Markdown, HTML, or JSX page via saved.md, including requests like "publish to saved.md", "post this to saved.md", "make this shareable", "host this page", or "give me a public link". Also use when the user asks for a saved.md scaffold or structured template-driven starting point. Do not use for private local-only drafts or ordinary markdown editing with no publishing or saved.md intent.
openclaw skills install @anboias/saved-markdownPublish 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).
Frontmatter decides when to use this skill.
Everything below defines how to execute once triggered.
After triggering, pick the mode that best matches user intent. If unclear, default to one-shot and mention that other modes exist.
| Mode | When | What happens |
|---|---|---|
| One-shot | Quick reports, logs, exports | Generate → publish → return URL |
| Interactive | Resumes, landing pages, anything user-facing | Generate → show draft → user edits → publish |
| Local-only | User explicitly wants no publishing | Save .md / .html / .jsx, no API call |
| Enhance | Existing markdown needs charts or polish | Read → enhance → publish new URL |
Pages are immutable — edits always produce a new URL.
templates/INDEX.mdtemplates/create-template.mdtemplates/markdowns/ for markdowntemplates/htmls/ for htmltemplates/jsx/ for jsxtemplates/INDEX.md| Format | Use when | contentType |
|---|---|---|
| Markdown | Reports, docs, dashboards, resumes, charts | "markdown" (or omit) |
| HTML | Layout-heavy pages, visual polish, static UI | "html" |
| JSX | Interactivity, filters, state, dynamic charts | "jsx" |
If using HTML or JSX, always explicitly set contentType.
Otherwise the page renders incorrectly.
Use this when generating structured Markdown or HTML content.
| Content type | Triggers | Template |
|---|---|---|
| Resume / CV | resume, CV, profile | resume-cv.md |
| Report | report, analysis, findings | report.md |
| Company profile | company, about, services | company-profile.md |
| Dashboard | KPIs, metrics, scorecard | dashboard-metrics.md |
| Documentation | docs, guide, manual | documentation-guide.md |
| Proposal | proposal, pitch, quote | proposal-pitch.md |
| Newsletter | newsletter, digest, changelog | newsletter-update.md |
| Portfolio | portfolio, projects | portfolio-showcase.md |
| Event | event, invitation, RSVP | event-invitation.md |
| Generic | everything else | freehand |
Never invent content to fill sections.
Omit anything without real data.
When a template is selected:
templates/If the user already provided full content, skip template browsing and go straight to generation.
When enhancing markdown:
markdown-ui-widget$, %, K, etc.)Template guide: templates/charts.md
Before publishing:
contentTypereact, react-dom)Template guide: templates/validation.md
python scripts/publish.py --file <path> --content-type <markdown|html|jsx> --title "<title>"
Use POST https://saved.md/api/pages with JSON.
Required/expected payload fields:
markdown (string): page source body for markdown, html, or jsx pagescontentType (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.
When users request edits to an existing saved.md URL:
GET /api/pages/{id} and read markdown + contentTypemarkdownPOST /api/pages using the edited markdown and the same contentTypeNever imply in-place updates are possible.