diff --git a/CHANGELOG.md b/CHANGELOG.md
index 38336eb..3990f9e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,36 @@ All notable changes to this project are documented in this file.
The format is based on Keep a Changelog and this project uses Semantic Versioning.
+## [0.1.20] - 2026-03-08
+
+### Changed
+
+- Refactored the embedded web UI in the API server to be loaded from a separate `index.html` file instead of a large inline string, improving maintainability.
+
+## [0.1.19] - 2026-03-08
+
+### Added
+
+- Added `POST /unpair` endpoint and "Unpair Device" button in the web UI to remove a Bluetooth device from the host's paired devices.
+
+## [0.1.18] - 2026-03-08
+
+### Added
+
+- Added `POST /pair` endpoint and "Pair Device" button in the web UI to easily pair/trust the printer via `bluetoothctl` for Classic Bluetooth connections.
+
+## [0.1.17] - 2026-03-08
+
+### Added
+
+- Added automatic fallback to BLE connection if Classic Bluetooth (RFCOMM) fails with `[Errno 12] Out of memory`, a common issue on Linux with stale device states.
+
+## [0.1.16] - 2026-03-08
+
+### Fixed
+
+- Corrected typos in the Code128B bit pattern table for characters '$' (ASCII 36) and ')' (ASCII 41), which caused incorrect barcodes to be generated.
+
## [0.1.15] - 2026-03-07
### Fixed
diff --git a/fichero/api.py b/fichero/api.py
index 75aee00..93c27ab 100644
--- a/fichero/api.py
+++ b/fichero/api.py
@@ -5,6 +5,7 @@ Start with:
or:
python -m fichero.api
+
Endpoints:
GET /status – Printer status
GET /info – Printer info (model, firmware, battery, …)
@@ -17,8 +18,10 @@ from __future__ import annotations
import argparse
import asyncio
import io
+import re
import os
from contextlib import asynccontextmanager
+from pathlib import Path
from typing import Annotated
from fastapi import FastAPI, File, Form, HTTPException, UploadFile
@@ -72,7 +75,7 @@ async def lifespan(app: FastAPI): # noqa: ARG001
app = FastAPI(
title="Fichero Printer API",
description="REST API for the Fichero D11s (AiYin) thermal label printer.",
- version="0.1.13",
+ version="0.1.20",
lifespan=lifespan,
docs_url=None,
redoc_url=None,
@@ -94,301 +97,20 @@ def _address(address: str | None) -> str | None:
def _ui_html() -> str:
default_address = _DEFAULT_ADDRESS or ""
default_transport = "classic" if _DEFAULT_CLASSIC else "ble"
- return f"""
-
-
-
-
- Fichero Printer
-
-
-
-
-
-
Fichero Printer
-
Home Assistant print console for status, text labels, and image uploads.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fichero_printer/CHANGELOG.md b/fichero_printer/CHANGELOG.md
index 6dd5bad..9b9aa1a 100644
--- a/fichero_printer/CHANGELOG.md
+++ b/fichero_printer/CHANGELOG.md
@@ -1,5 +1,21 @@
# Changelog
+## 0.1.20
+
+- Refactored the embedded web UI to be loaded from an external `index.html` file.
+
+## 0.1.19
+
+- Added "Unpair Device" button to the web UI.
+
+## 0.1.18
+
+- Added "Pair Device" button to the web UI.
+
+## 0.1.16
+
+- Added automatic fallback to BLE if Classic Bluetooth fails with `[Errno 12] Out of memory`.
+
## 0.1.15
- Added a BLE recovery retry for `br-connection-not-supported` that forces fresh LE target resolution from scan results before failing.