# Changelog All notable changes to this project are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ## [0.1.0] - 2026-07-31 First working version. ### Added - Persistent background process with a Unix-socket control channel, so a window toggle costs a socket round trip instead of a process start. The control commands (`--toggle`, `--show`, `--hide`, `--ping`, `--quit`) do not import Qt and answer in well under a tenth of a second. - Two chat modes. One-shot asks a single question with no context carried over; Chat keeps a resumable multi-turn conversation. - Model picker populated at runtime from the router's `/v1/models`, with vision-capable models marked. - Streaming replies rendered token by token. - Markdown rendering for replies: headings, emphasis, lists, tables, inline code and tinted fenced code blocks, via `QTextDocument` with no markdown dependency. User input is shown literally so attached file contents are never reflowed. - Collapsed reasoning. Models with a reasoning budget return their thinking in a separate field; it shows as a one-line summary that expands on click, tracked per reply. - File attachment by drag-and-drop or file dialog. Text and code files are inlined into the prompt and truncated to fit the model's context with a warning. Images require a vision model, and dropping one on a text model offers to switch. - SQLite history with FTS5 full-text search. Chat sessions reopen and continue with context intact; one-shot entries reopen read-only. - Attachment provenance: original path, size, SHA-256, and a thumbnail for images, so a reopened conversation still shows what was sent even if the file has since moved. - System tray icon for show/hide/quit. - Configuration in `~/.config/llamachat/config.toml`, written with defaults on first run. - `presets.ini` parsing for the two things the API does not report: which models have an mmproj file, and each model's context size. - Hyprland Lua snippets for autostart, keybind and floating window rules. ### Fixed - `presets.ini` opens with a bare `version = 1` before any section, which made `configparser` reject the whole file. - Sessions sharing a one-second timestamp sorted unpredictably in the history list and in search results. - A venv PySide6 bundles almost no Qt plugins, so `QT_QPA_PLATFORMTHEME` found nothing and every window fell back to Fusion, ignoring qt6ct and Kvantum. The system plugin directory is now used when its Qt version matches the bundled one exactly. - A reply containing a markdown link to the internal reasoning scheme produced a working toggle, letting model output drive the interface. The scheme is namespaced, forged anchors are rewritten before display, and only `http`, `https` and `mailto` links reach the desktop opener. - Venv discovery compared resolved interpreter paths, so a venv created with `--system-site-packages`, whose `bin/python3` symlinks to the system interpreter, was discarded as "already running". ### Security - Markdown is parsed with the `MarkdownNoHTML` flag, so markup in a reply is displayed rather than interpreted. - The control socket is created mode 0600. - Search input is tokenised and quoted before reaching FTS5, so punctuation cannot be read as query syntax.