Skip to content
back to the quest log
Atlas discovery dashboard with a featured project hero
legendary◆ productlive

MGM Atlas

Four SaaS tools, one self-hosted app

The lab's project HQ: portfolio, chat, PMO and voice in one place, so nobody pays for Jira and Slack anymore.

role
Head of IT Infrastructure & Architecture
org
MGM Laboratory
when
2025 — 2026

What it is

A research lab was losing its team between four subscriptions. Atlas replaces all of them with one self-hosted app — Netflix-style project discovery, Slack-style chat, a ClickUp-style PMO with kanban, Gantt, notes and collaborative whiteboards, and Discord-style voice rooms with screen share.

I owned the architecture and the infrastructure underneath: a NestJS API with 15 feature modules, 41 controllers and 48 Prisma models, three Socket.IO namespaces, a Yjs sidecar for live collaborative documents, LiveKit as the WebRTC SFU with egress recording, and Keycloak in front of all of it.

It runs on the lab's own hardware, behind its own reverse proxy, with presigned S3 uploads and VAPID push straight to the browser. No vendor holds the data.

where the effort went

  • Scale78
  • Realtime92
  • Security80
  • Craft88

the numbers

Feature modules
15
REST controllers
41
Prisma models
48
Internal users
100+

built with

  • Next.js
  • React
  • TypeScript
  • NestJS
  • Prisma
  • PostgreSQL
  • Socket.IO
  • LiveKit
  • Keycloak
  • Yjs
  • Redis
  • S3
  • Docker

delivery record

What I made

The lab's projects, conversations, tasks, documents, and calls were split across paid services with separate accounts and fragmented context.

  • 01

    Project discovery and portfolio workspace

  • 02

    Real-time team and project chat across three Socket.IO namespaces

  • 03

    Kanban, Gantt, notes, files, and Yjs collaborative whiteboards

  • 04

    LiveKit voice, video, screen sharing, and recording

  • 05

    Keycloak identity, browser push, and presigned object uploads

  • 06

    Self-hosted deployment on laboratory infrastructure

Hard problems

The constraints mattered as much as the finished interface.

01field note

Four collaboration models in one product

problem
Projects, chat, planning, and live calls have different real-time and permission semantics but must feel like one workspace.
response
I separated feature modules and event namespaces while keeping identity, project membership, notifications, and files shared across them.
02field note

Collaborative state beyond ordinary requests

problem
Whiteboards and calls need conflict-aware documents and low-latency media, neither of which fits a REST-only API.
response
Yjs handles shared document state and LiveKit supplies the media plane, leaving NestJS and PostgreSQL as the durable application core.

Screens

after shipping

What stayed with me

  • A unified product works when shared identity and context are stronger than the seams between its specialist subsystems.

  • Self-hosting only saves money when upgrades, storage, and operational ownership are designed into the product.