Transcoder is a preset-driven internal video transcoding platform built around:
- Go API (upload/status/job orchestration)
- Go gRPC worker (doing all of the ffmpeg transcoding)
- Redis stream queue
- MinIO object storage
- Postgres metadata store
- Vue frontend for upload + job monitoring The idea is to have it as a service where companies that require transcoding of their videos (cctv cams, private recordings and videos gotten from lower quality phones) can be transcoded to quality or standards that are easy to translate for editing or privavte work. Everything will be done in your ptivate network. Everything can be configured by the administrator or user.
- Multipart upload to MinIO with presigned part URLs
- Job lifecycle status machine (
pending -> queued -> downloading -> processing -> uploading -> completed|failed|cancelled) - Preset catalog with validated overrides
- Async worker pool with retries/backoff on dependency failures
- Health + readiness + basic metrics endpoints
- Copy env file:
cp example.env .env
- Start the full stack:
docker compose up --build
- Verify service endpoints:
GET http://localhost:8084/healthGET http://localhost:8084/readyGET http://localhost:8084/metrics
POST /upload/initiatePOST /upload/completePOST /jobs(preset-based job creation)GET /jobs/:id/source-urlGET /jobs/:id/output-urlGET /jobs/:id/downloadGET /jobs/:id/transcode-profilePOST /status/:id/updateGET /status/:id/updateGET /presetsGET /presets/:id
A simple frontend implmentation for this project.
- Preset picker wired to
GET /presets - Override fields (codec, resolution, bitrate, framerate, format)
- Upload completion payload now sends:
preset_idoverrides
- Existing multipart upload flow is preserved for source ingestion.
cd frontend
npm install
npm run devFrontend dev server defaults to http://localhost:3000 and proxies API requests to backend.
POST /upload/initiate- Upload parts directly to MinIO with presigned URLs
POST /upload/completewithpreset_idand optionaloverrides- Poll
GET /status/:id/updateuntil terminal state - Use
GET /jobs/:id/output-urlorGET /jobs/:id/download
curl -X POST http://localhost:8084/jobs \
-H 'Content-Type: application/json' \
-d '{
"video_name": "sample.mp4",
"description": "demo transcode",
"preset_id": "web-h264-v1",
"overrides": {
"bitrate": 2500,
"resolution": "720"
}
}'API errors include structured error codes in error_code:
VALIDATION_ERRORDEPENDENCY_ERRORINVALID_STATEINTERNAL_ERRORPRESET_NOT_FOUNDPRESET_OVERRIDE_INVALIDTRANSCODE_FAILED
- gRPC protobuf regeneration requires
protoc-gen-goandprotoc-gen-go-grpcto be installed. - Repository module path:
github.com/franzego/transcoder.