TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
Tableau de bord personnel : agenda, tâches, entraînements, courses et mesures.
Translation pending
ProductivityJavaScript · CSSGitHub @benjbepoix-stackOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Tableau de bord personnel (PWA installable sur iPhone) : rendez-vous, événements, tâches, notes, planning d'entraînement, courses et mesures physiques. HTML / CSS / JavaScript purs (modules ES), sans étape de build ni dépendance payante. Synchronisation multi-appareils via Firebase Realtime Database (offre gratuite). Les modules ES ne fonctionnent pas en file://. Servez le dossier :Read the full README ↗
Tableau de bord personnel (PWA installable sur iPhone), point d'entrée quotidien.
Briefing du matin (js/features/briefing.js) : à la première ouverture du jour, quatre écrans plein écran — météo et séance du jour (« Je la fais » ou « Demain »), rendez-vous / événements / courses des 7 prochains jours avec compte à rebours, tâches échues en pile (glisser à droite = faite, à gauche = demain), puis une plante qui gagne une feuille par geste et la série de matins. Rejouable avec le soleil de l'en-tête ; il remplace ce jour-là le pop-up des retards. Style « Vivant » (css/vivant.css) : palette Forêt et Pollen en sombre et en clair, dates en Geist Mono. Saisie express en langage naturel (js/core/parse.js) : « payer la cantine demain » = tâche datée, « dentiste jeudi 17h30 » = rendez-vous. Dans À faire, glisser une tâche à droite la coche, à gauche la reporte à demain (avec « Annuler »).
Trois onglets :
La saison, les courses et les mesures se gèrent dans l'app Allure (même compte, même nœud Firebase, mêmes données : rien n'est copié). Style minimaliste commun aux apps (anthracite, cartes pleines), couleur Menthe ; les courses gardent la couleur Aurore d'Allure. HTML / CSS / JavaScript purs (modules ES), sans étape de build ni dépendance payante. Synchronisation multi-appareils via Firebase Realtime Database (offre gratuite), avec le même compte (e-mail / mot de passe) que Mon Garage, Ma Maison, Allure et Mon budget.
index.html Squelette HTML (aucun script inline hormis l'anti-flash du thème)
manifest.webmanifest Manifeste PWA
database.rules.json Règles fermées à publier sur l'ANCIENNE base publique (voir « Sécurité »)
css/horizon.css Style « Horizon » (paysage, accent citron, police Geist), chargé en dernier
fonts/, img/ Police Geist et paysages de l'accueil, servis par l'app (marchent hors ligne)
css/
tokens.css Design tokens (couleurs clair/sombre, rayons, ombres, mouvement)
base.css Reset, typographie, fond d'ambiance, accessibilité
components.css Boutons, champs, cartes, modales, toasts, graphiques…
layout.css En-tête, barre d'onglets, grilles responsive
views/*.css Styles propres à chaque vue
js/
main.js Point d'entrée : navigation, abonnements, erreurs globales
config/firebase-config.js Configuration Firebase (projet commun aux apps, publique par conception)
core/
store.js État central + persistance locale + diffusion des changements
schema.js Normalisation / validation de forme des données
validation.js Règles de validation des formulaires
season.js Phases d'entraînement (types, conseils, phase d'un jour, courses d'un jour)
dates.js, utils.js Utilitaires
services/
firebase.js Compte + synchronisation (chargement dynamique, file d'écriture, état réseau, transfert depuis l'ancienne base)
storage.js localStorage sécurisé
weather.js Météo Open-Meteo avec cache
features/
ics.js Génération iCalendar (RFC 5545) + ouverture Calendrier iOS
calendar-prompt.js Modale « Ajouter au calendrier »
overdue-prompt.js Pop-up de démarrage : tâches, entretiens Garage et Maison en retard (une seule liste)
linked-apps.js Échéances de Garage / Maison lues dans le nœud de Carnet (sections, calendrier, pastilles)
auth.js Feuille de connexion (« Continuer sans compte » possible)
settings.js Feuille Réglages : thème Auto / Sombre / Clair, compte connecté, déconnexion
persist.js Attente de l'accusé de réception Firebase
ui/ Icônes SVG, modales, toasts, thème, pastille de synchro, graphiques
views/ dashboard (accueil + tâches), training (planning)
Les modules ES ne fonctionnent pas en file://. Servez le dossier :
python3 -m http.server 8080
# puis http://localhost:8080
GitHub Pages (ou tout hébergement statique) : publier la racine du dépôt. Aucune compilation nécessaire.
test-e27e9, même firebase-config.js). Les données sont sous users/<uid>/carnet (tranches dashboard, notes, theme, families, plans, objectives, races, bodyMetrics, partagées avec Allure). Le même nœud reçoit garage_alerts (écrit par Mon Garage), maison_alerts (Ma Maison) et migrated (marque du transfert) : Carnet les lit et ne les réécrit jamais.benjbepoix-stack.github.io) ; dans un même navigateur, être connecté dans Mon Garage suffit. Sur iPhone, chaque app installée sur l'écran d'accueil a son propre stockage : une connexion par app, une seule fois.dashboard_last_uid) : les données locales sont vidées avant la synchro. À la première connexion après la mise à jour, rien n'est vidé.Au premier instantané de users/<uid>/carnet après connexion, si migrated est absent, Carnet lit l'ancienne base publique en REST (dashboard---projet…/app.json, 8 s max) :
garage_alerts / maison_alerts), avec migrated: { from: '<hôte>', at, by: 'carnet' }, puis affichées ;migrated: { from: 'local', … } ;migrated apparue entre-temps) → Carnet n'écrit rien de plus et garde la marque d'Allure.Un nœud qui ne contient que garage_alerts / maison_alerts / migrated est considéré comme vide : les données de l'appareil n'en sont jamais effacées. Le ménage des tâches cochées et le pop-up des retards attendent la fin de ce premier chargement.
apiKey et le reste de firebase-config.js ne sont pas des secrets : Firebase les destine au navigateur. Aucune clé privée (compte de service) ne doit jamais être commitée ; le .gitignore les exclut.test-e27e9 (gérées dans le dépôt Mon Garage) n'autorisent que users/<uid> au compte connecté. Aucune règle à publier pour les nouveaux chemins.dashboard---projet (lisible et modifiable par n'importe qui jusque-là) une fois les données transférées : ouvrez Carnet connecté sur un appareil à jour, vérifiez que vos données s'affichent (et, dans la console Firebase du projet test-e27e9, que users/<uid>/carnet/migrated existe), puis console Firebase du projet dashboard---projet → Realtime Database → Règles → coller le contenu de database.rules.json (".read": false, ".write": false) → Publier. Après cela, l'ancienne base n'est plus lisible : un appareil qui n'aurait jamais été mis à jour enverra ses propres données à sa première connexion (transfert « local »).Après l'enregistrement d'un rendez-vous (confirmé par Firebase si en ligne), une modale propose « Ajouter au Calendrier ».
Sur iPhone, Safari reçoit un événement text/calendar et affiche directement la fiche native d'ajout à l'app Calendrier. Ailleurs, un fichier .ics est téléchargé.
Un bouton calendrier est aussi disponible sur chaque rendez-vous, événement et course à venir. L'UID est stable : réimporter un rendez-vous modifié met à jour l'événement.
Rendez-vous et événements peuvent se répéter (tous les jours, semaines, mois ou ans — ex. un anniversaire). La date saisie est la première occurrence ; l'accueil affiche la prochaine occurrence et l'export .ics inclut la règle RRULE.
Depuis l'app installée sur l'écran d'accueil, si la fiche ne s'ouvre pas, utilisez le bouton « Partager le fichier .ics ».
Allure écrit races, objectives.seasonPhases et bodyMetrics dans le même nœud (users/<uid>/carnet, même compte) ; Carnet les lit pour l'agenda, la séance du jour, les tâches Sport et le planning (phase de chaque jour, courses). Un appui sur une course ou une tâche Sport ouvre Allure.
Sur iPhone, chaque tâche datée et non terminée a un bouton cloche : il copie le titre et l’échéance (« Appeler le garage — samedi 3 octobre à 10:30 ») puis ouvre l’app Rappels, où il suffit de coller. Une page web ne peut pas créer elle-même un rappel.
sw.js (service worker) vérifie à chaque ouverture si les fichiers de l’app ont changé sur le serveur et garde la dernière version pour le mode hors ligne. Une version publiée sur GitHub Pages apparaît donc à la réouverture de l’app, sans attendre l’expiration du cache du navigateur.
À l’installation, l’app-shell (HTML/CSS/JS/icônes) est aussi pré-mis en cache : un tout premier lancement hors ligne (avant toute visite en ligne réussie) affiche donc l’app au lieu d’un écran blanc.
Par défaut sur Besançon. Le bouton 📍 à côté de la météo (onglet Planning) permet de changer de ville (recherche via l’API de géocodage gratuite d’Open-Meteo) ; le choix est mémorisé sur l’appareil.
L'accueil s'ouvre sur un paysage (crépuscule en sombre, matin en clair) avec la séance du jour en grand titre, puis une rangée de 4 tuiles (icône au trait + nom) qui ouvre Allure, Mon budget, Ma Maison et Mon Garage. Une pastille rouge sur Ma Maison / Mon Garage indique le nombre d'entretiens en retard qu'elles ont publiés.
users/<uid>/carnet/garage_alerts (même compte). Les échéances datées apparaissent aussi dans le calendrier du mois. Carnet lit ce chemin dans l'instantané de son propre nœud (pas d'écouteur séparé) et ne l'écrit jamais. La section reste masquée tant que Garage n'a rien publié. Détail dans js/features/linked-apps.js.Sections « Maison » et « Saison » : dans l'onglet Tâches, en lecture seule et en direct, ce qu'a publié l'app Ma Maison dans users/<uid>/carnet/maison_alerts : entretiens en retard ou à moins de 30 jours et garanties qui expirent (avec leur date, aussi dans le calendrier du mois), puis les tâches du calendrier de saison du mois restant à faire. Un appui ouvre Ma Maison. Détail dans js/features/linked-apps.js.
Plus aucune règle Firebase à publier pour ces liens : tout est sous le compte connecté.
Réglages › Thème : Auto (par défaut, suit le réglage clair / sombre de l'iPhone, y compris son passage automatique le soir), Sombre ou Clair. Le choix est synchronisé (tranche theme). À la mise à jour, l'ancien thème « sombre » (ancien défaut) devient Auto, une seule fois (drapeau dashboard_theme_auto_v1) ; « clair » reste clair.
Au lancement de l'app, une fenêtre liste en une seule fois les tâches en retard (échéance passée, non cochées) et les entretiens en retard publiés par Garage et Ma Maison. Une tâche se coche directement dans la liste (ou s'ouvre d'un appui) ; un entretien ouvre l'app concernée ; un seul bouton « Fermer ». Un seul passage par session, une fois les données du compte reçues (une tâche faite sur un autre appareil n'y figure pas ; après le choix « se connecter » ou « continuer sans compte » si la feuille de connexion est ouverte) et les résumés Garage / Maison lus — sans les attendre plus de 2,5 s. Détail dans js/features/overdue-prompt.js.
Un appui sur une carte (rendez-vous, événement) ou une ligne (tâche) ouvre sa modification ; « Supprimer » est en bas de la feuille. Les listes n'affichent plus d'icônes crayon / corbeille. Le rond d'une tâche la coche sans ouvrir la feuille ; l'icône calendrier des rendez-vous à venir reste disponible.
js/features/task-tidy.js.À l'ouverture de l'app, le planning hebdomadaire (onglet Planning) défile automatiquement jusqu'à la carte du jour, plutôt que de rester sur le lundi de la semaine affichée. Seuls les jours réellement planifiés sont enregistrés (consulter une semaine ne crée plus de jours vides dans la base). Un appui sur une course du planning ouvre Allure.
Carnet n'écrit jamais objectives (les phases de saison appartiennent à Allure) : la gestion des sports ne peut donc plus écraser une phase créée dans Allure.