1.8 KiB
1.8 KiB
ADR-003: SSR Strategy - Go Templates with Embedded Browser Scripts
Status
Accepted
Context
Document pages must be readable quickly and safely while still supporting editing, authentication, comments, offline caching, and real-time updates.
Decision
Go html/template renders complete HTML pages. The server embeds and serves
small framework-free browser scripts for progressive enhancement.
Implementation Details
-
Server Rendering:
- Go handlers query document and account data
- Goldmark parses Markdown to HTML server-side
html/templaterenders complete pages- Pages are readable before JavaScript executes
-
Browser Enhancement:
- Embedded scripts handle editing, comments, authentication, offline cache, service-worker behavior, and WebSocket updates
- Native browser APIs are preferred over a client framework
- There is no separate SPA route or frontend build pipeline
Consequences
Positive
- Fast first contentful paint
- Auto-escaped templates
- One deployable application artifact
- Small browser payloads and no Node build dependency
- Interactive features stay close to their HTTP endpoints
Negative
- Browser modules need direct DOM event handling
- Shared UI abstractions require deliberate maintenance
- More complex browser interactions need focused integration tests
Alternatives Considered
Separate Hydrated SPA
- Pros: Component framework and client-side routing
- Cons: Duplicates UI paths and introduces a second toolchain
- Rejected: The server-rendered UI already supports the required behavior
Embedded JS Runtime
- Pros: Isomorphic rendering
- Cons: Larger binary and additional security surface
- Rejected: Go templates are simpler
References
- Go
html/template: https://pkg.go.dev/html/template