Media Storage

ImageKit for upload, storage, and delivery. One provider, clear API, tenant isolation, and a documented swap path.

What this system covers

Upload handling
API for uploads with validation, size and type limits, and tenant-scoped storage. Basic upload flow so you can accept media without reinventing the pipeline.
Storage and CDN
We use ImageKit as the default: storage and delivery with optional transformations. One provider, clear API; we document the swap path so you can replace it in under 20 minutes if needed.
Tenant isolation
Media is scoped by tenant or workspace. Paths and APIs enforce tenant ID so one customer never sees or overwrites another's assets.

Why one default provider?

We ship with ImageKit so you get a working pipeline immediately. The media layer is abstracted behind an interface; we document how to swap to S3, Cloudinary, or another provider so you keep flexibility without extra complexity out of the box.

Decisions & trade-offs

We ship ImageKit as the single default so you get upload, storage, and delivery (plus optional transformations) without evaluating multiple providers. The media layer is behind an interface so we keep "one provider per category" and a documented swap: replace in ~20 minutes if you need S3, Cloudinary, or a different region.

Pros

  • One integration; upload handling, validation, and tenant isolation are built in.
  • ImageKit covers storage and CDN; optional transforms without extra services.
  • Swap path is documented; no vendor lock-in.

Trade-offs

  • ImageKit is one provider; high-scale or region-specific needs may require a different default or multi-provider setup.
  • Advanced transforms or video are not in scope by default; we document extension points.

FAQs

Back to Systems
xs