BuddyChat XP — _ ×

BuddyChat XP

A Windows XP-era chat front end for llama.cpp. Version 0.1.3.

BuddyChat XP is a lightweight, retro-styled web interface for your local llama.cpp server. It looks and feels like a 2007 Windows XP application — Luna blue title bars, Tahoma 11px text, a sunken status bar, and a chat log that streams replies token by token.

It ships in three separate HTML pipelines so it works from IE8 all the way up to current Chrome, Firefox, and Safari. No build step. No dependencies. Runs against a local llama serve instance or any hosted OpenAI-compatible API. Includes a full IM-era sound kit, a nudge button, and an AIM-style typing indicator.

MIT License Free & Open Source One-line Install XP / 2007 Aesthetic Local + Online Models IM Sound Kit

Install

Three commands get you from nothing to chatting. First install llama.cpp, then download and run a model, then install BuddyChat XP. Each command is copy-paste ready.

Step 1 — Install llama.cpp

llama.cpp ships its own installer. It handles platform detection, GPU acceleration, and dependency setup automatically.

llama.cpp installer
Windows (PowerShell)
irm https://llama.app/install.ps1 | iex
macOS / Linux (Terminal)
curl -LsSf https://llama.app/install.sh | sh

Installs the llama command. If you already have llama-server or a built copy of llama.cpp, you can skip this step — anything that speaks the OpenAI-compatible API works.

Step 2 — Download and run a model

The llama serve command can download a model straight from Hugging Face and start the server in one go. The default is Bonsai-8B — a 1-bit quantized 8-billion-parameter model that fits in about 1.15 GB of memory and runs on almost anything.

Start the model server — Bonsai-8B (default)
Terminal (any OS)
llama serve -hf prism-ml/Bonsai-8B-gguf:Q1_0

The -hf flag tells llama serve to pull the model from Hugging Face on first run and cache it locally afterwards. The :Q1_0 suffix selects the 1-bit quantization this model is published in — without it, llama serve may not know which file to fetch.

The server listens on http://localhost:8080 by default — the same URL BuddyChat XP expects.

Verify the server is up by opening http://localhost:8080/v1/models in a browser — you should see a JSON response listing your model.

Pick the Bonsai size that fits your PC

Bonsai models come in three sizes. Pick the one that matches your hardware — the smaller sizes use less RAM and are faster, the larger ones write better.

Model RAM needed Best for
Bonsai-27B ~3.4 GB Mid-range PCs with 8 GB+ of RAM and a modern GPU
Bonsai-8B (default) ~1.15 GB Most machines, including laptops and older desktops
Bonsai-4B ~0.6 GB Low-end machines, Raspberry Pi, Windows XP boxes
Bonsai-4B — for low-end PCs
llama serve -hf prism-ml/Bonsai-4B-gguf:Q1_0
Bonsai-27B — for mid-range PCs
llama serve -hf prism-ml/Bonsai-27B-gguf:Q1_0

If you're not sure which to pick, start with the default Bonsai-8B. If it feels slow or your machine runs out of memory, drop down to Bonsai-4B. If you have a capable GPU and want better responses, try Bonsai-27B.

Using a completely different model

If you want to try something other than Bonsai, any Hugging Face GGUF repo works with llama serve. Just swap in the repo name and quantization tag.

Qwen3 4B — smaller, different voice
llama serve -hf unsloth/Qwen3-4B-GGUF:Q4_0
Llama 3.2 3B — Meta's small model
llama serve -hf bartowski/Llama-3.2-3B-Instruct-GGUF:Q4_K_M

Any model that speaks the OpenAI-compatible API will work. Swap -hf for a local file path if you already have a GGUF on disk.

Step 3 — Install BuddyChat XP

Now the front end itself. The installer downloads a tagged release, extracts it to a per-user location, and creates a buddyxp command that wraps the platform launcher. No admin rights. No build step.

BuddyChat XP installer
Windows (PowerShell)
irm https://aetex.is-a.dev/buddyxp/install.ps1 | iex
macOS / Linux (Terminal)
curl -fsSL https://aetex.is-a.dev/buddyxp/install.sh | sh

Windows: requires PowerShell 5.0 or newer (Windows 10, 11, or 8.1 / 7 SP1 with PowerShell updated). Installs to %LOCALAPPDATA%\BuddyXP.

macOS / Linux: installs to ${XDG_DATA_HOME:-$HOME/.local/share}/buddyxp.

Both installers need Python 3, Python 2, or Node.js on your system to serve the files. If none are found, the installer offers install hints and lets you continue anyway.

Step 4 — Run it

Open a new terminal so your PATH updates take effect, then run:

buddyxp

The launcher shows a Windows XP-style setup prompt asking which browser pipeline to use, then starts a local server and opens your browser. Type a message and Buddy replies.

Windows XP SP3

Windows XP doesn't have PowerShell 5.0 or modern curl, so the one-line installers don't apply. XP users should:

  1. Download the repo as a ZIP and extract it.
  2. Install Python 2.7.18 — the last Python release that supports XP SP3. python.org/download/releases/2.7.18. During setup, tick Add python.exe to Path.
  3. Double-click launch-xp.bat.

Bonsai-4B is the best match for XP-era hardware. At under a gigabyte of RAM it runs comfortably on the same machines that shipped with the operating system. Bonsai-8B works too if the machine has at least 2 GB of free memory.

Manual install

If you'd rather install by hand, or you're on an unsupported platform, clone the repo and run a launcher directly:

git clone https://github.com/Aetex/buddyxp.git
cd buddyxp

Then pick the launcher for your OS:

  • Windows Vista+ — launch.ps1 or double-click launch.bat
  • Windows XP SP3 — launch-xp.bat
  • Linux / macOS — ./launch.sh

Updating

Re-run the installer. It overwrites the install directory and leaves your settings untouched — those live in your browser's localStorage, not in the install folder.

Uninstalling

Windows:

Remove-Item -Recurse -Force "$env:LOCALAPPDATA\BuddyXP"
# Then remove "$env:LOCALAPPDATA\BuddyXP\bin" from your user PATH.

macOS / Linux:

rm -rf "${XDG_DATA_HOME:-$HOME/.local/share}/buddyxp"
rm -f  "$HOME/.local/bin/buddyxp"
# Then remove the "buddyxp-PATH" block from your shell rc file.

Screenshots

BuddyChat XP looks and behaves like a 2007 Windows XP application, whether you run it on a real XP machine or in a modern browser.

BuddyChat XP running in Internet Explorer on Windows XP
ie.html in IE8 on Windows XP SP3
BuddyChat XP running in a modern browser
index.html in a modern browser

About the Project

BuddyChat XP is a front end for any OpenAI-compatible model server. It was built against llama.cpp and works out of the box with the llama serve command, but anything that answers /v1/chat/completions will work — LM Studio, Ollama, text-generation-webui, and hosted endpoints are all fine.

The default persona is Buddy, a friendly 2007-era IM buddy who avoids emoji and talks like it is still AIM and MSN Messenger. A client-side filter converts any emoji the model produces into ASCII equivalents (:), :D, ;), <3, (y)) and strips anything pictographic that isn't in the map.

Three browser pipelines

  • index.html — Modern browsers. Uses fetch + ReadableStream + AbortController. Streams replies.
  • legacy.html — Firefox 3.5+, Chrome 4+, Safari 4+, MyPal/Goanna, IE10/11. Uses XMLHttpRequest with Content-Type: text/plain so no CORS preflight is sent.
  • ie.html — IE8 / IE9. Uses XDomainRequest. The reply appears all at once because IE8/9 cannot stream HTTP responses.

All three share the same xp.css theme and xp-common.js helpers. Changing the layout or theme only requires editing one place.

How to Use

  • Type a message in the box at the bottom and press Enter to send. Shift+Enter inserts a new line.
  • Send sends the message. Stop cancels a reply mid-stream. Clear wipes the conversation.
  • The Connection pane lets you change the server URL or pick an online provider, and test the connection. The status bar at the bottom turns green when the server responds and red when it doesn't.
  • The History pane lists every conversation. Click any one to reload it. New starts a fresh chat, Delete removes the current one.
  • The Buddy's Memory pane holds facts Buddy has learned about you across chats. Click Remember this to extract facts from the current conversation. Click the × on any fact to forget it.
  • The Generation pane has temperature and max tokens. 0.7 and 512 are good defaults. Bonsai-8B's own model card suggests a temperature of 0.5.
  • The System Prompt pane controls the persona. The default is the 2007-era Buddy. Edit or clear it however you like.
  • Settings persist in localStorage under the key buddyChatXp.settings.v1.

Forcing a specific version

If you want to test the legacy or IE pipeline in a modern browser, open the file directly:

http://localhost:8000/legacy.html
http://localhost:8000/ie.html

Note that ie.html will immediately redirect you to index.html if your browser has fetch.

Sounds & Effects

BuddyChat XP has a full IM-era sound kit, synthesized on the fly with the Web Audio API. No audio files, no external dependencies, no licensing questions. Every sound is generated from oscillators and white noise at the moment it plays.

What plays when

Event Sound Style
First page load Login chime MSN-style three-note rising arpeggio (E5 → G5 → C6)
New chat / load chat Door open Rising whoosh with a soft click
Clear chat / delete chat Door close Falling whoosh with a low thud
Send a message Send blip Subtle rising two-tone
First token arrives AIM ding Two-tone up (D5 → A5 → D6) with overtones
Nudge button Nudge buzz Low-frequency square-wave rumble with vibrato

The nudge

The Nudge button in the toolbar does what MSN nudges did in 2004 — it shakes the whole window and plays a buzzing rumble. In modern browsers the shake uses a CSS keyframe animation. In IE8 and IE9 it falls back to a JavaScript-driven loop that shifts the window frame by frame, so the effect still works on XP machines.

The typing indicator

While waiting for the model's first token, the bot message slot shows an animated AIM-style indicator: a small pencil bobbing back and forth next to the text "Buddy is typing" followed by three pulsing dots. As soon as the first token arrives, the indicator is replaced by the streamed reply and the AIM ding plays.

The pencil is pure CSS — no images. It's built from a triangle for the tip, a yellow rectangle for the shaft, and a red rectangle for the eraser.

Sound toggle

A Sound On / Sound Off button in the toolbar toggles all effects. The setting persists across reloads. Sound is on by default.

Autoplay and the first click

Browsers block audio until the user interacts with the page. BuddyChat XP handles this by deferring the login chime until the first click, keypress, or touch. Every sound after that plays immediately. If you don't hear anything on load, click anywhere on the page once and the chime will fire.

IE8 and IE9

Internet Explorer 8 and 9 don't have the Web Audio API, so all sounds are silently skipped. The nudge visual still works via the JavaScript fallback, and the typing indicator renders as static text with dots. The sound toggle still functions so the label matches the other pipelines.

Online Models

BuddyChat XP works with a local llama.cpp server by default, but you can also point it at a hosted API. Pick a provider from the sidebar dropdown and the connection pane swaps to the right fields.

Supported providers

Provider Endpoint Default model
Local (llama.cpp) http://localhost:8080/v1 —
OpenAI https://api.openai.com/v1 gpt-4o-mini
OpenRouter https://openrouter.ai/api/v1 openai/gpt-4o-mini
Groq https://api.groq.com/openai/v1 llama-3.3-70b-versatile
Together https://api.together.xyz/v1 meta-llama/Llama-3.3-70B-Instruct-Turbo
DeepSeek https://api.deepseek.com/v1 deepseek-chat
Mistral https://api.mistral.ai/v1 mistral-small-latest
Custom (any OpenAI-compatible URL) (any model name)

To use one, pick it from the dropdown, paste your API key, and click Test. Your choice and your key are saved separately for each provider, so switching back and forth doesn't lose anything.

API keys are stored in your browser

Keys are saved in localStorage on the same origin as the page. They are not encrypted. Anyone with access to your browser profile or dev tools can read them.

This is fine on a personal machine. It is not fine on a shared computer. The UI shows a warning under the API Key field when an online provider is active.

Internet Explorer 8 and 9

ie.html does not support online providers. IE8/IE9's XDomainRequest cannot send Authorization headers, so authenticated cross-origin requests are impossible without a proxy. The Provider dropdown in IE mode shows only Local (llama.cpp).

Memory & History

BuddyChat XP keeps track of your conversations and can remember facts about you across them.

Conversation history

Every conversation is saved automatically and listed in the History pane. Click any entry to reload it. The most recent 100 conversations are kept; older ones are dropped silently. Each conversation is small (a few KB typically), so the whole history fits comfortably in the 5 MB localStorage budget.

Buddy's Memory

Buddy's Memory is a list of facts the model has learned about you. On every request those facts get prepended to the system prompt — the model doesn't actually remember anything itself, it's context injection. But it produces the effect of an assistant that knows you across sessions, which is what most people want.

To teach Buddy a fact: have a conversation, then click Remember this in the Buddy's Memory pane. The app sends the transcript back to the model with a prompt asking it to extract durable facts — names, locations, preferences, ongoing projects. They appear in the list within a second or two.

To remove a fact: click the × next to it. To clear all: click Forget all. To turn memory off: uncheck Remember across chats — your facts stay but stop being sent to the model.

How facts are stored

Each fact is a short string like "User lives in Berlin" or "User is learning Python". The app caps you at 100 facts and dedupes identical entries. When the cap is reached, the oldest facts get dropped.

Facts are stored in localStorage under buddyChatXp.memory.v1, separate from conversations. Clearing conversation history doesn't touch memory, and vice versa.

What actually gets sent

When memory is enabled and you send a message, the system prompt is constructed like this:

You remember the following things about this user from past conversations:
- User lives in Berlin
- User is learning Python
- User prefers short answers

Use them naturally if relevant. Do not list them back or announce that
you remember them. If the user corrects a fact, drop it.

[your normal system prompt follows]

Then your conversation history, then your new message. The model sees all of it and responds as if it remembers.

Privacy

Everything is client-side. Facts and conversations live in your browser's localStorage. The only time they leave your machine is when the app sends them to the model — local llama.cpp or whichever online provider you've configured.

If you use an online provider, your memory facts go to that provider on every message. If that's a problem, disable memory or use a local model.

Working across providers

Memory is provider-agnostic. You can teach Buddy facts while talking to a local model and they'll be sent to OpenAI next time you switch providers. The reverse also works. There's one shared memory list regardless of which model produced it.

License

BuddyChat XP is released under the MIT License.

MIT License

Copyright (c) 2025 AeteX Interactive

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

You can also read the full LICENSE file in the repository.

Credits

  • Front end, XP theme, launchers: AeteX Interactive
  • Model server: llama.cpp by Georgi Gerganov and contributors
  • Default model: prism-ml/Bonsai-8B-gguf on Hugging Face
  • Default persona: Buddy, a fictional 2007-era IM buddy
You are visitor 0000001 since 2025.
Best viewed in Internet Explorer 6 at 800×600.
(We're joking. Any browser works, honestly.)