Vigie

juillet 20268 min de lectureEn cours

Pendant longtemps, ma vie tenait dans dix endroits qui ne se parlaient pas. Les notes dans une app, l'agenda dans une autre, les tâches dans une troisième, les rappels dans le téléphone, et le reste, ce à quoi je pensais en marchant, nulle part. Chaque outil faisait correctement son travail. Aucun ne savait ce que faisaient les autres. La question qui a lancé le projet n'était pas « quel outil me manque », c'était : pourquoi est-ce que personne ne peut me dire ce qui s'est passé la semaine dernière sans que j'aille le reconstituer à la main dans quatre applications ?

Vigie est ma réponse. C'est un site privé, mono-utilisateur, qui tourne sur mon propre serveur et qui n'a ni page d'inscription, ni deuxième compte. Il regroupe le journal et le suivi personnel, l'agenda, les tâches, les rappels et le suivi professionnel, dans une seule base sur laquelle je peux poser une question transversale.

Une journée avec Vigie

Le matin, je reçois une notification : ce qui s'est passé la veille, ce que j'ai au programme aujourd'hui, les tâches en retard. C'est le point de départ de la journée, et c'est souvent le seul moment où je lis Vigie sans y écrire.

Dans la journée, quand une idée arrive, j'ouvre l'application et je l'écris. Pas de rubrique à choisir, pas de formulaire : j'écris la phrase telle qu'elle me vient, et je referme. Ça dure quinze secondes.

Le soir, en rentrant, ou après quelque chose d'important dans la journée, je prends un moment pour raconter ce que j'ai fait. Je pose les questions que j'ai en tête au passage, du type « qu'est-ce que j'avais noté là-dessus le mois dernier ». Puis je ferme.

Le reste du temps, Vigie ne demande rien.

Un seul endroit, deux moitiés

La première décision a été de ne pas mélanger le personnel et le professionnel. Ce sont deux rythmes différents : l'un se lit au jour le jour, l'autre se relit en fin de trimestre, quand il faut se souvenir de ce qu'on a réellement livré.

Vigie a donc deux moitiés, chacune avec son tableau de bord, son journal et son agenda. Un accent corail signale le personnel, un bleu le professionnel ; c'est la seule chose qui change en basculant de l'un à l'autre, et ça suffit. Du côté professionnel, deux objets structurent tout : le journal des journées travaillées et les accomplissements, la liste de ce qui a été fait, à laquelle j'ajoute au fil de l'eau plutôt qu'au moment de l'entretien annuel.

Les tâches, les rappels et la recherche sont communs aux deux moitiés, parce qu'une journée ne se coupe pas en deux dans les faits.

Écrire plutôt que cliquer

Le pari central de Vigie, c'est que l'interface principale d'un second cerveau n'est pas un formulaire, c'est une conversation.

Ajouter une entrée de journal en cliquant, c'est ouvrir la bonne page, choisir la bonne date, remplir les bons champs, valider. Je l'ai fait deux semaines, puis j'ai arrêté. Dans Vigie, j'écris ce que j'ai à dire, comme je l'enverrais à quelqu'un, et c'est l'assistant qui range : il crée l'entrée, la date, la classe du bon côté, ajoute la tâche mentionnée au passage, programme le rappel évoqué en fin de phrase.

Le moteur est Claude Code en mode headless, le même outil en ligne de commande que j'utilise pour coder, lancé par le serveur sur un dossier de notes en markdown. Deux conséquences pratiques.

L'assistant n'écrit pas dans la base en devinant. Il dispose d'un jeu d'outils que j'ai écrits, exposés via le protocole MCP, et chacun correspond à une action précise : ajouter une tâche, en changer le statut, programmer un rappel, consigner une entrée, enregistrer un accomplissement, chercher dans les données. La liste des écritures possibles est donc fixe et relisible.

Le fond reste lisible sans Vigie. Les notes sont des fichiers markdown dans un dossier, les données structurées sont dans une base SQLite, un fichier unique ouvrable avec n'importe quel outil. Si l'application s'arrête, le contenu reste accessible.

Une contrainte à signaler : un seul tour de conversation tourne à la fois sur toute l'application. Elle vient du fonctionnement par abonnement plutôt que par facturation à l'appel. Un message envoyé pendant qu'un tour tourne se met donc dans une file, affichée sous la réponse en cours, plutôt que de partir en parallèle.

Poser une question sans laisser de trace

Toutes les questions ne méritent pas d'être conservées. « Qu'est-ce que j'avais noté en mai à propos de ce dossier » n'a pas de raison de finir dans l'historique d'une conversation, ni d'ouvrir un droit d'écriture.

Vigie distingue donc deux régimes. Le chat est une conversation suivie : il se souvient, il écrit, il modifie. La recherche dans les notes est un tour jetable en lecture seule : aucun message enregistré, aucune reprise de contexte, et aucun outil d'écriture disponible pendant ce tour, non pas désactivé mais absent. La réponse s'affiche, rien n'en est conservé à part le compteur de consommation.

Le résumé du matin

Chaque matin, Vigie compose un point sur la journée qui commence : l'agenda du jour, les tâches échues, la météo, un rappel de la veille, et me l'envoie en notification. Le texte est rédigé par l'assistant, mais les données sont rassemblées en amont par des requêtes ordinaires. La distinction compte : je ne demande pas à une IA d'aller chercher ce qui est dans mon agenda, je lui donne ce qui y est et je lui demande de le formuler. Ce qui est affiché est exact par construction, seule la mise en mots est générée.

Chaque source du résumé s'active ou se coupe depuis les réglages, et une source coupée n'est ni collectée, ni mentionnée. L'heure d'envoi se règle de la même façon. Rien de tout cela n'est dans un fichier de configuration : ce qui doit changer à chaud vit dans la base, et l'application le relit sans redémarrer.

Le même canal sert aux rappels ponctuels et aux alertes techniques, un accès qui expire, une synchronisation qui échoue. Avec une règle de répétition : une même alerte n'est pas renvoyée plus d'une fois toutes les six heures, sauf si la situation s'est aggravée entre-temps.

Ce qui entre, ce qui ne sort pas

Vigie lit des choses qui ne lui appartiennent pas : le calendrier, les mails, les dépôts de code. La règle est qu'il les lit et qu'il n'y touche pas.

Les mails et l'activité de développement ne sont ni synchronisés, ni stockés : ils sont consultés au moment où une réponse en a besoin, en lecture seule, puis oubliés. Le calendrier fait exception parce que l'interface doit l'afficher en permanence : il est recopié régulièrement dans la base, mais cette copie est un miroir à sens unique. L'assistant n'y écrit pas et rien n'est publié vers le calendrier d'origine.

Le reste suit la même logique. Les données vivent chez moi et chez un fournisseur choisi pour ses garanties de confidentialité. L'authentification demande à chaque connexion un mot de passe et une clé physique, pas l'un ou l'autre. La création de compte est fermée côté serveur : le compte existe déjà, et c'est le seul.

Pourquoi pas un outil existant

Des agents personnels existent, OpenClaw et Hermes Agent par exemple, et je les connaissais avant de commencer. Ils ne correspondaient pas à ce que je cherchais, pour trois raisons.

Je voulais ma propre interface web. Pas seulement une conversation, mais des écrans faits pour lire vite : le tableau de bord du jour, l'agenda, la liste des accomplissements. Un agent qui répond bien ne remplace pas une page qu'on parcourt en trois secondes.

Je voulais maîtriser la donnée de bout en bout. Savoir où elle est stockée, sous quel format, ce qui la lit, ce qui l'écrit, et pouvoir l'ouvrir sans passer par l'outil qui l'a produite.

Et je ne voulais pas d'une usine à gaz pour un besoin de cette taille. Vigie sert à une personne, sur un serveur, avec un fichier SQLite. Tout ce qui dépassait ce cadre, orchestration, plugins, extensibilité générique, était du poids en trop.

C'est un arbitrage, pas un jugement : écrire le sien coûte du temps que l'installation d'un outil existant ne coûte pas.

Sur le plan technique

Vigie est un monorepo Bun. Le serveur est une API ElysiaJS avec du temps réel en SSE, un flux serveur vers client, jamais de WebSocket, parce que rien ici ne justifie un canal bidirectionnel. Les données sont dans SQLite via Drizzle. Le front est un React 19 avec le compilateur activé, Tailwind 4 et shadcn/ui. Le tout est typé de bout en bout : le type de l'API est exporté par le serveur et consommé par le client, si bien qu'une route renommée casse la compilation du front avant de casser quoi que ce soit en production.

Le design, appelé « Cockpit doux » en interne, tient en quelques choix : un fond clair légèrement bleuté plutôt que du blanc, une encre gris-bleu plutôt que du noir, deux accents pour les deux moitiés, deux polices. Un outil qu'on ouvre le matin avant le café n'a pas besoin d'un contraste maximal.

Le déploiement est un conteneur Docker piloté par Dokploy sur un serveur que je loue, poussé par un webhook au moment du commit. Les données et les sessions vivent en dehors de l'image, dans des volumes, et sont sauvegardées vers un stockage chiffré.

Où en est le projet

Vigie tourne en production, tous les jours, pour un seul utilisateur. C'est un outil personnel au sens strict, et une bonne partie de son intérêt vient de là.

Le projet continue. Il y a une liste de choses à ajouter et une autre de choses à simplifier. Ce que j'en retire pour l'instant : ce qui m'a fait tenir, ce n'est pas d'avoir ajouté de l'IA à mes notes, c'est de ne plus avoir à les ranger. Tant qu'il fallait choisir une rubrique avant d'écrire, je n'écrivais pas.

Technologies utilisées