Mesa Digital

Centralized request system for the Digital Resources Office at Universidad César Vallejo: tickets, notifications, calendar, knowledge base, and real-time dashboard.

Mesa Digital — UCV ticketing platform

Sobre el Proyecto

Mesa Digital centralizes into a single channel every request handled by the Digital Resources Office at Universidad César Vallejo: tickets, notifications, calendar, knowledge base, and dashboard, so nobody has to ask 'how's my request going?' again.

As Full-Stack Lead, I built the entire ecosystem: a Next.js 16 frontend with a GitHub-inspired interface (Issue-style lists, Issue-style detail view, dark theme), and a NestJS 12 backend with a domain-event-driven modular architecture (auth, tickets, areas, notifications, real-time).

The platform supports multiple organizations, capability-based configurable roles (Director, Coordinator, Member), a real-time Kanban board over WebSocket, ticket auto-close, grouped push notifications with quiet hours, a drag-and-drop delivery calendar, and a knowledge module with versioned documents and executable checklists.

Detalles Técnicos

  • RoleFull-Stack Lead
  • Year2026
  • ClientIA Systems & Data
  • FrontendNext.js 16, TanStack Query
  • BackendNestJS 12, Prisma 7
  • StatusIn Production

STACK TECNOLÓGICO —

Next.js 16
TypeScript
Tailwind CSS 4
NestJS 12
Prisma 7
PostgreSQL 16
Socket.IO
Google OAuth

Stack Completo:

Frontend:

Next.js 16, TanStack Query, GitHub-style interface (shadcn/ui), dark theme by default

Backend:

NestJS 12 (ESM), Prisma 7, domain events with @nestjs/event-emitter

Real-time:

Pure Socket.IO (no SSE, no polling), Redis for pub/sub across replicas

Auth:

Google OAuth restricted by organization domain (multi-tenant)

FUNCIONALIDADES —

Real-Time Kanban

Ticket board synchronized over WebSocket across every connected user, following a create → review → assign → in-progress → resolved → closed flow.

Multi-Organization

Each organization is identified by its users' email domain; the flow lets requests be routed between areas and new organizations be onboarded from a platform panel.

Smart Notifications

Live WebSocket bell and Web Push with grouping (several changes within minutes generate a single alert) and configurable quiet hours.

Delivery Calendar

Month/week/agenda view with drag-and-drop, deliveries automatically derived from tickets, and recurring custom events.

Knowledge Base

Collaborative documents with a rich editor, version history, publishing, Spanish-language search, and checklists executable directly from the ticket.

KPI Dashboard

On-demand cached indicators, historical series, breakdown by area, and CSV export, designed to be reviewed after weeks of real usage.

Desafíos Técnicos y Soluciones

01. Multi-Tenant by Email Domain

The system infers the organization from the institutional email domain (Organization.allowedDomains), isolating data between organizations without duplicating infrastructure.

02. Real-Time Without Polling

Every event travels in an { type, payload, version, ts } envelope over WebSocket; each NestJS module publishes domain events with @nestjs/event-emitter and others subscribe without coupling.

03. Configurable Roles over Fixed Capabilities

I designed a per-organization role system on top of a fixed set of capabilities, letting a Head and a Coordinator have different notification-escalation ranges without touching code.

IMPACTO —

42+
Automated E2E tests
11
Modules and phases closed
100%
Real-time over WebSocket
Multi-Org
Multi-Tenant Architecture
5 days
Auto-close for resolved tickets
@ucv.edu.pe
Restricted institutional access
Turborepo
pnpm monorepo

Notas Técnicas

pnpm + Turborepo monorepo (apps/web, apps/api, packages/shared). NestJS 12 (ESM) backend with isolated modules (auth, users, areas, admin, realtime, health) communicating over an event bus, Prisma 7 over PostgreSQL 16, and Redis 7 for socket pub/sub and queues. Next.js 16 frontend with TanStack Query and a GitHub-style interface. Deployed on a dedicated VPS behind Cloudflare and Caddy, with automatic deployment via GitHub Actions on push to main.

ONE CHANNEL, EVERYTHING RESOLVED.