Architecture that remains habitable
Thoughts on Jakarta EE, Scala, UI architecture, and the quiet work of building durable systems.
Permissions and HATEOAS
Enforce endpoint, object and field permissions, then let an editorial interface follow the actions offered by each response.
Applying Changes Safely
Prepare entity changes before mutation, enforce current versions, validate the complete result and return useful errors without losing atomicity.
Building a Form from End to End
Bind the post model directly to a form, show field errors and preserve newer edits when saves or conflicts arrive.
Searching, Filtering and Pagination
Use HibernateSearch and CDI providers for typed filters, compact projections and URL-driven pagination that survives reloads and browser history.
Managing Entity Relationships
Model authors and tags as shared entities, accept safe ID-only references, and update relationships deliberately across the API and editor form.
Uploading and Serving Media
Validate image uploads, attach them to posts by reference, authorize each image request by post visibility, and safely clean up abandoned uploads.
Integrating a Post Editor
Add a Markdown editor to the post form, secure embedded image uploads and references, and share one rendering path between preview and public reading.
Translating the Interface
Add English and German routes, a message catalog and a language switch while preserving form state and editorial content.
Translating Blog Content
Add independently published German post translations, consistent localized search and complete English fallback without changing the source article.
Rendering Pages on the Server
Render the existing Scala.js blog with GraalJS so localized posts arrive as complete HTML with the correct HTTP status.
Hydrating the Server-Rendered Page
Keep the server DOM, reuse its initial public response once and attach interactivity without a second initial data request.
Completing the Public Pages
Finish the blog with consistent page metadata, published language links, a sitemap, Atom feeds and HTTP responses that match the content.