Commit Graph
2308 Commits
Author SHA1 Message Date
Ovgodd 8a7416cb3e 💄(frontend) redesign 401 error standalone page
Reuse the 404 standalone layout and keep the existing sign-in flow.
2026-10-02 11:42:23 +02:00
Ovgodd 2a4131a188 🐛(frontend) keep caption and alignment when replacing an image
The antivirus loader rebuilt the image block with an empty caption and
left alignment, so both were lost after a replace.

Signed-off-by: Ovgodd <c.gromoff@gmail.com>
2026-10-02 11:02:29 +02:00
Anthony LC a2e7f4118c ⬆️(Dockerfile) bump Playwright base image to v1.63.0
The Playwright base image in the Dockerfile has been
updated from v1.62.1 to v1.63.0, in order to follow the
version of the `playwright` package in package.json.
2026-10-01 11:25:19 +02:00
Anthony LC 978a8205ea 🔒️(js) fix security warning
High:
- @xmldom/xmldom (13 advisories, CVE-2026-83612…)
- fast-uri GHSA-f65p-4m7j-42xc and 5 more
- js-yaml CVE-2026-84375
- browserslist CVE-2026-73089, CVE-2026-73088
- svgo CVE-2026-84370
- ws CVE-2026-48779

Moderate:
- vitest CVE-2026-84373
- qs CVE-2026-82562, CVE-2026-82417
- fflate CVE-2026-45820
- baseline-browser-mapping CVE-2026-45819
- colord GHSA-2wm5-q62r-hmrv

Low:
- @ai-sdk/provider-utils CVE-2026-8769
- postcss-selector-parser CVE-2026-9358
2026-10-01 11:25:18 +02:00
Anthony LC 3be8a858f2 ⬇️(frontend) downgrade blocknote dependencies to 0.54.0
The export feature is not working correctly with
the newer version, so we are downgrading to 0.54.0.
We need to refactorize the code to be compatible
with typst in order to work correctly.
2026-10-01 11:06:33 +02:00
Anthony LC 30dc14f78d ✅(dependency) add vite dependency
Recent upgrade of Vitest dependency needed
Vite dependency in order to work with the latest
Vitest features.
2026-10-01 11:06:33 +02:00
Anthony LC 77ea3b2c8e 🚨(dependency) update ui-kit tokens
We bumped the UI-kit dependency, we need to update
the UI-kit tokens accordingly.
2026-10-01 11:06:33 +02:00
renovate[bot]andAnthony LC 7e219dd8e4 ⬆️(dependencies) update js dependencies 2026-10-01 10:05:46 +02:00
renovate[bot]andGitHub bd71ed87e1 ⬆️(dependencies) update dompurify to v3.4.16 [SECURITY] 2026-09-30 19:59:40 +00:00
renovate[bot]andGitHub 976cd6c09b ⬆️(dependencies) update PyJWT to v2.15.0 [SECURITY] 2026-09-30 21:27:45 +02:00
renovate[bot]andGitHub b59abd5420 ⬆️(dependencies) update PyJWT to v2.14.0 [SECURITY] 2026-09-30 16:47:15 +00:00
Manuel RaynaudandGitHub af4c363c2a ⬆️(backend) upgrade django-lasuite to version 0.0.30
Upgrade django-lasuite to version 0.0.30 and add the new settings
OIDC_OP_LOGOUT_USE_POST in our settings.
2026-09-30 12:57:40 +00:00
MarrrrrrrrryandGitHub ad2908a693 🐛(backend) compensate document duplication failures
Duplicating a document tree made two calls to the collaboration server
per node, all inside the database transaction: it held locks for the
duration of every call, and a failure midway left the documents already
created on the collaboration server behind, as orphans nothing can
reach anymore.
    
The duplication now runs in two phases. The structure is first
replicated in a transaction that makes no call to the collaboration
server, then each duplicate is seeded with the content of its source.
A failure while seeding deletes what was seeded - the deletion of the
collaboration server is idempotent and never refused - and removes the
replicated documents, so neither side keeps an orphan.
    
Signed-off-by: Marrrrrrrrry <34876935+Marrrrrrrrry@users.noreply.github.com>
2026-09-30 10:09:53 +00:00
MarrrrrrrrryandGitHub 1794650e6d 🐛(yhub) bound the calls the server makes to the backend
`backendFetch` had no timeout: a backend that hangs hangs every
websocket
upgrade and fallback poll with it, piling up under load. The three
auth-path
calls it serves (`users/me`, `documents/{id}`, `accesses/me`) waited
forever,
so a slow backend took the whole collaboration service down with it.

Signed-off-by: Marrrrrrrrry <34876935+Marrrrrrrrry@users.noreply.github.com>
2026-09-30 08:24:32 +00:00
BOUKERFA Mohamed El AmineandManuel Raynaud 1fe52db894 🐛(backend) skip notification on self mention
Users mentioning themselves got an email about something they just
did, which is noise. Keep recording the mention, skip the email.

Signed-off-by: BOUKERFA Mohamed El Amine <boukerfa.ma@gmail.com>
2026-09-29 17:40:43 +02:00
BOUKERFA Mohamed El AmineandManuel Raynaud 4217f7c077 🐛(backend) release mention guard when notification fails
The cache key claimed before sending outlived a failed notification,
so the next mention in the same context was silently dropped until the
key expired although nobody had been notified. Delete it unless the
email went out and `notified_at` was saved.

Signed-off-by: BOUKERFA Mohamed El Amine <boukerfa.ma@gmail.com>
2026-09-29 17:40:43 +02:00
BOUKERFA Mohamed El AmineandManuel Raynaud 2af6606078 🔒️(backend) require explicit access to mention
Gate the ability to mention to users with explicit
access so only collaborators can mention collaborators.

Signed-off-by: BOUKERFA Mohamed El Amine <boukerfa.ma@gmail.com>
2026-09-29 17:40:42 +02:00
BOUKERFA Mohamed El AmineandManuel Raynaud 1a0edf194a 🛂(backend) exclude readers from mentions and access list
A reader cannot see comments, so a mention would lead them nowhere.
Reject readers as mention targets. while users allowed to comment
see each other so they can pick who to mention.

Signed-off-by: BOUKERFA Mohamed El Amine <boukerfa.ma@gmail.com>
2026-09-29 17:40:41 +02:00
BOUKERFA Mohamed El AmineandManuel Raynaud 0673072bc7 ✏️(backend) rework mention notification email copy
Signed-off-by: BOUKERFA Mohamed El Amine <boukerfa.ma@gmail.com>
2026-09-29 17:40:41 +02:00
BOUKERFA Mohamed El AmineandManuel Raynaud 530a883aad 🔒️(backend) validate mention anchor_id as a UUID
Anchors are block or comment ids, which are UUIDs, so we only
accept that.

Signed-off-by: BOUKERFA Mohamed El Amine <boukerfa.ma@gmail.com>
2026-09-29 17:40:40 +02:00
BOUKERFA Mohamed El AmineandManuel Raynaud 108c24eefb ♻️(backend) annotate mentioned user roles in mention validation
Signed-off-by: BOUKERFA Mohamed El Amine <boukerfa.ma@gmail.com>
2026-09-29 17:40:39 +02:00
BOUKERFA Mohamed El AmineandManuel Raynaud b9d41e6a6d 🐛(backend) guard mention notifications against concurrent duplicates
Use cache.add as a distributed lock keyed by document/user/thread to
ensure only the first concurrent mention sends the notification

Signed-off-by: BOUKERFA Mohamed El Amine <boukerfa.ma@gmail.com>
2026-09-29 17:40:38 +02:00
BOUKERFA Mohamed El AmineandManuel Raynaud c16a5887bd 🔒️(backend) throttle the document mention endpoint
Add a dedicated "mention" throttle scope limiting calls
to the document mention endpoint to 30 requests per minute.

Signed-off-by: BOUKERFA Mohamed El Amine <boukerfa.ma@gmail.com>
2026-09-29 17:40:38 +02:00
BOUKERFA Mohamed El AmineandManuel Raynaud 28cb6b7251 ⚡️(backend) send mention notification email asynchronously
Move the mention email off the request/response cycle into a Celery task
so the SMTP round-trip no longer delays the API response.

Signed-off-by: BOUKERFA Mohamed El Amine <boukerfa.ma@gmail.com>
2026-09-29 17:40:37 +02:00
Mohamed El Amine BOUKERFAandManuel Raynaud f18b6c0e5d ✨(backend) add mention endpoint with email notification
Allow users with at least the commenter role on a document to mention
other collaborators in the document body or in a comment thread via
POST /documents/{id}/mention/. The mentioned user must already have
access to the document.

The mention record is always created, and the mentioned user is
notified by email with a link to the anchor, unless a notification
was already sent in the same context (document body or specific
thread) within a configurable cooldown period (15 minutes by default).

Signed-off-by: Mohamed El Amine BOUKERFA <boukerfa.ma@gmail.com>
2026-09-29 17:40:36 +02:00
Mohamed El Amine BOUKERFAandManuel Raynaud 4436b2a9f8 ♻️(backend) let callers override document email context defaults
We need this so mention notification emails can replace the default
share link with a link to the anchor of the mention.
2026-09-29 17:40:35 +02:00
Mohamed El Amine BOUKERFAandManuel Raynaud dc75d5493b 🛂(backend) make document access list visible to all collaborators
Return all accesses on the document and its ancestors to any
user with access, keeping the limited user details serializer
and adding the user id to it, so that collaborators allowed
to comment can identify and mention each other.

Signed-off-by: Mohamed El Amine BOUKERFA <boukerfa.ma@gmail.com>
2026-09-29 17:40:35 +02:00
Manuel RaynaudandGitHub a73decba48 ⚡️(backend) remove throttle on content-update action
The content-update action is an internal call made by yhub. No throttle
should be apply on it.
2026-09-28 11:29:54 +00:00
Anthony LC 81b51ee578 📸(export) adapt export interlinking to get titles
We can now paste docs url that will become interlinking.
So we don't want to pass titles through the inline content itself
anymore, to not leak any titles. The problem is that inline content
Inline content mappers are not async, so titles must be
resolved upfront.
We adapted the export interlinking to get titles from
a pre-resolved map instead of relying on inline content.
2026-09-28 08:56:59 +02:00
Anthony LC 170c7b06f0 ✨(frontend) turn pasted doc links into interlinks
Pasting a bare link to another doc on the same domain now inserts an
interlink instead of a plain hyperlink, so it benefits from the same
title-sync and navigation behaviour as links added through the `/` or
`@` menu. Pasting over a selection, inside a code block, or a link the
current user can't resolve will display the doc id instead.
2026-09-28 08:56:59 +02:00
Manuel RaynaudandGitHub cf7be5b484 🐛(backend) retry the duplicate of a document on a tree path collision
The duplicate was not using create_tree_node_with_retry helper managing
duplicate path. We will have collision on this action if we don't use
it.
2026-09-26 07:05:31 +00:00
Anthony LC 319383d8ff 🚩(backend) add DUPLICATE_CHILDREN_FEATURE_ENABLED flag
We want to introduce a feature flag that allows
duplicating documents along with their children when
enabled. We will be able to control not only
frontend side but also backend behavior
regarding document with children duplication.
2026-09-25 14:06:23 +02:00
Anthony LC f0d718fa3e 🚩(frontend) add Analytics feature flag on Duplicate with Children
We want to have a fine grained control over the
Duplicate with Children feature.
By adding the feature flag for Duplicate with Children,
we can enable or disable this feature for specific
users or groups without deploying new code.
This allows us to test the feature in a controlled
environment and gather feedback before a full rollout.
2026-09-25 14:06:22 +02:00
Ovgodd 420d56e3ce 💄(frontend) redesign 403 access denied page
Align the 403 page with the new Figma error pages, keeping access request.
2026-09-25 12:37:02 +02:00
Ovgodd 141da6f938 🐛(frontend) keep documents draggable with a mouse when zoomed
Fixes DND bug: at high zoom, always allow mouse drag (pointer: fine, not width)
2026-09-25 11:24:18 +02:00
Anthony LCandGitHub b00a968766 📌(docker) replace minio by silo
The quay.io/minio/minio and quay.io/minio/mc images now answer 401, and
the minio images are gone from Docker Hub as well: the dev stack, the
backend CI job and the helm dev-backend could not pull them anymore.

[pgsty/silo](https://hub.docker.com/r/pgsty/silo) and
[pgsty/mc](https://hub.docker.com/r/pgsty/mc) are community builds and drop
in replacement of minio. Only the executable name is changing from minio
to silo.
2026-09-25 09:04:03 +00:00
ArmandandOvgodd 139dd17ca0 🐛(frontend) open search results in a new tab with ctrl/cmd+click
Search results were cmdk items navigating with router.push on select,
so the browser had no link to open elsewhere. Each result is now a real
link to the document: a plain click still goes through the quick search
onSelect, while ctrl, cmd, shift or middle click let the browser open it
in a new tab or window and keep the search modal open.

Signed-off-by: Armand <schneideretcollier.innovation@gmail.com>
2026-09-24 12:28:14 +02:00
renovate[bot]andGitHub 9c8d7f30be ⬆️(dependencies) update joserfc to v1.6.8 [SECURITY]
update joserfc from v1.6.5 to v1.6.8
2026-09-24 10:22:48 +00:00
Manuel Raynaud e6a9e82c5c 🔧(helm) allow to disable the createsuperuser job
The createsuperuser job is always run. We want to allow to disable it,
there is no need to run this command on every deployment.
2026-09-23 17:04:58 +02:00
Manuel Raynaud b25660f5b1 📝(documentation) finalize and polish the documentation
Also the AGENTS.md is now track to have all the same one and track any
modification made on it.
2026-09-23 12:06:05 +02:00
Manuel Raynaud d6793f2117 ✨(loadtest) add the grafana dashboards of the load-test campaign
To see what is happening in the cluster we added grafana dashboards
using all the metrics introduced previsouly
2026-09-23 12:06:05 +02:00
Manuel Raynaud e07d9f7270 ✨(loadtest) add browser canaries measuring what a user feels under load
After implementing the websocket and api stress tests, this last step is
using playwright to simulate a real user using docs. A real chromium
will be used for this. The idea is to see what a user feels when Docs is
under load.
2026-09-23 12:06:05 +02:00
Manuel Raynaud 43688007b5 ✨(helm) add a ServiceMonitor and a PodMonitor when metrics enabled
When metrics is enabled, we want to create a ServiceMonitor od
PodMonitor in order to scrap the metrics from django and yhub. We have
to add an exception on the redirect to ssl for the metrics endpoint,
like for the probes endpoint, the traffic is internal.
2026-09-23 12:06:05 +02:00
Manuel Raynaud c67be67d07 ✨(loadtest) add k6 scenarios for the backend application
To stress test the backend application we will use the k6 project from
grafana. 2 scenarios are implemented and documented in the README. How
to use this project is also documented in the README
2026-09-23 12:06:05 +02:00
Manuel Raynaud 773ae5180c ✨(loadtest) add a websocket load generator for the collaboration server
standlone package simulating traffic on the yhub server. It reuses the
same stack used bu the frontend application to connect to the websocket.
How to use it is explained in its README file.
2026-09-23 12:06:05 +02:00
Manuel Raynaud daf00a45e8 🔧(yhub) document how to enable secure postrgesql connection
Document how to enable secure postgresql connection if needed.
2026-09-23 12:06:05 +02:00
Manuel Raynaud b27091ba3c 🚀(helm) publish chert version 6.0.0-alpha.1
We publish a first alpha version of our chart 6.0.0-alpha.1
2026-09-23 12:06:05 +02:00
Manuel Raynaud 5654b98f3b ✨(backend) add custom metrics when monitoring is enabled
We added custom metrics when the monitoring is enabled, we will measure
the cost of calling outside services like yhub and the converters, the
database pool and celery queue.
2026-09-23 12:06:05 +02:00
Manuel Raynaud 0afd3360fd 🔧(helm) run a valkey for the backend and one for yhub in dev and feature
We don't want to manage a valkey operator and cluster inside the Docs
repo, this will be managed outside. For dev purpose we only need a
standalone instance of valkey.
2026-09-23 12:06:05 +02:00
Manuel Raynaud 3cd85c95dc ✨(backend) add a LoadTest configuration and its loadtest application
To test the application on real condition we want to authenticate users.
The authentication is made using OIDC and we don't want to depend on
this during the tests. To bypass it, we will create real user sessions,
export thei identifiers and then use it later with the tool firing the
requests. The session are linked to real users, everything is made in a
dedicated django application and this application is explicitely loaded
in a dedicated environment and can't be used in the Production
environment.
2026-09-23 12:06:05 +02:00