Modification notice: This README was modified from linkedlist771/SoraWatermarkCleaner by the FrameMend Portable fork; see CHANGELOG.md.
Sora watermark remover for Windows — an independent portable fork optimized for NVIDIA GeForce RTX GPUs with CUDA acceleration and expanded temporal cleanup.
RC.13 prerelease identity: the release tag is
windows-cuda-v0.1.0-rc.13, withFrameMend-Portable-Windows-CUDA-v0.1.0-rc.13.zipand its adjacent.zip.sha256file as the only eligible public binary assets. When available, download those exact named files from the Releases page; do not use GitHub's automatically generated source-code archives as the portable app. This document does not by itself establish that an asset is currently available; verify the immutable release record and checksum on the Releases page. The bounded RC.13 evidence is recorded in the release notes; it does not establish universal hardware, stability, compatibility, or visual-quality guarantees.Technical license warning: RC.13's audit still contains unresolved model- rights and redistribution entries, including the detector weights and PCM weights. This is not legal advice, and this build is not represented as fully license-cleared. Acknowledging a warning records that it was reviewed; it does not create permission, cure a licensing issue, or grant additional rights.
English | Русский | Українська | Deutsch | Chahta Anumpa | 中文
Documentation: Complete Windows user guide · Visual Windows quick start · Detailed one-click portable guide · CLI reference · Source, Python, and Web interfaces · RC.13 release notes
Independent-fork notice: FrameMend Portable is an independent fork of SoraWatermarkCleaner, created by linkedlist771 and distributed under Apache-2.0. It is not affiliated with or endorsed by linkedlist771, OpenAI, or NVIDIA.
This fork's Windows portability, RTX 50-series CUDA profile, batch queue, four-engine cleaning path, advanced scene/track-safe temporal cleanup, optional NVIDIA VFX cleanup and Video Super Resolution processing, NVENC path, interrupted-batch recovery, and source-preservation hardening were developed by Andrei Pemberton (@andreipemberton) in collaboration with Lilitari, an AI collaborator credited by name rather than through a GitHub account. The FrameMend fork repository and releases are maintained and published by Andrei Pemberton.
FrameMend Portable detects the moving Sora watermark with a YOLO model and inpaints the detected region. Use it only on videos you own or are authorized to modify.
Fork development history is tracked in CHANGELOG.md.
Project description: FrameMend Portable is an independent, Windows-portable Sora watermark remover with multi-file batch processing, individual clean outputs, LaMa, E2FGVI-HQ, ProPainter, experimental DiffuEraser, source-faithful NVENC and lossless-master output profiles, optional same-resolution NVIDIA VFX cleanup and upscaling, RTX 50-series CUDA tuning, expanded temporal cleanup, manual interrupted-batch recovery, and five selectable Web UI locales. CUDA is required for all temporal engines and NVIDIA VFX processing; LaMa has a slower CPU fallback. Developed by Andrei Pemberton with AI collaborator Lilitari.
sora_watermark_removed.mp4 |
sora_watermark_original.mp4 |
- A self-bootstrapping, location-independent Windows launcher
- An updater-aware portable layout. RC.12 must be installed manually once;
later eligible releases can be offered at Web startup and are applied only
after immutable GitHub release metadata, the exact ZIP digest, the internal
managed-file inventory, and the final
launcher.datcommit marker agree - A private CPython 3.13.15 runtime and FFmpeg kept inside the extracted folder
- PyTorch 2.13.0 and TorchVision 0.28.0 on CUDA 13.0, with native RTX
50-series (
sm_120) support - A coordinated runtime security refresh to pip 26.2.1, Gradio 6.25.0,
FastAPI 0.141.1, Starlette 1.6.0, Pillow 12.3.0, and Requests 2.34.2,
plus Diffusers 0.40.0's sharded-checkpoint path-validation fix, while
retaining tested Transformers 5.14.1 and
moving FFmpeg to retained stable build
n8.1.2-34-g9b6c8969e0 - The bounded DiffuEraser gate described below was repeated under Diffusers 0.40.0: the 22×264×264 synthetic CUDA probe passed on an RTX 5070 Ti with exact outside-mask pixels. This is final-runtime evidence for that bounded probe only, not representative real-video validation
- Click-to-browse multi-video selection, repeated add-more selection, and drag-and-drop
- An independent Remove watermarks toggle plus optional NVIDIA same-resolution Denoise and Deblur controls plus optional upscaling. Cleanup-only, upscale-only, and any supported chain can run without watermark removal; only a batch with every processing stage disabled is rejected
- Denoise and Deblur can be selected independently or together. The advanced chain runs Denoise → Deblur → Upscale and warns about possible texture loss, halos, ringing, and overprocessing
- A supported CLI and Python batch API backed by the same
framemend.pipelineservice as the Web UI, including processing, recovery, diagnostics, model preparation, license inspection, and cancellation - Selectable English, Russian, Ukrainian, German, and modern Choctaw web UI; English is always the default
- Four cleaning engines: fast frame-batched LaMa, E2FGVI-HQ, optional ProPainter, and experimental DiffuEraser
- Optional NVIDIA VFX Denoise and/or Deblur at the source resolution, followed
sequentially by optional Video Super Resolution with one final encode.
Native
*_cleanmasters are always retained when watermark removal is used - Hard scene cuts and watermark-track jumps split temporal inference, so unrelated shots or watermark positions are not mixed in one model window
- Selectable Conservative, Standard, and Wider mask coverage with validated scene-local box smoothing and bounded gap recovery
- Selectable balanced, high-quality H.264, and FFV1 lossless-master output profiles, with NVENC acceleration and automatic x264 fallback
- Exact no-reencode passthrough when no watermark is detected
- Bit-for-bit compatible audio copying, with high-quality AAC only as a compatibility fallback
- Source frame-rate, color tags, container metadata, and chapters preserved where the edited output format permits
- A complete hash-locked Windows dependency set plus SHA-256 verification and atomic installation for Python, pip, FFmpeg, and all three model files
- App-local Microsoft C++ runtime files, so PyTorch does not depend on a preinstalled Visual C++ Redistributable
- Local caches, models, temporary files, logs, and outputs — no dependency on a developer's AppData or Torch cache
- Audio-merge recovery that preserves a successfully cleaned video
- Atomic
batch_state.jsonmanifests and a localized, manual Recover interrupted batch panel that revalidates finished files and retries only pending or interrupted work. Schema 3 adds strong source digests and keeps recoverable schema-1/schema-2 manifests loadable without discarding completed outputs. A narrow legacy Gradio-cache check can prove timestamp-only rewrites without weakening path, size, or changed-content rejection - Recovery validation and bounded errors are visible; controls and a server-side single-flight lock prevent duplicate Resume requests; the Web UI publishes only outputs newly completed by the current resume attempt
- Local-only Gradio binding on
127.0.0.1by default
| Mode | Requirement | Notes |
|---|---|---|
| LaMa (Fast) | NVIDIA CUDA recommended, not mandatory | Has a much slower CPU fallback |
| E2FGVI-HQ (Temporal Quality) | NVIDIA GPU with working CUDA driver required | Established temporal option; model downloads on demand |
| ProPainter (High Quality) | NVIDIA CUDA required | Optional ~0.19 GiB non-commercial model pack |
| DiffuEraser (Experimental) | NVIDIA CUDA required | Adds ~8.86 GiB after ProPainter; extremely slow; one bounded 22×264×264 synthetic CUDA probe passed on an RTX 5070 Ti, not representative real-video validation |
| NVIDIA Denoise/Deblur and Video Super Resolution (optional) | NVIDIA CUDA required | Pinned NVIDIA VFX 0.1.0.1; first use requires NVIDIA-terms acceptance and downloads about 468 MiB |
| High-quality output | Compatible NVIDIA driver/GPU recommended | NVENC P7/CQ16; automatically falls back to x264 |
| Lossless master | CPU FFV1 encoder included | Very large MKV; intended for archival/editing |
The bootstrap fixes the runtime at PyTorch 2.13.0+cu130 and TorchVision
0.28.0+cu130, with native sm_120 support. Users do not need to install the
CUDA Toolkit, system Python, Git, FFmpeg, or modify PATH. They do need a
current NVIDIA display driver for CUDA modes. Do not install an optional
backend's upstream requirements over this runtime: DiffuEraser's upstream pins
an older Torch build that would remove the proven RTX 50-series path.
The refreshed private runtime uses CPython 3.13.15 and pip 26.2.1. Gradio 6.25.0, FastAPI 0.141.1, Starlette 1.6.0, Pillow 12.3.0, and Requests 2.34.2 replace the preceding Web/runtime stack. During a verified runtime rebuild, the launcher preserves a valid existing Gradio upload-cache hash seed so interrupted-batch recovery can continue to authenticate compatible cached uploads; it does not weaken source-content validation.
- 64-bit Windows 10 22H2 or Windows 11
- Internet access on first launch
- A writable extracted folder
- A current NVIDIA driver for E2FGVI-HQ (and for fast LaMa/NVENC processing)
- Verify RC.13 on the Releases page, then download the
FrameMend-Portable-Windows-CUDA-v0.1.0-rc.13.zipstarter and its adjacent.zip.sha256. Those canonical URLs do not by themselves prove availability; confirm the immutable release record and checksum before use. - Extract the complete ZIP to a normal writable folder.
- Double-click
run.bat. - Leave the first-launch window open while the private runtime is prepared.
- The app opens in your browser; select one video or a whole batch in the same queue.
For the shortest and most predictable Windows paths, fully extract to a
drive-root folder such as
C:\FrameMend-Portable-Windows-CUDA-v0.1.0-rc.13\ or
D:\FrameMend-Portable-Windows-CUDA-v0.1.0-rc.13\. Do not run the app from
inside the ZIP. The
application also uses short, collision-safe staging names, so enabling the
system-wide Windows long-path policy is not required.
The small starter ZIP intentionally omits the multi-gigabyte runtime and model
weights. Its first launch downloads verified CPython 3.13.15 and pip
26.2.1 artifacts, the hash-locked PyTorch 2.13.0+cu130 and TorchVision
0.28.0+cu130 wheels, and pinned FFmpeg
n8.1.2-34-g9b6c8969e0. The detector and cleaning-model packs remain on demand,
are checked by exact size and SHA-256, and stay inside the portable folder.
NVIDIA VFX is also omitted. After explicit acceptance of NVIDIA's separate
terms, selecting the post-process downloads and verifies the pinned official
nvidia-vfx 0.1.0.1 wheel (about 468 MiB downloaded and 793 MiB
installed) under user_data. The public lean ZIP does not redistribute
NVIDIA's wheel, DLLs, or models. After the one-time download, the folder can be
moved to another location or drive without installing system-wide software.
All mutable files stay under:
models/ verified model files
user_data/ outputs, caches, logs, temporary files, and Gradio uploads
python/ private Python and CUDA runtime
ffmpeg/ private FFmpeg and ffprobe
RC.12 is the first updater-enabled package, so an RC.11-or-earlier installation
cannot discover or install it by itself. Download and extract RC.12 manually as
described above. After that one-time transition, run.bat checks at startup
for a newer release on the configured channel. The update prompt defaults to
No: no update ZIP is downloaded and no managed application file is changed
unless the user explicitly agrees.
An offline computer, timeout, GitHub API limit, malformed response, mutable release, or failed verification never blocks normal startup; FrameMend records a bounded local diagnostic and opens the installed version. The normal CLI never prompts and never installs an update implicitly.
Automatic apply is limited to an exact, immutable GitHub release from
andreipemberton/framemend-portable. The selected ZIP digest must match
GitHub's immutable asset metadata, its UPDATE_MANIFEST.json must match every
managed application file, and launcher.dat must bind that exact manifest.
FrameMend stages and validates the application before replacing managed files,
preserves rollback copies, and installs launcher.dat last as the commit
marker before reopening the app.
The updater never owns or deletes user_data/, models/, python/, or
ffmpeg/. Outputs, caches, logs, recovery manifests, accepted-term markers,
downloaded model packs, optional NVIDIA components, and the private runtime
remain in place. If a release cannot be proven immutable and internally
consistent, FrameMend may report it but will not auto-apply it.
After an accepted application update reopens FrameMend, a PowerShell-only
contract check runs before private Python, PyTorch, or CUDA. It compares the
release's runtime schema and exact requirements digest plus the pinned Python,
pip, PyTorch, TorchVision, FFmpeg, and app-local runtime identities. A matching
runtime is reused. A stale runtime is rebuilt from the new release's hash-locked
dependencies first, while the last committed python/ folder is moved to the
fixed .fmold rollback folder. FrameMend retains exactly one immediate previous
runtime generation; the fixed six-character name keeps the verified Windows
path budget deterministic. If setup is interrupted after promotion but before
the new runtime marker is committed, the next launch restores the validated
.fmold generation. This is how a later release can upgrade PyTorch without
bundling or directly overwriting the multi-gigabyte private runtime in the lean
updater ZIP. The portable release's dependency pins are authoritative; custom
dependency versions are supported through source installations with a
separately managed environment, not by modifying the portable private runtime.
After bootstrap and preflight finish, each app-server start writes a local run
folder under user_data/logs/runs/<run-id>/. It contains console.log
(mirrored console output), gpu.csv (periodic GPU telemetry), faults.log
(Python fault diagnostics), and activity.json (batch/model/video phase
markers). status.running.json exists while the run is active and is normally
replaced by status.completed.json or status.failed.json when it ends.
These files stay local and are not uploaded. Run folders remain until you
delete them, so remove unneeded folders manually from time to time. Logs can
contain video filenames and full filesystem paths; review them before sharing.
A forced reboot, driver reset, or system crash can leave status.running.json
behind. That means only that the app did not record a graceful finish, not that
it caused the crash.
The maintainer builder creates the small first-run starter by default:
powershell.exe -NoProfile -ExecutionPolicy Bypass `
-File .\scripts\portable\build_windows_portable.ps1For local development only, the explicit FullOffline mode can preassemble the core runtime, FFmpeg, and three core model files:
powershell.exe -NoProfile -ExecutionPolicy Bypass `
-File .\scripts\portable\build_windows_portable.ps1 `
-FullOffline -RequireCudaThe builder emits a ZIP64 archive, a .sha256 checksum, schema-6
PORTABLE_BUILD.json, an exact UPDATE_MANIFEST.json managed-file inventory,
and the manifest-bound launcher.dat commit marker under dist/. It copies an
explicit application allowlist rather than packaging the maintainer's existing
environment. Release builds refuse a dirty source tree. -AllowDirty produces
only an unpacked -DEVELOPMENT-LOCAL-ONLY starter stage; it deliberately emits
no ZIP, checksum, update manifest, or launcher.dat and must not be published.
FullOffline is developer-local tooling only. CI and release scripts must not upload it. The intended RC.13 public release boundary is the lean starter ZIP plus its SHA-256 file only, until FFmpeg corresponding-source handling, a runtime SBOM, Microsoft DLL redistribution rights, and every model-license entry are resolved.
LaMa processes detected watermark crops in GPU batches. On an RTX 5070 Ti the automatic profile uses FP16 YOLO detection batches of 16 and safe FP32 LaMa batches of 8. LaMa can run on CPU, but video processing will be substantially slower.
E2FGVI-HQ processes ordered frames in overlapping clips so it can use temporal context and reduce frame-to-frame flicker. The RTX 5070 Ti profile defaults to:
- 24-frame clips with 6-frame overlap
- 5-frame neighbor radius and at most 3 reference frames
- 128-pixel stable crop margin
- 4-pixel backend mask padding plus the selected coverage preset
- 1.25-million-pixel padded crop cap
- BF16 inference with a small FP32 deformable-convolution section
E2FGVI-HQ and its checkpoint are licensed under CC BY-NC 4.0 and are for non-commercial use unless separate permission is obtained.
All temporal modes now stop their reference windows at detected hard scene cuts and watermark-track boundaries. This specifically avoids feeding unrelated shots or a different watermark corner into one temporal inference window, a common cause of tearing and ghosted reconstruction.
ProPainter uses propagation and transformer-based video inpainting for harder motion and texture cases. Its verified on-demand pack is approximately 0.19 GiB and is not included in the starter ZIP. Review and accept the S-Lab License 1.0 non-commercial terms before installing it:
.\python\python.exe -m framemend.model_packs install propainter --accept-noncommercialDiffuEraser adds diffusion refinement on top of a ProPainter prior. Its own verified pack adds approximately 8.86 GiB; with the ProPainter dependency, the optional download is about 9.05 GiB total. The portable adapter uses native PyTorch SDPA, bounded native-resolution crops, and block-level CPU offload so a 16 GB GPU has a feasible path, but offload makes it extremely slow.
.\python\python.exe -m framemend.model_packs install diffueraser --accept-noncommercialValidation status: model manifests, resumable downloads, dependency isolation, adapter imports, clip boundaries, and CPU/offload wiring have automated coverage. Under Diffusers 0.40.0, a bounded synthetic CUDA inference passed on an RTX 5070 Ti at the backend's minimum supported crop above 256 pixels: 22 frames at 264×264 with two-step PCM. Model load took 24.643 seconds and inference took 19.186 seconds. Pixels outside the mask matched exactly; peak PyTorch allocation/reservation was 5,716,349,440/5,989,466,112 bytes, and both counters returned to 33,554,432 bytes after teardown. Driver-reported total use was 5,093 MiB before and 4,969 MiB after the probe. This was a minimum-compliant synthetic probe, not representative real-video visual-quality, duration, or stability validation. DiffuEraser remains experimental and extremely slow; use E2FGVI-HQ or ProPainter for dependable work.
The Web UI exposes one Mask coverage choice for every cleaning engine:
- Conservative stabilizes verified detections with no additional preset padding. It preserves the most source imagery but can leave faint watermark edges.
- Standard is the default and recommended setting. It applies robust scene-local box smoothing, recovers only short supported detection gaps, and adds a modest resolution-aware margin.
- Wider uses a longer temporal window, bridges somewhat longer supported gaps, and expands the mask further for stubborn username or translucent edges. It asks the cleaner to reconstruct more genuine image area.
Every preset prevents an isolated detection from seeding a shot-wide track, stops at hard scene cuts and watermark-location jumps, and refuses to fill long unsupported gaps. Wider does not improve YOLO recall; it changes bounded temporal recovery and expands the masks around retained detections.
RC.9 separates NVIDIA Denoise, Deblur, and upscaling into independent controls. It runs inside this PyTorch/Gradio portable app; ComfyUI is not required. Every NVIDIA stage requires 64-bit Windows, the bundled CPython 3.13.15 runtime, an NVIDIA GeForce RTX GPU with working CUDA support, and a compatible current NVIDIA driver. Either Studio or Game Ready drivers can work; Studio is the conservative recommendation for long creator workloads, but driver branch alone is not a guarantee of stability.
- Denoise: Off by default. When enabled, it has its own Low (default), Medium, High, or Ultra strength.
- Deblur: Independently Off by default, with its own Low (default), Medium, High, or Ultra strength.
- Both cleanup effects may be enabled together. The UI then shows an advanced warning about texture loss, halos, ringing, and overprocessing.
- Upscale: Off by default.
- Target: UHD by default, with aspect-preserving FHD, QHD, UHD, and 1.5x/2x/3x/4x choices. The source is never warped or downscaled to satisfy a target.
- Upscale model: Standard High by default; Standard Ultra, Clean-source High, and Clean-source Ultra are also available. Standard modes suit typical compressed video; clean-source modes are intended for already-clean, high-bitrate input.
- Codec: Auto by default. Auto selects H.264 when both output dimensions are at most 4096 pixels and HEVC when either dimension is above 4096. Explicit H.264 above that envelope is rejected with guidance; any dimension above 8192 is rejected.
The NVIDIA terms control appears whenever cleanup or upscaling is selected.
First use requires explicit acceptance of the
NVIDIA Software License Agreement,
AI Product Terms,
and Open Model License.
The app then downloads and verifies the pinned official
nvidia-vfx 0.1.0.1 wheel. Its roughly
468 MiB download expands to about 793 MiB under user_data; the public lean
ZIP does not redistribute NVIDIA's wheel, DLLs, or models.
The processing choices and output names are:
| Processing | Output |
|---|---|
| Watermark removal only | *_clean |
| Direct Denoise / Deblur | *_denoised / *_deblurred |
| Direct Denoise + Deblur | *_denoised_deblurred |
| Direct upscale | *_upscaled |
| Direct cleanup + upscale | *_denoised_upscaled / *_deblurred_upscaled |
| Direct Denoise + Deblur + upscale | *_denoised_deblurred_upscaled |
| Watermark + cleanup | *_clean_denoised / *_clean_deblurred |
| Watermark + Denoise + Deblur | *_clean_denoised_deblurred |
| Watermark + upscale | *_clean_upscaled |
| Watermark + one cleanup + upscale | *_clean_denoised_upscaled / *_clean_deblurred_upscaled |
| Watermark + both cleanups + upscale | *_clean_denoised_deblurred_upscaled |
Watermark removal may be turned off for Denoise-only, Deblur-only, both cleanups, upscale-only, or any supported cleanup-plus-upscale chain. The app rejects only a batch in which watermark removal, both cleanup effects, and upscaling are all disabled. Originals are never modified.
When watermark removal is enabled, all videos are cleaned sequentially and
each native *_clean master is published first. The detector and cleaner are
then fully released before one isolated NVIDIA worker starts. For each frame,
the worker executes strictly:
decode → optional Denoise → optional Deblur → optional Upscale → one download/final encode
Denoise → Deblur → Upscale is a FrameMend engineering inference. NVIDIA documents Denoise and Deblur as same-resolution operations and identifies Deblur as useful before super resolution, but it does not prescribe the order of the two cleanup effects. Deblurring noisy material can amplify artifacts; inspect a two-cleanup result carefully.
Cleanup precedes upscaling, but no cleanup intermediate is saved
when upscaling follows it. The native *_clean master is always retained and
published when watermark removal is enabled, even if later NVIDIA processing
is skipped, cancelled, or fails. With watermark removal disabled, the worker
receives the untouched source directly and creates only the selected NVIDIA
derivative.
H.264 output uses NVENC when its preflight succeeds; HEVC uses the matching
HEVC NVENC encoder and hvc1 tagging for MP4 compatibility. If NVENC
preflight fails, the console and logs visibly report the matching x264 or x265
software fallback. NVIDIA derivatives are still lossy even when the
container is MKV. Compatible audio, metadata, chapters, and ancillary streams
are preserved where the output container permits.
Video Super Resolution may reconstruct plausible fine detail; it cannot
recover information that was never present in the source. The NVIDIA Python
API is applied per frame, so this integration does not claim temporal
awareness. Keep the original and, when watermark removal is enabled, the
native *_clean master as archival/editing sources. Inspect derivatives for
faces, text, thin lines, fast motion, oversmoothing, and ringing. Upscaling
improves presentation, not watermark-removal accuracy.
The initial NVIDIA path supports constant-frame-rate, unrotated, square-pixel SDR 8-bit input. HDR/10-bit, variable-frame-rate, rotated, and anamorphic sources are skipped rather than silently converted or warped. For accepted inputs, the RGB pipe uses an explicit source-aware color range and conversion matrix instead of FFmpeg's implicit defaults. See NVIDIA's Python API and Video Super Resolution documentation for the underlying API and filter constraints.
The earlier two-effect cleanup-plus-upscale implementation passed its bounded rc.8 gate on 2026-08-03 on an RTX 5070 Ti. RC.9's new three-effect Denoise → Deblur → Upscale chain separately passed its bounded RTX 5070 Ti matrix on the same date: three consecutive full-chain runs, cleanup-only modes, HEVC above 4096, cancellation and recovery, audio/cadence checks, worker exit, and VRAM return all completed without OOM or driver reset. Synthetic visual inspection found visible edge smoothing and mild halo/ringing after the full chain, so the combined path remains an advanced, source-dependent option rather than a universal quality recommendation.
The web UI defaults to High quality — recommended. On CUDA systems this uses NVENC P7, CQ16, full-resolution multipass analysis, and no source-bitrate-derived ceiling. It is still H.264 and therefore still lossy, but no resizing or upscaling is applied during the watermark-removal encode. Optional NVIDIA cleanup/upscaling uses its own single final encode. The balanced watermark-removal profile retains the smaller/faster P6/CQ18 behavior.
Lossless master stores the cleaned BGR frames as FFV1 level 3 in MKV. It does not introduce another lossy video generation, but files are very large and native Windows/browser playback support is limited; VLC, mpv, FFmpeg, or an FFV1-capable editor is recommended.
When the detector finds no watermark in any decoded frame, a normal output is
copied byte-for-byte to its same-container _clean name instead of being
decoded and encoded again. If lossless-master MKV was selected, the original
streams are losslessly remuxed into MKV without re-encoding. For edited
videos, compatible source audio is stream-copied without re-encoding; AAC
conversion is used only when the output container cannot accept the original
audio codec.
Use Browse and add videos to open the Windows multi-file picker. Hold Ctrl or Shift to select several files, click the button again to add another selection, or drag multiple MP4, MOV, AVI, or MKV files into the list. Leave Remove watermarks enabled to clean the batch, or turn it off for direct NVIDIA cleanup, upscaling, or both. Then click Process selected videos once.
The permanent folder is shown in the Web UI. Portable batches are stored under:
<portable-folder>\user_data\gradio_outputs\
processed_YYYYMMDD_HHMMSS_xxxxxx\
A source-run Web UI defaults to
<repository>\gradio_outputs\processed_YYYYMMDD_HHMMSS_xxxxxx\, or to the same
path beneath FRAMEMEND_DATA_DIR when that variable is set. The supported CLI
defaults to user_data\cli_outputs\processed_<timestamp>_<id>\;
--output-dir selects a batch directory and --output requires exactly one
resolved input.
When removal is enabled, videos run sequentially to keep GPU memory stable
while the detector and selected cleaner remain loaded for the cleaning phase.
In direct NVIDIA mode, neither is loaded: the original inputs are handed to an
isolated NVIDIA worker, which loads the selected effect or effects once for
the queue and exits afterward.
As soon as a video finishes, it appears in the completed-files list and remains
in the displayed output folder. Normal clean outputs retain the source
container suffix, such as name_clean.mp4 or name_clean.mov; lossless
masters use name_clean.mkv. Numeric suffixes are added only for collisions.
The web UI no longer waits for or creates a combined results ZIP.
When watermark removal and either NVIDIA stage are enabled, the app creates and retains the native clean outputs, unloads the remover, and then processes all successful items in one NVIDIA phase. The exact suffix follows the table above. If NVIDIA cleanup and upscaling are both selected, only the final NVIDIA derivative is encoded; no cleanup-only intermediate is saved.
When watermark removal is disabled, the original inputs go directly to the
selected NVIDIA stage or stages. There is no name_clean.* intermediate, and
every original remains untouched.
Use Stop current batch to request cancellation without waiting behind the GPU queue. During NVIDIA processing, the supervisor checks that signal and terminates the worker process tree safely; all completed outputs, native clean masters, and original inputs remain available. If a cleaner or verified download is currently running, it stops cooperatively at the next safe point.
The shared Web UI/CLI pipeline writes schema-3 batch_state.json atomically
after setup and after every validated item or stage. It records exact settings,
source fingerprints, intended outputs, completed validations, failures,
cancellation, and pending work. On a later launch, a localized Recover
interrupted batch panel is shown only when a recoverable manifest exists.
Recovery is always manual. Resume restores the exact saved settings,
revalidates existing outputs, retains valid completed files, and retries only
pending or interrupted work. Dismiss marks the batch abandoned without
deleting sources, outputs, logs, or the manifest. A failed later item never
removes an earlier validated result. New manifests persist a strong SHA-256
identity for every source. A timestamp-only rewrite is accepted only when the
bytes still match that identity. RC.11's legacy Web compatibility path is
limited to a configured Gradio content-addressed upload cache and verifies its
seeded digest; arbitrary paths and path, size, or content changes remain
rejected. Recoverable schema-1 and schema-2 manifests remain loadable and
upgrade atomically to schema 3 on the next write. CLI users run
framemend recover.
While recovery runs, Resume, Dismiss, and the selector are disabled and a server-side single-flight lock rejects duplicates. Validation and bounded failure details are shown in the status area. Only files newly completed by the current attempt are published to the Web UI; older validated outputs remain in their displayed folder without being rehashed.
Default/Web batch folders keep batch_state.json beside their media. Reused
CLI --output-dir or --output destinations keep collision-safe recovery
records under .framemend-batches\<batch-id>\batch_state.json; use
framemend recover --root <output-folder> to list them.
Portable users run framemend-cli.bat. Source or installed-package users
run framemend or python -m framemend. The supported commands are:
framemend processframemend recoverframemend doctorframemend models status|installframemend licenses [--json]framemend web [--open-browser]
process accepts multiple files or directories, searches directories
non-recursively unless --recursive is supplied, and supports watermark
removal, either or both cleanup effects, upscaling, and every supported chain.
The CLI never accepts component terms implicitly. See the
complete CLI reference for flags, output rules,
examples, recovery, and exit codes.
The Web UI, CLI, and supported Python batch API are adapters over
framemend.pipeline. RC.9 is a clean namespace break: there is no sorawm
import shim, SoraWM alias, or SORAWM_* environment-variable fallback.
Existing recoverable batch data is migrated for data preservation, not API
compatibility. See the developer guide.
The selector at the top of the local page provides:
- English (
en, default) - Russian / Русский (
ru) - Ukrainian / Українська (
uk) - German / Deutsch (
de) - Modern Choctaw / Chahta Anumpa (
cho)
These are the five selectable in-app locales. The Chinese README is a documentation translation only; Chinese is not currently a sixth Web UI locale.
The Choctaw localization uses contemporary Choctaw Nation orthography where a documented equivalent is available and retains clear English technical terms where no standardized software term could be verified. Community review is welcome.
The portable launcher above is recommended for Windows users. Developers can instead install from source with uv:
uv syncThe reproducible source baseline is CPython 3.13.15. On supported
Windows/Linux x86-64 systems, this project selects PyTorch 2.13.0 with CUDA
13.0. FFmpeg must be installed or placed in ffmpeg/ for a manual source
environment.
Run the supported Web command without opening a browser:
python -m framemend webAdd --open-browser only when desired. Portable run.bat remains the
browser-oriented launcher.
Supported Python batch usage:
from pathlib import Path
from framemend import BatchRequest, BatchSettings, process_batch
result = process_batch(
BatchRequest(
inputs=(Path("input.mp4"),),
output_dir=Path("outputs"),
settings=BatchSettings(
watermark=True,
cleaner="lama",
accept_unresolved_licenses=True,
),
)
)
for output in result.outputs:
print(output)Portable defaults are appropriate for an RTX 5070 Ti. Optional environment variables include:
FRAMEMEND_DETECTION_BATCH_SIZEFRAMEMEND_INPAINT_BATCH_SIZEFRAMEMEND_USE_NVENC=0to force software x264FRAMEMEND_OUTPUT_QUALITY=balanced|source_faithful|lossless_masterFRAMEMEND_MASK_COVERAGE=conservative|standard|widerFRAMEMEND_NVENC_PRESET,FRAMEMEND_NVENC_CQ, andFRAMEMEND_NVENC_MULTIPASSFRAMEMEND_GRADIO_PORTto request a fixed local portFRAMEMEND_E2FGVI_CLIP_LENGTHFRAMEMEND_E2FGVI_OVERLAPFRAMEMEND_E2FGVI_NEIGHBOR_STRIDEFRAMEMEND_E2FGVI_MAX_REFSFRAMEMEND_E2FGVI_ROI_MARGINFRAMEMEND_E2FGVI_MASK_PADDINGFRAMEMEND_E2FGVI_MAX_ROI_PIXELSFRAMEMEND_E2FGVI_BF16FRAMEMEND_E2FGVI_COMPILE
The original author published the labelled detector dataset on Hugging Face.
Technical compliance audit, not legal advice. Unresolved entries remain unresolved; FrameMend Portable RC.13 is not represented as fully license-cleared. Accepting terms or acknowledging a warning does not grant permission and does not replace a rights review for the intended use and redistribution.
FrameMend Portable remains an Apache-2.0 fork of SoraWatermarkCleaner by linkedlist771. The root LICENSE is preserved. FrameMend Portable is independent and is not affiliated with or endorsed by linkedlist771, OpenAI, or NVIDIA. Optional/runtime components retain their own licenses and unresolved status:
- Ultralytics remains temporarily distributed under AGPL-3.0, with the complete AGPL text and source location included. The detector-weight rights remain unresolved; the AGPL distribution posture does not resolve them.
- E2FGVI-HQ and ProPainter have non-commercial terms, Stable Diffusion components have their own OpenRAIL terms, and NVIDIA VFX requires separate NVIDIA terms.
- LaMa/Big-LaMa and SpyNet/OpenMMLab code and weight provenance are recorded
separately. A code license is not automatically a license for model weights;
entries remain
unverifiedwhere weight rights are not independently established. - The pinned PCM weight repository declares no license. Its status is unresolved, not Apache-2.0.
- The portable FFmpeg build is GPL. FullOffline remains local developer tooling and is not a public release asset.
Review THIRD_PARTY_NOTICES.md and the machine-readable THIRD_PARTY_COMPONENTS.json before use, redistribution, or commercial deployment.
Please preserve the original project's citation:
@misc{sorawatermarkcleaner2025,
author = {linkedlist771},
title = {SoraWatermarkCleaner},
year = {2025},
url = {https://github.com/linkedlist771/SoraWatermarkCleaner}
}- linkedlist771 for the original SoraWatermarkCleaner project and detector
- Andrei Pemberton (@andreipemberton) and Lilitari (AI collaborator, credited by name and not a GitHub account) for this fork's portable Windows runtime, CUDA/RTX 50-series optimization, streaming batch queue, five selectable Web UI locales, four-engine integration, scene/track temporal safety, optional verified model packs, sequential NVIDIA VFX cleanup/upscaling, interrupted-batch recovery, source-preserving output profiles, NVENC path, and reliability improvements
- IOPaint for the LaMa integration on which the focused runtime path is based
- E2FGVI for the temporal inpainting architecture
- ProPainter and DiffuEraser for their optional video-inpainting architectures
- NVIDIA Video Effects for the optional separately licensed Video Super Resolution runtime. This project is not endorsed by or affiliated with NVIDIA.
- Ultralytics YOLO for object detection