Zentra gameplay in a voxel forest

Project report

Zentra

A browser third-person arena shooter.

StatusDiscontinued pet project
ClientNext.js + React Three Fiber
ServerNestJS
Realtimesocket.io
Profile dataREST
AuthSupabase
Match stateRedis
Lifetime statsPostgres via TypeORM
Play ZentraView on GitHub

Pet project. Discontinued, no further development.

On this page

Overview

Zentra is a browser third-person arena shooter. A Next.js + React Three Fiber client renders a forest map. A NestJS server runs the match. The two talk over one socket.io connection for everything real-time, and over REST for durable profile data. Supabase handles login. Redis holds only the current match. Postgres (via TypeORM) holds only lifetime kills, deaths and match counts.

Authority model

The server is authoritative about who got hit and whether they died. It is not authoritative about where players are: the client reports its position every frame and the server stores and rebroadcasts it. Shots are hit-tested on the server, rewound slightly for the shooter, and can be vetoed by terrain and trees. Bots are ordinary player records driven by the same movement and combat functions a socket would call. The client has no bot-specific code.

Where state lives

StateOwnerNotes
Hits and deathsServerAuthoritative
Player positionClientReported every frame; the server stores and rebroadcasts it
Current matchRedisCurrent match only
Lifetime kills, deaths, match countsPostgresVia TypeORM
LoginSupabaseHandles login

Match lifecycle

A match lasts 10 minutes. A new room starts with five bots, and later players join the existing room, so a match is a rolling world rather than a fixed lobby.

Articles

Status

Zentra was a pet project and is discontinued from further development.