We're releasing support for Qwen-Image-2.1, custom Agent Skills, and easier chat/project management. It also brings 2x faster reasoning blocks (60 FPS vs 30 FPS), more reliable training, and improved Linux installs and updates. Qwen Image 2.1 Guide
Highlights
- Qwen-Image-2.1 support for image generation and more
- Add custom skills to guide models through specific tasks.
- 2x faster long reasoning blocks (60 FPS vs 30 FPS before)
- In-app Debian updates and an Ubuntu 24.04+ installer for ARM64.
- Chats are now fully draggable in sidebar (web UI + Linux desktop app for now, full support coming very soon). Thinking UI/UX reworked.
- Projects are easier to edit and organize.
- In-app Debian updates and an Ubuntu 24.04+ installer for ARM64.
Agent Skills
- Add custom skills to guide models through specific tasks.
- Reuse skills from your existing Claude Code and
.agentsfolders. - Manage your skills and use
@to select one in chat.
Chats + projects
- Drag chats to reorder them, pin them or move them into a project.
- Better model loading behavior, chat properly remembers settings
- Thinking UI/UX reworked for cleaner modern experience.
- Edit project names, instructions and folders directly from the Projects page.
- Long code replies stream more smoothly while keeping syntax highlighting.
Models + storage
- Vision models can now see images returned by MCP tools.
- Other accounts can connect to local model servers when the owner allows it.
- Chat can reuse downloaded models instead of fetching a second copy.
- CLI chats preserve loaded models’ precision and use recommended settings.
- See which caches take up disk space and clear them from Settings.
Training + exports
- More reliable training resumes and dataset preparation.
- Model uploads to the Hub leave out files from earlier exports.
- Hugging Face datasets now work in recipes, past training runs can be resumed, resumed runs show the correct remaining time, dataset columns are mapped correctly, and selected splits/subsets are respected.
Desktop + hardware
- Linux/Desktop distribution got substantially better - there are now in-app updates for Debian installs and a native ARM64 Linux .deb.
- New AMD ROCm Docker image with Unsloth Studio and JupyterLab.
- Larger text now has more room, and contrast settings make buttons and menus easier to see.
- Filter logs, wrap long lines and jump to the latest entries without scrolling through everything.
What's Changed
- Bump install.sh / install.ps1 pin to unsloth>=2026.9.7 by @danielhanchen in #11279
- Carry over five temp-scanner fixes that landed after #11217 merged by @danielhanchen in #11280
- fix the Hub README's tag and GPU support claims by @NilayYadav in #11131
- Give the page-fault stall test a window the scheduler cannot close by @danielhanchen in #11284
- Stop three tests stranding a waiting request in a module-level dict by @danielhanchen in #11287
- Assert the companion scan's thread, not how fast the machine is by @danielhanchen in #11288
- studiobench: count the attachments the composer actually renders by @danielhanchen in #11302
- Route today's new PowerShell test calls through the shared runner by @danielhanchen in #11285
- Studio: run one repair at a time, however many times Retry is pressed by @LeoBorcherding in #11249
- Route the last direct pwsh spawns through the shared runner by @danielhanchen in #11303
- Studio: keep a LoRA push private when the Hub repo already exists by @NilayYadav in #11229
- Studio: preserve Claude Code prompt cache with custom output styles by @Imagineer99 in #11121
- Disengage FBCache on the word of whoever owns it by @danielhanchen in #11304
- Studio: preserve partial state for canceled GGUF companions by @Etherll in #11018
- Studio: restore an exported chat backup as separate chats by @NilayYadav in #11231
- Studio: fetch a remote image URL instead of forwarding it to llama-server by @oobabooga in #11160
- Studio: tell the model which tool calls were skipped by the per turn limit by @NilayYadav in #11154
- fix(desktop): explain updates blocked by an existing Studio server by @Imagineer99 in #11273
- Desktop: support SQF script attachments by @Imagineer99 in #11274
- Studio: preserve local model inventory after cache filesystem errors by @Imagineer99 in #11272
- Studio: train a gated upstream model through its public Unsloth copy by @oobabooga in #11214
- Stop one test's app settings answering another test's read by @danielhanchen in #11309
- Make the WSL compiler-intermediate control say why it failed by @danielhanchen in #11312
- Studio: let models see images returned by MCP tools by @NilayYadav in #10088
- Studio: trim the composer "+" menu top level by @shimmyshimmer in #11314
- Studio: optically centre the model selector label by @shimmyshimmer in #11316
- Put back the Docker quickstart paragraph the README lost by @danielhanchen in #11317
- Re-approve three unsloth-zoo exec sites, pinned, and say which reviews are which by @danielhanchen in #11318
- Serve the decoded pixels on a multi-image turn, not the base64 they arrived as by @danielhanchen in #11320
- Clear the idle-reload stash between tests by @danielhanchen in #11322
- Desktop clean machine: pick the x64 installer, and stop blaming the .deb for the mirror by @danielhanchen in #11323
- Acknowledge the Colab oracle drift, and stop the diff hiding entries by @danielhanchen in #11324
- Give the torchcodec placeholder a real spec by @danielhanchen in #11325
- Strip distro .devN markers from the Colab pins by @danielhanchen in #11326
- Give the CUDA spoof the raw-stream handle unsloth reads at import by @danielhanchen in #11328
- Studio: report a backend that is provably gone without sleeping out the retry ladder by @danielhanchen in #11213
- Name an AMD device node this account cannot open, instead of reading it as no GPU by @danielhanchen in #10473
- Studio: keep a connected pin that could not be written by @shimmyshimmer in #11269
- Studio setup: reuse the uv a previous run installed instead of downloading it again by @danielhanchen in #10659
- Point the interrupt legs at the phase label the installer prints by @danielhanchen in #11342
- Studio: tidy run settings controls and settings page titles by @shimmyshimmer in #11331
- Cancel superseded pull request runs, and guard that they stay cancelled by @danielhanchen in #11345
- Format the superseded-runs guard the way the hook does by @danielhanchen in #11348
- Studio: tidy the run settings panel by @shimmyshimmer in #11346
- Studio: let recipes with a Hugging Face dataset run by @NilayYadav in #11300
- Studio: bring back the Resume button for past training runs by @NilayYadav in #11301
- Studio: map context, question and answer columns to the right roles by @NilayYadav in #11292
- Studio: show the right time left after resuming training by @NilayYadav in #11297
- Say which locale catalog failed instead of dying in an eval by @danielhanchen in #11344
- Studio: push only the exported files to the Hugging Face Hub by @NilayYadav in #11299
- Retry a browser driver once before failing the leg by @danielhanchen in #11355
- Take the Linux subdirectory-watch race out of the compiler watcher test by @danielhanchen in #11362
- Docker ROCm image: reach the GPU through WSL2's DXG bridge, not only /dev/kfd by @LeoBorcherding in #11212
- Studio: turn on Code when Full access is picked by @oobabooga in #11283
- Studio: chat with a cached upstream model instead of downloading its Unsloth copy by @oobabooga in #11307
- studio: add in-app updates for debian installs by @mahiatlinux in #11338
- Let the uv-safe requirements test pass where 8.3 names exist by @danielhanchen in #11365
- studio: protect authenticated release redirects by @mahiatlinux in #11339
- Studio: give a project one home in the sidebar, and fix the row menus around it by @shimmyshimmer in #11370
- Studio: reopen dismissed Deep Research plan dialogs by @AzizMuminov in #10802
- desktop: publish a native arm64 linux deb by @mahiatlinux in #11356
- Studio: export and save only the reply you are looking at by @NilayYadav in #11298
- fix(studio): track Marked's def rule in the link definition probe by @HughScott2002 in #9645
- Studio: skip duplicate weight files when downloading a model from the Hub by @NilayYadav in #11227
- Docker ROCm image: ship Unsloth Studio, as the CUDA image already does by @LeoBorcherding in #11218
- Keep the regenerable caches inside the Studio root by @danielhanchen in #10597
- Studio: show Vulkan iGPU memory as shared availability by @oobabooga in #11305
- Studio: put the sidebar nav validator signature on the line the formatter wants by @danielhanchen in #11374
- Studio: drop rows the chat template can't format and tell the user by @NilayYadav in #11293
- Let the pinned formatter have the line it wants in settings.py by @danielhanchen in #11371
- Give the desktop release tests an explicit utf-8 encoding by @danielhanchen in #11372
- Correct why a superseded probe matrix is expensive: slots, not minutes by @danielhanchen in #11347
- Say when a failing pull_request job is testing a stale merge ref by @danielhanchen in #11386
- Read the routing invariance counters as a steady state, not one request by @danielhanchen in #11389
- Hold the diffusion load worker on an event instead of a sleep by @danielhanchen in #11392
- Studio: drag sidebar rows into place, and make a project row do more by @shimmyshimmer in #11373
- Studio: use only the chosen split and subset for Hugging Face recipe data by @NilayYadav in #11294
- Count a unified-memory APU's window as shared host memory, not dedicated VRAM by @danielhanchen in #11366
- Studio: use copy-01 for every copy button by @shimmyshimmer in #11395
- Studio: treat bash
coprocas a command boundary in the terminal safety scanners by @danielhanchen in #11369 - Drain worker threads without racing their start by @danielhanchen in #11400
- Studio: read the local model cache locally, and keep host paths off the API by @danielhanchen in #11026
- fix(studio): run built-in text search as a tiered engine allowlist by @alkinun in #11242
- Give a mixed NVIDIA plus AMD host a way to ask for the ROCm torch stack by @danielhanchen in #10474
- Click the reasoning trigger by slot, not by its wording by @danielhanchen in #11406
- Studio: use one expand icon and one download icon everywhere by @shimmyshimmer in #11411
- Studio: one white and one grey for dark mode thread text by @shimmyshimmer in #11410
- Studio: round the right corners of scrollable tool result and thinking panes by @shimmyshimmer in #11409
- Studio: rename the edit composer's Update button to Send, and resend an unchanged prompt by @shimmyshimmer in #11407
- Studio: answer a recipe check the backend cannot read the seed for by @danielhanchen in #11363
- Repair the two frontend CI breaks main inherited from #11373 by @danielhanchen in #11416
- Studio: bind the Data Recipe export link to the account that minted it by @danielhanchen in #11401
- Windows installer: stop an unresolvable 8.3 alias aborting the rollback by @umran666 in #11319
- Studio: make the rule closing a thinking trace readable by @shimmyshimmer in #11424
- Studio: one rounded outline on the guided tour card by @shimmyshimmer in #11421
- Studio: brighten tool rows on hover, like the Thinking trigger by @shimmyshimmer in #11422
- Studio: use the scroll icon for Agent Skills everywhere by @shimmyshimmer in #11419
- Studio: say what auto-compaction actually does by @shimmyshimmer in #11415
- Studio: put a working chat row's spinner back on the trailing column, and tighten the pin gap by @shimmyshimmer in #11408
- Studio: icon-only Copy and Download in the transcript, with tooltips by @shimmyshimmer in #11425
- Use one speech bubble for a chat everywhere by @shimmyshimmer in #11428
- Studio: call the product Unsloth in the app's own copy by @shimmyshimmer in #11427
- Scale the settings hint icon with the UI font size by @shimmyshimmer in #11429
- Studio: fall back to the Vulkan sd.cpp build when the ROCm one cannot run by @danielhanchen in #11068
- Read only the selector shapes the sheet test can prove, and refuse the rest by @danielhanchen in #11089
- Make the GRPO canary run through Unsloth's own batch sampler by @danielhanchen in #11126
- Studio: call it Skills, and lowercase files in Chat with files by @shimmyshimmer in #11426
- Stop the barrel guard counting package imports as a way back in by @shimmyshimmer in #11431
- Reject a new studio union offender even when the recorded count is unchanged by @danielhanchen in #9856
- Derive the chat UI wall-clock watchdog from the turn timeout by @danielhanchen in #9025
- Studio: scope the GGUF converter pin to the conversion by @danielhanchen in #11417
- Studio auth and bootstrap gates: throttle desktop-login, narrow the tunnel CORS origin, identify Colab's proxy by @danielhanchen in #11398
- fix(studio): widen the link reference probe to match the definition probe by @danielhanchen in #11375
- remove gguf shard controls introduced by #6107 by @mahiatlinux in #11315
- Fail Source lint on a duplicate TypeScript import binding by @danielhanchen in #8548
- A failed presence check in the indicator driver should say what the page looked like by @danielhanchen in #10435
- Studio: the drag-and-drop switches go, the gesture has one behaviour by @shimmyshimmer in #11441
- Studio: drop the "When context fills" setting and always use the server's policy by @shimmyshimmer in #11444
- Studio: read the saved credential and its presence in one query by @danielhanchen in #11420
- Studio: require a published digest on upstream llama.cpp prebuilts too by @danielhanchen in #11402
- fix(sft): honor max_length below the model context limit by @taking-lying-flat in #11266
- Studio: three-state Thinking and Tool calls visibility in Display by @shimmyshimmer in #11433
- Refuse a compiler cache path shlex cannot parse, not only one with a space by @danielhanchen in #11414
- [perf] Qwen3.5-9B LoRA SFT with unsloth-cli.py on a B200: 0.84 s to 0.77 s per step at 1 GPU, the model-independent half of #10744 by @TarzanZhao in #11238
- Offer FlexAttention when head_dim puts every flash kernel out of reach by @danielhanchen in #11102
- Studio: edit a project from the Projects page, and sort it from the Updated column by @shimmyshimmer in #11443
- Repair four checks that are red on main itself by @danielhanchen in #11456
- studio: preserve standalone gguf settings in compare mode by @mahiatlinux in #11311
- Stop SFTTrainer downcasting configs that subclass SFTConfig by @danielhanchen in #11440
- Point the two compiler-cache fallback tests at a temporary root Windows accepts by @danielhanchen in #11455
- Docker ROCm Studio image: ship JupyterLab with the notebooks, as the CUDA image does by @LeoBorcherding in #11286
- Studio: prefer the discrete AMD GPU when an iGPU enumerates first on Linux by @danielhanchen in #11437
- Studio: let the owner allow managed accounts private provider base URLs by @danielhanchen in #11436
- Studio: keep an AMD dGPU and a Vulkan choice through install and update by @danielhanchen in #11442
- Apply the logit scale on the fused cross entropy path by @vineethsaivs in #11277
- Studio: stop suggesting bnb-4bit models MLX cannot load on Mac by @NilayYadav in #9722
- Read the sidebar and reasoning contracts as claims, not as literals by @danielhanchen in #11404
- Studio: isolate the sandbox traversal test from the real home directory by @danielhanchen in #11471
- Stop four POSIX-only test modules from failing to collect on Windows by @danielhanchen in #11457
- Studio: keep the account confinement tests off the interpreter walk by @danielhanchen in #11488
- Studio: pin the hardware verdict in the two export capability tests that depend on it by @danielhanchen in #11490
- studio: copy full prompts from the api monitor by @mahiatlinux in #11340
- Studio: pin the worker RSS in the two xet ledger tests that stand in for a worker by @danielhanchen in #11492
- Give the GPU summary probe test the AMD helpers its extracted block calls by @danielhanchen in #11472
- Studio: read the 16-bit pixels the way the rest of that test file already does by @danielhanchen in #11493
- Studio: give back the continuation lease when the user stops the preflight by @danielhanchen in #9560
- Studio installers: add --no-rollback, and report a full disk as a full disk by @danielhanchen in #11364
- Studio: spell the owner's sidebar name Unsloth, not unsloth by @shimmyshimmer in #11275
- fix(studio): bundle hf-xet for Desktop large Hub downloads by @Souravrajvi0 in #10849
- Studio: anchor the worker source read on the test file, not the working directory by @danielhanchen in #11495
- Studio: make the contrast slider reach surfaces and controls by @shimmyshimmer in #11459
- Studio: scale spacing with the UI font size by @shimmyshimmer in #11458
- Studio: make the drag preferences test compile, and ask the stricter question by @danielhanchen in #11503
- Stop unsloth chat and unsloth inference ignoring the model's recommended settings by @NilayYadav in #11478
- Studio: keep text visible in the reply when Thinking is off by @NilayYadav in #11481
- Studio: keep a streaming code fence highlighted, and window its spans by @danielhanchen in #11423
- fix(studio): track the repository resolved by the training loader by @Imagineer99 in #11462
- Studio: promote -ts into tensor_split before manual strip by @indrajeetapache in #11334
- studio/frontend: keep shutdown dialog open when server-stop fails by @danielhanchen in #5637
- Repair a quarantined llama.cpp runtime at launch instead of failing at model load by @danielhanchen in #10494
- Stop the installers importing the download stack just to be imported by @danielhanchen in #11446
- Studio: show what the caches cost and let them be cleared by @danielhanchen in #10528
- Stop unsloth chat and unsloth inference reloading a 16-bit model in 4-bit by @NilayYadav in #11477
- Unsloth Studio: make a newly created API key selectable when the clipboard is unavailable by @LeoBorcherding in #11489
- Cut CI queue: scope push triggers, and rebalance Repo tests (CPU) on measured runner time by @danielhanchen in #11504
- Fix the update card clipping its own buttons at the 20px interface size by @danielhanchen in #11510
- Studio: read the scaled lengths and colours the UI contracts were written against by @danielhanchen in #11505
- Keep credentials out of cached directories, and audit the org against the miri cache disclosure by @danielhanchen in #11517
- Stop dividing the GRPO eval loss by the accumulation steps by @vineethsaivs in #11337
- studio: revamp the logs tab by @mahiatlinux in #11508
- Studio: resolve upstream llama.cpp releases, assets and digests without the GitHub API by @danielhanchen in #5886
- Build and publish signed prebuilt CUDA 13 wheels for torch 2.13 and 2.14 by @danielhanchen in #11515
- Let the cache row's path label follow the interface font size by @danielhanchen in #11520
- Give the Docker step harnesses the environment those steps now declare by @danielhanchen in #11521
- Skip TRL's redundant kbit prep for models Unsloth already prepared by @danielhanchen in #11494
- Keep generated RL configs on the reentrant gradient checkpoint path by @danielhanchen in #11519
- Install the import-time Python dependencies before smoke testing a prebuilt wheel by @danielhanchen in #11527
- Do not auto-enable padding-free for a model whose forward cannot take it by @danielhanchen in #11468
- Find a GGUF companion published after the weights on the chat load route by @danielhanchen in #11448
- Report a Linux ROCm APU host-backed pool of zero as measured, not unknown by @danielhanchen in #11451
- Studio: validate the reasoning controls instead of coercing them by @Apoze in #9595
- Studio tool loop: close two gaps in the static screens that gate model-written code by @danielhanchen in #11399
- Fixes to XPU offloading during training by @ChowChowSonic in #9534
- Studio: chat with a full fine-tune in 16-bit instead of a 4-bit copy by @NilayYadav in #11479
- Docker: pass JUPYTER_PORT and the notebook skip options through run.sh by @NilayYadav in #11484
- Let a pre-quant checkpoint be safetensors instead of a pickle by @danielhanchen in #11394
- Rework Studio dark mode onto a single surface and text scale by @shimmyshimmer in #11502
- Let a hosted pre-cast text encoder be safetensors, not only a pickle by @danielhanchen in #11454
- Studio: warn when the disk is running low, and point at the caches by @danielhanchen in #11439
- Add the Qwen-Image-2.1 family, and the Diffusers it needs by default by @danielhanchen in #11405
- Route Qwen-Image-2.1 GGUFs to the sd.cpp engine by @danielhanchen in #11507
- Resolve the auto class for omni checkpoints, and guard embedding lookups by @danielhanchen in #11467
- Studio: stop one audio chat from blocking every other chat by @NilayYadav in #11483
- fix(grpo): autocast with DEVICE_TYPE_TORCH instead of a pinned "cuda" by @li-lizhe in #11461
- Warn when the installed transformers drops a pre-quantized checkpoint's bnb quant state by @danielhanchen in #11450
- Install a prebuilt wheel's declared runtime dependencies before smoke importing it by @danielhanchen in #11536
- Studio: replace reasoning pagination with a continuous transcript by @wasimysaid in #11522
- Keep the compiler on for native architectures loaded with trust_remote_code = True by @danielhanchen in #11516
- Studio: load a 16-bit Continued Pretraining run in 16-bit in Chat by @NilayYadav in #11480
- Load prequantized multimodal checkpoints correctly on transformers 5.4 and 5.5 by @danielhanchen in #11452
- Make main formatter-clean so pre-commit stops rewriting every PR by @danielhanchen in #11540
- Export into a directory the temp-file test owns by @danielhanchen in #11532
- Read the packing blocker's branch by behaviour, not by its spelling by @danielhanchen in #11534
- Make the GPU probe harness name the helper it failed to extract by @danielhanchen in #11538
- Make the thinking trace read as a trace, not as the answer by @shimmyshimmer in #11541
- Load the published Qwen-Image-2.1 INT8 checkpoint, and four more follow-ups by @danielhanchen in #11535
- Studio: take the hosted pre-cast fp8 text encoder by default on Qwen-Image-2.1 by @danielhanchen in #11539
- Pin the Dynamic 2.0 4-bit text encoder for Qwen-Image-2.1's native route by @danielhanchen in #11542
- Avoid 8-bit training optimizer on XPU by @ousamabenyounes in #10213
- Lift the Classic light muted token to clear AA by @shimmyshimmer in #11544
- Fix push_to_hub_merged for full fine-tunes on transformers 5 by @NilayYadav in #11482
- Studio: reuse one database connection per thread for durable chat generation runs by @danielhanchen in #11525
- feat(chat): make agentic turns survive tab-close by @CelesteHeartsong in #10365
- Qwen-Image-2.1 fails every render at 20+ steps: FBCache cannot run on a prefix KV cache by @danielhanchen in #11546
- Unsloth Studio: give the memory planner the companion split on a pipeline image load by @LeoBorcherding in #11548
New Contributors
- @AzizMuminov made their first contribution in #10802
- @taking-lying-flat made their first contribution in #11266
- @TarzanZhao made their first contribution in #11238
- @ChowChowSonic made their first contribution in #9534
Full Changelog: v0.1.811-beta...v0.1.812-beta