Skip to content

Contributing to Strum VOD ​

Thanks for your interest in contributing to Strum VOD! This document provides guidelines and instructions for contributing.

Getting Started ​

  1. Fork the repository and clone your fork locally
  2. Install dependencies: pnpm install
  3. Copy environment config: cp .env.example .env
  4. Build the shared package first: pnpm run build -w @strum-vod/db
  5. Start infrastructure: docker compose up -d postgres redis minio minio-init
  6. 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 ​

  1. Open an issue first to discuss what you'd like to change
  2. Create a branch from main with a descriptive name (e.g., fix/upload-timeout, feat/webhook-support)
  3. Make your changes following the code style guidelines below
  4. Test your changes locally with the full stack running
  5. Run type checks: pnpm run typecheck
  6. Submit a pull request referencing the issue

Code Style ​

  • TypeScript throughout — avoid any types, use proper interfaces
  • ESM modules with .js extensions 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/db for 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 variables

Build 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 typecheck passes 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.

STRUM Proprietary License — © 2026 Strum. All rights reserved.