Case study
Picovico: running Nepal's cinemas on one platform
Picovico is a cinema management platform: admin panels to configure screens and shows, a customer booking site, and point-of-sale for the counter. I worked on it as a Senior Software Engineer at TechTone from September 2023 to February 2026.
- tickets processed
- 275K+
- screens managed
- 20+
- seats mapped
- 8K+
- branded cinema sites
- 6+
The problem
A cinema runs on several systems that all have to agree. Staff configure screens, seat layouts, and shows. Customers book seats online while the counter sells the same seats in person. Each cinema also wants a booking site that carries its own brand. Building that separately for every cinema would mean duplicated code and drifting behavior.
Hard problems I worked on
A seat map that stays true in real time
I built the cinema seat-layout renderer, which receives updates over WebSockets. When a seat is taken online or at the counter, every open seat map reflects it, so customers don't pick seats that are already gone. Across live auditoriums it maps more than 8,000 seats.
One codebase, many cinema brands
I built a JSON-driven multi-tenant theming system, so multiple cinemas each run a fully branded customer site from a single shared codebase.
Keeping the counter and the display in sync
Orders taken at the POS need to appear on display screens immediately. I combined the BroadcastChannel API, which syncs windows on the same device without a round trip, with Server-Sent Events, which push order updates from the server. Together they keep POS and display apps showing the same live orders.
Fast pages that search engines can read
I moved key pages to server-side rendering for SEO and initial load, and shipped standalone deployable apps built with Turbopack.
Data-heavy screens and auth
The concession and configuration engines are dense, table-heavy admin tools. I used TanStack Query for server-state caching and TanStack Table for fast, filterable views. Complex nested forms use React Hook Form with Zod validation and Radix UI components. Access is role-based, with JWT route guards, OTP verification, and Zustand for global state.
How we kept quality high
I wrote unit tests with Vitest and React Testing Library, reaching high coverage on business-critical modules. The team worked in an Agile setup with Conventional Commits, GitHub PR reviews, and Husky hooks enforcing checks before code landed.
Cinema sites I shipped
Stack
- Next.js
- React 18/19
- TypeScript
- NestJS
- Turborepo
- Turbopack
- WebSockets
- Server-Sent Events
- BroadcastChannel API
- TanStack Query
- TanStack Table
- Zustand
- React Hook Form
- Zod
- Radix UI
- Vitest
- React Testing Library