All projects

Apps & tools

Gotify+

A modern Android client for Gotify push.

Per-app channels, real-time WebSocket streaming, offline history and multiple servers, built with Compose and Material 3.

Gotify+ — a modern Android client for self-hosted Gotify

Why I built it

Gotify carries all of my homelab alerts. I wanted a cleaner Android client with offline history and search.

Architecture

How it fits together

Services

  • Homelab alerts and scripts

Gotify server

  • Self-hosted push

Gotify+

  • Live stream

    WebSocket

  • Offline cache

    Room DB

  • Per-app channels

Screenshots

See it in use

4 more on GitHub

Documentation

From the README

Open on GitHub

A modern Android client for Gotify — a self-hosted push notification server. Built entirely with Jetpack Compose and Material 3, Gotify+ replaces the official Android app with a cleaner interface, per-app notification channels, real-time WebSocket streaming, and offline message caching.

Features

  • Real-time notifications via persistent WebSocket connection to /stream
  • Per-app notification channels with Low / Normal / High priority tiers
  • Offline caching — messages stored in Room DB, readable without network
  • Cached message search with result highlighting
  • App inbox — per-application message view
  • Markdown rendering in message bodies
  • Action buttons — tap extras from message payloads open URLs directly
  • Dark and light theme with Material You dynamic color on Android 12+
  • Vibration control — toggle independently from notification sound
  • Filter chips — filter the message feed by application instantly
  • Pull-to-refresh on both messages and applications screens
  • Battery optimization guidance — opens Android's battery settings so the user can review background restrictions
  • Boot receiver — listener service auto-restarts after device reboot
  • Adaptive navigation — bottom navigation on phones and a navigation rail on larger windows
  • Server control sheet — switch servers, inspect connection/version/health, and remove saved servers
  • Application management — create, edit, clear, and delete applications with confirmation for destructive actions
  • Message actions — copy or share message content, and safely open Gotify URL/intent actions
  • Credential hygiene — application tokens are not displayed in the UI; sign out clears all local server credentials and caches

Tech Stack

LayerLibrary
UIJetpack Compose + Material 3
ArchitectureMVVM + Clean Architecture
Dependency InjectionHilt
NetworkingRetrofit 3 + OkHttp 5
Real-timeOkHttp WebSocket
Local DBRoom
PreferencesDataStore
Image loadingCoil
AsyncKotlin Coroutines + Flow
Markdowncompose-markdown

Requirements

This repository contains the Android client only. The Gotify server's browser UI is a separate codebase and is not present here; changing that UI requires the Gotify server repository (including its ui/ directory).

Setup

Build from source

  1. Clone the repository
git clone https://github.com/anand34577/gotify-plus.git
cd gotify-plus
  1. Open in Android Studio Hedgehog or newer

  2. Sync Gradle — all dependencies resolve from Maven Central and JitPack

  3. Build → Generate Signed APK, or run directly on a device / emulator

Login

The app supports two authentication methods:

Username & Password — enters your Gotify credentials and the app creates a new client token automatically via POST /client.

Client Token — paste a pre-existing token from Gotify web UI → Clients.

Both methods verify the server is reachable before saving.

Architecture

app/
├── data/
│   ├── api/          Retrofit interfaces, WebSocket manager, OkHttp client
│   ├── db/           Room database, DAOs, entity↔domain mappers
│   ├── datastore/    User preferences (DataStore)
│   ├── model/        Domain models, sealed ApiResult, StreamState
│   └── repository/   AuthRepository, MessageRepository, ApplicationRepository
├── di/               Hilt modules (NetworkModule, DatabaseModule)
├── notification/     Per-app channel management, priority→behaviour mapping
├── service/          GotifyListenerService (foreground), BootReceiver
└── ui/
    ├── appinbox/     Per-app message list
    ├── apps/         Application management screen
    ├── components/   Shared composables (AppIcon, MessageCard, ConnectionDot…)
    ├── detail/       Message detail with Markdown + action buttons
    ├── home/         Main message feed with filter chips
    ├── login/        Server URL + auth screen
    ├── navigation/   NavHost, bottom bar, route constants
    ├── search/       Cached search with result highlighting
    ├── servers/      Server info sheet
    ├── settings/     Settings screen
    ├── theme/        Material 3 color schemes, priority colours
    └── viewmodel/    One ViewModel per screen + AppStartupViewModel

Notification Priority Mapping

Gotify priorityAndroid behaviour
0No notification
1 – 3Silent (IMPORTANCE_LOW)
4 – 7Sound (IMPORTANCE_DEFAULT)
8 – 10Sound + optional vibration (IMPORTANCE_HIGH)

Gotify API Coverage

EndpointUsed for
POST /clientCreate client token on login
DELETE /client/{id}Revoke token on logout
GET /current/userValidate elevated user sessions
GET /messageFetch + paginate all messages
DELETE /message/{id}Delete single message
DELETE /messageDelete all messages
GET /applicationList applications
POST /applicationCreate application
PUT /application/{id}Edit application
DELETE /application/{id}Delete application
DELETE /application/{id}/messageClear app messages
GET /healthInspect server health
POST /application/{id}/imageAPI available; UI upload is pending
GET /streamWebSocket — real-time message stream
GET /versionVerify server reachability

Permissions

PermissionReason
INTERNETServer communication
FOREGROUND_SERVICEKeep WebSocket alive in background
POST_NOTIFICATIONSShow push notifications (Android 13+)
RECEIVE_BOOT_COMPLETEDRestart listener after reboot
VIBRATEHigh-priority notification vibration

Acknowledgements

Apps & tools

More like this