Skip to main content
Back to selected work
Case Study · 2025

Terathos
The wound of mortality.

A web-native souls-like that lives inside a browser tab and still asks you to bleed for progress. TypeScript, PixiJS, and GSAP on the surface; a NestJS spine that never trusts the client.

Role
Design, engineering, backend
Year
2025 → ongoing
Stage
Closed playtest
Terathos — title screen: THE WOUND OF MORTALITY
Fig. 01pastacode.xyz / title
01

Genesis

A souls-like with no launcher, no installer, no excuse not to die again.

I've been making games for over a decade — Unity, Phaser, casino clients, multiplayer experiments. Terathos started from a simple question: what would a souls-like feel like if it lived on the open web?

No installer. No storefront. Just a URL and a door that says enter as guest. What came out is half roguelike, half bestiary — a pixel world where every death teaches you something, and every session leaves a mark you can't take back.

02

The craft

Three things carry the whole experience.

Combat
Stamina, windups, recovery frames. Timing is everything. No auto-aim, no quick-saves, no softening. The game punishes, it doesn't reward.
Space
Procedural rooms, hand-tuned encounters. Generation gives the world scale; handwritten design keeps it meaningful.
Voice
One long editorial thread — item flavor, boss inscriptions, whispers between runs. Nothing is lore-dumped. Everything is earned.
03

The hard problem

It's not a rendering problem. It's a trust problem.

The browser is a hostile runtime: devtools open, memory inspectable, every network call interceptable. A souls-like whose progress matters has to defend the player's memento.

So the client is intentionally thin. Runs are authenticated. State is reconciled. Even the bestiary you're filling in lives on the server. The window is beautiful; the truth is elsewhere.

04

What I'm still learning

The web demands a restraint console games never did.

Every asset is a download. Every animation is bandwidth. Every sprite that loads is a moment the player feels the game before the game has started.

Shipping Terathos has been a continuous exercise in asking, for every pixel: do you earn your keep?

Stack

  1. 01

    PixiJS

    Retained-mode rendering, 60fps with dozens of animated sprites on screen.

  2. 02

    GSAP

    Everything the player feels: hit flashes, damage numbers, screen-shake, UI weight.

  3. 03

    TypeScript

    ECS-style entity layer. Systems compose without inheritance drowning them.

  4. 04

    NestJS

    Authenticated APIs, server-side validation, one source of truth per run.

  5. 05

    PostgreSQL

    Progression, bestiary, leaderboards. Relational, indexed, verifiable.