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.
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. ๐งช
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
$Nplaceholders to portable?format withdatabase.ConvertPlaceholders() - Replaced
ILIKEoperators withLOWER(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:
- Tag mirroring: Chart
appVersionmatches the git ref, so--version maindeploys:mainimages and--version v0.5.1deploys:v0.5.1images - 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_modulesdirectory 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:
| Bug | Fix |
|---|---|
| deleteAttachment JavaScript Error | Added the missing function that was being called but never defined |
| Note Content Field Not Found | Fixed the form looking for note_content when the rich text editor used body |
| API Empty Response on Auth Failure | Auth middleware now returns JSON 401 instead of HTML redirect when you ask nicely with Accept: application/json |
| Thumbnail URL Generation | Fixed broken URLs that were pointing to non-existent routes |
| SQL Argument Order Bugs | Fixed handleDeleteQueue and handleDeleteType where parameters were playing musical chairs ๐ |
| Test Database Isolation | Removed defer db.Close() calls that were closing the singleton database connection mid-test suite |
๐ By the Numbers
| Metric | Value |
|---|---|
| SQL queries refactored | 1,800+ |
| Files updated for portability | 127 |
| Tests passing | 876 โ |
| Kustomize files retired | 22 |
fetch() calls replaced with apiFetch() | 10 |
๐ Upgrade Notes
If you’re coming from 0.5.0:
- Pull the new images:
docker compose pull - Recreate containers:
docker compose up -d --force-recreate - 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! ๐ฌ