Openinary is a free, open source digital asset management (dam) project written in TypeScript and released under AGPL-3.0. It has 403 GitHub stars, 55 forks and 14 open issues, and was last pushed 20 days ago. On this registry it ranks #25 of 25 tracked projects in Digital Asset Management (DAM), with 5 head-to-head comparisons available. It gained 4 stars over the last 6 tracked days.

What is Openinary?

Openinary is an open-source, self-hostable media processing platform that delivers images and videos through URL-based transformations, built for developers and platform teams who want Cloudinary-style media delivery without depending on a proprietary SaaS provider.

What it is

Openinary is a TypeScript media server that handles on-the-fly transformations for images and videos through URL parameters, paired with built-in S3-compatible storage, automatic caching, and an admin dashboard for asset management. It lives in the Node.js and Docker ecosystem: the API, web frontend, telemetry service, CLI, and shared packages are laid out in a single monorepo alongside the managed Openinary Cloud service, so a fix to the shared engine reaches both deployments without an intervening release. Everything except the managed cloud application is licensed under AGPL-3.0.

The concrete problem it solves is media delivery without a metered third-party account. Instead of uploading assets to a proprietary platform and paying per transformation, an operator runs Openinary against storage they already control — an AWS S3 bucket, a Cloudflare R2 bucket, or any other S3-compatible endpoint — and requests derivatives with a URL like GET /t/w_800,h_600/image.jpg. The specific thing it replaces is Cloudinary, and the project describes itself in exactly those terms in its own tagline and topic list.

Key capabilities

  • URL-based image transforms with explicit parameters, for example GET /t/w_800,h_600/image.jpg for a simple resize and GET /t/w_400,h_400,c_fill,g_face/portrait.jpg for smart cropping with face detection.
  • Aspect-ratio handling with automatic gravity detection through ar_16:9,g_auto,w_1920,h_1080, alongside format and quality control such as f_avif,q_80.
  • Video transforms covering thumbnails at a time offset (so_5), web-compressed re-encodes (w_1280,h_720,q_75), clip extraction (so_10,eo_30), lightweight previews (q_50), and container conversion such as f_mp4.
  • Smart optimization that emits WebP, AVIF, and other modern codecs rather than serving only the original asset.
  • Built-in S3-compatible storage with automatic caching, configured through STORAGE_REGION, STORAGE_ACCESS_KEY_ID, STORAGE_SECRET_ACCESS_KEY, STORAGE_BUCKET_NAME, STORAGE_ENDPOINT, and STORAGE_PUBLIC_URL.
  • A REST API and an admin dashboard for asset management, with API keys generated from the user profile under "API Keys".
  • A CLI with start, stop, and upgrade commands, distributed as the create-openinary package.

Who uses it and how

  • Individual developers evaluating the platform run npx create-openinary on a workstation, choose full stack or API-only, and have an instance listening at http://localhost:3000 within one command.
  • Teams that must keep assets in their own buckets point the deployment at Cloudflare R2 or AWS S3 through environment variables, so media stays in infrastructure they control rather than a vendor account.
  • Backend and frontend engineers integrate the REST API and rewrite asset URLs into /t/... transform paths instead of pre-generating derivative files at upload time.
  • Operations-minded self-hosters use the Compose-based deployment to run the API and web applications together, and the global CLI to upgrade the installation in place.
  • Evaluators can use the hosted Openinary Cloud service, in public alpha on a free plan with no card required, to test the same engine before committing to self-hosting.

Getting started

Run npx create-openinary with Docker 20.x+ and Node.js 20+ installed; the wizard scaffolds a project, writes a docker-compose.yml and .env, optionally configures S3-compatible storage, and starts the containers. Afterwards open http://localhost:3000, complete /setup to create the admin account, and generate an API key from the profile area.

How it compares

Cloudinary is the paid product Openinary positions itself against as a self-hostable alternative. Where Cloudinary is a proprietary hosted service, Openinary is AGPL-3.0 and runs on infrastructure the operator chooses, which moves data ownership to the operator's own S3-compatible bucket and changes the cost model from a vendor transformation bill to the storage and compute the deployment consumes. The trade is operational: the self-hoster carries the deployment, while the vendor carries it for you.

When to use it — and when not to

A self-hoster must run Docker and Node.js, provision an S3-compatible bucket with credentials, and manage the Compose stack, its .env configuration, and upgrades. The README warns that the project is under active development and that full backward compatibility is not guaranteed before v1.0.0, so teams needing a frozen API contract should wait or pin a version. Also note that apps/cloud/ is source-available rather than open source and requires a written agreement to run, so anyone wanting a fully permissive licence across the whole stack, including the managed service, will not find it here.

project readme (upstream, from github) — read inline

Openinary - self-hosted media processing platform

build Docker pulls license

Openinary is an open-source, self-hosted media processing platform that includes:

  • on-the-fly transformations for images and videos via URL
  • built-in S3-compatible storage with automatic caching
  • smart optimization with WebP, AVIF, and modern codecs
  • simple REST API with URL-based transformations
  • convenient admin dashboard for asset management

For documentation and more examples, please visit https://docs.openinary.dev.

[!TIP] ☁️ Openinary Cloud is in public alpha. Same engine, hosted for you. Sign up and start on the free plan, no card required. Try it →

[!WARNING] Please keep in mind that Openinary is still under active development and therefore full backward compatibility is not guaranteed before reaching v1.0.0.

Quick Start

Deploy with Railway  Deploy with Coolify  Deploy with Dokploy

Installation

Make sure to have Docker 20.x+ and Node.js 20+ installed and running.

npx create-openinary

Follow the prompts to choose full stack vs. API-only and, optionally, S3-compatible storage. It scaffolds a project, writes a docker-compose.yml and .env, and starts the containers. Once it finishes, your Openinary instance is running at http://localhost:3000.

To get the full CLI suite (start, stop, upgrade, ...), install it globally:

npm i -g create-openinary

Initial Setup

  1. Open http://localhost:3000, you'll be redirected to /setup
  2. Create your admin account
  3. Click on your profile in the bottom left navigation, then go to 'API Keys' to generate your first API key

Usage Examples

Images

# Simple resize
GET /t/w_800,h_600/image.jpg

# Smart cropping with face detection
GET /t/w_400,h_400,c_fill,g_face/portrait.jpg

# Format conversion + optimization
GET /t/w_1200,h_800,f_avif,q_80/photo.jpg

# Aspect ratio with automatic detection
GET /t/ar_16:9,g_auto,w_1920,h_1080/banner.jpg

Videos

# Thumbnail with resize
GET /t/w_800,h_450,so_5,f_avif/video.mp4

# Web optimized compression
GET /t/w_1280,h_720,q_75/video.mp4

# Extract a clip (from 10s to 30s)
GET /t/so_10,eo_30/interview.mp4

# Lightweight preview (low quality, small size)
GET /t/w_480,h_270,q_50/demo.mp4

# Format conversion with resize
GET /t/w_1920,h_1080,f_mp4/video.mov

S3-Compatible Configuration

Openinary supports any S3-compatible storage. Configure via environment variables in apps/api/.env:

AWS S3

STORAGE_REGION=us-east-1
STORAGE_ACCESS_KEY_ID=your_aws_access_key
STORAGE_SECRET_ACCESS_KEY=your_aws_secret_key
STORAGE_BUCKET_NAME=your-bucket-name
STORAGE_PUBLIC_URL=https://your-bucket-name.s3.us-east-1.amazonaws.com

Cloudflare R2

STORAGE_REGION=auto
STORAGE_ACCESS_KEY_ID=your_r2_access_key
STORAGE_SECRET_ACCESS_KEY=your_r2_secret_key
STORAGE_BUCKET_NAME=your-bucket-name
STORAGE_ENDPOINT=https://your-account-id.r2.cloudflarestorage.com
STORAGE_PUBLIC_URL=https://your-custom-domain.com

Other S3-Compatible Providers

STORAGE_REGION=us-east-1
STORAGE_ACCESS_KEY_ID=your_access_key
STORAGE_SECRET_ACCESS_KEY=your_secret_key
STORAGE_BUCKET_NAME=your-bucket-name
STORAGE_ENDPOINT=https://your-s3-compatible-endpoint.com
STORAGE_PUBLIC_URL=https://your-cdn-domain.com

Resources

Full Documentation | Issues | Contact

Repository layout

This repository holds the self-hosted product and the managed Cloud service side by side, so a fix to the shared engine reaches both without a release in between.

apps/api  apps/web  apps/telemetry   the self-hosted product
apps/cloud                           Openinary Cloud (server, web, admin)
apps/marketing  apps/docs            openinary.dev and its documentation
packages/                            core, ui, cli, registry, shared

See Project Structure for the full tour.

License

Everything in this repository is AGPL-3.0 — see LICENSE — with two exceptions:

  • apps/cloud/ is the managed Cloud service. It is source-available, not open source: read it, audit it, contribute to it, but running it needs a written agreement. See apps/cloud/LICENSE.
  • apps/marketing/ (the website) is MIT.

Self-hosting Openinary needs nothing from apps/cloud/. The AGPL parts are the whole product.

Frequently asked questions

Is Openinary free to use?

Openinary is open source under the AGPL-3.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does Openinary do?

Self-hostable image and video delivery with URL transforms

What is Openinary written in?

Openinary is primarily written in TypeScript. Its source is publicly available at https://github.com/openinary/openinary, and it has 403 GitHub stars.