Repository navigation
Releases: lexmount/artifact-site
Release list
artifact-site 0.4.0
Image: ghcr.io/lexmount/artifact-site:0.4.0 (linux/amd64, linux/arm64). CLI: npm install -g @artifact-site/cli@0.4.0. Self-hosting: SELFHOST.md.
A local MCP server: npx @artifact-site/cli mcp starts a stdio relay to your deployment's /mcp,
so clients and directories that only launch local commands can publish, search, read and update
artifacts too; the MCP Registry now lists the npm package next to the hosted endpoint. Campaign
tags survive analytics redaction, and operators can claim their MCP connector on Glama.
Upgrading. A drop-in upgrade: no database migrations and no required configuration changes.
ARTIFACT_GLAMA_CLAIM is a new optional setting.
Added
artifact-site mcp(CLI): a local stdio relay to the deployment's/mcp, for clients and
directories that only start local commands. It usesARTIFACT_SITE_URL/ARTIFACT_SITE_TOKENor
the saved login; signed out, it still lists the tools from a bundled copy (generated from the
server, checked in CI). The MCP Registry listing now carries the npm package next to the remote
endpoint.ARTIFACT_GLAMA_CLAIMserves Glama's HTTP ownership challenge at/.well-known/glama.json, so an
operator can claim their deployment's MCP connector listing on glama.ai. Unset, nothing is served.- GA4 keeps campaign attribution: the landing page view carries
utm_source,utm_mediumand
utm_campaignwhen each is lowercase[a-z0-9._-]of at most 40 characters, so links shared in
chat apps or email no longer count as direct traffic. Later events and every other query
parameter stay redacted.
Fixed
- Fix the viewer pin icon shrinking and add localized mouse-hover/keyboard-focus help without sticky tooltips after touch taps.
- Align work-list sorting beside search and keep Explore counts right-aligned, with a stacked mobile layout.
Local MCP in one line
{
"mcpServers": {
"artifact-site": {
"command": "npx",
"args": ["-y", "@artifact-site/cli", "mcp"],
"env": { "ARTIFACT_SITE_URL": "https://artifact-site.app.lexmount.com", "ARTIFACT_SITE_TOKEN": "ahp_..." }
}
}
}Create the personal token at /for-agents#mcp on your deployment. See docs/MCP.md.
artifact-site 0.3.0
Comments become a working review loop: comment on a selection, reply with images and mentions,
search discussions, and record which version addressed the feedback — with a personal inbox that
tells you when someone replies. Authorization moves onto database role bindings, the browser can
upload a new version of an existing artifact, and list and preview loading gets substantially
faster.
Upgrading. Stop every instance sharing the database, then deploy this release; 0.2.0 binaries
cannot run against the cleaned authorization schema, and old and new authorization writers must not
run together. See RBAC for the deployment and backup requirements. Migrations run at
startup. No configuration changes are required; two new optional settings are listed below.
Added
- Comment on a selection. Select text in an HTML artifact or a selectable PDF and comment on it,
with verified citations and file/page labels. Managers composing from the main artifact can choose
a live, version-compatible share discussion; each destination keeps its own draft, and share
management links directly to the independent discussion. - Rich comments. Lightweight links and inline code with a safe preview, plus pasted or uploaded
image attachments on comments and replies. Image drafts survive reloads, uploads can be retried or
cancelled individually and show progress, oversized rasters are re-encoded proportionally, and
image reads are protected by the discussion's own permissions. Abandoned drafts expire after seven
days and removed attachments are cleaned up. - Mentions. Permission-checked @mentions in comments, replies and edits, with a
keyboard-accessible searchable picker, an extensible candidate policy, and mention identities that
survive drafts and text edits. - Discussion search and version results. Search comment text and replies within your authorized
discussions, filter discussions you took part in, and record the version that addressed a
discussion without moving or auto-resolving the original feedback. Result associations keep
actor/time audit records and hide inaccessible target versions. - Notification inbox. Follow discussions — authors and first-time repliers follow automatically,
explicit unfollows persist — and get a personal in-app inbox for replies and mentions, with
permission-checked deep links and revocable version-scoped share receipts. Retention is
configurable (ARTIFACT_NOTIFICATION_RETENTION_DAYS, console-overridable). - Comments for agents. Read-only comment listing, discussion and context tools in MCP and CLI,
historical source reads and exports, and an Agent feedback-to-update workflow that revises a site
in place while preserving its address. - Authorization on database role bindings. Role catalogs and grants move to
permissions,
roles,role_permissionsandrole_bindings. Existing tenant administrators and site roles
migrate at startup. Administration → Authorization and scoped grant editors in Sharing and
Workspaces offer viewer/commenter/editor/admin roles for named members, own-workspace members and
global everyone. Disabled accounts are revocable, administrative authorization reads are audited,
and share-link scope, CLI/MCP identity and immediate revocation are unchanged. - New version from the browser. One upload panel in the library, the viewer's More menu and
version history replaces an existing site's contents — HTML, folder/ZIP or document — with
conflict acknowledgement, and localized quota guidance for new sites and new versions. - Public page metadata. Open Graph and Twitter cards for the home, Explore and agent-guide
pages, crawler rules and a marketing-only sitemap. Artifact pages keep their policy-aware share
cards and stay out of search results. - CLI and MCP. Personal-folder listing and moves, explicit public-catalog lookup, operator
identity reporting, and search ownership labelled independently. - Slow-read diagnostics can be enabled per deployment (
ARTIFACT_PERF_LOG_MS); no SQL or
credentials are logged.
Changed
- Faster lists and previews. Navigation loading states stream in a persistent shell and recent
routes are reused for 30 seconds; personal lists are paginated with permissions and folder data in
one response, and the public directory paginates and searches in SQL. Live list thumbnails are
replaced by metadata covers, with sandboxed previews loading progressively once visible cards stay
on screen. Permission lookups are deduplicated and abandoned requests are cancelled. The agent
reference loads on demand with cached rendering. Bundled-proxy response buffering is disabled. - Sharing settings. New share-link creation sits at the top of both the drawer and the expanded
view, the editor opens by default, external visit data moves to its own tab beside share links and
people, and the external-traffic counting rule is explained in an accessible tooltip. Share URLs
render as single-line truncated links with a separate copy button. Quick audience links, mobile
quick sharing as a bottom sheet, and account-and-site-scoped private-site guidance replace the
persistent private-link warning. - Viewer and header. A compact viewer header around logo, title and version; adaptive collapsed
controls that blend with the artifact background; header pinning that survives storage failures;
unified product branding across readers, owners, editors and notification viewers. - Account menu. Language selection becomes a compact checked submenu, notification-center and
language entries are added, and the signed-in identity animates into place instead of flashing a
login entry. - Comment polling drops from 10 seconds to at most 30, suspends background timers and coalesces
foreground refreshes. - CLI JSON compatibility.
whoami.tokenStatusnow reportsunidentifiedrather thanrejected
for credentials without an identified account, and gains an operator field. - Site deletion replaces the browser prompt with an accessible confirmation and retryable errors.
- The READMEs present the hosted service as the cloud version hosted by Lexmount alongside
self-hosting, in all six languages, keeping the anonymous upload and expiry details. - Retired authorization tables, columns, the old collaborators API and edit-policy controls are
removed; grant management is/api/authorization/*. Visibility, share links, ownership and
anonymous management are unchanged.
Fixed
- Parallel uploads and re-uploads preserve file metadata and SHA-256 receipts, keeping entry-page
detection stable; aggregate limits are enforced against the merged state and retryable contention
is reported asupload_conflict. - Pure
#fragmentlinks inside hosted artifacts stay same-document: native anchor activation is
preserved, including event cancellation, stopped propagation, repeated named anchors, keyboard
focus, nested SVG links and image-map areas. Authoredhrefvalues are restored before preview
history handlers run so table-of-contents highlighting still matches. - Accounts, sites and permissions survive an OIDC subject change for the same verified email
address; historical duplicates resolve to the earliest account, with migration logging. - Site action menus stay inside the viewport — flipping above the trigger when needed, scrolling on
short screens, respecting mobile zoom and the soft keyboard, and restoring keyboard focus on
dismissal — so bottom-row actions including Delete remain reachable. - Comment previews, posting and image uploads work on LAN HTTP origins where
crypto.randomUUIDis
unavailable. - Comment result associations made with personal API tokens are attributed to agents, matching OAuth
attribution and audit records. - Bundled PDF links open in the sandboxed PDF.js reader while raw downloads and range reads keep
working. - Search drafts and view selections survive delayed navigation; directories refresh after publishing
or copying; pagination keeps working alongside search. - Keyboard focus returns correctly when closing account menus and leaving discussions; closed visit
explanations are hidden from assistive technology; aborted view-history and stale identity
responses are ignored.
Image: ghcr.io/lexmount/artifact-site:0.3.0 (linux/amd64, linux/arm64)
CLI: npm install -g @artifact-site/cli@0.3.0
Upgrade: stop every instance sharing the database first, then git pull --ff-only && make upgrade (or make pull && make up with ARTIFACT_IMAGE=ghcr.io/lexmount/artifact-site:0.3.0).
artifact-site 0.2.0
Comments and reactions on artifacts, recoverable publishing for large trees, OAuth for MCP
clients, tenant-scoped RBAC, official versions and the multilingual README. Upgrading applies
database migrations automatically; no configuration changes are required.
Added
- Comments. Version- and share-isolated comment threads with replies, author editing,
moderation, resolution, main-link policy settings and audited access. Comments can be anchored
to a selection in HTML, image and PDF artifacts (Office documents fall back to whole-file
comments), reviewed against the exact version they were written on, and bundled as authorized
context for agents. Anonymous visitors can read but not write. - Comment sidebar. All review happens in the artifact's right sidebar: owner share feedback,
version/source/author/status filters, original-version previews, inline replies, resolve/undo,
an overlapping-marker chooser, a mobile sheet and per-tab draft recovery that survives
sign-in and refreshes. Old review bookmarks redirect to the sidebar. - Reactions and read progress. Account-scoped emoji reactions on comments and replies with a
searchable Unicode picker (categories, recent, skin tones), unread discussion indicators and
private cross-device read progress (local for anonymous readers). Migration
0006-comment-engagement. Signed anonymous artifact likes. - Recoverable publishing. Authenticated CLI publishing safely extracts ZIPs, preflights HTML
entries, uploads large trees file by file, persists credential-free progress and recovers lost
commit responses. Publication results are idempotent for seven days with owner-scoped HTTP/MCP
status queries, atomic result/version commits and fencing against superseded attempts; staged
uploads are kept for six hours. File-transfer rate limits are separate from publication limits. - OAuth for MCP clients. ChatGPT, Claude and any client that implements MCP authorization
can connect to/mcpby signing in instead of pasting a token: this server is now its own
OAuth 2.1 authorization server — authorization code with PKCE (S256), refresh tokens with
rotation, RFC 9728 / RFC 8414 discovery, Client ID Metadata Documents and dynamic client
registration — with a consent page at/oauth/authorize, the scopesartifacts:readand
artifacts:write, and Connected applications in My sites to disconnect. Personal and
operator tokens work unchanged. New settings, also editable from the console:
ARTIFACT_OAUTH_CLIENT_HOSTS,ARTIFACT_OAUTH_DCR,ARTIFACT_OAUTH_APP_SCHEMES. The agent
guide's MCP tab offers both ways in. - Tenant-scoped RBAC with
initandanonymoussystem tenants, tenant/site administrators,
permanent editor memberships, independent view/comment/edit share modes and fixed-version links.
Workspaces provides member management and explicit anonymous-artifact claiming. Legacy
collaborators now have editing rights only; signing in alone no longer grants editing or
automatically claims anonymous sites. See RBAC. - Encrypted, version-scoped preview credentials that recheck share revocation and tenant access.
A shared database key is generated automatically; platform administrators can rotate it from
Settings without a restart.PREVIEW_SIGNING_SECRETis an optional first-start seed. - Official versions. Designate one current or historical version as official from the
viewer, upload confirmation, My sites, CLI or MCP. Latest links keep following updates; fixed
shares and immutable snapshots stay unchanged. - Share link management. Sharing settings open in a large window; newly created links can be
retrieved and copied after reopening; link settings and guest-list changes require an explicit
save with an audience-impact confirmation. Links carry names, creation sources and version
summaries, drafts are protected, historical links are grouped, and site visibility changes are
confirmed. Historical hash-only links remain valid but cannot be recovered. - Version-aware ZIP downloads in the viewer, My sites, editor, version history and platform site
administration. Administrative downloads require a reason and record an export audit. Owners and
editors can export saved content after a takedown; deleted sites remain unavailable. ZIPs include
all saved files (including document originals), not editor drafts. - Home-page Recently viewed / Recently updated tabs (updates show only owned sites, newest
first). Browser history now covers unlisted sites and shared/pinned entrances, forgets sites
that turned out inaccessible, and stays local to the browser (up to 50 sites). - View counts: My sites lists total recorded views; new opens across direct/share entrances are
collapsed per reader and site for 30 minutes, preview crawlers are filtered consistently,
lifetime opens are distinguished from seven-day external visits, and optional view-detail
retention drains in time-budgeted batches while preserving cumulative counts. - Platform-admin audit retention setting (0–3650 days, default 0 = forever) for site, admin
and RBAC logs, with time-budgeted maintenance cleanup and a manual System action. Console
settings overrideARTIFACT_AUDIT_RETENTION_DAYS; expired deletions are permanent. - Opt-in GA4 browser analytics with runtime configuration, public-URL hostname defaults,
redacted page context and explicit account/publishing/sharing events. Configuration errors
never break pages; failure telemetry is limited to write-request failures. - An installable agent skill (
npx skills add lexmount/artifact-site) and a streamlined README
in all six languages with a hosted-product comparison and clearer CLI/MCP entry points. README
in 简体中文, 日本語, Deutsch, Français and Español underdocs/. - CLI:
artifact-site --version(and-v) prints the installed package's version. - The header links to the project's GitHub repository on every page that shares the header.
Changed
- Viewer version status, snapshot navigation and official designation are consolidated into a
compact toolbar menu; side actions dock to the edge behind a slim, initially collapsed handle. - RBAC is enforced consistently across browser, API, CLI and MCP: title editing for account
owners/admins, anonymous management token validation, retired owned-site tokens, disabled disown,
explicit RBAC actions for report APIs and one version-range rule for previews and comments.
Credentials and roles are rechecked during upload staging and final publication; share edits are
merged under the authorization transaction and revision-aware clients reject stale settings.
Read-only OAuth sessions no longer advertise writes. - MCP/personal-token authentication is preserved; clients gain tenant/share context and share
mode/version controls.emailremains a compatible alias of thepeopleshare policy. - The CLI only falls back after confirmed pre-publication 413 errors and no longer automatically
retries unsafe writes on server errors.
Fixed
- Artifact resource queries are kept separate from preview controls so CSS, scripts, images,
fonts and data with?v=cache tags load correctly. - Public and unlisted artifact viewers now need editor-or-higher source-export permission to fork
(Save a copy), download original files or export ZIPs. Rendered content remains readable. - Concurrent RBAC operations no longer exhaust the PostgreSQL connection pool while waiting for
the administration lock; version access checks are free of duplicate read audits. - Follow-share preview keys are rechecked after publication; official-version subresources are
served; inaccessible latest-version IDs are omitted from agent comment context. - Tenant and same-report version constraints are added without rewriting historical ownership or
visibility; retired edit-policy values no longer affect sharing responses. - Home tab headings use the original section-heading typography; comment quotations are limited to
30 characters, whole-file comments are labelled, and reaction tooltips no longer clip. Comment
refresh sits with the header actions, the rail marker toggle stays while the panel is open, and
expanded filters sit above the read tabs.
Image: ghcr.io/lexmount/artifact-site:0.2.0 (linux/amd64, linux/arm64)
CLI: npm install -g @artifact-site/cli@0.2.0
Upgrade: git pull --ff-only && make upgrade (or make pull && make up with ARTIFACT_IMAGE=ghcr.io/lexmount/artifact-site:0.2.0)
artifact-site 0.1.0
Image: ghcr.io/lexmount/artifact-site:0.1.0 (linux/amd64, linux/arm64). Self-hosting: SELFHOST.md; agents: /for-agents.md on your deployment.
The first public release.
Added
- Administrators can assign unowned sites to an existing verified account from the console,
including email administrators on deployments without PUBLISH_API_TOKEN. - Remote MCP at
/mcpwith authenticated Streamable HTTP, full artifact operations, bounded
binary upload/download chunks, and independent CLI/MCP onboarding. Personal tokens can be
created in the browser and revoked in My sites. - An explicit Home link in the main navigation, highlighted on the home page.
Narrow headers keep account controls together and navigation on a scrollable second row;
administrators can use the account menu instead of a duplicate navigation entry. - Agent guide with prompt, CLI and MCP tabs, deployment-aware authentication instructions,
copyable commands and Cursor configuration, complete tool reference and troubleshooting.
Home and README entries link directly to the connection guide. Installation uses npm's global
prefix; token input supports Bash and zsh. Authentication guidance distinguishes public reads,
the default anonymous setup, and operator-token verification. - Search and read for agents.
GET /api/search?q=finds sites by what they say (every word
must occur; title matches first; Chinese works without any database extension) among the sites
the caller may list, andGET /api/sites/:slug/textreturns a site's current version as plain
text — HTML stripped, pdf/docx/pptx text extracted — or one file of it. CLIsearch/read,
MCPartifact_site_find/artifact_site_read, and a section in the agent guide. Text is
extracted right after each publish (never in the request path) into a newsite_textstable.
Existing sites are indexed by the maintenance tick (now driven by searches as well as
publishes, 20 seconds per hour) — search is partial until that catches up; the console's
System page has an "Index search text of existing sites" button to do it now. Reading is
never partial: an un-indexed site is extracted on the spot. Memory is bounded before anything
is read — text files are read as a 2 MB prefix, documents over 40 MB are indexed by title only,
office archives inflate only their text parts (16 MB each, 32 MB total), and at most two
extractions run at once per process. - Console settings. The "who may do what" policy — who can create, what anonymous creators
may do, default visibility, anonymous-site expiry and the four quota caps — is editable at
/admin/settingswithout a rebuild (console > environment > default; "Use environment" hands
control back; every save is logged). Stored in a newsettingstable keyed by scope, the seat
reserved for tenants. - Anonymous creators can be kept to reading (
ARTIFACT_ANONYMOUS_SITES=read-only, or the
console): the creating browser can open its site; editing, sharing, renaming and deleting ask for
a sign-in, after which the site belongs to that account. - Agent guide version.
/for-agents.mdcarriesskill_versionin its frontmatter and every
API response the headerX-Artifact-Site-Skill-Version(a hash of the guide's text, so it changes
with every edit and needs no bumping). The guide tells agents to refetch it when the two differ,
so an installed copy cannot silently go stale after an upgrade. - "My sites" has a folder rail and a search box. Folders sit in a left column with their
counts (All / Unfiled / each folder), the grid filters by title or address, and narrow screens
fall back to the chip row. Folders themselves are unchanged. - Quotas and anonymous-site expiry.
ARTIFACT_QUOTA_SITES_PER_USER/_BYTES_PER_USERcap an
account's live sites and stored bytes (every version counts),_PER_ANONthe same for an
anonymous browser; a write over a cap answers403 quota_exceededwith the numbers. Everything
is unlimited by default.ARTIFACT_ANON_SITE_TTL_DAYSremoves sites published without an
account that many days after their last change unless adopted by an account — a normal delete, restorable by
an administrator within the retention window; the creator sees the date on the site and the
create response carriesexpiresAt. The users view shows usage against the caps. - Administration console at
/admin(Overview, Users, Sites, System; an entry in the account
menu for administrators, 404 for everyone else) and its API.ARTIFACT_ADMIN_EMAILSnames
administrators by sign-in e-mail;PUBLISH_API_TOKENas a Bearer keeps working for scripts.
/api/admin/*lists users (site count, stored bytes) and sites (owner, size, state), disables accounts
(sign-in refused, sessions and publish tokens revoked), takes sites down (served to the owner
only; visitors get a removal notice and 410 from the API), deletes and restores sites, and runs
maintenance. Owners see a banner with the reason on a taken-down site and a chip in "My sites".
Every act is written to a newadmin_logtable, including an administrator opening a private
or taken-down site (site.view) — administrators can read any site the console lists, but
cannot write to it. Owners see their site's slice of that log under "Administrator activity"
in the site's More menu (GET /api/sites/:slug/admin-activity): dates, actions and reasons,
never the administrator's identity./api/auth/mereportsisAdmin. - Deleted sites can be restored. Deleting a site no longer removes its files at once: they are
kept forARTIFACT_DELETED_RETENTION_DAYS(default 30) and purged afterwards, automatically
about once an hour on a replica that sees traffic, or from the administration API. - Account-level folders (#35): "My sites" folders are stored on the account once signed in and follow the user across devices (
/api/me/folders); the browser-local shelf is imported once after sign-in (folders matched by name, sites filed where the account had no opinion yet) and then retired. Signed-out browsers and deployments without an IdP keep the local behaviour unchanged. ARCHITECTURE.md,CODE_OF_CONDUCT.md, issue and pull-request templates, README screenshots,
andscripts/export-public.sh(produces the public-repository tree without internal docs).@artifact-site/cli(cli/): a command-line client (publish,update,export,share,list,rollback, …) with the same artifact operations available through remote MCP, with device sign-in, chunked upload for large trees and PDFs, andexpected_versionlocking.- Apache-2.0 license,
SECURITY.md(threat model and disclosure process),CONTRIBUTING.md. - GitHub Actions CI (typecheck, lint, unit tests, Postgres integration tests, Docker build) and a
tag-triggered release workflow that publishes a multi-arch image to GHCR. - Single-host deployment kit:
make upwith a bundled Postgres 18, optional Gotenberg and Caddy,
pre-flightmake doctor,make backup/make restore, image packaging for offline hosts. - Startup self-check that prints the effective backends and refuses configurations that could
not work (missing database URL, incomplete S3 settings,loginpolicy without an IdP). - English as the source language for UI copy, with Simplified Chinese as a selectable locale
(cookieah_locale, elseAccept-Language).
Changed
-
The interface follows the design team's system. Black on near-white with one light-green
accent, the system sans font, and a horizontal header (Home · Explore · My sites · Agent guide,
EN | 中文, a prominent Sign in). The home page leads with the drop zone and the one line to hand
an agent; My sites has a folder rail, list and grid views, and tabs for created / editable /
recently viewed (the full history, with remove and clear); the viewer bar carries device
preview, Edit and Sharing with the rest behind "···"; the editor is one bar with Edit / Preview
and Save new version; the console, activation and sign-in pages use the same tokens. Signed out,
My sites still lists the sites this browser created.globals.csswas consolidated — dead rules,
stacked overrides and six reduced-motion blocks folded — and two hygiene tests keep it that way
(every styled class is used, every zh-CN key is referenced). (#105) -
Make MCP upload errors actionable, reuse owner/session resolution per chunk, and count project files independently of transfer chunks. Keep final byte counts consistent; clarify discarded Office/ZIP drafts, verify UI tool labels against discovery, and improve CLI search-limit and share-inspection handling.
-
The MCP connection page displays the access token as editable plaintext and provides a separate
copy-token button, with success/failure feedback and disabled copying when empty. -
Remote MCP now exposes 15 task-oriented tools instead of 24, with usage examples, parameter
guidance and server instructions. List/search, identity/limits, details/history/shares and
export/download are consolidated; uploads use start/write/cancel and commit via publish/update.
Refresh client tool discovery after upgrading; see docs/MCP.md for migration. Staged publish
now follows inline publish's public-share default; passshare: falseto keep it unshared. -
CLI recommends
findfor listing/search andupdate --titlefor renaming. Old commands remain
compatible but are hidden from top-level help. Addedit,forkandinfo --sharesto expose
the existing client capabilities; remove obsolete local MCP setup instructions. -
Removed open claiming by URL; the old claim API returns 410. Use personal-token publication,
original-browser sign-in, or Administration → Sites → Assign owner for unowned sites. -
Removed the local
artifact-site mcpstdio command. Configure a remote URL and Bearer token
...