A working GitHub Actions deploy pipeline for BotWhy — reached via a long, visible trail of small failed commits over about a week: SSH connection failures, Docker build errors, `git pull` conflicts, React build issues, each fixed one at a time until the pipeline finally ran clean.
Forgot-password flow for Apercu's admin accounts, plus the email delivery path that sends the reset link.
A separate marketing front, `first-look`, sitting alongside the main app: a Service section, a Pricing section, and three service tiers (Basic, Intermediate, Advanced) each with their own page — all fully bilingual via `react-i18next`, with complete English and French translation files.
Moved Apercu's frontend off Create React App onto Vite, and renamed the project from a generic working title to Aperçu.
The founding build of BotWhy: a conversation/messages API, the first chatbox pages, request validation, a mobile-responsive layout, and the first Docker-based deployment — landing as one continuous week of work right after Google auth (and its [FedCM migration](/updates/2024-08-06-botwhy-fedcm-migration)) gave the app somewhere to attach a conversation to.
Migrated BotWhy's Google sign-in from the old Google Identity Services flow to FedCM (Federated Credential Management), the new browser-native standard for federated login.
The actual foundation of Apercu: a full rebuild in April 2024 from an earlier Create React App prototype onto Docker + React + FastAPI + MySQL, with a contact form that sends real email, an admin "agent" interface for managing the underlying data, password hashing, and a first (later superseded) forget-password flow.
The founding build of what would become x: a three-section layout, tweets (post/view), follow/following with a suggestions feed, per-tweet likes, profile editing, a seeded database for local dev, and the first Docker-based deployment — all landing as one continuous build over the project's first three weeks, alongside direct messages ([written up separately](/updates/2024-05-19-x-direct-messages)).
Direct messages between users: a `Message` model and FastAPI router (send, list by user, delete), a Messages page with a threaded `MessageList`, and a compose flow — `ComposeMessageForm` wired to the existing user search so a conversation starts by searching for someone rather than needing an existing thread first.