Pistochia
Bientôt disponibleUne application iPhone pour les personnes avec un TDAH. Vous dites ou tapez ce que vous avez en tête, et cela revient sous forme d'étapes assez petites pour pouvoir commencer, triées selon l'énergie que vous avez ce jour-là.
- Mon rôle
- Design et développement, en solo
- Année
- 2026
- Développé avec
- Expo · React Native · SQLite · Supabase Edge Functions · Claude · Whisper · RevenueCat
Faites défiler horizontalement pour voir tout le schéma.
Le problème
Pour les personnes avec un TDAH, le plus dur est souvent de commencer, pas de se souvenir. Une application de to-do list qui stocke toute la montagne devient une liste de choses qui font culpabiliser. L'unité de travail doit rétrécir jusqu'à ce que commencer paraisse facile, et l'application doit fonctionner dès la seconde où elle s'ouvre.
Comment c'est construit
Une application Expo offline-first sur SQLite en local, avec des migrations versionnées. L'identité repose sur l'auth anonyme de Supabase, donc le premier brain dump a lieu avant tout écran d'inscription. Chaque appel à l'IA passe par une Edge Function qui fonctionne par opération : l'application envoie un nom d'opération et ses paramètres, jamais un prompt, jamais une clé. La fonction vérifie que l'opération figure dans une liste d'opérations autorisées, applique des rate limits par IP et des quotas quotidiens par installation, et dispose d'un kill switch. Claude découpe les tâches, et Whisper, derrière le même proxy, s'occupe de la voix. RevenueCat gère le paywall, et la mesure d'audience reste désactivée tant que l'utilisateur n'a pas donné son accord.
Les décisions qui ont compté
L'application ne contient aucune clé d'API
Des noms d'opérations entrent, des résultats structurés sortent. La clé d'API se trouve dans l'Edge Function, derrière un kill switch, des quotas et des limites qui bloquent en cas d'échec.
L'application fonctionne d'abord hors ligne
Les tâches sont stockées dans SQLite sur le téléphone, avec de vraies migrations. Un outil pour le TDAH qui a besoin du réseau pour afficher votre prochaine étape laisserait tomber les personnes à qui il est destiné.
Pas d'inscription avant la première utilisation
L'authentification anonyme crée une identité en silence. L'écran de compte arrive plus tard, une fois que l'application a été utile.
Code tiré du dépôt
// The legacy free-relay surface: any request still carrying these is either
// an outdated client or an abuse probe — reject outright.
const FORBIDDEN_KEYS = ['system', 'model', 'messages', 'maxTokens'] as const;1
// …
const paused = Deno.env.get('AI_PAUSED');2
if (paused === 'true' || paused === '1') {
return jsonResponse({ error: 'ai_paused' }, 503);
}
// …
for (const key of FORBIDDEN_KEYS) {
if (key in body) {
return jsonResponse({ error: 'invalid_request' }, 400);
}
}
const op = body.op;
if (typeof op !== 'string' || !(op in OPS)) {3
return jsonResponse({ error: 'invalid_op' }, 400);
}
const config = OPS[op]!;
Ligne 3. L'application ne peut envoyer ni prompt, ni modèle, ni limite de tokens. Ces réglages restent sur le serveur, et l'application peut seulement nommer une opération de la liste autorisée.
Ligne 6. AI_PAUSED est un kill switch : une seule variable d'environnement coupe toutes les dépenses d'IA sans redéploiement.
Ligne 19. Une opération inconnue est rejetée. La clé d'API n'existe nulle part dans le bundle de l'application.
Où en est le projet
Les éléments pour l'App Store, la checklist de lancement, les builds EAS, une vidéo promo et pistochia.com avec une liste d'attente sont prêts. D'abord sur iPhone. Prochaine étape : la sortie sur l'App Store.