Back to Projects
Sinemata — Streaming Platform

Sinemata — Streaming Platform

Web Development
Live Demo — sinemata.vercel.app
Type
Personal Project
Focus
Streaming UI + Self-Hosting
Timeline
2025

Project Overview

Sinemata is a streaming platform with a dual-mode architecture. As a public portfolio demo it runs fully static on Vercel from a curated, legally-sourced catalog. Run locally with its Node.js backend, the same codebase becomes a self-hosted media server that indexes a personal movie library and streams it with full HTTP Range support. A single hostname check decides which mode to boot — so one codebase serves both worlds with zero runtime dependencies.

0
Runtime dependencies
8+
API endpoints (local)
67
Curated demo titles
8.7k+
Local library titles

What I Built

Dual-mode design. One codebase, two deploy targets: a static public demo (Vercel) and a local full-stack server, selected automatically by hostname so the demo never needs a backend.

Streaming engine. Implemented HTTP Range streaming from scratch on Node's native http module — every local title plays back with instant seek, resume, and partial-content support.

Legal-by-design content. The public demo ships only public-domain films (Internet Archive) and official YouTube trailer embeds — no copyrighted media, safe to share publicly.

Original branding. Designed the Sinemata identity (wordmark + play-mark) and a complete streaming UX: login, profiles, My List, search, and a bilingual interface.

Application Gallery

Home — hero billboard + public-domain film rows
Home — hero billboard + public-domain film rows
Detail modal — synopsis, similar titles, playback
Detail modal — synopsis, similar titles, playback
Auth — streaming-style sign-in flow
Auth — streaming-style sign-in flow
Local full-stack mode — 8,700+ title catalog
Local full-stack mode — 8,700+ title catalog
Responsive audit — mobile 390px
Responsive audit — mobile 390px

Technical Implementation

Mode detection. A hostname check in the client config flips between the static demo catalog and the live /api/catalog backend — no build flags, no separate branches.

Backend. Pure Node.js on the native http module — no Express. Serves static files, a catalog API, thumbnail generation, subtitles, and the streaming endpoint.

Streaming. GET /stream honours the Range header and returns 206 Partial Content, enabling seek without downloading the whole file; non-MP4 formats are transcoded on the fly with FFmpeg.

Deployment. The demo deploys to Vercel as a pure static site via vercel.json rewrites and a .vercelignore that keeps the local backend, media, and secrets out of the bundle.

Front-end. Vanilla JS modules — app, auth, config, data, and a custom i18n layer — with a CSS-only streaming UI and HTML5 video playback.

Technologies Used

frontend

Vanilla JavaScript (ES5-safe)HTML5 VideoCSS3Custom i18n (ID/EN)

backend

Node.jsNative http moduleFFmpegTMDB APIzlib (gzip)

streaming

HTTP Range requests (206)On-the-fly transcodingPoster frame cachingVTT subtitles

deployment

Vercel (static demo)vercel.json rewritesHostname auto-detect mode

Key Features Shipped

Dual-mode architecture: public static demo + optional local full-stack backend
Auto-detects environment by hostname — Vercel serves the demo, localhost serves the full app
100% legal content: public-domain films (Internet Archive) + official YouTube trailers
Netflix-style UX: hero billboard, genre rows, hover cards, detail modal
HTTP Range streaming for instant seek and resume on the local backend
FFmpeg-generated poster thumbnails and on-the-fly transcoding, cached on disk
TMDB metadata enrichment — posters, backdrops, episode stills (token stays server-side)
Auth flow with profiles & 'Who's watching', persistent My List (localStorage)
Bilingual UI (Indonesian / English) via a custom, zero-dependency i18n layer
Fully responsive and keyboard-accessible, audited across mobile, tablet, desktop