Java 17 Spring Boot Next.js 16 Flutter PostgreSQL WebSocket Docker

Wizitify — Visitor Management System

End-to-end, production-ready VMS built across three codebases: a Spring Boot REST + WebSocket API, a Next.js 16 admin dashboard, and a cross-platform Flutter kiosk app. Handles the full visitor lifecycle — check-in, document signing, real-time notifications, and GDPR-compliant data retention.

The Challenge

Most organisations still manage physical visitor access through paper logbooks or fragmented, single-purpose tools — creating security gaps, compliance headaches, and a poor first impression for guests. Scaling that across multiple office locations with different notification rules and document requirements compounds the problem further.

The goal was to build a unified platform that handles the complete visitor lifecycle — from pre-registration and self-service kiosk check-in to digital document signing, real-time host alerts, and GDPR-compliant retention — without requiring any specialised hardware beyond a commodity Android tablet at the entrance.

The Solution

Wizitify is split across three purpose-built codebases that communicate over REST and WebSocket. The Spring Boot API owns the domain model and business logic, serving both the Next.js web dashboard and the Flutter kiosk over the same authenticated endpoints. Real-time visit events are broadcast via SockJS + Socket.IO so every connected dashboard reflects check-ins instantly — no polling required.

The email layer abstracts over AWS SES and Brevo SMTP behind a single EmailSender interface; the active provider is toggled with one environment variable and zero code changes, enabling instant rollback. Async delivery via @Async + @Retryable ensures email failures never degrade API response times.

Technical Implementation

Spring Boot API

18+ REST controllers covering visits, visitors, document signing, kiosk devices, notification rules, retention policies, and org/user management. Flyway-versioned PostgreSQL schema, Redis for session caching, multi-profile deployment (dev / beta / prod).

Flutter Kiosk App

Riverpod state management, Dio HTTP client, Hive + Flutter Secure Storage for encrypted local persistence, Workmanager for background heartbeat pings, and Wakelock Plus to keep the kiosk screen active. Targets Android, iOS, Web, macOS, Linux, and Windows.

Swappable Email Provider — EmailSender Abstraction

// Single interface — two implementations
public interface EmailSender {
    void send(EmailMessage message);
}

// Active provider resolved from environment
@Value("${MAIL_PROVIDER:brevo}")
private String mailProvider;

// Swap provider: zero code change, instant rollback
// MAIL_PROVIDER=ses   → AwsSesEmailSender
// MAIL_PROVIDER=brevo → BrevoSmtpEmailSender

@Async
@Retryable(maxAttempts = 3)
public void dispatchAsync(EmailMessage message) {
    emailSender.send(message); // never blocks API thread
}