visitify-web
Next.js 16 Dashboard
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.
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.
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.
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).
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.
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
}