akkila.dev
← cd ../#projects

Video Surveillance Grid

4 channel surveillance dashboard with frame synchronized video players, event timeline, and interactive map

Senior Frontend Developer·Feb 2025 – Sep 2025

Overview

A complex React surveillance dashboard supporting up to four simultaneous video channels in a synchronized grid view. Every player is locked to the same playback frame, driven by a shared timeline engine. Built from scratch.

4 channel video grid with synchronized playback and event timeline

The Problem

Surveillance review demands that operators scrub through multiple camera feeds in perfect lock step, a single frame offset makes incident correlation impossible. Off the shelf players offer no shared timeline, and bolting four independent video elements together produces drift that compounds over time.

What I Built

A custom playback engine that treats all four <video> elements as one logical player: seeking, buffering, and frame advancing in unison. On top of this sits a timeline component that renders a stream of security events (motion, alerts, zone entries, intrusions) as interactive markers the operator can scrub to instantly. A second view splits the screen into a camera grid on the left and an interactive map on the right, plotting object positions in real time as footage plays.

Beyond the dashboard itself, I built out the team's shared component library, a single home for the design system and every reusable UI primitive, packaged so it could be dropped into the client's other projects. I set the repository up as a Rollup bundled library and tuned the build output so one published package installs and behaves identically across React + Vite apps and Next.js applications.

I also owned the project's infrastructure and delivery pipeline end to end — containerizing the services with Docker, putting an nginx load balancer in front of them, and wiring up GitHub Actions to automate builds, tests, and deployments.

Tech Stack

  • Frontend: React, TypeScript, Redux, Vite
  • Real time sync: WebSocket (frame position broadcast)
  • Map: CesiumJS map library
  • Video: hls.js video with custom sync controller
  • Shared component library: Rollup (library bundling), design system + reusable components, React + Vite & Next.js support
  • Infrastructure & CI/CD: Docker, nginx (load balancer), GitHub Actions

Key Features

  • Synchronized grid - up to 4 video players advance frame by frame in exact unison, regardless of buffer state
  • Custom event timeline - scrollable, zoomable track with typed event markers (motion, alert, zone entry, intrusion) and a live scrub needle
  • Map mode - split screen showing the camera grid alongside an interactive map that plots detected object positions tied to the current playback timestamp
  • Live & playback modes - seamless switch between live feed monitoring and historical review

Results & Impact

Delivered a fully functional multi channel surveillance UI that eliminated the manual frame matching workflow operators previously relied on. The synchronized scrub reduced incident review time significantly and became the primary tool for the client's security operations team.

The shared component library became the foundation for the client's other frontend work, removing duplicated UI effort and keeping the design system consistent across projects. On the infrastructure side, the Dockerized services, nginx load balancing, and GitHub Actions pipeline gave the project repeatable, automated deployments.

share: