artishare
Publish a self-contained HTML or Markdown page, get an unguessable link, share it. No account. Push updated content under the same key and it becomes a new version at the same URL.
- The link is the permission.Ids carry ~79 bits of entropy. There is no listing endpoint and no index — an artifact is reachable only by someone holding its link.
- The edit token is the ownership.Creating an artifact returns a token exactly once. It is the only way to publish a new version, roll back, or delete. There is no recovery if you lose it.
- Nothing is public by accident.Every artifact is served with
noindexand a strict CSP that blocks any external host.
Publish something
One request. content is the body of your page — no
<html> or <head> needed.
curl -X POST https://artifact.optimasolutions.io/api/artifacts \
-H 'content-type: application/json' \
-d '{
"title": "Q3 Revenue",
"favicon": "📊",
"content": "<h1>Revenue</h1><p>Up 12% on the quarter.</p>"
}'You get back the share link and your one-and-only edit token:
{
"id": "bg7m3gvh836jmats",
"url": "https://artifact.optimasolutions.io/a/bg7m3gvh836jmats",
"version": 1,
"edit_token": "kQ8x..."
}
Send "kind": "markdown" to write Markdown instead of HTML.
Publish an update
Same key, same link — the content becomes version 2. Whoever already has your link sees the new version on refresh.
curl -X PUT https://artifact.optimasolutions.io/api/artifacts/$ID \
-H "authorization: Bearer $EDIT_TOKEN" \
-H 'content-type: application/json' \
-d '{"label": "fixed the chart", "content": "<h1>Revenue</h1><p>Up 14%.</p>"}'Older versions stay reachable forever at their own pinned URLs
(/a/$ID/v/1/), so a link you shared to a specific version keeps
showing what you shared. title, description and
favicon are only changed when you include them.
Changed your mind? Point the key back at an earlier version:
curl -X POST https://artifact.optimasolutions.io/api/artifacts/$ID/rollback \
-H "authorization: Bearer $EDIT_TOKEN" \
-H 'content-type: application/json' \
-d '{"version": 1}'Publish with images and CSS
Send it as multipart. The filename becomes the path inside your artifact, so
relative references like <img src="assets/logo.png"> resolve.
curl -X POST https://artifact.optimasolutions.io/api/artifacts \
-F 'title=Bundle' \
-F 'entry=@index.html' \
-F 'asset=@style.css' \
-F 'asset=@logo.png;filename=assets/logo.png'Paths are sanitised: no ../, no absolute paths, no dotfiles, at
most 8 levels deep. A leading v/ is rejected because it collides
with version URLs.
What happens to your HTML
| You send | You get |
|---|---|
A fragment (<h1>...) | Wrapped in a page skeleton: CSS reset, light/dark theming with a toggle, your emoji favicon, prose styles for tables and code |
A full document (<!doctype html>) | Served byte-for-byte. Nothing injected |
| Markdown | Rendered (tables, footnotes, task lists, smart quotes) then wrapped |
Every endpoint
| Method | Path | Needs | Does |
|---|---|---|---|
| POST | /api/artifacts | — | Publish; returns the edit token |
| GET | /api/artifacts/{id} | link | Metadata and version history |
| PUT | /api/artifacts/{id} | token | New version under the same key |
| DEL | /api/artifacts/{id} | token | Delete the artifact and all versions |
| GET | /api/artifacts/{id}/versions | link | Version history |
| DEL | /api/artifacts/{id}/versions/{n} | token | Prune one old version |
| POST | /api/artifacts/{id}/rollback | token | Repoint the key at version n |
| GET | /a/{id}/ | link | The current version, rendered |
| GET | /a/{id}/v/{n}/ | link | A pinned, immutable version |
| GET | /a/{id}/{path} | link | An asset of the current version |
| GET | /health | — | Liveness |
The token goes in Authorization: Bearer <token> or
X-Edit-Token. The live version cannot be deleted — roll back
first. Version numbers are never reused, so a pruned version's URL stays dead
rather than later resolving to different content.
Limits
- Up to 16 MB and 64 files per version.
- Artifacts cannot reach any external host — no CDN scripts, no remote
fonts or images, no
fetchoff-origin. Inline everything and embed assets asdata:URIs or upload them alongside. - Inline
<script>and<style>are allowed.