Projects

What I've Been Building

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!


PythonFastAPIPostgreSQLSQLAlchemy 2.0AlembicCeleryRedisReactRechartsAWS

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% faster
v0.1.0: 4 transitionsv0.2.0: 9 transitions

Player House

38.1% faster
v0.1.0: 10 transitionsv0.2.0: 10 transitions

Town

33.9% faster
v0.1.0: 20 transitionsv0.2.0: 26 transitions

Funnels

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

-2

Completed

18

Raise the Hall

Accepted

18

Relight the Forge

-2

Completed

16

Relight the Forge

-5

Accepted

11

Mend the Workshop

Completed

11

Mend the Workshop

-5

Accepted

6

Tools of the Trade

Completed

6

Tools of the Trade

Select a quest

Overall Funnel

Accepted2290.9% conversion · 2 droppedCompleted20

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

PlayerSessionsPlaytimeQuestsVersionStatus

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)

PlayerStartedDurationEventsVersion
Player 662355 Jul, 16:435m 53s395
Player 120065 Jul, 13:323m 5s249
Player 662355 Jul, 16:304m 52s231
Player 120065 Jul, 13:393m 51s205
Player 120065 Jul, 13:273m 12s144

Synthetic Sessions(35)

PlayerStartedDurationEventsVersion
Player 1514 Jul, 09:1211m 33s511v0.2.0
Player 1916 Jul, 13:1510m 36s490v0.2.0
Player 87 Jul, 14:2911m 11s483v0.1.0
Player 1814 Jul, 17:5210m 49s474v0.2.0
Player 16 Jul, 19:078m 53s410v0.1.0
Player 2013 Jul, 17:288m 26s380v0.2.0
Player 1213 Jul, 18:397m 52s371v0.2.0
Player 37 Jul, 13:067m 40s354v0.1.0
Player 1113 Jul, 21:477m 34s347v0.2.0
Player 66 Jul, 19:477m 32s345v0.1.0
Player 1010 Jul, 13:316m 42s302v0.1.0
Player 96 Jul, 09:277m 16s297v0.1.0
Player 1415 Jul, 17:124m 18s266v0.2.0
Player 1616 Jul, 19:504m 12s217v0.2.0
Player 26 Jul, 14:274m 58s207v0.1.0
Player 1214 Jul, 14:015m 23s193v0.2.0
Player 67 Jul, 14:465m 16s182v0.1.0
Player 1114 Jul, 11:144m 50s178v0.2.0
Player 2014 Jul, 13:124m 40s161v0.2.0
Player 28 Jul, 09:392m 51s146v0.1.0
Player 1413 Jul, 16:093m 27s138v0.2.0
Player 1615 Jul, 21:452m 6s128v0.2.0
Player 78 Jul, 21:452m 3s123v0.1.0
Player 710 Jul, 15:381m 31s106v0.1.0
Player 97 Jul, 10:251m 25s96v0.1.0
Player 17 Jul, 15:393m 1s94v0.1.0
Player 76 Jul, 16:292m 7s69v0.1.0
Player 56 Jul, 21:222m 27s69v0.1.0
Player 1713 Jul, 09:012m 19s69v0.2.0
Player 1614 Jul, 21:472m 6s67v0.2.0
Player 1815 Jul, 17:131m 31s39v0.2.0
Player 46 Jul, 13:291m 3s38v0.1.0
Player 1314 Jul, 15:501m 6s38v0.2.0
Player 106 Jul, 17:350m 52s36v0.1.0
Player 1913 Jul, 12:240m 46s36v0.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

Event NameCount