LudoSense
Game Analytics Platform
LudoSense is a game analytics platform I built to capture, process, and visualise player telemetry from my thesis game, The Undoing of Ashvale. The system spans the full vertical stack: a GDScript SDK plugin that instruments the game client with event batching and retry-on-failure, a Python backend (FastAPI, Celery, Redis) that ingests and processes those events, a PostgreSQL database, and a React dashboard, all originally hosted on AWS.
The data pipeline follows a medallion architecture: raw events land in bronze tables exactly as the game client sends them, scheduled Celery tasks clean and normalise them into silver tables, and gold tables aggregate the results into hourly, daily, weekly, or monthly metrics that power the dashboard. The gold layer is fully configurable in that developers can define what their events mean (using counters, funnels, duration distributions, segmented breakdowns), and the pipeline computes the results automatically. Adding a new metric means writing a definition, not changing the ingestion path. This allows developers to build their own metrics mapped to however they've sent their raw events to the bronze tables.
The AWS infrastructure has since been taken down to avoid idle costs, but everything you see below is the real output of that pipeline, served as static JSON for the purposes of a portfolio piece. The data covers 20 synthetic players across two game versions (v0.1.0 before a fabricated performance patch and v0.2.0 after) along with 2 real thesis players, which demonstrates the full analytics loop: instrument a change, measure the result, and see if there is an improvement. The synthetic data was created based on the actual thesis play sessions and was made in a way that best showcases what LudoSense can do. As this is an ongoing project, the GitHub repository remains private, but I will be creating a specific public repo shortly for anyone interested in how the metrics are actually calculated. Keep an eye out for the updated link to the repo!
Overview
Key metrics built into LudoSense
The overview below shows four key metrics at a glance, each represented as a card with a sparkline trend. Click any card to expand it and see the full chart: a line chart for counters, a stacked bar for breakdowns, a funnel for quest completion, or a duration chart for scene load times. The back button returns to the grid.
Performance
Showcasing differences between two game versions
The version comparison is the centrepiece of the data story. The synthetic data contains two versions: v0.1.0 as the initial release, and v0.2.0 with a targeted performance patch. The charts below show scene load times side by side, highlighting the average, min, and max time per scene transition, so the improvement is immediately visible. Look at each scene to see how the patch affected each one.
Overall Improvement
↓ 40.9%
average scene load time reduction across 3 scenes
Forest
↓ 50.7% fasterPlayer House
↓ 38.1% fasterTown
↓ 33.9% fasterFunnels
A deeper analysis of quest completion rates
Funnel analysis tracks how players progress through each quest chain, from accepting a quest, through each quest step, to completion. The drop-off between acceptance and completion reveals where players disengage or get stuck, which is very useful information for developers continuing to expand their games. Select a quest below to see its conversion funnel and the daily completion trend.
Quest Chain Progression
Completed
20
A Town Called Ashvale
Accepted
20
Raise the Hall
Completed
18
Raise the Hall
Accepted
18
Relight the Forge
Completed
16
Relight the Forge
Accepted
11
Mend the Workshop
Completed
11
Mend the Workshop
Accepted
6
Tools of the Trade
Completed
6
Tools of the Trade
Select a quest
Overall Funnel
Completion Rate
90.9%
Total Accepted
22
Total Completed
20
Daily Completion Rate
Players
Comprehensive data per player
Aggregate metrics tell you what's happening across the game, but per-player views help showcase who's doing what. The table below shows every player in the dataset with their session count, total playtime, quest progression, and retention status. Click any row to see which quests they completed and their activity timeline. Filter between thesis players (real dissertation playtesters) and synthetic players (generated data).
22
Players
40
Total Sessions
1.8 avg per player
8m 41s
Avg Playtime
per player
68%
Retention
15 of 22 active
3.2
Avg Quests
of 5 total
6
Full Completion
of 22 players
22 players
| Player | Sessions | Playtime | Quests | Version | Status |
|---|---|---|---|---|---|
| Player 12 | 2 | 13m 15s | 5 / 5 | v0.2.0 | Active |
| Player 20 | 2 | 13m 06s | 5 / 5 | v0.2.0 | Active |
| Player 6 | 2 | 12m 48s | 5 / 5 | v0.1.0 | Active |
| Player 11 | 2 | 12m 24s | 4 / 5 | v0.2.0 | Active |
| Player 18 | 2 | 12m 20s | 4 / 5 | v0.2.0 | Active |
| Player 1 | 2 | 11m 54s | 5 / 5 | v0.1.0 | Active |
| Player 15 | 1 | 11m 33s | 4 / 5 | v0.2.0 | Churned |
| Player 19 | 2 | 11m 22s | 4 / 5 | v0.2.0 | Active |
| Player 8 | 1 | 11m 11s | 4 / 5 | v0.1.0 | Churned |
| Player 66235Thesis | 2 | 10m 45s | 5 / 5 | — | Active |
| Player 12006Thesis | 3 | 10m 08s | 5 / 5 | — | Active |
| Player 9 | 2 | 8m 41s | 3 / 5 | v0.1.0 | Active |
| Player 16 | 3 | 8m 24s | 3 / 5 | v0.2.0 | Active |
| Player 2 | 2 | 7m 49s | 3 / 5 | v0.1.0 | Active |
| Player 14 | 2 | 7m 45s | 2 / 5 | v0.2.0 | Active |
| Player 3 | 1 | 7m 40s | 3 / 5 | v0.1.0 | Churned |
| Player 10 | 2 | 7m 34s | 3 / 5 | v0.1.0 | Active |
| Player 7 | 3 | 5m 41s | 2 / 5 | v0.1.0 | Active |
| Player 5 | 1 | 2m 27s | 1 / 5 | v0.1.0 | Churned |
| Player 17 | 1 | 2m 19s | 1 / 5 | v0.2.0 | Churned |
| Player 13 | 1 | 1m 06s | 0 / 5 | v0.2.0 | Churned |
| Player 4 | 1 | 1m 03s | 0 / 5 | v0.1.0 | Churned |
Session Replay
Comprehensive details of every play session
When aggregate metrics flag something interesting, the next step is drilling into individual sessions. The replay view lets you browse all recorded sessions, filter by version, and select one to see its complete event timeline. Every event is expandable to inspect the full payload, scene transitions, dialogue sequences, quest progress, and harvesting actions, all in chronological order.
Select a session to inspect
Thesis Sessions(5)
| Player | Started | Duration | Events | Version |
|---|---|---|---|---|
| Player 66235 | 5 Jul, 16:43 | 5m 53s | 395 | — |
| Player 12006 | 5 Jul, 13:32 | 3m 5s | 249 | — |
| Player 66235 | 5 Jul, 16:30 | 4m 52s | 231 | — |
| Player 12006 | 5 Jul, 13:39 | 3m 51s | 205 | — |
| Player 12006 | 5 Jul, 13:27 | 3m 12s | 144 | — |
Synthetic Sessions(35)
| Player | Started | Duration | Events | Version |
|---|---|---|---|---|
| Player 15 | 14 Jul, 09:12 | 11m 33s | 511 | v0.2.0 |
| Player 19 | 16 Jul, 13:15 | 10m 36s | 490 | v0.2.0 |
| Player 8 | 7 Jul, 14:29 | 11m 11s | 483 | v0.1.0 |
| Player 18 | 14 Jul, 17:52 | 10m 49s | 474 | v0.2.0 |
| Player 1 | 6 Jul, 19:07 | 8m 53s | 410 | v0.1.0 |
| Player 20 | 13 Jul, 17:28 | 8m 26s | 380 | v0.2.0 |
| Player 12 | 13 Jul, 18:39 | 7m 52s | 371 | v0.2.0 |
| Player 3 | 7 Jul, 13:06 | 7m 40s | 354 | v0.1.0 |
| Player 11 | 13 Jul, 21:47 | 7m 34s | 347 | v0.2.0 |
| Player 6 | 6 Jul, 19:47 | 7m 32s | 345 | v0.1.0 |
| Player 10 | 10 Jul, 13:31 | 6m 42s | 302 | v0.1.0 |
| Player 9 | 6 Jul, 09:27 | 7m 16s | 297 | v0.1.0 |
| Player 14 | 15 Jul, 17:12 | 4m 18s | 266 | v0.2.0 |
| Player 16 | 16 Jul, 19:50 | 4m 12s | 217 | v0.2.0 |
| Player 2 | 6 Jul, 14:27 | 4m 58s | 207 | v0.1.0 |
| Player 12 | 14 Jul, 14:01 | 5m 23s | 193 | v0.2.0 |
| Player 6 | 7 Jul, 14:46 | 5m 16s | 182 | v0.1.0 |
| Player 11 | 14 Jul, 11:14 | 4m 50s | 178 | v0.2.0 |
| Player 20 | 14 Jul, 13:12 | 4m 40s | 161 | v0.2.0 |
| Player 2 | 8 Jul, 09:39 | 2m 51s | 146 | v0.1.0 |
| Player 14 | 13 Jul, 16:09 | 3m 27s | 138 | v0.2.0 |
| Player 16 | 15 Jul, 21:45 | 2m 6s | 128 | v0.2.0 |
| Player 7 | 8 Jul, 21:45 | 2m 3s | 123 | v0.1.0 |
| Player 7 | 10 Jul, 15:38 | 1m 31s | 106 | v0.1.0 |
| Player 9 | 7 Jul, 10:25 | 1m 25s | 96 | v0.1.0 |
| Player 1 | 7 Jul, 15:39 | 3m 1s | 94 | v0.1.0 |
| Player 7 | 6 Jul, 16:29 | 2m 7s | 69 | v0.1.0 |
| Player 5 | 6 Jul, 21:22 | 2m 27s | 69 | v0.1.0 |
| Player 17 | 13 Jul, 09:01 | 2m 19s | 69 | v0.2.0 |
| Player 16 | 14 Jul, 21:47 | 2m 6s | 67 | v0.2.0 |
| Player 18 | 15 Jul, 17:13 | 1m 31s | 39 | v0.2.0 |
| Player 4 | 6 Jul, 13:29 | 1m 3s | 38 | v0.1.0 |
| Player 13 | 14 Jul, 15:50 | 1m 6s | 38 | v0.2.0 |
| Player 10 | 6 Jul, 17:35 | 0m 52s | 36 | v0.1.0 |
| Player 19 | 13 Jul, 12:24 | 0m 46s | 36 | v0.2.0 |
Select a session above to view its event timeline.
Event Catalogue
Ability to search for specific events
The game client emits 59 distinct event types, from scene transitions and dialogue interactions to quest state changes and resource harvesting. The catalogue below shows every event type with its total count and an example payload. Search to find specific events or browse to see the breadth of instrumentation.
59 events