Assets, versioned like code.

Keep images and video in one versioned library on your own servers. Each repository pulls the exact files it needs and locks them, so a build changes only when you say so.

npm i -D -E @vardum/cli

Update once. Ship on your schedule.

A new logo changes nothing until a project pulls it. Locked builds keep the version they shipped with.

marketing-site follows the latest versionweb-app locked v13 and stays on it
  1. Upload

    Every upload becomes a new version. Nothing is overwritten.

  2. Map

    A Vard maps assets and folders to paths in one repository.

  3. Pull

    The CLI writes the files and a lockfile. CI replays the lockfile exactly.

The full walkthrough

Real files in your repository.

Bundlers, frameworks and code review see ordinary files. The lockfile records the version and checksum of each one.

  • Follow the latest version, pin one, or request a resized variant
  • Local edits are detected, never silently overwritten
  • vardum pull --frozen verifies every file in CI
Read the CLI guide
$ npx vardum pull
pull src/assets/logo.svg
pull src/assets/hero.webp
pull public/og.png
3 changes

$ git status --short
 M .vardum.lock
 M public/og.png
 M src/assets/hero.webp
 M src/assets/logo.svg
{
  "schema": 1,
  "server": "https://assets.acme.com",
  "workspace": "0b7c6f0e-5d1a-4c8e-9f3a-2a6d4e1b9c07",
  "vard": "6f1d2a9b-3c4e-4f5a-8b7c-9d0e1f2a3b4c"
}
{
  "schema": 2,
  …
  "items": {
    "a41c…": {
      "path": "src/assets/hero.webp",
      "versionId": "9e2d…",
      "fingerprint": "9e2d…:w=1600&fit=inside&format=webp&q=80",
      "downloadUrl": "https://assets.acme.com/w/acme/__v/9e2d…/site/hero?w=1600&…",
      "checksum": "3b7f9c…e41a"
    }
  }
}

One stable URL per asset.

Each asset keeps a stable URL that redirects to its current version. Variants are resized from signed parameters, rendered once and stored next to the original.

site/hero
stable
/w/acme/site/hero
redirects to the current version
version
/w/acme/__v/9e2d…/site/hero
never changes
variant
?w=800&fit=inside&format=webp&q=80&sig=…
signed, rendered once
cache
public, max-age=31536000, immutable
public files

Built for small teams with big brands.

Private by default

New files need workspace access. Publish each one when it should be public.

Folder rules

Map brand/ to src/assets/brand/. New files in the folder join the next pull.

Full history

Every version is kept. Restore an old one by moving the pointer back.

Agents included

An MCP server lets Claude and other agents upload assets and edit Vards.

Roles and keys

Owners, editors and viewers. Read or write API keys for each workspace.

Audit log

Uploads, restores, visibility changes, keys and members, filterable by action.

See all features

Designers upload.

Drop new artwork into the library from the browser. Everyone finds the current version in one place.

hero.webp    ██████████████  done
banner.png   █████████░░░░░  64%
promo.mp4    ███░░░░░░░░░░░  21%

Developers pull.

Review asset changes like dependency bumps. Commit the lockfile, and CI gets the same bytes every time.

$ npx vardum pull
pull src/assets/logo.svg
1 change

Open source. Runs on your boxes.

One Compose file runs PostgreSQL, the API, a worker and an nginx gateway against an S3-compatible bucket you bring.

Self-hosting guide

Start with one logo.

Start your own instance, upload it, map it into a repository, and pull.

npm i -D -E @vardum/cli