Skip to content

Development

simonefil edited this page Aug 28, 2026 · 4 revisions

Development

Building RemuxForge from source. For using it, start at Home.

Requirements

  • .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 layout

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/.

Build

# 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 build

Publish

CLI:

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 true

WebUI:

dotnet publish RemuxForge.Web -c Release -r win-x64 --self-contained true \
  -p:PublishSingleFile=true -p:PublishTrimmed=false -p:EnableCompressionInSingleFile=true

Repeat 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-x64

The 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.1 on 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.

Localization

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.

Contributing

  • 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.json and it.json.

LLM usage notice

LLM-based assistance has been used during development for README and wiki documentation, WebUI design refinement, and broad refactor support where useful.

Clone this wiki locally