Highlights
Duplicate an artifact
Copy any artifact into a new one that keeps all of its setup. A new Duplicate... item in
each artifact's overflow menu opens the compose form pre-filled from the source: the title is
set to {name} (n) (auto-incrementing, e.g. anvilnine (1)), the slug to a derived
anvilnine-1, and the frame, visibility, tags, and project are carried over. Every field stays
editable before you create the copy.
- Works for inline artifacts (html/jsx/tsx/md) and zip sites on one server path,
POST /api/artifacts/:slug/duplicate. Any field the request omits inherits from the source. - The content is copied as-is; to change a copy's content, edit it after.
- The view password is never copied (it is stored hashed) — a copy set to password visibility
asks for a new one.
Markdown render controls
Global render config for markdown artifacts: reading font (system/serif/mono), content width,
font size, and default theme (auto/light/dark). Markdown renders at serve time, so changing the
global config applies to every markdown artifact live with no re-publish. The viewer frame gets
a light/dark/auto theme toggle. Inline code no longer clips at the edges.
Anvil Nine look
The dashboard and the viewer shells (frame, jsx, md, password) now carry the Anvil Nine brand.
Dashboard UX
A tag chip editor and a project combobox on the compose and edit forms, list and grid view
modes, and inline menus/dialogs with optimistic updates.
Docs
New setup guides: preview deploys from CI (GitHub Actions), and three storage backends
(Coolify + MinIO, Forgejo, GitHub). README screenshots refreshed.
Upgrade notes
Backward compatible, no migration. Duplicate is available to any key with the publish scope.
Markdown render config has sensible defaults, so existing markdown artifacts render unchanged
until you set a global preference.
Full changelog: v1.2.0...v1.3.0