Aller au contenu

Vigie

juillet 2026 → août 20268 min de lecture

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 comme il fallait choisir une rubrique avant d’écrire quoi que ce soit, au final je n’écrivais pas.

J’ai fini par tout mettre dans un seul dossier de notes en markdown, tenu par Claude Code. Je lui donnais une info en vrac, il la rangeait au bon endroit, tenait mon journal et faisait le point sur la semaine. Sauf que tout ça vivait sur mon PC, dans un terminal. Moi, je voulais pouvoir noter un truc depuis mon téléphone, à la voix si besoin, et que les rappels viennent à moi.

Vigie, c’est ce dossier devenu un site. Un site privé, sur mon serveur, avec un seul compte, le mien. J’écris ou je dicte dans un chat, Claude range, et l’interface affiche ce qu’il a rangé. Il y a deux moitiés, le perso en corail et le pro en bleu, chacune avec son tableau de bord, son journal et son agenda. Côté pro, Claude repère aussi dans mon journal pro ce qui compte, comme une livraison ou un problème difficile réglé, et l’ajoute à mes réalisations au fil de l’eau, au lieu que je les reconstitue la veille de l’entretien annuel.

Il n’y a pas de lien pour l’essayer : le site est rempli de ma vie, et le code reste privé.

Une journée avec Vigie

Le matin, je reçois sur Telegram le résumé de la journée qui commence. Un mot sur la veille, l’agenda, la météo, les tâches arrivées à échéance et les mails qui attendent quelque chose de moi.

Dans la journée, quand une idée arrive, je l’écris ou je la dicte depuis mon téléphone, sans rubrique ni formulaire. Si je dis « préviens-moi jeudi à 14 h », le rappel part sur Telegram jeudi à 14 h.

Le soir, je raconte ce que j’ai fait. Claude met le journal à jour, coche les tâches réglées et ajoute celles que j’ai évoquées au passage. Il n’y a qu’une conversation pour le perso et le pro, parce qu’une journée ne se coupe pas en deux. En fin de semaine, je la clôture. Claude résume la semaine, met les journaux à jour, et la conversation suivante démarre avec ce résumé.

Pourquoi pas un outil existant

La veille du premier commit, j’avais comparé les agents personnels qu’on peut héberger soi-même, comme OpenClaw ou Hermes Agent. À l’époque, aucun ne tournait simplement sur mon abonnement Claude depuis un serveur. Je voulais aussi ma propre interface, avec des écrans faits pour lire vite en plus de la conversation, et pouvoir ouvrir mes données sans Vigie. Les journaux sont des fichiers markdown, et le reste tient dans un fichier SQLite. Et pour une seule personne sur un seul serveur, je ne voulais pas d’une usine à gaz.

Ce qui se passe derrière

Vigie tourne donc sur mon abonnement Claude, sans API payée au message. Le dossier de notes a quitté mon PC pour le serveur, et Claude Code y travaille, lancé par le serveur à chaque message. Au début, le serveur lançait la commande claude -p et lisait sa sortie à la main. Depuis août, il passe par l’Agent SDK, que j’avais écarté en pensant qu’il était facturé au token. En fait, il embarque Claude Code et tourne sur le même abonnement.

Claude écrit lui-même les journaux en markdown. Pour le reste (tâches, rappels, réalisations), il passe par des outils que j’ai écrits, exposés en MCP et branchés sur la base. Chaque outil vérifie ce qu’on lui demande. Un rappel dans le passé est refusé, parce que ça veut dire que Claude s’est trompé de date. Et pour modifier ou supprimer une ligne, il doit d’abord l’avoir lue pendant le tour, comme l’outil Edit de Claude Code avec un fichier.

Avec un abonnement, un seul tour passe à la fois sur tout le site. Un message envoyé pendant que Claude répond attend dans une file, sous la réponse en cours, et je peux le retirer tant qu’il n’est pas parti.

Le plus gros gain de temps est venu du contexte. Au début, Claude découvrait l’agenda et les tâches en appelant ses outils un par un, et chaque appel relisait tout le contexte. Pour « qu’est-ce que j’ai de prévu et à faire », ça faisait six allers-retours et une trentaine de secondes. Maintenant, le serveur lui donne l’agenda de la semaine et les tâches ouvertes au début de chaque tour, et la même question prend une douzaine de secondes.

Côté technique, Vigie est un monorepo Bun. Le serveur est une API ElysiaJS, avec le temps réel en SSE, puisque rien n’a besoin d’un canal dans les deux sens. Les données sont dans SQLite avec Drizzle, la connexion passe par Better Auth, et le front est en React 19 avec Tailwind 4 et shadcn/ui. Le front lit le type de l’API avec Eden, si bien qu’une route renommée casse sa compilation avant de casser quoi que ce soit en production. Le tout tourne dans un conteneur sur mon VPS, sous Dokploy.

Lire sans toucher

Vigie lit aussi mon agenda et mes mails, sans jamais y toucher.

Au début, Claude pouvait ajouter des événements à l’agenda, et Vigie publiait un calendrier auquel Proton s’abonnait. Mais un événement posé par Claude n’existait pas dans Proton. La synchronisation ne pouvait ni le mettre à jour ni le retirer, et il restait affiché pour toujours. Au bout d’une semaine, j’ai tout supprimé. J’écris mes événements dans Proton Calendar, et Vigie en garde une copie, parce que l’interface doit l’afficher.

Les mails, eux, ne sont jamais copiés. Quand une réponse en a besoin, Claude les lit à travers Proton Mail Bridge, en lecture seule. Et comme n’importe qui peut m’écrire, chaque mail lui arrive encadré comme une donnée, avec la consigne de ne jamais suivre ce qu’il contient.

Même mes questions peuvent ne rien laisser derrière elles. Depuis la page de recherche, une question part dans un tour jetable, sans conversation enregistrée et sans aucun outil d’écriture chargé. Le piège, c’est que Claude Code écrit chaque échange en clair dans son dossier de configuration. Vigie supprime ces fichiers à la fin du tour.

Le résumé du matin

Ce résumé est la seule chose que Claude fait sans que je lui demande. L’agenda, les tâches et la météo sont récupérés par de simples requêtes, puis donnés à Claude avec une consigne claire : ce bloc fait autorité. Lui n’apporte que le tri des mails, un mot sur la veille et la formulation.

Cette consigne vient d’un raté. Lors d’un essai, le résumé a annoncé un rendez-vous, une heure et un trajet qui n’existaient pas. L’agenda était vide, et Claude l’avait rempli avec ce qu’il avait lu dans le journal. Pour un message qu’on lit au réveil, il n’y a pas pire. Maintenant, une journée vide se dit en une ligne. Pareil pour une boîte mail illisible, que Claude avait d’abord décrite comme calme.

Les alertes, comme une connexion ratée ou une session Proton Drive expirée qui bloque les sauvegardes, passent par le même bot Telegram. Une même alerte ne repart pas avant six heures, sauf si la situation s’aggrave.

Fermé à double tour

Le site est public, pour que je puisse l’ouvrir de partout sans VPN, mais chaque connexion demande le mot de passe et une passkey. La création de compte est fermée côté serveur, et seule une commande en SSH peut débloquer le compte. Les données, elles, vivent hors de l’image Docker et partent toutes les six heures vers Proton Drive.

Même le nom compte. Les certificats HTTPS sont inscrits dans des registres publics, et un sous-domaine comme « journal » aurait annoncé ce qu’il y a derrière. « Vigie » ne dit rien.

Construit avec Claude

Vigie est écrit avec Claude Code. Je suis parti d’un cahier des charges, de maquettes HTML de chaque page et d’un prompt par chantier, préparés avec Claude, puis j’ai lancé chaque prompt dans sa propre session, dans l’ordre. Le premier commit date du 17 juillet au soir, et Vigie était en ligne le 19, à une heure et demie du matin, avec mes anciens journaux repris dans la base. Juste avant la mise en ligne, on a fait une relecture complète du code avec mes retours, et un audit de sécurité au passage.

Évidemment, tout n’a pas marché du premier coup. La règle qui devait garder une sauvegarde par jour pendant deux mois ne gardait rien. Elle cherchait les archives de 3 h du matin, alors que les sauvegardes partent à minuit, 6 h, midi et 18 h. Son test passait quand même, parce qu’il ne lui donnait que des archives de 3 h. Rien n’avait encore été perdu.

Autre piège : une page affichait des données figées depuis le jeu de départ, alors qu’elle se disait tenue à jour par Claude. Depuis, ce qui s’affiche vient d’un outil de Claude ou d’un calcul sur la base, sinon le bloc n’existe pas.

Enfin, la dictée a changé de moteur. Celle du navigateur envoyait le son à Google et se trompait sur les noms. Depuis octobre, l’audio part vers Parakeet, un modèle de transcription qui tourne sur mon serveur, et Claude corrige les noms propres mal entendus à partir de ceux de mes notes.

Où en est le projet

Vigie tourne en production depuis le 19 juillet, et je m’en sers tous les jours. J’ai encore une liste de choses à ajouter, et une autre de choses à simplifier.

Technologies utilisées