Projet 07 / 07 · Next.js · Capture vocale d'idées

Vocalink — dire une idée, déclencher une action

Un enregistrement vocal sur téléphone, transcrit et classé automatiquement, prêt à devenir un projet, un e-mail, un appel ou un rappel — synchronisé avec Notion et Google Tasks, avec un digest quotidien pour ne rien laisser filer.

🖥 Voir un échantillon de l'interface → ⚡ Version light
4catégories d'action routées
2synchronisations externes
1digest quotidien automatique
25tests automatisés
Avant : une idée dite à voix haute, puis oubliée avant d'être notée. Après : transcrite, classée et prête à agir en quelques secondes.
L'ampleur du chantier — mesurée sur l'historique réel du dépôt, pas une estimation
23commits
2 085lignes de TypeScript
59fichiers
5fichiers de tests
2jours de développement intensif
Genèse du projet

Diagnostic, réflexion, décision

🔍
Diagnostic
Une idée surgit souvent au pire moment pour l'écrire — en marchant, en conduisant, entre deux réunions. Le temps de sortir le téléphone et de taper une note, l'idée a perdu la moitié de sa substance, ou elle est simplement oubliée. Aucun outil du quotidien ne fait le lien entre « la dire » et « agir dessus ».
💡
Réflexion
Pas un simple mémo vocal : une page web ouverte en un geste, qui transcrit et classe automatiquement selon quatre catégories d'action (projet, e-mail, appel, rappel). Pas de PWA à installer, pas d'automatisation OAuth complexe pour l'envoi — des actions préparées, jamais déclenchées seules.
✓
Résultat
Une application déployée et utilisée au quotidien depuis un iPhone : transcription, classification, regroupement de projets, priorité et échéance, synchronisation Notion et Google Tasks, digest e-mail quotidien, authentification compatible Face ID.
Problème résolu

De l'idée dite à l'action préparée

Noter une idée à la main, c'est déjà une friction ; la retrouver ensuite dans les bonnes notes, au bon endroit, avec le bon contexte, en est une seconde. La plupart des idées perdues le sont non pas faute d'avoir été capturées, mais faute d'avoir été classées et reliées à une action concrète.

Règle 80/20 — L'humain reste le décideur
L'IA transcrit la voix et propose une classification (catégorie, titre, résumé, priorité, échéance) — rien n'est envoyé, appelé ou publié automatiquement. Un e-mail reste un brouillon mailto: à valider, un appel un lien à ouvrir, un rappel un lien calendrier à confirmer. Seules les synchronisations Notion et Google Tasks sont automatiques, et elles ne font que refléter une idée déjà relue — jamais agir à la place de l'utilisateur.
Architecture

Comment ça fonctionne

🎙️
Capture vocale, sans installation
Une page web ouverte depuis l'écran d'accueil de l'iPhone — volontairement pas une PWA, pour rester la solution la plus simple qui marche vraiment.
📝
Transcription
L'enregistrement est envoyé à l'API Whisper, qui renvoie le texte intégral — toujours affiché en clair, jamais résumé de force, pour ne jamais avoir à ré-écouter un enregistrement long.
OpenAI Whisper
🧠
Classification
Claude Haiku extrait, par appel d'outil forcé, la catégorie (projet, e-mail, appel, rappel), un titre, un résumé, des tags, une priorité et une échéance — jamais du texte libre à réinterpréter.
Claude API · Anthropic
🔀
Routage préparé, pas automatisé
Selon la catégorie : un brouillon d'e-mail (mailto:), un lien d'appel, un lien calendrier avec échéance, ou un rattachement à un projet existant — toujours une action à valider, jamais un envoi silencieux.
🔄
Synchronisation externe
Les idées de catégorie Projet se créent dans Notion ; toutes les idées se synchronisent dans Google Tasks (coché/décoché selon le statut) ; un digest e-mail quotidien signale les idées en attente depuis plus de 3 jours.
Notion API · Google Tasks API · Resend
Fonctionnalités

Ce que couvre l'outil

🗂️
Regroupement de projets
Une idée peut être rattachée manuellement à une autre comme sous-idée d'un même projet, avec garde-fou anti-cycle.
⏱️
Priorité et échéance
Un champ de date/heure universel, résolu explicitement en fuseau Europe/Paris quelle que soit la localisation du serveur.
🔍
Recherche et filtres
Recherche texte et filtres combinés par catégorie, statut et priorité sur la liste complète des idées.
📧
Digest quotidien
Un e-mail chaque matin liste les idées en attente depuis plus de 3 jours, triées par priorité puis ancienneté.
🔊
Confirmation vocale
Le résumé généré peut être écouté en synthèse vocale, pour confirmer une idée sans avoir à tout relire à l'écran.
🔐
Authentification Face ID
Formulaire de connexion avec cookie de session, compatible autoremplissage et Face ID — pas de popup Basic Auth natif.
Défis techniques

Les vrais problèmes à résoudre

Prisma introuvable en production, alors que le fichier existait
Après déploiement sur Vercel, PrismaClientInitializationError persistant malgré un moteur bien présent dans le bundle. Cause réelle trouvée après plusieurs fausses pistes : le nouveau générateur ESM prisma-client avec un chemin de sortie personnalisé cherchait le fichier à un chemin légèrement décalé sous Turbopack. Résolu en repassant au générateur classique prisma-client-js, chemin par défaut.
Une échéance décalée de deux heures en production
Une échéance saisie « 11h » s'enregistrait comme 11h UTC au lieu de 11h Europe/Paris, car new Date() interprète une chaîne naïve dans le fuseau du serveur — UTC sur Vercel. Corrigé avec date-fns-tz et deux tests de non-régression reproduisant explicitement le scénario CET/CEST.
Le popup d'authentification natif bloquait Face ID
La protection par mot de passe initiale (HTTP Basic Auth) ouvre un popup natif du navigateur qui ne s'intègre à aucun gestionnaire de mots de passe — confirmé en testant en vrai sur iPhone : aucune proposition d'autoremplissage, aucun déclenchement de Face ID. Remplacé par un vrai formulaire HTML avec autoComplete="current-password" et un cookie de session.
Autoriser Google Tasks sans exposer de connexion interactive
Contrairement à Notion ou Resend (clé API simple), Google Tasks impose un vrai flux OAuth. Pour une app mono-utilisateur, un script d'autorisation lancé une seule fois, en local, produit un refresh token stocké comme n'importe quel autre secret — l'application déployée ne fait ensuite que des échanges silencieux, sans jamais rouvrir de connexion interactive.
Stack technique

Technologies utilisées

CatégorieOutil
FrameworkNext.js 16 · App Router · Server Actions
LangageTypeScript
Base de donnéesPrisma ORM · PostgreSQL (Neon)
TranscriptionWhisper API · OpenAI
ClassificationClaude Haiku · Anthropic
IntégrationsNotion API · Google Tasks API (OAuth 2.0) · Resend
AuthentificationFormulaire + cookie de session (Web Crypto)
HébergementVercel · vocalink.northia.fr
TestsVitest — 25 tests automatisés
Résultats

Ce que ça produit concrètement

4catégories d'action routées — projet, e-mail, appel, rappel
2synchronisations externes automatiques — Notion et Google Tasks
1digest e-mail quotidien des idées oubliées depuis 3 jours
0envoi ou appel déclenché automatiquement — toujours un brouillon à valider
25tests automatisés, dont la régression du fuseau horaire
180jdurée de session avant nouvelle connexion — usage personnel quotidien
🖥 Interface — accueil et liste des idées, données de démonstration

Échantillon simplifié et stylisé (structure et couleurs fidèles, contenu allégé) — capture, liste filtrable, fiche d'idée. L'application réelle est protégée par un accès personnel. Données de démonstration, pas d'idées réelles.