Finished client-side sites and web applications whose runtime consists only of files served to a browser: HTML, CSS, JavaScript, images, and fonts. This includes multi-page static sites, single-page applications compiled from React, Vue, or Svelte, and prototypes written directly in HTML, CSS, and JavaScript. It also stores ordinary files such as images, video, PDFs, audio, text, and ZIP archives. It does not support an application that needs Node.js, Python, a database, a server function, or server-side rendering when a request arrives.
Artifact Server product and architecture proposal
Publish finished client-side websites and web applications, including multi-page static sites, compiled React, Vue, or Svelte applications, and prototypes written in HTML, CSS, and JavaScript. Also publish Markdown, text, JSON, source code, images, PDFs, audio, video, ZIP archives, and other files. Artifact Server stores the exact files and uses the browser's built-in display or download behavior. It does not build source code, run backend code, convert media, or provide specialized document viewers.
Product summary
Proposed behavior, access, deployment, and scope.
One installation is one closed group: one person or one team. 1. Account required. Only people admitted to that installation can open it. There is no public self-sign-up. 2. Public link. No account is required. Anyone who can connect to this Artifact Server and has the link can open the current version. History and comparisons still require an account. A public link does not put a private server on the internet.
One installation represents one person, team, or company. It contains projects, and every artifact belongs to one project. A new installation creates a default project. There is no organization switcher or separate Artifact Store object. Publishing again creates a new version without changing an earlier version.
MCP, the command-line program, and normal web requests use the same artifact operations and permissions. The command-line program handles files on the user's computer. MCP or the command-line program handles work that only needs server data. Local MCP setup uses artifactserver connect without a visible key. Remote command-line setup uses artifactserver auth login and browser sign-in when the server supports it.
A person selects comment threads on a version, picks a connected agent, and sends them as one bundle. Sending is consumptive: the sent annotations leave the normal views at once, and they return only if the bundle cannot be delivered. Agents connect outward and ask for work; Artifact Server never calls out to an agent, and it adds no notifications.
The same product rules run locally, on one server, on Kubernetes, or on Cloudflare. AWS and GCP have direct installers. Azure teams use the Kubernetes release on AKS; there is no separate Azure installer.
No workspace collaboration, general-purpose source-code hosting, code-building service, arbitrary add-ons, or programs that must keep running on the server. Artifact Server stores comment threads on its own artifact versions; Plannotator owns its workspaces and their review records.
On this page
Publishing workflow
An agent finishes a compiled web application, HTML prototype, or report and publishes it. A person opens the returned link. The agent can publish another version without changing the earlier one, and a person can compare the two versions.
A project contains related artifacts. Publishing an artifact does not create a separate hosting deployment. Artifact Server owns the link, browser view, saved versions, comparisons, sharing, and the comment threads made on its own artifact versions.
Publish
Send one file or the complete directory of finished client-side files.
Open
Ask the agent to open it. A local artifact opens from the local server; a team artifact opens from that team's server.
Compare
See which files and text changed between any two saved versions.
Share
Choose whether opening it requires an account.
Project, artifact, and version model
One installation represents one person, team, or company. It contains projects. An artifact belongs to one project and keeps the same identity over time. Each publish adds an immutable version.
One installation contains projects. A project contains artifacts. An artifact contains immutable versions.
A new installation creates one default project. Local publishing selects it automatically. Teams can create more projects without creating another member list, organization, storage bucket, or Artifact Store object.
Each intentional publish saves a new version. That saved version never changes. It contains one or more files and names which file should open first. A retry with the same request key returns the earlier result instead of creating another version. A one-file report and the finished output from a React project use the same model.
Artifact Server serves finished client-side files. It does not install packages, compile source code, start Node.js or Python, connect an artifact to a database, run server functions, or perform server-side rendering when a request arrives.
An artifact can have up to 20 optional tags. The server trims whitespace, normalizes Unicode and letter case, removes duplicates, and stores tags in a stable order. Each stored tag contains 1 to 40 user-perceived characters and no control characters. Tags apply to the artifact, not one saved version, so publishing or restoring does not change them. Project search runs before pagination and matches a normalized artifact-name substring or one exact normalized tag. It does not add tag categories, nested tags, or per-version tags. The Review catalog can filter artifacts by whether they have comments or by one or more exact tags, matching any selected tag, and sort them by newest or most commented; filtering and ordering run before pagination. Catalog cards keep tags hidden until someone opens the compact filter, so names and review activity remain the primary navigation signals.
Review can make any saved version current after confirmation. The request includes the current-version ID the reviewer saw, so a concurrent publish or restore produces a conflict instead of replacing a newer pointer. The Review URL and preview remain on the exact selected version after either outcome.
Client-side websites and web applications
Multi-page static sites, single-page applications compiled from React, Vue, or Svelte, HTML reports, and prototypes written directly in HTML, CSS, and JavaScript.
Documents and data
Markdown, text, JSON, source code, and other readable files.
Images, audio, video, and downloads
Images, PDFs, audio recordings, videos, ZIP archives, and other downloads.
How the server stores an artifact
The server stores seven kinds of records:
- Project: a stable project ID, name, installation ID, creation time, and archive state.
- Artifact: the same item over time, including its project, name, access setting, optional tags, and current version.
- Version: the saved copy created when someone publishes. It never changes and points to one manifest.
- Manifest: the canonical, ordered list of file paths, fingerprints, sizes, media types, and the entry file.
- File: one file in a version, including its name, folder path, file type, size, and SHA-256 fingerprint.
- Source: an optional note about an upload, approved local import, or agent.
- Action: who published, restored, changed access, changed tags, or deleted the artifact and when.
A SHA-256 fingerprint is calculated from a file's exact contents. If one byte changes, the fingerprint changes.
Project identity is enforced by every repository query, upload, browser session, HTTP request, MCP tool, action record, backup, and restore. Archiving a project stops new artifacts and versions but preserves existing links and history. The first release does not destructively delete a nonempty project.
Paths are portable relative paths. The server rejects absolute paths, dot
segments, .git path components, backslashes, null bytes,
percent-encoded separators, symlinks, special files, duplicate normalized names,
and names that collide only by case or Unicode normalization. The entry file must
exist in the manifest.
The manifest is serialized in one fixed order and hashed. That manifest digest, not an operating-system directory walk or Git commit, is the portable identity of the saved file set and the basis for comparison and idempotency checks.
Supported content and publishing behavior
The product stays small enough to explain without a tour. Publishing, viewing, versions, and sharing make up the customer experience.
Every successful publication returns three links with separate jobs. The primary
review link opens the exact saved version in the authenticated,
full-screen Review with comments available. artifact follows the
current version, while version opens immutable raw content. HTTP, CLI,
and MCP use the same names; MCP tells agents to share the review link first. A review
link never contains a content bootstrap token or credential.
Use the browser's native file behavior
HTML opens as a website. Images, PDFs, audio, and video use the browser's normal controls. Text, JSON, Markdown, and source files open as plain text in the first release. ZIP archives and unknown file types download. Audio and video support byte-range requests so seeking works.
The authenticated Review can present a selected image or video from one exact immutable version through native browser elements. Its media route accepts only an authorized matching image or video subresource destination and rejects top-level document navigation. The download route and version-scoped content origins keep their existing security roles.
The first release does not convert media, generate thumbnails, extract ZIP files, render Markdown, highlight source code, or ship a custom PDF viewer. Supporting these file types adds routing, media-type, range-request, and download tests—not a separate processing service.
Serve complete client-side output directories
The server delivers the published directory without rebuilding it. Relative links between HTML, CSS, JavaScript, images, and fonts continue to work. The content may also load scripts, styles, images, and fonts from other websites.
If the published website or HTML report contacts another web service, that service must allow requests from other websites. A private network may block internet access. Artifact Server does not copy or replace files loaded from elsewhere.
Saved versions that do not change
Every new publish request creates a saved version. Once saved, its files never change. The main link opens the current version. A link to a specific version always opens the same files. An earlier version can be restored without deleting later history.
If someone else published first, the server refuses to replace the newer work and explains how to try again. Retrying the same request key returns the same version. Reusing that key with different input is rejected. Starting a new publish with a new request key creates a new version even when its manifest matches an earlier version. Restoring changes the current pointer; it does not create or alter a saved version.
Compare any two versions
Every saved version already lists each file's path, size, and SHA-256 fingerprint. Comparing those lists shows which files were added, removed, renamed, or changed. The server reads only changed text files to show changed lines. Images and other binary files open individually from each version.
For images, PDFs, audio, video, ZIP archives, and other binary files, the first release reports that the file changed and shows its old and new size and fingerprint. It does not build image-comparison, PDF-comparison, archive-preview, or media-conversion interfaces. Unchanged files reuse the stored copy with the same fingerprint. Without Git, the extra cost is small version metadata plus work performed only when someone requests a comparison.
Optional Git handoff
Private Git handoff is off by default. An operator can explicitly make Cloudflare Artifacts available, but configuration alone copies nothing. Every project starts with Git history off. An administrator reviews a current-inventory estimate before explicitly enabling one project; existing and future projects remain off until each is enabled.
Every enabled artifact, including one document, gets its own repository and each saved version maps to one commit. Git is never required for saving, opening, or comparing artifacts. Cloudflare Artifacts is the first managed provider; local, code.storage, and private-remote adapters remain future options.
Plannotator integration
One Artifact Server installation can connect to one Plannotator organization. Each Plannotator project maps to one Artifact Server project. Workspaces reference artifacts and exact versions from that project. Plannotator owns workspace permissions, its own workspace comments, and review state. Artifact Server owns the paired project, artifact files, saved versions, browser delivery, comparisons, and the comment threads made on its own artifact versions.
Example: a reviewer comments on a button in version 12. Plannotator saves the workspace comment with the artifact ID, version 12's ID, and information that identifies the button. If version 13 is published later, opening the comment still loads version 12. Artifact Server returns the saved files and Plannotator returns the workspace comment. Artifact Server never stores a Plannotator workspace comment; it stores only the comment threads made on its own artifact versions.
Normal artifact links return the stored files unchanged. An explicit review address may add a small review bridge to the HTML response for that session only. The bridge receives no reusable credential, and the stored version remains unchanged.
Original files
Review provides a Download action in standard and full-screen modes. For an artifact with one file, it downloads the original file. For an artifact with multiple files, it downloads a ZIP that preserves every path and byte from the selected immutable version. The server streams the archive; the browser does not rebuild or buffer all published files. Opening or downloading an artifact does not alter the stored version.
One person or team, with two access settings
One Artifact Server installation contains one closed group of people. This is a single-organization model without an organization list or organization switcher: the installation itself is the group. On a laptop, that can be one implicit local user. On a team server, an administrator controls who can sign in through invitations or the configured company login, which can be WorkOS AuthKit or any OpenID Connect provider the team already runs. The product has no public self-sign-up and does not host several organizations inside one installation.
1. Account required
This is the default. Only people admitted to this installation can open the item. Every admitted person can read every account-required artifact in its projects. A person outside that group cannot open it. A workspace reference may grant a short-lived read-only session for one exact artifact version without granting access to the project artifact list.
2. Public link
No account is required to open the item. Anyone who can connect to this Artifact
Server and has the unpredictable link can open it. Public links are unlisted and
send X-Robots-Tag: noindex, nofollow by default, but that is not an
access-control guarantee. The public link opens only the current version. Version
lists, comparisons, and earlier saved versions still require an account.
Who may change an artifact
The two access settings control reading. They do not grant permission to publish or administer.
| Actor | Read account-required | Publish | Change access or delete |
|---|---|---|---|
| Admitted person | Yes | Yes | Yes |
| Service principal or API key | Only within its grant | Only within its grant | Only when explicitly granted |
How this fits with Plannotator organizations, projects, and workspaces
One Plannotator organization connects to one Artifact Server installation. Each Plannotator project pairs with one Artifact Server project.
| Concern | System that owns it |
|---|---|
| Sign-in, organization membership, Plannotator project and workspace records, and workspace permissions | Plannotator |
| Paired Artifact Server project records | Artifact Server |
| Workspace comments, annotations, replies, notifications, and review state | Plannotator |
| Finished artifact files, saved versions, file fingerprints, and comparisons | Artifact Server |
| Comment threads on Artifact Server artifact versions | Artifact Server |
Artifacts belong to projects, not workspaces. A workspace stores references to artifacts and exact versions in its project. Moving, unfiling, or deleting a workspace does not move or delete the project artifact.
Plannotator checks whether a person or agent may use the project or workspace. It then sends Artifact Server a short-lived signed request limited to the paired project and one operation. A workspace viewer may open one referenced artifact or exact version but cannot list or change the project artifact library. WorkOS tokens and browser cookies are not forwarded.
Connecting a server does not silently move existing artifacts. Pairing an existing Artifact Server project with a Plannotator project requires an explicit administrator action and preserves all artifact and version IDs.
The complete connection and review behavior is described in the Plannotator integration handoff.
One approval connects the products
A reachable Artifact Server connects to one Plannotator organization from one approval screen. Plannotator projects pair with Artifact Server projects. Workspaces reference artifacts from their project. Artifact Server verifies every request and serves only the paired project and named artifact or version.
Connect
An Artifact Server administrator opens Plannotator, chooses one organization, and approves the connection.
Authorize
Plannotator checks project or workspace permission and signs a short-lived request for one operation.
Open
Artifact Server creates a one-use URL and a temporary, read-only browser session for the exact version.
Review
An explicit review address adds the review bridge. Normal artifact responses and stored files stay unchanged.
Plannotator identifies the paired project and checks the caller. Artifact Server enforces a narrow request and creates its own browser session. No user account is copied.
One server, one Plannotator organization
The first Plannotator integration release does not add a multi-organization switcher to Artifact Server. The connection belongs to one Plannotator organization and can be disconnected or have its keys rotated by an administrator.
Projects own artifacts
Each Plannotator project maps to one Artifact Server project. Its workspaces reference project artifacts and exact versions. The connection adds no separate storage area, Artifact Store, or workspace-owned artifact model. Pairing an existing project is explicit and preserves artifact and version IDs.
Private servers require a route
Hosted and publicly reachable servers connect from the approval screen. A server inside a private network also needs a customer-provided route or an outbound-only connector limited to Artifact Server. The connection does not change firewall rules or provide general access to the private network.
Bounded integration work
Connection, publishing, and opening are estimated at three to five engineer-weeks. The first supported review bridge adds three to six engineer-weeks. Private networking based on an established tunnel adds two to four engineer-weeks.
These estimates exclude Plannotator's existing organizations, Workspaces product, comment system, and the normal Artifact Server product. The teams must replace the estimates after inspecting both repositories and completing the browser and network prototypes.
One product core with deployment-specific storage
The browser, MCP, command-line program, and normal web requests from software call the same application services and follow the same rules for sign-in, sharing, versions, comparisons, and publishing. These ways of calling the server intentionally overlap. Where a file exists decides which one works: the command-line program can read files on the user's computer; a remote MCP server cannot. Small pieces of code connect those rules to the database, file storage, and an optional Git provider selected by explicit installation configuration.
Saved versions and comparisons work in every deployment. Git is an optional private copy of the same history.
How a large website or file is published
- The client creates an upload and receives a unique staging location.
- It sends regular files directly to disk or cloud file storage.
- The server verifies every size and SHA-256 fingerprint and rejects unsafe or colliding paths.
- The client names the entry file, states the version it started from, and sends one idempotency key for the request.
- The server writes missing content-addressed blobs without overwriting an existing blob, saves the immutable manifest and version, and updates the current-version pointer in one database transaction.
- A retry with the same key returns the stored result. Scheduled work deletes only expired staging uploads in the first release.
Object storage and the database cannot commit atomically. The safe order is stage, verify, write each blob once, then commit the database records. The first release intentionally keeps committed or orphaned blobs. Reference garbage collection is added only after a lease-based or mark-and-sweep design survives crash, retry, and concurrent-publish tests.
How optional Git handoff works
Artifact Server always saves the version record, file list, fingerprints, and published files first. A configured provider is only available infrastructure; it creates no repository and copies no version. When an enabled project's version is durable, the server copies it in the background into one private repository for that artifact. Each saved version maps to one commit, and the database records the Git commit identifier.
Git never supplies the files used to open the artifact. If the Git provider is unavailable, the saved version remains available and the server retries the Git copy.
ARTIFACT_SERVER_GIT_HISTORY_PROVIDER=off
# Explicit opt-in when the installation has access:
ARTIFACT_SERVER_GIT_HISTORY_PROVIDER=cloudflare-artifacts
The variable is absent or off by default, and there is no
auto value. Off means no Git implementation, binding, credential, or
provider request. The Cloudflare runtime uses a configured Workers binding; other
runtimes use Cloudflare's REST control plane with operator-supplied credentials.
| Configuration | Behavior |
|---|---|
off or absent |
Normal Artifact Server behavior without Git. This is the default everywhere. |
cloudflare-artifacts |
Makes one dedicated Cloudflare Artifacts namespace available. It enables no project and creates no repository by itself. |
Every project has one durable Git-history switch, and it starts off. An administrator first sees a current-inventory estimate for repositories, versions, operations, copied bytes, and pointer bytes. Enabling that project schedules a bounded, resumable backfill. There is no installation-wide mode, inheritance rule, or automatic enablement for future projects. Browser, HTTP, and MCP use the same authorized, naturally idempotent project operation.
Disabling a project or provider stops applicable mirror work but does not delete remote repositories, jobs, or mappings; re-enabling the same project and provider resumes. Changing the persisted provider account or namespace after repositories exist requires a separate migration instead of silently moving or deleting history.
Permanent removal uses an operator-only
artifactserver history purge plan/apply command with exact
installation-ID confirmation. It is resumable and cannot delete primary artifact
data or the Cloudflare namespace. No purge surface exists in HTTP, MCP, or the
member application.
Authenticated HTTP and MCP capability discovery separately reports provider state and each project's disabled, waiting, backfilling, ready, degraded, or budget-limited state. It never exposes credentials or repository coordinates. Git provider health never controls the application's readiness check.
Deterministic per-file and per-version limits leave excluded bytes in the normal file store while path, media type, size, and fingerprint stay in the Git pointer manifest. An optional logical copied-byte budget pauses new provider writes before overshoot without affecting saved versions. Cloudflare Artifacts currently limits each repository to 10 GB and its published pricing requires Workers Paid and bills aggregate operations and storage, not a per-repository fee. Estimates are guidance rather than invoice guarantees.
Each installation environment persists one exclusive Cloudflare account and
namespace identity. The adapter has no account-wide or namespace-delete operation.
Live tests use a separate artifact-server-test- namespace, unique
run-prefixed repositories, a separate revocable token, hard bounds, and cleanup
restricted to a durable run manifest. Existing namespaces such as
workspaces remain outside that route and cleanup boundary, although
the Cloudflare control credential and billing remain account-wide. Access is not
universal, so the product remains complete when the provider is unavailable or
disabled.
Git repositories remain private. A public artifact link never grants Git access or exposes earlier versions through a Git remote.
How isolated version addresses and private delivery work
Hosted deployments use an application address plus a unique content host for each saved version:
app.example.com
v12-7f3a.content.example.net
The content domain is separate from the application's registrable domain. Each
saved version receives its own origin, so root-relative paths and service workers
stay inside that version. Application cookies are host-only. The content service
accepts only GET and HEAD, sends no credentialed CORS
responses, and cannot change application data. The application also enforces CSRF
tokens, trusted origins, and Fetch Metadata on browser mutations.
For account-required content, the application checks the viewer and creates a
short-lived, single-use bootstrap token for one version host. That host exchanges
the token for a Secure, HttpOnly, host-only content cookie. Direct loopback HTTP
uses the host-only, HttpOnly browser exception because browsers reject a Secure
cookie on *.localhost. Relative CSS, JavaScript, image, and font
requests then work without exposing an application credential. Private content is
not placed in a shared CDN cache in the first release.
The current public version uses immutable cache keys and may be cached by a CDN. Publishing a new current version or changing the artifact to account required purges the previous public version from supported caches and stops new public origin requests. It cannot revoke copies already downloaded or retained outside the server. The interface must state that limitation before it is first made public and again before access is changed.
The stable application link checks access and selects the current version. The
version link stays fixed. A static-site artifact returns 404 for a missing path.
A single-page application may return its entry HTML only for browser navigation
requests; a missing JavaScript, stylesheet, image, or other asset still returns
404. Responses use an explicit media type, nosniff, ETag, and safe
download disposition. Media supports byte ranges.
How local file links fit
Local file import is available only through the local helper, when the helper and server can read the same disk. An administrator configures allowed root folders. The helper resolves the real path, rejects symlinks and special files, verifies that every file remains inside an allowed root, and copies the current bytes into staging. Changing the original file never changes a saved version.
A remote server never accepts a client filesystem path. The agent uploads the bytes. The first release does not fetch arbitrary source URLs, which avoids a server-side request path into private networks and cloud metadata services.
How deletion, retention, backup, and restore work
A committed version cannot be edited or deleted by itself. Deleting an artifact creates a tombstone and stops every application and content link. The first release does not immediately remove blobs, because reference reclamation must not race a publish, retry, backup, or restore.
A team deployment is not ready until backup and restore preserve installation, artifact, version, manifest, and action IDs and an integrity check confirms that every referenced blob exists. Retention duration, tombstone duration, physical deletion, recovery-point target, and recovery-time target remain deployment policy and release-gate decisions.
MCP connection, sign-in, and publishing
A remote AI client connects to one address: /mcp. On an external-storage server, its
first request opens browser sign-in and approval. After approval, the client receives
a short-lived credential that works only with this Artifact Server. On a laptop, the
user runs artifactserver connect. The registered stdio bridge retrieves a
private local credential automatically and forwards to the same loopback
/mcp endpoint. The credential is never printed or put in client
configuration. MCP sends publishing instructions and small results; large website
and file uploads use the normal upload path.
| Condition | What the person does |
|---|---|
| Local laptop | Install Artifact Server and run artifactserver connect. No browser, Docker, visible token, copied key, or startup-log step. |
| Hosted or team server with compatible MCP OAuth | Add the server's /mcp address, approve sign-in in the browser, then return to the AI client. |
| Private-network server with compatible MCP OAuth | Connect to the company network or VPN first, then use the same address and browser approval. Sign-in does not change network access. |
| Self-hosted server without compatible MCP OAuth | An administrator creates a scoped API key in an administration interface or CLI. Keys never come from startup logs. |
| CI or unattended agents | An administrator creates a scoped service key and puts it in the deployment's secret manager. No browser is involved. |
Artifact Server tells the client where to sign in. WorkOS is the proposed hosted service. A private installation can use another compatible authorization service.
available options
Learn which file-upload methods, public links, and local file linking are available.
publish
Select one actual file or one finished directory. The local command-line program reads it and handles the upload.
finish upload
Name the file that should open first and the version the agent started from.
open
Receive the exact browser link from the selected local or team server, then open it on the user's computer.
compare versions
List saved versions and receive the file and text changes between any two.
One skill with routed instructions
Artifact Server ships one Agent Skill that Codex, Claude Code, and other compatible clients can install. Its entrypoint sends routine artifact work and explicit server operation work to separate internal references. An ordinary publishing request does not load deployment instructions or gain administrator access.
artifact-server · artifact work
The normal route. It is used when someone asks an agent to publish, update, open, share, list, or compare an artifact. It uses the command-line program when a local file is involved and MCP or the command-line program for server-only work. Both use the signed-in person's normal Artifact Server permissions.
- Resolve which local or team server the user means before reading, publishing, or opening an artifact.
- Ask the server what it supports before choosing an upload method.
- Publish one actual file or one finished directory through
artifactserver publish. Do not place a local path, raw source text, or base64 file contents in remote MCP arguments. - Choose the supported upload method without asking the user to construct a manifest, fingerprint, or upload session.
- Return the artifact link and exact saved version after publishing.
- Route an explicit server-operation request to its separate internal reference.
artifact-server · server operation
The administrator route. It is used only when someone explicitly asks an agent to install, deploy, upgrade, back up, restore, inspect, or repair Artifact Server. It uses Artifact Server lifecycle commands for the application and the target's native tool for infrastructure.
- Read only the instructions for the selected target: laptop, server, Kubernetes, Cloudflare, AWS, or GCP. Azure uses the Kubernetes instructions for AKS.
- Show the proposed change before applying it and verify health after it finishes.
- Require administrator access. It does not gain infrastructure access through the publishing MCP connection.
- Load only for an explicit request because its actions can change running infrastructure.
The CLI handles files on the user's computer. MCP or the CLI handles operations that only need server data. Both call the same Artifact Server product services.
How an agent chooses the local or team server
Every artifact reference includes the Artifact Server address, artifact ID, and, when needed, the exact version ID. An artifact ID by itself is not enough because the same person may use a local server and one or more team servers.
The artifact route resolves the target in this order:
- An Artifact Server address, artifact link, or named server stated in the current request.
- The server contained in an artifact reference already present in the conversation.
- The server used by the artifact most recently published or opened in the current conversation.
- The current project's configured default server.
- The user's default server.
If those rules do not produce one server, the agent asks whether to use the local or team server. It never publishes to, reads from, or opens an artifact from a guessed server.
The Artifact Server command-line program keeps named connection profiles such as
local and team. A project may contain an optional,
non-secret .artifactserver.json file that names its default server
address, connection profile, and stable project ID. It never contains a credential.
A project display name is resolved through the selected server and is never passed
where an ID is required. User defaults, recent artifact
references, and the local server's current address remain in user-local state.
Access credentials stay in the MCP client or operating-system credential store;
they are never written into the project file.
The two credential stores are intentionally separate. artifactserver
connect registers MCP in an AI client. artifactserver auth login
<server> signs the command-line program into an exact server origin,
opens browser approval when supported, and stores the renewable credential in
the operating-system credential store. Local mode uses private user-only state
without browser login or a visible key. CI uses a scoped service credential from
its secret manager.
The MCP artifact_get tool returns the exact full-screen Review address
for the current version. artifact_open returns that Review address and
the raw immutable content address for the chosen artifact and version. Agents use
the Review address for human handoff and never label the raw content address as
Review. A local helper may ask the operating system to open an address directly.
A remote server only returns addresses; the agent or client opens them on the
user's computer. The remote server never attempts to start a browser on the server
machine.
A successful publish instead returns a durable links.review address
for the exact version. MCP instructions and the publish tool's text result tell
the agent to give that full-screen commenting link to the user first, then mention
the immutable raw links.version address when it is useful. The
credential-free review address uses normal team authentication.
Skill packaging, installation, and updates
The skill uses the open Agent Skills folder format and ships in the official
Artifact Server repository under skills/artifact-server. Its
artifact and server-operation references stay separate inside that folder. After the
private plannotator/artifact-server repository is published, compatible
clients can install the skill with npx skills add
plannotator/artifact-server. A skills.sh listing follows the same controlled release.
The skill name is the portable contract. A client may display it as a slash command, but Artifact Server does not depend on slash-command spelling because that behavior differs between clients. The skill contains a short main instruction file. Detailed upload errors and deployment-specific procedures live in separate reference files that the agent reads only when required.
The artifact route does not contain a cloud-specific configuration. It resolves
the target, uses artifactserver publish when it must read a file on the
user's computer, and calls artifact_capabilities before choosing a
server-supported upload path. Operations that only need information already on
the server may use MCP or the command-line program. The same installed skill therefore works with
a laptop, private server, Kubernetes, or hosted service.
The command-line program owns its authenticated server profile and hides the create, upload, retry, and commit requests behind one publish action. Any temporary upload address is short-lived, limited to one declared file, and redacted. It is not copied from MCP or shown to the model. An exact retry after a lost response is safe. The server still verifies the declared size and SHA-256 fingerprint before it saves a version.
The skill is versioned with Artifact Server releases and tested for correct activation, routing, and output. It tells the user when the connected server is too old for a requested operation. The release process tests realistic requests that select each route and similar requests that must not activate it.
Format and distribution follow the current Agent Skills specification and the skills.sh directory and installer.
Deployment choices for MCP sign-in
| Installation | Default | What the user experiences |
|---|---|---|
| Hosted Artifact Server | WorkOS AuthKit | Add the server address, sign in and approve in the browser, then return to the AI client. |
| Private or self-hosted server | Server API key | Configure a revocable key. A compatible company authorization service may replace it. Better Auth is a candidate for optional built-in browser authorization after its current beta MCP path passes testing. |
| One laptop | Local helper and local token | The AI client starts or contacts the local server. No web sign-in is required. |
Ordinary OpenID Connect sign-in proves who a person is in a browser. It is not, by
itself, enough for an MCP client. Remote MCP also needs discovery, approval,
a credential issued for the exact /mcp address, renewal, and revocation.
The modern MCP server contract
The primary endpoint uses MCP revision 2026-07-28 and the official
TypeScript SDK version 2. Every request is independent. There is no initialization
handshake, MCP session identifier, sticky load-balancer route, or permanent event
stream. The client calls server/discover to learn supported protocol
versions and server instructions, then uses tools/list and
resources/templates/list for the current catalog. It calls
artifact_capabilities for deployment-specific limits and publishing behavior.
- Remote external-storage installations use HTTP
POST /mcp. - Normal results use JSON. Request-scoped server-sent events are reserved for useful progress.
- The first release rejects
subscriptions/listen. It is enabled only after the deployment has a real shared event service. - Modern
GET /mcpandDELETE /mcpreturn 405. Older MCP behavior is an isolated, optional compatibility path. - Every durable change has an application idempotency key. A change to an existing artifact also includes the version the caller started from. A broken connection cannot silently publish twice or overwrite newer work.
Hosted OAuth and Artifact Server's responsibility
In the hosted service, WorkOS owns the authorization page, approval screen, authorization codes, client registration, access credentials, renewal, and revoke behavior. Artifact Server remains the protected service. It publishes the standard metadata that tells clients where to sign in and verifies every credential before an MCP request reaches product code.
The credential must name the exact Artifact Server MCP address as its audience. WorkOS identity scopes do not grant artifact permissions. Artifact Server also verifies the issuer, signature, expiry, and user, then maps that user to an account admitted to this installation. Artifact Server does not copy WorkOS organizations into a second organization system. The same membership and service-capability checks used by the browser still apply.
The hosted authorization service enables Client ID Metadata Documents first and keeps Dynamic Client Registration temporarily for clients that still require it. Authorization uses the browser authorization-code flow with S256 PKCE. WorkOS credentials never pass to file storage, background workers, or published websites.
The exact wire behavior, metadata, token checks, self-hosted modes, and release test matrix are recorded in the Artifact Server MCP engineering baseline.
See the proposed MCP tools
artifact_capabilities
artifact_list
artifact_get
artifact_open
artifact_create_upload
artifact_commit_upload
artifact_set_visibility
artifact_set_tags
artifact_version_list
artifact_diff
artifact_restore_version
artifact_delete
Each tool has a strict input and output schema. Publishing returns the artifact, immutable version, canonical manifest digest, and browser links. Management tools return the exact artifact or deletion state they changed. Git is not part of the MCP result contract.
One read-only MCP resource returns the canonical manifest for a selected version. Full websites and file bytes return ordinary HTTPS links instead of being copied into the AI conversation.
How agents connect and avoid overwriting newer work
Remote agents use HTTP POST /mcp. On the same computer, a small
command-line helper or loopback listener uses a local token and calls the same
product service. The helper never writes directly to the database.
Every change includes the version the agent believes is current. If newer work exists, the server returns the actual current version and tells the agent what to read before trying again. Retrying the same idempotency key returns the same result. Starting a new publish with a new key creates a new version even when the bytes match an earlier version. Creating a brand-new artifact has no earlier version. Creating an uncommitted upload is temporary preparation and does not alter an artifact.
Compatibility and release checks
The released July 2026 protocol is the product target. Compatibility with older MCP clients is not mixed into the modern path. If a required client still uses the older initialization handshake, an administrator can enable a separately tested compatibility handler.
Release testing covers current Codex, Claude Code, Claude.ai, and at least one DCR-only client. Each is tested with a fresh connection, an old cached connection, an expired credential, a revoked grant, a wrong audience, an invalid origin, and a user who has not been admitted to that installation. Claude.ai can reach only Artifact Servers exposed to Anthropic's cloud; a server reachable only inside a private network is not supported there.
Supported deployment targets
The first release supports a local owner and a private team. A local installation starts as one process running directly on the host with one data folder and does not require Docker. A team deployment may run several copies of the application, all using the same database and file storage. The product defines runtime and storage interfaces; official infrastructure packages select the provider-specific services.
First release: local owner
One process runs directly on the host with one SQLite database file and local disk. Docker is optional. Opening the loopback management address creates a normal local-owner session without a sign-in step. Local browser addresses use *.localhost, so no DNS or certificate setup is required.
First release: private team
Compact Compose runs one container with SQLite and attached disk. External-storage Compose uses the same image with existing Postgres and object storage, and it can run multiple application processes. Each teammate signs in through the installation's configured OpenID Connect or WorkOS provider.
Cloudflare
Cloudflare Workers, D1 records, R2 files, nearby copies of public files, and off-by-default Cloudflare Artifacts handoff.
AWS, GCP, and Azure
AWS uses ECS Fargate, RDS PostgreSQL, and S3. GCP uses Cloud Run, Cloud SQL PostgreSQL, and Google Cloud Storage. Azure teams use the Helm chart on AKS.
Each standalone deployment is one installation for one person or team. The hosted artifactserver.com service may run many isolated installations on shared Cloudflare infrastructure. The installation identity comes from trusted authentication and routing, never from a caller-supplied filter. Tenant-scoped storage APIs, composite keys, cache keys, signed links, background jobs, backups, and restore tests enforce the boundary.
Product rules, artifact IDs, version behavior, comparisons, links, and permissions stay the same. Only the runtime and storage adapters change.
| Environment | How it runs | Where records are stored | Where files are stored | Optional Git handoff | Can it read local files? |
|---|---|---|---|---|---|
| Laptop | Artifact Server runs directly on the host. A local container is optional. | SQLite | Local disk | Off by default; Cloudflare Artifacts through REST when explicitly configured | Yes. The local publishing client reads a user-selected path with that user's operating-system permissions, validates it, and uploads bytes immediately. |
| One server, compact | One software container | SQLite | One persistent local or attached data directory | Off by default; Cloudflare Artifacts through REST when explicitly configured | Only when a publishing client runs on that server. Artifact Server itself never accepts a filesystem path through HTTP or MCP. |
| One server, external storage | One or more stateless software containers | Existing Postgres | Existing S3-compatible object storage | Off by default; Cloudflare Artifacts through REST when explicitly configured | Only when a publishing client runs on that server. Artifact Server itself never accepts a filesystem path through HTTP or MCP. |
| Kubernetes | Node.js containers that keep no data on their own disks | Postgres | S3, Google Cloud Storage, a tested compatible object store, or the preview Azure Blob adapter | Off by default; Cloudflare Artifacts through REST when explicitly configured | Normally no |
| Cloudflare | Cloudflare Workers | D1 | Cloudflare R2 | Off by default; Cloudflare Artifacts through the Workers binding when explicitly configured | No |
| AWS | ECS Fargate | RDS PostgreSQL | Amazon S3 | Off by default; Cloudflare Artifacts through REST when explicitly configured | No |
| GCP | Cloud Run | Cloud SQL PostgreSQL | Google Cloud Storage | Off by default; Cloudflare Artifacts through REST when explicitly configured | No |
How it is installed and how people sign in
The product ships as a downloadable local package that does not require Docker, one optional container image, Compact Compose and External-storage Compose for one server, a Helm chart for Kubernetes, a pinned Alchemy project for Cloudflare, and pinned Pulumi projects for AWS and GCP. Operators use Compose, Helm, Alchemy, or Pulumi directly. Artifact Server does not hide their plans behind another deployment command. Each package emits the same required URLs, resource IDs, and secret-free support information.
Teams that already run Kubernetes use the Helm chart on EKS, GKE, AKS, or their own cluster. The chart installs only Artifact Server and connects to the team's existing Postgres, file storage, secrets, DNS, TLS, and Ingress or Gateway. The AWS and GCP Pulumi projects are turnkey alternatives for teams that do not want to operate Kubernetes. Azure teams use the same Helm chart on AKS. The AWS default uses ECS Fargate; it does not create or replace an existing EKS cluster.
Browser login and MCP authorization are separate protocols even when they use the same identity provider. Team browser login uses WorkOS AuthKit or any OpenID Connect provider, configured directly on the installation; one installation configures one browser-login provider. Hosted MCP connections use WorkOS AuthKit. Private installations can use server API keys or a compatible authorization service. A single-user installation may rely on the operating-system account or a local token.
How the same code works with different databases and file storage
The product rules do not know which database or file storage is in use. Each deployment supplies small pieces of code for saving records, saving files, signing users in, and running cleanup work. The product rules do not call Node.js file functions or a specific database library directly. Optional Git handoff follows the same rule through one small provider interface.
- Laptop: one process runs directly on the host by default, with SQLite for records, files stored on disk by their SHA-256 fingerprints, and optional local file links. Cloudflare Artifacts may be configured through REST. Docker is optional.
- One server, compact: one process, SQLite in write-ahead logging mode, and one persistent data directory. Cloudflare Artifacts may be configured through REST. This profile does not support multiple application writers or claim failover.
- One server, external storage: the same image connected to existing Postgres and object storage through a supported adapter. The Compose package does not bundle those providers.
- Kubernetes: Postgres plus S3, Google Cloud Storage, R2, a tested compatible object store, or the preview Azure Blob adapter. Cloudflare Artifacts may be configured through REST. This is the official Azure path on AKS.
- Cloudflare: Workers for the application, D1 for records, R2 for files, and off-by-default Cloudflare Artifacts handoff through a configured Workers binding. External Postgres is supported through a separate adapter but is not the default.
- AWS: ECS Fargate, RDS PostgreSQL, and S3 through the AWS Pulumi project.
- GCP: Cloud Run, Cloud SQL PostgreSQL, and native Google Cloud Storage through the GCP Pulumi project.
The storage boundary uses product operations such as “publish this version only if the current version has not changed,” not a generic function that sends raw SQL to any database. SQLite/D1 and Postgres keep their own migrations, indexes, transactions, and optimized queries. External-storage tests prove that publishing, access, versions, and cleanup behave the same.
The first external-storage package supports AWS S3 and Cloudflare R2 through its S3 adapter. Another S3-compatible service is supported only after it passes the same storage contract tests. Native Google Cloud Storage ships with the GCP package. The Azure Blob adapter is preview-only until a live Azure qualification passes. Adding an adapter does not change artifact or version rules.
What every cloud package receives and returns
Every package receives the installation name, environment, region, pinned application image, application domain, separate content domain, initial administrator email, public or private ingress choice, replica limits, CPU, memory, database size, backup retention, deletion protection, network choice, and optional WorkOS and telemetry references. Secret inputs are references to the provider secret manager, not secret values in ordinary configuration.
Every successful deployment returns the installation ID, application, MCP, health, and readiness addresses, content domain, deployed image digest, runtime, database, file-store, workload-identity, network, and secret resource IDs, log destination, infrastructure-state location, and support-manifest location. It never returns a password, API key, access token, signed file address, or cloud credential.
Pulumi projects require an existing state backend or Pulumi Cloud and a selected secrets provider. The Cloudflare project uses Alchemy's Cloudflare state store for team and automated deployments. The main application stack does not create the bucket that contains its own infrastructure state.
When Caddy, DNS, and certificates are needed
Local use on the same computer needs none of them. Artifact Server binds to
loopback and uses *.localhost. The same rule applies to an optional
local container reached only from that computer.
A one-server installation opened from other devices needs HTTPS routing for the application address and the wildcard content address. Caddy is the documented example only when the team has no existing reverse proxy. Nginx, Traefik, HAProxy, or a company gateway can be used when it passes the same routing, upload, and TLS tests. Kubernetes uses its Ingress or Gateway. Cloudflare and managed-cloud packages use their provider edge. Those deployments do not run Caddy.
Why D1 is the Cloudflare launch default and what must be proven before it grows
D1 stores small relational records: installations, accounts, artifacts, saved versions, file paths, fingerprints, access settings, credentials, and cleanup state. R2 stores the artifact files. An artifact file never goes into D1.
The hosted service starts with one production D1 database. The authenticated
installation identity is bound before product code reaches storage. Composite
database keys, R2 prefixes, cache keys, signed links, jobs, backups, and restore
paths all include that trusted identity through a tenant-scoped storage API.
Remembering to add an installation_id filter is not an adequate boundary.
The proposal does not claim that adding D1 databases is automatic. Before a second database, the team must choose and load-test either a D1 directory plus safe binding rollout or an external Postgres control plane. That decision must cover provisioning, tenant moves, retries, backups, restore, and rollback.
D1 has a hard 10 GB limit per paid database and processes writes through one primary database. Global read replicas can reduce read latency when the Sessions API is used, but they do not scale writes. Artifact metadata remains much smaller than the files in R2. Measurements decide whether D1 sharding or external Postgres is the safer growth path.
D1 scales to zero and includes substantial monthly reads and writes on Workers Paid. R2 stores Standard files for $0.015 per GB-month beyond the included allowance and does not charge for internet data transfer. External Postgres would add another provider, region, connection pool, credentials, backups, and another network failure path.
Publishing across D1 and R2 follows this order:
- Upload each file to a unique staging key.
- Verify size and fingerprint, then create the final blob without overwriting an existing object.
- Commit the manifest and version in D1 only if the current version is still the expected version.
- Return the recorded result when the same idempotency key is retried.
- Delete only expired staging uploads in the first release. Keep committed and orphaned blobs until a concurrency-safe garbage collector exists.
Current platform references: D1 limits, D1 pricing, D1 global read replication, and R2 pricing.
Treat every published website as untrusted code.
A published website may run arbitrary browser JavaScript. The architecture isolates each saved version and keeps application credentials out of the content origin.
Unique origin for every version
The application and content use separate registrable domains. Every saved version gets a unique content host. Application cookies are host-only; content is read-only; credentialed CORS is disabled; browser changes require a CSRF token, trusted Origin, and valid Fetch Metadata.
Private content session
Account-required content begins at the application. After permission is checked, a single-use token creates a Secure, HttpOnly, host-only session for one exact version host. Direct loopback HTTP uses the host-only, HttpOnly browser exception because browsers reject a Secure cookie on *.localhost. Relative assets use that session. It grants no write operation and no access to another version.
Public links cannot recall copies
Changing a public artifact back to account required purges supported caches and stops new public requests. It cannot revoke files already downloaded or cached outside the service. The product states this before the change.
Safe upload inputs
Portable manifest rules reject path traversal, absolute paths, symlinks, special files, duplicate normalized names, and case or Unicode collisions. A local publishing client reads only files allowed by its operating-system identity and uploads their bytes immediately. HTTP and MCP never accept a client filesystem path or fetch an arbitrary URL.
Tenant-scoped storage
The installation identity comes from trusted authentication and routing. Product code cannot issue an unscoped database, object-store, cache, background-job, backup, or restore operation. Cross-tenant tests cover every one of those paths.
Private Git handoff
Optional Git repositories remain private. Making an artifact available through a public link never grants Git access or exposes its earlier versions through a Git remote.
Recorded responsibility
Publishing actions record the signed-in user, agent, or automated account that performed the action.
Server policy
Administrators control login, whether public links are allowed, file limits, retention, network rules, and accepted file types. A future hosted-service operator may separately define abuse reports, phishing and malware response, quotas, egress limits, and content-domain reputation; those policies are not core OSS release requirements.
Product scope
The product supports the shortest path from finished output to a stable browser link. The implementation section phases delivery; this section defines the final product boundary.
Included
- Finished client-side output directories and arbitrary individual files.
- Saved versions that never change, plus the ability to restore an earlier one.
- File and text comparisons between any two saved versions.
- Optional private Git handoff, off by default and selected by explicit installation configuration.
- Exactly two access settings: account required and public link.
- Browser access, MCP, the Artifact Server command-line program, and normal web requests from software.
- An optional connection from one Artifact Server installation to one Plannotator organization, including signed operation requests and temporary browser sessions.
- An explicit Plannotator review response that may add a credential-free review bridge without changing the stored artifact.
- One portable
artifact-serverskill with separate artifact and explicit server-operation references. - Local, one-server, Kubernetes, Cloudflare, AWS, and GCP deployment packages delivered in stages. AKS uses the Kubernetes package.
Not included
- Review status, notifications, or workspace collaboration. Plannotator provides these features. Artifact Server does store comment threads on its own artifact versions.
- A general-purpose Git service for arbitrary source-code repositories. Optional Git handoff exists only for Artifact Server artifacts.
- Installing packages or turning source code into a finished application.
- Code inside an artifact that must run on the server.
- Media conversion, thumbnails, ZIP extraction, Markdown rendering, source-code highlighting, custom PDF viewing, or specialized binary comparisons in the first release.
- Fetching arbitrary source URLs from the server.
- Add-ons that run inside Artifact Server.
- A separate Artifact Server-managed member list for every project or artifact. Projects use installation membership. Plannotator may authorize a narrow delegated request before sending it.
- Automatic firewall changes or a general-purpose tunnel into a customer's network. An optional connector may expose only the paired Artifact Server service.
Implementation order
Each stage keeps the same product behavior. Code that connects a deployment to its database and file storage must not copy or change the product rules.
One complete local product
Start with one installation and one default project. Add more projects without
adding an organization or Artifact Store layer. Build saved versions that never
change, comparisons between versions, support for complete client-side output
directories, the separate artifact website, SQLite and
local file storage, the modern stateless MCP route, web publishing,
artifactserver connect and the credential-hidden local stdio bridge,
the two sharing modes, with Git handoff off by default. Add secure
command-line profiles and make
artifactserver publish the local-file path. Ship the
artifact-server skill after its CLI and MCP routing is stable.
Reject MCP subscriptions until a real event service exists. Ship it as one running application.
The external-storage server
Keep SQLite for a single-server installation. Add Postgres and cloud file storage
for Kubernetes or any deployment with multiple application replicas. Support S3,
Google Cloud Storage, R2, compatible object stores, and a preview Azure Blob adapter through one
narrow interface. Add browser login, API-key and external-issuer modes for private
deployments, staged direct uploads, expired-staging cleanup, a Docker image, a
Compose file, a Helm chart, backup and restore, and optional private Git handoff.
Add structured request logs, standard OTLP export for logs, metrics, and traces,
and separate process-health and dependency-readiness checks.
Enable the artifact-server server-operation reference after install,
upgrade, backup, restore, and health-check workflows are stable and tested.
The Plannotator connection
Add browser approval for one Plannotator organization, direct project pairing, signed requests limited to one project and operation, a single-use private artifact address, disconnect and key rotation, and connection audit records. A workspace reference may open one exact version but cannot manage the project library. Ship top-level private opening first. Add review mode only after the bridge passes hostile-artifact and browser tests. Use customer-provided networking or an established tunnel before building a product-owned connector.
The optional Cloudflare deployment
Add Cloudflare Workers, D1 records, R2 file storage, and the optional Cloudflare Artifacts provider. Enforce tenant-scoped storage from trusted routing. Start the hosted service with one D1 database. Before a second database, select and test a D1 directory and binding rollout or external Postgres control plane. Copy to Git only after the normal saved version is complete, and retry temporary failures. Verify file delivery with and without an account, upload limits, complete website behavior, comparisons, and signed-in MCP access over the web.
Official AWS and GCP packages
Ship direct, pinned Pulumi projects for ECS Fargate on AWS and Cloud Run on GCP, with managed PostgreSQL and each provider's native object store. Test install, upgrade, rollback, backup, restore, private networking, and removal independently for each provider. Do not claim a provider is supported until those tests pass.
How we know each release is ready
- Local:
artifactserver connectworks in every advertised local client without browser sign-in, Docker, a visible key, copied secret, or log inspection; one service then publishes one file and a complete static site, opens the unique version host, compares versions without Git, retries safely, and survives a restart. - Private team: account-required subresources load, forbidden mutations fail, backup and restore preserve IDs, and cross-tenant and hostile-path tests pass on one server and Kubernetes.
- Optional Cloudflare package: WorkOS MCP sign-in, R2 staged uploads, D1 transactions, public cache purge, private no-cache delivery, tenant isolation, and a restore drill pass. Service-operator policy is separate from core OSS conformance.
- Plannotator connection: one-click approval, cross-organization rejection, signed-request scope, one-use browser links, disconnect, key rotation, exact-version comments, hostile review-page tests, and private-route failure and recovery all pass.
- Major clouds: every provider package passes install, upgrade, rollback, backup, restore, private-network, and removal tests before support is advertised.
- All releases: browsers open native file types without a conversion service; arbitrary URL fetch is absent; optional Git failure never blocks or loses the primary saved version.
Decisions made by this proposal
These choices make the proposal internally consistent. The remaining unknowns are explicit release gates, not implied promises.
The product stores and serves finished client-side sites and arbitrary files. The browser handles supported formats natively. The server does not run artifact backends or perform file conversion.
An artifact keeps one identity. Each intentional publish creates an immutable version with a canonical manifest and unique version origin. Restoring only changes which version is current.
A retry with the same idempotency key returns the stored result. A new key creates a new version even when the manifest matches an earlier version.
An artifact may have up to 20 normalized tags for exact filtering. Tags belong to the artifact, persist across version changes and tombstones, and are replaced through one authorized, idempotent, audited operation. The first release has no tag hierarchy or per-version tags.
Comparisons use canonical manifests and changed text. Binary comparison shows metadata and links. Git is not required.
Git handoff is an optional private copy that is off by default and never selected automatically. Configuring Cloudflare Artifacts makes it available but copies nothing until an administrator estimates and enables selected projects or explicitly selects all projects. Each artifact has its own repository. The normal object store remains authoritative, and Git failure or a copy budget never blocks or loses a saved version.
Account required and public link are the only two read settings. A public link opens only the current version; history and comparisons still require an account. Every admitted human member may manage project artifacts; services require explicit capabilities.
One installation represents one person, team, or company and contains projects. Every artifact belongs to one project. A new installation creates a default project. There is no organization switcher or separate Artifact Store object.
Projects use installation membership and have no separate member list or access-control list in the first release. Project identity is enforced by storage, authorization, HTTP, MCP, browser sessions, audit, backup, and restore.
One Artifact Server installation may connect to one Plannotator organization. Each Plannotator project pairs with one Artifact Server project. Workspaces reference project artifacts and versions; they do not own artifact storage.
Plannotator checks project or workspace access and sends a short-lived, audience-restricted request. A workspace reference may open one exact version but cannot list or mutate the project artifact library. Artifact Server verifies the request and creates its own one-use browser address and read-only content session. User accounts and browser login cookies are not copied.
An explicit review address may add a credential-free review bridge to HTML responses for that session. Normal responses and stored versions remain unchanged. Plannotator stores every comment and review record.
A private connected server uses a customer-provided route or an outbound-only connector limited to Artifact Server. Connecting never changes firewall rules or exposes the rest of the private network.
Every saved version uses a unique host on a content domain separate from the application domain. Private subresources use a version-scoped content session; public content may use immutable CDN caching.
Changing public content back to account required stops future public access and purges supported caches, but cannot recall downloaded or externally cached copies.
Manifest paths follow one portable safety contract. Publishing clients upload bytes. A local client may read a user-selected path with its operating-system permissions, but HTTP and MCP never receive that path. The server does not fetch arbitrary source URLs.
Uploads stage, verify, then write content-addressed blobs without overwrite before the database commit. The first release deletes expired staging only and does not garbage-collect committed blobs.
Browser, normal software requests, the command-line program, and MCP share the same product and authorization rules. Local MCP uses artifactserver connect without a human-visible secret. Hosted MCP uses browser approval through WorkOS AuthKit. Self-hosted MCP uses compatible browser authorization when configured and administration-issued scoped API keys otherwise. Startup logs never distribute keys.
MCP and the command-line program intentionally overlap. Files on the user's computer use the command-line program. Work that only needs information already on Artifact Server may use either. artifactserver auth login gives the command-line program its own secure server profile. A remote MCP server never reads a user's local path.
Artifact Server ships one router skill with separate artifact and server-operation references. The artifact route uses the command-line program for local files and MCP or the command-line program for information already on the server. The server-operation route loads only for explicit administrator work. Stored references include the server and artifact, so agents open local or team artifacts at the correct address.
The product core uses narrow database, file-storage, login, background-work, and optional Git interfaces. Operators use Compose for one server, Helm for Kubernetes, Alchemy directly for Cloudflare, and Pulumi directly for AWS and GCP. Artifact Server does not add an infrastructure wrapper.
Azure has no separate installer or release claim. Azure teams use Helm on AKS. The Azure Blob adapter remains preview until it passes a real Azure storage test.
Support is phased: the simple local OSS tool first, then private team and Kubernetes packages, optional Cloudflare, and direct AWS and GCP packages. A target is not supported until its install, upgrade, rollback, backup, restore, and isolation tests pass. Optional artifactserver.com operating policy is not a core OSS release gate.
Committed versions cannot be edited or deleted individually. Deleting an artifact creates a tombstone and stops access; physical reclamation waits for a proven retention and garbage-collection design.
Known unknowns and required failure probes
- Private site delivery: current tests exercise the bootstrap token and version-scoped content cookie, but the complete supported-browser and per-deployment matrix remains open.
- Version origins: local
*.localhostbehavior and a real Cloudflare wildcard TLS probe have evidence. Equivalent DNS, certificate, proxy, and hostile-host proof remains open for each deployment before support is advertised. - Cloudflare Artifacts: complete bounded live binding, REST, smart-HTTP, token, project-switch, estimate, budget, namespace-isolation, run-manifest cleanup, backfill, disable, deletion, recovery, limits, jurisdiction, and cost probes before advertising the off-by-default provider. The product must remain complete without access, and tests must not touch another namespace.
- WorkOS MCP: browser approval, resource-bound tokens, refresh, revocation, reconnect, DCR, and CIMD pass for Codex and Claude Code. Visual Studio Code and claude.ai are deferred client qualifications, not first-release gates.
- Embedded self-hosted OAuth: decide whether Better Auth's beta MCP path is mature enough; API keys and compatible external issuers remain the default until it passes the same hostile tests.
- Cross-cloud packages: selected live AWS, GCP, and Cloudflare lifecycle probes have evidence, but no direct-cloud package has complete signed conformance proof. The AWS private-ingress variant remains unqualified.
- Optional hosted-service policy: quotas, egress limits, abuse response, phishing and malware handling, reporting, suspension, and domain reputation belong to a future artifactserver.com operator, not the core OSS first release.
- Capacity claims: the OSS release need not advertise universal capacity or cost envelopes. Any target-specific claim must be backed by measured evidence.
- Recovery: define retention, tombstone duration, backup schedule, restore procedure, recovery-point and recovery-time promises, and an operator-visible integrity check.
- Optional enterprise policy: encryption keys, regional placement, audit export, legal hold, deletion proof, data residency, and regulated-content boundaries are outside the simple first release.
- Custom domains: decide whether customer domains are supported and, if so, how certificates, version isolation, cookies, cache purge, domain takeover, and service workers remain safe.
- Plannotator review bridge: test the isolated review response against hostile artifact JavaScript, strict content policies, multi-page sites, single-page routes, service workers, anchor stability, session expiry, and browsers without third-party cookies. Use a browser extension if the bridge cannot pass without exposing a reusable credential.
- Existing project binding: decide how an existing Artifact Server project pairs with a Plannotator project, including name conflicts, existing artifacts, unlinking, rollback, archival, and reconnect behavior. Pairing must not silently move artifacts or change IDs.
- Private Plannotator route: choose the first supported path among customer-provided networking, Cloudflare Tunnel, or a product-owned connector. Define health, upgrades, replicas, egress addresses, and failure behavior before advertising one-click private connection.