judu/ex-egopublic Fork
⑂ main
Commits
⬇ Clone ▾
git clone https://git.rickub.com/judu/ex-ego.git
git clone ssh://git@rickub.com/judu/ex-ego.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP
chore(release): version 0.5.1 — onglets soulignés sur les stats f10ce09Unverified · on main · Julien Durillon · 22d ago
README.md

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
    (heures + minutes au stepper ou au clavier, 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'environnement DEFAULT_LANG.

Si la vidéo ne s’affiche pas :
la télécharger.

Captures d'écran

Connexion Choisir la catégorie
Connexion Ajouter : choisir la catégorie
Durée et date Statistiques
Ajouter : durée et date Statistiques d'équipe
Tâches Tâche effectuée
Todo list (verrou, assignations) Complétion en bottom sheet
Changer d'équipe Réglages
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.json créé par clever create/clever link contient
    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 flavor nano
    (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).