-
-
Notifications
You must be signed in to change notification settings - Fork 1
Development
Building RemuxForge from source. For using it, start at Home.
- .NET 10 SDK
- Node.js/npm and Rust for desktop packages
- the platform prerequisites required by Tauri 2 (WebView2 tooling on Windows, Xcode command-line tools on macOS)
- The same external tools the application needs at runtime, MKVToolNix, ffmpeg, MediaInfo CLI, if you intend to run or test it.
| Project | Contains |
|---|---|
RemuxForge.Core |
all the logic: analysis, media handling, metadata, splitting, transcoding, configuration and localization. Both front ends depend on it. |
RemuxForge.Cli |
the command-line entry point |
RemuxForge.Web |
the Blazor Interactive Server WebUI built with Radzen |
RemuxForge.Desktop |
the Tauri 2 host, native packaging and self-contained WebUI sidecar preparation |
Notable areas of Core:
| Folder | Responsibility |
|---|---|
Analysis/ |
frame-sync, deep analysis, speed correction, diagnostics |
Audio/ |
audio processing and rendering |
Configuration/ |
settings service, validation, codec and language mapping |
Localization/Resources/ |
en.json / it.json, every user-visible string, including the in-app help text |
Media/ |
ffmpeg and mkv tool wrappers |
Metadata/ |
field registry, tag registry, expression engine, pipeline evaluator, preset service |
Models/Config/ |
Options.cs holds the complete CLI parser |
Pipeline/ |
the remux pipeline and file scanner |
Rename/ |
the bulk rename engine |
Splitting/ |
the split pipeline and segment service |
Subtitles/ |
subtitle canvas rewriting |
The WebUI is coordinated by Components/Pages/Dashboard.razor and its code-behind. The shell lives in Components/Layout/, the three master/detail workspaces in Components/Remux, Components/Split and Components/Metadata, per-mode orchestrators in Services/, and domain-specific dialogs/editors in Components/Shared/. Dashboard owns command routing and selection state; there is no global presentation store.
Radzen is a fixed NuGet dependency and its static assets are served by ASP.NET Core, so the UI has no LibMan or CDN restore step. Shared visual tokens and Radzen overrides live under wwwroot/css/.
# CLI
dotnet build RemuxForge.Cli -c Release
# WebUI
dotnet build RemuxForge.Web -c Release
# Docker image
docker build -t remuxforge .
# Native desktop package for the current host
cd RemuxForge.Desktop
npm install
npm run buildCLI:
dotnet publish RemuxForge.Cli -c Release -r win-x64 --self-contained true
dotnet publish RemuxForge.Cli -c Release -r linux-x64 --self-contained true
dotnet publish RemuxForge.Cli -c Release -r linux-arm64 --self-contained true
dotnet publish RemuxForge.Cli -c Release -r osx-x64 --self-contained true
dotnet publish RemuxForge.Cli -c Release -r osx-arm64 --self-contained trueWebUI:
dotnet publish RemuxForge.Web -c Release -r win-x64 --self-contained true \
-p:PublishSingleFile=true -p:PublishTrimmed=false -p:EnableCompressionInSingleFile=trueRepeat for linux-x64, linux-arm64, osx-x64, osx-arm64.
release.sh must run on the Linux release VM. It builds every CLI/WebUI RID and the Docker image locally, then sends a clean source archive over SSH to an Apple Silicon macOS worker for the DMG and to a Windows x64 worker for the MSI. The workers build in temporary directories, return only the release artifact and are cleaned after a successful build. Git/GitHub publication steps remain interactive.
Desktop:
cd RemuxForge.Desktop
# Current host architecture for development
npm run build
# Native release target on the matching worker
npm run build:macos-arm64
npm run build:windows-x64The preparation step publishes RemuxForge.Web self-contained, renames it as the Tauri sidecar and copies its wwwroot into the application resources. Output is under src-tauri/target/<target>/release/bundle for explicit Rust targets, or src-tauri/target/release/bundle for the host target.
.NET RID publishing is cross-platform, but native desktop packaging is delegated to the matching operating system: macOS ARM64 for the DMG and Windows x64 for the MSI. Both workers also require glslc and spirv-val because the Vulkan shaders are compiled as part of the build.
Desktop runtime behavior:
- binds the sidecar only to
127.0.0.1on an operating-system-selected port; - stores data under the native per-user application-data directory;
- shows a local loader until the structured readiness line is received;
- returns to the loader with a Retry action if the sidecar crashes;
- enforces a single application instance;
- requests cooperative cancellation and then terminates the sidecar on exit.
Tauri produces an MSI installer for Windows and a .dmg containing RemuxForge.app for macOS. The current release pipeline does not sign or notarize either artifact, so Windows SmartScreen or macOS Gatekeeper can require explicit user confirmation on first launch.
Every user-visible string lives in RemuxForge.Core/Localization/Resources/en.json and it.json, keyed by dotted paths (web.config.help.remux.speed.text, metadata.field.audio_title, …). Values may be a string or an array of lines for multi-line help.
Both files must have the same keys. Adding UI text means adding it to both. The web.config.help.* keys are the in-app help pane, which is the authoritative description of every configuration field.
- Open an issue for bugs and behaviour changes before a large pull request.
- Include reproducible commands, platform, external tool versions, and the relevant MediaInfo or ffmpeg output.
- Keep pull requests focused on one change.
- Do not include copyrighted media samples.
- New user-facing strings go in both
en.jsonandit.json.
LLM-based assistance has been used during development for README and wiki documentation, WebUI design refinement, and broad refactor support where useful.