Portable Local Studio on Windows: setup, chat, images, speech and voice

This manual sets up Portable Local Studio on a Windows PC. The app runs AI models on your own computer, from a normal folder or a USB drive. At the end, you chat with a local model, make images, transcribe speech and make speech from text. All of it runs in the browser at http://localhost:1420, and all files stay in one folder on a 128 GB drive.

Each step comes from a real installation. Each claim has a tag that tells you how it was checked.

Tested 31 Oct – 1 Nov 2026 · HP Victus 15-fa0xxx · Windows 11 Home 10.0.26300 (64-bit) · Intel Core i5-12450H (8 cores, 12 threads) · 31.7 GB RAM · NVIDIA GeForce RTX 3050 Laptop GPU, 4 GB VRAM, driver 592.82

How to read the tags

1What you get

Portable Local Studio is a free, MIT-licensed app. Its browser interface has four workspaces: chat, images, transcription (speech to text) and voice (text to speech). It uses these open-source engines: llama.cpp for chat, stable-diffusion.cpp for images, whisper.cpp for transcription and Kokoro for voice.

Sections 6–9 cover chat. Section 10 covers images, section 11 transcription, section 12 voice, section 13 a voice loop that uses all three, and section 14 more examples. Section 15 shows how all files stay on the drive.

2Check your PC (2 minutes)

  1. Press Ctrl+Shift+Esc to open Task Manager. Select Performance.
  2. Write down the CPU name, the installed memory and each GPU name. Select a GPU to see its "Dedicated GPU memory". That is the VRAM.
  3. Open Settings → System → About. Make sure that "System type" shows 64-bit operating system, x64-based processor.
  4. Make sure that you have at least 15 GB of free space on the target drive. The test used 8.1 GB for the app, two chat models, one image model, one speech model and one voice model.
ItemRequirementSource
Windows64-bit Windows 10 or Windows 11 on x64. Windows on ARM is not a documented target.FROM CODE README
InternetNecessary for the first setup and for each model download. After setup, the app folder held 4.1 GB without models.TESTED
RAMThe project gives no minimum. A 0.5B or 1.5B model needs much less than 8 GB. Close large programs before you load a model.TESTED on 31.7 GB
GPUNot necessary. An NVIDIA GPU gets the CUDA engines automatically. AMD and Intel GPUs use Vulkan. Without a GPU, the app uses the CPU.NVIDIA TESTED, others FROM CODE
Administrator rightsOnly if the PC does not have the Microsoft Visual C++ x64 runtime. Setup then asks for permission to install it.FROM CODE setup.ps1:213-239
BrowserAny modern browser. The interface is a local web page.TESTED Chrome

3Choose a folder or a USB drive

Install on the internal disk first. When chat works there, copy the full folder to the USB drive. A problem is easier to find on the internal disk, because a slow or faulty drive cannot cause it.

TargetAdvice
Internal diskUse a short path without spaces, for example C:\AI\Portable-Local-Studio.
USB driveUse USB 3.0 or faster. The video says 32 GB is the minimum. 128 GB holds the app (4.6 GB) and many models. A USB SSD loads models faster than a flash drive.
File systemUse NTFS for a Windows-only drive. Use exFAT to share the drive with a Mac or Linux PC. Do not use FAT32: it cannot hold a file larger than about 4 GB, and many models are larger than that.
Warning: Formatting a drive deletes all of its data. Back up the drive first. Before you format, check the drive name and its capacity, not only its letter.

How the test simulated a 128 GB USB drive: The test laptop had no USB drive connected, so we copied the app to C:\AI\usb128. We then ran subst U: C:\AI\usb128 to make that folder appear as drive U:. The app ran only from U:\. This proves that the app works from any drive letter. It does not test USB speed or exFAT. TESTED

Step 4Download and extract the app

  1. Open the project's GitHub page: github.com/techjarves/Portable-Local-Studio (MIT license, by Tech Jarves). The old name in the app's code, github.com/techjarves/Uncensored-AI-Studio, redirects to it. CHECKED
  2. Click the green Code button. Then click Download ZIP.
  3. Right-click the ZIP file. Click Extract All. Extract to your target, for example C:\AI\ or E:\.
  4. Rename Portable-Local-Studio-main to Portable-Local-Studio if you want. This step is optional.
  5. Open the extracted folder. Make sure that it holds windows.bat, linux.sh, mac.sh, app and scripts.
Caution: Do not run windows.bat from inside the ZIP. Windows shows the ZIP like a folder, but setup cannot write into it. Always extract first.
Caution: Do not put one project folder inside another, for example Portable-Local-Studio-main\Portable-Local-Studio-main. Open the folder that holds windows.bat directly.

Step 5Run the first-time setup

Warning: windows.bat force-closes every program that uses port 8080 or port 10086. It does this before setup and again at each launch. Port 8080 is common for other local web and AI tools. Stop those tools yourself before you continue. FROM CODE windows.bat, the two taskkill loops

To see which program uses a port, run this command in PowerShell:

Get-NetTCPConnection -LocalPort 8080,10086 -State Listen -ErrorAction SilentlyContinue | ForEach-Object { Get-Process -Id $_.OwningProcess }

No output means that both ports are free.

To keep all setup files on the drive: start setup from a Command Prompt in the project folder with the two commands in section 19 ("Fix for the npm ENOENT error"), not with a double-click. Otherwise, npm writes its download cache to %LOCALAPPDATA%\npm-cache on drive C:. In the test, the first run used that cache and the second run used the drive. TESTED
  1. Make sure that the PC is online.
  2. Double-click windows.bat. A black terminal window opens.
  3. Read the banner. It says First-Time Setup and gives the reason, for example "Portable Node.js is missing."
  4. Press any key to continue. Press Ctrl+C instead to cancel.
  5. Wait. Setup has 8 steps. On the test laptop, the first run took 16.8 minutes. Your network speed sets most of this time.
  6. If Windows asks for permission to install the Microsoft Visual C++ Redistributable (x64), check that the publisher is Microsoft. Then click Yes. On a work PC, you may need your administrator.
  7. When setup ends, the browser opens at http://localhost:1420.
Setup stepWhat it installs into the app folderResult on the test laptop
1/8Portable Node.js v22.12.0 into app\tools\node-win. Checks the Visual C++ x64 runtime.OK. The runtime was already installed (v14.50). TESTED
2/8Image engines (stable-diffusion.cpp): CPU master-782-b290693; CUDA (NVIDIA only) master-782-b290693 plus CUDA runtime DLLs; Vulkan master-685-19bdfe2.OK, all three. TESTED
3/8Chat engines (llama.cpp b11418): CUDA if NVIDIA, HIP if AMD, SYCL if Intel, then always Vulkan and CPU.OK: CUDA, SYCL, Vulkan, CPU. TESTED
4/8whisper.cpp transcription engine (CPU).OK. TESTED
5/8Kokoro text-to-speech runtime (npm packages into app\tts-runtime).Failed on the first run, then OK after the fix in section 19. TESTED
6/8OpenVINO, only for an Intel Core Ultra NPU.Skipped (no NPU). TESTED
7/8Interface packages (npm) into app\frontend.OK. TESTED
8/8Builds the interface into app\dist.OK. TESTED
Caution: Setup and launch need all of these parts, even if you only want chat. If the Kokoro voice step fails, windows.bat sees "Kokoro text-to-speech runtime is missing" and runs setup again at each launch. You cannot chat until all 8 steps pass. FROM CODE windows.bat, the TTS_RUNTIME check
Checkpoint. The terminal shows a Running banner with the line [backend] Ready. Waiting for model load request from the webapp.... The browser shows the sidebar with New chat, Images, Transcribe, Voice, Models and Settings. The chat page says No model loaded. Setup does not download chat models, so this state is normal. TESTED
Your address can be different. If port 1420 is in use, the launcher tries ports 1421 to 1499. Use the address in the terminal's "Web UI:" line. On the second test launch, port 1420 was still in use and the launcher used http://localhost:1421. TESTED "localhost" means this computer. It is not a website on the internet.
Warning: Keep the terminal window open while you use the app. If you close it, all of the app's services stop.

Step 6Download the starter model (Qwen2.5 Coder 0.5B)

The starter model is small (491,400,064 bytes; the app shows "468.6 MB"). It loads fast and proves that the chat engine works. It is too small to show what local AI can do. Section 9 adds a better model.

  1. In the sidebar, click Models.
  2. Click the Text tab. The default tab is Image, so make sure that you change it.
  3. Under Library → Recommended text models from Hugging Face, find Qwen2.5 Coder 0.5B Instruct Q4_K_M (~491 MB).
  4. Click Download on that card.
  5. Wait until the model shows under On this computer. The download took 11.9 s on the test connection. TESTED (through the app's API, which the button uses)
If the card is not shown: The library list changes when the app's Hugging Face search finishes. In one test, the 0.5B card disappeared from the list. In that case, click + Add model → Download from a link, paste this URL and click Download: TESTED (the same route as in section 9)
https://huggingface.co/Qwen/Qwen2.5-Coder-0.5B-Instruct-GGUF/resolve/main/qwen2.5-coder-0.5b-instruct-q4_k_m.gguf
Models page, Text tab, with the 0.5B starter model under On this computer and the recommended library below
Models → Text. The starter model is downloaded and loaded. The card says "Running on Auto (CUDA/CPU)", so the NVIDIA GPU is in use. The test laptop's real screen.

The model file goes to app\llm-models\. You can also copy a .gguf file into that folder yourself. Text models go in app\llm-models\, and image models go in app\models\. Do not mix them.

Step 7Have your first chat

  1. In the sidebar, click New chat.
  2. Click Select model near the bottom-right corner of the message box.
  3. Click qwen2.5-coder-0.5b-instruct-q4_k_m. Wait until the top bar shows a green dot and the model name. On the test laptop, the model loaded in 1.6–2.1 s.
  4. Make sure that Web is off. Then the chat stays on your PC.
  5. Type this test message and press Enter:
Extract exactly three fields: name, date, amount.
Text: Alice paid $37.50 on 2026-10-31.
Do not add any other information.

Expected answer (TESTED, three times):

Alice, 2026-10-31, $37.50

Compare each field with the message. All three must be correct. This test proves that the chat engine works. It does not prove that the model reasons well.

Chat page with the extraction prompt and the answer Alice, 2026-10-31, $37.50
First chat with the 0.5B starter model: 21 tokens in 419 ms. The sidebar shows "NVIDIA GeForc… 23/32 GB" (RAM in use / total RAM).

If you see the correct answer, the app works on your PC. For a model that writes better answers, go to sections 8 and 9.

Step 8Set the KV cache before you load a second model

The KV cache is the model's working memory for the conversation. The app can store it at three precisions: Q4_0 (smallest), Q8_0 and F16 (largest). In the test, Q4_0 made the Qwen2.5 1.5B model write nonsense. Q8_0 and F16 gave correct answers.

Warning: The app can recommend Q4_0 for your PC. A PC with less than 6 GB of VRAM goes into the low tier, which the app calls "Potato PC". That tier recommends KV q4_0 (serve.cjs:1468). The test laptop has 31.7 GB of RAM and a 4 GB RTX 3050, and the app still called it "Potato PC". Do not select the Potato profile for Qwen2.5 models. TESTED
  1. In the sidebar, click Settings.
  2. Click the Text generation tab.
  3. Under Performance → Profile, click Balanced.
  4. Under KV cache, click Q8_0.
  5. If an "Unsaved text settings" bar appears, save the changes in it.
Settings, Text generation tab, showing the Potato PC recommendation with KV q4_0
The app's own recommendation for the test laptop: "Potato PC … KV q4_0". With Qwen2.5 1.5B, this recommendation gave garbled output.
Settings Performance section with Balanced profile, CUDA backend, GPU layers All and KV cache Q8_0
Settings that worked: Profile Balanced, GPU layers All, KV cache Q8_0 (bottom row).

Step 9Add a better model: Qwen2.5 1.5B Instruct

This model is a general chat model of 1,117,320,736 bytes (the app shows "1.0 GB"). Its answers are better than the 0.5B coder model's answers. It is not in the app's library, so you download it from a link.

  1. Click Models. Click the Text tab.
  2. Click + Add model at the top-right corner.
  3. Select Download from a link.
  4. Paste this URL into the box:
https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-GGUF/resolve/main/qwen2.5-1.5b-instruct-q4_k_m.gguf
  1. Click Download. On the test connection, the download ran at 69.7 MB/s. TESTED
  2. Wait until On this computer shows 2 models.
Add a text model panel with Download from a link selected and the Qwen 1.5B URL pasted
Models → Text → Add model → Download from a link.
Warning: Unload the current model before you select a different model. In the test, a direct switch from 0.5B to 1.5B failed with "qwen2.5-coder-0.5b-instruct-q4_k_m.gguf" is already loaded as a Text model. Unload it before loading …. The app then fell back to its "safe" settings: CPU only, flash attention off, KV cache Q4_0 (serve.cjs:4272-4293). The model gave garbled text. The app also stored the Q4_0 setting and used it again at the next loads. TESTED
  1. Click New chat.
  2. Click the power icon beside the model name in the top bar. Or open the model menu and click Unload model. The top bar must show No model loaded.
  3. Click Select model. Click qwen2.5-1.5b-instruct-q4_k_m.
  4. Wait for the green dot. Then ask a question, for example "In two sentences, explain what a USB flash drive is."
Model menu open with both models listed and an Unload model option
The model menu lists both models. Use Unload model first, then select the new model.
Chat with the 1.5B model giving a correct two-sentence answer
Correct answer from the 1.5B model: 51 tokens in 1.07 s. The load used all GPU layers, KV cache q8_0 and flash attention on.
If you see garbled text (repeated "2222", "flash flash flash", broken words), the KV cache is Q4_0. Unload the model. Set Settings → Text generation → KV cache → Q8_0. Load the model again. TESTED

Step 10Make images (DreamShaper 8)

The Images workspace uses stable-diffusion.cpp. DreamShaper 8 is a Stable Diffusion 1.5 model of 2,132,625,894 bytes (the app shows "~2.1 GB"). It makes 512×512 images and fits in 4 GB of VRAM. It downloads from Hugging Face without a login.

Download the image model

  1. Click Models. The Image tab opens by default.
  2. Under Library → SD 1.5 — fast, low memory, find DreamShaper 8 (~2.1 GB · 512x512).
  3. Click Download on that card. The dialog "Download "DreamShaper 8" (~2.1 GB)?" opens.
  4. Click Download in the dialog.
  5. Wait until the model shows under On this computer. On the test connection, the download ran at about 57 MB/s and took about 40 s. TESTED
Models page, Image tab, with the Download Model dialog for DreamShaper 8
Models → Image → DreamShaper 8 → Download. The file goes to app\models\DreamShaper_8_pruned.safetensors.
Caution: On the 4 GB test laptop, the library put the "Fits your PC" mark on the two SDXL models (6.9 GB and 7.1 GB, 1024×1024). The SD 1.5 models had no mark. The test did not run SDXL. Start with an SD 1.5 model on a GPU with 4 GB of VRAM. TESTED (the marks only)

Make your first image: a product illustration

  1. In the sidebar, click Images.
  2. Click Select model at the bottom-right corner. Click DreamShaper_8_pruned.
  3. If a chat model is loaded, the dialog "Unload the chat model?" opens. Click Unload and load.
  4. Wait until the top bar shows a green dot, Image and DreamShaper_8_pruned.
  5. Make sure that the bar under the prompt shows 512×512 and 20 steps. The app set these values when the model loaded. Before the load, it showed 1024×1024 and 4 steps. TESTED
  6. Click More. Make sure that CFG scale is 7. Type this in Negative prompt (what the image must not show):
blurry, low quality, text, watermark, deformed
  1. Press Esc to close More. Type this prompt in the prompt box:
product illustration of a matte black reusable water bottle on a light wooden table, soft studio lighting, clean background, high detail
  1. Press Enter, or click the arrow button.
  2. Wait for the image. On the test laptop, it took 34.3 s: 27.2 s for the 20 steps (about 1 s per step after a 7.9 s first step) and 4.6 s to decode the image. TESTED
Why the chat model unloads: The app runs only one large model at a time. The dialog says: "Only one large model can run at a time". DreamShaper 8 used 2,035 MB of VRAM (text encoder 235 MB, diffusion model 1,640 MB, VAE 160 MB) on the CUDA engine. TESTED (from the engine log)
Unload the chat model dialog on the Images page
The dialog that opens when a chat model is loaded. Click Unload and load.
Images page with a generated matte black water bottle on a wooden table
Result: 512×512 · 20 steps · seed 771147 · 34.3 s. The buttons under the image are Download, Copy, Reuse prompt, Use as base and Delete.

The app saves each image as a PNG file and a JSON file with the prompt, seed, steps and size in app\outputs\. The test image was 381,033 bytes. To make the same image again, use the same prompt, model, size, steps and seed. TESTED (files)

Prompt tips for SD 1.5 models. Write the subject first, then the place, the light and the style. Use commas between the parts. Put unwanted things in the negative prompt. Keep the size near 512 pixels on each side: SD 1.5 models were trained at 512×512, and much larger sizes can repeat the subject. To change one detail, click Reuse prompt, edit the prompt and generate again.

Step 11Transcribe speech to text (Whisper)

The Transcribe workspace uses whisper.cpp on the CPU. It changes a recording into text. Whisper Base English is 147,964,211 bytes (the app shows "142 MB").

Download the speech model

  1. Click Models. Click the Speech tab.
  2. Find Whisper Base English (142 MB · Whisper.cpp). Click Download.
  3. In the dialog "Download "Whisper Base English" (142 MB)?", click Download.
  4. Wait until the model shows under On this computer. The file goes to app\speech-models\ggml-base.en.bin. TESTED
Caution: In the test, the Speech tab once showed the Kokoro voice list after a voice install. If the Speech tab shows Kokoro models, click another tab, then click Speech again. TESTED

Transcribe a voice memo

  1. In the sidebar, click Transcribe. Make sure that the top-right menu shows Whisper Base English.
  2. Click Upload audio. Select an audio file on the drive. The app accepts WAV, MP3, M4A, OGG, FLAC and WebM. The browser converts the audio to 16 kHz mono before it sends it to the engine.
  3. Click Transcribe beside the file.
  4. Wait for the text under Transcript. Read it and correct it.
  5. Click Copy transcript to copy the text, for example for a chat.

Test file: a 14.4 s voice memo made in the Voice workspace (section 12). The transcription took 9.2 s on the first run, with the engine on 8 CPU threads. An 8.0 s question took 2.0 s. TESTED

Spoken textTranscript
Voice memo for Monday. Call the print shop about the two hundred flyers, they are due on Thursday. Ask Dana for the budget sheet before noon. The team meeting moves to three p.m. on Wednesday.Voice memo for Monday. Call the print shop about the 200 flyers they are due on Thursday. Ask Dana for the budget sheet before noon. The team meeting moves to 3P. M. on Wednesday.

All of the words were correct. Whisper wrote the numbers as digits ("200", "3P. M.") and removed one comma.

Transcribe page with the voice memo transcript
Transcribe with Whisper Base English. The buttons are Timestamps, Copy transcript, TXT and JSON.

The app saves each transcript as a TXT file and a JSON file in app\transcriptions\. TESTED

Step 12Turn text into speech (Kokoro)

The Voice workspace uses Kokoro 82M on the CPU. It reads text aloud and saves a 24 kHz WAV file.

Install the voice model

  1. Click Models. Click the Voice tab.
  2. Find Kokoro 82M ONNX Q8. Click Download.
  3. The dialog says "Kokoro model files are cached on first generation." Click Install.
Where the files go: The install writes a 424-byte manifest, app\tts-models\kokoro-onnx-q8.json. It also downloads the model (92,361,116 bytes) into app\tts-runtime\node_modules\@huggingface\transformers\.cache. The folder app\tts-cache stayed empty. TESTED The 54 voice files come with the runtime in node_modules\kokoro-js\voices. In Node.js, Kokoro reads them from that folder, not from the internet. FROM CODE kokoro-js\dist\kokoro.cjs

Read a short script aloud

  1. In the sidebar, click Voice. Make sure that the top-right menu shows Kokoro 82M ONNX Q8.
  2. Type the text in the box at the bottom. The limit is 5,000 characters.
  3. Click the voice button (default Heart). Select a voice.
  4. Click the speed button (default 1×) if you want a different speed.
  5. Click Speak, or press Enter.
  6. Wait for the clip. It plays automatically and marks each word as it plays.

Test text:

Voice memo for Monday. Call the print shop about the two hundred flyers, they are due on Thursday. Ask Dana for the budget sheet before noon. The team meeting moves to three p.m. on Wednesday.

Result: a 14.4 s clip (690,524 bytes). The first Speak took about 14 s from the click to the saved file. TESTED

Voice page with the memo clip, word highlighting and the audio player
Voice with Kokoro 82M ONNX Q8 and the Heart voice. The clip list has Copy text, Download WAV and Delete clip.
Voices in the appAccent
Heart, Bella, Nicole, Sarah (female); Michael, Fenrir (male)American English (en-us)
Emma (female); George (male)British English (en-gb)

The app saves each clip as a WAV file and a JSON file with the text, voice and timing in app\tts-outputs\. TESTED

Write times as "3 PM", not "three p.m.". The app cut "three p.m." into two parts ("three p." and "m. on Wednesday"), because it splits the text at each period. TESTED The microphone button in the Voice box (Dictate) types your speech into the box. NOT TESTED

Step 13A "Jarvis" loop: ask by voice, hear the answer

The app has no automatic voice-assistant mode. The chat page only has shortcut buttons to the other workspaces (TextChat.jsx:917-918). You connect the three workspaces yourself with copy and paste. The chat model, Whisper and Kokoro can run at the same time: Whisper and Kokoro use the CPU, and only the chat model uses the GPU. TESTED

  1. Load the chat model (section 9). Keep the KV cache at Q8_0.
  2. Click Transcribe. Record your question, or upload an audio file with the question.
  3. Click Transcribe. Click Copy transcript.
  4. Click New chat. Paste the question with Ctrl+V. Press Enter.
  5. Select the answer text. Press Ctrl+C.
  6. Click Voice. Paste the answer. Press Enter. The answer plays aloud.
HopTest result
1. Question audio8.0 s WAV with the George voice: "What are three simple ways to make a laptop battery last longer? Answer in two short sentences."
2. TranscribeExact text in 2.0 s
3. Chat (1.5B, Q8_0)"Reduce the brightness of your screen and lower background apps. Turn off or hibernate unnecessary devices when not in use." 28 tokens in 913 ms
4. VoiceWAV of 409,004 bytes with the Heart voice. This clip took about 20 s; the two earlier clips took less. The cause was not checked.

All four hops worked. TESTED The question asked for three ways, and the 1.5B model gave about two. Small models do not always follow counts.

Chat page with the transcribed battery question and the model's two-sentence answer
Hop 3 of the loop: the transcribed question and the answer from qwen2.5-1.5b-instruct-q4_k_m.

Step 14More examples

A wide blog header image

  1. Click Images. Load DreamShaper 8 (section 10).
  2. Click the size button. Select 16:9 · 768×432.
  3. Type this prompt and press Enter:
wide blog header, cozy home office desk with a laptop and a cup of coffee at sunrise, warm light, plants, shallow depth of field, digital painting

Result: 768×432 · 20 steps · 29.0 s · 709,066 bytes. The size menu also has 4:3 (640×480) and 9:16 (432×768). TESTED The second row of sizes (1024×1024 to 1216×684) matches SDXL sizes. The test did not use it.

Images page with a 16:9 home office image and two images in History
16:9 blog header from DreamShaper 8. History on the right holds both test images.

Meeting notes: from a voice memo to a to-do list

  1. Transcribe the memo (section 11). Click Copy transcript.
  2. Load the chat model. If the image model is loaded, the dialog "Unload the image model?" opens. Click Unload and load.
  3. Click New chat. Type the instruction below, paste the transcript after it and press Enter.
Turn this voice memo transcript into a to-do list with one line per task and its deadline. Transcript:

Result in 999 ms (38 tokens): TESTED

Call print shop about flyers due on Thursday by 4PM.
Request budget sheet from Dana before noon.
Move team meeting to 3PM on Wednesday.

Warning: The memo did not say "by 4PM". The 1.5B model added that time. Compare each task and each deadline with the transcript before you use the list.
Chat page with the to-do list made from the voice memo transcript
To-do list from the transcript. Line 1 has a deadline that the memo does not contain.

Compare two voices

  1. Click Voice. Type a short text.
  2. Select Heart (en-us). Click Speak.
  3. Type the same text again. Select George (en-gb). Click Speak.
  4. Click the play button on each clip in the list. Keep the voice that you prefer.

The test made one clip with Heart and one with George, with different texts. Both clips are in app\tts-outputs\, and the voice ID is in each file name (af_heart, bm_george). TESTED

Step 15Keep everything on the 128 GB drive

All parts of the studio fit on a 128 GB drive with a large margin. After all tests in this manual, the project folder held 8,096,075,478 bytes (8.10 GB, 7.54 GiB). A 128 GB drive has about 119.2 GiB of usable space, so about 111.7 GiB stays free. TESTED

Folder (inside the project)ContentsBytes after the tests
app\llm-backendChat engines1,801,611,060
app\llm-models0.5B and 1.5B chat models1,608,720,800
app\modelsDreamShaper 8 image model2,132,625,894
app\backendImage engines1,377,717,831
app\tts-runtimeKokoro runtime, with the 92,361,116-byte voice model in node_modules\@huggingface\transformers\.cache517,052,337
app\toolsPortable Node.js, npm cache309,832,151
app\frontend, app\distInterface176,247,501
app\speech-modelsWhisper Base English147,964,211
app\speech-backendwhisper.cpp engine20,355,072
app\outputs2 images with JSON1,091,391
app\tts-outputs3 voice clips with JSON1,487,248
app\transcriptions2 transcripts (TXT and JSON)4,431

With the free space, you can add, for example, an SDXL Lightning model (6.9–7.1 GB) or a 7B chat model (4.7 GB). Count about 0.4–0.7 MB for each image and about 48 KB for each second of speech.

How we checked for files outside the drive

We recorded the time before the tests in this manual (1 Nov 2026, 07:09). After the tests, we listed each file larger than 100 KB that changed after that time. We searched these folders: %USERPROFILE%\.cache, %LOCALAPPDATA%\npm-cache, %APPDATA%\NVIDIA, %LOCALAPPDATA%\NVIDIA, %TEMP% and Downloads. TESTED

Rules to keep the studio on the drive

  1. Run the first setup with the npm cache on the drive (section 19, "Fix for the npm ENOENT error"). Without it, npm writes to %LOCALAPPDATA%\npm-cache on drive C:.
  2. Use the files that the app already saved: app\outputs, app\tts-outputs and app\transcriptions. The Download, TXT, JSON and Download WAV buttons save a second copy through the browser, normally to C:\Users\<you>\Downloads.
  3. If you use those buttons, set the browser to ask where to save each file. Then select a folder on the drive.
  4. Keep the audio files that you transcribe on the drive. While it works, the app writes a temporary copy of each upload into app\transcriptions.
  5. Use a private (Incognito or InPrivate) browser window for the studio if you want less browser history on the PC. The browser profile is outside the app's control.

Two things outside the app can write to drive C: on a new PC. Setup installs the Visual C++ runtime into Windows if it is missing (setup.ps1:213-239). The GPU driver can keep shader caches in %LOCALAPPDATA%\NVIDIA. Neither holds your models, prompts or outputs.

Step 16Stop, restart and move the app

Stop FROM CODE

  1. Click into the terminal window of windows.bat.
  2. Press Ctrl+C. If Windows asks "Terminate batch job (Y/N)?", type Y and press Enter.
  3. Wait until the window closes or shows a prompt. Then all services are stopped.

Start again

  1. Double-click windows.bat. Setup does not run again if all parts are present.
  2. Open the address from the terminal's "Web UI:" line.
  3. Select a model in the chat. Your earlier chats are listed under Chats in the sidebar.

A full restart of the test install loaded the model in 1.6 s and gave the same correct answer with no new downloads. TESTED

Move the app to a USB drive

  1. Stop the app.
  2. Copy the whole project folder to the drive: engines, runtimes, models, settings and chats. The original ZIP alone does not contain the prepared engines.
  3. Start the copy from the drive. Make sure that an earlier chat is visible and that a new answer works.
  4. Keep the internal copy until the drive copy works.
  5. When you finish a session, stop the app first. Then use Safely Remove Hardware to eject the drive. The app reads models directly from the drive while it runs.
Folder (inside the project)Contents
app\llm-modelsChat models (.gguf)
app\models, app\speech-models, app\tts-modelsImage models, Whisper models, Kokoro manifests
app\outputs, app\transcriptions, app\tts-outputsYour images, transcripts and voice clips
app\chat-historySaved chats
app\llm-backend, app\backend, app\speech-backend, app\tts-runtimeEngines (3.2 GB of the 4.6 GB on the test laptop)
app\tools, app\dist, app\configPortable Node.js, the built interface, settings

Step 17Do an offline test NOT TESTED

A model that works while you are online does not prove that the next offline launch works. Do this test before you travel or depend on the app.

  1. While you are online, download every model that you will need: chat, image, Whisper and Kokoro.
  2. Stop the app with Ctrl+C.
  3. Disconnect Wi-Fi, Ethernet and phone tethering.
  4. Double-click windows.bat. At each launch, it checks for a llama.cpp update. Offline, it shows "[WARN] Could not update the llama.cpp backend (offline?)" and continues (update-llama.ps1:31-32). FROM CODE
  5. Load a model in a new chat. Send the test message from section 7.
  6. Pass: you get a new, correct answer. An old chat in the history does not count.
  7. Make one new image, one transcript and one voice clip in the same way.

18. AMD, Intel and CPU-only PCs

Setup detects the GPU vendor and installs the matching chat engine (setup-llama.ps1:190-236). It always installs the Vulkan and CPU engines too. In Settings → Text generation → Text backend, you can select any installed engine.

PCChat engineWhat to expectStatus
NVIDIA GPUCUDA (cuda-12.4 build)4 GB RTX 3050: 0.5B at 139–180 tokens/s, 1.5B at 82–97 tokens/s.TESTED
AMD RadeonHIP if detected, else VulkanUses the GPU through Vulkan. Speed depends on the card.FROM CODE
Intel Arc or Intel integrated graphicsSYCL and VulkanOn the test laptop, Vulkan selected the Intel UHD Graphics before the NVIDIA GPU. If you have two GPUs, select the backend yourself.TESTED (detection only)
No GPUCPUSlower. On the test CPU (i5-12450H) with no GPU layers, the 1.5B model wrote 10–16 tokens/s. Those runs used the bad Q4_0 cache, so the speed is approximate.TESTED (speed only)

A CPU-only PC or a PC with a small GPU also goes into the "Potato" tier. Set the KV cache to Q8_0 as in section 8.

19. Windows gotchas and fixes

When something fails, read the terminal window first. The line before "server crashed" usually names the cause.

SymptomCauseFix
Setup stops at [5/8] Kokoro with npm ERR! code ENOENT and a path in AppData\Local\npm-cache TESTEDA damaged entry in the PC's shared npm cache. The app did not cause it. Setup uses that cache, which is outside the app folder.Open a terminal in the project folder (see below) and run setup with a cache inside the app folder. This also keeps setup files on the drive.
Chat answers are garbled TESTEDKV cache Q4_0 (Potato profile, or the fallback after a failed model switch).Unload. Set KV cache to Q8_0. Load again. Always unload before you change models.
"… is already loaded as a Text model. Unload it before loading …" TESTEDYou selected a second model while the first one was loaded.Unload the first model, then select the second one.
Another local tool stops when the studio starts FROM CODEwindows.bat force-closes the programs on ports 8080 and 10086.Stop the other tool first, or run it on a different port. To move the studio's chat port, run set LLM_PORT=10087 before windows.bat in the same terminal. Port 8080 is fixed in the script.
The browser opens the wrong page, or no page TESTEDPort 1420 was in use, so the app moved to 1421–1499.Use the "Web UI:" address in the terminal.
No browser tab opens, and the terminal shows timeout: invalid time interval '/t' TESTEDA non-Windows timeout.exe (for example C:\Program Files\Git\usr\bin) comes before C:\Windows\System32 in PATH. A normal Windows PATH does not have this problem.Open the "Web UI:" address yourself. The app runs normally.
The terminal opens and closes at onceAn error ends the script before you can read it.Open PowerShell in the project folder. Run .\windows.bat. The error then stays on the screen.
Exit code 3221225781 (0xC0000135) FROM CODEA DLL that an engine needs is missing.NVIDIA: update the NVIDIA driver. AMD/Intel: install the Microsoft Visual C++ Redistributable x64. Restart Windows. Run setup again. Do not download DLLs from random websites.
Exit code 3221225501 (0xC000001D) FROM CODEAn old engine build uses CPU instructions that your CPU does not have.Run setup again (repair command below) to get the current builds.
Windows SmartScreen or antivirus blocks a file NOT TESTEDThe file came from the internet.Check where the file came from and what it is. Allow only that file. Do not switch off your antivirus. Do not change the PowerShell execution policy for the whole system. The launcher already sets it for its own process.
The GPU is not usedWrong backend, or GPU layers set to 0.Check Models → Text. The card must say "Running on Auto (CUDA/CPU)" or a Vulkan backend. Set GPU layers to All. On NVIDIA, run nvidia-smi and look for llama-server.exe in the process list.
Another device on your network cannot open the studioBy design, the app answers only on 127.0.0.1 (serve.cjs:7707), and it has no login.Leave this default. If you run set UAIS_HOST=0.0.0.0, any person on that network can use your studio.

Fix for the npm ENOENT error

  1. Open the project folder in File Explorer.
  2. Click the address bar. Type cmd and press Enter. A Command Prompt opens in that folder.
  3. Run these two commands:
set npm_config_cache=%CD%\app\tools\npm-cache
windows.bat

Setup skips the parts that are already done. On the test laptop, this second run took 0.3 minutes and ended with exit code 0. TESTED

20. Repair and advanced route

Use these PowerShell commands to repair a broken install or to test the app without the browser. Run them in the project folder while you are online.

Repair the installation

Stop the app first. Then run:

powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\setup\setup.ps1

This is the same setup that windows.bat runs. It keeps your models and chats. TESTED The project also has scripts\reset\reset.ps1, which removes caches. Make a backup of the whole folder before you use it. FROM CODE

Test chat without the browser

Start the app with windows.bat. Then run this in a second PowerShell window. Change 1420 if the terminal shows a different port.

$base = "http://127.0.0.1:1420"
Invoke-RestMethod "$base/api/llm/status" | Select-Object ready, backendMode
Invoke-RestMethod -Method Post "$base/api/llm/stop"
$load = @{ model = "qwen2.5-1.5b-instruct-q4_k_m.gguf"; cacheTypeK = "q8_0"; cacheTypeV = "q8_0" } | ConvertTo-Json
Invoke-RestMethod -Method Post "$base/api/llm/start" -ContentType "application/json" -Body $load | Select-Object ok, ready
$msg = @{ stream = $false; temperature = 0; max_tokens = 60; messages = @(@{ role = "user"; content = "Extract exactly three fields: name, date, amount. Text: Alice paid `$37.50 on 2026-10-31. Do not add any other information." }) } | ConvertTo-Json -Depth 4
(Invoke-RestMethod -Method Post "$base/api/llm/chat" -ContentType "application/json" -Body $msg).choices[0].message.content

Expected output: the three fields Name: Alice, Date: 2026-10-31 and Amount: $37.50. The 1.5B model can add a short heading or a list, so the format can be different. TESTED (these exact commands)

21. Measured results on the test laptop

MeasurementValue
First setup (online)16.8 min, then failed at Kokoro (npm cache). Second run: 0.3 min, exit 0.
Disk use after setup and the 0.5B model4.60 GB (4.29 GiB): llm-backend 1.8 GB, backend 1.38 GB, llm-models 0.49 GB, tts-runtime 0.42 GB, tools 0.31 GB, frontend 0.17 GB
Disk use with both modelsAbout 5.7 GB of a 128 GB drive (about 119.2 GiB usable)
Model downloads0.5B: 11.9 s. 1.5B: at 69.7 MB/s.
Model load time1.6–2.2 s from the internal SSD; 4.3 s once after a launch through windows.bat
0.5B speed (CUDA, KV q8_0)138.7–180.5 tokens/s output; 444–2,282 tokens/s prompt reading
1.5B speed (CUDA, KV q8_0 or f16)82.4–96.3 tokens/s output
1.5B with KV q4_0Garbled output with all of these: CUDA with all layers, CUDA with 0 layers, CPU engine
Disk use after all tests8,096,075,478 bytes (8.10 GB, 7.54 GiB) for the app, 2 chat models, DreamShaper 8, Whisper Base English, Kokoro Q8 and the test outputs
Image (DreamShaper 8, CUDA)512×512, 20 steps: 34.3 s. 768×432, 20 steps: 29.0 s. About 1 s per step. 2,035 MB VRAM.
Transcription (Whisper Base English, CPU, 8 threads)14.4 s memo in 9.2 s (first run); 8.0 s question in 2.0 s. All words correct.
Voice (Kokoro 82M Q8, CPU)14.4 s clip about 14 s after the first click
Extraction testPass with the 0.5B model (q8_0) and with the 1.5B model (q8_0 and f16)

The 0.5B model also wrote that a USB drive works "without physically inserting it into the computer". That is wrong. Small models make factual mistakes, so check their answers.

22. What this test did not cover

23. Versions and code references

PartVersion or location
llama.cpp (chat)b11418 (scripts\config\llm-backends.json)
stable-diffusion.cpp (images)CPU and CUDA master-782-b290693; Vulkan master-685-19bdfe2 (setup.ps1:345,503)
Node.jsv22.12.0 portable (setup.ps1:276)
Port killswindows.bat: taskkill on :8080 and :%LLM_PORT% (default 10086), at setup and at launch
Frontend port fallbackwindows.bat :resolve_frontend_port, 1421–1499
NVIDIA detectionsetup.ps1:324-336, setup-llama.ps1:190-207
Visual C++ runtime install (admin prompt)setup.ps1:213-239
Potato tier with KV q4_0serve.cjs:1463-1476
"Safe" fallback load profile (CPU, flash attention off, q4_0)serve.cjs:4272-4293 (buildLlmLoadProfiles)
Local-only bindingserve.cjs:7707 (interface), serve.cjs:4565 (llama-server)
Workspace routes (#/images, #/transcribe, #/voice)App.jsx:15-22
Image model libraryModelManager.jsx:119-188
Whisper and Kokoro catalogs, voicesserve.cjs:171-215
Kokoro voices read from the local voices folder in Node.jstts-runtime\node_modules\kokoro-js\dist\kokoro.cjs
Kokoro cache setting (in the test, the model went to tts-runtime\node_modules\@huggingface\transformers\.cache, and app\tts-cache stayed empty)tts-kokoro-worker.mjs:83-84, serve.cjs:2511
English-only Whisper messageSpeechTranscriber.jsx:407
Offline launch with update checkupdate-llama.ps1:31-32