diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md index c88835b..ede4c84 100644 --- a/.github/ISSUE_TEMPLATE/bug.md +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -1,25 +1,25 @@ --- name: Bug -about: Quelque chose ne fonctionne pas comme prévu +about: Something doesn't work as expected labels: bug --- - + -## Ce qui se passe +## What happens -## Ce qui devrait se passer +## What should happen -## Pour reproduire +## To reproduce 1. 2. -## Contexte +## Context -- Où : parenthese.io, ou instance auto-hébergée (commit ou date de mise à jour) -- Navigateur et appareil : +- Where: parenthese.io, or a self-hosted instance (commit or update date) +- Browser and device: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 0ce48f4..4daeb0c 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - - name: Signaler une faille de sécurité + - name: Report a security vulnerability url: https://github.com/IliesAllali/parenthese/security/policy - about: Jamais dans une issue publique. Signalement privé, voir SECURITY.md. + about: Never in a public issue. Private report, see SECURITY.md. diff --git a/.github/ISSUE_TEMPLATE/idee.md b/.github/ISSUE_TEMPLATE/idee.md index 6db29a8..52703c0 100644 --- a/.github/ISSUE_TEMPLATE/idee.md +++ b/.github/ISSUE_TEMPLATE/idee.md @@ -1,15 +1,17 @@ --- -name: Idée -about: Proposer une amélioration ou une nouvelle fonctionnalité +name: Idea +about: Suggest an improvement or a new feature labels: enhancement --- -## Le besoin + - +## The need + + -## Une piste +## A possible approach - + diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index f655420..f151dd1 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,14 +1,14 @@ -## Ce que change cette PR +## What this PR changes -## Pourquoi +## Why - + -## Vérifications +## Checks -- [ ] Tests, lint et builds passent en local (voir CONTRIBUTING.md) -- [ ] Les textes visibles sont en français -- [ ] Une migration Prisma accompagne tout changement de schéma -- [ ] Capture d'écran jointe si l'interface change +- [ ] Tests, lint and builds pass locally (see CONTRIBUTING.md) +- [ ] New visible text goes through `t()` with its English entry +- [ ] A Prisma migration comes with any schema change +- [ ] Screenshot attached if the interface changes diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..79343fc --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,37 @@ +# Changelog + +Notable changes to Parenthèse. Dates are in YYYY-MM-DD format. + +## 1.0.0 (2026-09-29) + +First public release. The code has been public since 2026-09-14; this version marks the app as ready to self-host. + +### The family tree + +- One tree per family, laid out automatically, explored like a map (drag, zoom, search by name). +- A profile for each person: dates and places, occupation, notes, family links. +- Memories on each person: photos, videos (file or YouTube link), audio recordings, quotes, documents, GPS tracks. +- Free annotations on the tree: drawings, stickers, text, photos. +- GEDCOM import and export. + +### Sharing with the family + +- One link and one sharing password per tree. Relatives look around without an account and suggest additions. +- A welcome screen and a guided flow for relatives who arrive through the link, with a step-by-step guide on parenthese.io. +- Reviewed contributions: the owner applies the family's changes right away or reviews each one. +- A visit log for the owner. + +### Interface + +- English and French. The app follows the browser's language, with a switch in the app; `?lang=en` or `?lang=fr` forces one. +- Demo tree with a fictional family and real, freely licensed photos (see `frontend/public/demo/CREDITS.md`). + +### Self-hosting and data + +- `docker compose up` runs the database, the API and the web front end; the CI builds and tests this setup on every push. +- Users can delete a tree or their account from the app; media files are erased with them. +- No analytics on a self-hosted instance unless a PostHog key is provided at build time. + +### License + +- [PolyForm Noncommercial 1.0.0](LICENSE): free to read, modify and self-host for non-commercial use. diff --git a/CONTRIBUTING.fr.md b/CONTRIBUTING.fr.md new file mode 100644 index 0000000..fccfc6e --- /dev/null +++ b/CONTRIBUTING.fr.md @@ -0,0 +1,40 @@ +# Contribuer à Parenthèse + +[English version](CONTRIBUTING.md) + +Parenthèse est maintenu par une seule personne. Les retours sont les bienvenus, et quelques repères font gagner du temps à tout le monde. + +## Avant d'écrire du code + +- Un bug ou une idée : ouvrez une issue avec le modèle correspondant. +- Une faille de sécurité : pas d'issue publique, suivez [SECURITY.fr.md](SECURITY.fr.md). +- Pour tout changement plus large qu'une correction, parlez-en d'abord dans une issue. Une pull request non discutée peut être refusée, même soignée. +- Préférez de petites pull requests ciblées : un sujet par PR, un diff qui se relit en quelques minutes. + +## Lancer le projet en local + +Tout est dans la section « Développer » du [README](README.fr.md). + +## Tests + +Avant d'ouvrir une pull request, faites passer ce que vérifie la CI : + +```bash +npm --prefix frontend ci && npm --prefix frontend run lint && npm --prefix frontend test && npm --prefix frontend run build +npm --prefix landing ci && npm --prefix landing test && npm --prefix landing run build +npm --prefix backend ci && npm --prefix backend run prisma:generate && npm --prefix backend run build && npm --prefix backend test +``` + +La CI vérifie aussi que les migrations Prisma s'appliquent sur une base vide et reproduisent exactement `backend/prisma/schema.prisma`. Toute modification du schéma s'accompagne donc d'une migration (`npm --prefix backend run prisma:migrate`). + +Si vous touchez à Docker ou à nginx, lancez `docker compose up -d --build` puis `bash tools/docker-smoke.sh http://localhost`. + +## Conventions + +- L'interface est en français et en anglais. Tout texte visible passe par `t()` de `frontend/src/i18n/index.js` : le texte français sert de clé, sa traduction anglaise va dans `frontend/src/i18n/en/`. Un test échoue si une traduction manque. +- Pas de nouvelle dépendance lourde (framework, bibliothèque d'interface, service externe) sans en avoir discuté dans une issue. +- La promesse du README tient : pas de publicité, et aucune mesure d'audience activée par défaut sur une instance auto-hébergée. + +## Licence + +Parenthèse est publié sous [PolyForm Noncommercial 1.0.0](LICENSE). En proposant une contribution, vous acceptez qu'elle soit publiée sous cette même licence. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 350e5e1..3f5d3b2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,21 +1,23 @@ -# Contribuer à Parenthèse +# Contributing to Parenthèse -Parenthèse est maintenu par une seule personne. Les retours sont les bienvenus, et quelques repères font gagner du temps à tout le monde. +[Version française](CONTRIBUTING.fr.md) -## Avant d'écrire du code +Parenthèse is maintained by one person. Feedback is welcome, and a few pointers save everyone time. You can write in English or in French. -- Un bug ou une idée : ouvrez une issue avec le modèle correspondant. -- Une faille de sécurité : pas d'issue publique, suivez [SECURITY.md](SECURITY.md). -- Pour tout changement plus large qu'une correction, parlez-en d'abord dans une issue. Une pull request non discutée peut être refusée, même soignée. -- Préférez de petites pull requests ciblées : un sujet par PR, un diff qui se relit en quelques minutes. +## Before writing code -## Lancer le projet en local +- A bug or an idea: open an issue with the matching template. +- A security issue: no public issue, follow [SECURITY.md](SECURITY.md). +- For any change bigger than a fix, talk about it in an issue first. A pull request that wasn't discussed may be declined, even a careful one. +- Prefer small, focused pull requests: one topic per PR, a diff that can be reviewed in a few minutes. -Tout est dans la section « Développer » du [README](README.fr.md). +## Running the project locally + +Everything is in the "Development" section of the [README](README.md). ## Tests -Avant d'ouvrir une pull request, faites passer ce que vérifie la CI : +Before opening a pull request, run what the CI checks: ```bash npm --prefix frontend ci && npm --prefix frontend run lint && npm --prefix frontend test && npm --prefix frontend run build @@ -23,16 +25,16 @@ npm --prefix landing ci && npm --prefix landing test && npm --prefix landing run npm --prefix backend ci && npm --prefix backend run prisma:generate && npm --prefix backend run build && npm --prefix backend test ``` -La CI vérifie aussi que les migrations Prisma s'appliquent sur une base vide et reproduisent exactement `backend/prisma/schema.prisma`. Toute modification du schéma s'accompagne donc d'une migration (`npm --prefix backend run prisma:migrate`). +The CI also checks that the Prisma migrations apply to an empty database and reproduce `backend/prisma/schema.prisma` exactly. Any schema change therefore comes with a migration (`npm --prefix backend run prisma:migrate`). -Si vous touchez à Docker ou à nginx, lancez `docker compose up -d --build` puis `bash tools/docker-smoke.sh http://localhost`. +If you touch Docker or nginx, run `docker compose up -d --build` then `bash tools/docker-smoke.sh http://localhost`. ## Conventions -- L'interface est en français : libellés, messages, textes d'aide. -- Pas de nouvelle dépendance lourde (framework, bibliothèque d'interface, service externe) sans en avoir discuté dans une issue. -- La promesse du README tient : pas de publicité, et aucune mesure d'audience activée par défaut sur une instance auto-hébergée. +- The interface is in French and English. Every visible text goes through `t()` from `frontend/src/i18n/index.js`, with the French text as the key and its English entry in `frontend/src/i18n/en/`. A test fails if an English entry is missing. +- No new heavy dependency (framework, UI library, external service) without discussing it in an issue. +- The README promise holds: no ads, and no analytics turned on by default on a self-hosted instance. -## Licence +## License -Parenthèse est publié sous [PolyForm Noncommercial 1.0.0](LICENSE). En proposant une contribution, vous acceptez qu'elle soit publiée sous cette même licence. +Parenthèse is published under [PolyForm Noncommercial 1.0.0](LICENSE). By submitting a contribution, you agree that it is published under the same license. diff --git a/README.fr.md b/README.fr.md index 9212f85..2e434be 100644 --- a/README.fr.md +++ b/README.fr.md @@ -143,7 +143,7 @@ npm --prefix backend test ## Contribuer -Issues et petites pull requests ciblées sont les bienvenues : la marche à suivre, les tests à faire passer et les conventions sont dans [CONTRIBUTING.md](CONTRIBUTING.md). Pour une faille de sécurité, pas d'issue publique : voir [SECURITY.md](SECURITY.md). +Issues et petites pull requests ciblées sont les bienvenues : la marche à suivre, les tests à faire passer et les conventions sont dans [CONTRIBUTING.fr.md](CONTRIBUTING.fr.md). Pour une faille de sécurité, pas d'issue publique : voir [SECURITY.fr.md](SECURITY.fr.md). ## Licence diff --git a/README.md b/README.md index d51a376..0c3deed 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,7 @@ npm --prefix backend test ## Contributing -Issues and small, focused pull requests are welcome. The steps, the tests to pass and the conventions are in [CONTRIBUTING.md](CONTRIBUTING.md) (in French). For a security issue, no public issue please, see [SECURITY.md](SECURITY.md). +Issues and small, focused pull requests are welcome. The steps, the tests to pass and the conventions are in [CONTRIBUTING.md](CONTRIBUTING.md). For a security issue, no public issue please, see [SECURITY.md](SECURITY.md). ## License diff --git a/SECURITY.fr.md b/SECURITY.fr.md new file mode 100644 index 0000000..a84559e --- /dev/null +++ b/SECURITY.fr.md @@ -0,0 +1,29 @@ +# Sécurité + +[English version](SECURITY.md) + +## Signaler une faille + +Ne décrivez jamais une faille dans une issue, une discussion ou une pull request : tout y est public. + +Deux canaux privés : + +- l'onglet **Security** de ce dépôt GitHub, bouton « Report a vulnerability » ; +- un email à pro.allali.ilies@gmail.com. + +Indiquez si possible ce qui est touché (adresse, route de l'API, fichier), les étapes pour reproduire et l'impact que vous constatez. Un rapport court et précis suffit. + +## Périmètre + +- L'instance publique [parenthese.io](https://parenthese.io) : le site, l'application et son API. +- Le code de ce dépôt, y compris la configuration d'auto-hébergement (`docker-compose.yml`, images Docker, configuration nginx). + +Une instance auto-hébergée par quelqu'un d'autre relève de son administrateur. Si la faille vient du code, elle est dans le périmètre. + +Sur parenthese.io, testez uniquement avec votre propre compte et vos propres arbres. N'accédez pas aux données d'autres familles, et pas de déni de service ni de tests automatisés massifs. + +## Délai de réponse + +Parenthèse est maintenu par une seule personne. Vous recevrez un accusé de réception dès que possible, en général sous une semaine. Les failles graves passent avant tout le reste. Une fois le correctif publié, la faille peut être décrite publiquement, en laissant aux auto-hébergeurs le temps de mettre à jour. + +Seule la dernière version de la branche `main` reçoit des correctifs. diff --git a/SECURITY.md b/SECURITY.md index 2f196da..f0194a2 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,27 +1,29 @@ -# Sécurité +# Security -## Signaler une faille +[Version française](SECURITY.fr.md) -Ne décrivez jamais une faille dans une issue, une discussion ou une pull request : tout y est public. +## Reporting a vulnerability -Deux canaux privés : +Never describe a vulnerability in an issue, a discussion or a pull request: everything there is public. -- l'onglet **Security** de ce dépôt GitHub, bouton « Report a vulnerability » ; -- un email à pro.allali.ilies@gmail.com. +Two private channels: -Indiquez si possible ce qui est touché (adresse, route de l'API, fichier), les étapes pour reproduire et l'impact que vous constatez. Un rapport court et précis suffit. +- the **Security** tab of this GitHub repository, "Report a vulnerability" button; +- an email to pro.allali.ilies@gmail.com. -## Périmètre +If you can, say what is affected (address, API route, file), the steps to reproduce and the impact you observe. A short, precise report is enough. English or French, as you prefer. -- L'instance publique [parenthese.io](https://parenthese.io) : le site, l'application et son API. -- Le code de ce dépôt, y compris la configuration d'auto-hébergement (`docker-compose.yml`, images Docker, configuration nginx). +## Scope -Une instance auto-hébergée par quelqu'un d'autre relève de son administrateur. Si la faille vient du code, elle est dans le périmètre. +- The public instance [parenthese.io](https://parenthese.io): the website, the app and its API. +- The code in this repository, including the self-hosting setup (`docker-compose.yml`, Docker images, nginx configuration). -Sur parenthese.io, testez uniquement avec votre propre compte et vos propres galaxies. N'accédez pas aux données d'autres familles, et pas de déni de service ni de tests automatisés massifs. +A self-hosted instance run by someone else is the responsibility of its administrator. If the vulnerability comes from the code, it is in scope. -## Délai de réponse +On parenthese.io, test only with your own account and your own trees. Do not access other families' data, and no denial of service or large automated tests. -Parenthèse est maintenu par une seule personne. Vous recevrez un accusé de réception dès que possible, en général sous une semaine. Les failles graves passent avant tout le reste. Une fois le correctif publié, la faille peut être décrite publiquement, en laissant aux auto-hébergeurs le temps de mettre à jour. +## Response time -Seule la dernière version de la branche `main` reçoit des correctifs. +Parenthèse is maintained by one person. You will get an acknowledgment as soon as possible, usually within a week. Serious vulnerabilities come before everything else. Once the fix is published, the vulnerability can be described publicly, leaving self-hosters time to update. + +Only the latest version of the `main` branch receives fixes.