Artifacts

io.github.kuyazee由 GitHub 帳號 kuyazee 發布v1.0.0更新於 Oct 24, 2026

Self-hosted artifact publishing: POST HTML/JSX/Markdown/zip, get an unguessable URL on your domain

發布方自己的服務:artifacts.boo

已驗證STDIO僅桌面檔案與儲存開發者工具

概覽

AI 產生的概覽

讓助理把 HTML、JSX、Markdown、PDF 或打包的靜態網站發佈到自架伺服器,並回傳你自己網域下難以猜測的網址。

可以做什麼
這是一個自架的成品發佈伺服器,內建 MCP 端點。助理可以提交 HTML、單一 React 元件、Markdown、PDF 或打包的靜態網站,並取得你控制網域下的連結。成品預設為私有,透過簽章能力連結分享,也可設為公開或密碼保護,並支援重新導向、QR code、標籤與依專案分組。儀表板和命令列提供相同的人工發佈流程。
適用情境
適合想把 AI 產生的儀表板、原型、報告或小應用用連結分享,但託管在自己基礎設施而非廠商平台的情況。也適合已運行容器主機、希望掌控成品網址、可見性與保留策略的團隊。
執行需求
以本機程序或容器執行(Docker 映像;開發需 Node 22 或更新版本)。需要密鑰 ARTIFACTS_API_KEY 作為寫入與 MCP 端點的 Bearer 權杖,以及 BASE_URL 用於回傳連結中的公開來源。可選 STORAGE_BACKEND 指向 S3 相容儲存、git 遠端或 Postgres 以持久化;在代理後可用 TRUST_PROXY。
安裝前請注意
API 金鑰具有發佈權限,應保持最小範圍並可撤銷。發佈的 HTML 會在瀏覽器中執行,因此成品應與儀表板使用不同來源,且不要發佈機密。公開成品任何拿到連結的人都能存取。重新導向可能讓你的網域成為開放重新導向器,PDF 下載開關只是便利,並非保護。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Artifacts,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

artifacts

Self-hosted, Claude-style artifact publishing

POST HTML, a React component, Markdown, a PDF, or a zipped static site. Get back an unguessable URL on your own domain.

[CI] [License: MIT] [Node >= 22]

Quick start · Deploy · API · CLI · MCP · Security

[Dashboard: publish, group by project, and manage artifacts]
Dashboard: publish, group by project, and manage

[A published artifact served with the viewer topbar]
A published artifact served with the viewer topbar

About

AI assistants produce a lot of shareable output: dashboards, prototypes, reports, small apps. Claude's hosted artifacts work well, but the URLs live on someone else's infrastructure. This is the self-hosted version, about 1,100 lines. You POST content, it serves the rendered result at an unguessable URL on a domain you control.

It runs as one container with a single admin account and, by default, no database. Each artifact is a directory of plain files under /data, so backing up that directory backs up everything. On hosts that wipe local disk on restart, point it at durable external storage instead (an S3-compatible bucket, a git remote, or Postgres) by setting STORAGE_BACKEND. See deploying.

Features

  • Content types. HTML, JSX/TSX (a single React component, no build step), Markdown, PDF, and zipped static sites.
  • Agent-native, human-friendly. A built-in MCP server lets Claude Code, Codex, or any MCP client publish with one tool call. Humans get a drag-and-drop web UI at / (behind an admin login) and a CLI.
  • Two-tier auth. An admin logs into the dashboard with a password; CLI and MCP carry scoped, revocable API keys (read / publish / full) with optional expiry, so you never share one master secret.
  • Private by default, with per-artifact visibility. A new artifact is private, shared through a signed capability link (?k=…) you can rotate to revoke. Switch any artifact to public (anyone with the bare link) or password-protected. Nothing is discoverable by default: unguessable slugs, noindex everywhere. See visibility.
  • Optional viewer frame. A slim top toolbar (title, copy link, hide) like Claude, Gemini, and ChatGPT artifacts. Toggle it globally in Settings or per artifact; ?raw=1 serves the bare content. Redirects are never framed.
  • Markdown render settings. Pick the reading font, content width, base font size, and starting theme for every Markdown artifact in Settings. Markdown renders from its source on each view, so a change shows on existing artifacts too. Framed Markdown gets a navbar button that cycles Auto, Light, and Dark for that reader. See docs/formats.md.
  • PDF hosting. Publish a PDF and it gets a viewer page plus a direct-download link. Three per-artifact viewer modes (standard, presentation, minimal) and a download toggle that removes the viewer's buttons. The toggle is a convenience, not protection: the file's URL still answers with the bytes. See docs/formats.md.
  • Redirects. type: "redirect" turns a slug into a short link that answers an HTTP 301 at the server, where other hosts fall back to a JavaScript bounce. The target must be an absolute http(s) URL and cannot carry credentials, and the response is uncacheable, so repointing the slug takes effect on the next visit. Repoint one from the row menu in the dashboard, or with a PUT. Read the cost of running an open redirector on your domain first: docs/formats.md.
  • Embeddable. A public artifact drops into any page as one <iframe>. The row menu writes the tag for you, pointing at ?raw=1 so the frame holds the artifact and not a second toolbar. Private and password-protected artifacts stay unembeddable on purpose, and the unlock prompt refuses to be framed at all. See docs/embedding.md.
  • QR code per artifact. Every artifact has a QR of its permanent URL, from the row menu in the dashboard, GET /api/artifacts/:slug/qr, or artifacts qr <slug>. SVG or PNG, generated in-process: no QR library, no third-party image service, nothing about your artifacts leaves the box. See the API reference.
  • Organize by project. Group artifacts built for the same project into collapsible sections, with a search box across project, title, slug, tags, and a redirect's target. Tags stay for cross-cutting labels.
  • Lifecycle controls. Custom slugs, rename, tags, disable without deleting, auto-expire, delete.
  • Abuse-resistant. Login and unlock endpoints are rate-limited per client IP (failures only), and password hashing runs off the event loop, so a burst of guesses slows those two routes instead of stalling the server. Set TRUST_PROXY for the real client IP behind Cloudflare or a reverse proxy. See deploying.

Quick start

Clone, configure, start:

bash
git clone https://github.com/anvilnine/artifacts && cd artifactscp .env.example .env   # set ARTIFACTS_API_KEY (openssl rand -hex 32) and BASE_URLdocker compose up -d

Or skip the clone and run the image directly:

bash
docker run -d -p 3000:3000 -v artifacts-data:/data \  -e ARTIFACTS_API_KEY=$(openssl rand -hex 32) \  -e BASE_URL=https://artifacts.example.com \  ghcr.io/anvilnine/artifacts:latest

Publish something:

bash
curl -s -X POST https://artifacts.example.com/api/artifacts \  -H "Authorization: Bearer $ARTIFACTS_API_KEY" \  -H "Content-Type: application/json" \  -d '{"content": "<h1>hello</h1>", "type": "html", "slug": "hello", "tags": ["demo"]}'# {"slug":"hello","url":"https://artifacts.example.com/a/hello"}

Let Claude Code publish for you:

bash
claude mcp add --transport http artifacts https://artifacts.example.com/mcp \  --header "Authorization: Bearer ${ARTIFACTS_API_KEY}" --scope user

Documentation

I want to…Read
Deploy it (Docker, compose, Coolify, bare node, env vars)docs/deploy.md
Use the REST API (incl. zip sites and tags)docs/api.md
Publish from the terminaldocs/cli.md
Hook up Claude Code / Codex / any agentdocs/mcp.md
Set up login + scoped API keysdocs/auth.md
Understand JSX/TSX rendering + zip validationdocs/formats.md
Put an artifact inside another pagedocs/embedding.md

Development

No build step. Node ≥ 22.

bash
npm installcp .env.example .env   # any ARTIFACTS_API_KEY works locally, e.g. "test"npm run dev# UI at http://localhost:3000

The end-to-end suite is one shell script:

bash
bash .github/workflows/smoke.sh http://localhost:3000 <your-key>

A few cases cannot be reached over HTTP, such as a hand-edited auth.json. Those run as unit tests on node's built-in runner, no server needed:

bash
npm test

That covers the dashboard too. dashboard-check.mjs fetches /, parses the inline script in public/index.html, and checks that every element the script grabs by id is still in the markup. It runs no browser, so it catches a syntax error or a deleted element but not a runtime error.

PRs welcome. See CONTRIBUTING.md.

Hosted version

Self-hosting is the product, and the open source version stays complete. If you would rather not run a server, Anvil Nine is building a managed version: same publishing flow, custom domains, backups handled for you. A waitlist page opens with the first cloud announcement; watch this repo's releases until then.

Security

Uploaded HTML runs in the browser. That is the whole point, so the model is built to contain it:

  • Serve artifacts from their own origin. Point artifact URLs at a domain that hosts nothing else, so a published page can never touch the dashboard's session cookie.
  • Writes need a scoped API key. Publishing carries a bearer key; the admin dashboard uses a separate HttpOnly, SameSite=Strict session cookie.
  • Reads rely on unguessable slugs. Public artifacts are reachable by anyone with the link and carry noindex, but there is no listing to browse. Don't publish secrets.
  • Credential routes are throttled. Login and unlock rate-limit per client IP and hash passwords off the event loop. A caller below publish scope gets a 256 kB body parser instead of the 10 MB one, and a cap of 20 large bodies a minute per client IP, both checked before the body is parsed. Put a CDN or edge limiter in front for volumetric attacks.

Full threat model in SECURITY.md.

Acknowledgements

This project stands on other people's open source. All of the following are MIT licensed.

Runtime

Optional storage backends (loaded only when selected)

The SQLite backend uses Node's built-in node:sqlite (no dependency).

Web UI

  • Tabler Icons for the app-bar icons (search, new, settings, lock), inlined as SVG

License

MIT © 2026 Zonily Jame

One container. Plain files by default; pluggable S3 / git / Postgres / SQLite storage.

來源:README.md,提交 c0c2aa0

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v1.0.0最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

其他 Artifacts 整合