Managing media files and storage quotas

How to upload images and documents, organize assets in the Media Library, understand supported file types, and manage storage quotas.

Content Management5 min read·Updated October 2026

Managing media files and storage quotas

How to upload images and documents, organize assets in the Media Library, understand supported file types, and manage storage quotas.

Before you begin

  • A SCHMA workspace
  • Editor, Admin, or Owner permissions to upload or delete media

The SCHMA Media Library provides a centralized asset management system for imagery, illustrations, and documents used across your content models. Assets uploaded to SCHMA are stored on managed cloud infrastructure with edge CDN distribution, keeping heavy binary files separate from your customer-owned PostgreSQL database.

Media Library architecture and asset management

When an editor attaches an image to a content entry, SCHMA stores a lightweight JSON reference in your PostgreSQL database (containing the asset ID, URL, filename, dimensions, and alternative text) while the binary file itself is hosted on SCHMA's secure media storage cluster.

Inside the Studio's Media Library, teams can:

  • Organize assets by folder: Create directory hierarchies to group assets by campaign, department, or content type.
  • Tag and search: Apply tags to assets and execute keyword searches across filenames and descriptions.
  • Inspect asset metadata: View file dimensions (width and height), file size in bytes, MIME type, upload date, and referencing content entries.
  • Manage accessibility: Define reusable alternative text (alt text) and captions directly within the asset record.

Supported file formats and upload limits

To ensure high security, web performance, and protection against file spoofing, SCHMA validates both the declared MIME type and the file extension upon upload. The following file formats are verified for production use:

Asset CategoryMIME TypePermitted Extensions
JPEG Imageimage/jpeg.jpg, .jpeg
PNG Imageimage/png.png
WebP Imageimage/webp.webp
AVIF Imageimage/avif.avif
GIF Animationimage/gif.gif
Vector Graphicimage/svg+xml.svg
Documentapplication/pdf.pdf

Storage quotas and plan allowances

Media storage capacity is governed by your workspace subscription plan. Approved tier allocations include:

Plan TierTotal Storage QuotaIndividual File LimitEdge CDN Delivery
Free Plan100 MB10 MBIncluded
Pro Plan (£20/mo UK / €25 EU / $25 RoW)1 GB10 MBIncluded (High Priority)
Max PlanCustom Quota (Coming Soon)Custom (Coming Soon)Included (Dedicated)

Monitoring usage and resolving quota limits

You can inspect current storage consumption at any time by navigating to Settings > Usage in SCHMA Studio. The storage meter displays committed bytes and the percentage of your plan allowance consumed.

If an upload causes your workspace to exceed its storage ceiling, the API rejects the request with an HTTP 429 response indicating MEDIA_QUOTA_EXCEEDED. To resolve a quota block:

  1. Prune obsolete media: Open the Media Library, filter by unused or unreferenced assets, and delete files that are no longer needed by published entries.
  2. Optimize imagery prior to upload: Convert large uncompressed PNGs to modern WebP or AVIF formats. Converting a 4 MB photographic PNG to WebP typically reduces its footprint to under 400 KB without discernible loss of visual fidelity.
  3. Upgrade to Pro: Workspaces on the Free plan can upgrade to Pro (£20/mo UK, €25/mo EU, $25/mo Rest of world; or £200/year UK) to instantly expand their storage allowance to 1 GB alongside expanded multi-user collaboration (up to 5 members) and scheduling.

Media delivery, image caching, and CDN optimization

Every uploaded asset receives an immutable public CDN delivery URL. Because asset filenames include a cryptographic hash, responses carry aggressive browser cache headers (Cache-Control: public, max-age=31536000, immutable).

When rendering images in modern frontend frameworks like Next.js, use the framework's native image optimization component with your SCHMA media domain configured in remotePatterns:

TYPESCRIPT Example
// next.config.mjs
export default {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: '*.schma.dev',
      },
    ],
  },
};