CRISTIAN RENOSTO← All projects

Project

Quique

A high-performance, self-hosted communication platform built for IT labs and strict LAN environments.

What it does

Run it locally

Backend (from the repository root)

php -S 127.0.0.1:8000 -t webService

Flutter client

cd flutterapp && flutter run

Documentation

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.properties hardcodes 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.