Skip to main content
FeatureFix
v0.3.1

New features

Audio and 3D files, Openinary now accepts audio (wav, mp3, ogg) and 3D model (glb, gltf) files, stored and delivered as untouched originals with their real content type. A bare /t/<path> URL streams the file back byte for byte. No waveforms, thumbnails or format conversion for these types yet, transformations still apply to images and videos only. See the upload API reference. Thanks to andrzejb2137 for both contributions in this release.

Bug fixes

  • Uploads are validated against the file’s actual bytes, Every accepted type now carries a magic-byte signature, so a payload renamed to an allowed extension is rejected at upload instead of being stored. The MIME type and the extension are both set by the uploader, so on their own they only ever stopped honest mistakes.
  • nosniff on every delivery response, All delivery routes, including signed authenticated URLs, now send X-Content-Type-Options: nosniff, so stored bytes can never be content-sniffed into HTML on your origin. Stored originals are labelled from the same media-type table the upload whitelist uses.
Announcement
Cloud

Openinary Cloud is in public alpha

Sign-up is open, No more invite list: create your account at app.openinary.dev and you’re in, on the free plan. It’s an alpha, expect rough edges, and please report what breaks. See the Cloud overview.
FeatureImprovementFix
v0.3.0

New features

Openinary Cloud documentation, The hosted version of Openinary is now documented, including a quickstart, the API reference and the drop-in file uploader. Early access is open, see the Cloud overview.

Improvements

Videos are only transcoded when you ask, A bare /t/<video> URL now streams the original untouched and queues no job. Transcoding starts when the URL actually requests it, with q_auto or any explicit parameter, so uploading a video no longer costs processing time nobody asked for. See video transformations.No more automatic thumbnails on video upload, Uploads no longer queue a thumbnail job by default. Thumbnails are still generated on the first request in about a second, and you can pre-generate them by listing them in transformations at upload time. See upload & cache warming.

Bug fixes

  • Pending video transforms no longer serve the original, While a transformation is still processing, the endpoint answers 202 instead of falling back to the untransformed file, which could serve un-watermarked or un-cropped content under a transformed URL. The statusUrl in that response now points at the job the transform actually queued.
  • Output formats no encoder can produce are rejected, f_gif on an image returned PNG bytes labelled image/gif, and f_mp4 on a .jpg returned PNG bytes labelled image/mp4. GIF is now a real output format, and f_psd, f_avi, f_mp3, f_wav, f_ogg and f_pdf are rejected instead of silently falling back. PSD stays a supported upload format. See the transform API reference.
  • Upload picker matches what the API accepts, The dashboard file picker no longer offers formats the API then rejects, and its supported-formats label mentions HEIC.
  • Tabs indicator during resize, The tab indicator now tracks the container while it is being resized instead of lagging behind through its transition.
Breaking: f_psd and f_avi URLs no longer parse as transformations. The segment is read as a folder name and returns a 404 instead of silently falling back to another format.
Fix
CLI patch fixes
Clearer next steps when Docker isn’t running, openinary create now tells you clearly what to do next if Docker isn’t available on your machine, instead of leaving you stuck.
FeatureFix
Weekly update

New features

Official Openinary CLI, Spin up a new Openinary instance in seconds with create-openinary, or manage an existing one with the openinary CLI. This is now the recommended way to get started, see the quickstart guide.Presigned client-side uploads, Large files can now be uploaded directly to your storage backend using presigned URLs, taking load off your server and speeding up uploads.Appearance settings, You can now hide thumbnails in the media grid from the dashboard’s appearance settings, handy for large libraries or slower connections.Anonymous usage telemetry, Openinary now collects anonymous, non-identifying usage data to help us understand how the project is used and prioritize improvements.

Improvements

Faster folder browsing, The dashboard now loads folder contents on demand instead of fetching your entire storage tree at once, making navigation much faster on large libraries.Media grid and bulk actions, The media grid got a round of polish, including support for selecting and acting on multiple files at once.

Bug fixes

  • .DS_Store files ignored on upload, Folder uploads from macOS no longer fail or clutter your storage because of stray .DS_Store files.
  • Video worker concurrency, Video processing now correctly detects available memory in containerized environments, avoiding overloaded workers on small instances.
  • Video jobs no longer block the API, Video processing on small containers no longer starves HTTP requests, keeping transformations responsive during heavy video load.
  • Lower memory usage after jobs, Memory is now released more reliably after image and video processing, reducing RSS growth over time.
FeatureFixImprovement
Weekly update

New features

Round corners transformation, You can now round the corners of any image using the r parameter, including full circles and ovals. See the transform API reference.

Improvements

Parallel video processing, Video jobs are now processed in parallel up to your configured concurrency limit, speeding up queues with multiple pending videos.Faster image transformations, Image processing now uses non-blocking file I/O, improving throughput under load.Open source help links, In-app help links now point to GitHub instead of commercial resources.

Bug fixes

  • API key Bearer auth bypass, Fixed an authentication issue where API key validation could be bypassed via the Bearer header.
  • Crop and resize combined, Fixed aspect-ratio cropping being ignored when combined with a resize parameter.
  • Video content type, Thumbnails and non-MP4 video outputs now report the correct content type.
  • File extension casing, Extensions are now lowercased before format matching, fixing edge cases with mixed-case file names.
Fix
Weekly update

Bug fixes

  • Uppercase file extensions, Files with uppercase extensions (such as .JPG or .PNG) are now correctly recognized and processed instead of being rejected as unsupported. See the transform API reference for supported formats.
FeatureFix
April update

New features

Round corners transformation, You can now round the corners of any image using the r parameter. Apply a uniform radius, set each corner individually, or use r_max for a full circle or oval. Pair with b_rgb:<hex> to fill the corners with a solid color. See the transform API reference for all syntax options.PSD file support, Openinary now accepts Adobe Photoshop (.psd) files. Upload PSD files through the API or the web dashboard, and apply image transformations just like any other format. PSD sources are automatically converted before processing.HEIC and HEIF upload support, You can now upload images in HEIC and HEIF formats (common on iOS devices). Files are automatically normalized for compatibility with the transformation pipeline.Configurable upload file size limit, The maximum upload size is no longer hardcoded. Set the MAX_FILE_SIZE_MB environment variable to allow larger files, useful for video uploads on self-hosted instances. Defaults to 50 MB. See server configuration.Original file download route, A new GET /download/{path} endpoint lets you retrieve the original uploaded file without any transformations applied. See the download API reference.Folder management in the web UI, You can now create and delete folders directly from the Openinary dashboard, including support for empty folders on S3 and R2 storage backends.Upload prewarming, When uploading files, you can pass a list of transformations to pre-generate and cache immediately. The first public request for those variants is served instantly instead of triggering on-demand processing. See upload & cache warming.Multi-architecture Docker images, Docker images now support both AMD64 and ARM64 architectures, so you can run Openinary on Raspberry Pi, Apple Silicon, and AWS Graviton without any extra steps.Cache invalidation endpoint, A new authenticated endpoint lets you programmatically purge cached transformations. See the cache invalidation API reference.Signed URLs, Restrict who can request transformations by signing delivery URLs with HMAC-SHA256. Requests with a missing or invalid signature are rejected. See signed URLs.Public rate limiting, Public transformation and download routes are now rate-limited per IP. Configure the window and max requests with PUBLIC_RATE_LIMIT_MAX and PUBLIC_RATE_LIMIT_WINDOW_MS. See server configuration.

Improvements

Folder thumbnails, Folders in the media grid now display thumbnail previews of their contents.Configurable S3/R2 connection settings, You can now set socket limits, request timeouts, and connection timeouts for S3-compatible storage backends via environment variables. See storage configuration.

Bug fixes

  • Transparency preserved with quality parameter, Applying a q (quality) parameter no longer strips the alpha channel from PNG, WebP, or AVIF images.
  • Folder names with underscores, Folder names containing underscores are no longer misidentified as transformation segments in the URL path.
  • Image transformation race condition, Fixed a concurrency issue that could cause intermittent failures when multiple transformations were requested simultaneously.
  • Empty folder handling on S3/R2, Creating and displaying empty folders now works correctly with S3 and R2 storage backends.
FeatureFix
Weekly update

New features

Configurable upload file size limit, Set the MAX_FILE_SIZE_MB environment variable to allow larger uploads on self-hosted instances. See server configuration.

Improvements

Folder thumbnails, Folders in the media grid now show thumbnail previews of their contents.

Bug fixes

  • Transparency preserved with quality parameter, Applying a q (quality) parameter no longer strips the alpha channel from PNG, WebP, or AVIF images.
  • Folder names with underscores, Folder names containing underscores are no longer misidentified as transformation segments in the URL path.
FeatureFix
Weekly update

New features

HEIC and HEIF upload support, You can now upload images in HEIC and HEIF formats, common on iOS devices. Files are automatically normalized for the transformation pipeline.PSD file support, Openinary now accepts Adobe Photoshop (.psd) files, automatically converted before processing.Folder management in the web UI, Create and delete folders directly from the dashboard, including empty folders on S3 and R2 storage backends.

Bug fixes

  • Image transformation race condition, Fixed a concurrency issue that could cause intermittent failures when multiple transformations were requested simultaneously.
FeatureFix
Weekly update

New features

Named file uploads, Uploads now support custom file names instead of relying only on generated ones.Target folder on upload, Specify a destination folder directly when uploading a file.Signed URLs, Restrict who can request transformations by signing delivery URLs with HMAC-SHA256. See signed URLs.Multi-architecture Docker images, Docker images now support both AMD64 and ARM64, so Openinary runs on Raspberry Pi, Apple Silicon, and AWS Graviton without extra steps.

Bug fixes

  • Docker build reliability, Fixed a missing OpenSSL dependency and a SQLite race condition during table initialization.
  • API key auth compatibility, Fixed the apiKey table schema for compatibility with newer Better Auth versions.
  • Environment template, Corrected STORAGE_* variable names in env.template.
Feature
Weekly update

New features

Cache invalidation endpoint, A new authenticated endpoint lets you programmatically purge cached transformations after replacing a file directly in storage. See the cache invalidation API reference.Configurable S3/R2 connection settings, Set socket limits, request timeouts, and connection timeouts for S3-compatible storage backends via environment variables. See storage configuration.
FeatureFixSecurity
Weekly update

New features

Single admin account enforcement, Sign-ups are now restricted to a single admin account, enforced at the database level.Version endpoint, A new public /api/version endpoint and UI components let you check the running Openinary version.

Improvements

Stricter session validation, Sessions are now revalidated against the database on every request, so deleted users lose access immediately.Async auth initialization, Authentication now initializes asynchronously, improving startup performance.

Bug fixes

  • Loading screen after login, Fixed a stuck loading screen caused by stale sessions for deleted users.
  • Setup page 500 error, Fixed a crash on /setup when an admin account already existed.
Feature
Initial release

Openinary is live

The first beta release of Openinary: a media transformation API for images and videos, with a web dashboard, API key management, S3-compatible and local storage support, automatic video transcoding via FFmpeg, and Docker support for easy self-hosting.