8mb.local

JMS1717活跃维护

自托管的本地视频压缩 WebUI,基于 FFmpeg 和 GPU 加速,把大视频压到指定体积,适合需要批量处理又不想上传云端的人。

a free local self hosted video compressor webui designed for performance and ease of use. inspired by 8mb.video

v143发布于 2026-09-30 17:43 UTC927star51fork同步于 2026-11-07 07:33 UTC

怎么上手

由 README 提炼,执行前请确认
docker run -d --name 8mblocal -p 8001:8001 -v ./uploads:/app/uploads -v ./outputs:/app/outputs jms1717/8mblocal:latest
硬件要求按 README 说明

支持 NVIDIA NVENC、Intel Quick Sync、Windows AMD AMF/Media Foundation、Apple VideoToolbox、Linux VAAPI(含 AMD),无 GPU 时自动回退 CPU 软件编码;Docker 有纯 CPU 镜像与 compose 配置;README 未给出具体显存要求。

纯 CPU 可运行支持 Apple Silicon有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

自托管视频压缩 WebUI,拖入文件选目标大小,用 GPU 编码压到指定体积

自托管的本地视频压缩 WebUI,基于 FFmpeg 和 GPU 加速,把大视频压到指定体积,适合需要批量处理又不想上传云端的人。

核心能力

  • 拖拽上传后按目标体积(如 8MB/25MB/50MB)自动计算码率编码
  • 支持 NVENC、Intel QSV、AMD AMF、VideoToolbox、VAAPI 硬件编码并自动回退 CPU
  • 输出超过目标 2% 时自动调整码率重新编码
  • 实时显示进度、FFmpeg 日志,支持队列管理与批量处理
  • 支持 AV1/HEVC/H.264 编码,可选 MP4/MKV 容器与裁剪、分辨率控制

容易踩的坑

NVIDIA 容器必须加 -e NVIDIA_DRIVER_CAPABILITIES=compute,video,utility,否则容器内没有 NVENC 库;默认端口是 8001 而非 80;Intel/AMD VAAPI 需改用 docker-compose.vaapi.yml 并挂载 /dev/dri,Easypanel 模板为纯 CPU 模式无 GPU 直通。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v143
  1. v143v143: Android App and More Devices最新正式版2026-09-30 · 2026-09-30 17:43 UTC

    8mb.local is now on Android

    Compress videos right on your phone or tablet—no computer, server, or account required. Pick videos with Android's Photo Picker, choose a target size, and let the app select a working hardware encoder automatically.

    • Finished videos save to your camera roll automatically on Android 10+.
    • Preview your video in the app before sharing it.
    • Compress multiple videos, trim clips, adjust resolution and frame rate, mute audio, or extract audio.
    • Familiar size presets and desktop-matched defaults, with the same 8mb.local icon.
    • Compression happens entirely on your device; the app does not upload your videos.

    Requires Android 8.0 or newer. Download 8mblocal-143-android.apk below; the installation guide walks you through setup. Android 8–9 uses a Save As picker instead of automatic gallery saving.

    More ways to use 8mb.local

    • Native Windows ARM64 support alongside the existing Windows version.
    • An Apple Silicon macOS app, available as an experimental build.
    • Docker support for both standard PCs and ARM64 machines.
    • More reliable hardware-encoder detection, with software fallback when needed.
    • Updated dependencies with security fixes.

    Which download should I choose?

    • Android phone or tablet: 8mblocal-143-android.apk.
    • Most Windows PCs: 8mblocal-Setup.exe; 8mblocal.exe runs without installation.
    • Windows on ARM: 8mblocal-Setup-arm64.exe; 8mblocal-arm64.exe is the portable version.
    • Apple Silicon Mac: 8mblocal_143.0.0.0_macos_arm64.dmg (experimental).
    • Docker: follow the Docker setup guide.

    Before you install

    If you installed an earlier Android preview, uninstall it once before installing this release. App history and settings reset; videos already saved to your gallery are separate from that app-local data. Future releases will use the same permanent signing key so they can update normally.

    Codec support depends on your device. Being able to play AV1 does not necessarily mean your device can create AV1 videos. Android was tested on MediaTek and Snapdragon devices, including camera-roll saving and preview before sharing.

    Windows builds are not publisher-signed and may show a security warning. The experimental Mac build is not notarized; real-Mac hardware acceleration has not yet been verified. Android is an on-device app, so desktop-only server settings and encoder-specific options are not included.

  2. v142v142: Faster Hardware Encoding, Reliable GPU Detection, and Improved Job Recovery2026-08-18 · 2026-08-18 19:53 UTC
    查看更新说明

    What's new

    Hardware acceleration reliability

    • Fixed Intel QSV and VAAPI detection and reporting issues.
    • Hardware badges now identify Intel QSV, VAAPI, NVIDIA NVENC, and software encoders correctly.
    • Encoder telemetry is structured and durable instead of depending on a transient log message.
    • Encoder identity, decoder information, progress, and fallback state survive page refreshes and SSE reconnects.
    • Improved cancellation, staged-input cleanup, and retry behavior.
    • Hardware capability refreshes replace stale probe results safely.

    Intel QSV

    • Optimized the Linux Intel H.264/HEVC QSV path to use hardware decoding and hardware surfaces where the input and device support it.
    • QSV VPP is used where appropriate to keep supported processing on the GPU.
    • Software decode and upload remains the safe fallback for unsupported inputs.
    • The optimization was validated on 10th-generation Intel hardware.
    • HEVC Main10/P010 support and HDR metadata preservation remain supported.
    • 10-bit input is not silently downgraded to 8-bit output.

    Encoder presets

    • Fresh installations now use P4 Balanced instead of P6 High Quality.
    • Existing explicit preset selections and customized profiles are preserved.
    • The managed Discord stock profile uses P4 when it is still application-managed.
    • P6 High Quality and P7 Best Quality remain available for users who prefer slower, higher-quality encoding.

    NVIDIA

    • NVIDIA NVENC, NVDEC, CUDA, and scale_npp remain supported.
    • The P4 default avoids unnecessarily slow P6 behavior for fresh jobs.
    • Hardware capability is verified with real probes; an encoder appearing in an FFmpeg list alone is not treated as proof of support.

    Docker

    • The universal Docker image is approximately 501 MB, down from the previous multi-GB issue #44 image.
    • One universal runtime is retained with repository-owned FFmpeg.
    • NVIDIA NVENC/NVDEC, CUDA scale_npp, Intel QSV, Intel and AMD VAAPI, and CPU fallbacks remain supported.
    • No Jellyfin FFmpeg replacement was introduced.

    Reliability and storage

    • Improved active-job recovery and SSE reconnect behavior.
    • Cancellation now reaches a durable canceled state without a follow-up generic failure state.
    • Retrying a selected file after cancellation or completion can recover staged input safely without retaining temporary uploads indefinitely.
    • RAM-preferred media staging remains supported, including cleanup after jobs finish.
    • Propagated color metadata is now normalized through a narrow allowlist. Invalid or reserved values are omitted independently, so malformed Recorder metadata cannot break hardware or CPU encoding while valid HDR metadata remains intact.
    • A bounded retry may remove only rejected optional color flags; metadata parsing failures are not misclassified as hardware failures or forced CPU fallback.

    Validation

    The v142 release candidate was validated with:

    • Intel QSV H.264 and HEVC exact hardware encoding.
    • Intel QSV Main10/P010 HEVC encoding and HDR-path validation.
    • Intel VAAPI exact HEVC encoding.
    • NVIDIA H.264 and HEVC NVENC with CUDA/NVDEC and no fallback.
    • CPU fallback paths.
    • Docker health, structural, and shared-library checks.
    • Frontend, backend, worker, shared, Python, version, and Compose tests.
    • Cancellation/retry, restart/reconnect, RAM staging, and transient cleanup.
    • A controlled Windows Recorder-compatible malformed-metadata regression through CPU, Intel QSV, and NVIDIA NVENC application paths.

    Physical AMD VAAPI exact encoding has not yet been validated on an AMD host. AMD VAAPI support remains in the universal image and this is a remaining hardware-validation gap, not a claim of failure.

  3. v141v141: Reliability, Adaptive Concurrency, and Direct API Support2026-08-17 · 2026-08-17 14:33 UTC
    查看更新说明

    NEW: Microsoft Store listing has been approved! See below:

    https://apps.microsoft.com/store/detail/9N4583VRRR13?cid=DevShareMCLPCS

    What's new

    • Added automatic worker concurrency selection based on CPU, RAM, and available GPU memory. A manual limit is still available.
    • Improved batch queue reliability and downloads with reconnectable progress, atomic ZIP creation, collision-safe archive names, and safer dispatch cleanup.
    • Hardened codec settings recovery so malformed or incomplete saved visibility data cannot remove every CPU fallback or crash startup. Saved selections now survive detection and restart more reliably.
    • Improved restart recovery for direct compression and Folder Watch jobs by recording job metadata before dispatch and restoring pending work safely.
    • Added direct API documentation and stronger output-path and SPA fallback protection.
    • Added a frontend dependency regression check for the patched cookie package and made the local release validation fail clearly when the advisory fix is missing.
    • Improved native Windows restart handling so media-storage, memory-budget, retention, history, concurrency, and logging choices reload from saved settings.

    GitHub issue follow-up

    • Addressed issue #37. Multipart uploads and FFmpeg temporary files now use ./uploads/.tmp, which is inside the configured /app/uploads volume instead of Docker's writable container layer. MEDIA_STORAGE=auto can use shared memory when the budget fits and falls back to that mounted upload path when it does not.
    • Addressed issue #23. Direct use of the existing backend is now documented and verified without the UI, with examples for single-file upload, compression, status, cancellation, download, and batch ZIP workflows in docs/API.md. FastAPI also exposes /docs and /openapi.json while the application is running.

    Windows files

    • 8mblocal.exe — portable application.
    • 8mblocal-Setup.exe — isolated current-user installer path is supported.
    • 8mblocal_141.0.0.0_x64.msix — Store package. Microsoft signs Store submissions after certification.
  4. v140v140: RAM Uploads, Folder Watch, 20MB Discord Default, and Better Mobile HEVC Playback2026-08-14 · 2026-08-14 19:07 UTC
    查看更新说明

    What's new

    • Added a local release command that builds the Windows app, installer, MSIX, Docker image, checksums, and build reports from one version number.
    • Changed default value to 20MB due to Discord increasing their file size limit
    • Added configurable temporary-media storage modes (auto, memory, and disk) with a 10 GiB default memory budget. This massively increases performance and reduces unnecessary writes to your disk
    • Added Folder Watch (Advanced). It monitors a local, network, or mounted folder and sends finished video files through the normal compression queue. You can choose the profile, output behavior, recursive scanning, and what happens to the original file after compression.
    • Improved codec detection and saved codec settings so hardware detection does not overwrite the visibility or selection choices you made. CPU fallback codecs remain available when hardware encoding is unavailable.
    • Fixed profile switching, FPS-cap preservation, and default-profile deletion.
    • Improved HEVC MP4 compatibility on Apple devices by using the hvc1 tag.
    • Removed temporary upload files after successful, failed, retried, or cancelled jobs.
    • Added automatic cleanup for old and orphaned history entries.
    • Moved Support the Project to the top of Settings and kept it open by default. Folder Watch is at the bottom and starts collapsed because it is an optional advanced feature.

    Folder Watch timing

    Stable seconds means how long a file must stop changing before Folder Watch processes it. This prevents a video from being picked up while it is still being copied. Five seconds is a good starting point; use a longer value for slow network copies. The polling interval controls how often Folder Watch checks the folder and is separate from the stable-file delay.

    Memory-backed temporary uploads

    The default memory budget is 10 GiB, but each deployment can choose its own limit in .env with MEDIA_MEMORY_LIMIT_GB. This is a maximum the app uses for admission checks; it does not reserve that much RAM on every machine.

    • MEDIA_STORAGE=auto is recommended. It uses memory when there is enough room and switches to disk when there is not.
    • MEDIA_STORAGE=memory requires a safe memory fit and reports an error when the upload cannot fit.
    • MEDIA_STORAGE=disk always uses disk-backed temporary files.

    MEDIA_SHM_SIZE sets the Docker shared-memory capacity. For example, a 4 GiB memory-backed setup is:

    MEDIA_STORAGE=memory
    MEDIA_MEMORY_LIMIT_GB=4
    MEDIA_SHM_SIZE=4g
    

    Windows uses normal file paths with a RAM-preferred cache hint. It can still write temporary data to disk when Windows needs the memory, so this is not a guaranteed RAM disk.

    Downloads

    • 8mblocal.exe - portable Windows application
    • 8mblocal-Setup.exe - per-user Windows installer
    • 8mblocal_140.0.0.0_x64.msix - unsigned Microsoft Store submission package
    • SHA256SUMS.txt - SHA-256 checksums for the release files
    • BUILD-MANIFEST.json and TEST-RESULTS.md - build metadata and results

    The Docker images are available as:

    jms1717/8mblocal:v140
    jms1717/8mblocal:latest
    

    The MSIX still needs Microsoft signing and Partner Center submission before it can be installed from the Microsoft Store.

  5. v138v138: Major Overhaul, Native Windows Support, and More Hardware Encoding2026-08-10 · 2026-08-10 17:48 UTC
    查看更新说明

    8mb.local v138

    v138 is a major release and includes a new Windows desktop app and unified Docker deployment. It improves hardware detection, cancellation, background jobs, release packaging, and real end-to-end coverage while keeping the same SvelteKit/FastAPI/worker behavior across platforms.

    Highlights

    • Native Windows WebView2 window with no distracting terminal windows or automatic Chrome launch.
    • Standalone 8mblocal.exe: no installer, Docker, Redis, Python, Node.js, or separate FFmpeg installation is required.
    • All-users and no-admin/current-user setup modes, desktop and Start Menu shortcuts, clean uninstall, and preservation of each user's application data.
    • Microsoft Store-ready x64 MSIX packaging with the Partner Center identity and shared v138 branding across the favicon, executable, setup, and MSIX.
    • Compression continues in the background while navigating between pages; returning to the main screen reconnects to the active SSE stream.
    • Reliable cancellation waits for a terminal canceled state, stops FFmpeg, and prevents failed or canceled jobs from becoming successful downloads.
    • Automatic download no longer navigates away from the application.
    • Selecting or dropping multiple files automatically switches to Batch mode.
    • Mixed-success batches retain valid outputs, report invalid inputs clearly, and create collision-free ZIP member names.
    • Hardware-aware default presets prefer a working hardware codec while preserving an explicit user-selected preset.

    Codec and hardware work

    • NVIDIA NVENC: H.264, HEVC, and AV1 passed through the Docker application on an RTX 5070 Ti, with exact encoder identity and FFprobe-verified output.
    • Intel Quick Sync: H.264 and HEVC passed through the Linux Docker application. The QSV path now uses a fixed hardware-frame pool required by Intel's media driver. Unsupported AV1 QSV falls back to SVT-AV1 instead of hanging or reporting a false hardware pass.
    • Native Windows QSV uses the encoder's internal upload instead of Linux's explicit hardware upload. This fixes D3D11 frame-pool failures on real rotated 1080×1920 AV1 jobs; the startup probe now tests that realistic shape.
    • Linux VAAPI: H.264 and HEVC passed through the application using a real /dev/dri Intel render node. AMD Linux acceleration uses this VAAPI path.
    • Windows AMD AMF: support is exposed only after a real encoder initialization test and was user-validated on compatible Windows AMD hardware. Individual H.264, HEVC, and AV1 availability depends on the GPU generation and driver.
    • CPU fallback remains libx264, libx265, and SVT-AV1. In FFmpeg, libsvtav1 is the official wrapper name for the SVT-AV1 encoder; it is not libaom.

    Reliability and user experience

    • Durable active-job tracking and background SSE monitoring across navigation.
    • Terminal-event replay after reconnect and restart recovery for history and repeated downloads.
    • Lightweight final-status polling instead of repeatedly downloading the output while waiting for finalization.
    • Safer upload names, download paths, history filenames, batch dispatch rollback, invalid-media cleanup, and subprocess handling.
    • Encoder diagnostics are easier to scan and can be collapsed after expansion.
    • Windows FFmpeg, FFprobe, and GPU probes run without flashing console windows.

    Windows download security message

    The GitHub executable and Inno Setup installer are unsigned, so SmartScreen may display Windows protected your PC or Unknown publisher. This means the file lacks a commercial code-signing identity/reputation; it is not itself a malware finding. Download only from the official release, verify its SHA-256 checksum, then use More info → Run anyway if you trust the checksum. The Microsoft Store package is submitted unsigned and is signed by Microsoft after certification.

    Validation summary

    • Backend: 40 passed,

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    8mb.local – Video Compressor for Desktop, Android, and Docker

    8mb.local is a self-hosted, fire-and-forget video compressor. Drop a file, choose a target size (e.g., 8 MB, 25 MB, 50 MB, 100 MB), and let GPU-accelerated encoding produce compact outputs with AV1/HEVC/H.264. Supports NVIDIA NVENC, Intel Quick Sync, Windows AMD AMF/Media Foundation, Apple VideoToolbox, and Linux VAAPI (including AMD) with automatic CPU fallback. Native Windows x64/ARM64, Apple Silicon macOS, Android, and Linux Docker amd64/arm64 targets are included.

    Android app

    8mb.local also has a standalone Android app—no computer or server required. Pick videos from Android's Photo Picker, choose a target size, and compress them on your phone or tablet. The app automatically chooses a working hardware encoder, saves finished videos to your camera roll on Android 10+, and lets you preview them before sharing. It includes batch compression, trimming, resolution and frame-rate controls, audio options, and recent history, with desktop-matched defaults and the same 8mb.local icon.

    Android 8.0 or newer is required. Available codecs depend on your device; support for playing a codec does not necessarily mean it can encode it. Android uses native phone controls rather than desktop-only encoder flags. Android 8–9 uses Save As and AAC audio; automatic gallery saving and Opus audio require Android 10 or newer.

    Get the Android APK from GitHub Releases and follow the Android installation guide. Only APKs explicitly listed as Android release downloads are intended for installation; unsigned APKs and development artifacts are not releases.

    Windows downloads · Apple Silicon build guide · Docker setup

    Table of Contents

    Features

    • NVENC, Intel QSV, AMD AMF, Windows Media Foundation, Apple VideoToolbox, Linux VAAPI, and Android MediaCodec hardware encoding with automatic CPU fallback when a GPU or driver is unavailable
    • Robust encoder validation at startup — tests actual encoder initialization, not just availability
    • AV1, HEVC (H.265), and H.264 encoding via NVENC, QSV, AMF, VAAPI, or CPU software encoders
    • Drag-and-drop UI with helpful presets and advanced options (codec, container, tune, audio bitrate)
    • Configurable codec visibility — enable/disable specific codecs in the Settings page
    • Resolution control — set max width/height while maintaining aspect ratio
    • Video trimming — specify start/end times (seconds or HH:MM:SS format)
    • Real-time progress tracking using output size, time processed, bitrate, and wall-clock estimates
    • Real-time FFmpeg logs streamed during compression
    • Live queue management — view all active jobs with real-time progress, cancel individual jobs, or clear entire queue
    • Automatic file size optimization — re-encodes with adjusted bitrate if output exceeds target by >2%
    • Batch processing — compress multiple files in a single operation
    • Job history enabled by default
    • Auto-download enabled by default
    • Output container choice: MP4 or MKV, with compatibility safeguards
    • Version tracking — UI displays current version, backend provides /api/version

    Screenshots

    Projects

    Public instances run by people who offer their 8mb.local install for anyone to use (community compressors, demos, mirrors). If you run a public deployment and want it listed here, open a pull request that adds a row to this section.

    SiteNotes
    fits.videoOnline compressor (free and open source)

    Local Release Workflow

    This repository is one shared source codebase for the frontend, backend, worker, Windows packages, and Docker image. The root VERSION file is the single active application-version source. Generated UI/backend version modules and packaging metadata are synchronized by scripts\set-version.ps1 and verified by scripts\check-version.ps1.

    One command runs the automated checks and builds the portable EXE, installer EXE, Store MSIX, and local Docker image:

    .\release-local.ps1 -Version 143.0.0.0
    

    GitHub is not required to generate these files. GitHub Actions may still provide an independent compatibility check later. The local workflow never pushes its Docker image, publishes a release, deploys the application, or submits the MSIX; Microsoft Partner Center remains a separate manual submission step.

    The UI, backend API, EXE metadata, installer metadata, MSIX manifest, Docker metadata/tag, artifact names, and release directory all derive from the requested four-part version. By default, outputs and stage logs are written to dist\release\<version>\:

    • 8mblocal.exe
    • 8mblocal-Setup.exe
    • 8mblocal_<version>_x64.msix
    • 8mblocal-docker.tar
    • SHA256SUMS.txt
    • BUILD-MANIFEST.json
    • TEST-RESULTS.md

    Required tools depend on the selected stages: Python 3.11-3.13, Node.js, npm, Docker with Compose, Inno Setup, Windows SDK MakeAppx, and 7-Zip when the Windows build must download its tested FFmpeg bundle. The script checks tools before building and fails with a clear missing-tool message; it does not install unrelated software or perform system upgrades.

    Prepare the Python test environment once after cloning:

    python -m venv .venv
    .\.venv\Scripts\python.exe -m pip install -r requirements.txt httpx==0.27.2
    

    Useful commands:

    # Validate tools and show the plan without changing versions or building
    .\release-local.ps1 -Version 143.0.0.0 -DryRun
    
    # Full local release
    .\release-local.ps1 -Version 143.0.0.0
    
    # Windows artifacts only
    .\release-local.ps1 -Version 143.0.0.0 -SkipDocker
    
    # Docker artifact only
    .\release-local.ps1 -Version 143.0.0.0 -SkipWindows
    
    # Windows EXE and installer without MSIX
    .\release-local.ps1 -Version 143.0.0.0 -SkipMsix
    

    -SkipTests is troubleshooting-only and marks the result incomplete. -OutputDir selects another output folder, -KeepTemp preserves temporary files, and -Overwrite may reuse only a release directory previously created and marked by this script. Arbitrary existing directories, source directories, and ancestor paths are protected from overwrite.

    Verify generated checksums from the release directory:

    Get-Content .\dist\release\143.0.0.0\SHA256SUMS.txt
    Get-FileHash .\dist\release\143.0.0.0\8mblocal.exe -Algorithm SHA256
    

    When a build fails, inspect TEST-RESULTS.md, BUILD-MANIFEST.json, and the named stage log, correct the source or environment issue, and rerun into a new output directory. A run that skips required stages is never reported as release-ready.

    Architecture

    flowchart LR
      A[Browser / SvelteKit UI] -- Upload / SSE --> B(FastAPI Backend)
      B -- Enqueue --> C[Redis]
      D[Celery Worker + FFmpeg GPU/CPU] -- Progress / Logs --> C
      B -- Pub/Sub relay --> A
      D -- Files --> E[outputs/]
      A -- Download --> B
    

    Components

    LayerTechnologyRole
    FrontendSvelteKit + ViteDrag-and-drop UI, size estimates, SSE progress/logs, download
    Backend APIFastAPIAccepts uploads, runs ffprobe, relays SSE, serves downloads
    WorkerCelery + FFmpeg 6.1.1Compression with NVENC/QSV/VAAPI or CPU; parses ffmpeg -progress
    BrokerRedisCelery broker and pub/sub transport for progress events

    Data & files

    • uploads/ — incoming files (cleaned up after FILE_RETENTION_HOURS)
    • outputs/ — compressed results (cleaned up on the same schedule)

    All components run in a single container via supervisord.

    Native Windows mode

    The Windows installer packages the same frontend, backend, worker, and FFmpeg path in one executable. It replaces only Redis/Celery transport with an in-process bounded queue, stores data under the user's local application data directory, binds to localhost, and opens a native WebView2 window without visible terminal windows. The standalone 8mblocal.exe does not require Docker, Redis, Python, Node.js, or a separate FFmpeg installation. See windows/README.md.

    Installation

    Quick Start (Docker Hub)

    NVIDIA GPU
    docker run -d \
      --name 8mblocal \
      --gpus all \
      -e NVIDIA_DRIVER_CAPABILITIES=compute,video,utility \
      -p 8001:8001 \
      -v ./uploads:/app/uploads \
      -v ./outputs:/app/outputs \
      jms1717/8mblocal:latest
    

    The -e NVIDIA_DRIVER_CAPABILITIES=compute,video,utility flag is required — it tells the NVIDIA Container Toolkit to mount NVENC libraries into the container.

    CPU Only (No GPU)
    docker run -d \
      --name 8mblocal \
      -p 8001:8001 \
      -v ./uploads:/app/uploads \
      -v ./outputs:/app/outputs \
      jms1717/8mblocal:latest
    

    Access the web UI at http://localhost:8001.

    Intel / AMD VAAPI

    For Linux hosts with Intel or AMD graphics, use the DRI-enabled compose profile. It discovers /dev/dri/renderD*, validates QSV/VAAPI at startup, and falls back to CPU when the device cannot encode:

    docker compose -f docker-compose.vaapi.yml up -d --build
    

    Easypanel

    Easypanel can deploy 8mb.local with one click using its official template, without needing to manually run Docker commands. Note that the Easypanel template runs in CPU-only mode (no GPU passthrough).

    1. Open your Easypanel dashboard and create (or open) a project
    2. Click + Add Service and choose Templates
    3. Search for 8MB Local and select it
    4. Click Create to deploy the service

    See the official 8mb.local template on Easypanel for more details.

    Docker Compose

    NVIDIA GPU
    services:
      8mblocal:
        image: jms1717/8mblocal:latest
        container_name: 8mblocal
        ports:
          - "8001:8001"
        volumes:
          - ./uploads:/app/uploads
          - ./outputs:/app/outputs
          - ./.env:/app/.env  # optional
        gpus: all
        environment:
          - NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
        restart: unless-stopped
    
    CPU Only
    services:
      8mblocal:
        image: jms1717/8mblocal:latest
        container_name: 8mblocal
        ports:
          - "8001:8001"
        volumes:
          - ./uploads:/app/uploads
          - ./outputs:/app/outputs
          - ./.env:/app/.env  # optional
        restart: unless-stopped
    

    Then run:

    docker compose up -d
    
    Configure memory-backed temporary uploads

    The maximum application memory budget is user-configurable in the host .env file. MEDIA_MEMORY_LIMIT_GB is the application admission ceiling, while MEDIA_SHM_SIZE is the Docker /dev/shm capacity ceiling. Neither value reserves that amount of host RAM up front.

    Recommended adaptive mode: use memory when the live budget fits, and fall back to disk automatically when it does not:

    cp .env.example .env
    # Edit .env:
    MEDIA_STORAGE=auto
    MEDIA_MEMORY_LIMIT_GB=10
    MEDIA_SHM_SIZE=10g
    
    docker compose up -d --build
    docker compose exec 8mblocal df -h /dev/shm
    

    To require memory-backed uploads on Linux/Docker, choose a budget that fits the host and set the shared-memory ceiling at least as high. Jobs that cannot safely fit are rejected instead of silently writing to disk:

    # Edit .env:
    MEDIA_STORAGE=memory
    MEDIA_MEMORY_LIMIT_GB=4
    MEDIA_SHM_SIZE=4g
    
    docker compose up -d --build
    

    To force disk-backed temporary uploads, use MEDIA_STORAGE=disk. You can change MEDIA_MEMORY_LIMIT_GB and MEDIA_SHM_SIZE to another host-appropriate value, then recreate the container with docker compose up -d. In auto mode, MEDIA_MEMORY_LIMIT_GB is still enforced as the maximum application budget; available shared memory and host headroom can reduce the amount used.

    Building from Source

    Default (NVIDIA GPU): requires NVIDIA Container Toolkit and a working docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi on the host.

    git clone https://github.com/JMS1717/8mb.local.git
    cd 8mb.local
    docker compose up -d --build
    

    CPU only (no GPU passthrough — e.g. macOS or machine without GPU access):

    docker compose -f docker-compose.cpu.yml up -d --build
    

    Platform Notes

    PlatformGPU SupportNotes
    Windows x64 / ARM64Native Media Foundation; NVENC/QSV/AMF where supportedNative installers are built for each architecture; Docker Desktop remains available separately
    Linux amd64 / arm64NVIDIA or CPUNative OCI images are built on matching GitHub runners; NVIDIA requires the Container Toolkit
    LinuxIntel / AMD VAAPIUse docker-compose.vaapi.yml and pass /dev/dri; the worker identifies the vendor
    macOS Apple SiliconNative VideoToolboxUse the native arm64 app/DMG; Docker itself still runs in a Linux VM without macOS GPU passthrough
    Android 8+Native MediaCodecStandalone Kotlin/Compose app; probes, pins, and reports the actual encoder used

    Native Windows executable

    For a Docker-free Windows install, run the manual Build native Windows executable GitHub Actions workflow and download 8mblocal-Setup.exe from its 8mblocal-windows artifact. The per-user installer creates a Start Menu shortcut and optionally a Desktop shortcut. The release also includes a standalone 8mblocal.exe that can run without installation. Both open the same native WebView2 interface on localhost and probe Media Foundation, NVENC, Quick Sync, and AMD AMF before falling back to CPU encoding. See windows/README.md for the installer, Windows security warning, hardware probes, and build details.

    Apple Silicon, Android, and ARM64 Docker

    Build the native Apple Silicon app with bash macos/build.sh; it refuses to package unless both the process and output executable are arm64 and a real VideoToolbox encode succeeds with software fallback disabled. See macos/README.md.

    The standalone Android app lives in android/. It uses Media3/MediaCodec, probes codecs by configuring and starting them, tries working hardware encoders before software encoders, and records the encoder Media3 actually selected.

    For generic Linux ARM64, build Dockerfile.arm64 or use docker-compose.arm64.yml. The base profile works without a GPU. On a Linux ARM64 host with /dev/dri, add the optional hardware override:

    docker compose -f docker-compose.arm64.yml \
      -f docker-compose.arm64-vaapi.yml up -d
    

    The worker probes VAAPI encoders with real frames before using them and falls back to CPU if the driver rejects the encode. Release CI builds amd64 and arm64 on native runners and creates a combined manifest only in the explicitly approved publish job.

    Repeatable end-to-end validation

    The repository includes a disposable scenario harness. It generates a small media corpus, starts the local runtime, uploads real files, runs selected codecs, verifies downloaded outputs with FFprobe, and exercises parallel batch upload plus ZIP download. Explicit hardware requests are useful on CPU-only machines too: a healthy runtime should complete them through its documented CPU fallback path.

    # Source/local runtime (no Docker or GPU required)
    python scripts/e2e_test.py --mode local
    
    # A representative quicker run
    python scripts/e2e_test.py --mode local --profile quick \
      --codecs libx264,h264_qsv,h264_vaapi,h264_nvenc
    
    # A disposable Docker run; build the image first if it is not already present
    docker build -t 8mb.local:e2e .
    python scripts/e2e_test.py --mode docker --docker-image 8mb.local:e2e
    
    # Hardware-specific Docker runs on the matching host
    python scripts/e2e_test.py --mode docker --docker-image 8mb.local:e2e --docker-gpu nvidia
    python scripts/e2e_test.py --mode docker --docker-image 8mb.local:e2e --docker-gpu vaapi
    

    The Docker harness uses a unique container name and temporary bind-mounted directories, then stops and removes only the container it created. Use --keep when retaining logs and outputs for diagnosis. The full codec list is the default; narrow it with --codecs when iterating on one hardware path. The manual Docker end-to-end smoke workflow builds a CPU container and runs the same representative scenarios in GitHub Actions.

    On Windows, the release script performs the same health, frontend, upload, transcode, status, download, and FFprobe checks. Add -Install to silently install and uninstall the Inno Setup package in an isolated temporary folder:

    .\windows\test-release.ps1 -Build -Install
    

    Verify Installation

    # Check container status
    docker ps | grep 8mblocal
    
    # Check NVIDIA GPU access
    docker exec 8mblocal nvidia-smi
    
    # List available encoders
    docker exec 8mblocal bash -c "ffmpeg -hide_banner -encoders | grep -E 'nvenc|264|265|av1'"
    
    # View startup logs
    docker logs 8mblocal
    

    Update to Latest Version

    docker compose pull
    docker compose up -d
    

    Or with docker run:

    docker pull jms1717/8mblocal:latest
    docker stop 8mblocal && docker rm 8mblocal
    # Re-run your docker run command
    

    Usage

    1. Drop a video — drag and drop or click Choose File. Analysis runs automatically.
    2. Pick a target size — click a preset button or enter a custom MB value.
    3. Optional: open Advanced Options
      • Video Codec: AV1 (best quality, RTX 40/50), HEVC (H.265), or H.264 (widest compatibility)
      • Audio Codec: Opus (default) or AAC — MP4 containers auto-switch to AAC
      • Speed/Quality: NVENC presets P1 (fastest) through P7 (best quality), default P4 Balanced
      • Container: MP4 (most compatible) or MKV (best with Opus audio)
      • Tune: HQ (default), Low Latency, Ultra-Low Latency, or Lossless
      • Resolution: Set max width/height to downscale while preserving aspect ratio
      • Trimming: Set start/end times to compress only a portion
    4. Click Compress and watch progress/logs in real time. Cancel anytime. Download starts automatically.

    Tips

    • For very small targets, prefer AV1 or HEVC and keep audio around 96–128 kbps.
    • For speed, try Low Latency tune with a faster preset (P1–P4).
    • MP4 + Opus is not supported; the worker auto-switches to AAC for MP4 containers.
    • MP4 outputs include +faststart for better web/streaming playback.
    • HEVC MP4 outputs use the Apple-compatible hvc1 sample-entry tag so iPhone, iPad, Safari, and other strict players can recognize the video stream.

    Configuration

    Environment Variables

    Create a .env file and mount it at /app/.env:

    # Authentication (also configurable via Settings UI)
    AUTH_ENABLED=false
    AUTH_USER=admin
    AUTH_PASS=changeme
    
    # File retention
    FILE_RETENTION_HOURS=1
    
    # Worker concurrency: automatic is the recommended default. It uses live
    # CPU/RAM/GPU capacity and does not reserve memory. Set 1..20 for a manual cap.
    WORKER_CONCURRENCY=auto
    
    # SVT-AV1 thread-level parallelism. "auto" is safest across mixed hardware;
    # optionally set 0..6 after benchmarking a stable host.
    SVTAV1_LP=auto
    
    # Codec visibility is persisted in settings.json and managed from Settings.
    # Hardware entries are still hidden unless their runtime probe passes.
    
    # Redis / backend (usually no need to change)
    REDIS_URL=redis://127.0.0.1:6379/0
    BACKEND_HOST=0.0.0.0
    BACKEND_PORT=8001
    

    The Compose profiles bind ./uploads and ./outputs for media, ./state for settings/history, and ./redis-data for the local Redis AOF. Multipart upload and FFmpeg temporary files use ./uploads/.tmp, so large batch uploads do not consume the container's writable layer. Put the media directories on the disk with the most free space and back up state/ if you want to preserve the UI configuration.

    Temporary media storage

    Uploads use MEDIA_STORAGE=auto by default. The Docker Compose profiles set a 10 GiB /dev/shm ceiling by default through MEDIA_SHM_SIZE=10g; this is a capacity limit, not a preallocation. Tmpfs consumes host memory only as files are written and releases it when they are deleted. On Linux/Docker, auto mode uses /dev/shm/8mb.local/uploads only when there is at least 512 MB free; use MEDIA_STORAGE=memory to require the memory-backed path, or disk to force normal disk-backed uploads. On native Windows, auto and memory modes keep a normal per-user filesystem pathname and apply FILE_ATTRIBUTE_TEMPORARY, a RAM-preferred Windows cache hint. Windows may still spill temporary data to disk under memory pressure, so this is not a guaranteed RAM disk. Explicit memory mode also applies a conservative per-upload admission budget based on MEDIA_MEMORY_LIMIT_GB, available memory, worker concurrency, FFmpeg working space, and OS headroom. Temporary API upload inputs are removed after the encode, retries, fallback, and final validation finish on every platform; failed partial uploads are removed immediately. Folder Watch source files remain owned by Folder Watch and follow its keep/delete/move policy. Settings, history, Redis data, and final outputs remain on their persistent disk locations.

    For Docker, increase or reduce the shared-memory ceiling in .env with MEDIA_SHM_SIZE before recreating the container. Check the active limit with docker compose exec 8mblocal df -h /dev/shm. auto can still fall back to the persistent uploads disk when the available shared memory or the configured MEDIA_MEMORY_LIMIT_GB budget is not sufficient. This keeps RAM use bounded instead of treating the entire host memory pool as a temporary filesystem.

    Folder Watch

    The Folder Watch (Advanced) panel is at the bottom of /settings, is collapsed by default, and can poll an existing Windows, UNC, or Linux-mounted folder. It waits for a file's size and mtime to remain stable, then sends it through the same Celery compression queue used by uploads. It supports recursive scanning, new-only or existing-file processing, an explicit profile, same-folder or specific-folder output, and keep/delete/ move-after-success behavior. Stable seconds is the safety delay before a file is considered finished: the watcher requires the file size and modified time to remain unchanged for that many seconds before starting compression. It is a quiet-period safety delay, not the video's duration and not the total processing time. The default is 5 seconds; use a longer value for slow network copies. The polling interval controls how often the folder is checked and is separate from the stable-file delay. Deletion or moving happens only after the output is non-empty and passes FFprobe validation. Folder Watch state is persisted in the application settings file and is not an arbitrary public-path API.

    Settings UI

    Manage settings at /settings with no container restart required:

    • Authentication — enable/disable, manage credentials
    • Default Presets — target size, codec, quality, container defaults
    • Codec Visibility — enable/disable NVIDIA, Intel/VAAPI, and CPU codecs
    • Preset Profiles — create named presets for quick access
    • Worker Concurrency — adjust parallel job limit
    • Size Buttons — customize the target size quick-pick buttons
    • GPU Support Reference — hardware encoding compatibility at /gpu-support

    The direct API is documented in docs/API.md. The same routes are available from Docker and the native Windows app, including single-file and batch upload, status polling, cancellation, and downloads.

    The Folder Watch panel is also available under Settings for optional cross-platform polling of stable files through the normal queue.

    Performance & Concurrency

    8mb.local supports multiple parallel compression jobs. The default WORKER_CONCURRENCY=auto selects a bounded starting ceiling from live available system RAM, physical CPU cores, and detected NVIDIA VRAM. For NVIDIA, the worker also checks free VRAM before each encode. If another application consumes GPU memory, new encodes wait; when memory becomes available again, queued work can start. This is resource-aware admission, not a guarantee of maximum NVENC sessions. A 16 GB card such as an RTX 4070 Ti SUPER therefore starts higher than a 3–6 GB GTX 1060, while numeric values remain available as manual overrides. The selector never reserves the reported memory; MEDIA_MEMORY_LIMIT_GB remains the separate media admission budget.

    Use the Settings page to switch between Automatic (recommended) and a manual limit. Automatic mode can scale active encode admission down and up without restarting when live GPU memory changes. Changing the configured manual limit still requires a container or desktop-app restart because it changes the worker pool ceiling.

    Manual setting change: restart the container or desktop app after changing the configured worker limit. Automatic VRAM/RAM admission keeps adapting while it runs.

    Reverse Proxy Configuration

    SSE (Server-Sent Events) requires special proxy configuration to prevent buffering.

    Nginx / Nginx Proxy Manager

    location /api/stream/ {
        proxy_pass http://backend:8001;
        proxy_buffering off;
        proxy_cache off;
        proxy_set_header Connection '';
        chunked_transfer_encoding on;
    }
    

    In Nginx Proxy Manager: Edit Proxy Host → Advanced tab → Custom Nginx Configuration.

    Traefik

    labels:
      - "traefik.http.middlewares.no-buffer.buffering.maxRequestBodyBytes=0"
      - "traefik.http.middlewares.no-buffer.buffering.maxResponseBodyBytes=0"
      - "traefik.http.routers.8mblocal.middlewares=no-buffer"
    

    Apache

    <Location /api/stream/>
        ProxyPass http://backend:8001/api/stream/
        ProxyPassReverse http://backend:8001/api/stream/
        SetEnv proxy-sendchunked 1
        SetEnv proxy-interim-response RFC
    </Location>
    

    Why this matters: Without proxy_buffering off, your proxy buffers the entire SSE stream and delivers all progress events at once when the job completes — progress appears stuck at 0% until done.

    Troubleshooting

    Container won't start with --gpus all

    If the host has no NVIDIA GPU, Docker's NVIDIA runtime hook will abort:

    nvidia-container-cli: initialization error: WSL environment detected but no adapters were found
    

    Fix: Remove --gpus all and any NVIDIA_* environment variables. The app will start in CPU mode automatically.

    NVENC not working

    1. Missing NVIDIA_DRIVER_CAPABILITIES

    Symptom: Cannot load libnvidia-encode.so.1

    Fix: Add the environment variable to your docker run or compose:

    -e NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
    

    This tells the Container Toolkit to mount NVENC libraries into the container.

    2. Driver too old (NVENC API mismatch)

    Symptom: Driver does not support the required nvenc API version. Required: 13.0 Found: 12.1

    This means your NVIDIA driver is 535.x or older. You need driver 550+.

    # Debian 12
    wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/cuda-keyring_1.1-1_all.deb
    sudo dpkg -i cuda-keyring_1.1-1_all.deb
    sudo apt update && sudo apt install nvidia-driver
    sudo reboot
    
    # Ubuntu
    sudo add-apt-repository ppa:graphics-drivers/ppa
    sudo apt update && sudo apt install nvidia-driver-550
    sudo reboot
    

    Verify after reboot: nvidia-smi should show driver 550+.

    3. Missing NVIDIA Container Toolkit

    # Install (Debian/Ubuntu)
    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
      | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
    distribution=$(. /etc/os-release; echo $ID$VERSION_ID)
    curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list \
      | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
      | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
    sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
    sudo systemctl restart docker
    

    If you can't upgrade the driver, the system will automatically fall back to CPU encoding. Your videos will still compress — just slower.

    Progress bar stuck at 0%

    Cause: Reverse proxy buffering SSE responses.

    Fix: Add proxy_buffering off; for the /api/stream/ location. See Reverse Proxy Configuration.

    File slightly over target size

    This is handled automatically. If the output exceeds the target by more than 2%, the system re-encodes with a reduced bitrate (up to 2 retries). You'll see a notification and hear an audio alert.

    General issues

    ProblemSolution
    Permission denied on uploads/outputschmod 777 uploads outputs or chown $USER:$USER uploads outputs
    Port already in useChange mapping: -p 8080:8001
    Container won't startdocker logs 8mblocal to check errors; docker rm -f 8mblocal and retry
    FFmpeg errorsCheck logs in the UI; try the CPU fallback paths: SVT-AV1 (libsvtav1), x265 (libx265), or x264 (libx264)

    Quick Diagnostic Commands

    docker ps | grep 8mblocal              # Is it running?
    docker logs 8mblocal                   # Startup and runtime logs
    docker exec 8mblocal nvidia-smi        # GPU visible?
    docker exec 8mblocal ffmpeg -hide_banner -encoders 2>&1 | grep nvenc  # NVENC available?
    docker restart 8mblocal                # Restart
    docker logs -f 8mblocal               # Live log tail
    

    License

    Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)

    You are free to use, share, and adapt this project for non-commercial purposes with appropriate attribution. Commercial use requires a separate license — please contact me directly.

    Contributing

    Pull requests welcome! Please ensure Docker builds succeed and test with your GPU hardware.

    Privacy

    The Android app processes selected media locally and does not request Internet access. See the full privacy policy.

    Support

    For issues, questions, or feature requests, please open an issue on GitHub.