← Back to GhostBundle

💬 Ghost Chat

Local-first LLM chat – search below to find what you need
🔍
🚀 Start
System requirements
This app requires 64-bit Windows (x64 or ARM64). It will not run on 32-bit Windows.
Why: the local LLM engine (LLamaSharp) only ships 64-bit native libraries. A 32-bit process cannot load them, and even if it could, a 32-bit process is limited to ~2 GB of memory — far too little to hold a language model.
The exe is named GhostChat64.exe as a reminder. If you try to run it on 32-bit Windows, it shows a short message and exits cleanly instead of failing midway through model load.
🚀 Start
First-time Setup
On the very first launch, the app has no model to load. Here's the two-step setup:
  1. Download a .gguf language model file (see Where to get a model below).
  2. Drop it into the model folder next to GhostChat64.exe — or use Settings → Model → Open model folder to jump there.
Restart the app. It scans the folder, finds your model, and asks you to pick one. Tick Set as default and it will auto-load next time.
Optional — vision models: if the model has a matching .mmproj file, drop that in the same folder next to the .gguf. The app pairs them automatically and enables the 📎 Attach Image button for that model. See Attach an image below.
🚀 Start
Where to get a model
Any .gguf file from these public sources will work:
Hugging Face
huggingface.co/models?library=gguf
The largest collection. Filter by library: gguf and search for a model size that fits your RAM.
TheBloke (archived, still useful)
huggingface.co/TheBloke
Thousands of pre-quantised models. Even though TheBloke stopped publishing in 2023, the archive is a goldmine for older families.
bartowski
huggingface.co/bartowski
The current go-to for fresh quantisations of new releases.
LM Studio's model browser
lmstudio.ai
GUI browser. Downloads land in LM Studio's own folder — copy the .gguf across to ours.
Ollama library
ollama.com/library
Ollama stores models in its own format. Not directly usable — but the "gguf" tags on Hugging Face match.
Want vision (image understanding)? Look for files named mmproj-*.gguf in the same Hugging Face repo as the main model. Download both the main .gguf and the matching .mmproj, and drop them in model\ together. The app pairs them by filename prefix.
🚀 Start
Which file types work
The app only loads GGUF files for the language model, plus an optional mmproj GGUF for vision.
ExtensionWorks?Notes
.gguf ✅ Yes The only format the app reads. Can be a single file or split into -00001-of-00003.gguf parts — the app picks the first part automatically.
.mmproj / *.mmproj.gguf ✅ Yes Vision encoder. Enables the 📎 Attach Image feature. Must share a filename prefix with the main model. See Attach an image below.
.ggml ❌ No Legacy format. Superseded by GGUF around 2023. If you have an old .ggml, convert it or find the GGUF equivalent.
.safetensors ❌ No Original Hugging Face weight format. Needs conversion to GGUF before this app can use it.
.bin / .pt / .pth ❌ No PyTorch checkpoints. Also need conversion.
.onnx ❌ No A different runtime entirely.
Ollama blobs ❌ No Ollama stores files with hash names inside ~/.ollama/models/blobs. Not readable by this app.
Quick test: if the filename ends in .gguf (including .mmproj.gguf), it will work. If it ends in anything else, it won't.
🚀 Start
Choosing a model size
GGUF models come in "quantisations" — different compression levels of the same model. Bigger files are smarter but slower and need more RAM. Rule of thumb:
QuantSize vs originalQualityRAM needed
Q4_K_M~30%ExcellentFile size + ~2 GB
Q5_K_M~35%Near-losslessFile size + ~2 GB
Q6_K~42%Almost losslessFile size + ~2 GB
Q8_0~55%Effectively losslessFile size + ~2 GB
Starting recommendation: a 7B–14B parameter model at Q4_K_M. Fits comfortably in 8–16 GB of RAM and runs at a usable speed on CPU.
💬 Chat
Sending messages
Type in the box at the bottom and either click Send or press Ctrl+Enter. Plain Enter inserts a new line so you can write multi-line prompts.
💬 Chat
Stop generation
Click Stop or press Esc while the model is writing. The reply ends gracefully — the partial text is kept.
💬 Chat
Regenerate
Removes the last reply and asks the model to answer the same prompt again. Useful when sampling produces a reply you don't like — different sample, different answer.
💬 Chat
Delete Last
Removes the last user+assistant exchange from history. Use this before Regenerate when you want a completely clean slate.
💬 Chat
Show thinking
Some models (like Ministral 3 Nymphaea) wrap their reasoning in <think>...</think> tags before writing the visible reply. When this is ticked, both the reasoning and the tags are shown. When off, the whole thinking block is hidden.

Toggle it from the checkbox below the input box, or from Settings → Behaviour → Show thinking. The choice is saved and restored on next launch.
💬 Chat
Auto-copy replies
When ticked, every finished reply is automatically placed on the clipboard. Handy when you want to paste the response straight into another app.
💬 Chat
Status bar
The thin line at the very bottom of the window shows live state:
  • Context — used / budget tokens and percentage of history consumed.
  • tok/s — speed of the last reply.
  • History — number of exchanges currently in memory.
  • Preset — current sampling preset (Precise / Balanced / Creative).
  • Format — current prompt-format family (Mistral / Llama 3 / ChatML / Gemma / Alpaca).
  • model.gguf — filename of the loaded model.
  • Net — Internet toggle state (ON / OFF).
  • Vision — whether a vision encoder is loaded (ON / OFF).
🌐 Internet
Internet Access (optional)
Ghost Chat works offline by default. When you need real-world data — today's news, current prices, a specific web page — you can flip on Internet mode for that conversation.

How to toggle: the pill button below the chat input (✔ Internet ON / ✘ Internet OFF), or Settings → Behaviour → Internet access. The state is saved and restored on next launch.

What routes through the internet:
  • Any message containing a URL (https://…) — the page is fetched and its text extracted.
  • Explicit "search for …", "google …", "look up …", "find online …".
  • Questions about weather, prices, stocks, exchange rates, scores, headlines, breaking news.
  • "Latest", "today", "current", "right now" combined with a factual topic (weather, stocks, news, events, etc.).
  • News requests about one or more countries ("news about Australia and Singapore"). Multi-country financial news queries fetch a Google News RSS feed per country.
Trivial or creative prompts ("hi", "write me a story", "tell me a joke", "what is your name") are never routed online, even when the switch is on.
Privacy: while Internet is ON, the text of matching prompts (and any URLs you paste) is sent to DuckDuckGo Lite, Google News RSS, or the page in question. It is not sent to the model provider — everything still runs on your machine — but those third-party services see the query. Turn Internet OFF when you're done.
Best results: ask for one country or one topic at a time. The internet prompt strongly instructs the model to drop its persona and answer factually, so roleplay characters won't bleed into the answer. Multi-country queries are supported but take longer to fetch.
Behind the scenes: the app runs a DuckDuckGo Lite search, fetches Google News RSS per country, or extracts text from a specific URL. The merged result is injected into a factual "override" prompt that bypasses your normal persona. The model then answers strictly from that data.
👁️ Vision
Attach an image
If the loaded model has a paired vision encoder, you can attach a picture and ask about it. Click 📎 Attach Image in the button row under the input box, pick a file, and send a question. If you leave the prompt blank, the app defaults to "Describe this image." so you can just attach and hit Send.

Requirements:
  • Place a matching .mmproj file in the model\ folder, next to the main .gguf. Filenames must share a prefix — e.g. Ministral-3-14B.gguf + Ministral-3-14B.mmproj, or qwen2-vl-7b.gguf + qwen2-vl-7b-mmproj.gguf.
  • Vision encoders are published alongside vision-capable models on Hugging Face — look for files starting with mmproj or containing mmproj in the name.
  • The base model itself must be trained for multimodal input (Ministral, LLaVA, Qwen-VL, InternVL, etc.). Adding an .mmproj to a text-only model does nothing useful.
Supported image formats: .jpg, .jpeg, .png, .bmp.

How to tell if Vision is active: the status bar at the bottom of the window shows Vision:ON or Vision:OFF. If it says OFF, no .mmproj was paired with the currently loaded model — the app logs "No .mmproj file found. Vision disabled." in the chat log when this happens.
If Vision is OFF but you attached an image: the app falls back to the standard text path. Your prompt is still processed normally, but the image itself is ignored. Reload the model (Settings → Model → Reload) after adding the .mmproj to pick it up.
Each image is processed with a fresh context. The app disposes and recreates the model's key-value cache before processing a new image, so the previous image (and its tokens) don't linger. Your chat history is preserved in memory and re-injected into the prompt normally.
Performance: vision inference is slower than text-only — the image has to be encoded through the vision tower before the first token appears. Expect a few seconds of extra latency on CPU for a typical photo.
🎛️ Sampling
Sampling Preset
Controls how the model picks the next word. Three presets under Settings → Behaviour → Sampling Preset:
PresetTemperatureFeel
Precise0.3Factual, low variance, safe. Good for questions.
Balanced0.75Default. Good mix of accuracy and liveliness.
Creative1.0High variance, more inventive. Good for stories and roleplay.
Model behaviour varies: a roleplay-tuned model at Creative will be wildly imaginative. A strict instruct model at Creative may hallucinate. If a model behaves strangely, try lowering the temperature before assuming something is broken.
🎛️ Sampling
Generation Limits
Under Settings → Model → Generation limits… you can tune three numbers:
  • Context size — total token budget for the whole prompt (system prompt + history + reply). Default 8192.
  • Reply reserve — the maximum number of tokens the reply can occupy. Default 2048.
  • Safety buffer — headroom so the prompt never overflows the context. Default 512.
The app trims the oldest exchanges whenever the history pushes past context − reply − buffer.
Important: raising the context above a model's training length hurts, not helps. Ministral 3 was trained at 8192; setting it to 12288 makes the model produce shorter, less coherent replies. If your model behaves oddly, put ContextSize back to 8192 first.
Changes take effect on the next model reload.
🧠 Models
Select Model
Under Settings → Model → Select model… you get a list of every .gguf in the model folder. Pick one to load it. Tick Set as default and it will auto-load next time the app starts.

If a matching .mmproj file is present, the model is marked with a 👁️ Vision label in the list, and Vision is enabled on load.
🧠 Models
Reload current model
Re-reads the currently active model from disk. Use this after changing Generation Limits, after replacing the file on disk with a newer version, or after adding a new .mmproj alongside the model (the mmproj is picked up on reload).
🧠 Models
Prompt Format
Different model families expect different prompt wrappers. The app auto-detects the format by reading metadata inside the GGUF and falls back to filename hints. When it can't tell, it defaults to Mistral.

If a model misbehaves — short replies, echoing the system prompt back, weird role labels — override the format via Settings → Model → Prompt Format:
  • Mistral — [INST]...[/INST] wrapping. Used by Ministral, Mixtral, Mistral Instruct.
  • Llama 3 — <|start_header_id|> headers. Used by Llama 3.x.
  • ChatML — <|im_start|> tags. Used by Qwen, Phi-3, DeepSeek.
  • Gemma — <start_of_turn>. Used by Gemma 2.
  • Alpaca — ### Instruction: style. Older fine-tunes.
Your choice is remembered per model. Reload the model to apply.
🧠 Models
Open model folder
Opens model\ in Explorer. Use this to drop in new .gguf files (and matching .mmproj files), or to see what the app has detected.
⚙️ Settings
Identity — Set AI name / Set your name
Changes the labels shown in the chat log. Purely cosmetic — the model doesn't see these names unless you put them in the system prompt.
⚙️ Settings
Edit System Prompt
The persistent instruction sent to the model at the start of every conversation. Keep it short and factual — long-winded system prompts eat context fast and can confuse smaller models.
Tip: explicitly forbid the model from writing User: / System: lines in its output. This reduces role-label leakage that some models fall into.
⚙️ Settings
Layout — Minimum widths
The chat area and image area are separated by a draggable bar. Under Settings → Layout you set the minimum width each side can be dragged to — this stops the splitter from compressing the Send button or squeezing the image out of view.
⚙️ Settings
Save / Open Session
Under File. Save writes the current conversation to a .json file. Open restores it. Sessions include every user/assistant exchange but not the model itself — reload the same model after opening a session to keep replies consistent.
⚙️ Settings
New Session
Clears the conversation and starts fresh. The model stays loaded — only the history is wiped.
🖼️ Images
Image rotation
The right panel cycles through any images placed in images\. It scans subfolders too, and skips hidden/system files. Supported: .png, .jpg, .jpeg, .bmp, .gif.

Toggle rotation on/off under Settings → Image Display. Set the interval (1–600 seconds) there too.
Note: the image rotation panel is decorative — it displays images to you. To ask the model about an image, use the 📎 Attach Image button instead (see Attach an image above).
🖼️ Images
Choose static image
Pick a single image to display without rotation. Opens a picker list of every image found. Selecting one automatically turns rotation off.
🖼️ Images
Supported image formats
Both the rotating panel and the vision attach button read formats Windows can decode natively. The rotation panel accepts .png, .jpg, .jpeg, .bmp, .gif; the attach button accepts .jpg, .jpeg, .png, .bmp.
Not supported: .webp, .avif, .heic. These need a third-party decoder that isn't bundled. Convert them to .png or .jpg first.
📁 Files
Files this app reads and writes
All live next to GhostChat64.exe (or next to the .csproj during development):
File / folderPurpose
model\Where .gguf files go. Scanned recursively. Also holds matching .mmproj vision encoders.
model\*.mmprojVision encoders. Paired automatically with a matching .gguf to enable image understanding.
images\Rotation images. Subfolders scanned too.
settings.txtApp-wide preferences (names, presets, limits, layout, Internet state).
system_prompt.txtThe persistent instruction sent to the model.
model_settings.jsonPer-model state — default model, prompt-format overrides.
ghostchat.pngAbout dialog image.
ghostchat.icoApp icon (embedded in the exe, shown in the title bar and taskbar).
pc.icoFavicon for the GhostBundle help pages.
help-ghostchat.htmlThis page (bundled with the app as help.html).
📁 Files
Reset everything
To restore the app to a fresh-install state, close it and delete these files next to the exe:
  • settings.txt — resets names, presets, limits, layout, and Internet state.
  • system_prompt.txt — clears the system prompt.
  • model_settings.json — forgets the default model and any prompt-format overrides.
The app recreates them with defaults on next launch. Your models, mmproj files, and images are untouched.
🩺 Fix
Model gives short replies
Usual suspects, in order:
  1. Context size too high. If the model was trained at 8192, running at 12288 makes replies choppy. Set ContextSize=8192 in Generation Limits.
  2. Wrong prompt format. If the reply echoes the system prompt back, the format is wrong. Override under Settings → Model → Prompt Format and reload.
  3. Sampling too conservative. Try Creative. Higher temperature = longer outputs for most models.
  4. Model is just terse. Some instruct models are trained to give one-paragraph answers no matter what. Try a different model.
🩺 Fix
Reply is gibberish, empty, or repeating
Almost always a prompt-format mismatch. Open the debug line in the chat log (it says [Debug]: Gen: N tok … tail: …) and look at the tail. If the tail shows the model writing role labels like User: or special tokens like <|im_end|>, it means the model wasn't wrapped in its expected format.

Fix: Settings → Model → Prompt Format → pick the family matching the model (see the Prompt Format entry above) → Reload current model.
🩺 Fix
First token takes a long time
Normal. The model re-reads the entire prompt (system prompt + all history + your new message) before it writes the first token. As the conversation grows, this first-token latency grows too. Once tokens start flowing, the speed is steady.
Speed up: start a new session occasionally to trim history, or use a smaller model, or use a lower quantisation (Q4_K_M is faster than Q8_0).
🩺 Fix
Model fails to load
Usually not enough RAM. A 14B Q4_K_M model needs ~12 GB free. Try:
  • A smaller model (7B instead of 14B).
  • A lower quantisation (Q4_K_M instead of Q6_K).
  • Lower Context size to 4096 — context memory scales with size.
  • Close other memory-hungry apps.
🩺 Fix
Attached image is ignored
The status bar shows Vision:OFF. That means no .mmproj was paired with the current model. Checklist:
  1. Is there an .mmproj file in model\ next to the main .gguf?
  2. Do the two filenames share a prefix? (e.g. Ministral-3-14B.gguf and Ministral-3-14B.mmproj)
  3. Did you reload the model after adding the mmproj? The app only pairs on load.
  4. Is the base model actually vision-capable? A text-only model with an mmproj attached still can't see.
If all four are true and Vision is still off, check the chat log — the app prints "Loading Vision Model: …" or "No .mmproj file found. Vision disabled." on every model load.
🩺 Fix
Internet search returns nothing
A few things to check:
  1. Is the pill button showing ✔ Internet ON? The status bar should show Net:ON.
  2. Does your machine have internet? The app uses your normal Windows network stack.
  3. Did the prompt actually trigger a fetch? Trivial prompts ("hi", "tell me a joke", "write me a story") are routed locally even when Internet is on. Try "latest news about Singapore" or paste a URL.
  4. DuckDuckGo Lite or Google News RSS could be rate-limiting. Wait a minute and try again.
If the fetch itself fails, the app logs the error into the prompt sent to the model (so the model can tell you it couldn't fetch), rather than crashing.
👻 Bundle
The Ghost Bundle Family
Ghost Chat is one of seven small utilities under the Ghost Bundle umbrella:
Seven utilities. One family. Each does one thing well and stays out of your way. 💚
ℹ️ Info
About
Ghost Chat is a local-LLM chat app. By default, everything stays on your machine — every reply is generated by the .gguf model you loaded. No account, no telemetry, no cloud.

Two features are opt-in and worth knowing about:
  • Internet (off by default) — sends the text of qualifying prompts to DuckDuckGo Lite / Google News RSS / the URL you paste. Turn it off when you're done. Nothing else leaves the machine.
  • Vision — images you attach are only ever processed by the local model. They are never uploaded.
Built with .NET 8 WinForms + LLamaSharp, running the llama.cpp backend on CPU. Model files are not distributed with the app — the user supplies them.

Reachable from Help → About. The dialog shows the version, a link to the Ghost Bundle website, and a voluntary donation button.
✨ No features match your search.

💬 About Ghost Chat

A no-nonsense, local-first front-end for GGUF language models. Drop a model file in, chat, done. No accounts, no cloud, no telemetry — everything happens on your machine. Two features reach beyond your desktop, both opt-in: Internet (off by default) fetches live data via DuckDuckGo Lite / Google News RSS, and Vision uses a paired .mmproj to let the model understand attached images — and images never leave your machine. If a model misbehaves, the fix is almost always a prompt-format override or a context-size adjustment, both of which are one click away in the Settings menu. Made for people who want to run their own models without a launcher, a subscription, or a company watching over their shoulder. Ghost Chat is free, and it always will be.