Changelog

What's new in Eformogi. Every release, every improvement, documented.

v38.0July 17, 2026

Signed Receipts V1 — records that prove who issued them, in your browser

Added
  • Every family's records office now has its own Ed25519 signing key. New work samples, transcripts, and course receipts carry that family's signature, and /verify checks it in the receiver's browser against the family's public key — the math answers, not our word. Key establishment is publicly witnessed in the append-only receipt log (kb_ receipts), so a swapped or backdated key would be visible to anyone.
  • Witness ceremonies are now countersigned by Eformogi's published did:web key ("Eformogi witnessed this signing at this time"), and witness facts are disclosed neutrally on receipts: signed via emailed link, signed from a different address than invited (forwarded links never break — we record and disclose), and "witness is the issuing parent" where that's the truth of homeschool life.
  • Photo evidence moved to an encrypted, content-addressed evidence store: photos encrypt in your browser under your family's vault key before upload, entries keep a kilobyte thumbnail instead of a megabyte data-URI, and the old ~15-photo device-storage ceiling is gone. Sealed receipts reference evidence by content hash (ws_ v:2); every existing receipt verifies unchanged, forever.
Improved
  • Record durability: deleting an entry now propagates across devices (encrypted tombstones — deletes win, nothing resurrects), and full work-sample detail plus Sunday-Note bodies sync encrypted into your family's own vault rows. The public ledger contract is untouched: excerpt-only for notes, surface metadata only for work samples.
  • Honest verification copy everywhere: verify pages say "recorded by Eformogi" for system receipts and "family-issued" for family artifacts, and the signature block states plainly that the signing key is held in escrow by Eformogi on the family's behalf until custody moves to families.
Infrastructure
  • Per-family keys wrap under the same envelope as the vault (zero new crypto surface); signatures bind the exact leaf bytes anchored in the RFC 6962 transparency log; signature columns live outside every frozen hash domain. An unwrappable key refuses loudly instead of self-healing — an identity break is worse than a missed signature.
  • Trust gate grew 115 → 121 checks, including frozen vectors for the kb_ and ws_ v:2 domains, no-self-heal behavior, and the no-pressure pin that keeps every witness page free of warnings.
v21.9.1May 23, 2026

D1 — V22 AI Oral Defense: demand capture at the post-seal moment

Added
  • D1 — A small interest banner now appears in the seal-success state of the work-sample share modal, immediately after a family seals a ws_<id> receipt. Banner explains the V22 ship in one sentence ("a 3-7 minute student-voice recording, hashed and cryptographically pinned to this receipt, so a receiver can verify a real human voice stands behind the claim") and offers a single CTA: "Notify me when it ships." Dismissible per-browser; submissions flow to the existing waitlist pipeline with source tag oral_defense_v22_interest.
  • D1 — Three new analytics events (oral_defense_banner_shown / _dismissed / _submitted) give us a clean numerator/denominator for the binding V22 question: at the highest-signal moment in the product, what fraction of users want a voice-pinned authenticity layer enough to leave us their email? If submitted/shown is <5% over 30 days, V22 is not the right next ship and we will reassess.
Improved
  • D1 — notify-lead.js now labels oral_defense_v22_interest leads with a distinct header marker so V22 demand signal is visible at a glance in the lead-notification email stream, not buried in generic waitlist noise.
Infrastructure
  • frontend/src/pages/timeline/OralDefenseInterestBanner.jsx — new ~250-line component with five locked constitutional refusals: (1) no vaporware action-CTA, (2) no Web Audio / MediaRecorder / getUserMedia / SpeechRecognition calls in D1, (3) per-browser localStorage dismissal that sticks, (4) source tag oral_defense_v22_interest exactly, (5) placement only inside the seal-success block. All five are pinned by tests/test-oral-defense-banner.js (11/11).
  • Trust gate: 62 → 63. Build clean in 3.20s. No backend changes; reuses /api/join-waitlist.
v21.9.0May 23, 2026

V21.9 — Kid-mode v0: the timeline learns the kid's verbs

Added
  • V21.9 — Kid-mode toggle on /app/timeline. One tap swaps the six-kind grid for verb-voice labels (Made this · Read this · Won this · Got better at · Learned from · Showed up for) and replaces the multi-field capture form with QuickCaptureModal — a six-tile picker where each tile auto-opens either the camera (project, competition) or the mic (book, course, mentor, volunteer) the moment it's tapped. Target: ≤90 seconds from cold open to first sealed receipt for an 11-year-old.
  • V21.9 — Camera capture down-scales photos to 1280px JPEG (quality 0.85) client-side before storing them in the entry's evidence_url. Voice capture uses Web Speech API (window.SpeechRecognition || webkitSpeechRecognition) with graceful degrade to type-only when unavailable. Kid never sees a date picker, a detail field, or a URL field — verb plus evidence is enough to seal a ws_.
  • V21.9 — Kid-mode preference persists per-browser via localStorage key eformogi_timeline_kid_mode. Intentional design: a shared family iPad can sit in kid-mode while a parent's laptop stays in default mode. The toggle is a UI skin, not a parallel data model.
Improved
  • V21.9 — The kind enum on disk is unchanged. Entries captured in kid-mode are byte-indistinguishable from entries captured in the parent surface: same kind values (book/project/etc.), same hash inputs, same ws_ ids. A receiver opening /verify/ws_<id> cannot tell which mode the entry was captured in — and that's the point. The trust contract belongs to the family, not the capture UI.
Infrastructure
  • frontend/src/utils/timeline.js — exports KID_KIND_LABELS alongside the existing KIND_LABELS, frozen and order-matched to KINDS.
  • frontend/src/pages/timeline/QuickCaptureModal.jsx — new ~370-line kid-first capture surface with deferred-tap auto-open, camera/mic routing, photo down-scale, voice-or-type fallback, and analytics source tag (kid_quick_capture) so we can see the funnel separately from the parent surface.
  • tests/test-kid-mode-labels.js — pins KID_KIND_LABELS in lockstep with KINDS: every kind has a kid label, no orphan keys, every kid label differs from its parent label (the toggle has visible effect), every kid label ≤24 chars (tile fits), and QuickCaptureModal TILES exhausts KINDS so a future 7th kind can't silently leave kids tile-less. 7/7 passing.
  • Trust gate: 61 → 62 every ship. Build clean in 3.50s; TimelinePage bundle grew by ~5 kB to absorb the kid-mode modal — well inside budget.
v21.8.0May 22, 2026

V21.6 → V21.8 — public ledger goes live for the trust ladder

Added
  • V21.6 — Trust-gate hardening. Promoted timeline tests to the constitutional set and added four new invariants: signed_at is metadata only (never in the att_ hash), sealEntry is deterministic for the same input, changing issuer changes the hash, and incomplete entries are rejected (no silent ghost receipts).
  • V21.7 — Per-course trust ladder lifted into the transcript. Each course on a tr_<id> family transcript now carries a tier chip (self · family · mentor · receiver) that prints on the PDF, appears in the ribbon and legend, and surfaces as a distribution badge in the receipt callout and on the verify page. Trust posture is now claim-by-claim, not document-wide.
  • V21.8 — The public ledger goes live for work samples (ws_) and attestations (att_). Sealing a work sample or signing an attestation now publishes its surface metadata to the public ledger fire-and-forget, so receivers pasting ws_<id> or att_<id> into /verify see the claim and any third-party signatures without ever touching the issuer's device.
  • V21.8 — Verify-view email loop extended to work samples. When a receiver opens /verify/ws_<id>, the issuing family receives a throttled "Someone just opened '<title>'" email — the same V21.1 receiver-side feedback loop that landed for transcripts.
  • V21.8 — Founder telemetry endpoint /api/admin-ledger-stats returns daily and lifetime counts for transcripts, work samples, attestations, receiver leads, and verify-views, plus the verify-views-per-issuance ratio. This is the only metric that proves the trust layer has receivers, not just issuers.
Improved
  • V21.7 — Trust ladder enum (self/family/mentor/receiver) locked in MASTER_PLAN Appendix B and pinned by tests/test-trust-ladder-tiers.js across builder, verify page, and master plan.
  • V21.8 — Tier distribution from V21.7 now flows to the receiver-facing verify page via the backend ledger (tier_counts column on transcript_receipts), not just the issuer's device.
  • V21.8 — Server-side att_ id is re-derived from the same canonical inputs and rejected on mismatch — an integrity check that catches client-side tampering. Orphan attestations whose parent ws_ doesn't exist are rejected at insert time.
  • V21.8 — Attestation email is hashed server-side at publish time and never persisted as plaintext.
Infrastructure
  • supabase/V21_8_WORKSAMPLE_ATTESTATIONS_LEDGER.sql — creates worksample_receipts (mirrors transcript_receipts shape), attestations (FK to ws_ with ON DELETE CASCADE, email stored as sha256 hash), and adds tier_counts jsonb to transcript_receipts.
  • api/publish-worksample.js, api/publish-attestation.js — new POST endpoints, idempotent on (id, sha256), 503 on missing table so the localStorage path remains valid.
  • api/verify-receipt.js — new ws_ and att_ branches alongside the existing tr_ branch; lookupWorkSample folds backend-stored attestations into the response so the verify page shows rung 2 without localStorage.
  • api/lib/verify-view-tracker.js — new logWorkSampleVerifyView sibling function with the same dedupe/throttle pattern as the transcript path.
  • api/lib/send-email.js — new worksample_verified template.
  • tests/test-canonicalize-parity.js — the single most important V21.8 invariant: canonicalize() output (and source) must be byte-identical between api/publish-attestation.js and frontend/src/utils/timeline.js. If they ever diverge, every signed attestation silently 400s while the frontend continues to "succeed" via localStorage. 8/8 fixtures + source-parity assertion.
  • Trust gate: 60 → 61 every ship. Build clean in 3.25s. Pre-existing component-test drift unchanged.
v21.5.1May 18, 2026

V21.2 → V21.5 — Records Office: the trust-ladder arc

Added
  • V21.2.0 — Living-record timeline at /app/timeline. Capture books, projects, courses, volunteer hours, mentor sessions, and competitions in 10 seconds. The transcript writes itself at year-end from these entries.
  • V21.3.0 — Family-sealed work-sample receipts (ws_<hash> ids). Any single timeline entry can be sealed and shared as a verifiable receipt to one admissions officer, employer, or scholarship reviewer — without exposing the rest of the record.
  • V21.4.0 — Document-drop intake. Drop a PDF or photo of a report card, certificate, syllabus, or registration confirmation; the page extracts structured fields and proposes timeline candidates the family can accept or reject. Reuses /api/extract-document; no new backend surface.
  • V21.5.0 — Trust ladder rung 2: third-party attestations (att_<hash> ids). The receiver of a work-sample receipt can sign an attestation directly on the verify page (coach, manager, mentor). The "caveat" block flips green when at least one attestation is present.
  • Live demo receipt at /verify/ws_demo_robotics — FIRST Robotics project sealed by Chen Family Records Office with an attestation from the team's lead coach. First-time visitors see "Trust ladder — rung 2 reached" without setup.
Improved
  • V21.5.1 — Launch narrative consolidation: Appendix A of the Records Office master plan now documents all six receipt prefix families (tr_, ecr_, ws_, att_, r_, uuid). State of the Product addendum dated May 18, 2026 records what the four-ship arc changes about the three audit buckets.
  • Verify page now resolves six prefix families (tr_, ecr_, ws_, att_, r_, uuid) through a single component with content-specific detail panels.
  • Social playbook now ships with a live-artifacts URL table — every post should link to a working receipt, not a homepage.
  • Beta welcome message explains the records-office update and links the demo receipt URL for receiver-side trust building.
Infrastructure
  • frontend/src/utils/timeline.js — KINDS enum, append/load/countSince/groupByKind/honestStreak, sealEntry (ws_), signAttestation (att_), loadWorkSampleReceipt(s), loadAttestationsPublic, extractedToTimelineCandidates, canonicalize, sha256Hex.
  • Hash contract locked: SHA-256 over canonical JSON (keys sorted, no whitespace). signed_at is metadata, never in the hash input — duplicate attestations by the same evaluator on the same ws_ receipt collide on id and de-dupe.
  • Attestation email is hashed (so it cannot be silently mutated by a future export/import cycle) but never rendered publicly; it exists only so the receipt issuer can independently verify the signer's identity.
  • localStorage keys: eformogi_transcript_receipts, eformogi_timeline_entries, eformogi_worksample_receipts, eformogi_attestations.
  • Tests: 18/18 timeline tests passing. Trust gate: 58/58 every ship. Zero new backend endpoints across the four-ship arc.
v18.5.0April 18, 2026

V18.5 — MCP Server & Agent Trust Layer

Added
  • MCP Server live at /api/mcp — JSON-RPC 2.0 endpoint for Claude, ChatGPT, Gemini, and any MCP-compatible client
  • Six MCP tools: read_profile, list_consents, create_consent, check_policy, log_action, search_orgs
  • Personal API Keys with per-category Agent Policy Engine — auto / ask / never across 18 data categories
  • Agent Activity Feed in Settings and the Home dashboard — every MCP call logged with timestamp, scope, and outcome
  • New /agents marketing surface explaining the trust layer for AI agents
  • "AI Agent Access" panel on the Home dashboard for one-tap key management and activity review
Improved
  • Settings → API Keys upgraded to the full AgentKeysPanel with inline per-category policy editor
  • HelpPage: new "AI Agents & MCP" FAQ category answering Claude/ChatGPT/Gemini integration questions
  • V18.5 messaging applied across LandingPage, PricingPage, InstitutionalPricingPage, SecurityPage, PrivacyPage, TermsPage, HelpPage, vertical SEO pages (Sports, Camps), DiscoverPage, ConsentPage, and outreach materials
  • Email templates (org_welcome, drip_day1, waitlist_reply, referral_followup) reframed for the AI-era trust layer
Infrastructure
  • api/mcp.js — JSON-RPC 2.0 dispatcher with tools/list, tools/call, initialize
  • api/api-keys.js — full CRUD + PATCH for agent_policy JSONB
  • shared/personalApiAuth.js — efg_ token validation, policy resolution, category scoping
  • agent_execution_trace table extended with personal columns (user_id, key_id, action_type, action_description)
  • Default policy: ssn=never, medical/insurance/financial/legal/disability/guardian/emergency/housing=ask, the rest=auto
  • X-Agent-Name header captured for per-agent attribution in the activity feed
v15.1.18March 2, 2026

Webhook Configuration

Added
  • Webhooks API at /api/webhooks — register, list, test, and delete webhook endpoints
  • Webhooks section on Settings page between API Keys and Danger Zone
  • 13 subscribable event types: vault, document, share link, credential, form, family, export, account
  • HMAC-SHA256 payload signing with whsec_ prefixed secrets
  • Test Ping button sends webhook.test event with signature verification
  • Signing secret shown once at creation with Copy button
  • Event type picker with toggle-style buttons
Improved
  • Settings page: Webhooks section with create form, event selector, webhook list
  • OpenAPI spec: /api/webhooks GET, POST, DELETE documented under Account tag
  • Developer experience: real-time event notifications for integrations
Infrastructure
  • webhooks.js: GET (list), POST (create + test), DELETE (remove)
  • HMAC-SHA256 signature via X-Eformogi-Signature header
  • X-Eformogi-Event and X-Eformogi-Delivery headers on each delivery
  • Maximum 5 webhooks per user, HTTPS URLs only
  • Test ping with 10-second timeout and failure tracking
  • Failure count tracking, last_status and last_triggered_at fields
  • Graceful table fallback for missing webhooks table (42P01)
  • Rate limited: 20 requests/min per user
v15.1.17March 2, 2026

Login History Page

Added
  • Login History API at /api/login-history — paginated sign-in event history
  • Login History page at /login-history — full authentication log with filtering
  • Summary stats: total logins, successful, failed, currently showing
  • Status filter buttons: All, Successful, Failed
  • Device info parsing: browser, OS, device type for each login
  • Authentication method detection: Password, Magic Link, Token Refresh, Password Reset
  • Pagination with Previous/Next navigation
Improved
  • Settings page: Security section now links to both Activity History and Login History
  • OpenAPI spec: /api/login-history GET documented under Account tag
  • Security transparency: users see full record of authentication attempts
Infrastructure
  • login-history.js: GET with limit/offset/status query params
  • Reads sign-in events from audit_log table with event type filtering
  • User-agent parsing for browser (Chrome/Firefox/Safari/Edge/Opera) and OS
  • IP masking for privacy (first two octets only)
  • Login status detection from event type and properties
  • Graceful table fallback for missing audit_log table (42P01)
  • Rate limited: 15 requests/min per user
  • Route: /login-history with lazy-loaded LoginHistoryPage component
v15.1.16March 2, 2026

Trusted Devices

Added
  • Trusted Devices API at /api/trusted-devices — register, list, and remove trusted devices
  • Trusted Devices section on Settings page between Active Sessions and Notification Preferences
  • Trust This Device button with optional custom device name
  • Current device detection via request fingerprinting
  • Automatic device info parsing: browser, OS, device type
  • Device expiration (default 90 days, configurable 1-365)
  • Maximum 10 trusted devices per user
Improved
  • Settings page: Trusted Devices section with device list, badges, and Remove button
  • OpenAPI spec: /api/trusted-devices GET, POST, DELETE documented under Account tag
  • Security workflow: trusted devices bypass additional verification prompts
Infrastructure
  • trusted-devices.js: GET (list), POST (register), DELETE (remove)
  • Device fingerprinting via SHA-256 hash of user-agent + accept-language
  • User-agent parsing for browser (Chrome/Firefox/Safari/Edge/Opera) and OS (macOS/Windows/Linux/Android/iOS)
  • Duplicate detection: re-trusting updates last_seen_at instead of creating duplicate
  • Graceful table fallback for missing trusted_devices table (42P01)
  • Rate limited: 20 requests/min per user
v15.1.15March 2, 2026

Data Retention Policies

Added
  • Data Retention API at /api/data-retention — configure, preview, and apply retention policies
  • Data Retention section on Settings page with per-category retention period controls
  • Four retention categories: Audit Logs, Security Events, Share Access Logs, Notifications
  • Preview Cleanup feature: see how many records would be deleted before applying
  • Apply Now button to execute retention and delete old data
  • Custom badge indicator for user-modified retention periods
Improved
  • Settings page: Data Retention section between Data & Privacy and Security Events
  • OpenAPI spec: /api/data-retention GET, PATCH, POST documented under Account tag
  • GDPR compliance: users control their own data lifecycle
Infrastructure
  • data-retention.js: GET (policies), PATCH (update), POST (preview/apply)
  • Configurable retention periods with min/max constraints per category
  • Stores custom policies in user_settings table via upsert
  • Audit trail: logs data_retention_applied events with deletion counts
  • Graceful table fallback for missing tables (42P01)
  • Rate limited: 15 requests/min per user
v15.1.14March 2, 2026

Session Management

Added
  • Session Management API at /api/sessions — list and revoke active sessions
  • Active Sessions section on Settings page showing signed-in devices
  • Device identification: browser, operating system, device type (Desktop/Mobile/Tablet)
  • Current session badge with green indicator
  • Remote session revocation — sign out other devices remotely
  • IP masking for privacy (first two octets visible)
Improved
  • Settings page: Active Sessions section between Security Events and Notification Preferences
  • OpenAPI spec: /api/sessions GET + DELETE documented under Account tag
  • Users can see all devices accessing their account and revoke suspicious sessions
Infrastructure
  • sessions.js: GET (list from audit_log sign-in events) + DELETE (revoke with audit trail)
  • User-agent parsing: Chrome, Firefox, Safari, Edge, Opera detection
  • OS detection: macOS, Windows, Linux, Android, iOS
  • Session fingerprinting by IP + user-agent combination
  • Graceful table fallback for missing audit_log table (42P01)
  • Rate limited: 15 requests/min per user
v15.1.13March 2, 2026

API Key Management

Added
  • API Key Management endpoint at /api/api-keys — generate, list, and revoke personal API keys
  • API Keys section on Settings page with key creation, preview, and revocation
  • Keys prefixed with efg_ and stored as SHA-256 hashes for security
  • Maximum 5 active keys per user with optional expiration (1–365 days)
  • One-time key display with copy-to-clipboard functionality
  • Key metadata: name, creation date, last used, expiration
Improved
  • Settings page: API Keys section between Notification Preferences and Danger Zone
  • OpenAPI spec: /api/api-keys GET, POST, DELETE documented under Account tag
  • Developers can now authenticate programmatically via personal API keys
Infrastructure
  • api-keys.js: GET (list masked), POST (create with hash), DELETE (revoke by ID)
  • Key format: efg_ prefix + 64 hex characters (32 random bytes)
  • Graceful table fallback for missing user_api_keys table (42P01)
  • Rate limited: 20 requests/min per user
v15.1.12March 2, 2026

Feedback

Added
  • Feedback API at /api/feedback — submit and manage user feedback
  • Dedicated Feedback page at /feedback with type picker (bug, feature, general, question)
  • Optional authentication — anonymous feedback submissions supported
  • Admin Feedback section in dashboard showing submissions with type/status badges
  • Summary stats: total submissions, breakdown by type and status
  • Message character count (5–5,000 characters)
  • Alternative contact section (hello@eformogi.com, security@eformogi.com)
Improved
  • Landing page footer: Feedback link added to Company column
  • OpenAPI spec: /api/feedback POST + GET documented under Account and Admin tags
  • Admin dashboard: 16 sections total with Feedback between Error Logs and Consent
Infrastructure
  • feedback.js: POST (submit, optional auth, 4 types) + GET (admin list with filters)
  • AdminFeedbackSection: decomposed admin component with refresh, table, and summary
  • Graceful table fallback: handles missing feedback table (42P01)
  • Rate limited: 10 submissions/min per IP
  • Browser metadata capture: userAgent, screenWidth, URL
v15.1.11March 2, 2026

Security Events

Added
  • Security Events API at /api/security-events — view account security activity
  • Security section on Settings page showing recent security events
  • Event types: share link access, consent changes, credential events, data exports, account activity
  • Summary stats: total events, last 24h, top event type badges
  • IP masking for privacy (first two octets visible, rest masked)
  • Human-readable event labels and category badges
Improved
  • Settings page: Security section between Data & Privacy and Notification Preferences
  • OpenAPI spec: /api/security-events GET documented under Account tag
  • Users can monitor who accessed their data and when
Infrastructure
  • security-events.js: reads from audit_log table with event labeling and IP masking
  • Event categories: access, sharing, consent, credential, export, account
  • Rate limited: 20/min per user
  • Account metadata: email, created date, last sign in, auth provider
v15.1.10March 2, 2026

Profile Completeness

Added
  • Profile Completeness API at /api/profile-completeness — vault data analysis
  • Vault Completeness section on Activity page with per-section progress bars
  • Overall completeness percentage with required vs optional field tracking
  • Actionable suggestions ranked by impact (high/medium/low)
  • 9 vault sections analyzed: identity, contact, education, medical, family, financial, activities, employment, IDs
Improved
  • Activity page: Vault Completeness section with visual progress breakdown
  • OpenAPI spec: /api/profile-completeness GET documented under Account tag
  • Users can see exactly which fields are missing and where to focus
Infrastructure
  • profile-completeness.js: server-side vault schema analysis against vault_data
  • Per-section completeness with filled/total counts and missing field lists
  • Suggestions engine: prioritizes required fields, then empty sections, then low-coverage
  • Supports personId query param for family vault multi-person analysis
v15.1.9March 2, 2026

Notification Preferences

Added
  • Notification Preferences API at /api/notification-preferences — GET + PATCH
  • Notification preferences section in Settings page with toggle switches
  • 8 notification types: share viewed, credential issued/revoked, document, form, account, system, welcome
  • Optimistic UI updates with automatic revert on failure
  • Type descriptions displayed alongside each toggle
Improved
  • Settings page: new Notification Preferences section between Data & Privacy and Danger Zone
  • OpenAPI spec: /api/notification-preferences GET + PATCH documented under Account tag
  • User control over broadcast and system notifications
Infrastructure
  • notification-preferences.js: GET (fetch merged preferences) + PATCH (update with validation)
  • Preferences stored in profiles.notification_preferences JSONB column
  • Default preferences: all notification types enabled
  • Graceful fallback if notification_preferences column not yet added
v15.1.8March 2, 2026

Admin Error Log Viewer

Added
  • Admin Error Logs API at /api/admin-error-logs — view production errors from dashboard
  • Error log viewer: filterable list with expandable stack traces and context
  • Time-range filter: last hour, 6h, 24h, 3 days, 7 days, all time
  • Error type filter: exception, unhandled rejection, network, API errors
  • Search: filter errors by message content
  • Summary stats: total errors, last 24h, last hour, type breakdown badges
Improved
  • Admin dashboard: Error Logs section with pagination and click-to-expand
  • OpenAPI spec: /api/admin-error-logs GET documented with all query params
  • Admin barrel export: AdminErrorLogsSection added
Infrastructure
  • admin-error-logs.js: GET with filtering, pagination, and summary stats
  • AdminErrorLogsSection.jsx: filters, error list, expandable detail, pagination
  • Rate limiting: 20/min per IP on error logs endpoint
  • Graceful fallback: returns empty list if error_logs table missing
v15.1.7March 2, 2026

Admin Feature Flags Management

Added
  • Admin Feature Flags API at /api/admin-feature-flags — view and toggle flags
  • Feature flags management panel: toggle switches, override status, descriptions
  • Database-backed overrides: flags persist in feature_flags table, override defaults
  • Real-time toggle: enable/disable features without code deploys
Improved
  • Admin dashboard: Feature Flags section with stats (total, enabled, disabled, overridden)
  • OpenAPI spec: /api/admin-feature-flags GET + PATCH documented under Admin tag
  • Admin barrel export: AdminFeatureFlagsSection added
Infrastructure
  • admin-feature-flags.js: GET (list all flags with metadata) + PATCH (upsert overrides)
  • AdminFeatureFlagsSection.jsx: toggle UI, override badges, last-updated timestamps
  • Rate limiting: 30/min per IP on feature flags endpoint
  • Flag validation: unknown names and non-boolean values rejected with clear errors
v15.1.6March 2, 2026

Admin Broadcast Notifications

Added
  • Admin Broadcast API at /api/admin-broadcast — send notifications to all users
  • Broadcast compose form: title, body, type selector, send button
  • Broadcast history table: past broadcasts with recipient counts and timestamps
  • Batch insert: notifications sent in groups of 100 to avoid payload limits
  • Broadcast deduplication by broadcast_id for clean history queries
Improved
  • Admin dashboard: Broadcast Notifications section integrated after User Management
  • OpenAPI spec: /api/admin-broadcast GET + POST documented under Admin tag
  • Admin barrel export: AdminBroadcastSection added
Infrastructure
  • admin-broadcast.js: GET (list broadcasts) + POST (send to all users)
  • AdminBroadcastSection.jsx: compose form, success/error feedback, history table
  • Rate limiting: 10/min per IP on broadcast endpoint
  • Broadcast ID generation for tracking and deduplication
v15.1.5March 2, 2026

Public Status Page + Admin User Management

Added
  • Public Status Page at /status — real-time service health for beta users
  • Admin User Management — paginated user list with search, drill-down detail
  • Admin Users API at /api/admin-users — user list + individual user detail
  • User detail panel: vault breakdown, credentials, shares, notifications, family members
  • Service status grid: Database, Authentication, Data Tables, AI, Payments, Monitoring
  • Auto-refresh every 60 seconds with manual refresh button
Improved
  • Admin dashboard: User Management section with click-to-expand user detail
  • Admin barrel export: AdminUserSection added to admin/index.js
  • Landing page footer: System Status link added to Product column
Infrastructure
  • admin-users.js: paginated user list (search, sort, vault/cred/share counts per user)
  • admin-users.js: single user detail (vault categories, credentials, shares, notifications, family)
  • AdminUserSection.jsx: search, pagination, expandable table rows, UserDetailPanel
  • StatusPage.jsx: fetches /api/status, StatusIndicator, 3-column detail grid
  • Rate limiting: 20/min per IP on admin-users endpoint
v15.1.4March 2, 2026

Help Center — Self-Serve Support for Beta Users

Added
  • Help Center page at /help — searchable FAQ with 6 categories and 30+ articles
  • FAQ categories: Getting Started, Your Data Vault, Privacy & Security, Sharing & Forms, Account & Billing, Troubleshooting
  • Full-text search across all FAQ questions and answers
  • Quick links grid: Install Extension, Demo Form, Export Data, Settings, Privacy Policy, Developer Docs
  • Contact section: support, bug reports, and security disclosure emails
  • Help link added to in-app header navigation
Improved
  • Landing page footer: Help Center link added to Product column
  • AssistantHeader: Help link for quick access from the vault
  • Category-based navigation with tab-style switcher
Infrastructure
  • HelpPage.jsx: expandable FAQ items, category tabs, search filter, quick links grid, contact cards
  • Lazy-loaded route at /help in main.jsx
  • Design: Blank Canvas compliant (borderRadius: 0, approved color palette)
v15.1.3March 2, 2026

Data Export — GDPR Art. 20 Portability

Added
  • Data Export page at /export — self-serve download of all personal data
  • Data Export API at /api/data-export — JSON and CSV formats
  • Exports 10 data categories: vault, documents, fills, shares, credentials, consent, audit, notifications, AI usage, family
  • Export summary: record counts for every data category after download
  • GDPR rights reference section: Articles 15, 17, 20, and 7(3) explained
  • SDK method: exportData() with format option
Improved
  • Settings page: "Export All Data (GDPR Art. 20)" link in Data & Privacy section
  • SDK expanded to 20 methods
  • OpenAPI spec updated with /api/data-export endpoint documentation
  • Protocol spec and developer docs updated
Infrastructure
  • data-export.js: 10-table parallel query with Promise.allSettled for resilience
  • DataExportPage.jsx: format picker (JSON/CSV), download trigger, export summary grid
  • Rate limiting: 5/hour per user (expensive aggregation)
  • Audit log and notification triggers on data export
v15.1.2March 2, 2026

Notification Center

Added
  • In-app Notification Center — bell icon with unread badge in header
  • Notification API at /api/notifications — GET (paginated list) and PATCH (mark read)
  • 8 notification types: share viewed, credential issued/revoked, document uploaded, form filled, account update, system, welcome
  • Real-time notification triggers on share link views, credential issuance, and credential revocation
  • Notification dropdown panel with mark-all-read and individual mark-read
  • SDK methods: getNotifications() and markNotificationsRead()
Improved
  • Share link access now notifies data owner when someone views their shared data
  • Credential issuance and revocation events generate user notifications
  • Navigation: NotificationBell integrated in both AssistantHeader and ConsolidatedDashboard
  • SDK expanded to 19 methods
  • OpenAPI spec updated with /api/notifications GET + PATCH documentation
Infrastructure
  • notifications table: RLS policies, partial index on unread, 8 enum types
  • NotificationBell.jsx: 60-second polling, outside-click-close, unread badge (9+ cap)
  • createNotification() and getUnreadCount() exported for cross-endpoint use
  • Rate limiting: 60/min per user on notification endpoints
v15.1.1March 2, 2026

Activity Dashboard, Demo Form, and User Retention

Added
  • Activity Dashboard at /activity — documents, fills, AI usage, credentials, shares, and monthly trends
  • User Activity API at /api/user-activity — comprehensive usage history with 6-month trend data
  • Demo Form page at /demo — realistic school enrollment form for testing the extension
  • Time-saved calculation — shows estimated time saved from form fills
  • Monthly trend chart — visual bar chart of document and fill activity over 6 months
  • Form fill accuracy tracking — per-fill match percentage with color-coded badges
Improved
  • Navigation: Activity link added to assistant header and consolidated dashboard
  • Install page: "Try it on our demo form" step added after install instructions
  • Landing page: Demo form link added below How It Works section
  • SDK expanded to 17 methods with getActivity()
  • OpenAPI spec updated with /api/user-activity endpoint documentation
Infrastructure
  • user-activity.js: 7-section API aggregating data across 6 tables
  • ActivityPage.jsx: responsive dashboard with KPI strip, trend chart, and data tables
  • DemoFormPage.jsx: 6-section form with standard HTML field names for extension compatibility
  • Rate limiting: 30/min per user on activity endpoint
v15.1.0March 2, 2026

Data Sovereignty and Transparency

Added
  • Audit Log API — full data access trail for every user
  • Audit Trail UI — collapsible timeline in vault profile showing who accessed your data
  • Consent History panel — view and revoke institutional data sharing
  • Consent Receipt API — Kantara-inspired machine-readable receipts
  • Admin consent pipeline — real-time consent metrics in admin dashboard
  • Admin audit trail viewer — cross-user audit event visibility for operators
  • User Settings page at /settings — account info, password management, data controls
  • Account deletion API — GDPR Art. 17 right to erasure with full data removal
  • Changelog page at /changelog
Improved
  • Audit logging integrated across all data-access endpoints
  • SDK expanded to 16 methods with getAuditLog, getConsentReceipt, and deleteAccount
  • Protocol spec now fully backed by implementation — no aspirational claims
  • Admin dashboard with consent KPIs and status breakdown
  • Navigation: Settings link in both assistant header and dashboard
Infrastructure
  • audit_log table with RLS — users see only their own access events
  • consent-queries.js extraction — clean decomposition of consent API
  • Dynamic ESM imports for audit logging in CJS endpoints
  • delete-account.js: 10-table cascading deletion with per-table error handling
  • 80+ test files covering audit trail, settings, and account deletion end-to-end
v15.0.0February 16, 2026

Horizontal Family Platform

Added
  • W3C Verifiable Credential lifecycle — issue, verify, revoke, export/import
  • Credential Wallet with JSON-LD export and cross-device import
  • FDEP Protocol Specification v1.0-draft at /.well-known/fdep-spec.json
  • Official SDK (@eformogi/sdk) with TypeScript definitions
  • DID Document with 9 service endpoints
  • OpenAPI 3.1 specification at /.well-known/openapi.json
  • JSON-LD context for semantic interoperability
  • Developer documentation page at /developers
  • Credential-backed provenance — three-tier verification badges
  • Universal rate limiting across all API endpoints
  • Service status dashboard for API health monitoring
  • Institutional API with consent flow and webhook notifications
  • Institutional lead capture pipeline with admin analytics
Improved
  • Schema v2.0 with 105 fields across 9 categories
  • Share links now include provenance metadata and credential references
  • Admin dashboard with health integration and pipeline visibility
Infrastructure
  • Vercel serverless with 38+ API endpoints
  • COPPA, FERPA, and GDPR compliance framework
  • HMAC-SHA256 webhook signature verification
v14.1.0January 15, 2026

Reliability and Moat

Added
  • PDF form filling with field-level mapping
  • Family sharing with role-based access control
  • Safari Web Extension for macOS and iOS
  • Capacitor iOS and Android native builds
  • PWA support with Add to Home Screen
  • Stripe subscription billing with webhook handler
Improved
  • Document extraction accuracy with multi-page support
  • Vault profile with collapsible categories and search
  • Performance: lazy-loaded pdf-lib (438KB deferred)
Fixed
  • IndexedDB cache invalidation on schema changes
  • Share link expiration timezone handling
  • Mobile keyboard overlap on vault edit forms
v13.0.0December 20, 2025

First Principles Rebuild

Added
  • Conversational vault interface — natural language data entry
  • Document upload with AI-powered field extraction
  • Chrome extension for auto-fill on any web form
  • Provenance tracking for every vault field
  • Share links with access codes and expiration
Improved
  • Complete UI audit — Blank Canvas design system
  • Reduced bundle size from 1.2MB to 356KB (gzipped)
  • All files decomposed to under 500 lines
Infrastructure
  • Supabase PostgreSQL with Row Level Security
  • Sentry error tracking and analytics pipeline
  • Automated test suite with 60+ test files

Want to know when we ship? Follow our progress on the developer docs or get in touch.

← Back to home