judu/ex-egopublic Fork
⑂ 85f0632
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

feat: l'application s'appelle Ex Ego — à l'oreille « ex aequo », à la lettre « ex-ego » ; binaire/crate renommés exego, manifest PWA, titres, README et CLAUDE.mdUnverified

Claude-Session: https://claude.ai/code/session_01FPKHKGfqvnvXKY9tNhYmkh
Julien Durillon committed 2026-08-09T00:49:35+02:00 Browse files
85f0632 parent: 6f4aaf0
modified Cargo.lock +28 -28
@@ -753,6 +753,34 @@ dependencies = [
753753 "pin-project-lite",
754754 ]
755755
756+[[package]]
757+name = "exego"
758+version = "0.1.0"
759+dependencies = [
760+ "anyhow",
761+ "argon2",
762+ "askama",
763+ "axum",
764+ "axum-extra",
765+ "biscuit-auth",
766+ "chrono",
767+ "chrono-tz",
768+ "clap",
769+ "hex",
770+ "hmac",
771+ "rpassword",
772+ "serde",
773+ "sha2 0.10.9",
774+ "sqlx",
775+ "subtle",
776+ "thiserror 2.0.19",
777+ "time",
778+ "tokio",
779+ "tracing",
780+ "tracing-subscriber",
781+ "uuid",
782+]
783+
756784 [[package]]
757785 name = "ff"
758786 version = "0.13.1"
@@ -2479,34 +2507,6 @@ dependencies = [
24792507 "time-core",
24802508 ]
24812509
2482-[[package]]
2483-name = "time-time"
2484-version = "0.1.0"
2485-dependencies = [
2486- "anyhow",
2487- "argon2",
2488- "askama",
2489- "axum",
2490- "axum-extra",
2491- "biscuit-auth",
2492- "chrono",
2493- "chrono-tz",
2494- "clap",
2495- "hex",
2496- "hmac",
2497- "rpassword",
2498- "serde",
2499- "sha2 0.10.9",
2500- "sqlx",
2501- "subtle",
2502- "thiserror 2.0.19",
2503- "time",
2504- "tokio",
2505- "tracing",
2506- "tracing-subscriber",
2507- "uuid",
2508-]
2509-
25102510 [[package]]
25112511 name = "tinystr"
25122512 version = "0.8.3"
@@ -753,6 +753,34 @@ dependencies = [
753 "pin-project-lite",753 "pin-project-lite",
754 ]754 ]
755 755
756+[[package]]
757+name = "exego"
758+version = "0.1.0"
759+dependencies = [
760+ "anyhow",
761+ "argon2",
762+ "askama",
763+ "axum",
764+ "axum-extra",
765+ "biscuit-auth",
766+ "chrono",
767+ "chrono-tz",
768+ "clap",
769+ "hex",
770+ "hmac",
771+ "rpassword",
772+ "serde",
773+ "sha2 0.10.9",
774+ "sqlx",
775+ "subtle",
776+ "thiserror 2.0.19",
777+ "time",
778+ "tokio",
779+ "tracing",
780+ "tracing-subscriber",
781+ "uuid",
782+]
783+
756 [[package]]784 [[package]]
757 name = "ff"785 name = "ff"
758 version = "0.13.1"786 version = "0.13.1"
@@ -2479,34 +2507,6 @@ dependencies = [
2479 "time-core",2507 "time-core",
2480 ]2508 ]
2481 2509
2482-[[package]]
2483-name = "time-time"
2484-version = "0.1.0"
2485-dependencies = [
2486- "anyhow",
2487- "argon2",
2488- "askama",
2489- "axum",
2490- "axum-extra",
2491- "biscuit-auth",
2492- "chrono",
2493- "chrono-tz",
2494- "clap",
2495- "hex",
2496- "hmac",
2497- "rpassword",
2498- "serde",
2499- "sha2 0.10.9",
2500- "sqlx",
2501- "subtle",
2502- "thiserror 2.0.19",
2503- "time",
2504- "tokio",
2505- "tracing",
2506- "tracing-subscriber",
2507- "uuid",
2508-]
2509-
2510 [[package]]2510 [[package]]
2511 name = "tinystr"2511 name = "tinystr"
2512 version = "0.8.3"2512 version = "0.8.3"
modified Cargo.toml +1 -1
@@ -1,5 +1,5 @@
11 [package]
2-name = "time-time"
2+name = "exego"
33 version = "0.1.0"
44 edition = "2024"
55 license = "Unlicense"
@@ -1,5 +1,5 @@
1 [package]1 [package]
2-name = "time-time"2+name = "exego"
3 version = "0.1.0"3 version = "0.1.0"
4 edition = "2024"4 edition = "2024"
5 license = "Unlicense"5 license = "Unlicense"
modified README.md +14 -11
@@ -1,4 +1,7 @@
1-# time-time
1+# Ex Ego
2+
3+**Ex Ego** — à l'oreille *ex aequo* (l'objectif : à égalité), à la lettre
4+*ex-ego* (le moyen : on dépose l'ego et on mesure de bonne foi).
25
36 Application web de comptage de temps par catégorie et de tâches partagées, en
47 équipe. Mobile-first (PWA), UI trilingue (français, anglais, allemand), rendu
@@ -85,13 +88,13 @@ par CLI). Toutes les commandes appliquent les migrations au démarrage et
8588 lisent la base via `POSTGRESQL_ADDON_URI` (prioritaire) ou `DATABASE_URL`.
8689
8790 ```bash
88-time-time serve # lance le serveur (défaut)
89-time-time keygen # génère BISCUIT_PRIVATE_KEY
90-time-time team add <nom> # crée une équipe
91-time-time user add <username> --team <équipe> # crée un compte (mdp demandé
92- # ou --password <mdp>)
93-time-time user join <username> --team <équipe> # ajoute un compte existant
94- # à une équipe
91+exego serve # lance le serveur (défaut)
92+exego keygen # génère BISCUIT_PRIVATE_KEY
93+exego team add <nom> # crée une équipe
94+exego user add <username> --team <équipe> # crée un compte (mdp demandé
95+ # ou --password <mdp>)
96+exego user join <username> --team <équipe> # ajoute un compte existant
97+ # à une équipe
9598 ```
9699
97100 Variables d'environnement du serveur :
@@ -122,11 +125,11 @@ Prérequis : [clever-tools](https://www.clever-cloud.com/doc/clever-tools/)
122125
123126 ```bash
124127 # 1. Créer l'application Rust (dans le clone du dépôt)
125-clever create --type rust time-time
128+clever create --type rust exego
126129
127130 # 2. Créer l'add-on PostgreSQL et le lier à l'application
128-clever addon create postgresql-addon time-time-db --plan dev
129-clever service link-addon time-time-db
131+clever addon create postgresql-addon exego-db --plan dev
132+clever service link-addon exego-db
130133 # → l'app reçoit POSTGRESQL_ADDON_URI automatiquement
131134
132135 # 3. Générer et poser la clé biscuit (à garder précieusement :
@@ -1,4 +1,7 @@
1-# time-time1+# Ex Ego
2+
3+**Ex Ego** — à l'oreille *ex aequo* (l'objectif : à égalité), à la lettre
4+*ex-ego* (le moyen : on dépose l'ego et on mesure de bonne foi).
2 5
3 Application web de comptage de temps par catégorie et de tâches partagées, en6 Application web de comptage de temps par catégorie et de tâches partagées, en
4 équipe. Mobile-first (PWA), UI trilingue (français, anglais, allemand), rendu7 équipe. Mobile-first (PWA), UI trilingue (français, anglais, allemand), rendu
@@ -85,13 +88,13 @@ par CLI). Toutes les commandes appliquent les migrations au démarrage et
85 lisent la base via `POSTGRESQL_ADDON_URI` (prioritaire) ou `DATABASE_URL`.88 lisent la base via `POSTGRESQL_ADDON_URI` (prioritaire) ou `DATABASE_URL`.
86 89
87 ```bash90 ```bash
88-time-time serve # lance le serveur (défaut)91+exego serve # lance le serveur (défaut)
89-time-time keygen # génère BISCUIT_PRIVATE_KEY92+exego keygen # génère BISCUIT_PRIVATE_KEY
90-time-time team add <nom> # crée une équipe93+exego team add <nom> # crée une équipe
91-time-time user add <username> --team <équipe> # crée un compte (mdp demandé94+exego user add <username> --team <équipe> # crée un compte (mdp demandé
92- # ou --password <mdp>)95+ # ou --password <mdp>)
93-time-time user join <username> --team <équipe> # ajoute un compte existant96+exego user join <username> --team <équipe> # ajoute un compte existant
94- # à une équipe97+ # à une équipe
95 ```98 ```
96 99
97 Variables d'environnement du serveur :100 Variables d'environnement du serveur :
@@ -122,11 +125,11 @@ Prérequis : [clever-tools](https://www.clever-cloud.com/doc/clever-tools/)
122 125
123 ```bash126 ```bash
124 # 1. Créer l'application Rust (dans le clone du dépôt)127 # 1. Créer l'application Rust (dans le clone du dépôt)
125-clever create --type rust time-time128+clever create --type rust exego
126 129
127 # 2. Créer l'add-on PostgreSQL et le lier à l'application130 # 2. Créer l'add-on PostgreSQL et le lier à l'application
128-clever addon create postgresql-addon time-time-db --plan dev131+clever addon create postgresql-addon exego-db --plan dev
129-clever service link-addon time-time-db132+clever service link-addon exego-db
130 # → l'app reçoit POSTGRESQL_ADDON_URI automatiquement133 # → l'app reçoit POSTGRESQL_ADDON_URI automatiquement
131 134
132 # 3. Générer et poser la clé biscuit (à garder précieusement :135 # 3. Générer et poser la clé biscuit (à garder précieusement :
modified a11y/audit.mjs +1 -1
@@ -4,7 +4,7 @@
44 // (exit 1) à la moindre violation axe « critical » ou « serious » ;
55 // les violations moindres sont listées en avertissement.
66 //
7-// Prérequis : un serveur time-time qui tourne (base dev !) avec un compte
7+// Prérequis : un serveur exego qui tourne (base dev !) avec un compte
88 // membre d'au moins deux équipes, dont l'équipe active a ≥ 1 catégorie et
99 // ≥ 1 temps saisi. Exemple de mise en place :
1010 //
@@ -4,7 +4,7 @@
4 // (exit 1) à la moindre violation axe « critical » ou « serious » ;4 // (exit 1) à la moindre violation axe « critical » ou « serious » ;
5 // les violations moindres sont listées en avertissement.5 // les violations moindres sont listées en avertissement.
6 //6 //
7-// Prérequis : un serveur time-time qui tourne (base dev !) avec un compte7+// Prérequis : un serveur exego qui tourne (base dev !) avec un compte
8 // membre d'au moins deux équipes, dont l'équipe active a ≥ 1 catégorie et8 // membre d'au moins deux équipes, dont l'équipe active a ≥ 1 catégorie et
9 // ≥ 1 temps saisi. Exemple de mise en place :9 // ≥ 1 temps saisi. Exemple de mise en place :
10 //10 //
modified a11y/package.json +1 -1
@@ -1,5 +1,5 @@
11 {
2- "name": "time-time-a11y",
2+ "name": "exego-a11y",
33 "private": true,
44 "type": "module",
55 "scripts": {
@@ -1,5 +1,5 @@
1 {1 {
2- "name": "time-time-a11y",2+ "name": "exego-a11y",
3 "private": true,3 "private": true,
4 "type": "module",4 "type": "module",
5 "scripts": {5 "scripts": {
modified assets/manifest.json +2 -2
@@ -1,6 +1,6 @@
11 {
2- "name": "time-time",
3- "short_name": "time-time",
2+ "name": "Ex Ego",
3+ "short_name": "Ex Ego",
44 "description": "Comptage de temps passé sur des tâches",
55 "start_url": "/",
66 "display": "standalone",
@@ -1,6 +1,6 @@
1 {1 {
2- "name": "time-time",2+ "name": "Ex Ego",
3- "short_name": "time-time",3+ "short_name": "Ex Ego",
4 "description": "Comptage de temps passé sur des tâches",4 "description": "Comptage de temps passé sur des tâches",
5 "start_url": "/",5 "start_url": "/",
6 "display": "standalone",6 "display": "standalone",
modified src/cli.rs +5 -5
@@ -25,7 +25,7 @@ async fn connect() -> Result<PgPool> {
2525 Ok(pool)
2626 }
2727
28-/// `time-time team add <nom>` — création d'équipe côté serveur.
28+/// `exego team add <nom>` — création d'équipe côté serveur.
2929 pub async fn team_add(name: &str) -> Result<()> {
3030 let name = name.trim();
3131 if name.is_empty() {
@@ -44,7 +44,7 @@ pub async fn team_add(name: &str) -> Result<()> {
4444 }
4545 }
4646
47-/// `time-time user add <username> --team <nom>` — création de compte côté
47+/// `exego user add <username> --team <nom>` — création de compte côté
4848 /// serveur, toujours rattaché à une équipe (invariant : jamais sans équipe).
4949 pub async fn user_add(username: &str, password_arg: Option<String>, team: &str) -> Result<()> {
5050 let username = username.trim();
@@ -70,7 +70,7 @@ pub async fn user_add(username: &str, password_arg: Option<String>, team: &str)
7070 let pool = connect().await?;
7171 let team_id = teams::find_by_name(&pool, team.trim())
7272 .await?
73- .with_context(|| format!("l'équipe « {} » n'existe pas (time-time team add)", team.trim()))?;
73+ .with_context(|| format!("l'équipe « {} » n'existe pas (exego team add)", team.trim()))?;
7474
7575 let hash = password::hash(&password)?;
7676 let id = Uuid::now_v7();
@@ -99,7 +99,7 @@ pub async fn user_add(username: &str, password_arg: Option<String>, team: &str)
9999 Ok(())
100100 }
101101
102-/// `time-time user join <username> --team <nom>` — rattache un compte
102+/// `exego user join <username> --team <nom>` — rattache un compte
103103 /// existant à une équipe (équivalent CLI d'une invitation acceptée).
104104 pub async fn user_join(username: &str, team: &str) -> Result<()> {
105105 let username = username.trim();
@@ -110,7 +110,7 @@ pub async fn user_join(username: &str, team: &str) -> Result<()> {
110110 .with_context(|| format!("l'utilisateur « {username} » n'existe pas"))?;
111111 let team_id = teams::find_by_name(&pool, team)
112112 .await?
113- .with_context(|| format!("l'équipe « {team} » n'existe pas (time-time team add)"))?;
113+ .with_context(|| format!("l'équipe « {team} » n'existe pas (exego team add)"))?;
114114 let res = sqlx::query(
115115 "INSERT INTO team_members (team_id, user_id) VALUES ($1, $2) ON CONFLICT DO NOTHING",
116116 )
@@ -25,7 +25,7 @@ async fn connect() -> Result<PgPool> {
25 Ok(pool)25 Ok(pool)
26 }26 }
27 27
28-/// `time-time team add <nom>` — création d'équipe côté serveur.28+/// `exego team add <nom>` — création d'équipe côté serveur.
29 pub async fn team_add(name: &str) -> Result<()> {29 pub async fn team_add(name: &str) -> Result<()> {
30 let name = name.trim();30 let name = name.trim();
31 if name.is_empty() {31 if name.is_empty() {
@@ -44,7 +44,7 @@ pub async fn team_add(name: &str) -> Result<()> {
44 }44 }
45 }45 }
46 46
47-/// `time-time user add <username> --team <nom>` — création de compte côté47+/// `exego user add <username> --team <nom>` — création de compte côté
48 /// serveur, toujours rattaché à une équipe (invariant : jamais sans équipe).48 /// serveur, toujours rattaché à une équipe (invariant : jamais sans équipe).
49 pub async fn user_add(username: &str, password_arg: Option<String>, team: &str) -> Result<()> {49 pub async fn user_add(username: &str, password_arg: Option<String>, team: &str) -> Result<()> {
50 let username = username.trim();50 let username = username.trim();
@@ -70,7 +70,7 @@ pub async fn user_add(username: &str, password_arg: Option<String>, team: &str)
70 let pool = connect().await?;70 let pool = connect().await?;
71 let team_id = teams::find_by_name(&pool, team.trim())71 let team_id = teams::find_by_name(&pool, team.trim())
72 .await?72 .await?
73- .with_context(|| format!("l'équipe « {} » n'existe pas (time-time team add)", team.trim()))?;73+ .with_context(|| format!("l'équipe « {} » n'existe pas (exego team add)", team.trim()))?;
74 74
75 let hash = password::hash(&password)?;75 let hash = password::hash(&password)?;
76 let id = Uuid::now_v7();76 let id = Uuid::now_v7();
@@ -99,7 +99,7 @@ pub async fn user_add(username: &str, password_arg: Option<String>, team: &str)
99 Ok(())99 Ok(())
100 }100 }
101 101
102-/// `time-time user join <username> --team <nom>` — rattache un compte102+/// `exego user join <username> --team <nom>` — rattache un compte
103 /// existant à une équipe (équivalent CLI d'une invitation acceptée).103 /// existant à une équipe (équivalent CLI d'une invitation acceptée).
104 pub async fn user_join(username: &str, team: &str) -> Result<()> {104 pub async fn user_join(username: &str, team: &str) -> Result<()> {
105 let username = username.trim();105 let username = username.trim();
@@ -110,7 +110,7 @@ pub async fn user_join(username: &str, team: &str) -> Result<()> {
110 .with_context(|| format!("l'utilisateur « {username} » n'existe pas"))?;110 .with_context(|| format!("l'utilisateur « {username} » n'existe pas"))?;
111 let team_id = teams::find_by_name(&pool, team)111 let team_id = teams::find_by_name(&pool, team)
112 .await?112 .await?
113- .with_context(|| format!("l'équipe « {team} » n'existe pas (time-time team add)"))?;113+ .with_context(|| format!("l'équipe « {team} » n'existe pas (exego team add)"))?;
114 let res = sqlx::query(114 let res = sqlx::query(
115 "INSERT INTO team_members (team_id, user_id) VALUES ($1, $2) ON CONFLICT DO NOTHING",115 "INSERT INTO team_members (team_id, user_id) VALUES ($1, $2) ON CONFLICT DO NOTHING",
116 )116 )
modified src/config.rs +1 -1
@@ -36,7 +36,7 @@ pub fn default_lang() -> crate::i18n::Lang {
3636
3737 pub fn biscuit_private_key_hex() -> Result<String> {
3838 std::env::var("BISCUIT_PRIVATE_KEY")
39- .context("BISCUIT_PRIVATE_KEY doit être définie (générer avec `time-time keygen`)")
39+ .context("BISCUIT_PRIVATE_KEY doit être définie (générer avec `exego keygen`)")
4040 }
4141
4242 #[cfg(test)]
@@ -36,7 +36,7 @@ pub fn default_lang() -> crate::i18n::Lang {
36 36
37 pub fn biscuit_private_key_hex() -> Result<String> {37 pub fn biscuit_private_key_hex() -> Result<String> {
38 std::env::var("BISCUIT_PRIVATE_KEY")38 std::env::var("BISCUIT_PRIVATE_KEY")
39- .context("BISCUIT_PRIVATE_KEY doit être définie (générer avec `time-time keygen`)")39+ .context("BISCUIT_PRIVATE_KEY doit être définie (générer avec `exego keygen`)")
40 }40 }
41 41
42 #[cfg(test)]42 #[cfg(test)]
modified src/main.rs +2 -2
@@ -19,7 +19,7 @@ use sqlx::postgres::PgPoolOptions;
1919 use crate::state::AppState;
2020
2121 #[derive(Parser)]
22-#[command(name = "time-time", about = "Comptage de temps passé sur des catégories")]
22+#[command(name = "exego", about = "Ex Ego — comptage de temps partagé par catégories")]
2323 struct Cli {
2424 #[command(subcommand)]
2525 command: Option<Command>,
@@ -50,7 +50,7 @@ enum UserCommand {
5050 username: String,
5151 #[arg(long)]
5252 password: Option<String>,
53- /// Équipe d'accueil (doit exister — `time-time team add`)
53+ /// Équipe d'accueil (doit exister — `exego team add`)
5454 #[arg(long)]
5555 team: String,
5656 },
@@ -19,7 +19,7 @@ use sqlx::postgres::PgPoolOptions;
19 use crate::state::AppState;19 use crate::state::AppState;
20 20
21 #[derive(Parser)]21 #[derive(Parser)]
22-#[command(name = "time-time", about = "Comptage de temps passé sur des catégories")]22+#[command(name = "exego", about = "Ex Ego — comptage de temps partagé par catégories")]
23 struct Cli {23 struct Cli {
24 #[command(subcommand)]24 #[command(subcommand)]
25 command: Option<Command>,25 command: Option<Command>,
@@ -50,7 +50,7 @@ enum UserCommand {
50 username: String,50 username: String,
51 #[arg(long)]51 #[arg(long)]
52 password: Option<String>,52 password: Option<String>,
53- /// Équipe d'accueil (doit exister — `time-time team add`)53+ /// Équipe d'accueil (doit exister — `exego team add`)
54 #[arg(long)]54 #[arg(long)]
55 team: String,55 team: String,
56 },56 },
modified templates/app.html +1 -1
@@ -1,5 +1,5 @@
11 {% extends "base.html" %}
2-{% block title %}{{ shell.title }} · time-time{% endblock %}
2+{% block title %}{{ shell.title }} · Ex Ego{% endblock %}
33 {% block lang %}{{ shell.lang_code }}{% endblock %}
44 {% block body %}
55 <header class="app-header">
@@ -1,5 +1,5 @@
1 {% extends "base.html" %}1 {% extends "base.html" %}
2-{% block title %}{{ shell.title }} · time-time{% endblock %}2+{% block title %}{{ shell.title }} · Ex Ego{% endblock %}
3 {% block lang %}{{ shell.lang_code }}{% endblock %}3 {% block lang %}{{ shell.lang_code }}{% endblock %}
4 {% block body %}4 {% block body %}
5 <header class="app-header">5 <header class="app-header">
modified templates/base.html +2 -2
@@ -4,13 +4,13 @@
44 <meta charset="utf-8">
55 <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
66 <meta name="theme-color" content="#f5ead8">
7-<meta name="apple-mobile-web-app-title" content="time-time">
7+<meta name="apple-mobile-web-app-title" content="Ex Ego">
88 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
99 <link rel="manifest" href="{{ crate::routes::statics::manifest_href() }}">
1010 <link rel="icon" href="{{ crate::routes::statics::icon_href() }}">
1111 <link rel="apple-touch-icon" href="{{ crate::routes::statics::icon_href() }}">
1212 <link rel="stylesheet" href="{{ crate::routes::statics::css_href() }}">
13-<title>{% block title %}time-time{% endblock %}</title>
13+<title>{% block title %}Ex Ego{% endblock %}</title>
1414 </head>
1515 <body>
1616 <div class="viewport">
@@ -4,13 +4,13 @@
4 <meta charset="utf-8">4 <meta charset="utf-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">5 <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
6 <meta name="theme-color" content="#f5ead8">6 <meta name="theme-color" content="#f5ead8">
7-<meta name="apple-mobile-web-app-title" content="time-time">7+<meta name="apple-mobile-web-app-title" content="Ex Ego">
8 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">8 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
9 <link rel="manifest" href="{{ crate::routes::statics::manifest_href() }}">9 <link rel="manifest" href="{{ crate::routes::statics::manifest_href() }}">
10 <link rel="icon" href="{{ crate::routes::statics::icon_href() }}">10 <link rel="icon" href="{{ crate::routes::statics::icon_href() }}">
11 <link rel="apple-touch-icon" href="{{ crate::routes::statics::icon_href() }}">11 <link rel="apple-touch-icon" href="{{ crate::routes::statics::icon_href() }}">
12 <link rel="stylesheet" href="{{ crate::routes::statics::css_href() }}">12 <link rel="stylesheet" href="{{ crate::routes::statics::css_href() }}">
13-<title>{% block title %}time-time{% endblock %}</title>13+<title>{% block title %}Ex Ego{% endblock %}</title>
14 </head>14 </head>
15 <body>15 <body>
16 <div class="viewport">16 <div class="viewport">
modified templates/login.html +2 -2
@@ -1,12 +1,12 @@
11 {% extends "base.html" %}
2-{% block title %}{{ tr.login_title }} · time-time{% endblock %}
2+{% block title %}{{ tr.login_title }} · Ex Ego{% endblock %}
33 {% block lang %}{{ lang_code }}{% endblock %}
44 {% block body %}
55 <main class="login">
66 <div class="login-icon">
77 <svg width="34" height="34" viewBox="0 0 24 24" fill="none" stroke="#f5ead8" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"></circle><path d="M12 7v5l3 2"></path></svg>
88 </div>
9- <h1>time-time</h1>
9+ <h1>Ex Ego</h1>
1010 <p class="tagline">{{ tr.tagline }}</p>
1111 <form method="post" action="/login">
1212 <div class="field" style="margin-bottom:var(--space-3)">
@@ -1,12 +1,12 @@
1 {% extends "base.html" %}1 {% extends "base.html" %}
2-{% block title %}{{ tr.login_title }} · time-time{% endblock %}2+{% block title %}{{ tr.login_title }} · Ex Ego{% endblock %}
3 {% block lang %}{{ lang_code }}{% endblock %}3 {% block lang %}{{ lang_code }}{% endblock %}
4 {% block body %}4 {% block body %}
5 <main class="login">5 <main class="login">
6 <div class="login-icon">6 <div class="login-icon">
7 <svg width="34" height="34" viewBox="0 0 24 24" fill="none" stroke="#f5ead8" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"></circle><path d="M12 7v5l3 2"></path></svg>7 <svg width="34" height="34" viewBox="0 0 24 24" fill="none" stroke="#f5ead8" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"></circle><path d="M12 7v5l3 2"></path></svg>
8 </div>8 </div>
9- <h1>time-time</h1>9+ <h1>Ex Ego</h1>
10 <p class="tagline">{{ tr.tagline }}</p>10 <p class="tagline">{{ tr.tagline }}</p>
11 <form method="post" action="/login">11 <form method="post" action="/login">
12 <div class="field" style="margin-bottom:var(--space-3)">12 <div class="field" style="margin-bottom:var(--space-3)">