Tintwire: notifications without pretending they are chat
I wanted operational notifications to be durable, searchable objects with clear state, not messages scattered through a general-purpose chat system. Tintwire is a self-hosted inbox built around that idea.
Cards with a lifecycle
Producers publish structured cards with severity, fields, tables, images, and authenticated actions. Readers get channels, history, search, filters, unread state, realtime updates, Web Push, and installable PWA and desktop clients. Actions and approvals become durable events rather than opaque button callbacks.
Existing integrations do not need to move all at once. Tintwire accepts Mattermost and Slack webhook payloads and can preserve existing /hooks/{id} URLs. Native cards add the richer data model, while bounded bot and slash-command bridges cover workflows that still depend on chat-compatible interfaces.
A deliberately small producer client
tintwire-go keeps Go producers independent of the server. It validates native cards locally and uses only the standard library. Optional retries are bounded and context-aware; a Mattermost webhook can act as delivery failover only for transport failures, throttling, timeouts, and server errors. Authentication or invalid-payload failures do not fail over, because changing destination would hide a real configuration or producer bug.
Tintwire runs as one Go service with SQLite for a single node or PostgreSQL for shared deployments. It is still under active development, so interfaces and schemas may change; careful review and backups are appropriate before production use.
Source and documentation: Tintwire and tintwire-go.