PHX AI Document Starter changelog

Latest release v2.2.0 · this is the file that ships inside the package

Changelog — PHX AI Document Starter

All notable changes to this product are documented here. This project follows Semantic Versioning. Breaking changes link to an upgrade note in docs/upgrading.md.

[2.2.0] — 2026-07-10

Changed

  • The logged-in experience is rebuilt as a document workbench: paper background, white library rail (brand row, Chat/Files/Folders navigation, files quick-list, words-remaining meter, Unlock Pro), serif display headings, mono micro-labels, and workbench chat — user messages as dark bubbles, assistant answers as white cards with a streaming caret, and a focused composer. Files and Folders become card grids with friendly empty states; Settings becomes sectioned cards.
  • Self-hosted fonts added for the workbench: Fraunces, Inter, and IBM Plex Mono (all SIL Open Font License).

Fixed

  • Select-to-search in both chat viewers assumed jQuery, which never loaded — highlighting text threw $ is not defined. Rewritten in vanilla JS, so “Find in PDF” works again.
  • The Files page’s dead-code card referenced a nonexistent file.bytes field (latent crash), removed in the card-grid rebuild.

[2.1.0] — 2026-07-10

Added

  • Signature animated hero: a three.js field of drifting document pages (canvas-textured, with an embedding-dust particle layer). three r165 is vendored (assets/vendor/three/, MIT) so fresh clones build offline; the scene ships as its own esbuild entry (js/hero.js) and is lazy-loaded by the HeroScene LiveView hook only where the hero canvas renders. Pauses off-screen/hidden-tab, honours prefers-reduced-motion, degrades to the CSS gradient without WebGL.
  • New brand identity: document-with-spark logo mark, brand/1 lockup used across the sidebar and public navbar, and an SVG favicon.

Changed

  • Landing hero redesigned as a dark band with a new headline (“Your documents, answering back.”) and an honest CSS workspace mock (viewer with highlighted source beside the chat) replacing the stale screenshots that showed an unrelated product.
  • Public navigation restyled as a dark glass bar; the broken text-only brand (which read config from the wrong app) was replaced.

Fixed

  • Pricing page copy: “Unlimited Unlimited Messaging” → “Unlimited messaging”.

[2.0.1] — 2026-07-10

Added

  • LICENSE file carrying the PhxTemplates Commercial Licence (v2.0) summary with a pointer to the authoritative tier terms.

[2.0.0] — 2026-07-10 — AI Document successor (consolidation of AI File Template + PDFAi)

Fixed (final release hardening)

  • Landing-page social-proof avatars referenced images that don’t ship; replaced with self-contained styled initials.
  • The viewer’s select-to-search popup assumed jQuery (never loaded) and silently never worked; rewritten in vanilla JS.
  • Registration no longer throws when Google Ads conversion tracking isn’t configured (gtag call is guarded).
  • Duplicate DOM ids removed (mobile file nav, doubled flash group) for correct LiveView patching.

Changed (breaking)

  • Renamed the application: OTP app :pdfai:phx_ai_document, modules Pdfai*PhxAiDocument*, PdfaiWebPhxAiDocumentWeb, databases phx_ai_document_dev/phx_ai_document_test.
  • All AI access now goes through the PhxAiDocument.AI provider boundary (behaviour + typed structs + typed errors), with a deterministic FakeProvider default in dev/test and OpenAIProvider as the documented example adapter. The old Pdfai.Openai module (compile-time API key, raw provider maps in LiveViews) was removed.
  • Auth emails (confirmation, password reset, email change) are sent server-side via Swoosh; the client-side EmailJS pattern was removed.

Security

  • Fixed cross-tenant deletion: file deletion previously removed rows by filename across all users; it is now owner-scoped and covered by regression tests.
  • Owner-scoped access everywhere (get_user_file/2, get_user_folder/2), including LiveView handle_params and file downloads (filename collisions across accounts can no longer leak files).
  • Removed hardcoded secret placeholders (sk-proj-, sk_live_, whsec_), Google Analytics/Ads IDs, the production billing-portal URL, and a personal PDF that shipped in priv/static/uploads. OPENAI_API_KEY and all other secrets come from the environment only.
  • Forgot-password no longer reveals whether an email address exists.

Added

  • Document deletion lifecycle: deleting a document/folder removes provider artifacts (uploaded file, index, conversation), the stored file on disk, and chat rows — proven by deletion_lifecycle_test.exs.
  • Ingestion rollback: failed ingestion cleans up partial provider artifacts and the stored file (the previous rollback path was broken).
  • Tests: 13 → 32 (provider contract, deletion lifecycle, tenant isolation).
  • Docs: docs/architecture.md, docs/setup.md, docs/provenance-matrix.md, docs/viewer-licence.md.

Removed

  • Lorem-ipsum landing copy, fabricated testimonials and “trusted by” logos, the nonexistent iOS/Android app section, dead routes (/about, POST /api/pdf, FolderLive.Show routes), the unused pgvector/erlport dependencies, and the vendored viewer’s bundled documentation site (~21 MiB).

Earlier (as PDFAi) — overhaul

Security

  • Removed all distributed credentials; secrets now load from the environment. Any key previously shipped in an archive must be treated as compromised and rotated (see the storefront security incident record).

Changed

  • Standardised setup, .env.example, formatting, and the release gate against the shared PHX engineering baseline.
  • Added AGENTS.md / CLAUDE.md agent-readiness guides.

Added

  • SECURITY.md, SUPPORT.md, and this changelog.