Skip to content

Docs / Artifact storage

Artifact storage

Agents store files (screenshots, reports, builds) in your own S3 bucket or the platform bucket. Presigned URLs; expiry by policy.

Artifact storage

Agents produce files: screenshots, test reports, build outputs, generated code. developerz.ai stores these as artifacts — objects in an S3-compatible bucket with presigned URLs for upload and download. Bucket credentials stay server-side; you only ever see short-lived presigned URLs.

Storage options

Option Setup Default expiry Max expiry
Platform bucket Zero config. Available on all tiers. 7 days 7 days (fixed)
BYO S3 Connect any S3-compatible bucket in Settings → Storage. 7 days Unlimited

To lift the 7-day cap or keep artifacts longer than a week, connect your own bucket. The artifact.put MCP verb surfaces expiry_capped: true (with an explanatory note) if you request a longer expiry on the platform bucket.

Connecting a BYO bucket

  1. Go to Settings → Storage in the dashboard.
  2. Enter your bucket name, endpoint, region, access key, and secret.
  3. Click Test connection — the platform writes and reads a sentinel object.
  4. Save.

Supported: Amazon S3, Cloudflare R2, Backblaze B2, MinIO, and any s3:// endpoint that implements PutObject, GetObject, HeadObject, and DeleteObject.

Uploading an artifact

# MCP — register the artifact and get a presigned PUT url
artifact put \
  --content-type "image/png" \
  --filename "screenshot.png" \
  --size 204800 \
  --expires-in "7d"
# → { id: "art_…", upload_url: "https://…", upload_expires_in_seconds: 300 }

# Upload the bytes (from the agent or your machine)
curl -X PUT -H "Content-Type: image/png" \
  --data-binary @screenshot.png \
  "<upload_url>"

The upload_url is a presigned PUT that expires in 5 minutes. Upload before then; the artifact row is created immediately (so artifact list sees it even if bytes haven't landed yet, with has_bytes: false).

Downloading / sharing

# Get a presigned download URL
artifact get --artifact-id art_…
# → { url: "https://…", expires_in_seconds: 3600 }

# Mint a fresh URL for an existing artifact (e.g. to share with a user)
artifact share --artifact-id art_…

Presigned download URLs expire in 1 hour by default. Refresh with artifact share.

Expiry model

Field Accepted values Default
expires_in "1h", "12h", "1d""365d" "7d"

Expiry is from artifact creation, not first access. The reaper janitor runs nightly and deletes expired artifacts + their bytes. Expired rows are soft-deleted for 24 hours (audit trail), then purged.

Listing artifacts

# All artifacts for the account
artifact list

# Narrow to one task
artifact list --task-id <task_id>

# Narrow to one fleet run
artifact list --run-id <run_id>

# Narrow to one repo
artifact list --repo-id <repo_id>

Visibility

Artifacts are always account-scoped — only the account that created them can access or share them. There is no public artifact URL; sharing always requires a presigned URL from an authenticated call.

Audit trail

Every artifact operation (put, get, share, delete) is written to the append-only audit log with the token ID, timestamp, and artifact ID.

Full verb reference: MCP verb reference → artifact.