← All projects

FULL STACK · JAVA + ANGULAR

AeridesA seat for every role. No double booking.

Aerides is a multi-tenant web app for organising gaming sessions: events with role-based slots, sign-ups and a FIFO waitlist. When someone withdraws, the first person waiting is promoted in the same transaction, sees the update live and receives an email. Java and Spring Boot on the backend, Angular on the frontend, with an Italian and English UI.

The free demo may take about two minutes to start. The entry page wakes it up and opens the app when it is ready.

Scope
Gaming groups · resource booking · per-group roles
Stack
Java 21 · Spring Boot 4.1 · Angular 22 · PostgreSQL 17 · Docker
Quality
150 backend unit tests · 206 integration tests · 91 Jest · 2 Playwright e2e tests
Status
Demo on Render and Neon · GitHub Actions CI · Azure Terraform validated, not applied
01

The goal

Organising a session means matching availability, capacity and group composition. Two simultaneous sign-ups must not take the same last seat, withdrawals must release it to the next person waiting, and each group must see only its own data.

02

How it works

A modular Spring Boot monolith with REST APIs, PostgreSQL and an Angular standalone frontend with signals. Groups have owners, officers and members; events move through drafts, publishing and completion. Database transactions and locks protect booking rules, while WebSocket, email and Discord notifications run after commit.

Features

Events and weekly series

Calendar, filters, drafts and series in the organiser’s time zone, including daylight saving changes.

Sign-ups and approvals

Tank, Healer and DPS slots, a FIFO waitlist and optional officer approval.

Live updates

A withdrawal promotes the next person waiting: a WebSocket page update, personal toast and email in the recipient’s language.

Groups, audit and statistics

Invitations, per-group permissions, action history, attendance and unfilled roles.

Screens

Aerides monthly calendar with group events and a draft marked with a dashed border.
Event calendar
Vault of Glass raid: Tank, Healer and DPS slots, confirmed participants and Luca on the Tank waitlist.
Role-based slots and waitlist
Luca’s page after a withdrawal: confirmed Tank sign-up and a live promotion notification without a reload.
Live promotion after a withdrawal
Group statistics: events per month, unfilled roles and attendance per member.
Attendance statistics
Raid detail on a phone with the date, description, role-based slots and sign-up status.
Event detail on mobile

Screenshots taken on 27 October 2026 from the local Docker stack with demo data. Names and groups are fictitious.

Technical decisions

01

Concurrency tested against the database

A pessimistic slot lock serialises sign-ups. A test with 20 parallel requests for 3 seats confirms exactly 3 participants. Withdrawal and promotion are atomic.

02

Notifications after commit

Transactional listeners send updates and notifications only after commit: no user is told about a rolled-back change.

03

Isolation and revocable access

Every endpoint checks authorisation and lookups are scoped to the group. WebSocket subscriptions check permissions; connections close when access is revoked or tokens expire.

04

Tests with real services

Testcontainers PostgreSQL, GreenMail and STOMP clients verify concurrency, isolation, email and realtime behaviour. Playwright exercises two users and the full promotion flow.

Something similar in mind?

Tell me about it ↗