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.bytesfield (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 theHeroSceneLiveView hook only where the hero canvas renders. Pauses off-screen/hidden-tab, honoursprefers-reduced-motion, degrades to the CSS gradient without WebGL. -
New brand identity: document-with-spark logo mark,
brand/1lockup 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
-
LICENSEfile 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, modulesPdfai*→PhxAiDocument*,PdfaiWeb→PhxAiDocumentWeb, databasesphx_ai_document_dev/phx_ai_document_test. -
All AI access now goes through the
PhxAiDocument.AIprovider boundary (behaviour + typed structs + typed errors), with a deterministicFakeProviderdefault in dev/test andOpenAIProvideras the documented example adapter. The oldPdfai.Openaimodule (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 LiveViewhandle_paramsand 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 inpriv/static/uploads.OPENAI_API_KEYand 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.Showroutes), the unusedpgvector/erlportdependencies, 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.mdagent-readiness guides.
Added
-
SECURITY.md,SUPPORT.md, and this changelog.