selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

openinary logo

Self-host openinary

v0.5.0

Self-hosted media platform with URL-based transformations

BetaOpen CoreAGPL-3.0
Updated9 hours ago
LanguageTypescript
Setup difficultyModerate
ThemeDark mode
Stars
417
CPU
2.0 cores (default Docker limit)
RAM
4 GB (default Docker limit, 2 GB minimum for images only)
Storage
Not specified
Port
3000 (HTTP API and dashboard)
Docker
openinary/openinary
Install with Docker

What is openinary?

This platform delivers on-the-fly image and video transformations through URL parameters, with automatic format selection and edge caching. It runs in Docker with a one-command installer, works with any S3-compatible storage backend, and uses SQLite for authentication. The self-hosted edition is free under AGPL-3.0 with no feature restrictions. Video processing uses FFmpeg with configurable worker concurrency. Two deployment modes are available: full stack with dashboard or API-only. The project is pre-1.0 and does not guarantee backward compatibility before v1.0.0.

Should you self-host openinary?

openinary scores 46/100 on selfhost.directory (how scoring works) and ranks #78 of 118 in Media Server. It has 417 GitHub stars.

It shipped 14 stable releases in the past year. The latest, v0.5.0, came out on 1 October 2026. New versions land roughly every 4 days.

Setup is moderate: expect some configuration beyond a single command. An official Docker image is available. It is AGPL-3.0-licensed and written mostly in Typescript.

Its closest alternative on selfhost.directory is Flyimg (57/100, 1 233 stars). It scores higher overall, so compare the two before you pick. See openinary vs Flyimg side by side.

Features

  • Admin Dashboard
  • API Key Authentication
  • Automatic format selection
  • Edge caching
  • File uploader component
  • Image Processing5 crop modes (fill, fit, scale, crop, pad); face/entropy gravity; no chained transformations or named transformations
  • Rate Limiting
  • REST API
  • S3-compatible Storage
  • Session-based authSingle admin account only; no teams, RBAC, OAuth, or SSO in self-hosted version
  • Signed URLs
  • Two deployment modes
  • URL-based transformations
  • Video ProcessingFixed limits: 720p max auto-downscale, 200 MB source cap, 5 min FFmpeg timeout, H.264 fixed codec

openinary README

How to install openinary

Install openinary with Docker

Environment variables
STORAGE_*, MODE, BETTER_AUTH_SECRET, etc.

docker run --platform linux/amd64 -d -p 3000:3000
-v openinary-cache:/app/apps/api/cache
-v openinary-public:/app/apps/api/public
-v openinary-db:/app/data
openinary/openinary:latest

Full stack image with dashboard

How to configure openinary

  • API_SECRETSigns signed URLs and presigned uploads. At least 16 characters.

    Signs signed URLs and presigned uploads. At least 16 characters.

    values: 16+ character string

  • BETTER_AUTH_SECRETSigns sessions and tokens. Use 32+ characters. Required.

    Signs sessions and tokens. Use 32+ characters. Required.

    values: 32+ character string

  • BETTER_AUTH_URLhttp://localhost:3000Public base URL, used for auth callbacks and CORS.

    Public base URL, used for auth callbacks and CORS.

    values: URL

  • CORS_ORIGINExtra allowed origins, comma-separated.

    Extra allowed origins, comma-separated.

    values: Comma-separated URLs

  • DB_PATH/app/data/auth.dbSQLite database path.

    SQLite database path.

    values: File path

  • DOCKER_CPU_LIMIT2.0Hard cap in cores.

    Hard cap in cores.

    values: Float

  • DOCKER_MEMORY_LIMIT4GHard cap in memory.

    Hard cap in memory.

    values: Memory string (G/M)

  • LOG_LEVELinfo in production, debug in developmentLog level for server.

    Log level for server.

    values: trace, debug, info, warn, error, fatal

  • MAX_FILE_SIZE_MB50Maximum upload size.

    Maximum upload size.

    values: Integer (MB)

  • MODEfullstackfullstack runs API and dashboard. api runs the API alone and generates a key on first boot.

    fullstack runs API and dashboard. api runs the API alone and generates a key on first boot.

    values: fullstack, api

  • NEXT_PUBLIC_API_BASE_URLhttp://localhost:3000Base URL the browser uses to reach the API.

    Base URL the browser uses to reach the API.

    values: URL

  • OPENINARY_ADMIN_EMAILAdmin account created on first boot.

    Admin account created on first boot.

    values: Email address

  • OPENINARY_ADMIN_NAMEAdminDisplay name for admin account.

    Display name for admin account.

    values: String

  • OPENINARY_ADMIN_PASSWORDPassword for admin account.

    Password for admin account.

    values: String

  • OPENINARY_GENERATE_API_KEYfalseCreate an API key too and print it to the logs. Must be exactly true.

    Create an API key too and print it to the logs. Must be exactly true.

    values: true, false

  • PORT3000Port the API listens on.

    Port the API listens on.

    values: Port number

  • PUBLIC_RATE_LIMIT_MAX100Requests per window on public routes.

    Requests per window on public routes.

    values: Integer

  • PUBLIC_RATE_LIMIT_WINDOW_MS60000Window length in milliseconds.

    Window length in milliseconds.

    values: Integer (ms)

  • STORAGE_ACCESS_KEY_IDAccess key ID for S3-compatible storage.

    Access key ID for S3-compatible storage.

    values: String

  • STORAGE_BUCKET_NAMEBucket files are stored in.

    Bucket files are stored in.

    values: Bucket name

  • STORAGE_ENDPOINTEndpoint for non-AWS providers. Omit for AWS S3.

    Endpoint for non-AWS providers. Omit for AWS S3.

    values: URL

  • STORAGE_PUBLIC_URLBase URL used to build file URLs. Point at CDN or custom domain.

    Base URL used to build file URLs. Point at CDN or custom domain.

    values: URL

  • STORAGE_REGIONautoRegion identifier. auto for R2, explicit for AWS.

    Region identifier. auto for R2, explicit for AWS.

    values: Region string or auto

  • STORAGE_SECRET_ACCESS_KEYSecret access key for S3-compatible storage.

    Secret access key for S3-compatible storage.

    values: String

  • VIDEO_JOB_CLEANUP_HOURS24Age at which completed and failed jobs are purged.

    Age at which completed and failed jobs are purged.

    values: Integer (hours)

  • VIDEO_JOB_RETRY_MAX3Attempts before a job is marked permanently failed.

    Attempts before a job is marked permanently failed.

    values: Integer

  • VIDEO_MAX_CONCURRENTautoJobs processed at once. Auto-detected based on RAM/CPU if unset.

    Jobs processed at once. Auto-detected based on RAM/CPU if unset.

    values: Integer or auto

openinary releases & version history

More in Image Processing

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…