summaryrefslogtreecommitdiffstats
path: root/CHANGELOG.md
blob: a7435e3a7e72da6483640bbadf53df33899f3e39 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# 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.