A LAN-first self-hosted messaging platform, built for IT labs, schools and air-gapped networks where messages must never leave the local network. Ordinary messengers need the internet and third-party servers; Quique does not.
Flutter client over a PHP/PostgreSQL REST backend, real-time messaging, rich media.
Formerly "ClassChat". The repository name is
projectcapolavoro; the app ships as Quique (older docs still say "Crimson Chat").
Features
- 1-to-1 and group chat, with delivery and read receipts
- Typing and "recording" presence indicators
- File sharing of any type, with inline previews for images, GIF, video, audio, PDF and code
- Per-chat, per-device theming — background, bubbles, everything
- Offline-first: local Hive queue plus LAN peer-to-peer delivery over mDNS
- On-device translation (ML Kit), canonicalising stored messages to English
- HMAC-SHA256 request signing on every API call
Tech stack
| Layer | Stack |
|---|---|
| App | Flutter / Dart, Material 3 |
| State | ValueNotifier + ChangeNotifier — no provider/bloc, no codegen |
| Local storage | Hive (offline queue), SharedPreferences (config, session) |
| Backend | PHP, procedural, no framework, PDO + PostgreSQL |
| Realtime | HTTP polling (8 s ⇄ 2 s adaptive) |
Targets Android, iOS, Windows, Linux, macOS and Web.
Run it
php -S 127.0.0.1:8000 -t webService # backend
cd flutterapp && flutter run # client
Database credentials live in webService/db.php (edit per machine; there is
no .env), read from DATABASE_URL on the deployed setup. Seed three test
users with php webService/seed.php.
Known limits, stated up front
- End-to-end encryption is not implemented. The schema carries scaffolding for E2EE / PEC / 2FA; the client does not use it.
- The Ratchet WebSocket server exists but cannot run; real-time is HTTP polling.
flutterapp/android/local.propertieshardcodes a SDK path and must be regenerated per machine.- The historical README says MySQL: the backend was migrated to PostgreSQL.
Full detail in the repository's docs.md §15 and its todo.md.