Contributing to Strum VOD
Thanks for your interest in contributing to Strum VOD! This document provides guidelines and instructions for contributing.
Getting Started
- Fork the repository and clone your fork locally
- Install dependencies:
pnpm install - Copy environment config:
cp .env.example .env - Build the shared package first:
pnpm run build -w @strum-vod/db - Start infrastructure:
docker compose up -d postgres redis minio minio-init - Start development servers:bash
pnpm run dev -w @strum-vod/api pnpm run dev -w @strum-vod/worker pnpm run dev:transcoder # Go transcoder — needs Go 1.23+ and ffmpeg on PATH pnpm run dev -w @strum-vod/dashboard
This project uses pnpm with workspaces. Do not use npm, and do not commit an npm
package-lock.json.
Development Workflow
- Open an issue first to discuss what you'd like to change
- Create a branch from
mainwith a descriptive name (e.g.,fix/upload-timeout,feat/webhook-support) - Make your changes following the code style guidelines below
- Test your changes locally with the full stack running
- Run type checks:
pnpm run typecheck - Submit a pull request referencing the issue
Code Style
- TypeScript throughout — avoid
anytypes, use proper interfaces - ESM modules with
.jsextensions in imports - camelCase for variables and functions, PascalCase for types/interfaces/components
- snake_case for database column names (Drizzle schema maps to camelCase)
- Wrap API responses in
{ data: {...} }for success or{ error: "..." }for errors - Use the shared constants from
@strum-vod/dbfor status values, S3 paths, and ID lengths
Project Structure
apps/api/ → Fastify REST API (PostgreSQL)
apps/worker/ → Node: BullMQ↔Redis-Streams bridge + AI pipeline
apps/transcoder/ → Go: FFmpeg HLS ladder (360p–4320p)
apps/dashboard/ → React SPA (Vite + Tailwind, PWA)
apps/player/ → React SPA — public embeddable player (PWA)
packages/db/ → Shared Drizzle ORM schemas and constants (Postgres)
packages/email/ → Transactional email templates (OTP)
packages/subtitles/ → VTT/SRT generation
packages/workbench/ → BullMQ admin dashboard
packages/player-ui/ → Shared player components
packages/design-tokens/ → Brand design tokens / CSS variablesBuild order: @strum-vod/db must be built before @strum-vod/api and @strum-vod/worker (and the other packages they depend on: email, subtitles, workbench).
Go transcoder: apps/transcoder is a standalone Go module (not a pnpm workspace). The enum/constant strings in apps/transcoder/internal/constants are hand-mirrored from packages/db/src/constants.ts — a change to one requires the other. Run pnpm test:transcoder to enforce the parity.
Pull Request Guidelines
- Keep PRs focused — one feature or fix per PR
- Include a clear description of what changed and why
- Update documentation if your change affects the API or configuration
- Ensure
pnpm run typecheckpasses with no errors - Update the hand-mirrored Go constants if you touch
packages/db/src/constants.ts
Reporting Bugs
Open an issue with:
- Steps to reproduce
- Expected behavior
- Actual behavior
- Environment details (OS, Node version, Docker version)
License
Strum VOD is not open source. It is distributed under the STRUM Proprietary License — © 2026 Strum, all rights reserved. By contributing, you agree that your contributions become the property of Strum and are licensed under the same terms. See LICENSE.