Skip to content
karim.semaan(open to work)
WorkExperienceAboutSkillsContactResume ↓
← All work
Covey Town preview
Full-stackCompleted2024

Covey Town

achievements system for a live multiplayer virtual town

Delivered a working achievements layer for Covey.Town: event-driven progress tracking, a filterable modal, global completion stats, custom achievement creation, and in-chat earned-achievement popups, all covered by 7 test files.

Achievements system · mini townSynthetic recreation · no real data

Walk the town with the arrow keys (or W A S D) once the board is focused, or use the move buttons. Each step counts 10 feet; at 100 feet the Walk 100 Feet achievement unlocks and broadcasts into the town chat, like the real feature.

Walk 100 Feet

PLAYER_WALK criterion · Global category

0 / 100 feet · 0 steps

Town chat
  • town · Achievements online. 5 preset achievements loaded.

The earned-achievement popup lands here, like the real socket broadcast.

Use the arrow keys or the move buttons to start walking.

Synthetic preview. No real data: no live town, players, or sockets. Walk 100 Feet is one of the 5 real preset achievements our CS4530 team shipped (PLAYER_WALK criterion, Global category); this page compresses the scale to 10 feet per step so it unlocks in ten steps.

Synthetic recreation of the team's achievements feature. Walk 100 Feet is a real preset (PLAYER_WALK criterion); no real town, player, or game data.

Built as the CS4530 Software Engineering final project by a team of four, this adds a complete achievements layer to the existing Covey.Town codebase. On the backend (Node.js, Express, Socket.IO, tsoa), an AchievementManager loads achievement definitions from JSON at startup, registers per-player progress listeners keyed to criteria event types (PLAYER_WALK, INTERACT_WITH_GAME_OBJECT, WIN_CONNECT_FOUR, GET_ACHIEVEMENT), and emits an in-game chat-message popup over the socket broadcast when a player earns an achievement. The REST layer (tsoa-generated OpenAPI) exposes endpoints for listing achievements, fetching and updating per-player progress, reading global completion rates, toggling achievement activation, and creating custom achievements. On the frontend (React, Chakra UI, Phaser), a keyboard-triggered progress modal lets players view their own or another player's achievements filtered by status (All, Completed, Incomplete, Unstarted, Self-Made) or category (Global, Tic-Tac-Toe, Connect Four), with per-achievement progress bars and global-completion percentages. Players can also author custom achievements directly from the video-call menu bar. The feature ships with 5 preset achievement definitions and 7 dedicated test files covering components, listeners, and the manager.

  • TypeScript
  • React
  • Chakra UI
  • Phaser 3
  • Node.js
  • Express
  • Socket.IO
  • tsoa
  • Jest
  • React Testing Library
Team size
4 engineers
Preset achievements
5
Criteria event types
4 (walk, interact, win, chain)
Achievement test files
7
Achievement categories
3 (Global, Tic-Tac-Toe, Connect Four)
Custom achievements
User-created, in-town

Where the numbers come from

  • ›The project poster (this card's cover) credits Group 416 as Karim, Shai…

    The project poster (this card's cover) credits Group 416 as Karim, Shai, and George; the team size of 4 comes from the owner's project records, which include a fourth member not named on the poster.

  • ›Custom achievements are counted as a capability, not a number: the poster…

    Custom achievements are counted as a capability, not a number: the poster documents the in-town add-achievement form rather than a tally of created achievements.

What I'd improve

The progress modal re-fetches from the server on every open rather than subscribing to a socket event, which causes a visible round-trip delay. A socket-push model, or even a local cache invalidated by the existing chatMessage event, would make progress feel instant. I would also extract the achievement definitions from flat JSON into a typed builder API to catch schema drift at compile time.

Request accessProject report (PDF)↗︎
Want something like this? Get in touch →

Measured:30/30 chatbot evals·20-case Bastion eval·Serving·Calibration Lab

© 2026 Karim SemaanBuilt with Next.js, Tailwind & Supabase.LinkedIn ↗︎GitHub ↗︎