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
db6279e parent: c538051 modified
.gitignore +1 -0 | @@ -1 +1,2 @@ | ||
| 1 | 1 | /target |
| 2 | +.clever.json | |
| @@ -1 +1,2 @@ | |||
| 1 | /target | 1 | /target |
| 2 | +.clever.json | ||
modified
Cargo.toml +1 -0 | @@ -2,6 +2,7 @@ | ||
| 2 | 2 | name = "time-time" |
| 3 | 3 | version = "0.1.0" |
| 4 | 4 | edition = "2024" |
| 5 | +license = "Unlicense" | |
| 5 | 6 | |
| 6 | 7 | [dependencies] |
| 7 | 8 | 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. | ||