Garmin in a separate service
Trade-off: Garmin offers no official access: I use an unofficial library, which I isolated from the back end. One more service to run and protect, but a fragile dependency that doesn't contaminate the rest. And when Garmin refuses the connection, the real error reaches the screen instead of a vague message.
Gemini rather than Anthropic for the AI coach
Trade-off: Gemini has a free tier, the Anthropic API doesn't: for a personal project, the choice was quick. Downside: the coach stays silent without a key, and the model name has already needed a fix.
Login lockout by email and by IP
Trade-off: A stranger can't lock my account from their own machine. Downside: the counter lives in memory, resets to zero on restart and isn't shared across instances.