Falar: one product, three architectures
Three repositories, one Brazilian Portuguese learning app, and one shared idea behind all of them.
Shared domain rules
Review scoring and the mastery model. The same ideas, implemented three ways.
- DesktopIn progressportuguese-learningEvent-sourced, so every review and mistake is kept as history.Electron, React, PostgreSQL
- MobileEarly stagefalar-portuguese-mobileRuns on fake repositories until the API is deployed.Flutter, Riverpod
- APIEarly stagefalar-portuguese-mobile-backendA modular monolith that stores current state, not history.Apollo Server, PostgreSQL
Desktop persists domain events directly. Mobile will consume the same rules over GraphQL once the backend is deployed.
Why build the same product three different ways?
The desktop app is where the main learning logic lives. It keeps track of every review and mistake instead of just replacing the old data. Things like how a review session works and how mastery is calculated are the core ideas being shared across the project — not the actual code.
The mobile app and backend follow those same ideas but are built differently for what they need. The backend uses GraphQL, while the mobile app works like any other client and starts with fake data until the real backend is available.
The architecture isn't exactly the same across all three, and that's intentional. The desktop app uses event sourcing because keeping the history of a learner's progress is useful. The backend just stores the current state because it mainly needs to answer what's true right now.
Same core ideas, different implementations — using the architecture that makes the most sense for each project.
Portuguese Learning
In progressA desktop Brazilian Portuguese learning app with an event-sourced domain, built to be the reference architecture for a three-platform system.
Falar (Mobile)
Early stageA Flutter client for the same Portuguese-learning product, running today on in-memory fake repositories pending the live backend.
Falar Backend
Early stageThe GraphQL service the mobile client will run against once deployed — a modular monolith with domain/application/infrastructure separation per module.
Each repository is public: portuguese-learning (opens in a new tab), falar-portuguese-mobile-backend (opens in a new tab), falar-portuguese-mobile (opens in a new tab).