← Nicholas Boey

Sharlock Hub

Year
2026
Role
Platform & integration lead
Team
Team of 6
Stack
Vue 3, Babylon.js, Express, MongoDB, WebSockets, Playwright
Links
Repository · Video

Students walk a 3D harbour town as a capybara detective and enter buildings to play short security games; instructors run classes and see results. I built the platform (accounts, classes, scoring), the 3D hub with its 2D fallback, and two of the games, and integrated the rest. I wrote 407 of about 524 commits.

What it is

A cybersecurity learning web app for the SMU course IS216, built by a team of six (me, Keane, Eric, Russell, Xin Lei and Athithya) between 16 September and 6 November 2026. Each building in the town is a short game on one security topic.

Vue 3 client (browser)3D hub (Babylon.js) or 2D townGames, The Sharlock TimesREST /apiWebSocketExpress 5 APIAuth and sessions, classesAttempts and scoringNews proxy, Gemini callerPresence and Botnet Tag (WebSocket)MongoDBdatabaseGuardian APIexternalGeminiexternal
Sharlock Hub architecture. Dashed boxes are external services; the accent line is the WebSocket channel.

What I built

I was platform and integration lead.

The course exercises stored tokens in localStorage. We chose HttpOnly cookies instead, to avoid token theft through XSS. The cost was that we needed CSRF protection.

AI use

As declared in the project README, we used Codex and Claude Code as planner and tutor, and wrote first versions and bug fixes by hand. AI generated most tests, the 3D models (from our Photoshop references), the NPC dialogue and the code and security reviews. With six people running agents in one repository, I wrote the rules file every agent had to follow: read context first, plan before coding, ask before editing, stay out of other contributors’ modules, and check for collisions before starting a feature.

Scale

Measure Count
Commits (mine, of about 524) 407
Vitest test files (team) 262
Playwright end-to-end journeys (team) 36

I set up the team’s testing tools: Vitest for unit, component and API integration tests, Playwright for end-to-end journeys, and disposable test databases so integration and end-to-end runs never touch real data.

Limits