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.

August 15, 2026 Product proposal Local, server, Kubernetes, Cloudflare, AWS, GCP

Product summary

Proposed behavior, access, deployment, and scope.

Supported web content

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.

Who can open it

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.

Organization and projects

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.

Agents

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.

Sending annotations to an agent

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.

Deployment

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.

Not included

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.

index.html

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.

report.md

Documents and data

Markdown, text, JSON, source code, and other readable files.

video.mp4

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.

ActorRead account-requiredPublishChange access or delete
Admitted personYesYesYes
Service principal or API keyOnly within its grantOnly within its grantOnly 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.

Connection and private artifact opening

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.

Required request path The connector is needed only when Plannotator cannot reach the server.
Plannotator and Artifact Server connection flow A person signs in to Plannotator. Plannotator identifies the paired project, checks project or workspace access, and sends a signed operation request through a direct connection or optional outbound connector. Artifact Server verifies the project-scoped request, reads the exact saved version, and returns a one-use browser address. Review mode adds a temporary bridge while comments remain in Plannotator. PERSON OR AGENT Browser Sign in and approve AI client Publish or open Artifact tab Exact saved version PLANNOTATOR Sign-in and organization WorkOS session stays here NO ACCOUNT COPY Project or workspace check Allow the narrow action SIGNED REQUEST · FIVE MINUTES OR LESS Comments and review state Exact artifact + version reference PRIVATE ONLY Connector CONNECTED ARTIFACT SERVER Connection verifier Connection, scope, expiry REJECT EVERYTHING ELSE Project artifact Manifest, versions and comparison PAIRED PROJECT · EXACT VERSION Browser response Normal or explicit review mode 1 · SIGN IN 2 · ACTION 3 · DIRECT SIGNED REQUEST PRIVATE ROUTE 4 · ONE-USE URL → FIRST-PARTY CONTENT SESSION REVIEW ANCHOR MESSAGES
Required access path Review-only message The connector carries Artifact Server traffic only

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.

System boundaries and data flow

Saved versions and comparisons work in every deployment. Git is an optional private copy of the same history.

Runtime architecture Solid lines are required. Dashed lines are optional integrations.
Artifact Server runtime architecture People and agents call the Artifact Server application. One installation contains projects, projects contain artifacts, and artifacts contain immutable versions. The application stores records and files, computes comparisons, and serves artifacts from an isolated content address. Optional Git stores a private history copy. Plannotator remains a separate product that owns its organization membership, project and workspace records, comments, and review state; each Plannotator project pairs with one Artifact Server project. CALLERS People Browser Command line AI agents MCP · command line Normal web requests ARTIFACT SERVER APPLICATION Application entry Browser, HTTP, MCP and command line Product rules Publish, share, restore and check permissions Records Artifacts, versions, access SQLite · Postgres · D1 Published files Files addressed by fingerprint Disk · S3 · GCS · R2 Azure Blob is preview Comparison engine File list and text changes between saved versions Background work Staging cleanup and optional Git copy retries ISOLATED VERSION ORIGIN Artifact website HTML, files and downloads Unique host · read-only OPTIONAL PRIVATE GIT Git handoff provider Cloudflare Artifacts · off by default SEPARATE PRODUCT Plannotator Organization + project records Sharing, comments and review BROWSER MCP / HTTP SAVE VERSION RECORD SAVE FILES READ FILES COPY AFTER SAVE SERVICE REQUESTS + IDS
Required request or data flow Optional integration Green storage is durable
What happens when version 12 is published The browser link becomes available before an optional Git copy finishes.
Publishing and version comparison sequence A client publishes version 12. Artifact Server saves its records and files, returns stable links, and can compare version 11 with version 12. When enabled, Git receives an asynchronous private copy that may retry without blocking publication. Person or agent Artifact application Primary storage Optional Git provider PRIVATE COPY 1 Publish finished files as version 12 2 Save record, manifest and files 3 Version 12 is durable 4 Return main link and version link VERSION 12 CAN NOW OPEN 5 Copy commit after save RETRY ON FAILURE Compare version 11 with version 12 from primary storage
Rule 01 Browser, MCP, and software requests follow the same rules. Rule 02 Saved versions and comparisons do not depend on Git. Rule 03 Large files upload directly to file storage. Rule 04 Artifact JavaScript cannot use the application login.
How a large website or file is published
  1. The client creates an upload and receives a unique staging location.
  2. It sends regular files directly to disk or cloud file storage.
  3. The server verifies every size and SHA-256 fingerprint and rejects unsafe or colliding paths.
  4. The client names the entry file, states the version it started from, and sends one idempotency key for the request.
  5. 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.
  6. 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.

ConditionWhat the person does
Local laptopInstall Artifact Server and run artifactserver connect. No browser, Docker, visible token, copied key, or startup-log step.
Hosted or team server with compatible MCP OAuthAdd the server's /mcp address, approve sign-in in the browser, then return to the AI client.
Private-network server with compatible MCP OAuthConnect 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 OAuthAn administrator creates a scoped API key in an administration interface or CLI. Keys never come from startup logs.
CI or unattended agentsAn administrator creates a scoped service key and puts it in the deployment's secret manager. No browser is involved.
Remote connection and browser sign-in

Artifact Server tells the client where to sign in. WorkOS is the proposed hosted service. A private installation can use another compatible authorization service.

Connection flow The access credential is valid only for the exact Artifact Server address.
MCP connection and authorization flow An AI client contacts Artifact Server, reads its sign-in instructions, opens a browser at the configured sign-in service, receives a credential for this Artifact Server, and then calls publishing tools. Large file bytes upload separately to file storage. AI CLIENT Codex or Claude Stores the server address OAuth client Opens the browser proves it started sign-in PKCE · refresh · revoke ARTIFACT SERVER POST /mcp Returns sign-in instructions when no credential is present Credential check Issuer · server address expiry · signature · user Artifact product rules Permissions, publish, versions, access settings and comparisons The same service used by the browser and normal HTTP API Direct upload storage Website and file bytes do not pass through MCP messages SIGN-IN SERVICE Browser sign-in WorkOS for hosted service or a compatible private service Issue credential Only for this /mcp address short life · renewable · revocable 1 first request 2 sign-in location 3 browser opens; user signs in and approves 4 client receives and stores the credential 5 Later MCP calls include the credential 6 verified user and permissions 7 direct upload plan LAPTOP MODE Local helper + local token No browser OAuth is required.
Required Artifact Server path Replaceable sign-in provider
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 skill routes by work type and file location.

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.

One product, two ways to call it The user asks for an operation; the skill selects MCP or the command line.
Agent Skill workflow A routine artifact request activates the artifact-server skill and its artifact reference. The skill finds the intended local or team server. It uses the Artifact Server command-line program for files on the user's computer and MCP or the command-line program for information already on the server. An explicit administrator request activates the same skill and its server-operation reference, which uses Compose, Helm, Alchemy, or Pulumi directly. ROUTINE PUBLISHING User request “Publish this site” artifact-server Loads artifact reference Find server + files Files here or already on server MCP or CLI Same product services · same policy SERVER OPERATION · OPTIONAL Admin request “Deploy to GCP” artifact-server Loads operation reference Native tool Compose · Helm · Alchemy · Pulumi Target infrastructure Server · Kubernetes · cloud
Normal user permission · MCP or CLI Separate administrator permission
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:

  1. An Artifact Server address, artifact link, or named server stated in the current request.
  2. The server contained in an artifact reference already present in the conversation.
  3. The server used by the artifact most recently published or opened in the current conversation.
  4. The current project's configured default server.
  5. 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 /mcp and DELETE /mcp return 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.

One product, four runtime shapes

Product rules, artifact IDs, version behavior, comparisons, links, and permissions stay the same. Only the runtime and storage adapters change.

Deployment map Git handoff is off by default in every column.
Deployment architecture map The same Artifact Server product rules connect to different application runtimes, databases, file stores, and optional Git providers on a laptop, one server, Kubernetes, and Cloudflare. AWS and GCP use direct managed-cloud packages. Azure uses the Kubernetes shape on AKS. SHARED CORE Publish · versions · compare · share · permissions · MCP The same tests and visible behavior run in every deployment. LAPTOP Direct host process Docker optional SQLite Artifact records Local disk Published files ONE SERVER Artifact Server container Compact profile SQLite + persistent disk External storage Postgres + S3-compatible KUBERNETES Stateless application Multiple containers Postgres + S3-compatible External records and files Cloudflare Artifacts Optional through REST CLOUDFLARE Cloudflare Workers D1 + R2 Records and published files Cloudflare Artifacts Optional Workers binding
Required component Off-by-default Git handoff
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.

Hosted storage growth Start with one D1 database. Choose and test a control plane before adding another.
The hosted Artifact Server launch shape and possible D1 growth path People and agents call one Cloudflare Worker. Trusted routing binds an installation to one D1 database and tenant-scoped R2 prefix. The service starts with D1 database zero. A tested directory and binding rollout or external Postgres decision is required before adding another database. CALLERS People and agents Browser · MCP · HTTP One installation ID per request CLOUDFLARE WORKER Artifact Server Authenticate and apply product rules Select storage Bind trusted installation to a database and R2 prefix START HERE D1 database 0 Installation records REQUIRES A CONTROL PLANE D1 database 1+ Possible new installations ARTIFACT FILES R2 bucket Immutable files Key begins with installations/{id}/
Used at launch Added after measured need

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:

  1. Upload each file to a unique staging key.
  2. Verify size and fingerprint, then create the final blob without overwriting an existing object.
  3. Commit the manifest and version in D1 only if the current version is still the expected version.
  4. Return the recorded result when the same idempotency key is retried.
  5. 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-server skill 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.

First

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.

Next

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.

Then

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.

Then

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.

After

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 connect works 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

  1. 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.
  2. Version origins: local *.localhost behavior 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. Capacity claims: the OSS release need not advertise universal capacity or cost envelopes. Any target-specific claim must be backed by measured evidence.
  9. Recovery: define retention, tombstone duration, backup schedule, restore procedure, recovery-point and recovery-time promises, and an operator-visible integrity check.
  10. 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.
  11. 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.
  12. 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.
  13. 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.
  14. 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.