Skip to main content

FileFlows

An automated media processing and transcoding pipeline server.

FileFlows is a self-hosted media file processing tool that automates transcoding, remuxing, and moving media files through configurable processing pipelines. It integrates with GPU hardware for accelerated transcoding. Self-hosting gives you full control over your media library processing without relying on cloud services.

Alternatives considered​

Self Hosted

ToolOpen SourceFull FeaturesNotes
TdarrnoLimitedPopular transcoding pipeline, closed core
UnmanicYesYesPlugin-based automated transcoding
HandBrakeYesYesManual only, no automation

Installation​

Architecture​

  • Deployment: Single fileflows deployment in the fileflows namespace
  • Image: revenz/fileflows:stable (digest-pinned to sha256:2558e8…)
  • Storage: Longhorn PVC (fileflows-data, 1Gi, longhorn-encrypted); NFS volume from TrueNAS read-only for media input
  • Resources: Intel GPU resource limit (gpu.intel.com/i915: 1) for hardware-accelerated transcoding
  • Networking: ClusterIP service on port 5000, HTTPRoute via internal gateway

Security​

No container-level securityContext configured. Longhorn PVC encrypted at rest via SOPS-managed key.

Updates​

Managed by Renovate. Image is digest-pinned (tracks stable tag).

Data Management​

  • PVC: fileflows-data (1Gi, longhorn-encrypted) for app config and processing state
  • NFS: TrueNAS NFS mount for media input (read-only)
  • Backups: k8up daily schedule (Hetzner + Backblaze) for fileflows-data, which holds the API-managed flows that exist nowhere else; fileflows-logs is excluded (k8up.io/backup: "false")

User Management​

No OIDC or external authentication configured. Access via internal-only HTTPRoute.

Configuration Management​

  • Longhorn encryption key from SOPS-encrypted secret
  • Intel GPU scheduling configured via resource limits in the Deployment

Usage​

Define processing flows (pipelines) in the web UI to automatically transcode or remux incoming media files. Flows can branch on file properties (codec, resolution, container). The Intel GPU integration enables hardware-accelerated H.264/H.265 encoding for faster processing.

Cluster-specific deviations from the above live in the per-cluster README — see k8s/apps/fileflows/talos/README.md.

Cluster Deployment​

FileFlows — Talos cluster

Deviations from defaults​

  • fileflows-logs is not backed up (k8up.io/backup: "false" in backups/patch-pvcs.yaml): rotating log files, nothing to restore. fileflows-data (the API-managed flows, not in git) is.
Kubernetes Metadata
  • Image: revenz/fileflows:26.10@sha256:b35d2ed5e725ec74b4ead73eaae062bd9fa57837d2bce7fda85192b91af5d562
Rendered manifests (kustomize build)
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kustomize.toolkit.fluxcd.io/force: enabled
labels:
app.kubernetes.io/name: fileflows
name: fileflows
namespace: fileflows
spec:
replicas: 1
revisionHistoryLimit: 2
selector:
matchLabels:
app.kubernetes.io/name: fileflows
strategy:
rollingUpdate: null
type: Recreate
template:
metadata:
labels:
app.kubernetes.io/name: fileflows
spec:
automountServiceAccountToken: false
containers:
- image: revenz/fileflows:26.10@sha256:b35d2ed5e725ec74b4ead73eaae062bd9fa57837d2bce7fda85192b91af5d562
livenessProbe:
failureThreshold: 5
httpGet:
path: /
port: http
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
name: fileflows
ports:
- containerPort: 5000
name: http
protocol: TCP
readinessProbe:
failureThreshold: 5
httpGet:
path: /
port: http
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
resources:
limits:
gpu.intel.com/i915: 1
requests:
cpu: 100m
gpu.intel.com/i915: 1
memory: 768Mi
volumeMounts:
- mountPath: /media/stash
name: stash
- mountPath: /app/Data
name: fileflows-data
- mountPath: /app/Logs
name: fileflows-logs
priorityClassName: tier-3
terminationGracePeriodSeconds: 60
volumes:
- name: stash
persistentVolumeClaim:
claimName: fileflows-truenas-nfs-stash
- name: fileflows-data
persistentVolumeClaim:
claimName: fileflows-data
- name: fileflows-logs
persistentVolumeClaim:
claimName: fileflows-logs