A pass across every surface for touch, keyboard and contrast, plus fixes for figures and states that told the wrong story.
- +The app, the admin console and the public site now work on phones: a swipeable navigation drawer, a site menu, and tables that scroll instead of crushing.
- +Dates on tasks, API keys, exports and workflows follow the timezone saved in Settings.
- +The duplicates figure on the dashboard counts groups awaiting review, not records already merged.
- +Failed loads say so, with a retry, instead of looking like an empty account.
- +Text, labels and dark-mode buttons meet WCAG AA contrast; menus, dialogs and the cursor respect reduced motion.
The public site was rebuilt, and the legal documentation rewritten to be read rather than survived.
- +A new marketing site, legal library, and trust documentation.
- +Every policy reachable from one index at /legal.
- +Reduced-motion preferences now suppress smooth scrolling as well as reveal animations.
Three record types that turn a clean database into something you actually work in: tasks, tags, and scheduled workflows.
- +Tasks can be assigned against a contact, with due dates and reminder scheduling.
- +Tags and segments for slicing a contact list without exporting it first.
- +Workflows with a template gallery, so a recurring cleanup runs on a schedule instead of on a Friday afternoon.
Scheduled-export destination secrets moved from plaintext storage to application-layer encryption.
- +Destination credentials for scheduled exports are encrypted at the application layer with the configured encryption key.
- +Existing stored credentials were migrated in place; no re-entry was required.
The platform moved to Python 3.13, picking up its performance and typing improvements.
- +The backend runs on Python 3.13.9.
- +Dependency versions were realigned to stable releases across the stack.
Long-running jobs report progress in real time instead of being polled.
- +Import progress, enrichment results, and deduplication runs stream over a WebSocket.
- +Polling was removed, so a long import no longer costs a request every few seconds.
Search stopped being a filtered list and became an index.
- +Full-text search across every contact and company field, backed by Meilisearch.
- +A command palette that searches, navigates, and acts from the keyboard.
- +An advanced search page for filters that outgrow the palette.
The project shed its working name.
- +The product is now called Epafi — επαφή, Greek for "contact".
Epafi is pre-launch. This log starts where the product became recognisably itself, not at the first commit. Everything before that was a different piece of software wearing the same repository.