Skip to content

GOTRS 0.5.1: Polish, Portability, and a Side of AVIF

Just when you thought it was safe to relax after 0.5.0, we’re back with another release. GOTRS 0.5.1 focuses on polish, portability, and preparing the platform for production Kubernetes deployments. Oh, and we taught GOTRS to appreciate modern art formats like AVIF and HEIC.

Server infrastructure Photo by Taylor Vick on Unsplash

๐Ÿ“ธ Modern Image Format Support

Your iPhone photos are welcome here now. The thumbnail service has been upgraded from disintegration/imaging to govips/libvips, bringing:

  • AVIF and HEIC support: Because it’s 2026 and we should probably support the formats everyone’s actually using
  • 4x faster image processing: libvips streams images rather than loading them entirely into memory
  • CVE-2023-36308 mitigation: The old library had a nasty panic bug with crafted TIFF filesโ€”now a non-issue

The Dockerfile.toolbox has been updated with the necessary vips packages for CGO compilation. For those keeping score at home, we also added comprehensive test coverage for the thumbnail service. Yes, we test our thumbnails. We’re professionals. ๐Ÿงช

Camera and photography Photo by Jakob Owens on Unsplash

๐Ÿ‘๏ธ Enhanced Attachment Viewer

The inline attachment viewer has received a thoughtful redesign:

  • Close button: Now styled with proper dark mode support, plus Esc key for keyboard enthusiasts โŒจ๏ธ
  • Collapsible metadata panel: Filename, type, size, upload date, and attachment IDโ€”all the thrilling details
  • Eye icon for viewing: We retired the confusing video icon. Turns out not everything is a video.
  • Click-to-view behavior: Clicking an attachment filename now opens the inline viewer instead of triggering a download. The download button is right there if you actually want the file.

๐Ÿ—„๏ธ SQL Portability: The 1,800 Query Refactor

Here’s a fun fact: we had approximately 1,800 SQL queries scattered across 127 files that were PostgreSQL-specific. We fixed them all. โœ…

  • Converted all $N placeholders to portable ? format with database.ConvertPlaceholders()
  • Replaced ILIKE operators with LOWER(column) LIKE LOWER(?) for case-insensitive searches
  • Updated repositories, API handlers, admin modules, and base CRUD handlers
  • Added a SQL portability guard script (scripts/tools/check-sql.sh) to prevent future transgressions

GOTRS now runs identically on MySQL and PostgreSQL. Your database, your choice. ๐ŸŽฏ

โ˜ธ๏ธ Production-Ready Helm Chart

Kubernetes users, rejoice! The charts/gotrs/ directory now contains a production-ready Helm chart:

Data center Photo by imgix on Unsplash

  • Tag mirroring: Chart appVersion matches the git ref, so --version main deploys :main images and --version v0.5.1 deploys :v0.5.1 images
  • Database selection: MySQL (default) or PostgreSQL via database.type
  • Valkey subchart: Official valkey-helm chart included as a Redis-compatible cache dependency
  • HPA support: Horizontal Pod Autoscaler with configurable CPU/memory targets
  • Security contexts: readOnlyRootFilesystem, allowPrivilegeEscalation: false, capabilities: drop: [ALL] ๐Ÿ”’
  • extraResources: Inject arbitrary Kubernetes resources with full Helm templating support

Install with:

helm install gotrs oci://ghcr.io/gotrs-io/charts/gotrs --version 0.5.1

The legacy Kustomize manifests in k8s/ have been retired. They served us well, but Helm is the way forward. ๐Ÿ‘‹

๐Ÿฐ Bun All The Things

We’ve migrated from npm to Bun for frontend builds:

  • โšก Faster dependency installation and builds
  • ๐Ÿ“ No node_modules directory created on host during builds
  • ๐Ÿ” Binary lockfile (bun.lockb) instead of the JSON variety
  • ๐Ÿณ Dockerfile frontend stage uses oven/bun:1.1-alpine

The installation in Dockerfile.toolbox now uses GPG-verified tarball downloads instead of the classic curl | bash approach. Security matters, even for package managers.

๐Ÿท๏ธ Version Display on Login

Ever deployed a container and wondered which version you’re actually running? Now you can see it right on the login page. The build version displays at the bottom, showing either the semantic version tag (e.g., v0.5.1) or the branch name with the short git commit hash.

This is powered by a new internal/version package with ldflags injection. The Makefile extracts git tag/branch/commit at build time and injects them via -X flags. No more “which commit is production running?” detective work. ๐Ÿ•ต๏ธ

๐Ÿ” Production Reverse Proxy: Hello Caddy

We’ve replaced nginx with Caddy in docker-compose.prod.yml. Caddy provides automatic HTTPS via Let’s Encrypt with embedded Caddyfile configuration. Less config, more certificates, fewer headaches. ๐Ÿ’†

๐Ÿ› Bug Fixes Galore

A selection of the bugs we squashed:

BugFix
deleteAttachment JavaScript ErrorAdded the missing function that was being called but never defined
Note Content Field Not FoundFixed the form looking for note_content when the rich text editor used body
API Empty Response on Auth FailureAuth middleware now returns JSON 401 instead of HTML redirect when you ask nicely with Accept: application/json
Thumbnail URL GenerationFixed broken URLs that were pointing to non-existent routes
SQL Argument Order BugsFixed handleDeleteQueue and handleDeleteType where parameters were playing musical chairs ๐Ÿ’ƒ
Test Database IsolationRemoved defer db.Close() calls that were closing the singleton database connection mid-test suite

๐Ÿ“Š By the Numbers

MetricValue
SQL queries refactored1,800+
Files updated for portability127
Tests passing876 โœ…
Kustomize files retired22
fetch() calls replaced with apiFetch()10

๐Ÿš€ Upgrade Notes

If you’re coming from 0.5.0:

  1. Pull the new images: docker compose pull
  2. Recreate containers: docker compose up -d --force-recreate
  3. For Kubernetes users: helm upgrade gotrs oci://ghcr.io/gotrs-io/charts/gotrs --version 0.5.1

The database schema is unchanged from 0.5.0, so no migrations required. ๐ŸŽ‰

๐Ÿ”ฎ What’s Next

With the portability work complete and the Helm chart ready, we’re well-positioned for broader production deployments. The focus continues on expanding workflow automation and hardening the platform.


  • ๐Ÿ“ฆ Source & containers: GOTRS on GitHub
  • ๐Ÿ“š Full changelog: CHANGELOG.md
  • โ˜ธ๏ธ Helm chart: oci://ghcr.io/gotrs-io/charts/gotrs

Questions? Feedback? Join our Discord and let us know what you think! ๐Ÿ’ฌ

Back to Blog