Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Une application pour piloter une très petite entreprise : sa journée, ses clients, son argent. Pas de compte à créer, pas de configuration, pas de serveur — un seul fichier HTML qui s'ouvre dans un navigateur.
Elle s'est appelée Cadence, puis Simpli le 17 septembre 2026, puis Plenitu, avant de devenir Cura le 18 septembre 2026. Les copies de sauvegarde enregistrées sous l'un ou l'autre de ces noms se restaurent toujours.
| Onglet | Ce qu'on y fait |
|---|---|
| Agenda | La journée en ruban, les créneaux libres, le temps de route entre deux rendez-vous qui s'enchaînent, et le tableau des notes en dessous |
| Clients | Le carnet, rangé par mois de signature, et sur chaque fiche de quoi appeler, écrire ou s'y rendre. Au-dessus, une ligne dit combien de personnes attendent un appel — impayé, devis qui dort, client content, client oublié — et mène à l'écran qui les propose une à la fois |
| Comptabilité | Calculs : ce qu'il vous restera une fois cotisations et impôt payés. Factures : les totaux de l'année, la liste, le PDF. Mon argent : ce qui est vraiment à vous |
Les factures. « Mon argent » et « Calculs » en dérivent, facturer quelqu'un l'inscrit au carnet des clients. Aucun total n'est stocké : tout se recalcule. Deux listes parallèles, et les écrans finissent par se contredire — c'est l'erreur qui a coûté le plus cher sur ce projet.
Un total sans son périmètre n'est pas une mesure. Les écrans filtrent sur l'année en cours : annoncer un chiffre sans dire « 2026, hors brouillons » est une source de désaccord, pas une information.
Tout est enregistré dans le localStorage du navigateur, sur l'appareil du
visiteur uniquement. Rien n'est envoyé nulle part, il n'y a pas de serveur.
L'application s'ouvre vide : c'est la sienne, pas une démonstration. Un
contrôle refuse la publication si des fiches d'exemple réapparaissent.
Cette promesse est désormais tenue par le navigateur lui-même : une politique de sécurité déclarée dans la page n'autorise aucune connexion sortante. Même si un script tiers était un jour compromis, il ne pourrait rien envoyer.
Le dossier supabase/ contient les migrations d'un socle de données en ligne :
schéma, sécurité au niveau des lignes, back-office en lecture seule. Il n'est
branché à rien. Le jour où il le sera, la phrase ci-dessus devra être réécrite
dans le même commit — jamais avant, jamais après.
Les fichiers livrés, index.html et sw.js, sont générés : ne les modifiez
pas à la main, et ne les fusionnez jamais ligne à ligne. sw.js porte
l'empreinte de la page ; une fusion produit un fichier qui ne correspond à
aucune version, donc un cache qui ne sera jamais mis au rebut. En cas de
conflit sur l'un ou l'autre : prendre n'importe quelle version, puis
régénérer.
python3 src/build.py
src/page.html — le gabarit, avec le marqueur __SEED__ à la place des donnéessrc/verif.py — contrôle du script : chaînes fermées, blocs équilibrés,
fonctions appelées qui existent. Ce garde-fou existe parce que des guillemets
mal appariés ont blanchi la page plusieurs foissrc/controles.py — ce qu'on vérifie sur la page avant de publier : un seul
nom, l'application qui s'ouvre vide, la politique de sécurité, aucun script
tiers sans empreinte, aucun domaine non prévu. Chaque contrôle correspond à
quelque chose qui a déjà cassé — on n'en ajoute pas par principesrc/tiers.py — l'empreinte annoncée pour le script extérieur est-elle celle
du fichier réellement servisrc/sw.js — la copie locale qui permet d'ouvrir l'application sans réseauoutils/serveur-partage.py — l'adresse commune sur le port 4173, qui sert ce
dépôt en interdisant toute mise en cacheoutils/hooks/pre-push — le dernier verrou avant l'envoi⚠️ Avant de lancer build.py dans le dépôt principal, vérifier que
git status est propre. Ce dossier est celui que sert le 4173, et un agent
peut y avoir du travail en cours non commité. Régénérer à ce moment-là ne
l'écrase pas — c'est pire : on le compile dans index.html et on le publie
sous son propre nom, sans l'avoir jamais lu. Rien n'est perdu, et pourtant du
code que personne n'a relu se retrouve en ligne. C'est passé à un cheveu le
18 septembre 2026.
build.py écrit d'abord un brouillon, le contrôle, et ne remplace index.html
qu'une fois les contrôles passés. Il l'a longtemps fait dans l'autre sens : une
erreur de syntaxe était déjà publiée quand le message « Publication annulée »
s'affichait. L'ancienne page reste dans index.precedent.html, le temps d'un
retour en arrière.
Quatre verrous, du plus proche au plus lointain :
build.py ne remplace la page qu'une fois les contrôles passés.outils/hooks/pre-push refuse d'envoyer une page qui ne les passe pas.
Le commit local, lui, se fait toujours : le travail en cours n'est jamais
perdu, et la page en ligne reste la dernière qui fonctionnait..github/workflows/verification.yml régénère la page et la compare à
celle qui est publiée. Modifier le gabarit sans relancer build.py est
l'oubli le plus coûteux du projet ; il ne passe plus..github/workflows/veille.yml, chaque matin : l'adresse publique répond,
elle porte bien ses protections, et le script extérieur n'a pas changé.sw.js garde une copie de la page. Il ne la sert que si le réseau ne répond
pas. Une copie servie en priorité fige l'application à la version du jour où
elle a été installée, et plus personne ne comprend pourquoi les corrections
n'arrivent pas — c'est exactement ce qui a coûté une journée entière. Un contrôle
refuse la publication si sw.js s'écarte de cette règle.
Une session qui démarre reçoit ce fichier, pas ce que les autres se sont dit. Sans cette liste, les mêmes questions reviennent — l'une d'elles est remontée quatre fois à Sacha en deux jours, chaque fois présentée comme neuve. Avant de lui proposer quelque chose, vérifier ici.
robots.txt en Disallow retire ce qu'il restait
de l'argument. fichesExemple() reste dans le code comme jeu de
vérification, injecté en mémoire et jamais enregistré — pas comme une
fonctionnalité en attente.supabase/ n'est branché à rien, et ce n'est pas un oubli.Une note conditionnelle dans un message de commit finit par être lue comme une tâche : la condition est la première chose qui saute quand quelqu'un relaie la phrase, et l'attribution la deuxième. Ne pas en écrire ; l'écrire ici à la place.
Le fonctionnement hors-ligne ne s'observe que sur la page publique. Le
navigateur de contrôle refuse d'enregistrer un service worker sur une origine
en http://, localhost compris, avec un message qui ne dit pas sa cause :
« An unknown error occurred when fetching the script ». Deux agents ont cru
successivement à un en-tête, à la version du protocole, puis aux accents du
fichier — éprouvé avec un script de quarante-huit octets en pur ASCII sur un
serveur neutre, il échoue aussi.
Tout fonctionne en ligne, mise à jour comprise. Ne pas rediagnostiquer ceci depuis un port local : y observer une anomalie ne prouve rien.
Trois agents travaillent en parallèle, chacun sur un onglet, chacun dans sa copie isolée du dépôt. Les règles qui font que ça tient :
main : un travail non fusionné
est invisible pour tout le monde.index.html, qui est généré.
Fusionner sans relancer build.py ne change rien à l'écran.python3 outils/surfaces.py
Il compare les quatre surfaces — copie de travail, main, le 4173, la page
publique — et dit laquelle diverge. La cause la plus fréquente d'un « ce n'est
pas à jour » n'est pas le code : c'est qu'on ne regarde pas la surface qu'on
vérifie. Le 4173 a déjà servi la copie isolée d'un agent pendant qu'un autre en
tirait des conclusions sur main.
Le script existe pour une raison précise : deux agents ont comparé le même
fichier, l'un avec shasum, l'autre avec shasum -a 256, obtenu deux valeurs
différentes et failli conclure qu'ils regardaient des pages différentes. Une
règle qui dépend de l'outil que chacun choisit n'est pas une règle — d'où un
seul script, un seul algorithme, pour tout le monde.