Repository: Sharly-Chess/sharly-chess
Pull request #486: Cleaned and translated dev doc
Author: login: pascalaubry
Created: 2025-05-01T07:10:40Z | Merged: 2025-05-06T11:13:48Z



Diff:
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index b39737dc09..fbf974fbd6 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -5,7 +5,7 @@
 /docs @Amaras
 
 # changes due to i18n scripts have no owner, might be changed later
-/docs/86-i18n.md
+/docs/technical-appendices/86-i18n.md
 /locale
 
 # In the future, plugins might have code owners
diff --git a/COPYRIGHT.md b/COPYRIGHT.md
deleted file mode 100644
index 64cdbe122a..0000000000
--- a/COPYRIGHT.md
+++ /dev/null
@@ -1,35 +0,0 @@
-**[Retour au sommaire de la documentation](README.md)**
-
-# Sharly Chess - Copyright
-
-Papi-web - © The Sharly Chess project 2013-2025 - https://github.com/Sharly-Chess/sharly-chess
-
-## License
-
-Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE, sans même la garantie implicite de COMMERCIALISATION ou D'ADAPTATION A UN USAGE PARTICULIER. Consultez la Licence Publique Générale Affero («&nbsp;GNU Affero General Public License&nbsp;») pour plus de détails.
-
-Vous trouverez une [copie de la Licence Publique Générale Affero](LICENSE.md) («&nbsp;GNU Affero General Public License&nbsp;») avec ce programme.
-
-Vous pouvez aussi consulter les termes complets de la licence à l'adresse https://www.gnu.org/licenses/.
-
-## Limites
-
-Dans tous les cas, si vous redistribuez ce produit vous devez :
-
-- le distribuer sous licence AGLP V3 (ou supérieure) et donc mettre à disposition tous les sources ;
-- faire référence au produit d'origine (Papi-web) ;
-- ne pas laisser d’ambiguïté sur l'origine du produit, qui pourrait laisser penser que vous en êtes l'auteur·ice ;
-
-Le terme distribution inclut ici toute livraison, même à un client unique, ainsi que la fourniture de services (hébergement, mode SaaS).
-
-## Propriété
-
-En dehors du logiciel lui-même et des éléments issus de contributions disponibles sur la page de téléchargement, les données, images et documents disponibles sur ce site sont la propriété du projet Papi-web.
-
-Toute diffusion ou réutilisation sans l'accord explicite du projet Papi-web est interdite.
-
-Ceci inclut les documents et supports fournis lors des prestations dans le cadre de notre offre de services (formations ou autres).
-
-### Remarque
-
-Papi-web a été placé sous licence AGPL à partir de la version 2.4.
diff --git a/LICENSE.md b/LICENSE.md
index f49c18d6d2..b156cf4197 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,7 +1,4 @@
-**[Retour au sommaire de la documentation](README.md)**
-
-GNU Affero General Public License
-=================================
+# GNU Affero General Public License
 
 _Version 3, 19 November 2007_
 _Copyright © 2007 Free Software Foundation, Inc. &lt;<http://fsf.org/>&gt;_
diff --git a/README.md b/README.md
index 04d8796ff8..e7f4f089a2 100644
--- a/README.md
+++ b/README.md
@@ -1,25 +1,30 @@
-# Sharly Chess, an arbiting tool
+# _Sharly Chess_
 
-Sharly Chess - © Projet Sharly Chess 2013-2025 - https://github.com/Sharly-Chess/sharly-chess/ ([copyright](COPYRIGHT.md))
+_Sharly Chess - © Sharly Chess project 2013-2025_
 
-<!-- DO NOT EDIT! (START) -->
-- **[Download the latest stable version (2.5.8)](https://github.com/Sharly-Chess/sharly-chess/releases/download/2.5.8/papi-web-2.5.8.zip)**
-<!-- DO NOT EDIT! (END) -->
+## User documentation
 
-## Généralités
+**Please visit [sharly-chess.com](https://sharly-chess.com)** (installation guide [here](https://sharly-chess.com/installation)).
 
-Sharly Chess is a tool for arbitrating chess competitions.
+## Developer documentation
 
-- Refer to the [user documentation](https://sharly-chess.com) for installation and usage instructions.
-- [Detailed roadmap](/docs/02-roadmap.md)
-- [Contributors](/docs/04-contributors.md)
+### Technical appendices
 
-## [Annexes techniques](docs/80-technical-annexes.md)
+- [Detailed roadmap](docs/technical-appendices/detailed-roadmap.md)
+- [Interfaçing _Sharly Chess_ with _ChessEvent_](docs/technical-appendices/chessevent-interfacing.md)
+- [Setting up a development environment](docs/technical-appendices/dev-setup.md)
+- [Description of the databases](docs/technical-appendices/databases.md)
+- [Internationalization](docs/technical-appendices/i18n.md)
 
-- URLs utilisées par le serveur web
-- Interface avec Chess Event
-- Installation d'un environnement de développement
-- Distribution du logiciel
-- Description de la base de données
+### Sandbox
 
-## [Bac à sable](docs/90-sandbox.md)
+- [Communication to players](docs/sandbox/communication-to-players.md)
+- [Authenticating the user](docs/sandbox/authentication-and-roles.md)
+- [Pairing actions](docs/sandbox/pairing-actions.md)
+
+### Contributing
+
+- [Contributing guide](docs/contributing/contributing-guide.md)
+- [Contributors](/docs/contributing/contributors.md)
+- [Copyright](https://sharly-chess.com/copyright)
+- [License](https://sharly-chess.com/license)
diff --git a/TODO b/TODO
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/docs/02-roadmap.md b/docs/02-roadmap.md
deleted file mode 100644
index 7c85934b95..0000000000
--- a/docs/02-roadmap.md
+++ /dev/null
@@ -1,81 +0,0 @@
-**[Retour au sommaire de la documentation](../README.md)**
-
-# Sharly Chess - Roadmap
-
-- LAN = local network usage (on a local server)
-- SaaS = online usage (on a remote server)
-
-|  | PW 1.19<br>Jan 2023 | PW 2.0<br/>Nov 2023 | PW 2.1<br/>Dec 2023 | PW 2.2<br/>Mar 2024 | PW 2.3<br/>Apr 2024 | PW 2.4<br/>Oct 2024 | PW 2.5<br/>Apr 2025 | PW 2.x<br/>2025 | SC 3.0<br/>2025 |
-|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
-| **LAN** | **PW 1.19** | **PW 2.0** | **PW 2.1** | **PW 2.2** | **PW 2.3** | **PW 2.4** | **PW 2.5** | **PW 2.x** | **SC 3.0** |
-| Open source | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Free software license | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ AGPL | :heavy_check_mark:︎ AGPL | :heavy_check_mark:︎ AGPL | :heavy_check_mark:︎ AGPL |
-| Built-in web server | :x:︎ XAMPP | :heavy_check_mark:︎ Django | :heavy_check_mark:︎ Django | :heavy_check_mark:︎ Litestar | :heavy_check_mark:︎ Litestar | :heavy_check_mark:︎ Litestar | :heavy_check_mark:︎ Litestar | :heavy_check_mark:︎ Litestar | :heavy_check_mark:︎ Litestar |
-| Built-in database driver | :x:︎ ODBC | :x:︎ ODBC | :x:︎ ODBC | :x:︎ ODBC | :x:︎ ODBC | :x:︎ ODBC | :x:︎ ODBC | :x:︎ ODBC | :heavy_check_mark:︎ SQLite |
-| Windows support | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Windows executable | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Windows executable signing | - | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ |:grey_question:|:grey_question:|
-| Linux support | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ |
-| Mac support | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ |
-| Papi-web configuration | :x:︎ PHP | :heavy_check_mark:︎ INI | :heavy_check_mark:︎ INI | :heavy_check_mark:︎ INI | :heavy_check_mark:︎ INI | :heavy_check_mark:︎ INI | :heavy_check_mark:︎ INI | :heavy_check_mark:︎ INI | :heavy_check_mark:︎ INI/SQLite |
-| Event configuration | :x:︎ PHP | :x:︎ INI | :x:︎ INI | :x:︎ INI | :x:︎ INI | :heavy_check_mark:︎ Web | :heavy_check_mark:︎ Web | :heavy_check_mark:︎ Web | :heavy_check_mark:︎ Web |
-| Tournament storage | :x:︎ Access | :x:︎ Access | :x:︎ Access | :x:︎ Access | :x:︎ Access | :x:︎ Access | :x:︎ Access | :x:︎ Access | :heavy_check_mark:︎ SQLite |
-| Event storage | - | :x:︎ File | :x:︎ File | :x:︎ File | :x:︎ File | :heavy_check_mark:︎ SQLite | :heavy_check_mark:︎ SQLite | :heavy_check_mark:︎ SQLite | :heavy_check_mark:︎ SQLite |
-
-| **SAAS** | **PW 1.19** | **PW 2.0** | **PW 2.1** | **PW 2.2** | **PW 2.3** | **PW 2.4** | **PW 2.5** | **PW 2.x** | **SC 3.0** |
-|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
-| Availability | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ |:grey_question:|
-| Open source | - | - | - | - | - | - | - | - |:grey_question:|
-| Free software license | - | - | - | - | - | - | - | - |:grey_question:|
-| Storage | - | - | - | - | - | - | - | - |:grey_question:|
-
-| **PAIRINGS** | **PW 1.19** | **PW 2.0** | **PW 2.1** | **PW 2.2** | **PW 2.3** | **PW 2.4** | **PW 2.5** | **PW 2.x** | **SC 3.0** |
-|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
-| Swiss pairings | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.8 | :heavy_check_mark:︎<br/>Papi 3.3.8 | :heavy_check_mark:︎<br/>bbp 5.0.1 | :heavy_check_mark:︎<br/>bbp 5.0.1 |
-| FIDE Handbook C.04 compliance | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ PW 2.5 | :heavy_check_mark:︎ PW 2.6 | :heavy_check_mark:︎ SC 3.0 |
-| Round-robin pairings | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.8 | :heavy_check_mark:︎<br/>Papi 3.3.8 | :heavy_check_mark:︎ PW 2.6 | :heavy_check_mark:︎ SC 3.0 |
-| Manual pairings | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.8 | :heavy_check_mark:︎<br/>Papi 3.3.8 | :heavy_check_mark:︎ PW 2.6 | :heavy_check_mark:︎ SC 3.0 |
-| Draft/Published status | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| TRF16 import/export | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ |
-| TRF25 import/export | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ |
-
-| **RANKINGS** | **PW 1.19** | **PW 2.0** | **PW 2.1** | **PW 2.2** | **PW 2.3** | **PW 2.4** | **PW 2.5** | **PW 2.x** | **SC 3.0** |
-|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
-| Ranking calculation | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.8 | :heavy_check_mark:︎ PW 2.5 | :heavy_check_mark:︎ PW 2.x | :heavy_check_mark:︎ SC 3.0 |
-| FIDE compliance for unplayed games | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :x:︎ | :x:︎ | :heavy_check_mark:︎ PW 2.5 | :heavy_check_mark:︎ PW 2.x | :heavy_check_mark:︎ SC 3.0 |
-| FIDE performance compliance | :x:︎ | :x:︎ | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ PW 2.x | :heavy_check_mark:︎ SC 3.0 |
-
-| **INTERNATIONALIZATION** | **PW 1.19** | **PW 2.0** | **PW 2.1** | **PW 2.2** | **PW 2.3** | **PW 2.4** | **PW 2.5** | **PW 2.x** | **SC 3.0** |
-|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
-| FR (French) | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Multilingual support | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ 2.4.19 | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| EN (English) | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ 2.4.19 | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-
-| **FIDE APPROVAL** | **PW 1.19** | **PW 2.0** | **PW 2.1** | **PW 2.2** | **PW 2.3** | **PW 2.4** | **PW 2.5** | **PW 2.x** | **SC 3.0** |
-|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
-| Approval support | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ |:grey_question:| :heavy_check_mark:︎ |
-
-| **USAGE** | **PW 1.19** | **PW 2.0** | **PW 2.1** | **PW 2.2** | **PW 2.3** | **PW 2.4** | **PW 2.5** | **PW 2.x** | **SC 3.0** |
-|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
-| HTMX usage | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Multi-screen support | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Multi-column support | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Alphabetical pairings | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Rotating displays | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Illegal move recording | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Check-in management | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Result editing | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| FFE - Tournament upload | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| FFE - Data protection | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| ChessEvent - Data download | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Player management | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Pairing printing | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Ranking printing | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Cross-table printing | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| FIDE performances | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Prize calculation | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Norm calculation for players | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Name cards (chevalets) | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :heavy_check_mark:︎ | :heavy_check_mark:︎ |
-| Raffle management (tombola) | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ |:grey_question:|:grey_question:|
-| Arbiter norm certificates | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ |:grey_question:|
-| Team competitions | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ | :x:︎ |:grey_question:|
diff --git a/docs/04-contributors.md b/docs/04-contributors.md
deleted file mode 100644
index a1b8cc539b..0000000000
--- a/docs/04-contributors.md
+++ /dev/null
@@ -1,30 +0,0 @@
-**[Retour au sommaire de la documentation](../README.md)**
-
-# Sharly Chess - Mainteneur·euses
-
-Les mainteneur·euses de Sharly Chess sont les personnes en charge de l'évolution et de la distribution de l'application.
-
-- Pascal AUBRY ([pascalaubry](https://github.com/pascalaubry))
-- Sammy PLAT ([Amaras](https://github.com/Amaras))
-- Timothy ARMES ([timothyarmes](https://github.com/timothyarmes))
-- Youri AUBRY ([molrn](https://github.com/molrn))
-
-# Sharly Chess - Contributeur·ices
-
-Les contributeur·ices de Sharly Chess sont les personnes qui ont contribué à une partie du code ou de la documentation.
-
-- Pascal AUBRY ([pascalaubry](https://github.com/pascalaubry))
-- Sammy PLAT ([Amaras](https://github.com/Amaras))
-- Timothy ARMES ([timothyarmes](https://github.com/timothyarmes))
-- Youri AUBRY ([molrn](https://github.com/molrn))
-- Adrien AVENIA ([adrienave](https://github.com/adrienave))
-
-Depuis la version 2.0, le code source est ouvert aux contributions sur GitHub, il ne tient qu'à vous de figurer sur la liste des contributeur·ices !
-
-# Sharly Chess - Remerciements
-
-Remerciements à Dominique RUHLMANN pour l'adaptation de la plateforme Chess Event pour permettre la création des fichiers Papi depuis Sharly Chess et à tou·tes les bêta-testeur·euses !
-
-Voir également :
-- [Copyright](../COPYRIGHT.md)
-- [Licence AGPL](../LICENSE.md)
diff --git a/docs/80-technical-annexes.md b/docs/80-technical-annexes.md
deleted file mode 100644
index e897fb8368..0000000000
--- a/docs/80-technical-annexes.md
+++ /dev/null
@@ -1,10 +0,0 @@
-**[Retour au sommaire de la documentation](../README.md)**
-
-# Sharly Chess - Annexes techniques
-
-- [URLs utilisées par le serveur web](81-urls.md)
-- [Interfaçage de Sharly Chess avec Chess Event](82-chessevent.md)
-- [Installation d'un environnement de développement](83-dev-setup.md)
-- [Distribution du logiciel](84-export.md)
-- [Description de la base de données](85-database.md)
-- [Internationalisation](86-i18n.md)
diff --git a/docs/85-database.md b/docs/85-database.md
deleted file mode 100644
index a80ea8c3f9..0000000000
--- a/docs/85-database.md
+++ /dev/null
@@ -1,254 +0,0 @@
-**[Retour au sommaire de la documentation](../README.md)**
-
-# Sharly Chess - Annexe technique : Description des bases de données
-
-## Base de données de configuration de Sharly Chess (`events/.scc`)
-
-### Table `info` (configuration générale de l'application)
-
-> [!NOTE]
-> - La table `info` ne contient qu'une seule ligne.
-
-| Champ                      | Type      | Contrainte                 | Description                                                                                                                                    |
-|----------------------------|-----------|----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------|
-| `force_edit`               | `INTEGER` | NOT NULL                   | Booléen :<br/>- `1` : l'édition de la configuration est obligatoire ;<br/>- `0` : l'édition de la configuration ets possible mais facultative. |
-| `log_level`                | `INTEGER` |                            | Le niveau de log.                                                                                                                              |
-| `launch_browser`           | `INTEGER` |                            | Booléen :<br/>- `1` : un navigateur est ouvert automatiquement (par défaut) ;<br/>- `0` : aucun navigateur n'est ouvert.                       |
-| `federation`               | `TEXT`    |                            | Le code de la fédération par défaut des évènements.                                                                                            |
-| `locale`                   | `TEXT`    |                            | Le language utilisé par défaut pour les utilisateur·ices.                                                                                      |
-
-### Table `local_source_database` (bases de données locales)
-
-| Champ            | Type    | Contrainte | Description                                                                                         |
-|------------------|---------|------------|-----------------------------------------------------------------------------------------------------|
-| `name`           | `TEXT`  | NOT NULL   | Le nom de la base de données.                                                                       |
-| `outdated_delay` | `TEXT`  | NOT NULL   | Le délai de mise à jour automatique (`disabled`, `daily`, `2days`, `3days`, `weekly`, `month_1st`). |
-| `outdate_action` | `TEXT`  | NOT NULL   | L'action à effectuer lorsque la base de données doit être mise à jour (`notif`, `auto_update`).     |
-| `updated_at`     | `FLOAT` |            | La date de dernière mise à jour de la base de données.                                              |
-
-### Table `metadata` (méta-données de l'application)
-
-| Champ            | Type    | Contrainte                               | Description                                    |
-|------------------|---------|------------------------------------------|------------------------------------------------|
-| `version`        | `TEXT`  | NOT NULL                                 | La version de l'application.                   |
-| `migration`      | `TEXT`  | NOT NULL<br/>DEFAULT 'm000_no_migration' | La dernière mise à jour de la base de données. |
-
-### Table `plugin` (extensions)
-
-| Champ     | Type      | Contrainte | Description                                                                                |
-|-----------|-----------|------------|--------------------------------------------------------------------------------------------|
-| `name`    | `TEXT`    | NOT NULL   | Le nom de l'extension.                                                                     |
-| `enabled` | `INTEGER` | NOT NULL   | Booléen :<br/>- `1` : l'extension est activée ;<br/>- `0` : l'extension n'est pas activée. |
-
-## Base de données d'évènement (`events/*.db`)
-
-### table `info` (informations générales sur l'évènement)
-
-> [!NOTE]
-> - La table `info` ne contient qu'une seule ligne.
-> - L'identifiant unique du tournoi n'est pas stocké dans la base de données, il est récupéré par le nom du fichier de la base de données de l'évènement.
-
-| Champ                      | Type      | Contrainte                 | Ext.       | Description                                                                                                                                                                                                                                                           |
-|----------------------------|-----------|----------------------------|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `name`                     | `TEXT`    | NOT NULL<br> DEFAULT '?'   |            | Le nom de l'évènement.                                                                                                                                                                                                                                                |
-| `start`                    | `FLOAT`   | NOT NULL                   |            | La date de début de l'évènement (timestamp).                                                                                                                                                                                                                          |
-| `stop`                     | `FLOAT`   | NOT NULL                   |            | La date de fin de l'évènement (timestamp).                                                                                                                                                                                                                            |
-| `public`                   | `INTEGER` |                            |            | Booléen :<br/>- `1` : l'évènement est public (visible par les utilisateur·ices sur l'interface publique') ;<br/>- `0` : l'évènement est réservé aux arbitres.                                                                                                         |
-| `path`                     | `TEXT`    |                            |            | Le chemin, relatif ou absolu, des fichiers Papi des tournois de l'évènement.                                                                                                                                                                                          |
-| `hide_background_image`    | `INTEGER` |                            |            | Booléen :<br/>- `1` : une image de fond est affichée sur les écrans ;<br/>- `0` : aucune image de fond n'est affichée.                                                                                                                                                |
-| `background_image`         | `TEXT`    |                            |            | Une URL ou le chemin relatif (dans le répertoire `/custom`) d'une image locale (par défaut, logo de Sharly Chess est utilisé).                                                                                                                                            |
-| `background_color`         | `TEXT`    |                            |            | La couleur de fond des écrans de l'évènement au format hexadécimal '`#RRGGBB` (par défaut `#E9ECEF`).                                                                                                                                                                 |
-| `update_password`          | `TEXT`    |                            |            | Le mot de passe à fournir pour utiliser les écrans de saisie.                                                                                                                                                                                                         |
-| `record_illegal_moves`     | `INTEGER` |                            |            | Le nombre maximum de coups illégaux que l'on peut enregistrer pour un·e joueur·euse par ronde par défaut (ce nombre peut être modifié pour chaque tournoi de l'évènement). Si ce nombre n'est pas précisé, aucun coup légal ne peut être enregistré (par défaut `0`). |
-| `rules`                    | `TEXT`    |                            |            | L'URL ou le chemin sur le serveur du règlement des tournois de l'évènement, au format PDF.                                                                                                                                                                            |
-| `timer_colors`             | `TEXT`    |                            |            | Les couleurs utilisées par défaut pour les chronomètres au format JSON (dictionnaire avec les clés `'1'`, `'2'` et `'3'`, chaque couleur est stockée au format hexadécimal '`#RRGGBB`').                                                                              |
-| `timer_delays`             | `TEXT`    |                            |            | Les délais utilisés par défaut pour les chronomètres au format JSON (dictionnaire avec les clés `'1'`, `'2'` et `'3'`, chaque délai est stocké sous forme d'un entier, en secondes).                                                                                  |
-| `message_text`             | `TEXT`    |                            |            | Le texte des message d'alerte de l'évènement (par défaut aucun message d'alerte n'est affiché).                                                                                                                                                                       |
-| `message_color`            | `TEXT`    |                            |            | La couleur du texte des message d'alerte de l'évènement au format hexadécimal `#RRGGBB` (par défaut `#FF0000`).                                                                                                                                                       |
-| `message_background_color` | `TEXT`    |                            |            | La couleur de fond des messages d'alerte de l'évènement au format hexadécimal `#RRGGBB` (par défaut `#FFFF00`).                                                                                                                                                       |
-| `last_update`              | `FLOAT`   | NOT NULL                   |            | La date de la dernière mise à jour de l'évènement (timestamp).                                                                                                                                                                                                        |
-| `federation`               | `TEXT`    | NOT NULL<br/>DEFAULT 'NON' |            | Code de la fédération de l'évènement.                                                                                                                                                                                                                                 |
-| `chessevent_user_id`       | `TEXT`    |                            | chessevent | L'identifiant utilisé par défaut pour la connexion à la plateforme ChessEvent.                                                                                                                                                                                        |
-| `chessevent_password`      | `TEXT`    |                            | chessevent | Le mot de passe utilisé par défaut pour la connexion à la plateforme ChessEvent.                                                                                                                                                                                      |
-| `chessevent_event_id`      | `TEXT`    |                            | chessevent | L'identifiant par défaut de l'évènement ChessEvent sur la plateforme.                                                                                                                                                                                                 |
-
-### Table `metadata` (méta-données de l'évènement)
-
-| Champ            | Type    | Contrainte                               | Description                                                   |
-|------------------|---------|------------------------------------------|---------------------------------------------------------------|
-| `version`        | `TEXT`  | NOT NULL                                 | La version de la base de données de l'évènement.              |
-| `migration`      | `TEXT`  | NOT NULL<br/>DEFAULT 'm000_no_migration' | La dernière mise à jour de la base de données de l'évènement. |
-
-### Table `plugin_metadata` (méta-données des extensions pour l'évènement)
-
-| Champ       | Type    | Contrainte                               | Description                                                                    |
-|-------------|---------|------------------------------------------|--------------------------------------------------------------------------------|
-| `name`      | `TEXT`  | NOT NULL                                 | Le nom de l'extension.                                                         |
-| `version`   | `TEXT`  | NOT NULL                                 | La version de la base de données de l'extension pour l'évènement.              |
-| `migration` | `TEXT`  | NOT NULL<br/>DEFAULT 'm000_no_migration' | La dernière mise à jour de la base de données de l'extension pour l'évènement. |
-
-### table `timer` (chronomètre)
-
-| Champ     | Type      | Contrainte                                 | Ext. | Description                                                                                                                                             |
-|-----------|-----------|--------------------------------------------|------|---------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id`      | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |      | L'identifiant du chronomètre.                                                                                                                           |
-| `uniq_id` | `TEXT`    | NOT NULL<br/>UNIQUE                        |      | L'identifiant textuel unique du chronomètre.                                                                                                            |
-| `colors`  | `TEXT`    |                                            |      | Les couleurs utilisées au format JSON (dictionnaire avec les clés `'1'`, `'2'` et `'3'`, chaque couleur est stockée au format hexadécimal '`#RRGGBB`'). |
-| `delays`  | `TEXT`    |                                            |      | Les délais utilisés au format JSON (dictionnaire avec les clés `'1'`, `'2'` et `'3'`, chaque délai est stocké sous forme d'un entier, en secondes).     |
-
-### table `timer_hour` (horaires des chronomètres)
-
-| Champ         | Type      | Contrainte                                 | Ext. | Description                                                                                                                                        |
-|---------------|-----------|--------------------------------------------|------|----------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id`          | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |      | L'identifiant de l'horaire.                                                                                                                        |
-| `uniq_id`     | `TEXT`    | NOT NULL                                   |      | L'identifiant textuel unique de l'horaire (si le champ est un entier positif, l'horaire est identifié comme le début de la ronde correspondante).  |
-| `timer_id`    | `INTEGER` | NOT NULL<br>REFERENCES `timer`(`id`)       |      | L'identifiant du chronomètre.                                                                                                                      |
-| `order`       | `INTEGER` | NOT NULL                                   |      | L'ordre de l'horaire vis-à-vis des autres horaires de son chronomètre.                                                                             |
-| `date_str`    | `TEXT`    |                                            |      | La date de l'horaire au format AAAA-MM-JJ.                                                                                                         |
-| `time_str`    | `TEXT`    |                                            |      | L'heure de l'horaire au format hh:mm.                                                                                                              |
-| `text_before` | `TEXT`    |                                            |      | Le texte à afficher sur le chronomètre avant l'horaire.                                                                                            |
-| `text_after`  | `TEXT`    |                                            |      | Le texte à afficher sur le chronomètre après l'horaire.                                                                                            |
-|               |           | UNIQUE(`uniq_id`, `timer_id`)              |      |
-
-### table `tournament` (tournois)
-
-| Champ                                 | Type      | Contrainte                                 | Ext.       | Description                                                                                                                                                                             |
-|---------------------------------------|-----------|--------------------------------------------|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id`                                  | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |            | L'identifiant du tournoi.                                                                                                                                                               |
-| `uniq_id`                             | `TEXT`    | NOT NULL                                   |            | L'identifiant textuel unique du tournoi.                                                                                                                                                |
-| `name`                                | `TEXT`    | NOT NULL                                   |            | Le nom du tournoi.                                                                                                                                                                      |
-| `path`                                | `TEXT`    |                                            |            | Le chemin absolu ou relatif où est stocké le fichier du tournoi.                                                                                                                        |
-| `filename`                            | `TEXT`    |                                            |            | Le nom du fichier Papi du tournoi, sans l'extension `.papi`.                                                                                                                            |
-| `time_control_initial_time`           | `INTEGER` |                                            |            | Le temps initial à la pendule en secondes (peut être nul si incrément).                                                                                                                 |
-| `time_control_increment`              | `INTEGER` |                                            |            | L'incrément de temps gagné par les joueur·euses à chaque coup.                                                                                                                          |
-| `time_control_handicap_penalty_step`  | `INTEGER` |                                            |            | Le temps retranché au·à la joueur·euse le·la mieux classé·e, en secondes (ce temps est multiplié par le nombre de tranches de différence entre les deux joueur·euses).                  |
-| `time_control_handicap_penalty_value` | `INTEGER` |                                            |            | Le nombre de points de différences entre le classement des joueurs servant à calculer le nombre de pénalités appliquées au·à la joueur·euse le·la mieux classé·e.                       |
-| `time_control_handicap_min_time`      | `INTEGER` |                                            |            | Le temps minimal qui sera accordé au·à la joueur·euse le·la mieux classé·e même si la différence de classement est très importante.                                                     |
-| `record_illegal_moves`                | `INTEGER` |                                            |            | Le nombre maximum de coups illégaux que l'on peut enregistrer pour un·e joueur·euse par ronde. Si ce nombre n'est pas précisé, la configuration par défaut de l'évènement est utilisée. |
-| `rules`                               | `TEXT`    |                                            |            | L'URL ou le chemin sur le serveur du règlement du tournoi, au format PDF (par défaut, le règlement de l'évènement).                                                                     |
-| `check_in_open`                       | `INTEGER` |                                            |            | Booléen :<br/>- `1` : le pointage est ouvert ;<br/>- `0` : le pointage est fermé.                                                                                                       |
-| `last_update`                         | `FLOAT`   | NOT NULL                                   |            | La date de dernière modification du tournoi.                                                                                                                                            |
-| `last_illegal_move_update`            | `FLOAT`   | NOT NULL<br/>DEFAULT 0.0                   |            | La date de dernière modification des coups illégaux du tournoi.                                                                                                                         |
-| `last_result_update`                  | `FLOAT`   | NOT NULL<br/>DEFAULT 0.0                   |            | La date de dernière modification d'un résultat du tournoi.                                                                                                                              |
-| `last_check_in_update`                | `FLOAT`   | NOT NULL<br/>DEFAULT 0.0                   |            | La date de dernière modification du pointage du tournoi.                                                                                                                                |
-| `first_board_number`                  | `INTEGER` |                                            |            | Le numéro du premier échiquier.                                                                                                                                                         |
-| `paired_bye_result`                   | `INTEGER` |                                            |            | Résultat attribué aux joueur·euses exempt·es.                                                                                                                                           |
-| `max_byes`                            | `INTEGER` |                                            |            | Le nombre maximum de byes auquel un·e joueur·euse peut prétendre.                                                                                                                       |
-| `last_rounds_no_byes`                 | `INTEGER` |                                            |            | Le nombre de rondes finales pour lesquelles les joueur·euses ne peuvent prendre de bye                                                                                                  |
-| `tie_breaks`                          | `TEXT`    |                                            |            | Les départages utilisés au format JSON (liste de dictionnaires au format {'type': str, 'options': dict[str,any]})                                                                       |
-| `chessevent_user_id`                  | `TEXT`    |                                            | chessevent | L'identifiant utilisé pour le connexion à la plateforme ChessEvent.                                                                                                                     |
-| `chessevent_password`                 | `TEXT`    |                                            | chessevent | Le mot de passe utilisé pour le connexion à la plateforme ChessEvent.                                                                                                                   |
-| `chessevent_event_id`                 | `TEXT`    |                                            | chessevent | L'identifiant de l'évènement ChessEvent sur la plateforme.                                                                                                                              |
-| `chessevent_tournament_name`          | `TEXT`    |                                            | chessevent | L'identifiant du tournoi sur la plateforme ChessEvent.                                                                                                                                  |
-| `chessevent_last_download_md5`        | `TEXT`    |                                            | chessevent | L'empreinte du dernier téléchargement du tournoi depuis la plateforme ChessEvent.                                                                                                       |
-| `ffe_id`                              | `INTEGER` |                                            | ffe        | Le numéro d'homologation du tournoi sur le site fédéral FFE.                                                                                                                            |
-| `ffe_password`                        | `TEXT`    |                                            | ffe        | Le code d'accès au tournoi sur le site fédéral FFE (composé de 10 lettres majuscules).                                                                                                  |
-| `ffe_last_upload`                     | `FLOAT`   | NOT NULL<br/>DEFAULT 0.0                   | ffe        | La date de dernier envoi du tournoi vers le site fédéral FFE.                                                                                                                           |
-| `ffe_last_rules_upload`               | `FLOAT`   | NOT NULL<br/>DEFAULT 0.0                   | ffe        | La date de dernier envoi du règlement du tournoi vers le site fédéral FFE.                                                                                                              |
-
-### table `illegal_move` (coups illégaux)
-
-| Champ           | Type      | Contrainte                                 | Ext. | Description                                            |
-|-----------------|-----------|--------------------------------------------|------|--------------------------------------------------------|
-| `id`            | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |      | L'identifiant du coup illégal.                         |
-| `tournament_id` | `INTEGER` | NOT NULL<br/>REFERENCES `tournament`(`id`) |      | L'identifiant du tournoi.                              |
-| `round`         | `INTEGER` | NOT NULL                                   |      | Le numéro de la ronde.                                 |
-| `player_id`     | `INTEGER` | NOT NULL                                   |      | Le numéro du joueur (dans le fichier Papi du tournoi). |
-| `date`          | `FLOAT`   | NOT NULL                                   |      | La date d'enregistrement.                              |
-
-### table `result`
-
-| Champ             | Type      | Contrainte                                 | Ext. | Description                                                                                                                                                                       |
-|-------------------|-----------|--------------------------------------------|------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id`              | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |      | L'identifiant du résultat.                                                                                                                                                        |
-| `tournament_id`   | `INTEGER` | NOT NULL<br/>REFERENCES `tournament`(`id`) |      | L'identifiant du tournoi.                                                                                                                                                         |
-| `round`           | `INTEGER` | NOT NULL                                   |      | Le numéro de la ronde.                                                                                                                                                            |
-| `board_id`        | `INTEGER` | NOT NULL                                   |      | Le numéro de l'échiquier.                                                                                                                                                         |
-| `white_player_id` | `INTEGER` | NOT NULL                                   |      | Le numéro du joueur avec les Blancs (dans le fichier Papi du tournoi).                                                                                                            |
-| `black_player_id` | `INTEGER` | NOT NULL                                   |      | Le numéro du joueur avec les Noirs (dans le fichier Papi du tournoi).                                                                                                             |
-| `date`            | `FLOAT`   | NOT NULL                                   |      | La date d'enregistrement.                                                                                                                                                         |
-| `value`           | `INTEGER` | NOT NULL                                   |      | Le résultat :<br/>- `1` : gain Noirs<br/>- `2` : nulle<br/>- `3` : gain Blancs<br/>- `4` : gain Noirs par forfait<br/>- `5` : double forfait<br/>- `6` : gain Blancs par forfait  |
-
-### table `screen` (écrans)
-
-| Champ                    | Type      | Contrainte                                 | Ext. | Description                                                                                                                                                                                                                  |
-|--------------------------|-----------|--------------------------------------------|------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id`                     | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |      | L'identifiant de l'écran.                                                                                                                                                                                                    |
-| `uniq_id`                | `TEXT`    | NOT NULL<br/>UNIQUE                        |      | L'identifiant textuel unique de l'écran.                                                                                                                                                                                     |
-| `type`                   | `TEXT`    | NOT NULL                                   |      | Le type d'écran :<br/>- `input` : saisie des résultats<br/>- `boards` : appariements par échiquier<br/>- `players` : appariements par ordre alphabétique<br/>- `results` : derniers résultats<br/>- `image` : image          |
-| `public`                 | `INTEGER` |                                            |      | Booléen :<br/>- `1` : l'écran est public (visible par les utilisateur·ices sur l'interface publique') ;<br/>- `0` : l'écran est réservé aux arbitres.                                                                        |
-| `name`                   | `TEXT`    |                                            |      | Le nom de l'écran.                                                                                                                                                                                                           |
-| `columns`                | `INTEGER` |                                            |      | Le nombre de colonnes de l'écran.                                                                                                                                                                                            |
-| `menu_link`              | `INTEGER` |                                            |      | Booléen :<br/>- `NULL` si `type` est `image` ;<br/>- `1` : un lien vers cet écran pourra être affiché depuis les autres écrans ;<br/>- `0` : aucun lien vers cet écran ne sera jamais affiché.                               |
-| `menu_text`              | `TEXT`    |                                            |      | `NULL` si `type` est `image`, sinon le texte du lien hypertexte vers l'écran, utilisé sur les autres écrans.                                                                                                                 |
-| `menu`                   | `TEXT`    |                                            |      | `NULL` si `type` est `image`, sinon le menu à afficher sur l'écran (liens hypertextes vers d'autres écrans).                                                                                                                 |
-| `timer_id`               | `INTEGER` | REFERENCES `timer`(`id`)                   |      | L'identifiant du chronomètre.                                                                                                                                                                                                |
-| `input_exit_button`      | `INTEGER` |                                            |      | Booléen :<br/>- `NULL` si `type` différent de `input` ;<br/>- `1` : un bouton permettant de quitter la page est affiché ;<br/>- `0` : le bouton n'est pas affiché.                                                           |
-| `players_show_unpaired`  | `INTEGER` |                                            |      | Booléen :<br/>- `NULL` si `type` différent de `players` ;<br/>- `0` : les joueur·euses non apparié·es sont caché·es ;<br/>- `0` : les joueur·euses non apparié·es sont montré·es.                                            |
-| `results_limit`          | `INTEGER` |                                            |      | - `NULL` si `type` différent de `results` ;<br/>- `0` : tous les derniers résultats sont montrés ;<br/>- entier positif : le nombre maximum de résultats montrés sur l'écran.                                                |
-| `results_max_age`        | `INTEGER` |                                            |      | - `NULL` si `type` différent de `results` ;<br/>- `NULL` ou entier positif : l'âge maximal des résultats affichés sur l'écran (en minutes, par défaut 60).                                                                   |
-| `results_tournament_ids` | `TEXT`    |                                            |      | - `NULL` si `type` différent de `results` ;<br/>- La liste des identifiants des tournois dont on affiche les résultats sur l'écran, au format JSON (si la liste est vide, les résultats de tous les tournois sont affichés). |
-| `background_image`       | `TEXT`    |                                            |      | - `NULL` si `type` différent de `image` ;<br/>- L'URL de l'image à afficher.                                                                                                                                                 |
-| `background_color`       | `TEXT`    |                                            |      | - `NULL` si `type` différent de `image` ;<br/>- La couleur de fond de l'image, au format hexadécimal `#RRGGBB`.                                                                                                              |
-| `ranking_crosstable`     | `INTEGER` |                                            |      | Booléen :<br/>- `1` : grille américaine ;<br/>- `0` : classement simple.                                                                                                                                                     |
-| `ranking_round`          | `INTEGER` |                                            |      | Le numéro de la ronde à afficher (par défaut la dernière ronde jouée).                                                                                                                                                       |
-| `ranking_min_points`     | `INTEGER` |                                            |      | Le nombre minimal de points des joueur·euses affiché·es.                                                                                                                                                                     |
-| `ranking_max_points`     | `INTEGER` |                                            |      | Le nombre maximal de points des joueur·euses affiché·es.                                                                                                                                                                     |
-| `ranking_crosstable`     | `INTEGER` |                                            |      | Booléen :<br/>- `1` : grille américaine ;<br/>- `0` : classement simple.                                                                                                                                                     |
-| `font_size`              | `INTEGER` |                                            |      | la taille de la police en pourcentage (par défaut 100%).                                                                                                                                                                     |
-| `message_default`        | `INTEGER` | NOT NULL<br/>DEFAULT 1                     |      | Booléen :<br/>- `1` : le message d'alerte de l'évènement (ou le cas échéant l'écran rotatif) est utilisé ;<br/>- `0` : le message d'alerte de l'écran est utilisé en remplacement de celui de l'évènement.                   |
-| `message_text`           | `TEXT`    |                                            |      | Le texte du message d'alerte de l'écran (par défaut aucun message d'alerte n'est affiché).                                                                                                                                   |
-| `last_update`            | `FLOAT`   | NOT NULL                                   |      | La date de dernière modification de l'écran.                                                                                                                                                                                 |
-
-### table `screen_set` (ensembles d'écran)
-
-| Champ                    | Type      | Contrainte                                 | Ext. | Description                                                                  |
-|--------------------------|-----------|--------------------------------------------|------|------------------------------------------------------------------------------|
-| `id`                     | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |      | L'identifiant de l'écran.                                                    |
-| `screen_id`              | `TEXT`    | NOT NULL<br/>REFERENCES `screen`(`id`)     |      | L'identifiant textuel unique de l'écran.                                     |
-| `tournament_id`          | `TEXT`    | NOT NULL<br/>REFERENCES `tournament`(`id`) |      | L'identifiant du tournoi.                                                    |
-| `name`                   | `TEXT`    |                                            |      | Le nom de l'ensemble.                                                        |
-| `order`                  | `INTEGER` | NOT NULL                                   |      | L'ordre de l'ensemble vis-à-vis des autres ensembles de son écran.           |
-| `first`                  | `INTEGER` |                                            |      | Le numéro du premier élément (échiquier ou joueur·euse) à prendre en compte. |
-| `last`                   | `INTEGER` |                                            |      | Le numéro du dernier élément (échiquier ou joueur·euse) à prendre en compte. |
-| `fixed_boards_str`       | `TEXT`    |                                            |      | Des numéros d'échiquiers séparés par des virgules.                           |
-| `last_update`            | `FLOAT`   | NOT NULL                                   |      | La date de dernière modification de l'ensemble.                              |
-
-### table `family` (familles d'écrans)
-
-| Champ                   | Type      | Contrainte                                 | Ext. | Description                                                                                                                                                                                                                                            |
-|-------------------------|-----------|--------------------------------------------|------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id`                    | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |      | L'identifiant de la famille.                                                                                                                                                                                                                           |
-| `uniq_id`               | `TEXT`    | NOT NULL<br/>UNIQUE                        |      | L'identifiant textuel unique de la famille.                                                                                                                                                                                                            |
-| `type`                  | `TEXT`    | NOT NULL                                   |      | L e type d'écran :<br/>- `input` : saisie des résultats<br/>- `boards` : appariements par échiquier<br/>- `players` : appariements par ordre alphabétique<br/>- `results` : derniers résultats<br/>- `image` : image                                   |
-| `public`                | `INTEGER` |                                            |      | Booléen :<br/>- `1` : la famille est publique (visible par les utilisateur·ices sur l'interface publique') ;<br/>- `0` : la famille est réservés aux arbitres.                                                                                         |
-| `name`                  | `TEXT`    |                                            |      | Le nom de la famille.                                                                                                                                                                                                                                  |
-| `columns`               | `INTEGER` |                                            |      | Le nombre de colonnes des écrans de la famille.                                                                                                                                                                                                        |
-| `menu_link`             | `INTEGER` | NOT NULL                                   |      | Booléen :<br/>- `1` : un lien vers les écrans de la famille pourra être affiché depuis les autres écrans ;<br/>- `0` : aucun lien vers les écrans de la famille ne sera jamais affiché.                                                                |
-| `menu_text`             | `TEXT`    | NOT NULL                                   |      | Le texte du lien hypertexte vers les écrans de la famille, utilisé sur les autres écrans.                                                                                                                                                              |
-| `menu`                  | `TEXT`    | NOT NULL                                   |      | Le menu à afficher sur les écrans de la famille (liens hypertextes vers d'autres écrans).                                                                                                                                                              |
-| `timer_id`              | `INTEGER` | REFERENCES `timer`(`id`)                   |      | L'identifiant du chronomètre utilisé sur les écrans de la famille.                                                                                                                                                                                     |
-| `tournament_id`         | `INTEGER` | REFERENCES `tournament`(`id`)              |      | L'identifiant du tournoi de la famille.                                                                                                                                                                                                                |
-| `input_exit_button`     | `INTEGER` |                                            |      | Booléen :<br/>- `NULL` si `type` différent de `input` ;<br/>- `1` : un bouton permettant de quitter la page est affiché ;<br/>- `0` : le bouton n'est pas affiché.                                                                                     |
-| `players_show_unpaired` | `INTEGER` |                                            |      | Booléen :<br/>- `NULL` si `type` différent de `players` ;<br/>- `0` : les joueur·euses non apparié·es sont caché·es ;<br/>- `0` : les joueur·euses non apparié·es sont montré·es.                                                                      |
-| `first`                 | `INTEGER` |                                            |      | Le numéro du premier élément (échiquier ou joueur·euse) à prendre en compte.                                                                                                                                                                           |
-| `last`                  | `INTEGER` |                                            |      | Le numéro du dernier élément (échiquier ou joueur·euse) à prendre en compte.                                                                                                                                                                           |
-| `range`                 | `TEXT`    |                                            |      | La plage d'écrans à générer, par exemple `4-6` (par défaut tous les écrans de la famille sont générés).                                                                                                                                                |
-| `parts`                 | `INTEGER` |                                            |      | Le nombre d'écrans de la famille (le nombre d'éléments par écran est calculé automatiquement).                                                                                                                                                         |
-| `number`                | `INTEGER` |                                            |      | Le nombre d'éléments (échiquiers ou joueur·euses) par écran (le nombre d'écrans est calculé automatiquement).                                                                                                                                          |
-| `message_default`       | `INTEGER` | NOT NULL<br/>DEFAULT 1                     |      | Booléen :<br/>- `1` : le message d'alerte de l'évènement (ou le cas échéant l'écran rotatif) est utilisé pour les écrans de la famille ;<br/>- `0` : le message d'alerte des écrans de la famille est utilisé en remplacement de celui de l'évènement. |
-| `message_text`          | `TEXT`    |                                            |      | Le texte du message d'alerte de l'écran (par défaut aucun message d'alerte n'est affiché).                                                                                                                                                             |
-| `last_update`           | `FLOAT`   | NOT NULL                                   |      |  La date de dernière modification de l'écran.                                                                                                                                                                                                          |
-
-### table `rotator` (écrans rotatifs)
-
-| Champ                   | Type      | Contrainte                                 | Ext. | Description                                                                                                                                                                                                                               |
-|-------------------------|-----------|--------------------------------------------|------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id`                    | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |      | L'identifiant de l'écran rotatif'.                                                                                                                                                                                                        |
-| `uniq_id`               | `TEXT`    | NOT NULL<br/>UNIQUE                        |      | L'identifiant textuel unique de l'écran rotatif.                                                                                                                                                                                          |
-| `public`                | `INTEGER` |                                            |      | Booléen :<br/>- `1` : l'écran rotatif est public (visible par les utilisateur·ices sur l'interface publique') ;<br/>- `0` : l'écran rotatif est réservé aux arbitres.                                                                     |
-| `screen_ids`            | `TEXT`    |                                            |      | La liste des écrans à afficher, au format JSON.                                                                                                                                                                                           |
-| `family_ids`            | `TEXT`    |                                            |      | La liste des familles d'écrans à afficher, au format JSON.                                                                                                                                                                                |
-| `delay`                 | `INTEGER` |                                            |      | Le délai de rotation des écrans en secondes, facultatif (par défaut 15).                                                                                                                                                                  |
-| `message_default`       | `INTEGER` | NOT NULL<br/>DEFAULT 1                     |      | Booléen :<br/>- `1` : le message d'alerte de l'évènement est utilisé (sauf si un message est défini pour les écrans) ;<br/>- `0` : le message d'alerte des écrans de l'écran rotatif est utilisé en remplacement de celui de l'évènement. |
-| `message_text`          | `TEXT`    |                                            |      | Le texte du message d'alerte de l'écran (par défaut aucun message d'alerte n'est affiché).                                                                                                                                                |
diff --git a/docs/90-sandbox.md b/docs/90-sandbox.md
deleted file mode 100644
index 1c2da32e32..0000000000
--- a/docs/90-sandbox.md
+++ /dev/null
@@ -1,10 +0,0 @@
-**[Retour au sommaire de la documentation](../README.md)**
-
-# Sharly Chess - Bac à sable
-
-Cet espace est dédié à de possibles évolutions de Sharly Chess.
-
-- [TODO list](99-todo.md)
-
-- [Communication vers les joueur·euses](93-communication.md)
-- [Rôles et autorisations](95-auth.md)
diff --git a/docs/93-communication.md b/docs/93-communication.md
deleted file mode 100644
index 84b8cee30b..0000000000
--- a/docs/93-communication.md
+++ /dev/null
@@ -1,124 +0,0 @@
-**[Retour au sommaire de la documentation](../README.md)**
-
-# Sharly Chess - Communication vers les joueur·euses
-
-Cette page est dédiée à la communication vers les joueur·euses, pour une mise en œuvre rapide dans Sharly Chess.
-
-## Médias cibles
-
-Les deux médias cibles suivants sont envisagés :
-
-- envoi de mél ;
-- envoi de SMS ou MMS.
-
-Dans les deux cas, les informations utilisées pour communiquer sont celles données par les joueur·euses à leur inscription (les informations saisies sur Chess Event sont récupérées par Sharly Chess).
-
-Voir : [Création des fichiers Papi des tournois à partir de Chess Event](37-chessevent.md)
-
-## Destinataires des envois
-
-Le système doit être le plus souple possible et permettre les envois :
-
-- à tou·tes les joueur·euses d'un évènement
-- à tou·tes les joueur·euses d'un tournoi
-- à tou·tes les joueur·euses apparié·es à la ronde courante d'un tournoi
-- à le·la joueur·euse exempt·e à la ronde courante d'un tournoi
-- à un·e ou plusieurs joueur·euses d'un tournoi choisi·es par l'arbitre
-
-## Contenu et personnalisation
-
-Les arbitres doivent pouvoir s'appuyer sur des messages-types, pour par exemple :
-
-- prévenir de l'ouverture ou la fermeture imminente du pointage
-- prévenir des appariements
-- envoyer le classement
-
-Tous les messages doivent être personnalisables à l'aide des *tokens* suivants.
-
-| Portée                       | *Token*                   | Remplacement                                                                       |
-|------------------------------|---------------------------|------------------------------------------------------------------------------------|
-| Évènement (**ev***ent*)      | `{{ev_name}}`             | Le nom de l'évènement                                                              |
-| Tournoi (**to***urnament*)   | `{{to_name}}`             | Le nom du tournoi                                                                  |
-|                              | `{{to_ffe_url}}`          | L'URL de la fiche du tournoi sur le site web fédéral                               |
-| Ronde en cours (**ro***und*) | `{{ro_number}}`           | Le numéro de la ronde en cours                                                     |
-|                              | `{{ro_datetime}}`         | La date et l'heure de la ronde en cours                                            |
-|                              | `{{ro_time}}`             | L'heure de la ronde en cours                                                       |
-| Joueur·euse (**pl***ayer*)   | `{{pl_last_name}}`        | Le nom de famille du·de la joueur·euse                                             |
-|                              | `{{pl_first_name}}`       | Le nom de famille du·de la joueur·euse                                             |
-|                              | `{{pl_gender}}`           | Le nom de famille du·de la joueur·euse                                             |
-|                              | `{{pl_name}}`             | Le nom complet du·de la joueur·euse                                                |
-|                              | `{{pl_rating}}`           | Le classement du·de la joueur·euse                                                 |
-|                              | `{{pl_rating_type}}`      | Le type classement du·de la joueur·euse (Fide, National, Estimé)                   |
-|                              | `{{pl_points}}`           | Le nombre de points du·de la joueur·euse                                           |
-|                              | `{{pl_standings_points}}` | Le nombre de points réels du·de la joueur·euse                                     |
-| Appariement (**pa***iring*)  | `{{pa_paired}}`           | True si le·la joueur·euse est apparié·e, False sinon                               |
-|                              | `{{pa_paired_bye}}`       | True si le·la joueur·euse est exempt·e, False sinon                                |
-|                              | `{{pa_unpaired}}`         | True si le·la joueur·euse est non apparié·e, False sinon                           |
-|                              | `{{pa_unpaired_hp_bye}}`  | True si le·la joueur·euse est non apparié·e avec un demi-point de bye, False sinon |
-|                              | `{{pa_unpaired_fp_bye}}`  | True si le·la joueur·euse est non apparié·e avec un point de bye, False sinon      |
-|                              | `{{pa_board}}`            | Le numéro de l'échiquier de l'appariement                                          |
-|                              | `{{pa_color}}`            | La couleur de l'appariement                                                        |
-| Adversaire (**op***ponent*)  | `{{op_last_name}}`        | Le nom de famille de l'adversaire                                                  |
-|                              | `{{op_first_name}}`       | Le nom de famille de l'adversaire                                                  |
-|                              | `{{op_gender}}`           | Le nom de famille de l'adversaire                                                  |
-|                              | `{{op_name}}`             | Le nom complet de l'adversaire                                                     |
-|                              | `{{op_rating}}`           | Le classement de l'adversaire                                                      |
-|                              | `{{op_rating_type}}`      | Le type classement de l'adversaire (Fide, National, Estimé)                        |
-|                              | `{{op_points}}`           | Le nombre de points de l'adversaire                                                |
-|                              | `{{op_standings_points}}` | Le nombre de points réels du·de la joueur·euse                                     |
-
-Le moteur de modèles Jinja est utilisé pour la personnalisation des contenus, ce qui permet par exemple l'utilisation des alternatives `{% if %}`...`{% else %}`...`{% endif %}` :
-
-```
-Bonjour {{pl_first_name}},
-Tournoi : {{to_name}}
-Apparaiement de la ronde {{ro_number}} :
-{% if pa_paired %}
-  {% if pa_paired_bye }}
-    Exempt{% if pl_gender == 'F' %}e
-  {% else %}
-    Adversaire : {{op_name}} {{op_rating}}{{op_rating_type}} [{{op_points}}]
-    Couleur : {{pa_color}}
-    Échiquier : {{pa_board}}
-  {% endif %}
-{% endif %}
-{% if pa_unpaired %}
-  Non apparié{% if pl_gender == 'F' %}e {% if pa_unpaired_bye_hp %}(bye 0,5 point){% endif %}{% if pa_unpaired_bye_fp %}(bye 1 point){% endif %}
-{% endif %}
-```
-
-## Moteurs d'envoi
-
-Plusieurs moteurs d'envoi peuvent être définis sur la machine de l'arbitre, et utilisables par tous les tournois de tous les évènements.
-
-### Moteur d'envoi de mél
-
-Un moteur d'envoi par mél est défini par les paramètres suivants.
-
-| Paramètre            | Type | Signification                                                                                                                     |
-|----------------------|------|-----------------------------------------------------------------------------------------------------------------------------------|
-| `type`               | enum | Valeur `smtp`                                                                                                                     |
-| `smtp_host`          | str  | Le serveur SMTP (obligatoire)                                                                                                     |
-| `smtp_security`      | enum | aucune (`smtp_port` = `25` par défaut)<br/>STARTTLS (`smtp_port` = `587` par défaut)<br/>SSL/TLS (`smtp_port` = `465` par défaut) |
-| `smtp_port`          | int  | Le port utilisé (facultatif)                                                                                                      |
-| `smtp_user`          | str  | Le compte utilisé pour s'authentifier sur le serveur SMTP (facultatif)                                                            |
-| `smtp_password`      | str  | Le mot de passe (facultatif)                                                                                                      |
-| `smtp_from_mail`     | str  | Le mél de l'envoyeur (facultatif)                                                                                                 |
-| `smtp_from_name`     | str  | Le nom de l'envoyeur (facultatif)                                                                                                 |
-| `smtp_bcc`           | str  | Adresses en copie cachée, séparées par les virgules (facultatif)                                                                  |
-| `smtp_reply_to_mail` | str  | Le mél pour la réponse (facultatif)                                                                                               |
-| `smtp_reply_to_name` | str  | Le nom pour la réponse (facultatif)                                                                                               |
-
-L'envoi par mél est simple à mettre en place et gratuite, il suffit de disposer d'un compte mél chez un fournisseur.
-
-### Moteur MailJet d'envoi de SMS
-
-Un moteur MailJet d'envoi par SMS est défini par les paramètres suivants.
-
-| Paramètre            | Type | Signification                                                          |
-|----------------------|------|------------------------------------------------------------------------|
-| `type`               | enum | Valeur `sms_mailjet`                                                   |
-| `mailjet_sms_from`   | str  | L'envoyeur (facultatif, par défaut `Sharly Chess`)                         |
-| `mailjet_sms_token`  | str  | le jeton d'authentification sur l'API MailJet                          |
-
-L'envoi par SMS est plus complexe à mettre en place et payant, il faut s'appuyer sur un fournisseur d'envoi (par exemple ici [MailJet](https://mailjet.com)).
diff --git a/docs/95-auth.md b/docs/95-auth.md
deleted file mode 100644
index 381b24bacf..0000000000
--- a/docs/95-auth.md
+++ /dev/null
@@ -1,94 +0,0 @@
-**[Retour au sommaire de la documentation](../README.md)**
-
-# Sharly Chess - Rôles et autorisations
-
-## Rôles en version 2.4
-
-Dans la version actuelle (2.4), Sharly Chess distingue deux rôles :
-- **le rôle arbitre**, qui s'obtient en se connectant depuis le serveur 127.0.0.1), qui peut accéder :
-  - aux pages d'administration, ou pages d'arbitrage ;
-  - aux pages publiques, avec quelques privilèges supplémentaires.
-- **le rôle standard**, qui permet :
-  - de visualiser les écrans publics ;
-  - de pointer et saisir les résultats (avec ou sans protection par mot de passe).
-
-## Proposition d'évolution
-
-### Rôles
-
-- **Administration** (de l'application)
-- **Organisation** (d'un évènement)
-- **Arbitrage en chef·fe** (d'un évènement ou d'un tournoi)
-- **Arbitrage** (d'un évènement ou d'un tournoi)
-- **Pointage** (d'un évènement)
-- **Saisie** (d'un évènement)
-- **Visualisation** (d'un évènement)
-
-### Actions autorisées par rôle
-
-|                                                  | Administration  | Organisation  | Arbitrage en chef |  Arbitrage  |   Pointage    |    Saisie     | Visualisation |
-|--------------------------------------------------|:---------------:|:-------------:|:-----------------:|:-----------:|:-------------:|:-------------:|:-------------:|
-| **Périmètre**                                    | **Application** | **Évènement** |    **Tournoi**    | **Tournoi** | **Évènement** | **Évènement** | **Évènement** |
-| **GESTION DE L'APPLICATION**                     |                 |               |                   |             |               |               |               |
-| Paramétrage de l'application                     |      :ok:       |      :x:      |        :x:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Gestion des administrateur·ices                  |      :ok:       |      :x:      |        :x:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| **GESTION DES ÉVÈNEMENTS**                       |                 |               |                   |             |               |               |               |
-| Ajout d'un évènement                             |      :ok:       |      :x:      |        :x:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Suppression d'un évènement                       |      :ok:       |      :x:      |        :x:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Renommage d'un évènement                         |      :ok:       |      :x:      |        :x:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Édition d'un évènement                           |      :ok:       |     :ok:      |        :x:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| **GESTION DES TOURNOIS**                         |                 |               |                   |             |               |               |               |
-| Ajout d'un tournoi                               |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Suppression d'un tournoi                         |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Édition d'un tournoi                             |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Ouverture/fermeture du pointage                  |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Moteur d'appariement                             |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Appariement manuel                               |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Publication des appariements                     |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Visualisation des appariements avant publication |       :x:       |      :x:      |       :ok:        |    :ok:     |      :x:      |      :x:      |      :x:      |
-| Calcul des classements                           |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Publication des classements                      |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Visualisation des classements avant publication  |       :x:       |      :x:      |       :ok:        |    :ok:     |      :x:      |      :x:      |      :x:      |
-| Publication en ligne                             |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| **GESTION DE L'AFFICHAGE**                       |                 |               |                   |             |               |               |               |
-| Gestion des écrans/familles/écrans rotatifs      |       :x:       |     :ok:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Gestion des chronomètres                         |       :x:       |     :ok:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| **GESTION DES JOUEUR·EUSES**                     |                 |               |                   |             |               |               |               |
-| Ajout d'un·e joueur·euse                         |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Suppression d'un·e joueur·euse                   |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Édition 'un·e joueur·euse                        |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Pointage                                         |       :x:       |      :x:      |       :ok:        |    :ok:     |     :ok:      |      :x:      |      :x:      |
-| **GESTION DES PARTIES**                          |                 |               |                   |             |               |               |               |
-| Utilisation des scores spéciaux                  |       :x:       |      :x:      |       :ok:        |     :x:     |      :x:      |      :x:      |      :x:      |
-| Rectification des scores                         |       :x:       |      :x:      |       :ok:        |    :ok:     |      :x:      |      :x:      |      :x:      |
-| Saisie des scores                                |       :x:       |      :x:      |       :ok:        |    :ok:     |      :x:      |     :ok:      |      :x:      |
-| **VISUALISATION**                                |                 |               |                   |             |               |               |               |
-| Pointage                                         |      :ok:       |     :ok:      |       :ok:        |    :ok:     |     :ok:      |     :ok:      |     :ok:      |
-| Appariements                                     |      :ok:       |     :ok:      |       :ok:        |    :ok:     |     :ok:      |     :ok:      |     :ok:      |
-| Résultats                                        |      :ok:       |     :ok:      |       :ok:        |    :ok:     |     :ok:      |     :ok:      |     :ok:      |
-
-### Attribution des rôles
-
-L'octroi d'un rôle se fait :
-- par client (l'adresse IP de la machine qui accède au serveur Sharly Chess) ;
-- par authentification (un identifiant et un mot de passe) ;
-- par client et par authentification.
-
-### Exemple d'attribution des rôles
-
-Dans l'exemple ci-dessous :
-- les connexions depuis le serveur ont tous les rôles, de manière automatique (non configurable) ;
-- les connexions depuis le client ``192.168.1.115`` et authentifiées avec l'identifiant ``big-boss`` ont un rôle d'organisation et d'arbitrage en chef pour tous les tournois ;
-- les connexions authentifiées avec les identifiants ``boss-1`` et ``boss-2`` ont un rôle d'arbitrage, respectivement pour les tournois A/B et C/D ;
-- les deux derniers postes permettent respectivement le pointage et la saisie des résultats ;
-- les autres clients non authentifiés peuvent visualiser les écrans d'affichage.
-
-|      Client       |       ID       |    Commentaire    | Tournoi | Administration | Organisation | Arbitrage en chef | Arbitrage | Pointage | Saisie | Visualisation |
-|:-----------------:|:--------------:|:-----------------:|:-------:|:--------------:|:------------:|:-----------------:|:---------:|:--------:|:------:|:-------------:|
-|   ``127.0.0.1``   |       -        |      Serveur      |    -    |      :ok:      |     :ok:     |       :ok:        |   :ok:    |   :ok:   |  :ok:  |     :ok:      |
-| ``192.168.1.115`` |  ``big-boss``  | Arbitre principal |         |      :x:       |     :ok:     |       :ok:        |   :ok:    |   :ok:   |  :ok:  |     :ok:      |
-|         -         |   ``boss-1``   |  Arbitre adjoint  |  A, B   |      :x:       |     :x:      |        :x:        |   :ok:    |   :ok:   |  :ok:  |     :ok:      |
-|         -         |   ``boss-2``   |  Arbitre adjoint  |  C, D   |      :x:       |     :x:      |        :x:        |   :ok:    |   :ok:   |  :ok:  |     :ok:      |
-| ``192.168.1.27``  |       -        |  Poste pointage   |         |      :x:       |     :x:      |        :x:        |    :x:    |   :ok:   |  :x:   |     :ok:      |
-| ``192.168.1.226`` |       -        |  Poste de saisie  |         |      :x:       |     :x:      |        :x:        |    :x:    |   :x:    |  :ok:  |     :ok:      |
-|         -         |       -        |                   |         |      :x:       |     :x:      |        :x:        |    :x:    |   :x:    |  :x:   |     :ok:      |
diff --git a/docs/97-actions.md b/docs/97-actions.md
deleted file mode 100644
index 71253103cf..0000000000
--- a/docs/97-actions.md
+++ /dev/null
@@ -1,105 +0,0 @@
-**[Retour au sommaire de la documentation](../README.md)**
-
-# Sharly Chess - Actions
-
-Cette page propose un synopsis des actions des onglets Tournois, Joueur·euses et Appariements.
-
-## Définition du statut des rondes
-
-| Ronde                              | Définition                                                                                                                            |
-|------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|
-| Ronde courante (ou ronde en cours) | La dernière ronde avec des appariements.                                                                                              |
-| Ronde précédente                   | La ronde qui précéde immédiatement la ronde en cours (N-1).                                                                           |
-| Rondes passées                     | Les rondes qui précédent la ronde précédente (N-2, N-3, ...).                                                                         |
-| Ronde suivante                     | La ronde qui suit immédiatement la ronde en cours (N+1).                                                                              |
-| Rondes futures                     | Les rondes qui suivent la ronde suivante (N+2, N+3, ...).                                                                             |
-| Dernière ronde publiée             | La dernière ronde publiée est la dernière ronde pour laquelle l'arbitre principal·e a passé le statut de « brouillon » à « publiée ». |
-
-> [!NOTE]
->
-> **Ronde courante** : la définition jusque-là de la ronde courante était : la première ronde avec des joueur·euses non apparié·es ou des appariements sans résultat.
-> Avec cette définition, la ronde en cours changeait lorsque des appariements étaient défaits sur une ronde précédente, ce qui était complètement contre-intuitif.
->
-> **Dernière ronde publiée** : Cette notion n'existe pas encore et sera implémentée lorsque le stockage Access sera abandonné.
-> Dans la version actuelle, toutes les rondes avec appariements sont considérées comme publiées (le statut de brouillon n'existe pas).
->
-> Les notions du tableau ci-dessous sont relatives au tournoi. La notion de ronde affichée ou sélectionnée est relative à l'interface web, c'est la ronde active sur l'onglet Appariements.
-
-## Modification des Tournois
-
-A compléter (certaines modifications des tournois ne devraient pas être autorisées après le démarrage d'un tournoi).
-
-## Modification des Joueur·euses (Elo, tiitre FIDE ou nom)
-
-> [!NOTE]
-> Les modifications des informations des joueur·euses ne portant pas sur le Elo, le titre FIDE ou le nom n'ont pas d'impact sur les appariements et les classements.
-
-> [!NOTE]
-> Papi recalcule les numéros d’appariement à chaque ronde (contrairement aux règlements FIDE).
-> Dans un certain délai après la publication des résultats de la ronde N (ou avant publication des résultats), le changement prend effet pour le classement de la ronde N, et les appariements de la ronde N+1.
-> Après la publication de la ronde N+1, les classements sont changés à partir de la ronde N+2.
-
-| Moment                                          |   Autorisée FIDE   | Enregistrement | Recalcul<br/>numéros<br/>appariement |    Modification<br/>classement     |
-|-------------------------------------------------|:------------------:|:--------------:|:-------------------------------------:|:----------------------------------:|
-| Avant publication appariements ronde 1          | :white_check_mark: | :white_circle: |                ronde 1                |                                    |
-| Avant fin délai publication résultats ronde 1   | :white_check_mark: |   :pushpin:    |                ronde 2                |              ronde 1               |
-| Après publication appariements ronde 2          | :white_check_mark: |   :pushpin:    |                ronde 3                |              ronde 3               |
-| Avant fin délai publication résultats ronde 2   | :white_check_mark: |   :pushpin:    |                ronde 3                |              ronde 2               |
-| Après publication appariements ronde 3          | :white_check_mark: |   :pushpin:    |                ronde 4                |              ronde 4               |
-| Avant fin délai publication résultats ronde 3   | :white_check_mark: |   :pushpin:    |                ronde 4                |                                    |
-| À partir de la publication appariements ronde 4 | :white_check_mark: |   :pushpin:    |                  non                  | ronde N+1 ou N+2<br/>selon les cas |
-
-> [!NOTE]
-> Les modifications des informations des joueur·euses ne portant pas sur le Elo, le titre FIDE ou le nom n'ont pas d'impact sur les appariements et les classements.
->
-> Respect des règlements de la FIDE :
-> - :white_check_mark: Action autorisée par la FIDE
->
-> Enregistrement des actions non standard :
-> - :white_circle: Aucun enregistrement
-> - :pushpin: Enregistrement dans la base de données
-
-> [!NOTE]
->
-> Sammy doit confirmer auprès de la DNA que le classement peut être modifié à n'importe quel moment car cela peut influer sur les départages.
-
-## Modification des appariements et résultats
-
-> [!NOTE]
-> Un résultat ou une couleur erronée à la ronde N peut être signalée (règlement FIDE) :
-> - Dans un certain délai après la publication des résultats de la ronde N
->   - Le classement de la ronde N et l’appariement de la ronde N+1 utilisent cette correction
-> - Après la publication des appariements de la ronde N+1, mais avant la fin de la ronde N+1
->   - Les appariements de la ronde N+2 utilisent cette correction (probablement aussi le classement de la ronde N+1)
-> - Après la fin de la ronde N+1
->   - Le résultat n’est utilisé que pour l’export FIDE, ni pour le classement final ni pour les appariements suivants.
-
-### Description des actions
-
-| Action / Ronde                 |                    Passée                     |                    Précédente                     |                   Courante                   |        Première<br/>non<br/>appariée         |                    Future                     |
-|--------------------------------|:---------------------------------------------:|:-------------------------------------------------:|:--------------------------------------------:|:--------------------------------------------:|:---------------------------------------------:|
-| Appariement total              | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   | :white_circle: :white_circle: :white_circle: |      :white_check_mark: :ok: :pushpin:       | :no_entry_sign: :white_circle: :white_circle: |
-| Appariement complémentaire     | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
-| Appariement manuel             |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: |     :no_entry_sign: :warning: :pushpin:      | :no_entry_sign: :white_circle: :white_circle: |
-| Désappariement complet         | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   |  :no_entry_sign: :grey_question: :pushpin:   | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
-| Désappariement manuel          |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
-| Permutation                    |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
-| Modification d’un résultat     |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    |    :white_check_mark: :ok: :white_circle:    | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
-| Modification des byes/forfaits |      :no_entry_sign: :warning: :pushpin:      | :ballot_box_with_check: :grey_question: :pushpin: | :ballot_box_with_check: :ok: :white_circle:  | :ballot_box_with_check: :ok: :white_circle:  |  :ballot_box_with_check: :ok: :white_circle:  |
-
-> [!NOTE]
-> Respect des règlements de la FIDE :
-> - :white_circle: _Action non pertinente_
-> - :no_entry_sign: Action non autorisée par la FIDE
-> - :white_check_mark: Action autorisée par la FIDE
-> - :ballot_box_with_check: Action autorisée par la FIDE, doit être autorisée par le règlement
->
-> Messages d'alerte aux arbitres :
-> - :white_circle: _Action non proposée_
-> - :ok: Action sans message d'alerte
-> - :grey_question: Modal : L'action que vous souhaitez réaliser n’est pas « standard », continuer ?
-> - :warning: Modal : L'action que vous souhaitez réaliser n’est pas n’est pas autorisée par la FIDE, continuer ?
->
-> Enregistrement des actions non standard :
-> - :white_circle: Aucun enregistrement
-> - :pushpin: Enregistrement dans la base de données
diff --git a/docs/99-todo.md b/docs/99-todo.md
deleted file mode 100644
index e8b22cf471..0000000000
--- a/docs/99-todo.md
+++ /dev/null
@@ -1,32 +0,0 @@
-**[Retour au sommaire de la documentation](../README.md)**
-
-# Sharly Chess - TODO
-
-## Fonctionnalités demandées par les utilisateur·ices
-
-- [ ] Envoi des appariements aux joueur·euses par mél et texto (PL)
-- [ ] Ajouter une barre de recherche sur les écrans de résultats pour les arbitres (SP)
-- [ ] Ajouter un tableau de bord avec l'avancement des tournois des évènements (NDP)
-- [ ] Ajouter la possibilité d'afficher l'historique des joueur·euses de plusieurs manières : Papi, TRF, ... (SP)
-- [ ] ~~Ajouter la possibilité de changer le nom d'un⋅e participant⋅e pour l'affichage des appariements (SP > 2.4.20)~~
-- [X] ~~Affichage des appariements par origine (club) (CJ > 2.5.0)~~
-- [X] ~~Affichage automatique du classement et grille américaine après la saisie du dernier résultat d'une ronde (HB > 2.5.0)~~
-- [X] ~~Prise en charge de la méthode HEAD pour les afficheurs dynamiques (PA > 2.5.0)~~
-- [X] ~~Pointage de tou·tes les joueur·euses de l'évènement sur un même écran (TA > 2.4.20)~~
-- [X] ~~Mettre un bouton de création d'écran par type d'écran (DR > 2.4.19)~~
-- [X] ~~Mettre en place un système multilingue pour les tournois internationaux (PA > 2.4.19)~~
-- [X] ~~Ajouter des messages d'alerte sur les écrans publics (TA > 2.4.16)~~
-- [X] ~~Ajouter la possibilité de cacher le bouton de sortie des écrans de saisie (TA > 2.4.4)~~
-- [X] ~~Limiter le temps d'affichage des résultats sur les écrans de résultats (SP > 2.4.2)~~
-- [X] ~~Ajouter la possibilité de supprimer des résultats depuis les écrans de type `results` (SP > 2.4.2)~~
-- [X] ~~Ajouter la possibilité d'afficher des tables fixes sur des écrans particuliers sur les écrans d'appariements par échiquier (SP > 2.4.0)~~
-- [x] ~~Affichage du statut pointé·e/non pointé·e des joueur·euses avant l'affichage de la première ronde (SP > 2.2.0)~~
-- [x] ~~Enregistrement des coups illégaux des joueur·euses (SL > 2.2.0)~~
-- [x] ~~Spécification d'un nombre donné d'échiquiers/joueur·euses par écran (KB > 2.1.1)~~
-- [x] ~~Ajout de l'affichage des appariements par ordre alphabétique (PL > 2.0.0)~~
-- [x] ~~Restreindre les tournois sur les écrans de type `results` (SP > 2.4.0)~~
-
-## Autres réflexions en cours
-
-- [X] ~~Poser une ou plusieurs licences sur le code de Sharly Chess (PA/SP > 2.4.0)~~
-- [X] ~~Remplacement des fichiers de configuration INI par une interface web (PA > 2.4.0)~~
diff --git a/CONTRIBUTING.md b/docs/contributing/contributing-guide.md
similarity index 78%
rename from CONTRIBUTING.md
rename to docs/contributing/contributing-guide.md
index 4a87eaa6a4..a69b687534 100644
--- a/CONTRIBUTING.md
+++ b/docs/contributing/contributing-guide.md
@@ -1,17 +1,20 @@
-# Welcome to the Charly Chess contributing guide
+# _Sharly Chess_ - Contributing guide
+
 Thank you for investing your time in our project.
 
 ## New contributor guide
 
-To get an overview of the project, read the [README](../README.md) file.
-Please note that this project is licenced under the [GNU Affero Public Licence version 3.0](../LICENSE.md).
+To get an overview of the project, read the [user documentation](https://sharly-chess.com).
+
+Please note that this project is licenced under the [GNU Affero Public Licence version 3.0](https://sharly-chess.com/license).
 
 ## Start contributing
 
 ### Issues
 
-If you spot a problem in the program or want to request a feature, [search if an issue already exists](https://github.com/papi-web-org/papi-web/issues).
-If a related issue doesn't exist, you can open a new issue using a relevant [issue form](https://github.com//papi-web-org/papi-web/issues/new/choose).
+If you spot a problem in the program or want to request a feature, [search if an issue already exists](https://github.com/sharly-chess/sharly-chess/issues).
+
+If a related issue doesn't exist, you can open a new issue using a relevant [issue form](https://github.com//sharly-chess/sharly-chess/issues/new/choose).
 
 ### Contributing code
 
@@ -19,7 +22,7 @@ This project uses [Python 3.12](https://www.python.org/downloads/release/python-
 As such, this project does not support Linux or MacOS, or any other operating system.
 This will change in the future.
 
-If you want to contribute code, please [create a fork of our repository](https://github.com/papi-web-org/papi-web/fork), and clone it locally.
+If you want to contribute code, please [create a fork of our repository](https://github.com/sharly-chess/sharly-chess/fork), and clone it locally.
 
 To install the relevant packages for development, run: `pip install -e .[lint,tests]`
 
@@ -37,7 +40,7 @@ Make sure to run `pytest` and solve problems before sending your code to review.
 Once all the changes are made, create a Pull Request with a descriptive name, and why you made the changes.
 If you're solving an issue, link to it in when opening your PR.
 
-#### Code review
+### Code review
 
 Once you have opened your PR, we will try to start reviewing it as soon as possible.
 
diff --git a/docs/contributing/contributors.md b/docs/contributing/contributors.md
new file mode 100644
index 0000000000..687b254284
--- /dev/null
+++ b/docs/contributing/contributors.md
@@ -0,0 +1,30 @@
+# _Sharly Chess_ - Maintainers, contributors and thanks
+
+## Maintainers
+
+_Sharly Chess_ maintainers are the people in charge of the development and distribution of the application.
+
+- Pascal AUBRY ([pascalaubry](https://github.com/pascalaubry))
+- Sammy PLAT ([Amaras](https://github.com/Amaras))
+- Timothy ARMES ([timothyarmes](https://github.com/timothyarmes))
+- Youri AUBRY ([molrn](https://github.com/molrn))
+
+## Contributors
+
+_Sharly Chess_ contributors are people who have contributed some of the code or documentation.
+
+- Pascal AUBRY ([pascalaubry](https://github.com/pascalaubry))
+- Sammy PLAT ([Amaras](https://github.com/Amaras))
+- Timothy ARMES ([timothyarmes](https://github.com/timothyarmes))
+- Youri AUBRY ([molrn](https://github.com/molrn))
+- Adrien AVENIA ([adrienave](https://github.com/adrienave))
+
+Since version 2.0, the source code is open for contributions on _GitHub_, it's up to you to be on the list of contributors!
+
+## Thanks
+
+Thanks to Dominique RUHLMANN for adapting the _ChessEvent_ platform to allow the creation of _Papi_ files from _Sharly Chess_ and to all the beta testers!
+
+See also:
+- [Copyright](https://sharly-chess.com/copyright)
+- [License AGPL](https://sharly-chess.com/license)
diff --git a/docs/sandbox/authentication-and-roles.md b/docs/sandbox/authentication-and-roles.md
new file mode 100644
index 0000000000..8ce7b36750
--- /dev/null
+++ b/docs/sandbox/authentication-and-roles.md
@@ -0,0 +1,105 @@
+# _Sharly Chess_ - Authentication and roles
+
+This page is a proposal to add roles in the application, not implemented yet.
+
+## Roles in version 2.4
+
+In version 2.4, _Sharly Chess_ distinguishes two roles:
+- **the arbiter role**, which is obtained by connecting from the server `127.0.0.1`), which can access:
+  - the administration pages, or arbiter pages;
+  - the public pages, with some additional privileges.
+- **the standard role**, which allows:
+  - to view public screens;
+  - to score and enter results (with or without password protection).
+
+## Development Proposal
+
+### Roles
+
+- **Administrator** (of the application)
+- **Organizer** (of an event)
+- **Chief Arbiter** (of an event or tournament)
+- **Arbiter** (of an event or tournament)
+- **Check-in officer** (of an event)
+- **Result officer** (of an event)
+- **Spectator** (of an event)
+
+> [!NOTE]
+> Amaras 20250501
+>
+> We should adapt the FIDE hierarchical system:
+> - One Chief Arbiter with admin-like rights over the event,
+> - One or several Deputy Chief Arbiter(s) with lower rights over basically the whole event
+> - Sector Arbiter(s) with rights over their part of their sector
+> - Match Arbiter(s) who can set and (maybe) correct results for the event (your results officer)
+> - Pairings Officer(s) with full pairings management rights over the part of the event they are assigned to (part of their duty is check-in, of course)
+> In Continental and World events, the CA, DCA and SA roles are mostly management positions (although they can intervene on games if Match Arbiters can't do it, of course), so they wouldn't play with the software once the rights are set up. Match Arbiters are focused on the games, so can enter results, but that's about it (although they should be able to correct wrong results). Pairings Officer are the ones doing the bulk of the work on the pairings software (especially in case of team tournaments)
+
+### Actions autorisées par rôle
+
+|                                  |  Administrator  | Organizer | Chief arbiter  |    Arbiter     | Check-in officer | Result officer | Spectator |
+|----------------------------------|:---------------:|:---------:|:--------------:|:--------------:|:----------------:|:--------------:|:---------:|
+| **Scope**                        | **Application** | **Event** | **Tournament** | **Tournament** |    **Event**     |   **Event**    | **Event** |
+| **APPLICATION MANAGEMENT**       |                 |           |                |                |                  |                |           |
+| Update application settings      |      :ok:       |    :x:    |      :x:       |      :x:       |       :x:        |      :x:       |    :x:    |
+| Manage dministrators             |      :ok:       |    :x:    |      :x:       |      :x:       |       :x:        |      :x:       |    :x:    |
+| **EVENT MANAGEMENT**             |                 |           |                |                |                  |                |           |
+| Add an Event                     |      :ok:       |    :x:    |      :x:       |      :x:       |       :x:        |      :x:       |    :x:    |
+| Delete an event                  |      :ok:       |    :x:    |      :x:       |      :x:       |       :x:        |      :x:       |    :x:    |
+| Rename an event                  |      :ok:       |    :x:    |      :x:       |      :x:       |       :x:        |      :x:       |    :x:    |
+| Edit an event                    |      :ok:       |   :ok:    |      :x:       |      :x:       |       :x:        |      :x:       |    :x:    | :x: |
+| **TOURNAMENT MANAGEMENT**        |                 |           |                |                |                  |                |           |
+| Add tournaments                  |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Delete a tournament              |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Edit tournaments                 |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Open/close check-in              |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Use the pairing engine           |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Manually pair players            |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Publish pairings                 |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| View pairings before publication |       :x:       |    :x:    |      :ok:      |      :ok:      |       :x:        |      :x:       |    :x:    |
+| Calculate rankings               |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Publish rankings                 |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| View rankings before publication |       :x:       |    :x:    |      :ok:      |      :ok:      |       :x:        |      :x:       |    :x:    |
+| Publish rankings online          |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| **DISPLAY MANAGEMENT**           |                 |           |                |                |                  |                |           |
+| Manage screens/families/rotators |       :x:       |   :ok:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Manage timers                    |       :x:       |   :ok:    |      :ok:      |      :x:       |       :x:        |      :x:       |
+| **PLAYERS MANAGEMENT**           |                 |           |                |                |                  |                |           |
+| Add players                      |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Delete players                   |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Edit players                     |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Check-in players                 |       :x:       |    :x:    |      :ok:      |      :ok:      |       :ok:       |      :x:       |    :x:    |
+| **RESULTS MANAGEMENT**           |                 |           |                |                |                  |                |           |
+| Use special results              |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Modify results                   |       :x:       |    :x:    |      :ok:      |      :ok:      |       :x:        |      :x:       |    :x:    |
+| Enter results                    |       :x:       |    :x:    |      :ok:      |      :ok:      |       :x:        |      :ok:      |    :x:    |
+| **VIEWING**                      |                 |           |                |                |                  |                |           |
+| View check-in                    |      :ok:       |   :ok:    |      :ok:      |      :ok:      |       :ok:       |      :ok:      |   :ok:    |
+| View pairings                    |      :ok:       |   :ok:    |      :ok:      |      :ok:      |       :ok:       |      :ok:      |
+| View results                     |      :ok:       |   :ok:    |      :ok:      |      :ok:      |       :ok:       |      :ok:      |   :ok:    |
+
+### Role Assignment
+
+Roles are assigned:
+- by client (the IP address of the machine accessing the _Sharly Chess_ server);
+- by authentication (a username and password);
+- by client and by authentication.
+
+### Example of role assignment
+
+In the example below:
+- Connections from the server automatically have all roles (not configurable);
+- Connections from the client ``192.168.1.115`` and authenticated with the username ``big-boss`` have the organization and chief referee roles for all tournaments;
+- Connections authenticated with the usernames ``boss-1`` and ``boss-2`` have the arbiter role, for tournaments A/B and C/D respectively;
+- The last two workstations allow check-in and results entry, respectively;
+- Other unauthenticated clients can view the display screens.
+
+|      Client       |      ID      |      Comment      | Tournament | Administrator | Organizer | Chief arbiter | Arbiter | Check-in<br/>officer | Result<br/>officer | Spectator |
+|:-----------------:|:------------:|:-----------------:|:----------:|:-------------:|:---------:|:-------------:|:-------:|:---------------------:|:--------------:|:---------:|
+|   ``127.0.0.1``   |      -       |      Server       |     -      |     :ok:      |   :ok:    |     :ok:      |  :ok:   |         :ok:          |      :ok:      |   :ok:    |
+| ``192.168.1.115`` | ``big-boss`` |   Chief arbiter   |            |      :x:      |   :ok:    |     :ok:      |  :ok:   |         :ok:          |      :ok:      |   :ok:    |
+|         -         |  ``boss-1``  |      Arbiter      |    A, B    |      :x:      |    :x:    |      :x:      |  :ok:   |         :ok:          |      :ok:      |   :ok:    |
+|         -         |  ``boss-2``  |      Arbiter      |    C, D    |      :x:      |    :x:    |      :x:      |  :ok:   |         :ok:          |      :ok:      |   :ok:    |
+| ``192.168.1.27``  |      -       | Check-in computer |            |      :x:      |    :x:    |      :x:      |   :x:   |         :ok:          |      :x:       |   :ok:    |
+| ``192.168.1.226`` |      -       |  Result computer  |            |      :x:      |    :x:    |      :x:      |   :x:   |          :x:          |      :ok:      |   :ok:    |
+|         -         |      -       |                   |            |      :x:      |    :x:    |      :x:      |   :x:   |          :x:          |      :x:       |   :ok:    |
diff --git a/docs/sandbox/communication-to-players.md b/docs/sandbox/communication-to-players.md
new file mode 100644
index 0000000000..0dcbddbdcb
--- /dev/null
+++ b/docs/sandbox/communication-to-players.md
@@ -0,0 +1,120 @@
+# _Sharly Chess_ - Communicating with players
+
+This page is dedicated to communication with players, for quick implementation in _Sharly Chess_.
+
+## Target media
+
+The following two target media are considered:
+
+- Email;
+- SMS or MMS.
+
+In both cases, the information used for communication is that provided by players upon registration (for example the information entered on _ChessEvent_ is retrieved by _Sharly Chess_).
+
+## Mailing Recipients
+
+The system must be as flexible as possible and allow mailings to:
+
+- all players in an event
+- all players in a tournament
+- all players paired in the current round of a tournament
+- the Paired Allocated Bye player in the current round of a tournament
+- one or more players in a tournament chosen by the referee
+
+## Content and customization
+
+Arbiters must be able to rely on standard messages, for example, to:
+
+- warn of the imminent opening or closing of the check-in
+- warn of the publication of pairings
+- send the rankings
+
+All messages must be customizable using the following tokens.
+
+| Scope                         | *Token*                   | Replacement                                                               |
+|-------------------------------|---------------------------|---------------------------------------------------------------------------|
+| Event (**ev***ent*)           | `{{ev_name}}`             | The name of the event                                                     |
+| Tournament (**to***urnament*) | `{{to_name}}`             | The name of the tournament                                                |
+|                               | `{{to_ffe_url}}`          | The URL of the tournament listing on the federal website                  |
+| Current Round (**ro***und*)   | `{{ro_number}}`           | The number of the current round                                           |
+|                               | `{{ro_datetime}}`         | The date and time of the current round                                    |
+|                               | `{{ro_time}}`             | The time of the current round                                             |
+| Player (**pl***ayer*)         | `{{pl_last_name}}`        | The player's last name                                                    |
+|                               | `{{pl_first_name}}`       | The player's last name                                                    |
+|                               | `{{pl_gender}}`           | The player's last name                                                    |
+|                               | `{{pl_name}}`             | The player's full name                                                    |
+|                               | `{{pl_rating}}`           | The player's rating                                                       |
+|                               | `{{pl_rating_type}}`      | The player's rating type (Fide, National, Estimated)                      |
+|                               | `{{pl_points}}`           | The player's points                                                       |
+|                               | `{{pl_standings_points}}` | The player's actual points                                                |
+| Pairing (**pa***iring*)       | `{{pa_paired}}`           | True if the player is paired, False otherwise                             |
+|                               | `{{pa_paired_bye}}`       | True if the player is assigned the Pairing Allocated Bye, False otherwise |
+|                               | `{{pa_unpaired}}`         | True if the player is unpaired, False otherwise                           |
+|                               | `{{pa_unpaired_hp_bye}}`  | True if the player is unpaired with a half-point bye, False otherwise     |
+|                               | `{{pa_unpaired_fp_bye}}`  | True if the player is unpaired with a bye, False otherwise                |
+|                               | `{{pa_board}}`            | The board number of the pairing                                           |
+|                               | `{{pa_color}}`            | The color of the pairing                                                  |
+| Opponent (**op***ponent*)     | `{{op_last_name}}`        | The opponent's last name                                                  |
+|                               | `{{op_first_name}}`       | The opponent's last name                                                  |
+|                               | `{{op_gender}}`           | The opponent's last name                                                  |
+|                               | `{{op_name}}`             | The opponent's full name                                                  |
+|                               | `{{op_rating}}`           | The opponent's rating                                                     |
+|                               | `{{op_rating_type}}`      | The opponent's rating type (Fide, National, Estimé)                       |
+|                               | `{{op_points}}`           | The opponent's number of points                                           |
+|                               | `{{op_standings_points}}` | The player's actual number of points                                      |
+
+The Jinja template engine is used for content customization, which allows, for example, the use of the alternatives `{% if %}`...`{% else %}`...`{% endif %}`:
+
+```
+Hello {{pl_first_name}},
+Tournament: {{to_name}}
+Pairing for round #{{ro_number}}:
+{% if pa_paired %}
+{% if pa_paired_bye }}
+Pairing Allocated Bye
+{% else %}
+Opponent: {{op_name}} {{op_rating}}{{op_rating_type}} [{{op_points}}]
+Color: {{pa_color}}
+Board: {{pa_board}}
+{% endif %}
+{% endif %}
+{% if pa_unpaired %}
+  Not paired {% if pa_unpaired_bye_hp %}Half-Point Bye{% endif %}{% if pa_unpaired_bye_fp %}Full-Point Bye{% endif %}
+{% endif %}
+```
+
+## Sending Engines
+
+Multiple sending engines can be defined on the arbiter's computer, and can be used by all tournaments and all events.
+
+### Email Sending Engine
+
+An email sending engine is defined using the following parameters.
+
+| Parameter            | Type | Meaning                                                                                                                         |
+|----------------------|------|---------------------------------------------------------------------------------------------------------------------------------|
+| `type`               | enum | Value `smtp`                                                                                                                    |
+| `smtp_host`          | str  | The SMTP server (required)                                                                                                      |
+| `smtp_security`      | enum | none (`smtp_port` = `25` by default)<br/>STARTTLS (`smtp_port` = `587` by default)<br/>SSL/TLS (`smtp_port` = `465` by default) |
+| `smtp_port`          | int  | The port used (optional)                                                                                                        |
+| `smtp_user`          | str  | The account used to authenticate to the SMTP server (optional)                                                                  |
+| `smtp_password`      | str  | Password (optional)                                                                                                             |
+| `smtp_from_mail`     | str  | Sender's email (optional)                                                                                                       |
+| `smtp_from_name`     | str  | Sender's name (optional)                                                                                                        |
+| `smtp_bcc`           | str  | BCC addresses, separated by commas (optional)                                                                                   |
+| `smtp_reply_to_mail` | str  | Reply email (optional)                                                                                                          |
+| `smtp_reply_to_name` | str  | Reply name (optional)                                                                                                           |
+
+Sending by email is easy to set up and free; all you need is an email account with a provider.
+
+### _MailJet_ SMS Sending Engine
+
+A _MailJet_ SMS sending engine is defined by the following parameters.
+
+| Parameter           | Type | Meaning                                       |
+|---------------------|------|-----------------------------------------------|
+| `type`              | enum | Value `sms_mailjet`                           |
+| `mailjet_sms_from`  | str  | Sender (optional, defaults to `Sharly Chess`) |
+| `mailjet_sms_token` | str  | the authentication token for the MailJet API  |
+
+Sending by SMS is more complex to set up and requires a fee; you must rely on a sending provider (for example, here [_MailJet_](https://mailjet.com)).
diff --git a/docs/sandbox/pairing-actions.md b/docs/sandbox/pairing-actions.md
new file mode 100644
index 0000000000..900b7b0dec
--- /dev/null
+++ b/docs/sandbox/pairing-actions.md
@@ -0,0 +1,92 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+> [!NOTE]
+> :information_source:
+> - The concept of **last published round** does not yet exist and will be implemented when Access storage is discontinued.
+> In the current version, all rounds with pairings are considered published (draft status does not exist).
+> - The concepts in the table below are tournament-specific. The concept of a displayed or selected round is relative to the web interface; it is the active round in the Pairings tab.
+
+## Tournament modifications
+
+To be completed (some tournament modifications should not be allowed after a tournament has started).
+
+## Player Modifications (Elo, FIDE title, or name)
+
+> [!TIP]
+> :point_right: Changes to player information other than Elo, FIDE title, or name have no impact on pairings and ratings.
+
+> [!NOTE]
+> :information_source:
+> - _Papi_ recalculates pairing numbers every round (contrary to FIDE regulations).
+> - Within a certain period of time after the publication of the results of round N (or before publication of the results), the change takes effect for the standings of round N and the pairings of round N+1.
+> After the publication of round N+1, the ratings are changed starting with round N+2.
+
+| Time                                                           |  FIDE Authorized   |  Registration  | Round to<br/>recalculate<br/>pairings |      Modification<br/>ratings       |
+|----------------------------------------------------------------|:------------------:|:--------------:|:-------------------------------------:|:-----------------------------------:|
+| Before publication of round 1 pairings                         | :white_check_mark: | :white_circle: |             round 1                   |                                     |
+| Before publication of round 1 results                          | :white_check_mark: |   :pushpin:    |                round 2                |               round 1               |
+| After publication of round 2 pairings                          | :white_check_mark: |   :pushpin:    |                round 3                |               round 3               |
+| Before publication of round 2 results                          | :white_check_mark: |   :pushpin:    |                round 3                |               round 2               |
+| After publication of round 3 pairings                          | :white_check_mark: |   :pushpin:    |                round 4                |               round 4               |
+| Before the end of the publication deadline for round 3 results | :white_check_mark: |   :pushpin:    |                round 4                |                                     |
+| From the publication of round 4 pairings                       | :white_check_mark: |   :pushpin:    |                  no                   | round N+1 or N+2<br/>as appropriate |
+
+> [!TIP]
+> :point_right: Compliance with FIDE regulations:
+> - :white_check_mark: Action authorized by FIDE
+>
+> :point_right: Recording of non-standard actions:
+> - :white_circle: No recording
+> - :pushpin: Recording in the database
+
+## Editing Pairings and Results
+
+An incorrect result or color in round N can be reported (FIDE regulations):
+- Within a certain time after the publication of the results of round N
+- The ratings of round N and the pairings of round N+1 use this correction
+- After the publication of the pairings of round N+1, but before the end of round N+1
+- The pairings of round N+2 use this correction (probably also the ratings of round N+1)
+- After the end of round N+1
+- The result is only used for the FIDE export, not for the final ratings or subsequent pairings.
+
+### Action Descriptions
+
+| Action / Round        |                     Past                      |                     Previous                      |                   Current                    |           First<br/>un<br/>paired            |                    Future                     |
+|-----------------------|:---------------------------------------------:|:-------------------------------------------------:|:--------------------------------------------:|:--------------------------------------------:|:---------------------------------------------:|
+| Total Pairing         | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   | :white_circle: :white_circle: :white_circle: |      :white_check_mark: :ok: :pushpin:       | :no_entry_sign: :white_circle: :white_circle: |
+| Complementary pairing | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Manual pairing        |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: |     :no_entry_sign: :warning: :pushpin:      | :no_entry_sign: :white_circle: :white_circle: |
+| Complete unpairing    | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   |  :no_entry_sign: :grey_question: :pushpin:   | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Manual unpairing      |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Player swap           |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Editing a result      |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    |    :white_check_mark: :ok: :white_circle:    | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Modification of byes  |      :no_entry_sign: :warning: :pushpin:      | :ballot_box_with_check: :grey_question: :pushpin: | :ballot_box_with_check: :ok: :white_circle:  | :ballot_box_with_check: :ok: :white_circle:  |  :ballot_box_with_check: :ok: :white_circle:  |
+
+> [!TIP]
+> :point_right: Compliance with FIDE regulations:
+> - :white_circle: _Irrelevant action_
+> - :no_entry_sign: Action not authorized by FIDE
+> - :white_check_mark: Action authorized by FIDE
+> - :ballot_box_with_check: Action authorized by FIDE, must be authorized by the regulations
+> :point_right: Warning messages for arbiters:
+> - :white_circle: _Action not proposed_
+> - :ok: Action without warning message
+> - :grey_question: Modal: The action you wish to perform is not "standard", continue?
+> - :warning: Modal: The action you wish to perform is not authorized by FIDE, continue?
+>
+> :point_right: Recording of non-standard actions:
+> - :white_circle: No record
+> - :pushpin: Recording in the database
diff --git a/docs/82-chessevent.md b/docs/technical-appendices/chessevent-interfacing.md
similarity index 98%
rename from docs/82-chessevent.md
rename to docs/technical-appendices/chessevent-interfacing.md
index 02e4856b50..fda2663b66 100644
--- a/docs/82-chessevent.md
+++ b/docs/technical-appendices/chessevent-interfacing.md
@@ -1,14 +1,10 @@
-> **[Retour au sommaire de la documentation](../README.md)**
->
-> ![](../src/web/static/images/papi-web-error.png)
-
-# Sharly Chess - Technical Appendix - Interfacing with _ChessEvent_
+# _Sharly Chess_ - Interfacing with _ChessEvent_
 
 _Sharly Chess_ can retrieve registrations made on the _ChessEvent_ platform by activating the _ChessEvent_ plugin:
 
-- [The _ChessEvent_ plugin](/chessevent-plugin)
+- [The _ChessEvent_ plugin](https://sharly-chess.com/chessevent-plugin) (user documentation)
 
-This page describes the technical aspects of _Sharly Chess_'s interface with the _ChessEvent_ platform.
+This page describes the technical aspects of _Sharly Chess_'s interfacing with the _ChessEvent_ platform.
 
 ## Authentication
 
diff --git a/docs/technical-appendices/databases.md b/docs/technical-appendices/databases.md
new file mode 100644
index 0000000000..bb24426eee
--- /dev/null
+++ b/docs/technical-appendices/databases.md
@@ -0,0 +1,252 @@
+# _Sharly Chess_ - Description of the databases
+
+## _Sharly Chess_ configuration database (`events/.scc`)
+
+### `info` (general application configuration)
+
+{: .note }
+> :information_source: Table `info` contains only one line.
+
+| Field            | Type      | Constraint | Description                                                                                                               |
+|------------------|-----------|------------|---------------------------------------------------------------------------------------------------------------------------|
+| `force_edit`     | `INTEGER` | NOT NULL   | Boolean:<br/>- `1`: Editing the configuration is mandatory;<br/>- `0`: Editing the configuration is possible but optional |
+| `log_level`      | `INTEGER` |            | The log level                                                                                                             |
+| `launch_browser` | `INTEGER` |            | Boolean:<br/>- `1`: A browser is automatically opened (default);<br/>- `0`: No browser is opened                          |
+| `federation`     | `TEXT`    |            | The default federation code for events                                                                                    |
+| `locale`         | `TEXT`    |            | The default language used for users                                                                                       |
+
+### `local_source_database` (local player databases)
+
+| Field            | Type    | Constraint | Description                                                                          |
+|------------------|---------|------------|--------------------------------------------------------------------------------------|
+| `name`           | `TEXT`  | NOT NULL   | The database name                                                                    |
+| `outdated_delay` | `TEXT`  | NOT NULL   | The auto-update delay (`disabled`, `daily`, `2days`, `3days`, `weekly`, `month_1st`) |
+| `outdate_action` | `TEXT`  | NOT NULL   | The action to take when the database needs to be updated (`notif`, `auto_update`)    |
+| `updated_at`     | `FLOAT` |            | The last update date for the database                                                |
+
+### `metadata` (application metadata)
+
+| Field       | Type   | Constraint                               | Description              |
+|-------------|--------|------------------------------------------|--------------------------|
+| `version`   | `TEXT` | NOT NULL                                 | The application version  |
+| `migration` | `TEXT` | NOT NULL<br/>DEFAULT 'm000_no_migration' | The last database update |
+
+### `Plugin` (extensions)
+
+| Field     | Type      | Constraint | Description                                                                           |
+|-----------|-----------|------------|---------------------------------------------------------------------------------------|
+| `name`    | `TEXT`    | NOT NULL   | The name of the extension                                                             |
+| `enabled` | `INTEGER` | NOT NULL   | Boolean:<br/>- `1`: The extension is enabled;<br/>- `0`: The extension is not enabled |
+
+## Event Database (`events/*.db`)
+
+### `info` table (general information about the event)
+
+{: .note }
+> - The `info` table contains only one row.
+> - The tournament's unique identifier is not stored in the database; it is retrieved from the event database filename.
+
+| Field                      | Type      | Constraint                | Ext        | Description                                                                                                                                                                                                              |
+|----------------------------|-----------|---------------------------|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `name`                     | `TEXT`    | NOT NULL<br> DEFAULT '?'  |            | The name of the event                                                                                                                                                                                                    |
+| `start`                    | `FLOAT`   | NOT NULL                  |            | The start date of the event (timestamp)                                                                                                                                                                                  |
+| `stop`                     | `FLOAT`   | NOT NULL                  |            | The end date of the event (timestamp)                                                                                                                                                                                    |
+| `public`                   | `INTEGER` |                           |            | Boolean:<br/>- `1`: the event is public (visible to users on the public interface);<br/>- `0`: the event is reserved for referees                                                                                        |
+| `path`                     | `TEXT`    |                           |            | The relative or absolute path to the event's tournament Papi files                                                                                                                                                       |
+| `hide_background_image`    | `INTEGER` |                           |            | Boolean:<br/>- `1`: a background image is displayed on the screens;<br/>- `0`: no background image is displayed                                                                                                          |
+| `background_image`         | `TEXT`    |                           |            | A URL or relative path (in the `/custom` directory) to a local image (by default, no logo is used)                                                                                                                       |
+| `background_color`         | `TEXT`    |                           |            | The background color of the event's screens in hexadecimal format '`#RRGGBB` (default `#E9ECEF`)                                                                                                                         |
+| `update_password`          | `TEXT`    |                           |            | The password to provide to use the entry screens                                                                                                                                                                         |
+| `record_illegal_moves`     | `INTEGER` |                           |            | The maximum number of illegal moves a player can record per round by default (this number can be changed for each tournament in the event) If this number is not specified, no legal moves can be recorded (default `0`) |
+| `rules`                    | `TEXT`    |                           |            | The URL or server path to the event's tournament rules, in PDF format                                                                                                                                                    |
+| `timer_colors`             | `TEXT`    |                           |            | The default colors used for timers in JSON format (dictionary with keys `1'`, `2'`, and `3'`, each color is stored in hexadecimal format `#RRGGBB`)                                                                      |
+| `timer_delays`             | `TEXT`    |                           |            | The default delays used for timers in JSON format (dictionary with keys `1'`, `2'`, and `3'`, each delay is stored as an integer, in seconds)                                                                            |
+| `message_text`             | `TEXT`    |                           |            | The text of the event's alert messages (by default, no alert messages are displayed)                                                                                                                                     |
+| `message_color`            | `TEXT`    |                           |            | The color of the event's alert messages in hexadecimal format `#RRGGBB` (default `#FF0000`)                                                                                                                              |
+| `message_background_color` | `TEXT`    |                           |            | The background color of the event's alert messages in hexadecimal format `#RRGGBB` (default `#FFFF00`)                                                                                                                   |
+| `last_update`              | `FLOAT`   | NOT NULL                  |            | The date the event was last updated (timestamp)                                                                                                                                                                          |
+| `federation`               | `TEXT`    | NOT NULL<br/>DEFAULT 'NO' |            | The event's federation code                                                                                                                                                                                              |
+| `chessevent_user_id`       | `TEXT`    |                           | chessevent | The default login ID for the _ChessEvent_ platform                                                                                                                                                                       |
+| `chessevent_password`      | `TEXT`    |                           | chessevent | The default password for the _ChessEvent_ platform                                                                                                                                                                       |
+| `chessevent_event_id`      | `TEXT`    |                           | chessevent | The default login ID for the _ChessEvent_ event on the platform                                                                                                                                                          |
+
+### `metadata` (event metadata)
+
+| Field       | Type   | Constraint                               | Description                           |
+|-------------|--------|------------------------------------------|---------------------------------------|
+| `version`   | `TEXT` | NOT NULL                                 | The event database version            |
+| `migration` | `TEXT` | NOT NULL<br/>DEFAULT 'm000_no_migration' | The last update of the event database |
+
+### `plugin_metadata` (plugin metadata for the event)
+
+| Field       | Type   | Constraint                               | Description                                        |
+|-------------|--------|------------------------------------------|----------------------------------------------------|
+| `name`      | `TEXT` | NOT NULL                                 | The name of the plugin                             |
+| `version`   | `TEXT` | NOT NULL                                 | The database version of the plugin for the event   |
+| `migration` | `TEXT` | NOT NULL<br/>DEFAULT 'm000_no_migration' | The latest extension database update for the event |
+
+### `timer` (timer configurations)
+
+| Field     | Type      | Constraint                                 | Ext | Description                                                                                                                        |
+|-----------|-----------|--------------------------------------------|-----|------------------------------------------------------------------------------------------------------------------------------------|
+| `id`      | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |     | The stopwatch identifier                                                                                                           |
+| `uniq_id` | `TEXT`    | NOT NULL<br/>UNIQUE                        |     | The unique text identifier of the stopwatch                                                                                        |
+| `colors`  | `TEXT`    |                                            |     | The colors used in JSON format (dictionary with keys `1'`, `2'`, and `3'`, each color is stored in hexadecimal format ``#RRGGBB``) |
+| `delays`  | `TEXT`    |                                            |     | The delays used in JSON format (dictionary with keys `'1'`, `'2'` and `'3'`, each delay is stored as an integer, in seconds)       |
+
+### `timer_hour` (timer hours)
+
+| Field         | Type      | Constraint                                 | Ext | Description                                                                                                                           |
+|---------------|-----------|--------------------------------------------|-----|---------------------------------------------------------------------------------------------------------------------------------------|
+| `id`          | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |     | The timer ID                                                                                                                          |
+| `uniq_id`     | `TEXT`    | NOT NULL                                   |     | The unique text ID of the timer (if the field is a positive integer, the timer is identified as the start of the corresponding round) |
+| `timer_id`    | `INTEGER` | NOT NULL<br>REFERENCES `timer`(`id`)       |     | The timer ID                                                                                                                          |
+| `order`       | `INTEGER` | NOT NULL                                   |     | The order of the timer relative to the other times in its timer                                                                       |
+| `date_str`    | `TEXT`    |                                            |     | The date of the schedule in YYYY-MM-DD format                                                                                         |
+| `time_str`    | `TEXT`    |                                            |     | The time of the schedule in hh:mm format                                                                                              |
+| `text_before` | `TEXT`    |                                            |     | The text to display on the timer before the schedule                                                                                  |
+| `text_after`  | `TEXT`    |                                            |     | The text to display on the timer after the schedule                                                                                   |
+|               |           | UNIQUE(`uniq_id`, `timer_id`)              |     |                                                                                                                                       |
+
+### `tournament` (tournaments)
+
+| Field                                 | Type      | Constraint                                 | Ext        | Description                                                                                                                                                |
+|---------------------------------------|-----------|--------------------------------------------|------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `id`                                  | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |            | The tournament ID                                                                                                                                          |
+| `uniq_id`                             | `TEXT`    | NOT NULL                                   |            | The unique text ID of the tournament                                                                                                                       |
+| `name`                                | `TEXT`    | NOT NULL                                   |            | The tournament name                                                                                                                                        |
+| `path`                                | `TEXT`    |                                            |            | The absolute or relative path where the tournament file is stored                                                                                          |
+| `filename`                            | `TEXT`    |                                            |            | The name of the tournament's Papi file, without the `.papi` extension                                                                                      |
+| `time_control_initial_time`           | `INTEGER` |                                            |            | The initial time on the clock in seconds (can be zero if incremented)                                                                                      |
+| `time_control_increment`              | `INTEGER` |                                            |            | The time increment gained by the players on each shot                                                                                                      |
+| `time_control_handicap_penalty_step`  | `INTEGER` |                                            |            | The time subtracted from the higher-ranked player, in seconds (this time is multiplied by the number of increments of difference between the two players)  |
+| `time_control_handicap_penalty_value` | `INTEGER` |                                            |            | The number of points of difference between the players' rankings used to calculate the number of penalties applied to the higher-ranked player             |
+| `time_control_handicap_min_time`      | `INTEGER` |                                            |            | The minimum time that will be granted to the highest-ranked player, even if the difference in ranking is very significant                                  |
+| `record_illegal_moves`                | `INTEGER` |                                            |            | The maximum number of illegal moves that can be recorded for a player per round If this number is not specified, the event's default configuration is used |
+| `rules`                               | `TEXT`    |                                            |            | The URL or server path to the tournament rules, in PDF format (by default, the event rules)                                                                |
+| `check_in_open`                       | `INTEGER` |                                            |            | Boolean:<br/>- `1`: Checking is open;<br/>- `0`: Checking is closed                                                                                        |
+| `last_update`                         | `FLOAT`   | NOT NULL                                   |            | The last date the tournament was modified                                                                                                                  |
+| `last_illegal_move_update`            | `FLOAT`   | NOT NULL<br/>DEFAULT 0.0                   |            | The last date illegal moves in the tournament were modified                                                                                                |
+| `last_result_update`                  | `FLOAT`   | NOT NULL<br/>DEFAULT 0.0                   |            | The last date a tournament result was modified                                                                                                             |
+| `last_check_in_update`                | `FLOAT`   | NOT NULL<br/>DEFAULT 0.0                   |            | The last date the tournament score was modified                                                                                                            |
+| `first_board_number`                  | `INTEGER` |                                            |            | The first board number                                                                                                                                     |
+| `paired_bye_result`                   | `INTEGER` |                                            |            | Result awarded to bye players                                                                                                                              |
+| `max_byes`                            | `INTEGER` |                                            |            | The maximum number of byes a player can claim                                                                                                              |
+| `last_rounds_no_byes`                 | `INTEGER` |                                            |            | The number of final rounds for which players cannot take byes                                                                                              |
+| `tie_breaks`                          | `TEXT`    |                                            |            | The tie-breaks used in JSON format (list of dictionaries in the format {'type': str, 'options': dict[str,any]})                                            |
+| `chessevent_user_id`                  | `TEXT`    |                                            | chessevent | The username used to log in to the _ChessEvent_ platform                                                                                                   |
+| `chessevent_password`                 | `TEXT`    |                                            | chessevent | The password used to log in to the _ChessEvent_ platform                                                                                                   |
+| `chessevent_event_id`                 | `TEXT`    |                                            | chessevent | The _ChessEvent_ event ID on the platform                                                                                                                  |
+| `chessevent_tournament_name`          | `TEXT`    |                                            | chessevent | The tournament ID on the _ChessEvent_ platform                                                                                                             |
+| `chessevent_last_download_md5`        | `TEXT`    |                                            | chessevent | The hash of the tournament's last download from the _ChessEvent_ platform                                                                                  |
+| `ffe_id`                              | `INTEGER` |                                            | ffe        | The tournament's approval number on the FFE federal website                                                                                                |
+| `ffe_password`                        | `TEXT`    |                                            | ffe        | The tournament access code on the FFE federal website (consisting of 10 capital letters)                                                                   |
+| `ffe_last_upload`                     | `FLOAT`   | NOT NULL<br/>DEFAULT 0.0                   | ffe        | The date the tournament was last uploaded to the FFE federal website                                                                                       |
+| `ffe_last_rules_upload`               | `FLOAT`   | NOT NULL<br/>DEFAULT 0.0                   | ffe        | The date of the last sending of the tournament rules to the FFE federal website                                                                            |
+
+### `illegal_move` (illegal moves)
+
+| Field           | Type      | Constraint                                 | Ext | Description                                     |
+|-----------------|-----------|--------------------------------------------|-----|-------------------------------------------------|
+| `id`            | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |     | The ID of the illegal move                      |
+| `tournament_id` | `INTEGER` | NOT NULL<br/>REFERENCES `tournament`(`id`) |     | The tournament ID                               |
+| `round`         | `INTEGER` | NOT NULL                                   |     | The round number                                |
+| `player_id`     | `INTEGER` | NOT NULL                                   |     | The player ID (in the tournament's _Papi_ file) |
+| `date`          | `FLOAT`   | NOT NULL                                   |     | The recording date                              |
+
+### `result` (results)
+
+| Field             | Type      | Constraint                                 | Ext | Description                                                                                                                                                         |
+|-------------------|-----------|--------------------------------------------|-----|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `id`              | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |     | The result ID                                                                                                                                                       |
+| `tournament_id`   | `INTEGER` | NOT NULL<br/>REFERENCES `tournament`(`id`) |     | The tournament ID                                                                                                                                                   |
+| `round`           | `INTEGER` | NOT NULL                                   |     | The round number                                                                                                                                                    |
+| `board_id`        | `INTEGER` | NOT NULL                                   |     | The board number                                                                                                                                                    |
+| `white_player_id` | `INTEGER` | NOT NULL                                   |     | The number of the White player (in the tournament _Papi_ file)                                                                                                      |
+| `black_player_id` | `INTEGER` | NOT NULL                                   |     | The number of the player with Black (in the tournament's _Papi_ file)                                                                                               |
+| `date`            | `FLOAT`   | NOT NULL                                   |     | The registration date                                                                                                                                               |
+| `value`           | `INTEGER` | NOT NULL                                   |     | The result:<br/>- `1`: Black wins<br/>- `2`: draw<br/>- `3`: White wins<br/>- `4`: Black wins by forfeit<br/>- `5`: double forfeit<br/>- `6`: White wins by forfeit |
+
+### `screen` (screens)
+
+| Field                    | Type      | Constraint                                 | Ext | Description                                                                                                                                                                                                       |
+|--------------------------|-----------|--------------------------------------------|-----|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `id`                     | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |     | The screen ID                                                                                                                                                                                                     |
+| `uniq_id`                | `TEXT`    | NOT NULL<br/>UNIQUE                        |     | The unique text ID of the screen                                                                                                                                                                                  |
+| `type`                   | `TEXT`    | NOT NULL                                   |     | The screen type:<br/>- `input`: results entry<br/>- `boards`: pairings by chessboard<br/>- `players`: pairings in alphabetical order<br/>- `results`: latest results<br/>- `image`: image                         |
+| `public`                 | `INTEGER` |                                            |     | Boolean:<br/>- `1`: the screen is public (visible to users on the public interface);<br/>- `0`: the screen is reserved for referees                                                                               |
+| `name`                   | `TEXT`    |                                            |     | The name of the screen                                                                                                                                                                                            |
+| `columns`                | `INTEGER` |                                            |     | The number of columns on the screen                                                                                                                                                                               |
+| `menu_link`              | `INTEGER` |                                            |     | Boolean:<br/>- `NULL` if `type` is `image`;<br/>- `1`: a link to this screen can be displayed from other screens;<br/>- `0`: no link to this screen will ever be displayed                                        |
+| `menu_text`              | `TEXT`    |                                            |     | `NULL` if `type` is `image`, otherwise the text of the hyperlink to the screen, used on other screens                                                                                                             |
+| `menu`                   | `TEXT`    |                                            |     | `NULL` if `type` is `image`, otherwise the menu to display on the screen (hyperlinks to other screens)                                                                                                            |
+| `timer_id`               | `INTEGER` | REFERENCES `timer`(`id`)                   |     | The timer ID                                                                                                                                                                                                      |
+| `input_exit_button`      | `INTEGER` |                                            |     | Boolean:<br/>- `NULL` if `type` is different from `input`;<br/>- `1`: a button to exit the page is displayed;<br/>- `0`: the button is not displayed                                                              |
+| `players_show_unpaired`  | `INTEGER` |                                            |     | Boolean:<br/>- `NULL` if `type` is different from `players`;<br/>- `0`: unmatched players are hidden;<br/>- `0`: unmatched players are shown                                                                      |
+| `results_limit`          | `INTEGER` |                                            |     | - `NULL` if `type` is different from `results`;<br/>- `0`: all recent results are shown;<br/>- positive integer: the maximum number of results shown on the screen                                                |
+| `results_max_age`        | `INTEGER` |                                            |     | - `NULL` if `type` is different from `results`;<br/>- `NULL` or positive integer: the maximum age of results displayed on the screen (in minutes, default 60)                                                     |
+| `results_tournament_ids` | `TEXT`    |                                            |     | - `NULL` if `type` is not equal to `results`;<br/>- The list of tournament IDs for which results are displayed on the screen, in JSON format (if the list is empty, the results of all tournaments are displayed) |
+| `background_image`       | `TEXT`    |                                            |     | - `NULL` if `type` is not equal to `image`;<br/>- The URL of the image to display                                                                                                                                 |
+| `background_color`       | `TEXT`    |                                            |     | - `NULL` if `type` is not equal to `image`;<br/>- The background color of the image, in hexadecimal format `#RRGGBB`                                                                                              |
+| `ranking_crosstable`     | `INTEGER` |                                            |     | Boolean:<br/>- `1`: American grid;<br/>- `0`: simple ranking                                                                                                                                                      |
+| `ranking_round`          | `INTEGER` |                                            |     | The number of the round to display (by default the last round played)                                                                                                                                             |
+| `ranking_min_points`     | `INTEGER` |                                            |     | The minimum number of points of the displayed players                                                                                                                                                             |
+| `ranking_max_points`     | `INTEGER` |                                            |     | The maximum number of points for the displayed players                                                                                                                                                            |
+| `ranking_crosstable`     | `INTEGER` |                                            |     | Boolean:<br/>- `1`: American grid;<br/>- `0`: Simple ranking                                                                                                                                                      |
+| `font_size`              | `INTEGER` |                                            |     | The font size in percentage (default 100%)                                                                                                                                                                        |
+| `message_default`        | `INTEGER` | NOT NULL<br/>DEFAULT 1                     |     | Boolean:<br/>- `1`: The event alert message (or the rotating screen, if applicable) is used;<br/>- `0`: The screen alert message is used instead of the event alert message                                       |
+| `message_text`           | `TEXT`    |                                            |     | The text of the screen's alert message (by default, no alert message is displayed)                                                                                                                                |
+| `last_update`            | `FLOAT`   | NOT NULL                                   |     | The date the screen was last modified                                                                                                                                                                             |
+
+### `screen_set` (screen sets)
+
+| Field              | Type      | Constraint                                 | Ext | Description                                                   |
+|--------------------|-----------|--------------------------------------------|-----|---------------------------------------------------------------|
+| `id`               | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |     | The screen ID                                                 |
+| `screen_id`        | `TEXT`    | NOT NULL<br/>REFERENCES `screen`(`id`)     |     | The unique text ID of the screen                              |
+| `tournament_id`    | `TEXT`    | NOT NULL<br/>REFERENCES `tournament`(`id`) |     | The tournament ID                                             |
+| `name`             | `TEXT`    |                                            |     | The name of the set                                           |
+| `order`            | `INTEGER` | NOT NULL                                   |     | The order of the set relative to other sets on its screen     |
+| `first`            | `INTEGER` |                                            |     | The number of the first element (board or player) to consider |
+| `last`             | `INTEGER` |                                            |     | The number of the last element (board or player) to consider  |
+| `fixed_boards_str` | `TEXT`    |                                            |     | Board numbers separated by commas                             |
+| `last_update`      | `FLOAT`   | NOT NULL                                   |     | The date the set was last modified                            |
+
+### `family` (screen families)
+
+| Field                   | Type      | Constraint                                 | Ext | Description                                                                                                                                                                                                                      |
+|-------------------------|-----------|--------------------------------------------|-----|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `id`                    | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |     | The family ID                                                                                                                                                                                                                    |
+| `uniq_id`               | `TEXT`    | NOT NULL<br/>UNIQUE                        |     | The unique text ID of the family                                                                                                                                                                                                 |
+| `type`                  | `TEXT`    | NOT NULL                                   |     | The screen type:<br/>- `input`: results entry<br/>- `boards`: pairings by chessboard<br/>- `players`: pairings in alphabetical order<br/>- `results`: latest results<br/>- `image`: image                                        |
+| `public`                | `INTEGER` |                                            |     | Boolean:<br/>- `1`: the family is public (visible to users on the public interface);<br/>- `0`: the family is reserved for referees                                                                                              |
+| `name`                  | `TEXT`    |                                            |     | The name of the family                                                                                                                                                                                                           |
+| `columns`               | `INTEGER` |                                            |     | The number of columns in the family's screens                                                                                                                                                                                    |
+| `menu_link`             | `INTEGER` | NOT NULL                                   |     | Boolean:<br/>- `1`: a link to the family's screens can be displayed from other screens;<br/>- `0`: no link to the family's screens will ever be displayed                                                                        |
+| `menu_text`             | `TEXT`    | NOT NULL                                   |     | The text of the hyperlink to the family's screens, used on other screens                                                                                                                                                         |
+| `menu`                  | `TEXT`    | NOT NULL                                   |     | The menu to display on the family's screens (hyperlinks to other screens)                                                                                                                                                        |
+| `timer_id`              | `INTEGER` | REFERENCES `timer`(`id`)                   |     | The ID of the timer used on the family's screens                                                                                                                                                                                 |
+| `tournament_id`         | `INTEGER` | REFERENCES `tournament`(`id`)              |     | The ID of the tournament in the family                                                                                                                                                                                           |
+| `input_exit_button`     | `INTEGER` |                                            |     | Boolean:<br/>- `NULL` if `type` is different from `input`;<br/>- `1`: a button to exit the page is displayed;<br/>- `0`: the button is not displayed                                                                             |
+| `players_show_unpaired` | `INTEGER` |                                            |     | Boolean:<br/>- `NULL` if `type` is different from `players`;<br/>- `0`: unpaired players are hidden;<br/>- `0`: unpaired players are shown                                                                                       |
+| `first`                 | `INTEGER` |                                            |     | The number of the first element (board or player) to consider                                                                                                                                                                    |
+| `last`                  | `INTEGER` |                                            |     | The number of the last element (board or player) to consider                                                                                                                                                                     |
+| `range`                 | `TEXT`    |                                            |     | The range of screens to generate, for example `4-6` (by default, all screens in the family are generated)                                                                                                                        |
+| `parts`                 | `INTEGER` |                                            |     | The number of screens in the family (the number of elements per screen is calculated automatically)                                                                                                                              |
+| `number`                | `INTEGER` |                                            |     | The number of elements (boards or players) per screen (the number of screens is calculated automatically)                                                                                                                        |
+| `message_default`       | `INTEGER` | NOT NULL<br/>DEFAULT 1                     |     | Boolean:<br/>- `1`: The event alert message (or the rotating screen, if applicable) is used for the screens in the family;<br/>- `0`: The alert message for the screens in the family is used instead of the event alert message |
+| `message_text`          | `TEXT`    |                                            |     | The text of the screen's alert message (by default, no alert message is displayed)                                                                                                                                               |
+| `last_update`           | `FLOAT`   | NOT NULL                                   |     | The last date the screen was modified                                                                                                                                                                                            |
+
+### `rotator` (rotating screens)
+
+| Field             | Type      | Constraint                                 | Ext | Description                                                                                                                                                                                                  |
+|-------------------|-----------|--------------------------------------------|-----|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `id`              | `INTEGER` | NOT NULL<br/>PRIMARY KEY<br/>AUTOINCREMENT |     | The rotating screen's identifier                                                                                                                                                                             |
+| `uniq_id`         | `TEXT`    | NOT NULL<br/>UNIQUE                        |     | The unique text identifier of the rotating screen                                                                                                                                                            |
+| `public`          | `INTEGER` |                                            |     | Boolean:<br/>- `1`: The rotating screen is public (visible to users on the public interface);<br/>- `0`: The rotating screen is reserved for referees                                                        |
+| `screen_ids`      | `TEXT`    |                                            |     | The list of screens to display, in JSON format                                                                                                                                                               |
+| `family_ids`      | `TEXT`    |                                            |     | The list of screen families to display, in JSON format                                                                                                                                                       |
+| `delay`           | `INTEGER` |                                            |     | The screen rotation delay in seconds, optional (default 15)                                                                                                                                                  |
+| `message_default` | `INTEGER` | NOT NULL<br/>DEFAULT 1                     |     | Boolean:<br/>- `1`: The event alert message is used (unless a message is defined for the screens);<br/>- `0`: The alert message for the rotating screen's screens is used instead of the event alert message |
+| `message_text`    | `TEXT`    |                                            |     | The screen's alert message text (by default, no alert message is displayed)                                                                                                                                  |
diff --git a/docs/technical-appendices/detailed-roadmap.md b/docs/technical-appendices/detailed-roadmap.md
new file mode 100644
index 0000000000..c2e53bbc8c
--- /dev/null
+++ b/docs/technical-appendices/detailed-roadmap.md
@@ -0,0 +1,71 @@
+# _Sharly Chess_ - Detail roadmap
+
+This table focuses on the evolutions of _Sharly Chess_ by functionality.
+
+- [See the macroscopic roadmap](https://sharly-chess.com/roadmap)
+
+- LAN = local network usage (on a local server)
+- SaaS = online usage (on a remote server)
+
+|                                    |        PW 1.19<br>Jan 2023         |        PW 2.0<br/>Nov 2023         |        PW 2.1<br/>Dec 2023         |        PW 2.2<br/>Mar 2024         |        PW 2.3<br/>Apr 2024         |        PW 2.4<br/>Oct 2024         |        PW 2.5<br/>Apr 2025         |          PW 2.x<br/>2025          |          SC 3.0<br/>2025          |
+|------------------------------------|:----------------------------------:|:----------------------------------:|:----------------------------------:|:----------------------------------:|:----------------------------------:|:----------------------------------:|:----------------------------------:|:---------------------------------:|:---------------------------------:|
+| **LAN**                            |            **PW 1.19**             |             **PW 2.0**             |             **PW 2.1**             |             **PW 2.2**             |             **PW 2.3**             |             **PW 2.4**             |             **PW 2.5**             |            **PW 2.x**             |            **SC 3.0**             |
+| Open source                        |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Free software license              |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |      :heavy_check_mark:︎ AGPL      |      :heavy_check_mark:︎ AGPL      |     :heavy_check_mark:︎ AGPL      |     :heavy_check_mark:︎ AGPL      |
+| Built-in web server                |             :x:︎ XAMPP             |     :heavy_check_mark:︎ Django     |     :heavy_check_mark:︎ Django     |    :heavy_check_mark:︎ Litestar    |    :heavy_check_mark:︎ Litestar    |    :heavy_check_mark:︎ Litestar    |    :heavy_check_mark:︎ Litestar    |   :heavy_check_mark:︎ Litestar    |   :heavy_check_mark:︎ Litestar    |
+| Built-in database driver           |             :x:︎ ODBC              |             :x:︎ ODBC              |             :x:︎ ODBC              |             :x:︎ ODBC              |             :x:︎ ODBC              |             :x:︎ ODBC              |             :x:︎ ODBC              |             :x:︎ ODBC             |    :heavy_check_mark:︎ SQLite     |
+| Windows support                    |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Windows executable                 |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Windows executable signing         |                 -                  |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |          :grey_question:          |          :grey_question:          |
+| Linux support                      |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |               :x:︎                |        :heavy_check_mark:︎        |
+| Mac support                        |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |               :x:︎                |        :heavy_check_mark:︎        |
+| Papi-web configuration             |              :x:︎ PHP              |      :heavy_check_mark:︎ INI       |      :heavy_check_mark:︎ INI       |      :heavy_check_mark:︎ INI       |      :heavy_check_mark:︎ INI       |      :heavy_check_mark:︎ INI       |      :heavy_check_mark:︎ INI       |      :heavy_check_mark:︎ INI      |  :heavy_check_mark:︎ INI/SQLite   |
+| Event configuration                |              :x:︎ PHP              |              :x:︎ INI              |              :x:︎ INI              |              :x:︎ INI              |              :x:︎ INI              |      :heavy_check_mark:︎ Web       |      :heavy_check_mark:︎ Web       |      :heavy_check_mark:︎ Web      |      :heavy_check_mark:︎ Web      |
+| Tournament storage                 |            :x:︎ Access             |            :x:︎ Access             |            :x:︎ Access             |            :x:︎ Access             |            :x:︎ Access             |            :x:︎ Access             |            :x:︎ Access             |            :x:︎ Access            |    :heavy_check_mark:︎ SQLite     |
+| Event storage                      |                 -                  |             :x:︎ File              |             :x:︎ File              |             :x:︎ File              |             :x:︎ File              |     :heavy_check_mark:︎ SQLite     |     :heavy_check_mark:︎ SQLite     |    :heavy_check_mark:︎ SQLite     |    :heavy_check_mark:︎ SQLite     |
+| **SAAS**                           |            **PW 1.19**             |             **PW 2.0**             |             **PW 2.1**             |             **PW 2.2**             |             **PW 2.3**             |             **PW 2.4**             |             **PW 2.5**             |            **PW 2.x**             |            **SC 3.0**             |
+| Availability                       |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |               :x:︎                |          :grey_question:          |
+| Open source                        |                 -                  |                 -                  |                 -                  |                 -                  |                 -                  |                 -                  |                 -                  |                 -                 |          :grey_question:          |
+| Free software license              |                 -                  |                 -                  |                 -                  |                 -                  |                 -                  |                 -                  |                 -                  |                 -                 |          :grey_question:          |
+| Storage                            |                 -                  |                 -                  |                 -                  |                 -                  |                 -                  |                 -                  |                 -                  |                 -                 |          :grey_question:          |
+| **PAIRINGS**                       |            **PW 1.19**             |             **PW 2.0**             |             **PW 2.1**             |             **PW 2.2**             |             **PW 2.3**             |             **PW 2.4**             |             **PW 2.5**             |            **PW 2.x**             |            **SC 3.0**             |
+| Swiss pairings                     | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.8 | :heavy_check_mark:︎<br/>Papi 3.3.8 | :heavy_check_mark:︎<br/>bbp 5.0.1 | :heavy_check_mark:︎<br/>bbp 5.0.1 |
+| FIDE Handbook C.04 compliance      |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |     :heavy_check_mark:︎ PW 2.5     |    :heavy_check_mark:︎ PW 2.6     |    :heavy_check_mark:︎ SC 3.0     |
+| Round-robin pairings               | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.8 | :heavy_check_mark:︎<br/>Papi 3.3.8 |    :heavy_check_mark:︎ PW 2.6     |    :heavy_check_mark:︎ SC 3.0     |
+| Manual pairings                    | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.8 | :heavy_check_mark:︎<br/>Papi 3.3.8 |    :heavy_check_mark:︎ PW 2.6     |    :heavy_check_mark:︎ SC 3.0     |
+| Draft/Published status             |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| TRF16 import/export                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |               :x:︎                |        :heavy_check_mark:︎        |
+| TRF25 import/export                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |               :x:︎                |        :heavy_check_mark:︎        |
+| **RANKINGS**                       |            **PW 1.19**             |             **PW 2.0**             |             **PW 2.1**             |             **PW 2.2**             |             **PW 2.3**             |             **PW 2.4**             |             **PW 2.5**             |            **PW 2.x**             |            **SC 3.0**             |
+| Ranking calculation                | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.8 |     :heavy_check_mark:︎ PW 2.5     |    :heavy_check_mark:︎ PW 2.x     |    :heavy_check_mark:︎ SC 3.0     |
+| FIDE compliance for unplayed games | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.6 | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 |                :x:︎                |                :x:︎                |     :heavy_check_mark:︎ PW 2.5     |    :heavy_check_mark:︎ PW 2.x     |    :heavy_check_mark:︎ SC 3.0     |
+| FIDE performance compliance        |                :x:︎                |                :x:︎                | :heavy_check_mark:︎<br/>Papi 3.3.7 | :heavy_check_mark:︎<br/>Papi 3.3.7 |                :x:︎                |                :x:︎                |                :x:︎                |    :heavy_check_mark:︎ PW 2.x     |    :heavy_check_mark:︎ SC 3.0     |
+| **INTERNATIONALIZATION**           |            **PW 1.19**             |             **PW 2.0**             |             **PW 2.1**             |             **PW 2.2**             |             **PW 2.3**             |             **PW 2.4**             |             **PW 2.5**             |            **PW 2.x**             |            **SC 3.0**             |
+| FR (French)                        |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Multilingual support               |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |     :heavy_check_mark:︎ 2.4.19     |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| EN (English)                       |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |     :heavy_check_mark:︎ 2.4.19     |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| **FIDE APPROVAL**                  |            **PW 1.19**             |             **PW 2.0**             |             **PW 2.1**             |             **PW 2.2**             |             **PW 2.3**             |             **PW 2.4**             |             **PW 2.5**             |            **PW 2.x**             |            **SC 3.0**             |
+| Approval support                   |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |          :grey_question:          |        :heavy_check_mark:︎        |
+| **USAGE**                          |            **PW 1.19**             |             **PW 2.0**             |             **PW 2.1**             |             **PW 2.2**             |             **PW 2.3**             |             **PW 2.4**             |             **PW 2.5**             |            **PW 2.x**             |            **SC 3.0**             |
+| HTMX usage                         |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Multi-screen support               |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Multi-column support               |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Alphabetical pairings              |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Rotating displays                  |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Illegal move recording             |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Check-in management                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Result editing                     |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| FFE - Tournament upload            |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| FFE - Data protection              |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| ChessEvent - Data download         |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Player management                  |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Pairing printing                   |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Ranking printing                   |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Cross-table printing               |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎         |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| FIDE performances                  |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Prize calculation                  |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Norm calculation for players       |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Name cards (chevalets)             |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |        :heavy_check_mark:︎        |        :heavy_check_mark:︎        |
+| Raffle management (tombola)        |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |          :grey_question:          |          :grey_question:          |
+| Arbiter norm certificates          |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |               :x:︎                |          :grey_question:          |
+| Team competitions                  |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |                :x:︎                |               :x:︎                |          :grey_question:          |
diff --git a/docs/83-dev-setup.md b/docs/technical-appendices/dev-setup.md
similarity index 93%
rename from docs/83-dev-setup.md
rename to docs/technical-appendices/dev-setup.md
index 61b87f7fef..709ca7053c 100644
--- a/docs/83-dev-setup.md
+++ b/docs/technical-appendices/dev-setup.md
@@ -1,7 +1,4 @@
-**[Retour au sommaire de la documentation](../README.md)**
-
-# Sharly Chess - Technical Appendix - Setting Up a Development Environment
-
+# _Sharly Chess_ - Setting Up a Development Environment
 
 You can use _PyCharm_ 2024.3.1.1 (_Community Edition_) on an up-to-date Windows 11 system.
 
diff --git a/docs/86-i18n-models.md b/docs/technical-appendices/i18n-models.md
similarity index 96%
rename from docs/86-i18n-models.md
rename to docs/technical-appendices/i18n-models.md
index ffe813e001..5769eed0a8 100644
--- a/docs/86-i18n-models.md
+++ b/docs/technical-appendices/i18n-models.md
@@ -1,10 +1,8 @@
-**[Return to documentation summary](../README.md)**
-
-# Sharly Chess - Internationalization - Models
+# _Sharly Chess_ - Internationalization - Models
 
 The translations for new locales use Huggingface models.
 
-This page shows how models are installed and used by `i18n_check.py` (below what was done to get a working translation to French).
+This page shows how models are installed and used by [`i18n_translate.py`](../../scripts/i18n/i18n_translate.py) (below what was done to get a working translation to French).
 
 The model used is MarianMT:
 - https://huggingface.co/docs/transformers/main/en/model_doc/marian#transformers.MarianMTModel
diff --git a/docs/86-i18n.md b/docs/technical-appendices/i18n.md
similarity index 70%
rename from docs/86-i18n.md
rename to docs/technical-appendices/i18n.md
index 489e27667a..2a6df26787 100644
--- a/docs/86-i18n.md
+++ b/docs/technical-appendices/i18n.md
@@ -1,120 +1,118 @@
-**[Return to documentation summary](../README.md)**
-
-# Sharly Chess - Internationalization
-
-## Locales implemented and translation status
-
-<!-- DO NOT EDIT! (START) -->
-| Locale | Messages | Empty | Empty mandatory | PO file | Translators |
-|--|:--:|:--:|:--:|:--:|:--:|
-|<img src="../src/web/static/images/locales/en.svg" style="height: 1em;"/>&nbsp;``en``&nbsp;English | 1566 | 1468 | 0 | [messages.po](../locale/en/LC_MESSAGES/messages.po) | [Timothy ARMES](https://github.com/timothyarmes) |
-|<img src="../src/web/static/images/locales/fr.svg" style="height: 1em;"/>&nbsp;``fr``&nbsp;Français | 1566 | 0 | 0 | [messages.po](../locale/fr/LC_MESSAGES/messages.po) | [Pascal AUBRY](https://github.com/pascalaubry)<br/>[Sammy PLAT](https://github.com/Amaras) |
-Last update: 2025-05-05 20:11
-<!-- DO NOT EDIT! (END) -->
-
-Flags:
-- ``fuzzy``: translations suggested by the babel library;
-- ``ai_translation``: translations generated by an IA.
-
-## Files
-
-| File                                                                   | Format           | Usage                                                                   |
-|------------------------------------------------------------------------|------------------|-------------------------------------------------------------------------|
-| [`/scripts/i18n/i18n_update.py`](../scripts/i18n/i18n_update.py)       | text / Python    | The main script to manage translations.                                 |
-| [`/scripts/i18n/babel.cfg`](../scripts/i18n/babel.cfg)                 | text / INI       | The configuration used by Babel to extraction the strings to translate. |
-| [`/locale/messages.pot`](../locale/messages.pot)                       | text / gettext   | The Portable Object Template, common to all the translations.           |
-| `/locale/<lang>/LC_MESSAGES/messages.po`                               | text / gettext   | The Portable Object of translation `<lang>`.                            |
-| `/locale/<lang>/LC_MESSAGES/messages.mo`                               | binary / gettext | The Machine Object of translation `<lang>`.                             |
-| [`/scripts/i18n/i18n_translate.py`](../scripts/i18n/i18n_translate.py) | text / Python    | The script to add new translations.                                     |
-
-## Translations (notes for the translators)
-
-Adding a new translation is as simple as translating a file that contains all the strings of the application.
-
-### String tokens
-
-Some of the strings (most of them) contain tokens ; the tokens contextually replaced by the application at run-time and must be kept as-is in the translated strings.
-
-Tokens can be:
-
-- `{token_name}` in Python files:<br/>``{app_name} is so cool!`` > ``{app_name} est trop cool !``<br/>``Note: {note}/20`` > ``Note : {note}/20``
-- `%(token_name)s` in template files:<br/>``%(app_name)s is so cool!`` > ``%(app_name)s est trop cool !``<br/>``Note: %(note)d/20`` > ``Note : %(note)d/20``
-
-### Singular/plural
-
-When two strings are needed for singular and plural, the strings to translate look like:
-
-```
-msgid "{locales_number} locale is currently available."
-msgid_plural "{locales_number} locales are currently available."
-msgstr[0] "{locales_number} langue est actuellement disponible."
-msgstr[1] "{locales_number} langues sont actuellement disponibles."
-```
-
-### Mandatory translations
-
-Some strings require special attention : they are mandatory. They contain the sub-string ``***`` and all the text from the three asterisks must be deleted from the translations:
-
-```
-msgid "Unpaired *** FEMALE"
-msgstr "Non appariée"
-```
-
-### Flags
-
-Some messages in the translation files are flagged:
-
-- ``fuzzy``: the translations are suggested by the babel library, from the other strings found in the file;
-- ``ai_translation``: translations generated by an IA.
-
-Example:
-
-```
-#, ai_translation, fuzzy
-msgid "Tournament [{tournament_uniq_id}] has started."
-msgstr "Toernooi [{tournament_uniq_id}] wordt gestart."
-```
-These messages require a validation from the translators.
-
-In both cases, the flags must be deleted when the proposed translations are validated or corrected.
-
-## Management (notes for the developers)
-
-The script [`scripts/i18n/i18n_update.py`](../scripts/i18n/i18n_update.py) does all the tasks needed to manage the translations.
-
-### Extracting strings from the sources
-
-Thanks to the configuration defined in [`scripts/babel.cfg`](../scripts/i18n/babel.cfg), strings to translate are extracted from the sources to the PO template:
-
-- `src/**.py`, `src/web/templates/*.html` > `locale/messages.pot`
-
-### Creating PO files for new languages
-
-Needed folders and files are created for new languages:
-
-- `scripts/i18n/i18n_update.py` > `locale/<locale>/LC_MESSAGES/messages.po`
-
-To add a new language, run `scripts/i18n/i18n_translate.py`.
-
-### Updating PO files
-
-Source modifications are reported to the PO files:
-
-- `locale/messages.pot` > `locale/<locale>/LC_MESSAGES/messages.po`
-
-### Compiling PO files to MO files
-
-The MO binary files (used at run-time) are compiled from the PO text files:
-
-- `locale/<locale>/LC_MESSAGES/messages.po` > `locale/<locale>/LC_MESSAGES/messages.mo`
-
-### Filling missing translations
-
-Initial translations can be provided by models, this can be a good help for translators (this can be done with `i18N_translate.py`).
-
-- [Using models to pre-build new translations](86-i18n-models.md)
-
-## References
-
-- [Babel documentation](https://babel.pocoo.org/en/stable/)
-- [Jinja2 / Babel integration](https://github.com/macagua/python_i18n_babel_jinja2)
+# Sharly Chess - Internationalization
+
+## Locales implemented and translation status
+
+<!-- DO NOT EDIT! (START) -->
+| Locale | Messages | Empty | Empty mandatory | PO file | Translators |
+|--|:--:|:--:|:--:|:--:|:--:|
+|<img src="../src/web/static/images/locales/en.svg" style="height: 1em;"/>&nbsp;``en``&nbsp;English | 1566 | 1468 | 0 | [messages.po](../locale/en/LC_MESSAGES/messages.po) | [Timothy ARMES](https://github.com/timothyarmes) |
+|<img src="../src/web/static/images/locales/fr.svg" style="height: 1em;"/>&nbsp;``fr``&nbsp;Français | 1566 | 0 | 0 | [messages.po](../locale/fr/LC_MESSAGES/messages.po) | [Pascal AUBRY](https://github.com/pascalaubry)<br/>[Sammy PLAT](https://github.com/Amaras) |
+Last update: 2025-05-05 20:11
+<!-- DO NOT EDIT! (END) -->
+
+Flags:
+- ``fuzzy``: translations suggested by the babel library;
+- ``ai_translation``: translations generated by an IA.
+
+## Files
+
+| File                                                                      | Format           | Usage                                                                   |
+|---------------------------------------------------------------------------|------------------|-------------------------------------------------------------------------|
+| [`/scripts/i18n/i18n_check.py`](../../scripts/i18n/i18n_check.py)         | text / Python    | The main script to manage translations.                                 |
+| [`/scripts/i18n/babel.cfg`](../../src/common/i18n/babel.cfg)              | text / INI       | The configuration used by Babel to extraction the strings to translate. |
+| `/locale/messages.pot`                                                    | text / gettext   | The Portable Object Template, common to all the translations.           |
+| `/locale/<lang>/LC_MESSAGES/messages.po`                                  | text / gettext   | The Portable Object of translation `<lang>`.                            |
+| `/locale/<lang>/LC_MESSAGES/messages.mo`                                  | binary / gettext | The Machine Object of translation `<lang>`.                             |
+| [`/scripts/i18n/i18n_translate.py`](../../scripts/i18n/i18n_translate.py) | text / Python    | The script to add new translations.                                     |
+
+## Translations (notes for the translators)
+
+Adding a new translation is as simple as translating a file that contains all the strings of the application.
+
+### String tokens
+
+Some of the strings (most of them) contain tokens ; the tokens contextually replaced by the application at run-time and must be kept as-is in the translated strings.
+
+Tokens can be:
+
+- `{token_name}` in Python files:<br/>``{app_name} is so cool!`` > ``{app_name} est trop cool !``<br/>``Note: {note}/20`` > ``Note : {note}/20``
+- `%(token_name)s` in template files:<br/>``%(app_name)s is so cool!`` > ``%(app_name)s est trop cool !``<br/>``Note: %(note)d/20`` > ``Note : %(note)d/20``
+
+### Singular/plural
+
+When two strings are needed for singular and plural, the strings to translate look like:
+
+```
+msgid "{locales_number} locale is currently available."
+msgid_plural "{locales_number} locales are currently available."
+msgstr[0] "{locales_number} langue est actuellement disponible."
+msgstr[1] "{locales_number} langues sont actuellement disponibles."
+```
+
+### Mandatory translations
+
+Some strings require special attention : they are mandatory. They contain the sub-string ``***`` and all the text from the three asterisks must be deleted from the translations:
+
+```
+msgid "Unpaired *** FEMALE"
+msgstr "Non appariée"
+```
+
+### Flags
+
+Some messages in the translation files are flagged:
+
+- ``fuzzy``: the translations are suggested by the babel library, from the other strings found in the file;
+- ``ai_translation``: translations generated by an IA.
+
+Example:
+
+```
+#, ai_translation, fuzzy
+msgid "Tournament [{tournament_uniq_id}] has started."
+msgstr "Toernooi [{tournament_uniq_id}] wordt gestart."
+```
+These messages require a validation from the translators.
+
+In both cases, the flags must be deleted when the proposed translations are validated or corrected.
+
+## Management (notes for the developers)
+
+The script [`scripts/i18n/i18n_check.py`](../../scripts/i18n/i18n_check.py) does all the tasks needed to manage the translations.
+
+### Extracting strings from the sources
+
+Thanks to the configuration defined in [`scripts/babel.cfg`](../../src/common/i18n/babel.cfg), strings to translate are extracted from the sources to the PO template:
+
+- `src/**.py`, `src/web/templates/*.html` > `locale/messages.pot`
+
+### Creating PO files for new languages
+
+Needed folders and files are created for new languages:
+
+- `scripts/i18n/i18n_check.py` > `locale/<locale>/LC_MESSAGES/messages.po`
+
+To add a new language, run `scripts/i18n/i18n_translate.py`.
+
+### Updating PO files
+
+Source modifications are reported to the PO files:
+
+- `locale/messages.pot` > `locale/<locale>/LC_MESSAGES/messages.po`
+
+### Compiling PO files to MO files
+
+The MO binary files (used at run-time) are compiled from the PO text files:
+
+- `locale/<locale>/LC_MESSAGES/messages.po` > `locale/<locale>/LC_MESSAGES/messages.mo`
+
+### Filling missing translations
+
+Initial translations can be provided by models, this can be a good help for translators (this can be done with `i18n_translate.py`).
+
+- [Using models to pre-build new translations](i18n-models.md)
+
+## References
+
+- [Babel documentation](https://babel.pocoo.org/en/stable/)
+- [Jinja2 / Babel integration](https://github.com/macagua/python_i18n_babel_jinja2)
diff --git a/locale/en/LC_MESSAGES/messages.po b/locale/en/LC_MESSAGES/messages.po
index b10dad348c..7857675bde 100644
--- a/locale/en/LC_MESSAGES/messages.po
+++ b/locale/en/LC_MESSAGES/messages.po
@@ -4837,3 +4837,4 @@ msgstr[1] ""
 
 msgid "{screen_type}-screen"
 msgstr ""
+
diff --git a/locale/fr/LC_MESSAGES/messages.po b/locale/fr/LC_MESSAGES/messages.po
index 52e7a7b620..fa301fd083 100644
--- a/locale/fr/LC_MESSAGES/messages.po
+++ b/locale/fr/LC_MESSAGES/messages.po
@@ -4837,3 +4837,4 @@ msgstr[1] "{recent_updates} tournois ont été mis à jour depuis moins de {ffe_
 
 msgid "{screen_type}-screen"
 msgstr "ecran-{screen_type}"
+
diff --git a/scripts/export/export.py b/scripts/export/export.py
index 9ce48780c0..1d92fe9e44 100644
--- a/scripts/export/export.py
+++ b/scripts/export/export.py
@@ -1,6 +1,5 @@
 import argparse
 import os
-import re
 import shutil
 from pathlib import Path
 import sys
@@ -34,8 +33,6 @@
 from common.logger import (
     get_logger,
     print_interactive_info,
-    input_interactive,
-    print_interactive_error,
     print_interactive_success,
     print_interactive_warning,
 )
@@ -244,57 +241,6 @@ def build_test():
         zip_file.extractall(TEST_DIR)
 
 
-def update_readme():
-    readme: Path = Path('README.md')
-    if not re.match(r'^\d+\.\d+\.\d+$', str(PAPI_WEB_VERSION)):
-        return
-    if (
-        input_interactive(
-            f'Do you want to update {readme} with version {PAPI_WEB_VERSION} (y/N)?'
-        ).upper()
-        or 'N'
-    ) != 'Y':
-        return
-    print_interactive_info(f'Updating {readme}...')
-    lines_before_comment: list[str] = []
-    lines_after_comment: list[str] = []
-    # Read the lines until the expected comment is found
-    with open(readme, 'rt', encoding='utf-8') as f:
-        comment: str = '<!-- DO NOT EDIT! (START) -->'
-        comment_found: bool = False
-        for line in f:
-            lines_before_comment.append(line)
-            if line.startswith(comment):
-                comment_found = True
-                break
-        if not comment_found:
-            print_interactive_error(
-                f'Could not edit [{readme}] (comment [{comment}] not found).'
-            )
-            return
-        comment: str = '<!-- DO NOT EDIT! (END) -->'
-        comment_found: bool = False
-        for line in f:
-            if line.startswith(comment):
-                comment_found = True
-            if comment_found:
-                lines_after_comment.append(line)
-        if not comment_found:
-            print_interactive_error(
-                f'Could not edit [{readme}] (comment [{comment}] not found).'
-            )
-            return
-    lines: list[str] = [
-        f'- **[Télécharger la dernière version stable ({PAPI_WEB_VERSION})]'
-        '(https://github.com/papi-web-org/papi-web/releases/download/'
-        f'{PAPI_WEB_VERSION}/papi-web-{PAPI_WEB_VERSION}.zip)**\n'
-    ]
-    with open(readme, 'w', encoding='utf-8') as f:
-        for line in lines_before_comment + lines + lines_after_comment:
-            f.write(line)
-    print_interactive_success(f'Successfully updated {readme}.')
-
-
 def main():
     # option --github is used when generating the EXE file from a GITHUB action
     # to verify that the name of the tag matches the Papi-web version.
@@ -321,7 +267,6 @@ def main():
     create_zip()
     build_test()
     clean(clean_zip=False)
-    update_readme()
 
 
 main()


Reviews:
user: login: Amaras
body: Please update `.github/CODEOWNERS` according to the change you made.
I think the main change will be the move from `docs/86-i18n.md` to `docs/technical-appendices/i18n.md`
state: DISMISSED
author_association: COLLABORATOR
submitted_at: 2025-05-01T18:34:14Z
user: login: pascalaubry
body: Fixed everything.
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-04T00:28:16Z
user: login: Amaras
state: DISMISSED
author_association: COLLABORATOR
submitted_at: 2025-05-04T00:43:51Z
user: login: pascalaubry
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-04T00:58:30Z
user: login: Amaras
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-04T01:17:13Z
user: login: timothyarmes
state: DISMISSED
author_association: COLLABORATOR
submitted_at: 2025-05-04T09:57:32Z
user: login: Amaras
state: DISMISSED
author_association: COLLABORATOR
submitted_at: 2025-05-05T13:55:38Z
user: login: pascalaubry
body: I only see now that I had pending comments on this PR :-(
Please do n ot answer now, I have to check all your comments.
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-05T16:14:03Z
user: login: timothyarmes
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-06T09:41:08Z
user: login: timothyarmes
state: DISMISSED
author_association: COLLABORATOR
submitted_at: 2025-05-06T09:55:50Z

Review comments:
path: LICENSE.md
user: login: Amaras
body: Why remove the license?
That's a bad idea in general
created_at: 2025-05-01T17:48:55Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,94 @@
+# _Sharly Chess_ - Authentication and roles
+
+This page is a proposal to add roles in the application, not implemented yet.
+
+## Roles in version 2.4
+
+In version 2.4, _Sharly Chess_ distinguishes two roles:
+- **the arbiter role**, which is obtained by connecting from the server `127.0.0.1`), which can access:
+  - the administration pages, or arbiter pages;
+  - the public pages, with some additional privileges.
+- **the standard role**, which allows:
+  - to view public screens;
+  - to score and enter results (with or without password protection).
+
+## Development Proposal
+
+### Roles
+
+- **Administrator** (of the application)
+- **Organizer** (of an event)
+- **Chief Arbiter** (of an event or tournament)
+- **Arbiter** (of an event or tournament)
path: docs/sandbox/authentication-and-roles.md
user: login: Amaras
body: We should adapt the FIDE hierarchical system:
1. One Chief Arbiter with admin-like rights over the event,
2. One or several Deputy Chief Arbiter(s) with lower rights over basically the whole event
3. Sector Arbiter(s) with rights over their part of their sector
4. Match Arbiter(s) who can set and (maybe) correct results for the event (your results officer)
5. Pairings Officer(s) with full pairings management rights over the part of the event they are assigned to (part of their duty is check-in, of course)

In Continental and World events, the CA, DCA and SA roles are mostly management positions (although they can intervene on games if Match Arbiters can't do it, of course), so they wouldn't play with the software once the rights are set up.
Match Arbiters are focused on the games, so can enter results, but that's about it (although they should be able to correct wrong results).
Pairings Officer are the ones doing the bulk of the work on the pairings software (especially in case of team tournaments)
created_at: 2025-05-01T18:14:15Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,94 @@
+# _Sharly Chess_ - Authentication and roles
+
+This page is a proposal to add roles in the application, not implemented yet.
+
+## Roles in version 2.4
+
+In version 2.4, _Sharly Chess_ distinguishes two roles:
+- **the arbiter role**, which is obtained by connecting from the server `127.0.0.1`), which can access:
+  - the administration pages, or arbiter pages;
+  - the public pages, with some additional privileges.
+- **the standard role**, which allows:
+  - to view public screens;
+  - to score and enter results (with or without password protection).
+
+## Development Proposal
+
+### Roles
+
+- **Administrator** (of the application)
+- **Organizer** (of an event)
+- **Chief Arbiter** (of an event or tournament)
+- **Arbiter** (of an event or tournament)
+- **Check-in officer** (of an event)
+- **Result officer** (of an event)
+- **Spectator** (of an event)
+
+### Actions autorisées par rôle
+
+|                                  |  Administrator  | Organizer | Chief arbiter  |    Arbiter     | Check-in officer | Result officer | Spectator |
+|----------------------------------|:---------------:|:---------:|:--------------:|:--------------:|:----------------:|:--------------:|:---------:|
+| **Scope**                        | **Application** | **Event** | **Tournament** | **Tournament** |    **Event**     |   **Event**    | **Event** |
+| **APPLICATION MANAGEMENT**       |                 |           |                |                |                  |                |           |
+| Update application settings      |      :ok:       |    :x:    |      :x:       |      :x:       |       :x:        |      :x:       |    :x:    |
+| Manage dministrators             |      :ok:       |    :x:    |      :x:       |      :x:       |       :x:        |      :x:       |    :x:    |
+| **EVENT MANAGEMENT**             |                 |           |                |                |                  |                |           |
+| Add an Event                     |      :ok:       |    :x:    |      :x:       |      :x:       |       :x:        |      :x:       |    :x:    |
+| Delete an event                  |      :ok:       |    :x:    |      :x:       |      :x:       |       :x:        |      :x:       |    :x:    |
+| Rename an event                  |      :ok:       |    :x:    |      :x:       |      :x:       |       :x:        |      :x:       |    :x:    |
+| Edit an event                    |      :ok:       |   :ok:    |      :x:       |      :x:       |       :x:        |      :x:       |    :x:    | :x: |
+| **TOURNAMENT MANAGEMENT**        |                 |           |                |                |                  |                |           |
+| Add tournaments                  |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Delete a tournament              |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Edit tournaments                 |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Open/close check-in              |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Use the pairing engine           |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Manually pair players            |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Publish pairings                 |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| View pairings before publication |       :x:       |    :x:    |      :ok:      |      :ok:      |       :x:        |      :x:       |    :x:    |
+| Calculate rankings               |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Publish rankings                 |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| View rankings before publication |       :x:       |    :x:    |      :ok:      |      :ok:      |       :x:        |      :x:       |    :x:    |
+| Publish rankings online          |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| **DISPLAY MANAGEMENT**           |                 |           |                |                |                  |                |           |
+| Manage screens/families/rotators |       :x:       |   :ok:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Manage timers                    |       :x:       |   :ok:    |      :ok:      |      :x:       |       :x:        |      :x:       |
+| **PLAYERS MANAGEMENT**           |                 |           |                |                |                  |                |           |
+| Add players                      |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Delete players                   |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Edit players                     |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Check-in players                 |       :x:       |    :x:    |      :ok:      |      :ok:      |       :ok:       |      :x:       |    :x:    |
+| **RESULTS MANAGEMENT**           |                 |           |                |                |                  |                |           |
+| Use special results              |       :x:       |    :x:    |      :ok:      |      :x:       |       :x:        |      :x:       |    :x:    |
+| Modify results                   |       :x:       |    :x:    |      :ok:      |      :ok:      |       :x:        |      :x:       |    :x:    |
+| Enter results                    |       :x:       |    :x:    |      :ok:      |      :ok:      |       :x:        |      :ok:      |    :x:    |
+| **VIEWING**                      |                 |           |                |                |                  |                |           |
+| View check-in                    |      :ok:       |   :ok:    |      :ok:      |      :ok:      |       :ok:       |      :ok:      |   :ok:    |
+| View pairings                    |      :ok:       |   :ok:    |      :ok:      |      :ok:      |       :ok:       |      :ok:      |
+| View results                     |      :ok:       |   :ok:    |      :ok:      |      :ok:      |       :ok:       |      :ok:      |   :ok:    |
+
+### Role Assignment
+
+Roles are assigned:
+- by client (the IP address of the machine accessing the _Sharly Chess_ server);
+- by authentication (a username and password);
+- by client and by authentication.
+
+### Example of role assignment
+
+In the example below:
+- Connections from the server automatically have all roles (not configurable);
+- Connections from the client ``192.168.1.115`` and authenticated with the username ``big-boss`` have the organization and chief referee roles for all tournaments;
+- Connections authenticated with the usernames ``boss-1`` and ``boss-2`` have the referee role, for tournaments A/B and C/D respectively;
path: docs/sandbox/authentication-and-roles.md
user: login: Amaras
body: ```suggestion
- Connections authenticated with the usernames ``boss-1`` and ``boss-2`` have the arbiter role, for tournaments A/B and C/D respectively;
```
created_at: 2025-05-01T18:14:51Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,120 @@
+# _Sharly Chess_ - Communicating with players
+
+This page is dedicated to communication with players, for quick implementation in _Sharly Chess_.
+
+## Target media
+
+The following two target media are considered:
+
+- Email;
+- SMS or MMS.
+
+In both cases, the information used for communication is that provided by players upon registration (for example the information entered on _ChessEvent_ is retrieved by _Sharly Chess_).
+
+## Mailing Recipients
+
+The system must be as flexible as possible and allow mailings to:
+
+- all players in an event
+- all players in a tournament
+- all players paired in the current round of a tournament
+- the Paired Allocated Bye player in the current round of a tournament
+- one or more players in a tournament chosen by the referee
+
+## Content and customization
+
+Arbiters must be able to rely on standard messages, for example, to:
+
+- warn of the imminent opening or closing of the check-in
+- warn of the publication of pairings
+- send the rankings
+
+All messages must be customizable using the following tokens.
+
+| Scope                         | *Token*                   | Replacement                                                           |
+|-------------------------------|---------------------------|-----------------------------------------------------------------------|
+| Event (**ev***ent*)           | `{{ev_name}}`             | The name of the event                                                 |
+| Tournament (**to***urnament*) | `{{to_name}}`             | The name of the tournament                                            |
+|                               | `{{to_ffe_url}}`          | The URL of the tournament listing on the federal website              |
+| Current Round (**ro***und*)   | `{{ro_number}}`           | The number of the current round                                       |
+|                               | `{{ro_datetime}}`         | The date and time of the current round                                |
+|                               | `{{ro_time}}`             | The time of the current round                                         |
+| Player (**pl***ayer*)         | `{{pl_last_name}}`        | The player's last name                                                |
+|                               | `{{pl_first_name}}`       | The player's last name                                                |
+|                               | `{{pl_gender}}`           | The player's last name                                                |
+|                               | `{{pl_name}}`             | The player's full name                                                |
+|                               | `{{pl_rating}}`           | The player's rating                                                   |
+|                               | `{{pl_rating_type}}`      | The player's rating type (Fide, National, Estimated)                  |
+|                               | `{{pl_points}}`           | The player's points                                                   |
+|                               | `{{pl_standings_points}}` | The player's actual points                                            |
+| Pairing (**pa***iring*)       | `{{pa_paired}}`           | True if the player is paired, False otherwise                         |
+|                               | `{{pa_paired_bye}}`       | True if the player is bye, False otherwise                            |
path: docs/sandbox/communication-to-players.md
user: login: Amaras
body: ```suggestion
|                               | `{{pa_paired_bye}}`       | True if the player is assigned the Pairing Allocated Bye, False otherwise                            |
```
created_at: 2025-05-01T18:16:04Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,120 @@
+# _Sharly Chess_ - Communicating with players
+
+This page is dedicated to communication with players, for quick implementation in _Sharly Chess_.
+
+## Target media
+
+The following two target media are considered:
+
+- Email;
+- SMS or MMS.
+
+In both cases, the information used for communication is that provided by players upon registration (for example the information entered on _ChessEvent_ is retrieved by _Sharly Chess_).
+
+## Mailing Recipients
+
+The system must be as flexible as possible and allow mailings to:
+
+- all players in an event
+- all players in a tournament
+- all players paired in the current round of a tournament
+- the Paired Allocated Bye player in the current round of a tournament
+- one or more players in a tournament chosen by the referee
+
+## Content and customization
+
+Arbiters must be able to rely on standard messages, for example, to:
+
+- warn of the imminent opening or closing of the check-in
+- warn of the publication of pairings
+- send the rankings
+
+All messages must be customizable using the following tokens.
+
+| Scope                         | *Token*                   | Replacement                                                           |
+|-------------------------------|---------------------------|-----------------------------------------------------------------------|
+| Event (**ev***ent*)           | `{{ev_name}}`             | The name of the event                                                 |
+| Tournament (**to***urnament*) | `{{to_name}}`             | The name of the tournament                                            |
+|                               | `{{to_ffe_url}}`          | The URL of the tournament listing on the federal website              |
+| Current Round (**ro***und*)   | `{{ro_number}}`           | The number of the current round                                       |
+|                               | `{{ro_datetime}}`         | The date and time of the current round                                |
+|                               | `{{ro_time}}`             | The time of the current round                                         |
+| Player (**pl***ayer*)         | `{{pl_last_name}}`        | The player's last name                                                |
+|                               | `{{pl_first_name}}`       | The player's last name                                                |
+|                               | `{{pl_gender}}`           | The player's last name                                                |
+|                               | `{{pl_name}}`             | The player's full name                                                |
+|                               | `{{pl_rating}}`           | The player's rating                                                   |
+|                               | `{{pl_rating_type}}`      | The player's rating type (Fide, National, Estimated)                  |
+|                               | `{{pl_points}}`           | The player's points                                                   |
+|                               | `{{pl_standings_points}}` | The player's actual points                                            |
+| Pairing (**pa***iring*)       | `{{pa_paired}}`           | True if the player is paired, False otherwise                         |
+|                               | `{{pa_paired_bye}}`       | True if the player is bye, False otherwise                            |
+|                               | `{{pa_unpaired}}`         | True if the player is unpaired, False otherwise                       |
+|                               | `{{pa_unpaired_hp_bye}}`  | True if the player is unpaired with a half-point bye, False otherwise |
+|                               | `{{pa_unpaired_fp_bye}}`  | True if the player is unpaired with a bye, False otherwise            |
+|                               | `{{pa_board}}`            | The board number of the pairing                                       |
+|                               | `{{pa_color}}`            | The color of the pairing                                              |
+| Opponent (**op***ponent*)     | `{{op_last_name}}`        | The opponent's last name                                              |
+|                               | `{{op_first_name}}`       | The opponent's last name                                              |
+|                               | `{{op_gender}}`           | The opponent's last name                                              |
+|                               | `{{op_name}}`             | The opponent's full name                                              |
+|                               | `{{op_rating}}`           | The opponent's rating                                                 |
+|                               | `{{op_rating_type}}`      | The opponent's rating type (Fide, National, Estimé)                   |
+|                               | `{{op_points}}`           | The opponent's number of points                                       |
+|                               | `{{op_standings_points}}` | The player's actual number of points                                  |
+
+The Jinja template engine is used for content customization, which allows, for example, the use of the alternatives `{% if %}`...`{% else %}`...`{% endif %}`:
+
+```
+Hello {{pl_first_name}},
+Tournament: {{to_name}}
+Pairing for round #{{ro_number}}:
+{% if pa_paired %}
+{% if pa_paired_bye }}
+Paired Allocated Bye
path: docs/sandbox/communication-to-players.md
user: login: Amaras
body: ```suggestion
Pairing Allocated Bye
```
created_at: 2025-05-01T18:16:42Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+{: .note }
path: docs/sandbox/pairing-actions.md
user: login: Amaras
body: Are you sure this has a meaning on GitHub itself?
created_at: 2025-05-01T18:18:20Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+{: .note }
+> :information_source:
+> - The concept of **last published round** does not yet exist and will be implemented when Access storage is discontinued.
+> In the current version, all rounds with pairings are considered published (draft status does not exist).
+> - The concepts in the table below are tournament-specific. The concept of a displayed or selected round is relative to the web interface; it is the active round in the Pairings tab.
+
+## Tournament modifications
+
+To be completed (some tournament modifications should not be allowed after a tournament has started).
+
+## Player Modifications (Elo, FIDE title, or name)
+
+{: .tip }
+> :point_right: Changes to player information other than Elo, FIDE title, or name have no impact on pairings and ratings.
+
+{: .note }
+> :information_source:
+> - _Papi_ recalculates pairing numbers every round (contrary to FIDE regulations).
+> - Within a certain period of time after the publication of the results of round N (or before publication of the results), the change takes effect for the ratings of round N and the pairings of round N+1.
+> After the publication of round N+1, the ratings are changed starting with round N+2.
+
+| Time                                                           |  FIDE Authorized   |  Registration  | Recalculation<br/>numbers<br/>pairings |      Modification<br/>ratings       |
+|----------------------------------------------------------------|:------------------:|:--------------:|:--------------------------------------:|:-----------------------------------:|
+| Before publication of round 1 pairings                         | :white_check_mark: | :white_circle: |                round 1                 |                                     |
+| Before publication of round 1 results                          | :white_check_mark: |   :pushpin:    |                round 2                 |               round 1               |
+| After publication of round 2 pairings                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 3               |
+| Before publication of round 2 results                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 2               |
+| After publication of round 3 pairings                          | :white_check_mark: |   :pushpin:    |                round 4                 |               round 4               |
+| Before the end of the publication deadline for round 3 results | :white_check_mark: |   :pushpin:    |                round 4                 |                                     |
+| From the publication of round 4 pairings                       | :white_check_mark: |   :pushpin:    |                   no                   | round N+1 or N+2<br/>as appropriate |
+
+{: .tip }
+> :point_right: Compliance with FIDE regulations:
+> - :white_check_mark: Action authorized by FIDE
+>
+> :point_right: Recording of non-standard actions:
+> - :white_circle: No recording
+> - :pushpin: Recording in the database
+
+{: .warning }
+> :warning: Sammy doit confirmer auprès de la DNA que le classement peut être modifié à n'importe quel moment car cela peut influer sur les départages.
+
+## Editing Pairings and Results
+
+An incorrect result or color in round N can be reported (FIDE regulations):
+- Within a certain time after the publication of the results of round N
+- The ratings of round N and the pairings of round N+1 use this correction
+- After the publication of the pairings of round N+1, but before the end of round N+1
+- The pairings of round N+2 use this correction (probably also the ratings of round N+1)
+- After the end of round N+1
+- The result is only used for the FIDE export, not for the final ratings or subsequent pairings.
+
+### Action Descriptions
+
+| Action / Round                |                     Past                      |                     Previous                      |                   Current                    |           First<br/>un<br/>paired            |                    Future                     |
+|-------------------------------|:---------------------------------------------:|:-------------------------------------------------:|:--------------------------------------------:|:--------------------------------------------:|:---------------------------------------------:|
+| Total Matching                | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   | :white_circle: :white_circle: :white_circle: |      :white_check_mark: :ok: :pushpin:       | :no_entry_sign: :white_circle: :white_circle: |
path: docs/sandbox/pairing-actions.md
user: login: Amaras
body: Did you translate using an AI?
```suggestion
| Total Pairing                | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   | :white_circle: :white_circle: :white_circle: |      :white_check_mark: :ok: :pushpin:       | :no_entry_sign: :white_circle: :white_circle: |
```
created_at: 2025-05-01T18:26:09Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+{: .note }
+> :information_source:
+> - The concept of **last published round** does not yet exist and will be implemented when Access storage is discontinued.
+> In the current version, all rounds with pairings are considered published (draft status does not exist).
+> - The concepts in the table below are tournament-specific. The concept of a displayed or selected round is relative to the web interface; it is the active round in the Pairings tab.
+
+## Tournament modifications
+
+To be completed (some tournament modifications should not be allowed after a tournament has started).
+
+## Player Modifications (Elo, FIDE title, or name)
+
+{: .tip }
+> :point_right: Changes to player information other than Elo, FIDE title, or name have no impact on pairings and ratings.
+
+{: .note }
+> :information_source:
+> - _Papi_ recalculates pairing numbers every round (contrary to FIDE regulations).
+> - Within a certain period of time after the publication of the results of round N (or before publication of the results), the change takes effect for the ratings of round N and the pairings of round N+1.
+> After the publication of round N+1, the ratings are changed starting with round N+2.
+
+| Time                                                           |  FIDE Authorized   |  Registration  | Recalculation<br/>numbers<br/>pairings |      Modification<br/>ratings       |
+|----------------------------------------------------------------|:------------------:|:--------------:|:--------------------------------------:|:-----------------------------------:|
+| Before publication of round 1 pairings                         | :white_check_mark: | :white_circle: |                round 1                 |                                     |
+| Before publication of round 1 results                          | :white_check_mark: |   :pushpin:    |                round 2                 |               round 1               |
+| After publication of round 2 pairings                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 3               |
+| Before publication of round 2 results                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 2               |
+| After publication of round 3 pairings                          | :white_check_mark: |   :pushpin:    |                round 4                 |               round 4               |
+| Before the end of the publication deadline for round 3 results | :white_check_mark: |   :pushpin:    |                round 4                 |                                     |
+| From the publication of round 4 pairings                       | :white_check_mark: |   :pushpin:    |                   no                   | round N+1 or N+2<br/>as appropriate |
+
+{: .tip }
+> :point_right: Compliance with FIDE regulations:
+> - :white_check_mark: Action authorized by FIDE
+>
+> :point_right: Recording of non-standard actions:
+> - :white_circle: No recording
+> - :pushpin: Recording in the database
+
+{: .warning }
+> :warning: Sammy doit confirmer auprès de la DNA que le classement peut être modifié à n'importe quel moment car cela peut influer sur les départages.
+
+## Editing Pairings and Results
+
+An incorrect result or color in round N can be reported (FIDE regulations):
+- Within a certain time after the publication of the results of round N
+- The ratings of round N and the pairings of round N+1 use this correction
+- After the publication of the pairings of round N+1, but before the end of round N+1
+- The pairings of round N+2 use this correction (probably also the ratings of round N+1)
+- After the end of round N+1
+- The result is only used for the FIDE export, not for the final ratings or subsequent pairings.
+
+### Action Descriptions
+
+| Action / Round                |                     Past                      |                     Previous                      |                   Current                    |           First<br/>un<br/>paired            |                    Future                     |
+|-------------------------------|:---------------------------------------------:|:-------------------------------------------------:|:--------------------------------------------:|:--------------------------------------------:|:---------------------------------------------:|
+| Total Matching                | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   | :white_circle: :white_circle: :white_circle: |      :white_check_mark: :ok: :pushpin:       | :no_entry_sign: :white_circle: :white_circle: |
+| Complementary pairing         | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Manual pairing                |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: |     :no_entry_sign: :warning: :pushpin:      | :no_entry_sign: :white_circle: :white_circle: |
+| Complete unpairing            | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   |  :no_entry_sign: :grey_question: :pushpin:   | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Manual unpairing              |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Swap                          |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
path: docs/sandbox/pairing-actions.md
user: login: Amaras
body: ```suggestion
| Player swap                          |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
```
created_at: 2025-05-01T18:26:44Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+{: .note }
+> :information_source:
+> - The concept of **last published round** does not yet exist and will be implemented when Access storage is discontinued.
+> In the current version, all rounds with pairings are considered published (draft status does not exist).
+> - The concepts in the table below are tournament-specific. The concept of a displayed or selected round is relative to the web interface; it is the active round in the Pairings tab.
+
+## Tournament modifications
+
+To be completed (some tournament modifications should not be allowed after a tournament has started).
+
+## Player Modifications (Elo, FIDE title, or name)
+
+{: .tip }
+> :point_right: Changes to player information other than Elo, FIDE title, or name have no impact on pairings and ratings.
+
+{: .note }
+> :information_source:
+> - _Papi_ recalculates pairing numbers every round (contrary to FIDE regulations).
+> - Within a certain period of time after the publication of the results of round N (or before publication of the results), the change takes effect for the ratings of round N and the pairings of round N+1.
+> After the publication of round N+1, the ratings are changed starting with round N+2.
+
+| Time                                                           |  FIDE Authorized   |  Registration  | Recalculation<br/>numbers<br/>pairings |      Modification<br/>ratings       |
+|----------------------------------------------------------------|:------------------:|:--------------:|:--------------------------------------:|:-----------------------------------:|
+| Before publication of round 1 pairings                         | :white_check_mark: | :white_circle: |                round 1                 |                                     |
+| Before publication of round 1 results                          | :white_check_mark: |   :pushpin:    |                round 2                 |               round 1               |
+| After publication of round 2 pairings                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 3               |
+| Before publication of round 2 results                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 2               |
+| After publication of round 3 pairings                          | :white_check_mark: |   :pushpin:    |                round 4                 |               round 4               |
+| Before the end of the publication deadline for round 3 results | :white_check_mark: |   :pushpin:    |                round 4                 |                                     |
+| From the publication of round 4 pairings                       | :white_check_mark: |   :pushpin:    |                   no                   | round N+1 or N+2<br/>as appropriate |
+
+{: .tip }
+> :point_right: Compliance with FIDE regulations:
+> - :white_check_mark: Action authorized by FIDE
+>
+> :point_right: Recording of non-standard actions:
+> - :white_circle: No recording
+> - :pushpin: Recording in the database
+
+{: .warning }
+> :warning: Sammy doit confirmer auprès de la DNA que le classement peut être modifié à n'importe quel moment car cela peut influer sur les départages.
+
+## Editing Pairings and Results
+
+An incorrect result or color in round N can be reported (FIDE regulations):
+- Within a certain time after the publication of the results of round N
+- The ratings of round N and the pairings of round N+1 use this correction
+- After the publication of the pairings of round N+1, but before the end of round N+1
+- The pairings of round N+2 use this correction (probably also the ratings of round N+1)
+- After the end of round N+1
+- The result is only used for the FIDE export, not for the final ratings or subsequent pairings.
+
+### Action Descriptions
+
+| Action / Round                |                     Past                      |                     Previous                      |                   Current                    |           First<br/>un<br/>paired            |                    Future                     |
+|-------------------------------|:---------------------------------------------:|:-------------------------------------------------:|:--------------------------------------------:|:--------------------------------------------:|:---------------------------------------------:|
+| Total Matching                | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   | :white_circle: :white_circle: :white_circle: |      :white_check_mark: :ok: :pushpin:       | :no_entry_sign: :white_circle: :white_circle: |
+| Complementary pairing         | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Manual pairing                |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: |     :no_entry_sign: :warning: :pushpin:      | :no_entry_sign: :white_circle: :white_circle: |
+| Complete unpairing            | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   |  :no_entry_sign: :grey_question: :pushpin:   | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Manual unpairing              |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Swap                          |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    | :white_check_mark: :grey_question: :pushpin: | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Editing a result              |      :no_entry_sign: :warning: :pushpin:      |   :white_check_mark: :grey_question: :pushpin:    |    :white_check_mark: :ok: :white_circle:    | :white_circle: :white_circle: :white_circle: | :white_circle: :white_circle: :white_circle:  |
+| Modification of byes/packages |      :no_entry_sign: :warning: :pushpin:      | :ballot_box_with_check: :grey_question: :pushpin: | :ballot_box_with_check: :ok: :white_circle:  | :ballot_box_with_check: :ok: :white_circle:  |  :ballot_box_with_check: :ok: :white_circle:  |
path: docs/sandbox/pairing-actions.md
user: login: Amaras
body: `packages`?
created_at: 2025-05-01T18:27:06Z
author_association: COLLABORATOR
diff_hunk: @@ -1,25 +1,30 @@
-# Sharly Chess, an arbiting tool
+# _Sharly Chess_
 
-Sharly Chess - © Projet Sharly Chess 2013-2025 - https://github.com/Sharly-Chess/sharly-chess/ ([copyright](COPYRIGHT.md))
+_Sharly Chess - © Sharly Chess project 2013-2025_
 
-<!-- DO NOT EDIT! (START) -->
-- **[Download the latest stable version (2.5.8)](https://github.com/Sharly-Chess/sharly-chess/releases/download/2.5.8/papi-web-2.5.8.zip)**
path: README.md
user: login: Amaras
body: Please add the release link back, but use this link: https://github.com/Sharly-Chess/sharly-chess/releases/latest
It will always point to the latest release
created_at: 2025-05-01T18:32:48Z
author_association: COLLABORATOR
path: LICENSE.md
user: login: pascalaubry
body: Fixed (added a link to sharly-chess.com not to duplicate the files).
created_at: 2025-05-03T23:49:19Z
author_association: COLLABORATOR
diff_hunk: @@ -1,25 +1,30 @@
-# Sharly Chess, an arbiting tool
+# _Sharly Chess_
 
-Sharly Chess - © Projet Sharly Chess 2013-2025 - https://github.com/Sharly-Chess/sharly-chess/ ([copyright](COPYRIGHT.md))
+_Sharly Chess - © Sharly Chess project 2013-2025_
 
-<!-- DO NOT EDIT! (START) -->
-- **[Download the latest stable version (2.5.8)](https://github.com/Sharly-Chess/sharly-chess/releases/download/2.5.8/papi-web-2.5.8.zip)**
path: README.md
user: login: pascalaubry
body: The download link is now in the user documentation on https://sharly-chess.com.
created_at: 2025-05-04T00:11:54Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,94 @@
+# _Sharly Chess_ - Authentication and roles
+
+This page is a proposal to add roles in the application, not implemented yet.
+
+## Roles in version 2.4
+
+In version 2.4, _Sharly Chess_ distinguishes two roles:
+- **the arbiter role**, which is obtained by connecting from the server `127.0.0.1`), which can access:
+  - the administration pages, or arbiter pages;
+  - the public pages, with some additional privileges.
+- **the standard role**, which allows:
+  - to view public screens;
+  - to score and enter results (with or without password protection).
+
+## Development Proposal
+
+### Roles
+
+- **Administrator** (of the application)
+- **Organizer** (of an event)
+- **Chief Arbiter** (of an event or tournament)
+- **Arbiter** (of an event or tournament)
path: docs/sandbox/authentication-and-roles.md
user: login: pascalaubry
body: Added your comment to the doc.
created_at: 2025-05-04T00:17:28Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+{: .note }
path: docs/sandbox/pairing-actions.md
user: login: pascalaubry
body: It has, since all the developers started speaking the same language only once these definitions have been written.
Note: this doc should moved to the user documentation when ready.
created_at: 2025-05-04T00:22:20Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+{: .note }
+> :information_source:
+> - The concept of **last published round** does not yet exist and will be implemented when Access storage is discontinued.
+> In the current version, all rounds with pairings are considered published (draft status does not exist).
+> - The concepts in the table below are tournament-specific. The concept of a displayed or selected round is relative to the web interface; it is the active round in the Pairings tab.
+
+## Tournament modifications
+
+To be completed (some tournament modifications should not be allowed after a tournament has started).
+
+## Player Modifications (Elo, FIDE title, or name)
+
+{: .tip }
+> :point_right: Changes to player information other than Elo, FIDE title, or name have no impact on pairings and ratings.
+
+{: .note }
+> :information_source:
+> - _Papi_ recalculates pairing numbers every round (contrary to FIDE regulations).
+> - Within a certain period of time after the publication of the results of round N (or before publication of the results), the change takes effect for the ratings of round N and the pairings of round N+1.
+> After the publication of round N+1, the ratings are changed starting with round N+2.
+
+| Time                                                           |  FIDE Authorized   |  Registration  | Recalculation<br/>numbers<br/>pairings |      Modification<br/>ratings       |
+|----------------------------------------------------------------|:------------------:|:--------------:|:--------------------------------------:|:-----------------------------------:|
+| Before publication of round 1 pairings                         | :white_check_mark: | :white_circle: |                round 1                 |                                     |
+| Before publication of round 1 results                          | :white_check_mark: |   :pushpin:    |                round 2                 |               round 1               |
+| After publication of round 2 pairings                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 3               |
+| Before publication of round 2 results                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 2               |
+| After publication of round 3 pairings                          | :white_check_mark: |   :pushpin:    |                round 4                 |               round 4               |
+| Before the end of the publication deadline for round 3 results | :white_check_mark: |   :pushpin:    |                round 4                 |                                     |
+| From the publication of round 4 pairings                       | :white_check_mark: |   :pushpin:    |                   no                   | round N+1 or N+2<br/>as appropriate |
+
+{: .tip }
+> :point_right: Compliance with FIDE regulations:
+> - :white_check_mark: Action authorized by FIDE
+>
+> :point_right: Recording of non-standard actions:
+> - :white_circle: No recording
+> - :pushpin: Recording in the database
+
+{: .warning }
+> :warning: Sammy doit confirmer auprès de la DNA que le classement peut être modifié à n'importe quel moment car cela peut influer sur les départages.
+
+## Editing Pairings and Results
+
+An incorrect result or color in round N can be reported (FIDE regulations):
+- Within a certain time after the publication of the results of round N
+- The ratings of round N and the pairings of round N+1 use this correction
+- After the publication of the pairings of round N+1, but before the end of round N+1
+- The pairings of round N+2 use this correction (probably also the ratings of round N+1)
+- After the end of round N+1
+- The result is only used for the FIDE export, not for the final ratings or subsequent pairings.
+
+### Action Descriptions
+
+| Action / Round                |                     Past                      |                     Previous                      |                   Current                    |           First<br/>un<br/>paired            |                    Future                     |
+|-------------------------------|:---------------------------------------------:|:-------------------------------------------------:|:--------------------------------------------:|:--------------------------------------------:|:---------------------------------------------:|
+| Total Matching                | :no_entry_sign: :white_circle: :white_circle: |   :no_entry_sign: :white_circle: :white_circle:   | :white_circle: :white_circle: :white_circle: |      :white_check_mark: :ok: :pushpin:       | :no_entry_sign: :white_circle: :white_circle: |
path: docs/sandbox/pairing-actions.md
user: login: pascalaubry
body: As long as Google uses IA to translate, yes I did...
created_at: 2025-05-04T00:24:45Z
author_association: COLLABORATOR
diff_hunk: @@ -1,25 +1,30 @@
-# Sharly Chess, an arbiting tool
+# _Sharly Chess_
 
-Sharly Chess - © Projet Sharly Chess 2013-2025 - https://github.com/Sharly-Chess/sharly-chess/ ([copyright](COPYRIGHT.md))
+_Sharly Chess - © Sharly Chess project 2013-2025_
 
-<!-- DO NOT EDIT! (START) -->
-- **[Download the latest stable version (2.5.8)](https://github.com/Sharly-Chess/sharly-chess/releases/download/2.5.8/papi-web-2.5.8.zip)**
path: README.md
user: login: Amaras
body: There should still be a download link in an installation section
created_at: 2025-05-04T00:31:43Z
author_association: COLLABORATOR
path: LICENSE.md
user: login: Amaras
body: Put the licence back in full.
If there is a single place where the licence should be, it's next to the code.
You cannot rely on an external website for that.
created_at: 2025-05-04T00:37:32Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,120 @@
+# _Sharly Chess_ - Communicating with players
+
+This page is dedicated to communication with players, for quick implementation in _Sharly Chess_.
+
+## Target media
+
+The following two target media are considered:
+
+- Email;
+- SMS or MMS.
+
+In both cases, the information used for communication is that provided by players upon registration (for example the information entered on _ChessEvent_ is retrieved by _Sharly Chess_).
+
+## Mailing Recipients
+
+The system must be as flexible as possible and allow mailings to:
+
+- all players in an event
+- all players in a tournament
+- all players paired in the current round of a tournament
+- the Paired Allocated Bye player in the current round of a tournament
+- one or more players in a tournament chosen by the referee
+
+## Content and customization
+
+Arbiters must be able to rely on standard messages, for example, to:
+
+- warn of the imminent opening or closing of the check-in
+- warn of the publication of pairings
+- send the rankings
+
+All messages must be customizable using the following tokens.
+
+| Scope                         | *Token*                   | Replacement                                                           |
+|-------------------------------|---------------------------|-----------------------------------------------------------------------|
+| Event (**ev***ent*)           | `{{ev_name}}`             | The name of the event                                                 |
+| Tournament (**to***urnament*) | `{{to_name}}`             | The name of the tournament                                            |
+|                               | `{{to_ffe_url}}`          | The URL of the tournament listing on the federal website              |
+| Current Round (**ro***und*)   | `{{ro_number}}`           | The number of the current round                                       |
+|                               | `{{ro_datetime}}`         | The date and time of the current round                                |
+|                               | `{{ro_time}}`             | The time of the current round                                         |
+| Player (**pl***ayer*)         | `{{pl_last_name}}`        | The player's last name                                                |
+|                               | `{{pl_first_name}}`       | The player's last name                                                |
+|                               | `{{pl_gender}}`           | The player's last name                                                |
+|                               | `{{pl_name}}`             | The player's full name                                                |
+|                               | `{{pl_rating}}`           | The player's rating                                                   |
+|                               | `{{pl_rating_type}}`      | The player's rating type (Fide, National, Estimated)                  |
+|                               | `{{pl_points}}`           | The player's points                                                   |
+|                               | `{{pl_standings_points}}` | The player's actual points                                            |
+| Pairing (**pa***iring*)       | `{{pa_paired}}`           | True if the player is paired, False otherwise                         |
+|                               | `{{pa_paired_bye}}`       | True if the player is bye, False otherwise                            |
path: docs/sandbox/communication-to-players.md
user: login: Amaras
body: I think there was a merge mistake, the wrong one is still there
created_at: 2025-05-04T00:38:57Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+{: .note }
path: docs/sandbox/pairing-actions.md
user: login: Amaras
body: I was talking about the `{: .note }` part.
It feels like Jekyll-specific Markdown, not GitHub's flavour.
created_at: 2025-05-04T00:41:21Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+{: .note }
+> :information_source:
+> - The concept of **last published round** does not yet exist and will be implemented when Access storage is discontinued.
+> In the current version, all rounds with pairings are considered published (draft status does not exist).
+> - The concepts in the table below are tournament-specific. The concept of a displayed or selected round is relative to the web interface; it is the active round in the Pairings tab.
+
+## Tournament modifications
+
+To be completed (some tournament modifications should not be allowed after a tournament has started).
+
+## Player Modifications (Elo, FIDE title, or name)
+
+{: .tip }
+> :point_right: Changes to player information other than Elo, FIDE title, or name have no impact on pairings and ratings.
+
+{: .note }
+> :information_source:
+> - _Papi_ recalculates pairing numbers every round (contrary to FIDE regulations).
+> - Within a certain period of time after the publication of the results of round N (or before publication of the results), the change takes effect for the ratings of round N and the pairings of round N+1.
+> After the publication of round N+1, the ratings are changed starting with round N+2.
+
+| Time                                                           |  FIDE Authorized   |  Registration  | Recalculation<br/>numbers<br/>pairings |      Modification<br/>ratings       |
+|----------------------------------------------------------------|:------------------:|:--------------:|:--------------------------------------:|:-----------------------------------:|
+| Before publication of round 1 pairings                         | :white_check_mark: | :white_circle: |                round 1                 |                                     |
+| Before publication of round 1 results                          | :white_check_mark: |   :pushpin:    |                round 2                 |               round 1               |
+| After publication of round 2 pairings                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 3               |
+| Before publication of round 2 results                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 2               |
+| After publication of round 3 pairings                          | :white_check_mark: |   :pushpin:    |                round 4                 |               round 4               |
+| Before the end of the publication deadline for round 3 results | :white_check_mark: |   :pushpin:    |                round 4                 |                                     |
+| From the publication of round 4 pairings                       | :white_check_mark: |   :pushpin:    |                   no                   | round N+1 or N+2<br/>as appropriate |
+
+{: .tip }
+> :point_right: Compliance with FIDE regulations:
+> - :white_check_mark: Action authorized by FIDE
+>
+> :point_right: Recording of non-standard actions:
+> - :white_circle: No recording
+> - :pushpin: Recording in the database
+
+{: .warning }
+> :warning: Sammy doit confirmer auprès de la DNA que le classement peut être modifié à n'importe quel moment car cela peut influer sur les départages.
path: docs/sandbox/pairing-actions.md
user: login: Amaras
body: I confirm that, also it's in French
created_at: 2025-05-04T00:41:41Z
author_association: COLLABORATOR
path: LICENSE.md
user: login: Amaras
body: There might also be a need to package the Licence file within the release archive, I'm not completely sure about our obligations on that
created_at: 2025-05-04T00:43:47Z
author_association: COLLABORATOR
diff_hunk: @@ -1,25 +1,30 @@
-# Sharly Chess, an arbiting tool
+# _Sharly Chess_
 
-Sharly Chess - © Projet Sharly Chess 2013-2025 - https://github.com/Sharly-Chess/sharly-chess/ ([copyright](COPYRIGHT.md))
+_Sharly Chess - © Sharly Chess project 2013-2025_
 
-<!-- DO NOT EDIT! (START) -->
-- **[Download the latest stable version (2.5.8)](https://github.com/Sharly-Chess/sharly-chess/releases/download/2.5.8/papi-web-2.5.8.zip)**
path: README.md
user: login: pascalaubry
body: It is on https://github.com/Sharly-Chess/sharly-chess.github.io/blob/enhance-user-doc/docs/getting-started/installation.fr.md (branch enhance-user-doc).
created_at: 2025-05-04T00:58:30Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+{: .note }
path: docs/sandbox/pairing-actions.md
user: login: pascalaubry
body: OK, I understand now... Changed all the .note, .tip, .warning.
created_at: 2025-05-04T01:05:31Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+{: .note }
+> :information_source:
+> - The concept of **last published round** does not yet exist and will be implemented when Access storage is discontinued.
+> In the current version, all rounds with pairings are considered published (draft status does not exist).
+> - The concepts in the table below are tournament-specific. The concept of a displayed or selected round is relative to the web interface; it is the active round in the Pairings tab.
+
+## Tournament modifications
+
+To be completed (some tournament modifications should not be allowed after a tournament has started).
+
+## Player Modifications (Elo, FIDE title, or name)
+
+{: .tip }
+> :point_right: Changes to player information other than Elo, FIDE title, or name have no impact on pairings and ratings.
+
+{: .note }
+> :information_source:
+> - _Papi_ recalculates pairing numbers every round (contrary to FIDE regulations).
+> - Within a certain period of time after the publication of the results of round N (or before publication of the results), the change takes effect for the ratings of round N and the pairings of round N+1.
+> After the publication of round N+1, the ratings are changed starting with round N+2.
+
+| Time                                                           |  FIDE Authorized   |  Registration  | Recalculation<br/>numbers<br/>pairings |      Modification<br/>ratings       |
+|----------------------------------------------------------------|:------------------:|:--------------:|:--------------------------------------:|:-----------------------------------:|
+| Before publication of round 1 pairings                         | :white_check_mark: | :white_circle: |                round 1                 |                                     |
+| Before publication of round 1 results                          | :white_check_mark: |   :pushpin:    |                round 2                 |               round 1               |
+| After publication of round 2 pairings                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 3               |
+| Before publication of round 2 results                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 2               |
+| After publication of round 3 pairings                          | :white_check_mark: |   :pushpin:    |                round 4                 |               round 4               |
+| Before the end of the publication deadline for round 3 results | :white_check_mark: |   :pushpin:    |                round 4                 |                                     |
+| From the publication of round 4 pairings                       | :white_check_mark: |   :pushpin:    |                   no                   | round N+1 or N+2<br/>as appropriate |
+
+{: .tip }
+> :point_right: Compliance with FIDE regulations:
+> - :white_check_mark: Action authorized by FIDE
+>
+> :point_right: Recording of non-standard actions:
+> - :white_circle: No recording
+> - :pushpin: Recording in the database
+
+{: .warning }
+> :warning: Sammy doit confirmer auprès de la DNA que le classement peut être modifié à n'importe quel moment car cela peut influer sur les départages.
path: docs/sandbox/pairing-actions.md
user: login: pascalaubry
body: Do you confirm that they can be changed at any time or that they should not be changed?
created_at: 2025-05-04T01:07:29Z
author_association: COLLABORATOR
diff_hunk: @@ -1,25 +1,30 @@
-# Sharly Chess, an arbiting tool
+# _Sharly Chess_
 
-Sharly Chess - © Projet Sharly Chess 2013-2025 - https://github.com/Sharly-Chess/sharly-chess/ ([copyright](COPYRIGHT.md))
+_Sharly Chess - © Sharly Chess project 2013-2025_
 
-<!-- DO NOT EDIT! (START) -->
-- **[Download the latest stable version (2.5.8)](https://github.com/Sharly-Chess/sharly-chess/releases/download/2.5.8/papi-web-2.5.8.zip)**
path: README.md
user: login: Amaras
body: I understand you want a clean README, I also want a clean README.
One thing to remember, however, is that a README is how a user gets interested in a project.
Would you really like that, say, Litestar's README did not say how to install it?

The problem I see is that this would frustrate outside developers who want to try out the software, not see how to get it to work immediately, and just give up on us.
I highly recommend writing a short installation section on the README, and putting the link into it.
created_at: 2025-05-04T01:17:13Z
author_association: COLLABORATOR
path: LICENSE.md
user: login: pascalaubry
body: > Put the licence back in full. If there is a single place where the licence should be, it's next to the code. You cannot rely on an external website for that.

Restored it.
created_at: 2025-05-04T01:17:18Z
author_association: COLLABORATOR
path: LICENSE.md
user: login: pascalaubry
body: > There might also be a need to package the Licence file within the release archive, I'm not completely sure about our obligations on that

We can, but I feel that it is not needed. Do you want me to update export.py?
created_at: 2025-05-04T01:17:38Z
author_association: COLLABORATOR
diff_hunk: @@ -1,25 +1,30 @@
-# Sharly Chess, an arbiting tool
+# _Sharly Chess_
 
-Sharly Chess - © Projet Sharly Chess 2013-2025 - https://github.com/Sharly-Chess/sharly-chess/ ([copyright](COPYRIGHT.md))
+_Sharly Chess - © Sharly Chess project 2013-2025_
 
-<!-- DO NOT EDIT! (START) -->
-- **[Download the latest stable version (2.5.8)](https://github.com/Sharly-Chess/sharly-chess/releases/download/2.5.8/papi-web-2.5.8.zip)**
path: README.md
user: login: pascalaubry
body: > One thing to remember, however, is that a README is how a user gets interested in a project. 

I don't agree: seeing GH as the entry point for users is a developer point of view. Developers are interested by README.md, not the users. Now we have a website, README.md is not the entry point anymore.

> Would you really like that, say, Litestar's README did not say how to install it?

No problem with that since the installation is described on https://docs.litestar.dev/

> The problem I see is that this would frustrate outside developers who want to try out the software, not see how to get it to work immediately, and just give up on us. I highly recommend writing a short installation section on the README, and putting the link into it.

We spent some time with @timothyarmes to split the docs in a clean way, I really don't want to duplicate things again.
created_at: 2025-05-04T01:33:43Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+> [!NOTE]
+> :information_source:
+> - The concept of **last published round** does not yet exist and will be implemented when Access storage is discontinued.
+> In the current version, all rounds with pairings are considered published (draft status does not exist).
+> - The concepts in the table below are tournament-specific. The concept of a displayed or selected round is relative to the web interface; it is the active round in the Pairings tab.
+
+## Tournament modifications
+
+To be completed (some tournament modifications should not be allowed after a tournament has started).
+
+## Player Modifications (Elo, FIDE title, or name)
+
+> [!TIP]
+> :point_right: Changes to player information other than Elo, FIDE title, or name have no impact on pairings and ratings.
+
+> [!NOTE]
+> :information_source:
+> - _Papi_ recalculates pairing numbers every round (contrary to FIDE regulations).
+> - Within a certain period of time after the publication of the results of round N (or before publication of the results), the change takes effect for the ratings of round N and the pairings of round N+1.
path: docs/sandbox/pairing-actions.md
user: login: Amaras
body: ```suggestion
> - Within a certain period of time after the publication of the results of round N (or before publication of the results), the change takes effect for the standings of round N and the pairings of round N+1.
```
created_at: 2025-05-05T13:46:00Z
author_association: COLLABORATOR
diff_hunk: @@ -1,25 +1,30 @@
-# Sharly Chess, an arbiting tool
+# _Sharly Chess_
 
-Sharly Chess - © Projet Sharly Chess 2013-2025 - https://github.com/Sharly-Chess/sharly-chess/ ([copyright](COPYRIGHT.md))
+_Sharly Chess - © Sharly Chess project 2013-2025_
 
-<!-- DO NOT EDIT! (START) -->
-- **[Download the latest stable version (2.5.8)](https://github.com/Sharly-Chess/sharly-chess/releases/download/2.5.8/papi-web-2.5.8.zip)**
path: README.md
user: login: Amaras
body: Please add a summarized installation section in the README.
Something like "go to `<link to release>`, download the .zip, decompress, and voilà"
created_at: 2025-05-05T13:47:21Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+> [!NOTE]
+> :information_source:
+> - The concept of **last published round** does not yet exist and will be implemented when Access storage is discontinued.
+> In the current version, all rounds with pairings are considered published (draft status does not exist).
+> - The concepts in the table below are tournament-specific. The concept of a displayed or selected round is relative to the web interface; it is the active round in the Pairings tab.
+
+## Tournament modifications
+
+To be completed (some tournament modifications should not be allowed after a tournament has started).
+
+## Player Modifications (Elo, FIDE title, or name)
+
+> [!TIP]
+> :point_right: Changes to player information other than Elo, FIDE title, or name have no impact on pairings and ratings.
+
+> [!NOTE]
+> :information_source:
+> - _Papi_ recalculates pairing numbers every round (contrary to FIDE regulations).
+> - Within a certain period of time after the publication of the results of round N (or before publication of the results), the change takes effect for the ratings of round N and the pairings of round N+1.
+> After the publication of round N+1, the ratings are changed starting with round N+2.
+
+| Time                                                           |  FIDE Authorized   |  Registration  | Recalculation<br/>numbers<br/>pairings |      Modification<br/>ratings       |
path: docs/sandbox/pairing-actions.md
user: login: Amaras
body: "Recalculation numbers pairings" sounds weird.
I'd like @timothyarmes's opinion on that
created_at: 2025-05-05T13:49:12Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+{: .note }
+> :information_source:
+> - The concept of **last published round** does not yet exist and will be implemented when Access storage is discontinued.
+> In the current version, all rounds with pairings are considered published (draft status does not exist).
+> - The concepts in the table below are tournament-specific. The concept of a displayed or selected round is relative to the web interface; it is the active round in the Pairings tab.
+
+## Tournament modifications
+
+To be completed (some tournament modifications should not be allowed after a tournament has started).
+
+## Player Modifications (Elo, FIDE title, or name)
+
+{: .tip }
+> :point_right: Changes to player information other than Elo, FIDE title, or name have no impact on pairings and ratings.
+
+{: .note }
+> :information_source:
+> - _Papi_ recalculates pairing numbers every round (contrary to FIDE regulations).
+> - Within a certain period of time after the publication of the results of round N (or before publication of the results), the change takes effect for the ratings of round N and the pairings of round N+1.
+> After the publication of round N+1, the ratings are changed starting with round N+2.
+
+| Time                                                           |  FIDE Authorized   |  Registration  | Recalculation<br/>numbers<br/>pairings |      Modification<br/>ratings       |
+|----------------------------------------------------------------|:------------------:|:--------------:|:--------------------------------------:|:-----------------------------------:|
+| Before publication of round 1 pairings                         | :white_check_mark: | :white_circle: |                round 1                 |                                     |
+| Before publication of round 1 results                          | :white_check_mark: |   :pushpin:    |                round 2                 |               round 1               |
+| After publication of round 2 pairings                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 3               |
+| Before publication of round 2 results                          | :white_check_mark: |   :pushpin:    |                round 3                 |               round 2               |
+| After publication of round 3 pairings                          | :white_check_mark: |   :pushpin:    |                round 4                 |               round 4               |
+| Before the end of the publication deadline for round 3 results | :white_check_mark: |   :pushpin:    |                round 4                 |                                     |
+| From the publication of round 4 pairings                       | :white_check_mark: |   :pushpin:    |                   no                   | round N+1 or N+2<br/>as appropriate |
+
+{: .tip }
+> :point_right: Compliance with FIDE regulations:
+> - :white_check_mark: Action authorized by FIDE
+>
+> :point_right: Recording of non-standard actions:
+> - :white_circle: No recording
+> - :pushpin: Recording in the database
+
+{: .warning }
+> :warning: Sammy doit confirmer auprès de la DNA que le classement peut être modifié à n'importe quel moment car cela peut influer sur les départages.
path: docs/sandbox/pairing-actions.md
user: login: Amaras
body: You can remove that warning
created_at: 2025-05-05T13:49:54Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,95 @@
+# _Sharly Chess_ - Pairing actions
+
+This page provides an overview of the actions in the tournaments, players, and pairings tabs.
+
+## Round status definition
+
+| Round                | Definition                                                                                | FR                                 |
+|----------------------|-------------------------------------------------------------------------------------------|------------------------------------|
+| Current round        | The last round with pairings                                                              | Ronde courante (ou ronde en cours) |
+| Previous round       | The round immediately preceding the current round (N-1)                                   | Ronde précédente                   |
+| Past rounds          | The rounds preceding the previous round (N-2, N-3, ...)                                   | Rondes passées                     |
+| Next round           | The round immediately following the current round (N+1)                                   | Ronde suivante                     |
+| Future rounds        | The rounds following the next round (N+2, N+3, ...)                                       | Rondes futures                     |
+| Last published round | The last round for which the chief arbiter changed the status from "draft" to "published" | Dernière ronde publiée             |
+
+> [!NOTE]
+> :information_source:
+> - The concept of **last published round** does not yet exist and will be implemented when Access storage is discontinued.
+> In the current version, all rounds with pairings are considered published (draft status does not exist).
+> - The concepts in the table below are tournament-specific. The concept of a displayed or selected round is relative to the web interface; it is the active round in the Pairings tab.
+
+## Tournament modifications
+
+To be completed (some tournament modifications should not be allowed after a tournament has started).
+
+## Player Modifications (Elo, FIDE title, or name)
+
+> [!TIP]
+> :point_right: Changes to player information other than Elo, FIDE title, or name have no impact on pairings and ratings.
+
+> [!NOTE]
+> :information_source:
+> - _Papi_ recalculates pairing numbers every round (contrary to FIDE regulations).
+> - Within a certain period of time after the publication of the results of round N (or before publication of the results), the change takes effect for the ratings of round N and the pairings of round N+1.
+> After the publication of round N+1, the ratings are changed starting with round N+2.
+
+| Time                                                           |  FIDE Authorized   |  Registration  | Recalculation<br/>numbers<br/>pairings |      Modification<br/>ratings       |
path: docs/sandbox/pairing-actions.md
user: login: timothyarmes
body: Yes, that's wrong. I suggest "Round to recalculate pairings"


created_at: 2025-05-06T09:41:08Z
author_association: COLLABORATOR

PR comments:
user: login: timothyarmes
created_at: 2025-05-05T08:48:50Z
body: A do agree that just a link to the latest version (the /latest url) could be in the README.  We don't need to keep it up to date since it points the latest release page (unlike the link in the user doc which points to the .zip).

I thought the discussion was on having the installation instructions  duplicated,  which I don't think is needed.

author_association: COLLABORATOR
user: login: pascalaubry
created_at: 2025-05-05T16:26:57Z
body: Two questions left on this PR:
@Amaras Do you want me to update export.py to include a license file to the zip?
@timothyarmes Your opinion on 'Recalculation numbers pairings'?
author_association: COLLABORATOR
user: login: Amaras
created_at: 2025-05-05T16:35:21Z
body: > Do you want me to update export.py to include a license file to the zip?

Just in case, yes please


author_association: COLLABORATOR
user: login: pascalaubry
created_at: 2025-05-06T11:13:19Z
body: Merging now, adding the license to the ZIP will be done in another PR.
author_association: COLLABORATOR