- Backend: authenticated GET preview endpoint generates PDF on-demand from any
version without requiring a public asset publish
- Backend: POST upload endpoint on a version accepts a .docx, parses it to
structured blocks, diffs against current blocks, and records patches
- Frontend: new Preview tab shows live PDF rendered from the authenticated
endpoint (blob URL via fetch with auth header)
- Frontend: Upload DOCX (arrow-up) button in action bar sends the file to the
branch, backend computes diff automatically
- Frontend: Copy Markdown button (clipboard icon) appears on branch hover in
CVTree; copies block path/type/text as structured markdown to clipboard
https://claude.ai/code/session_01BTNfDfgFvcnehkve6r66nk
- dlib/ai/insights.py: pure-Python NLP analysis that correlates accepted
AI suggestion operations/keywords/sections with submission outcomes
(pending_review / published = positive, archived = negative)
- Backend: GET /api/v1/insights route + service + Pydantic schema
- Frontend: InsightsPanel component with bar charts for operation impact,
section impact, and keyword signal lift scores
- Insights tab added to the version panel; compact preview on doc overview
- NEXT_PUBLIC_DEMO=true makes the webapp fully standalone: loads
DEMO_DOCUMENTS / DEMO_SUBMISSIONS / DEMO_INSIGHTS from demo-data.ts,
disables all mutating actions, shows a DEMO badge in the top bar
- apps/webapp/public/demo-cv.docx: static dummy CV (Alex Rivera) for demo
- scripts/gen_demo_cv.py: script to regenerate the demo DOCX
- .env.example: document NEXT_PUBLIC_DEMO flag
https://claude.ai/code/session_01LWxu2qrwY6BRjUFXXn7NiM
- Replace ReportLab PDF export with LibreOffice headless for proper DOCX formatting preservation
- Add libreoffice-writer + fonts-liberation to backend Dockerfile
- Proxy public CV PDFs through frontend (/cv/[slug]) instead of redirecting to MinIO storage directly
- Fix docker-compose: route backend/worker to internal MinIO URL (http://cvfs-minio:9000), remove MinIO from public network, parameterize all domain/env vars
- Add storage cleanup (MinIO artifact deletion) when a document is deleted
- Add docker-compose.standalone.yml for self-deployment without Traefik/dokploy
- Update .env.example with comprehensive self-deployment documentation
https://claude.ai/code/session_017HGM9VPptZG52asT5pbL6Y
- documents.py: fix root_version_id never being saved due to SQLAlchemy
deferring the circular FK (CvDocument↔CvVersion). Use flush-based approach:
flush doc, flush version, then set root_version_id before final commit.
- config.py: add validator to coerce empty MINIO_ENDPOINT string to None,
preventing boto3 ValueError: Invalid endpoint at startup.
- versions.py: catch PatchValidationError and return 422 instead of 500
when a patch violates ATS guard rules.
- api.ts: on 401, clear stale OIDC cookies and redirect to /login instead
of showing the "Failed to load documents" error.
https://claude.ai/code/session_01KKbzWYz8fLyG2qcwiDZ8fy
Middleware runs in Edge Runtime (no Node.js built-ins), so use
globalThis.crypto.subtle for HMAC verification. Route handler uses
`import { createHmac } from 'crypto'` without the node: prefix
which webpack cannot resolve during Next.js build.
https://claude.ai/code/session_01CdisLhbC2kVt2hxfJ7TNPf
API_BASE_URL env var isn't reaching Next.js in Dokploy, so the fallback
was localhost:9812. Default to the correct container hostname so it works
without any env var configuration. Local dev still overrides via API_BASE_URL.
https://claude.ai/code/session_01Xmxm2QLgFBgRJyYD6VukR6
NEXT_PUBLIC_* is baked at build time so runtime docker-compose environment
vars have no effect. Instead:
- next.config.ts rewrites /api/* -> API_BASE_URL/api/* at the server level
- api.ts uses relative paths (no env var in client bundle at all)
- docker-compose passes API_BASE_URL=http://cvfs-backend:8080 at runtime
- Dockerfile no longer needs any build args
Requests: browser -> Next.js server (/api/*) -> cvfs-backend:8080 (/api/*)
https://claude.ai/code/session_01Xmxm2QLgFBgRJyYD6VukR6
- New monochrome design system in globals.css (no shadows, tight spacing, system-font)
- Root layout stripped to html/body; home page owns its Header/Footer
- Dashboard fully wired to FastAPI backend: upload, branch, submission, publish, download
- CVTree rebuilt as compact file-tree component driven by real version data
- DiffViewer rebuilt as minimal git-diff display using real patch data
- API client (libs/api.ts) extended with all CRUD operations
- Header redesigned to match minimal style
- Backend: added GET /documents/{id}/versions/{id}/download endpoint for DOCX export
https://claude.ai/code/session_01Xmxm2QLgFBgRJyYD6VukR6
Features:
- Complete CV version control system with branching and submission tracking
- Interactive tree visualization showing master resume, branches, and submissions
- Diff viewer for tracking changes between CV versions
- Professional landing page with Git for CVs messaging
- Modern dashboard with three-panel layout (tree, details, preview)
- ATS-safe design philosophy throughout
- Tailwind 4 configuration with professional design system
Components:
- CVTree: Interactive expandable tree for CV versions
- DiffViewer: Visual diff display with add/remove/change highlighting
- Comprehensive data models for documents, versions, patches, submissions
- Upload modal and action buttons for CV management
- Status tracking and public sharing indicators
Architecture:
- TypeScript types for complete CV management workflow
- Responsive design with proper hover states and animations
- Mock data demonstrating realistic ML Engineer and Backend Engineer branches
- Ready for FastAPI backend integration and DOCX processing
This implements the complete 'Resume Branches' vision as a modern webapp
that treats CV management like version control for documents.