-
Notifications
You must be signed in to change notification settings - Fork 0
Design Decisions
Records what was chosen, what was discarded, and why — each decision made by the founder based on research, testing, and editorial judgment.
Decision: the primary user is someone who isn't part of the cause yet. Discarded alternative: focus on already-engaged caretakers. Reasoning: every competitor already serves that audience. The real gap is with people not yet convinced — converting an averse citizen has more impact than being the twentieth app for people who already care.
Decision: the landing page is educational, with entry cards for different user profiles. Discarded alternative: open directly on the interactive map. Reasoning: someone who's never heard of a cat colony would be lost on an empty map. The home educates before inviting action.
Decision: the product never asks for altruism. It presents facts and lets the user reach their own conclusion. Discarded alternative: emotional appeals ("save these kittens"). Reasoning: emotional appeals alienate the averse audience. Logic converts. "Removing cats doesn't work" is more powerful than "cats deserve love."
Decision: anyone can report, explore, and use the help flow without an account. Discarded alternative: require login for any action. Reasoning: urgency prevails over identification. Someone with an injured cat can't waste time creating an account. The product earns trust before asking for commitment.
Decision: reports describe situations and animals, never identify individuals. Discarded alternative: a neighbor-reporting system with identification for mistreatment. Reasoning: digital vigilantism creates more conflict than it resolves. The product never takes sides between neighbors — the correct channel for crimes is DEPREMA (181), not an app.
Decision: no rankings, no public scores, no competition between caretakers. Discarded alternative: gamification with a leaderboard and competitive badges. Reasoning: conflict between caretakers is a real problem in this ecosystem already. The product can't amplify it. Recognition exists, but it's individual, never comparative.
Decision: a colony can have any number of caretakers, all with equal standing. Discarded alternative: an "owner" role with exclusive permissions. Reasoning: real colonies are cared for by informal neighbor networks. A digital hierarchy would replicate real-world conflicts.
Decision: poisoning, abuse, and disease reports stay permanently in the timeline. Discarded alternative: auto-delete after resolution. Reasoning: incident history is evidence. Caretakers need to know what happened at that location before.
Decision: 3 precision levels — anonymous (~500m), authenticated (~100m), linked caretaker (exact via RPC). Discarded alternative: exact public location to make visiting easier. Reasoning: real cases of cats poisoned after locations were shared online. Animal safety is a design decision, not just data privacy.
Decision: there's no shareable public URL exposing a colony's location directly. Discarded alternative: a "share on WhatsApp" button with a direct link. Reasoning: even with blur, direct link access lowers the barrier for malicious users. Map navigation already provides enough context.
Decision: max 10 reports/hour per IP without login, 30/hour with login. Discarded alternative: no limit, or requiring login for any report. Reasoning: with no limit the system is vulnerable to spam and fake coordinates. With mandatory login, the immediate-emergency action is lost.
Decision: reports auto-resolve when 3 distinct users confirm them. Discarded alternative: manual resolution by caretakers only. Reasoning: distributes responsibility, prevents one person hiding a report, and builds trust in the system. The same pattern was later reused for colony verification and the 3-false-pin-flag ban system.
Decision: PostgreSQL with native Row Level Security. Reasoning: RLS is auditable, SQL is standard, integrated storage eliminates an extra service, and the visual editor makes populating field data easy.
Decision: open-source map with OpenStreetMap tiles. Reasoning: no API key, no cost, no request limits. OSM data is reliable and community-maintained.
Decision: a simple LanguageContext with two translation files.
Reasoning: no locale-based routing needed (avoids /pt/ and /en/ URLs). Preference saved to localStorage. Less dependency, same result.
Decision: a progressive educational guide with its own slugs and SEO. Reasoning: an FAQ is passive. Articles with titles written for search intent ("How to get rid of stray cats" instead of "Why TNR works") capture search intent and convert on arrival.
Decision: no right or wrong answer. 3 result profiles based on motivation. Discarded alternative: a "did you know?" quiz with scoring. Reasoning: a knowledge quiz judges the user. A personalization quiz values who they are and offers a tailored path.
Decision: the animated character shows fun trivia, never statistics.
Reasoning: serious data already lives in the fact chips and on /impact. The assistant is the moment of lightness and delight — mixing the two would dilute both.