← All assets

Team Workspace

Univerge

A team workspace where chat and time-tracked task boards sit side by side, and one profile carries your affiliations between instances.

In development · live at univerge.life
18,515
Lines of code

across 21 page routes

14
Data models
41
API endpoints
29
Realtime handlers

What it is

Inside Univerge

Univerge is a community platform with a task manager fused into it. A workspace holds channels, and a channel can be a conversation or a task board — the two are the same kind of object, which is the idea the product is built around. Every task is also a stopwatch, so the time a thing took is recorded by doing it rather than by remembering to log it afterwards.

The second half is identity. One codebase runs in two roles: as the hub at univerge.life, which is an OpenID Connect provider, or as an instance a business self-hosts on its own infrastructure with its own database. Staff sign in to the private instance with their public profile, and the instance can publish an affiliation back to the hub — which the person, not the employer, decides whether to show. It is badges only by design: no message relay, no content federation.

It is honestly mid-build. The backend ran well ahead of the interface: the realtime layer, the permission system and the whole federated-identity stack are built and tested, while the surface that would let anyone actually use the federation features does not exist yet. The site is live and reachable, the repo has been quiet since July 2026, and it is fairer to call it unfinished than abandoned.

Built with

  • Nuxt 4
  • Vue 3
  • TypeScript
  • MongoDB + Mongoose
  • better-auth (OIDC)
  • Socket.IO
  • Tailwind 4

Capabilities

What it actually does.

01

A stopwatch that cannot drift

The server stores two things: accumulated milliseconds and whether the clock is paused. No timer runs server-side. The client anchors to a start point and recomputes elapsed time from the wall clock on every tick, so interval jitter and background-tab throttling cannot accumulate error — and a second device reconstructs the identical anchor, showing the same running time to the millisecond.

02

Federated sign-in, badge only

The hub is an OpenID Connect provider; a self-hosted business instance is a client. Server-to-server calls are signed, compared in constant time, and rejected outside a five-minute window so a captured request cannot be replayed. A business cannot publish an affiliation for someone who never actually signed in through it — that is checked against a ledger and refused outright.

03

Channels that are task boards

A channel declares its type, and one of the types is a task board. So a workspace’s sidebar mixes conversations and work in the same list, rather than bolting a project tool onto a chat tool.

04

Realtime that reaches every device

Sockets authenticate against the session on connect and join a room per user and per workspace. Mutations broadcast to the owner’s room so all of their devices update at once, then fan out to each permitted contact’s room.

05

Optimistic reordering that does not fight itself

Drag-to-reorder applies locally, then the server broadcasts to everyone including the sender — deliberately. To stop the sender yanking its own list back, the incoming broadcast is diffed against the reorder still in flight and ignored only when every position matches.

06

Drag and drop that survives a touchscreen

Touch listeners register in the capture phase, ahead of the drag library’s own, so a tap landing on a button inside a draggable row is not eaten by the drag system. It also finds the nearest scrollable ancestor rather than assuming the window.

Related

Where it sits.

Want something like this?

We build the same way for other people.