judu/ex-egopublic Fork
⑂ db6279e
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: licence The Unlicense, README (features, CLI, déploiement Clever Cloud), .clever.json ignoré — et purgé de tout l'historique (split + abandon du commit qui l'avait introduit)Unverified

Claude-Session: https://claude.ai/code/session_01FPKHKGfqvnvXKY9tNhYmkh
Julien Durillon committed 2026-08-08T23:25:13+02:00 Browse files
db6279e parent: c538051
modified .gitignore +1 -0
@@ -1 +1,2 @@
11 /target
2+.clever.json
@@ -1 +1,2 @@
1 /target1 /target
2+.clever.json
modified Cargo.toml +1 -0
@@ -2,6 +2,7 @@
22 name = "time-time"
33 version = "0.1.0"
44 edition = "2024"
5+license = "Unlicense"
56
67 [dependencies]
78 axum = "0.8"
@@ -2,6 +2,7 @@
2 name = "time-time"2 name = "time-time"
3 version = "0.1.0"3 version = "0.1.0"
4 edition = "2024"4 edition = "2024"
5+license = "Unlicense"
5 6
6 [dependencies]7 [dependencies]
7 axum = "0.8"8 axum = "0.8"
added LICENSE +24 -0
new file mode 100644
@@ -0,0 +1,24 @@
1+This is free and unencumbered software released into the public domain.
2+
3+Anyone is free to copy, modify, publish, use, compile, sell, or
4+distribute this software, either in source code form or as a compiled
5+binary, for any purpose, commercial or non-commercial, and by any
6+means.
7+
8+In jurisdictions that recognize copyright laws, the author or authors
9+of this software dedicate any and all copyright interest in the
10+software to the public domain. We make this dedication for the benefit
11+of the public at large and to the detriment of our heirs and
12+successors. We intend this dedication to be an overt act of
13+relinquishment in perpetuity of all present and future rights to this
14+software under copyright law.
15+
16+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
20+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23+
24+For more information, please refer to <https://unlicense.org>
new file mode 100644
@@ -0,0 +1,24 @@
1+This is free and unencumbered software released into the public domain.
2+
3+Anyone is free to copy, modify, publish, use, compile, sell, or
4+distribute this software, either in source code form or as a compiled
5+binary, for any purpose, commercial or non-commercial, and by any
6+means.
7+
8+In jurisdictions that recognize copyright laws, the author or authors
9+of this software dedicate any and all copyright interest in the
10+software to the public domain. We make this dedication for the benefit
11+of the public at large and to the detriment of our heirs and
12+successors. We intend this dedication to be an overt act of
13+relinquishment in perpetuity of all present and future rights to this
14+software under copyright law.
15+
16+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
20+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23+
24+For more information, please refer to <https://unlicense.org>
added README.md +111 -0
new file mode 100644
@@ -0,0 +1,111 @@
1+# time-time
2+
3+Application web de comptage de temps par catégorie et de tâches partagées, en
4+équipe. Mobile-first (PWA), UI en français, rendu 100 % côté serveur — le
5+JavaScript n'existe qu'en amélioration progressive : tout fonctionne par liens
6+et formulaires.
7+
8+Stack : Rust (axum, askama, sqlx), PostgreSQL, biscuit-auth. Aucun framework
9+front, une seule feuille de CSS.
10+
11+## Fonctionnalités
12+
13+- **Saisie de temps** en deux étapes : choisir une catégorie, puis durée
14+ (steppers ± 5 min, presets) et date. Modification et suppression ensuite.
15+- **Minuteur** : démarrer/arrêter une mesure, enregistrée dans la catégorie
16+ choisie ; pastille sur l'icône de l'app (Badging API) tant qu'une mesure
17+ attend.
18+- **Statistiques** : 4 graphiques empilés (semaine ISO, mois, année, tout
19+ l'historique), une colonne par membre, détail par segment en bottom sheet.
20+- **Todo list d'équipe** : tâches datées rattachées à une catégorie ;
21+ n'importe quel membre peut prendre une tâche (verrou : seul le preneur la
22+ termine ou la modifie), la marquer faite en enregistrant — ou non — un
23+ temps, puis la reprogrammer à la date proposée (médiane des intervalles
24+ entre complétions). Assignations purement informatives avec filtre
25+ « Mes tâches », bloc « À venir » pour les tâches futures.
26+- **Équipes** : multi-équipes par utilisateur, équipe active par appareil
27+ (cookie), invitations par username, couleur d'équipe dérivée de son id.
28+- **Comptes** : authentification par biscuit en cookie (~6 mois),
29+ révocation au logout, CSRF stateless, argon2id.
30+- **Accessibilité** : WCAG 2.1/2.2 AA — zéro violation axe sur les 12
31+ écrans (contrastes, cibles 24 px, landmarks, focus des sheets, Échap).
32+
33+## Ligne de commande
34+
35+Le binaire sert aussi d'outil d'administration (les comptes ne se créent que
36+par CLI). Toutes les commandes appliquent les migrations au démarrage et
37+lisent la base via `POSTGRESQL_ADDON_URI` (prioritaire) ou `DATABASE_URL`.
38+
39+```bash
40+time-time serve # lance le serveur (défaut)
41+time-time keygen # génère BISCUIT_PRIVATE_KEY
42+time-time team add <nom> # crée une équipe
43+time-time user add <username> --team <équipe> # crée un compte (mdp demandé
44+ # ou --password <mdp>)
45+time-time user join <username> --team <équipe> # ajoute un compte existant
46+ # à une équipe
47+```
48+
49+Variables d'environnement du serveur :
50+
51+| Variable | Rôle |
52+|---|---|
53+| `POSTGRESQL_ADDON_URI` ou `DATABASE_URL` | connexion PostgreSQL (TLS imposé côté client quoi que dise l'URL) |
54+| `BISCUIT_PRIVATE_KEY` | clé privée racine (hex, via `keygen`) |
55+| `PORT` | port d'écoute (défaut 8080) |
56+
57+### Développement local
58+
59+```bash
60+cargo build && cargo test
61+DATABASE_URL='postgresql://…' \
62+BISCUIT_PRIVATE_KEY=$(cargo run -- keygen | grep -o '[0-9a-f]\{64\}') \
63+PORT=8090 cargo run -- serve
64+```
65+
66+Audit d'accessibilité récurrent : voir `a11y/audit.mjs` (axe-core + Chrome
67+headless sur les 12 écrans, exit 1 à la moindre violation sérieuse).
68+
69+## Déployer sur Clever Cloud
70+
71+Prérequis : [clever-tools](https://www.clever-cloud.com/doc/clever-tools/)
72+(`npm i -g clever-tools`) et `clever login`.
73+
74+```bash
75+# 1. Créer l'application Rust (dans le clone du dépôt)
76+clever create --type rust time-time
77+
78+# 2. Créer l'add-on PostgreSQL et le lier à l'application
79+clever addon create postgresql-addon time-time-db --plan dev
80+clever service link-addon time-time-db
81+# → l'app reçoit POSTGRESQL_ADDON_URI automatiquement
82+
83+# 3. Générer et poser la clé biscuit (à garder précieusement :
84+# la changer invalide toutes les sessions)
85+clever env set BISCUIT_PRIVATE_KEY "$(cargo run -- keygen | grep -o '[0-9a-f]\{64\}')"
86+
87+# 4. Déployer (pousse le HEAD git ; les migrations s'appliquent au boot)
88+clever deploy
89+clever logs # suivre le démarrage
90+
91+# 5. Créer la première équipe et le premier compte, depuis ta machine,
92+# en visant la base de l'add-on
93+export POSTGRESQL_ADDON_URI="$(clever env | grep '^POSTGRESQL_ADDON_URI=' | cut -d'"' -f2)"
94+cargo run -- team add "Maison"
95+cargo run -- user add alice --team "Maison"
96+```
97+
98+Notes :
99+
100+- Le fichier `.clever.json` créé par `clever create`/`clever link` contient
101+ les identifiants de l'app est **ignoré par git** par défaut.
102+- Dimensionnement éprouvé : build flavor `L`, run flavor `nano`
103+ (`clever scale --build-flavor L --flavor nano`).
104+- Le plan PostgreSQL DEV est limité à 5 connexions : le pool de l'app est
105+ calibré à 2 pour survivre à la cohabitation bleu-vert d'un déploiement.
106+- Écrire les migrations pour qu'elles passent sur les données déjà en
107+ production : l'ancien et le nouveau binaire cohabitent quelques secondes.
108+
109+## Licence
110+
111+[The Unlicense](LICENSE) — domaine public.
new file mode 100644
@@ -0,0 +1,111 @@
1+# time-time
2+
3+Application web de comptage de temps par catégorie et de tâches partagées, en
4+équipe. Mobile-first (PWA), UI en français, rendu 100 % côté serveur — le
5+JavaScript n'existe qu'en amélioration progressive : tout fonctionne par liens
6+et formulaires.
7+
8+Stack : Rust (axum, askama, sqlx), PostgreSQL, biscuit-auth. Aucun framework
9+front, une seule feuille de CSS.
10+
11+## Fonctionnalités
12+
13+- **Saisie de temps** en deux étapes : choisir une catégorie, puis durée
14+ (steppers ± 5 min, presets) et date. Modification et suppression ensuite.
15+- **Minuteur** : démarrer/arrêter une mesure, enregistrée dans la catégorie
16+ choisie ; pastille sur l'icône de l'app (Badging API) tant qu'une mesure
17+ attend.
18+- **Statistiques** : 4 graphiques empilés (semaine ISO, mois, année, tout
19+ l'historique), une colonne par membre, détail par segment en bottom sheet.
20+- **Todo list d'équipe** : tâches datées rattachées à une catégorie ;
21+ n'importe quel membre peut prendre une tâche (verrou : seul le preneur la
22+ termine ou la modifie), la marquer faite en enregistrant — ou non — un
23+ temps, puis la reprogrammer à la date proposée (médiane des intervalles
24+ entre complétions). Assignations purement informatives avec filtre
25+ « Mes tâches », bloc « À venir » pour les tâches futures.
26+- **Équipes** : multi-équipes par utilisateur, équipe active par appareil
27+ (cookie), invitations par username, couleur d'équipe dérivée de son id.
28+- **Comptes** : authentification par biscuit en cookie (~6 mois),
29+ révocation au logout, CSRF stateless, argon2id.
30+- **Accessibilité** : WCAG 2.1/2.2 AA — zéro violation axe sur les 12
31+ écrans (contrastes, cibles 24 px, landmarks, focus des sheets, Échap).
32+
33+## Ligne de commande
34+
35+Le binaire sert aussi d'outil d'administration (les comptes ne se créent que
36+par CLI). Toutes les commandes appliquent les migrations au démarrage et
37+lisent la base via `POSTGRESQL_ADDON_URI` (prioritaire) ou `DATABASE_URL`.
38+
39+```bash
40+time-time serve # lance le serveur (défaut)
41+time-time keygen # génère BISCUIT_PRIVATE_KEY
42+time-time team add <nom> # crée une équipe
43+time-time user add <username> --team <équipe> # crée un compte (mdp demandé
44+ # ou --password <mdp>)
45+time-time user join <username> --team <équipe> # ajoute un compte existant
46+ # à une équipe
47+```
48+
49+Variables d'environnement du serveur :
50+
51+| Variable | Rôle |
52+|---|---|
53+| `POSTGRESQL_ADDON_URI` ou `DATABASE_URL` | connexion PostgreSQL (TLS imposé côté client quoi que dise l'URL) |
54+| `BISCUIT_PRIVATE_KEY` | clé privée racine (hex, via `keygen`) |
55+| `PORT` | port d'écoute (défaut 8080) |
56+
57+### Développement local
58+
59+```bash
60+cargo build && cargo test
61+DATABASE_URL='postgresql://…' \
62+BISCUIT_PRIVATE_KEY=$(cargo run -- keygen | grep -o '[0-9a-f]\{64\}') \
63+PORT=8090 cargo run -- serve
64+```
65+
66+Audit d'accessibilité récurrent : voir `a11y/audit.mjs` (axe-core + Chrome
67+headless sur les 12 écrans, exit 1 à la moindre violation sérieuse).
68+
69+## Déployer sur Clever Cloud
70+
71+Prérequis : [clever-tools](https://www.clever-cloud.com/doc/clever-tools/)
72+(`npm i -g clever-tools`) et `clever login`.
73+
74+```bash
75+# 1. Créer l'application Rust (dans le clone du dépôt)
76+clever create --type rust time-time
77+
78+# 2. Créer l'add-on PostgreSQL et le lier à l'application
79+clever addon create postgresql-addon time-time-db --plan dev
80+clever service link-addon time-time-db
81+# → l'app reçoit POSTGRESQL_ADDON_URI automatiquement
82+
83+# 3. Générer et poser la clé biscuit (à garder précieusement :
84+# la changer invalide toutes les sessions)
85+clever env set BISCUIT_PRIVATE_KEY "$(cargo run -- keygen | grep -o '[0-9a-f]\{64\}')"
86+
87+# 4. Déployer (pousse le HEAD git ; les migrations s'appliquent au boot)
88+clever deploy
89+clever logs # suivre le démarrage
90+
91+# 5. Créer la première équipe et le premier compte, depuis ta machine,
92+# en visant la base de l'add-on
93+export POSTGRESQL_ADDON_URI="$(clever env | grep '^POSTGRESQL_ADDON_URI=' | cut -d'"' -f2)"
94+cargo run -- team add "Maison"
95+cargo run -- user add alice --team "Maison"
96+```
97+
98+Notes :
99+
100+- Le fichier `.clever.json` créé par `clever create`/`clever link` contient
101+ les identifiants de l'app est **ignoré par git** par défaut.
102+- Dimensionnement éprouvé : build flavor `L`, run flavor `nano`
103+ (`clever scale --build-flavor L --flavor nano`).
104+- Le plan PostgreSQL DEV est limité à 5 connexions : le pool de l'app est
105+ calibré à 2 pour survivre à la cohabitation bleu-vert d'un déploiement.
106+- Écrire les migrations pour qu'elles passent sur les données déjà en
107+ production : l'ancien et le nouveau binaire cohabitent quelques secondes.
108+
109+## Licence
110+
111+[The Unlicense](LICENSE) — domaine public.