Ex Ego
Ex Ego — à l'oreille ex aequo (l'objectif : à égalité), à l’écrit
ex-ego (le moyen : on dépose l'ego et on mesure de bonne foi).
Application web de comptage de temps par catégorie et de tâches partagées, en
équipe. Mobile-first (PWA), UI en quatre langues (français, anglais, allemand,
portugais du Brésil), rendu 100 % côté serveur, amélioration progressive en
JavaScript.
Stack : Rust (axum, askama, sqlx), PostgreSQL, biscuit-auth. Aucun framework
front, une seule feuille de CSS.
Inspiration
L'inspiration vient de Maydée,
l'application de l'association fondée par Julie Hebting pour rendre visible la
répartition du travail domestique (18h39,
Magic Maman).
Maydée ne semble malheureusement plus utilisable aujourd'hui (son domaine ne
pointe même plus vers l'association).
Ex Ego a pour but de remplacer Maydée pour m’apporter une continuité.
On garde les mêmes fonctionnalités:
- Compter le temps d’une tâche
- Catégoriser le temps compté
- Visualiser la répartition du temps et des tâches.
On laisse tomber les infos personnelle : CSP, notion de "Couple", nombre d’enfants…
J’imagine que Maydée voulait pouvoir faire des stats là-dessus, moi je m’en fiche.
But de l’application
Avoir de la donnée sur le temps passé aux tâches domestiques change la
nature de la conversation : on ne débat plus de ressentis ni de souvenirs
(« j'ai l'impression de tout faire ») mais d'un relevé que chacun a constitué
de bonne foi. La répartition des tâches devient un sujet moins passionné et
plus apaisé (on regarde les chiffres ensemble, puis on décide ensemble).
Ex Ego n'a pas vocation à devenir un SaaS pour l'instant : la création de
comptes est manuelle (en ligne de commande), pas d'e-mail, pas d'inscription,
rien. Si tu veux essayer, je peux partager un compte sur une instance de
démo à la demande (ouvre une issue).
Exemples
En utilisant Maydée puis Ex Ego, nous avons remarqué différentes choses chez nous:
- Une personne pensait que l’autre ne faisait pas grand chose, car l’autre n’informait pas
forcément des tâches effectuées - Ça apporte un petit côté gamification où on veut essayer de rattraper l’autre
- On s’est rendu compte qu’un partage des tâches "statique" pouvait être trompeur : faire
à manger = 1 heure, faire la vaisselle du même repas < 15 minutes. - Si A fait une tâche mais pas jusqu’au bout, B est moins agacé·e car au pire iel finit la
tâche en mesurant. Et vice-versa. - Parfois, si A a beaucoup d’heures d’avance, iel se sent plus légitime à faire une
pause.
English
Team time tracker and shared todo list.
The core idea is comparing time spent on household tasks
(the fairest measure of domestic work, as long as everyone acts in good
faith). Log time per category, run a timer, take dated tasks and
reschedule them at their observed rhythm, and read stacked-bar statistics
per member.
Having data about time spent on housework changes the nature
of the conversation. Instead of debating feelings and recollections, you
look at numbers gathered in good faith (a calmer, less heated way to talk
about who does what).
Not a SaaS for now: accounts are created manually
from the command line (no e-mail, no sign-up); a demo account can be
shared on request. Mobile-first PWA, fully server-rendered (JavaScript is progressive enhancement only),
available in four languages (FR/EN/DE/PT-BR, language is a per-user setting), with an optional
high-contrast black-and-white theme (per-user too, charts included).
Deustch
Zeiterfassung und geteilte Aufgabenliste fürs Team.
Kern der Idee ist der Vergleich der aufgewendeten Zeit für Hausarbeit (das fairste Maß für
häusliche Arbeit, solange alle guten Willens sind). Zeiten pro Kategorie
erfassen, Timer laufen lassen, datierte Aufgaben übernehmen und im
beobachteten Rhythmus neu planen, Statistiken pro Mitglied lesen.
Daten über die für Hausarbeit aufgewendete Zeit verändern das Gespräch.
Statt über Gefühle und Erinnerungen zu streiten, schaut man gemeinsam auf in
gutem Glauben erfasste Zahlen (eine ruhigere, sachlichere Art, über die
Aufgabenverteilung zu sprechen).
Vorerst kein SaaS: Konten werden manuell über die Kommandozeile angelegt
(keine E-Mail, keine Registrierung); ein Demo-Konto gibt es auf Anfrage.
Mobile-first-PWA, vollständig serverseitig gerendert (JavaScript nur als
Progressive Enhancement), in vier Sprachen (FR/EN/DE/PT-BR, die Sprache ist eine
Einstellung pro Benutzer), mit optionalem kontrastreichem
Schwarz-Weiß-Thema (ebenfalls pro Benutzer, inklusive Diagramme).
Português (Brasil)
Contador de tempo em equipe e lista de tarefas compartilhada.
A ideia central é comparar o tempo gasto nas tarefas domésticas (a medida
mais justa do trabalho de casa, desde que todo mundo aja de boa-fé). Dá para
registrar tempo por categoria, deixar um cronômetro rodando, pegar tarefas
datadas e reprogramá-las no ritmo observado, e ler estatísticas em barras
empilhadas por membro.
Ter dados sobre o tempo gasto com a casa muda a natureza da conversa.
Em vez de discutir impressões e lembranças, vocês olham
juntos para números registrados de boa-fé (um jeito mais calmo e menos
inflamado de falar sobre quem faz o quê).
Por enquanto não é um SaaS: as contas
são criadas manualmente pela linha de comando (sem e-mail, sem cadastro); uma
conta de demonstração pode ser compartilhada mediante pedido.
PWA mobile-first, renderizado 100 % no servidor (o JavaScript é só melhoria
progressiva), em quatro idiomas (FR/EN/DE/PT-BR, o idioma é uma configuração
por usuário), com um tema opcional em preto e branco de alto contraste (também
por usuário, gráficos incluídos).
Fonctionnalités
- Saisie de temps: choisir une catégorie, puis durée
(steppers ± 5 min, presets) et date. Un écran "paramètres" permet de modifier/supprimer. - Minuteur : démarrer/arrêter une mesure, enregistrée dans la catégorie
choisie. - Statistiques : 6 graphiques (semaine en équipe, puis comparatif par tâche pour : jour, semaine ISO, mois, année, tout
l'historique), une colonne par membre, détail par segment en pop up. - Todo list d'équipe : tâches datées rattachées à une catégorie ;
n'importe quel membre peut prendre une tâche (une action permet de se verrouiller une
tâche), la marquer faite en enregistrant un
temps ou non, puis la reprogrammer à la date proposée. Assignations purement informatives avec filtre
« Mes tâches ». Bloc « À venir » pour les tâches futures. - Équipes : multi-équipes par utilisateur, équipe active par appareil
(cookie), invitations par username, couleur d'équipe dérivée de son id. - Comptes : session par biscuit en cookie (~6 mois),
révocation au logout, CSRF stateless, argon2id. - Accessibilité : WCAG 2.1/2.2 AA (zéro violation axe sur les 12
écrans : contrastes, cibles 24 px, landmarks, focus des sheets, Échap). - Contraste élevé : un thème noir et blanc, réglage par utilisateur
(Réglages → Affichage), pour les écrans très sombres ou les filtres de
lumière chaude. - Quadrilingue : français, anglais, allemand, portugais du Brésil. La
langue est un réglage par utilisateur (page Réglages). Langue par défaut à la création
modifiable par la variable d'environnementDEFAULT_LANG.
Si la vidéo ne s’affiche pas :
la télécharger.
Captures d'écran
![]() |
![]() |
| Connexion | Ajouter : choisir la catégorie |
![]() |
![]() |
| Ajouter : durée et date | Statistiques d'équipe |
![]() |
![]() |
| Todo list (verrou, assignations) | Complétion en bottom sheet |
![]() |
![]() |
| Sélecteur d'équipe | Réglages et invitations |
Ligne de commande
Les comptes ne se créent que par CLI.
Le binaire sert aussi d'outil d'administration.
Toutes les commandes appliquent les migrations au démarrage et
lisent la base via POSTGRESQL_ADDON_URI (prioritaire) ou DATABASE_URL.
exego serve # lance le serveur (défaut)
exego keygen # génère BISCUIT_PRIVATE_KEY
exego team add <nom> # crée une équipe
exego user add <username> --team <équipe> # crée un compte (mdp demandé
# ou --password <mdp>)
exego user join <username> --team <équipe> # ajoute un compte existant
# à une équipe
Variables d'environnement du serveur :
| Variable | Rôle |
|---|---|
POSTGRESQL_ADDON_URI ou DATABASE_URL |
connexion PostgreSQL (TLS imposé côté client quoi que dise l'URL) |
BISCUIT_PRIVATE_KEY |
clé privée racine (à générer une fois avec exego keygen) |
PORT |
port d'écoute (défaut 8080) |
DEFAULT_LANG |
langue des nouveaux comptes et des pages anonymes : fr (défaut), en, de ou pt-br |
Développement local
cargo build && cargo test
DATABASE_URL='postgresql://…' \
BISCUIT_PRIVATE_KEY=$(cargo run -- keygen | grep -o '[0-9a-f]\{64\}') \
PORT=8090 cargo run -- serve
Audit d'accessibilité : voir a11y/audit.mjs (axe-core + Chrome
headless sur les 12 écrans, exit 1 à la moindre violation sérieuse).
Déployer sur Clever Cloud
Prérequis : clever-tools
(npm i -g clever-tools) et clever login.
# 1. Créer l'application Rust (dans le clone du dépôt)
clever create --type rust exego
# 2. Créer l'add-on PostgreSQL et le lier à l'application
clever addon create postgresql-addon exego-db --plan dev
clever service link-addon exego-db
# → l'app reçoit POSTGRESQL_ADDON_URI automatiquement
# 3. Générer et poser la clé biscuit (à garder précieusement :
# la changer invalide toutes les sessions)
clever env set BISCUIT_PRIVATE_KEY "$(cargo run -- keygen | grep -o '[0-9a-f]\{64\}')"
# 4. Déployer (pousse le HEAD git ; les migrations s'appliquent au boot)
clever deploy
clever logs # suivre le démarrage
# 5. Créer la première équipe et le premier compte, depuis ta machine,
# en visant la base de l'add-on
export POSTGRESQL_ADDON_URI="$(clever env | grep '^POSTGRESQL_ADDON_URI=' | cut -d'"' -f2)"
cargo run -- team add "Maison"
cargo run -- user add alice --team "Maison"
Notes :
- Le fichier
.clever.jsoncréé parclever create/clever linkcontient
les identifiants de l'app. Il est ignoré par git dans ce repo public, mais rien
n’empêche de le committer. - Dimensionnement éprouvé : build flavor
L, run flavornano
(clever scale --build-flavor L --flavor nano). - Le plan PostgreSQL DEV est limité à 5 connexions : le pool de l'app est
calibré à 2 pour survivre à la cohabitation bleu-vert d'un déploiement. - Écrire les migrations pour qu'elles passent sur les données déjà en
production : l'ancien et le nouveau binaire cohabitent quelques secondes.
Licence
The Unlicense (domaine public).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 |
|







