April 23, 2026 · 6 min read

v2.4.0 — Settings Polish, Linux Drag Fix, and Configurable HuggingFace Path

Locally Uncensored v2.4.0 is a polish release. Eight fixes, two of them surfaced through community feedback on Discord, six caught during an internal end-to-end pass on the v2.3.9 build. No new headline features — this release exists so the next feature release lands on a cleaner foundation.

Quick TL;DR before we dig in:

Single-Instance Lock

Before v2.4.0, double-clicking the desktop shortcut started a second locally-uncensored.exe process. Both instances would race each other writing to %APPDATA%/Locally Uncensored/store_backup.json — not a frequent corruption source, but a real one when both happened to flush at the same millisecond.

v2.4.0 ships with tauri-plugin-single-instance. The second launch focuses, un-minimizes, and brings the existing window to front. No new process. Double-checked with three back-to-back launches: only one PID survives.

Settings > Model Storage — Configurable HuggingFace Folder

The Model Manager > Discover > Text tab lets you download GGUF models from HuggingFace. Until v2.4.0, the destination folder was always auto-detected from the active openai-compat provider — usually LM Studio’s ~/.lmstudio/models or the equivalent on Linux/macOS.

That worked fine for single-disk setups. It did not work for dual-boot users who wanted a shared model partition between Linux and Windows, or anyone running a NAS-mounted models folder. Reported on Discord by diimmortalis.

v2.4.0 adds a dedicated Settings > Model Storage section. Three controls:

The override takes effect immediately. Discover’s subtitle updates live to show the new Saves to: <path>. Verified end-to-end with a Gemma 4 E4B download (4.6 GB) landing in a custom Desktop folder, while the LM Studio default folder stayed untouched.

Settings > Privacy — In-App Statement

The privacy claim has always been on the README and in the schema.org metadata, but never inside the app itself. That mattered for first-launch trust — if you can’t be bothered to open GitHub, you were taking the README at its word.

v2.4.0 adds a Settings > Privacy section that lays out the actual behaviour:

Settings > Onboarding — Re-Run Wizard

The first-launch wizard runs once: hardware scan, recommended models, agent-mode tour. After that, the only way to see it again was Reset to Defaults, which wipes every other preference too — not great if you wanted to redo the hardware scan or show the app to a friend.

v2.4.0 adds an Onboarding section to Settings with a single Re-run onboarding button. It clears the marker file, flips onboardingDone back to false, and reloads the app. The wizard renders again from step 1.

The Rust command set_onboarding_done now accepts an optional boolean instead of always writing the marker, so callers can also clear it.

Reset Tutorial — Actually Resets Now

This was a quiet bug for several releases. The Reset tutorial link in Settings > Agent Permissions called setTutorialCompleted(), which unconditionally sets tutorialCompleted: true. Clicking it on a fresh install silently skipped the agent-mode tour. Clicking it after seeing the tour did nothing at all.

v2.4.0 adds a dedicated resetTutorial() store action that flips the flag back to false, and rewires the button. Verified live: click Reset, create a new chat, click the Agent toggle — the “Welcome to Agent Mode” tutorial renders again. A regression test in stores.test.ts guards against the next regression.

Linux Window Drag Fix

On Ubuntu 24.04, dragging the LU title bar threw an unhandled Promise rejection:

window.start_dragging not allowed.
Permissions associated with this command: core:window:allow-start-dragging

The window stayed anchored. Keyboard tiling (Super+arrows) still worked, so the bug only bit users who actually dragged windows around. Reported on Discord by diimmortalis with a clean Promise-rejection dump.

The fix was one line in src-tauri/capabilities/default.jsoncore:window:allow-start-dragging was missing from the capability list. Added.

Discover — No More Duplicate Path Display

Cosmetic but jarring: the Discover tab showed the HuggingFace download path twice. Once in the section subtitle (“Download GGUF models from HuggingFace. Saves to: ...”) and again in a paragraph below the download grid (“Downloads save to: ...”). v2.4.0 removes the second one.

HuggingFace Search Filename Fix

This one is a pre-existing bug that surfaced while end-to-end testing the new Model Storage feature. Searching the Discover tab for tinyllama Q4 returned repos like hieupt/TinyLlama-1.1B-Chat-v1.0-Q4_K_M-GGUF. The client guessed the inner GGUF filename by appending -Q4_K_M.gguf to the repo’s base name. For repos that already ended in a quant tag, that produced doubled tags — ...-Q4_K_M-Q4_K_M.gguf — which 404 every time on HuggingFace.

v2.4.0 extracts the heuristic into deriveQ4FilenameFromRepo(), adds a case-insensitive quant-suffix detector (matching Q4_K_M, Q5_K_M, IQ2_XXS, UD-IQ, BF16, FP16 and friends), and collapses the doubled tag. Nine regression tests in discover-hf-filename.test.ts cover the edge cases.

Tests & Verification

Test suite went from 2205 to 2216 (+11 regression tests). cargo check clean. tsc --noEmit clean.

Live end-to-end on the installed v2.4.0 build:

Download

v2.4.0 is on GitHub Releases. Installers for Windows (.exe, .msi) and Linux (.deb, .rpm, .AppImage) — the auto-update channel is signed against a public minisign key. Auto-update picks the new build up on next launch for anyone on v2.3.x.

Related


Locally Uncensored v2.4.0. AGPL-3.0 licensed. Built by PurpleDoubleD. Bug reports and feature requests on GitHub Discussions or in the Discord.

Eight fixes, configurable HuggingFace path, in-app Privacy section

Download v2.4.0