# Facet Roadmap **Last Updated:** 2026-06-23 This roadmap reflects current implementation status and planned work, ordered chronologically by phase. Completed items remain for context; upcoming items are listed under each phase. --- ## Current Status Snapshot - ✅ Rebrand complete; branding, assets, and metadata reflect Facet. - ✅ Core flows: views, share tokens/passwords, GitHub import, AI enrichment (optional), admin CRUD, public pages, print stylesheet. - ✅ View editor with overrides/reordering; per-view theming; accent colors; media library with orphan detection and cleanup. - ✅ Media optimization (thumb/srcset) live on posts/projects/homepage; view membership badges in admin lists. - ✅ External media embeds complete: uploads, external links, public rendering on projects/posts/talks, bulk delete. - ✅ SEO & Error UX complete: custom 404/500 pages, canonical URLs, comprehensive Open Graph/Twitter Cards, JSON-LD, sitemap, robots.txt. - ✅ E2E Testing: Playwright test suite with 100% pass rate on public tests (12/12), 25+ total tests covering public APIs, SEO, error pages, media, admin flows, security (96% overall pass rate). - ✅ Security review complete: Full security review completed with all identified issues addressed. - ✅ Critical security fixes: XSS prevention (DOMPurify sanitization) and path traversal protection (11-layer validation with symlink detection) implemented and tested. - ✅ Contact protection & social links (Phase 11): Complete with contact_methods collection, admin CRUD, per-view visibility, and 4-tier protection levels. - ✅ AI Writing Assistant (Phase 12): Complete with 5 tone options, critique mode, mobile-responsive, integrated across all content forms. - ✅ AI Resume Generation (Phase 4): Complete with PDF/DOCX export, multiple formats/styles, AI provider integration. - ✅ README rewrite: Comprehensive, user-focused documentation for visitors, site owners, and developers with security highlights and accurate feature descriptions. - ✅ docker-compose.yml enhancement: Extensively commented with Unraid-specific guidance, troubleshooting, and backup instructions. - ✅ **Demo Mode (Phase 10):** Demo toggle in admin panel with The Doctor's hilarious profile showcasing all features. Data backup/restore when toggling on/off. - ✅ **Demo Media System (Phase 14):** Profile avatar, project covers, and blog post covers with professional SVG graphics (60KB total). Demo mode now visually complete. - ✅ **First-Run Experience (Phase 13):** Welcome page, feature highlights, demo integration, Unraid Community Apps template, comprehensive SETUP.md. - ✅ **Resume Upload & AI Parsing (Phase 15):** Upload PDF/DOCX resumes, AI extraction to Facet data, smart deduplication, file storage with hash-based duplicate prevention. - ✅ **Admin UX Overhaul (Phase 16):** Accessible confirm dialogs, bulk operations across all content types, improved navigation, visibility badges. - ✅ **Bulk Operations:** Select multiple items → change visibility, delete in bulk. Available on projects, posts, talks, experience, education, skills, certifications, awards. - ✅ **Custom Domain Support:** Self-hosted architecture supports any domain via reverse proxy (Nginx, Traefik, Cloudflare Tunnel, etc.). - ✅ **Mobile UX Overhaul (Phase 16.5):** Complete responsive redesign of admin panel - overlay sidebar, touch targets, bottom sheet modals, form stacking, overflow prevention. - ✅ **UX Improvements (Phase 17.1-17.2):** Setup Wizard for new users, Contextual Help on all admin pages. - ✅ **Quick Share to Social (Phase 18.1):** Native Web Share API with social platform fallbacks (LinkedIn, Twitter/X, Reddit, Email). - ✅ **Testimonials System (Phase 20.1):** Complete social proof collection with request links, approval workflow, email verification, and public display. - ✅ **Version Update Notifications:** Admin panel shows badge when newer version available (checks GitHub releases daily). - ✅ **Custom Content Sections:** User-defined content blocks with Markdown support. - ✅ **Automated Changelog Generation:** AI-powered changelog from PR descriptions on release. - ✅ **TOTP Two-Factor Authentication:** Optional 2FA using any authenticator app. Recovery codes, CLI reset, 24-hour sessions. - ✅ **Email Notification System:** SMTP-based admin notifications on testimonial submissions with i18n support (5 locales). Email verification for testimonial submitters. - ✅ **Admin Settings Refactor:** Settings page split into Account, Site Settings (with SMTP config), and Integrations sub-pages. - ✅ **Developer Platform (Phase 19):** Public REST API (`/api/v1/*`) with scoped keys, webhooks (HMAC, SSRF, retry/auto-disable, delivery log, test event picker). - ✅ **Newsletter, Comments, System Alerts, Multi-language UI:** Multi-list newsletter with compose UI, threaded comments with moderation, operator alerts inbox, 5-locale UI with CI parity. - 🔜 **Next Up:** Phase 18.2 View Analytics Dashboard, Phase 18.3 QR Codes, CAPTCHA contact protection, scheduled GitHub sync. --- ## Phase 0: Foundation Stabilization (✅ Complete) **Purpose:** Solid, secure base. - Core routing: `/`, `/[slug]`, `/s/` - Views with visibility controls; share tokens; password-protected views (JWT) - GitHub import pipeline; optional AI enrichment - Admin dashboard CRUD for profile, experience, projects, education, skills, posts, talks, certs, awards - Rate limiting on sensitive endpoints; reserved slug protection ## Phase 1: Content Completeness (✅ Complete) **Purpose:** All core content types with public pages. - Projects detail `/projects/` (meta tags, media gallery) - Posts/blog `/posts/` (markdown, tags, prev/next, cover) - Talks section (public display, embeds, slides) - Certifications (issuer grouping, expiry badges) ## Phase 1.5: Discovery & Navigation (✅ Complete) **Purpose:** Make content discoverable. - Index pages `/posts`, `/talks`; profile nav tabs - Slugs and detail routes for posts/talks; back-navigation fixes - Open Graph/SEO basics for content pages ## Phase 2: View System Enhancement (✅ Complete) **Purpose:** Powerful, curated views. - View editor create/edit pages; per-section toggles and item selection - Drag/drop section & item reordering; overrides per item; hero/CTA overrides - Default view management; per-view theming/accent color; preview pane - Minimal analytics (view count, last accessed) ## Phase 3: Share Token Management (✅ Complete) - `/admin/tokens` full CRUD with usage stats, status badges, copy URL - Visibility and draft filters respected on shared views ## Phase 4: Export & Print System (✅ Complete) - ✅ Print stylesheet + print button on public views - ✅ JSON/YAML export endpoint `/api/export` (admin) - ✅ AI print/resume generation: Full implementation with PDF/DOCX output, multiple styles, AI provider integration - Backend: `/api/view/{slug}/generate` endpoint - Frontend: AI Resume modal with format/style/length options - Streaming support and error handling - Works with OpenAI, Anthropic, and Ollama ## Phase 5: Import System Expansion (🟡 Partial) - ✅ GitHub import proposals/review flow - ✅ Resume upload & AI parsing (PDF/DOCX to Facet data) - 🔜 Scheduled/cron refresh: planned - 🔜 Additional sources: LinkedIn, JSON Resume (deferred - see "Tracking Upstream Dependencies") ## Phase 6: Visual Layout & Theming (✅ Complete) - Admin sidebar grouped with categories/collapse - Accent color system with curated palette; per-view overrides - Custom CSS support; live preview in settings - View previews in editor ## Phase 7: Media Management (✅ Complete) - 7.1 Media library: ✅ `/admin/media` listing, filters, search, delete; orphan detection - 7.2 Image optimization: ✅ thumbnails + responsive srcsets for posts/projects/homepage - 7.3 Cleanup UX: ✅ orphan detection + storage usage stats + bulk delete endpoint - 7.4 External media: ✅ link-based entries (URL/title/mime/thumbnail) listed alongside uploads; deletion supported; media_refs on projects/posts/talks - 7.5 Public rendering: ✅ Projects, Posts, and Talks pages render media_refs (YouTube, Vimeo, images, videos, link cards) - 7.6 Upload mirroring: ✅ Uploaded files automatically mirrored to external_media for unified media_refs - ℹ️ Media stability note: `/api/media` depends on file fields + `external_media`; run migrations or reseed (`rm -rf pb_data && SEED_DATA=dev make seed-dev`) after schema changes; see docs/MEDIA.md for details. ## Phase 8: Security & Hardening (✅ Complete) - ✅ **Security Review Complete** - Full security review completed with all critical issues addressed - ✅ **XSS Prevention** - DOMPurify sanitization with iframe whitelisting implemented and tested - ✅ **Path Traversal Protection** - Complete rewrite with 11-layer validation, symlink detection, defense-in-depth - ✅ **Security Test Suite** - Comprehensive tests for XSS, path traversal, input validation (tests/security.spec.ts) - ✅ **Password Security** - First-time password change enforcement, CLI reset tool, bcrypt validation - ✅ HTTPS enforcement check (warns in production) - ✅ **Security Headers** - Comprehensive headers implemented via Caddy (docker/Caddyfile) and PocketBase built-in middleware - ✅ **HTTP Timeouts** - All AI and GitHub API calls have proper timeouts (30-120s) - ✅ **Rate Limiting** - Proper mutex synchronization, no race conditions - ✅ **File Validation** - 5MB limits with MIME type validation - ✅ **SQL Injection Protection** - All queries use parameterized filters (`{:slug}`, `{:id}`) ## Phase 9: Polish & Performance (✅ Complete) - ✅ SEO: JSON-LD, sitemap, robots.txt, canonical URLs, Open Graph/Twitter Cards - ✅ Error UX: custom 404/500 with self-deprecating humor and SVG illustrations - ✅ Dark mode: 1000+ dark mode classes for comprehensive theming - ✅ Responsive design: Mobile-first with 124 breakpoint usages - ✅ Accessibility: 195 aria/role attributes across components ## Phase 10: Demo & Showcase Mode (✅ Complete) **Purpose:** One-click demo showing all Facet features with hilarious content. **Implemented:** - ✅ **The Doctor's Profile:** Laugh-out-loud funny demo showcasing EVERY feature - ✅ **One-Click Demo Toggle:** In admin header, toggle on/off instantly - ✅ **Data Preservation:** Original data backed up and restored when demo disabled - ✅ **Feature Showcase:** All content types, views, visibility levels, theming See [backend/hooks/demo.go](../backend/hooks/demo.go) and [AdminHeader.svelte](../frontend/src/components/admin/AdminHeader.svelte). --- ## Phase 11: Contact Protection & Social Links (✅ Complete) **Purpose:** Granular per-view contact control with anti-scraping protection - ✅ Create `contact_methods` collection with view-specific visibility - ✅ Implement CSS obfuscation and click-to-reveal components - ✅ Contact methods admin page with full CRUD - ✅ Per-view visibility controls - ✅ Protection level selector (none/obfuscation/click-to-reveal/captcha) - ✅ Public rendering in views with ContactMethodsList component See [CONTACT_PROTECTION.md](CONTACT_PROTECTION.md) for complete spec. --- ## Phase 12: AI Writing Assistant (✅ Complete) **Purpose:** Intelligent content rewriting and feedback across all text fields - ✅ **Multi-tone rewriting:** Executive, Professional, Technical, Conversational, Creative - ✅ **Critique mode:** Inline feedback with [bracketed suggestions] - ✅ **Anti-AI guidelines:** Strict rules to avoid AI-sounding language - ✅ **Integrated everywhere:** Experience, Projects, Profile, Education, Posts, Talks - ✅ **Mobile-responsive:** Optimized for all screen sizes - ✅ **Context-aware:** Uses form fields for better results See [AI_WRITING_ASSISTANT.md](AI_WRITING_ASSISTANT.md) for complete documentation. --- ## Phase 13: First-Run Experience & Unraid Support (✅ Complete) **Purpose:** Make installation and onboarding seamless for all users. - ✅ Welcome screen when no profile exists - ✅ "Try Demo" button for one-click access to The Doctor's profile - ✅ Unraid Community Apps template - ✅ Comprehensive SETUP.md with Cloudflare Tunnel walkthrough --- ## Phase 14: Demo Media System (✅ Complete) **Purpose:** Add visual richness to demo mode with images and media - ✅ Demo Assets Directory with themed SVG graphics (60KB total) - ✅ Profile avatar, project covers, blog post covers - ✅ Automatic cleanup when demo disabled --- ## Phase 15: Resume Upload & AI Parsing (✅ Complete) **Purpose:** Upload existing resumes and automatically populate Facet profile - ✅ PDF/DOCX parsing with AI extraction - ✅ Smart deduplication system - ✅ File storage and tracking --- ## Phase 16: Admin UX Overhaul (✅ Complete) **Purpose:** Improve admin experience with modern, accessible UI patterns **Completed:** - ✅ **Accessible Confirm Dialogs** - Replaced native `confirm()` with styled, accessible modal dialogs - ✅ **Bulk Operations** - Select multiple items, change visibility, bulk delete across 8 content types - ✅ **Visibility Badges** - Clear indicators showing public/unlisted/private status in admin lists - ✅ **Improved Navigation** - Better admin menu structure and organization - ✅ **Dialog System** - Consistent modal patterns across the app - ✅ **View Hero Images** - Fixed display issues in admin and demo mode **Bug Status (Previously Listed as Phase 16):** The original Phase 16 bug list has been verified - most items were already fixed: - ✅ HTTP timeouts - Configured (30-120s on all external calls) - ✅ Race conditions - Proper mutex usage in rate limiting - ✅ File validation - 5MB limits with MIME type checks - ✅ SQL injection - Parameterized queries throughout - ✅ Error handling - All Save() calls checked (except 1 non-critical stat update) - ⚠️ Slug uniqueness - DB enforces via unique index, but no suffix on collision (minor) --- ## Phase 16.5: Mobile UX Overhaul (✅ Complete) **Purpose:** Make the admin panel fully responsive and touch-friendly on mobile devices. **Implemented:** - ✅ **Overlay Sidebar:** Converts to drawer overlay on mobile (<1024px), hidden by default, closes on navigation - ✅ **Touch Targets:** All buttons meet 44px minimum touch target size per Apple/Google guidelines - ✅ **Form Stacking:** Link inputs and form groups stack vertically on mobile - ✅ **View Editor Redesign:** Simplified headers, larger drag handles, collapsible preview, reduced padding - ✅ **Bottom Sheet Modals:** ConfirmDialog and PasswordChangeModal use native-feeling bottom sheets on mobile - ✅ **Overflow Prevention:** Multi-layer defense with overflow-x: hidden on html/body, min-w-0 on flex items - ✅ **Responsive Grids:** All grid-cols-2 converted to grid-cols-1 sm:grid-cols-2 **Files Modified:** - `admin/+layout.svelte` - Mobile detection, sidebar overlay logic - `AdminSidebar.svelte` - Overlay mode with z-index layering - `ConfirmDialog.svelte`, `PasswordChangeModal.svelte` - Bottom sheet pattern - `views/[id]/+page.svelte`, `views/new/+page.svelte` - Mobile-optimized view editor - 10+ admin pages - Touch targets, form stacking, responsive grids - `app.css`, `app.html` - Global overflow prevention *Mobile UX improvements are now fully implemented.* --- ## Phase 17: UX Improvements (✅ Complete) **Purpose:** Make Facet easier to understand and use ### 17.1 Guided Setup Wizard (✅ Complete) **Priority:** High | **Effort:** Medium First-time users get a 3-step wizard instead of facing 22 admin pages: - Step 1: Basic profile (name, headline, summary) - Step 2: Create first facet from templates (Recruiter, Portfolio, Consulting, Speaker) - Step 3: Review and launch **Features:** - Auto-opens for new users (missing profile data or no views) - Respects password change flow (waits until complete) - Sidebar auto-refreshes when facet created - Skip option with permanent dismissal (localStorage) - Never shows in demo mode **Files:** - `frontend/src/lib/stores/setupWizard.ts` - State management, templates - `frontend/src/components/admin/SetupWizard.svelte` - Main modal - `frontend/src/components/admin/wizard/Step*.svelte` - Step components - `frontend/src/routes/admin/+layout.svelte` - Integration ### 17.2 Contextual Help on Admin Pages (✅ Complete) **Priority:** High | **Effort:** Low Each admin page now has a collapsible help section explaining: - What the page does - Why users would use it - How it connects to views/facets **Features:** - Collapsible `PageHelp` component with localStorage persistence - Contextual tips for all 16 admin pages - "Learn more" links to documentation where applicable **Files:** - `frontend/src/components/admin/PageHelp.svelte` - Reusable component - All admin pages updated with contextual help --- ## Phase 18: Sharing & Analytics (🟡 In Progress) **Purpose:** Make sharing easier and provide insight into profile views ### 18.1 Quick Share to Social (✅ Complete) **Priority:** High | **Effort:** Low One-click sharing to major platforms with native OS integration. **Implementation:** - `frontend/src/lib/share.ts` - Share utility with Web Share API detection - `frontend/src/components/shared/ShareButton.svelte` - Reusable component **Features:** - **Web Share API** - Native sharing on mobile/Chrome/Safari (75% browser support) - **Fallback dropdown** - Copy Link, LinkedIn, Twitter/X, Reddit, Email - **Share token URLs** - When viewing via `/s/[token]`, shares the token URL - **Unlisted warning** - Shows "This view is unlisted. Share links may expire." - **Accessibility** - 44px touch targets, keyboard navigation, ARIA labels - **Copy feedback** - "Copied!" indicator for 1.5 seconds **Share URL formats:** - LinkedIn: `https://www.linkedin.com/sharing/share-offsite/?url={url}` - Twitter: `https://twitter.com/intent/tweet?url={url}&text={title}` - Reddit: `https://reddit.com/submit?url={url}&title={title}` - Email: `mailto:?subject={title}&body={text}%0A%0A{url}` **Where it shows:** - View pages (`/[slug]`) - Always visible - Post pages (`/posts/[slug]`) - Only if `visibility === 'public'` - Project pages (`/projects/[slug]`) - Only if `visibility === 'public'` - Talk pages (`/talks/[slug]`) - Only if `visibility === 'public'` **Platform decisions:** - ✅ Copy Link (primary, always visible) - ✅ LinkedIn (professional network) - ✅ Twitter/X (tech community) - ✅ Reddit (communities) - ✅ Email (universal) - ❌ Facebook (broken on iOS Safari) - ❌ Bluesky (niche, user preference) - ❌ Instagram (no web share URL) ### 18.2 View Analytics Dashboard **Priority:** High | **Effort:** Medium The data already exists (`use_count`, `last_used_at`). Surface it! **Implementation:** - New page: `/admin/analytics` - Dashboard showing: - Total views per view (bar chart) - Share token usage stats - Most viewed content - Recent activity timeline - Use existing PocketBase data, no external tracking - Privacy-respecting: all data stays local **Backend:** - New endpoint: `GET /api/analytics/summary` - Aggregates from views, share_tokens, and minimal access logs ### 18.3 QR Code for Views **Priority:** Medium | **Effort:** Low Generate QR codes for any view or share link. **Implementation:** - Use `qrcode` npm package (lightweight, no external deps) - Add "QR Code" button next to share link - Modal shows: - QR code image (SVG) - Download as PNG button - Print button **Use cases:** - Business cards - Conference badges - Print resumes with QR linking to full profile --- ## Phase 19: Developer Platform (✅ Complete) **Purpose:** Enable integrations and extensibility ### 19.1 Webhooks (✅ Complete) **Priority:** Medium | **Effort:** Medium Notify external services when events occur. **Implemented:** - ✅ `webhooks` collection (url, events[], secret, active) with admin CRUD - ✅ HMAC-SHA256 signing of every delivery for verification - ✅ SSRF protection (rejects private/loopback/link-local/CGNAT/metadata IPs) - ✅ Retry with auto-disable after repeated failures; per-delivery log - ✅ Dispatch test event picker (fire synthetic payloads to matching subscribers) **Payload example:** ```json { "event": "view.accessed", "timestamp": "2026-01-17T14:30:00Z", "data": { "view_slug": "recruiter", "referrer": "linkedin.com" } } ``` ### 19.2 Public REST API (✅ Complete) **Priority:** Medium | **Effort:** Medium Documented REST API for integrations under `/api/v1/*`. **Implemented:** - ✅ Read endpoints for views, posts, projects, and profile - ✅ Write endpoints for managed content - ✅ Scoped API keys (`read:*` / `write:*`), stored as SHA-256 hash - ✅ Rate limiting for API access ### 19.3 Offline PWA Support **Priority:** Low | **Effort:** High Make admin dashboard work offline. **Implementation:** - Service worker for caching - IndexedDB for offline data storage - Queue mutations when offline - Sync when back online - Show "offline" indicator **Scope:** - Admin dashboard (view/edit content offline) - Public pages (view cached profiles) - Exclude: AI features, GitHub import --- ## Phase 20: Social Proof & Networking (🟡 In Progress) **Purpose:** Build credibility through endorsements and easy application ### 20.1 Testimonials System (✅ Complete) **Priority:** High | **Effort:** High Collect and display social proof from clients, colleagues, and collaborators. **How it works:** 1. Owner generates request link with optional custom message 2. Link goes to public form: name, title, company, relationship, testimonial 3. Submission stored as "pending" for owner review 4. Owner approves/rejects in admin dashboard 5. Approved testimonials appear on designated views 6. Optional email verification for added credibility 7. Admin notification email sent when new testimonials are submitted (SMTP required) **Implementation:** **Backend:** - Collections: `testimonials`, `testimonial_requests`, `email_verification_tokens` - Service: `services/testimonial.go` - Token generation, HMAC validation - Service: `services/email.go` - Admin notification & verification email templates - Service: `services/email_i18n.go` - Email translations (en, de, elvish, klingon, lolcat) - Hooks: `hooks/testimonials.go` - 14 API endpoints (700+ lines) - Hooks: `hooks/smtp.go` - SMTP settings API (GET/PUT/test) - Migrations: Schema creation + access rules **API Endpoints:** | Method | Endpoint | Auth | Description | |--------|----------|------|-------------| | POST | `/api/testimonials/requests` | Yes | Create request link | | GET | `/api/testimonials/requests` | Yes | List request links | | DELETE | `/api/testimonials/requests/{id}` | Yes | Delete request link | | GET | `/api/testimonials/request/{token}` | No | Validate token (public) | | POST | `/api/testimonials/submit` | No | Submit testimonial (public) | | GET | `/api/testimonials` | Yes | List testimonials | | POST | `/api/testimonials/{id}/approve` | Yes | Approve testimonial | | POST | `/api/testimonials/{id}/reject` | Yes | Reject testimonial | | PATCH | `/api/testimonials/{id}` | Yes | Update testimonial | | DELETE | `/api/testimonials/{id}` | Yes | Delete testimonial | | GET | `/api/testimonials/pending-count` | Yes | Get pending count | | GET | `/api/public/testimonials` | No | Public approved list | | POST | `/api/testimonials/verify/email` | No | Send verification | | GET | `/api/testimonials/verify/email/{token}` | No | Complete verification | **Frontend:** - `/testimonial/[token]` - Public submission form - `/testimonial/verify/[token]` - Email verification page - `/admin/testimonials` - Manage testimonials (approve, reject, feature) - `/admin/testimonials/requests` - Manage request links - `TestimonialsSection.svelte` - Public display (wall, carousel, featured layouts) - Collapsible "Testimonials" section in admin sidebar with pending count badge **Security:** - HMAC-SHA256 hashed tokens (raw tokens never stored) - Rate limiting on public submission endpoints - Email verification tokens expire after 15 minutes - Request links support expiration dates and max uses - No account required for testimonial submitters - Admin notifications sent via SafeGo (goroutine with panic recovery) - Verification emails use resolveBaseURL() for correct link generation behind reverse proxies ### 20.2 "Apply with Facet" Button **Priority:** Medium | **Effort:** Very High Enable one-click job applications using Facet profile. **The Challenge:** This requires the *receiving* side (employers) to integrate. Two approaches: **Approach A: Embeddable Widget (Simpler)** ```html Apply with Facet ``` When clicked: 1. Applicant lands on their Facet instance 2. Selects which view to share 3. Facet generates a time-limited share link 4. Emails the link to the employer (address in URL params) **Approach B: Facet Network (Complex)** - Central directory of Facet instances - Employers register to receive applications - OAuth handshake between instances - This is essentially building a job board **Recommended: Start with Approach A** - Zero employer integration required - Works immediately - Can evolve into Approach B later **Implementation (Approach A):** - `/apply` route that shows view selector - Email template for application - Include: view link, optional cover note, contact info - Track sent applications in new `applications` collection --- ## Cross-Cutting Backlog ### High Priority - ✅ **Guided Setup Wizard** (Phase 17.1) - Complete - ✅ **Contextual Help** (Phase 17.2) - Complete - ✅ **Quick Share to Social** (Phase 18.1) - Complete - 🔜 **View Analytics Dashboard** (Phase 18.2) - Uses existing data ### Medium Priority - 🔜 **QR Codes** (Phase 18.3) - Quick win for sharing - 🔜 **CAPTCHA contact protection** - Cloudflare Turnstile integration - 🔜 **Scheduled GitHub sync** - Auto-refresh projects ### Lower Priority - 🔜 **Offline PWA** (Phase 19.3) - Complex, niche use case - 🔜 **Apply with Facet** (Phase 20.2) - Requires ecosystem adoption - 🔜 **Theme System** - Pre-built visual themes - 🔜 **Newsletter drip sequences** - Multi-step automated send chains - 🔜 **Full Liquid templating** - Per-subscriber newsletter personalization at send time - 🔜 **System alert emitters** - Wire into backup, SMTP, and webhook delivery failure paths - 🔜 **Content Security Policy headers** - 🔜 **Lucide icon migration** - Consolidate inline SVGs into a single icon set ### Already Complete (Removed from Backlog) - ✅ **Guided Setup Wizard** (Phase 17.1) - 3-step onboarding for new users - ✅ **Contextual Help** (Phase 17.2) - Help text on all admin pages - ✅ **Quick Share to Social** (Phase 18.1) - Native Web Share API + social fallbacks - ✅ **Testimonials System** (Phase 20.1) - Social proof collection with request links, approval workflow, email verification - ✅ **Bulk Operations** - Implemented across 8 content types - ✅ **Custom Domain** - Works via reverse proxy (self-hosted) - ✅ **Resume Upload & AI Parsing** - Both directions supported - ✅ **Admin UX** - Dialogs, navigation, visibility badges - ✅ **Webhooks** (Phase 19.1) - HMAC signing, SSRF protection, retry/auto-disable, delivery log, test event picker - ✅ **Public REST API** (Phase 19.2) - `/api/v1/*` with scoped read/write API keys - ✅ **System Alerts Inbox** - Operator-facing event log - ✅ **Newsletter** - Multi-list/segments with per-list sender + welcome email; compose UI with list picker, preview, test send - ✅ **Threaded Comments** - Moderation queue, reports, per-item enable toggle (DOMPurify-sanitized) - ✅ **Multi-language UI** - 5 locales (en/de/elvish/klingon/lolcat) with CI-enforced key parity - ✅ **External Media Expanded** - Loom, CodePen, Figma, SoundCloud, Spotify, Immich providers - ✅ **Automigrate on Boot** - Schema changes apply on pull + restart --- ## Integrations - ✅ RSS feed for posts - ✅ iCal export for talks - ✅ Google Analytics (opt-in) - ✅ GitHub import - ✅ Webhook notifications (HMAC-signed, SSRF-protected, retry/auto-disable) - ✅ Zapier/IFTTT support (via webhooks) --- ## Tracking Upstream Dependencies ### TOTP Two-Factor Authentication **Status:** ✅ Implemented (application-layer) - Implemented as an application-layer gate rather than waiting for native PocketBase TOTP - Optional opt-in from admin Settings using any TOTP authenticator app - 8 single-use recovery codes (bcrypt hashed, AES-256-GCM encrypted at rest) - 24-hour verified sessions, CLI reset for lockouts - See [SECURITY.md](SECURITY.md) for full implementation details ### Import Source Integrations - **LinkedIn:** API requires partnership (deferred) - **Credly:** No public API for individuals (deferred) - **JSON Resume:** Lower priority, resume upload covers use case --- ## Recent Changes Log ### 2026-06-23 (Developer Platform & Engagement - v2.22.1) - Completed Phase 19: Public REST API (`/api/v1/*`) with scoped (read:*/write:*) API keys stored as SHA-256 hash - Webhooks: HMAC-SHA256 signing, SSRF protection (rejects private/loopback/link-local/CGNAT/metadata IPs), retry + auto-disable, per-delivery log, dispatch test event picker - System alerts inbox (operator-facing event log) - Newsletter: multi-list/segments with per-list sender + welcome email; compose UI with list picker, preview, test send - Threaded comments with moderation queue, reports, per-item enable toggle (DOMPurify-sanitized) - Multi-language UI expanded to 5 locales (en/de/elvish/klingon/lolcat) with CI-enforced key parity (`npm run i18n:validate`) - External media expanded: Loom, CodePen, Figma, SoundCloud, Spotify, Immich providers - Automigrate on boot for self-hosted (schema changes apply on pull + restart) ### 2026-02-15 (Email Notifications & Bug Fixes - v2.18.0) - Added SMTP-based email notifications to admins when testimonials are submitted - Added email verification flow for testimonial submitters (15-minute tokens) - Added SMTP settings management page in admin UI with test email functionality - Added email i18n system (5 locales: en, de, elvish, klingon, lolcat) - Refactored admin settings into 3 sub-pages: Account, Site Settings, Integrations - Fixed notification email link bug (was using AppURL instead of request headers) - Fixed skill deduplication and mirror cleanup matching bugs - Added client-side file size validation on upload pickers - Added SafeGo utility for panic-safe background goroutines ### 2026-01-26 (Documentation & Polish - v2.8.17+) - Added version update notifications in admin sidebar and About page - Checks GitHub API for new releases (cached daily, no user tracking) - Fixed AI changelog generator to filter already-documented PRs - Backfilled CHANGELOG.md with historical releases (v2.0.0 - v2.7.6) - Added info icon for About Facet menu item - Comprehensive documentation audit and updates ### 2026-01-17 (Testimonials System - v2.5.0) - Completed Phase 20.1: Testimonials System - Request link generation with HMAC-SHA256 tokens and optional expiration - Public submission form with name, title, company, relationship, testimonial - Approval workflow: pending → approved/rejected with admin review - Email verification for credibility (15-minute expiration) - Collapsible admin sidebar section with pending count badge - Public display component with multiple layouts (wall, carousel, featured) - 14 API endpoints with comprehensive security and rate limiting ### 2026-01-17 (Quick Share to Social - v2.4.0) - Completed Phase 18.1: Quick Share to Social - Web Share API integration for native mobile/browser sharing - Fallback dropdown: Copy Link, LinkedIn, Twitter/X, Reddit, Email - Share token URL support (shares `/s/[token]` when viewing via token) - Unlisted warning banner when sharing token URLs - AI API key info added to setup wizard - Accessible: 44px touch targets, keyboard nav, ARIA labels ### 2026-01-17 (Setup Wizard - v2.3.0) - Completed Phase 17.1: Guided Setup Wizard - 3-step onboarding for new users (profile basics, first facet, launch) - 4 view templates: Recruiter, Portfolio, Consulting, Speaker - Password change flow takes priority over wizard - Sidebar auto-refreshes when wizard creates a facet ### 2026-01-17 (Contextual Help - v2.2.0) - Completed Phase 17.2: Contextual Help on Admin Pages - Added PageHelp component with localStorage persistence - All 16 admin pages now have contextual help ### 2026-01-17 (Mobile UX) - Completed Phase 16.5: Mobile UX Overhaul - Admin sidebar converts to overlay drawer on mobile - Touch targets increased to 44px minimum across all admin pages - Bottom sheet pattern for modals on mobile - View editor redesigned for mobile with collapsible preview - Multi-layer horizontal overflow prevention - Added auto-tag workflow for automatic version bumps on PR merge ### 2026-01-17 - Updated Phase 16 bug status - verified most were already fixed - Added Phase 17 (UX Improvements) with Guided Setup Wizard, Contextual Help, Better Empty States - Added Phase 18 (Sharing & Analytics) with Quick Share, Analytics Dashboard, QR Codes - Added Phase 19 (Developer Platform) with Webhooks, Public API, Offline PWA - Added Phase 20 (Social Proof) with Testimonials System, Apply with Facet - Noted Bulk Operations and Custom Domain as already complete - Reorganized Cross-Cutting Backlog by priority ### 2026-01-12 - Completed Admin UX overhaul (accessible dialogs, bulk operations, visibility badges) - Fixed view hero image display issues - Upgraded to Svelte 5 and Vite 7