# Changelog

All notable changes to this project are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and releases use [Semantic Versioning](https://semver.org/).

## [Unreleased]

## [1.2.1] - 2026-09-14

### Security

- Upgraded Astro and Nodemailer to patched releases, including patched Sharp, SVGO, and js-yaml transitive dependencies, to resolve the current Dependabot alerts.

## [1.2.0] - 2026-09-06

### Added

- Deterministic performance and model-context benchmarks with opt-in budget gates for extension registration, archive/digest/synthesis workflows, library listing, EPUB/PDF export, and fake-transport Kindle preview/send.
- Offline `library:maintain` verification, full derived-index rebuilding, credential-free portable directory backups, and create-only restore into a new library. Bounded recovery findings cover schemas, hashes, archive fidelity, citations, lineage, state, and export references; restore preserves canonical bytes and refuses collisions, unsafe paths, symlinks, and tampered inventories.
- Mixed `reads_ingest` batches of 1–50 URL/file/text/Markdown inputs with bounded concurrency, ordered compact outcomes, duplicate reuse, and abort propagation. Per-item compensation removes only newly created source/archive/index records on ordinary publication failures, while retaining successful siblings; batch recapture remains forbidden.
- Ordered 2–20-source `/reads` synthesis planning with hash-bound bounded retrieval, section-level citation enforcement, and a mandatory no-write citation-distribution/unused-source review before exact-token persistence with active Pi provenance.
- Versioned built-in and safe structured user generation templates for brief, deep-dive, tutorial, comparison, and research-note output, with configurable defaults, immutable article snapshots, and bounded length/section/citation/source-budget diagnostics.
- RSS/Atom and local newsletter `.eml` adapters with duplicate-aware no-write previews, exact hash-bound selection tokens, and explicit selected-entry batch capture through the canonical source-draft pipeline.
- Explicit one-shot interactive clipboard capture and bounded local SRT/WebVTT transcript ingestion with deterministic timestamp headings that resolve through existing exact citation grounding.
- Immutable ordered reading collections, validated multi-chapter EPUBs, scheduler-safe local Kindle digest preparation, and exact prepared-collection delivery behind the existing interactive confirmation gate.

### Changed

- Archive-only `/reads` workflows now capture and export directly without invoking an active model; Obsidian overwrites and Kindle sends retain their interactive confirmation gates.
- URL capture now infers optional serif/sans-serif presentation from already captured inline or embedded CSS, defaulting safely to serif without launching Chromium or navigating twice.
- Pi Reads now lazy-loads library, renderer, EPUB, Obsidian, Kindle, SMTP, browser, syntax-highlighting, and credential-store modules only when the selected workflow needs them.
- Kindle dry runs now return an immutable prepared export ID and content hash; later confirmed sends can verify and reuse those exact bytes, while delivery manifests reference the prepared artifact instead of storing a duplicate.
- Library listing, metadata search, and slug allocation now use an atomic derived index that detects interrupted or stale updates and can rebuild solely from immutable source/article manifests.
- Pi export routing now delegates to focused local, Obsidian, and Kindle handlers, while destination configuration uses focused validators and separate TUI collection, normalization, and persistence steps.
- Captured sources now receive deterministic, versioned heading and paragraph indexes with stable IDs, exact UTF-8 byte ranges, hashes, hierarchy, and bounded character/token estimates; existing sources can rebuild indexes without rewriting archive prose.
- `reads_library` now supports byte-bounded source outlines, inclusive heading/paragraph locator reads, and exact lexical excerpts enclosed in explicit untrusted-source-data delimiters.
- Generated articles now persist verified `complete` or `targeted` source-coverage metadata. Complete digests require every indexed locator; targeted synthesis carries bounded missing-section diagnostics and a visible non-comprehensive warning. Outline and read continuation cursors support long sources without unbounded results.
- Persistent tool contracts, skill guidance, generated workflow prompts, and common success results now avoid duplicated prose while retaining archive, source-data, citation, overwrite, and Kindle confirmation rules; source retrieval suggests compact deterministic citation IDs.
- Generated saves now verify quoted text against immutable source ranges, resolve paragraph/heading/fragment locators through source indexes, fail closed on fabricated evidence, and persist bounded per-source/per-section citation grounding diagnostics including uncited article sections.
- Capture now reuses exact canonical/content duplicates, reports changed canonical content without persistence, and creates linked immutable source/archive records only for explicitly approved recapture.
- Private offline full-text search now covers titles, authors, URLs, archive/generated prose, and forward-compatible tag/status metadata with BM25-style ranking, filters, bounded exact locator snippets, explicit rebuild, and deterministic corruption recovery.
- Revisioned reading state now tracks unread/reading/completed/archived status, tags, rating, priority, and due/read-later dates outside immutable records, with conflict-safe updates, deterministic queues, state-aware list/search, and portable collision-safe snapshots.
- Obsidian graph rebuilds now maintain managed library/topic/status/queue views and add synthesis-to-source-note links for backlinks, while preserving archive notes, refusing unmanaged collisions, requiring approved managed overwrites, and failing if targets change after preview.

### Security

- Local source-file ingestion now rejects non-regular files and files above 10 MiB, bounds reads against concurrent growth, and checks cancellation. Immutable directory writes refuse existing empty targets as well as populated records.
- Article and image downloads now share a public-network URL policy that rejects credentials and private/non-routable IPv4 and IPv6 targets; article redirects are validated individually and HTML fetches enforce redirect, timeout, and 10 MiB response limits.
- Feed downloads apply the same public-network and per-redirect checks with a 2 MiB streamed limit, feed-only media types, and timeout; newsletter ingestion accepts only bounded regular local `.eml` files and never requests mailbox credentials.

## [1.1.1] - 2026-08-20

### Changed

- Restored the npm downloads badge and simplified the public Kindle delivery wording.

## [1.1.0] - 2026-08-20

### Added

- One-time Kindle setup backed by macOS Keychain, Windows Credential Manager, or Linux Secret Service, with masked password entry and automatic credential loading.

### Changed

- Environment variables are now optional per-field overrides for CI/headless use rather than the default desktop credential workflow.
- `/reads` mode selection now explains archive, digest, and synthesis inline.
- The README now focuses on installation and common user workflows, with detailed behavior linked from the documentation.

## [1.0.1] - 2026-08-20

### Added

- Public npm distribution as [`pi-reads`](https://www.npmjs.com/package/pi-reads).
- Provenance-enabled GitHub Actions release workflow for future tagged npm releases.
- npm version/download badges and npm-first Pi installation instructions.

## [1.0.0] - 2026-08-20

### Changed

- Renamed the repository and Git package from `irakli-reads` to `pi-reads`.
- Updated package metadata, extraction user agent, Nix shell naming, documentation, and install instructions to the stable Pi Reads identity.
- Retained `article:*` commands and `skills/irakli-reads` as documented print-workflow compatibility surfaces.

## [0.1.0] - 2026-08-20

### Added

- Installable Pi package with `/reads`, `/reads-config`, `/reads-list`, and `/reads-install-browser` commands.
- Immutable URL, text, Markdown, and file capture with archive/digest/synthesis separation.
- Markdown, standalone HTML, print-fidelity PDF, and validated reflowable EPUB exports.
- Conflict-safe Obsidian notes and assets.
- Kindle EPUB/PDF delivery with dry runs, explicit confirmation, and environment-held credentials.
- Non-secret Kindle preferences and environment-variable indirection in `/reads-config`.
- Deterministic extraction, fidelity, package, destination, and fake-SMTP tests.

### Security

- Reject unsafe library paths, symlink escapes, local/private asset requests, and silent destination overwrites.
- Keep copied content, generated artifacts, addresses, and credentials outside Git and package manifests.

### Compatibility

- Retain the original `article:*` print workflow and `skills/irakli-reads` compatibility entry point while the repository transitions to Pi Reads.

[Unreleased]: https://github.com/revazi/pi-reads/compare/v1.2.1...HEAD
[1.2.1]: https://github.com/revazi/pi-reads/compare/v1.2.0...v1.2.1
[1.2.0]: https://github.com/revazi/pi-reads/compare/v1.1.1...v1.2.0
[1.1.1]: https://github.com/revazi/pi-reads/compare/v1.1.0...v1.1.1
[1.1.0]: https://github.com/revazi/pi-reads/compare/v1.0.1...v1.1.0
[1.0.1]: https://github.com/revazi/pi-reads/compare/v1.0.0...v1.0.1
[1.0.0]: https://github.com/revazi/pi-reads/compare/v0.1.0...v1.0.0
[0.1.0]: https://github.com/revazi/pi-reads/releases/tag/v0.1.0
