Events Query in Mercure Re: Mercure Protocol: spec stabilized for 1.0, refreshed Internet-Draft

Rahul Gupta <cxres@protonmail.com> Thu, 20 August 2026 20:45 UTC

Received: by mail2.ietf.org (Postfix) id B108812D0C6F2; Thu, 20 Aug 2026 13:45:15 -0700 (PDT)
Delivered-To: ietfarch-httpbisa-archive-bis2juki@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id AD5D412D0C6F1 for <ietfarch-httpbisa-archive-bis2Juki@mail2.ietf.org>; Thu, 20 Aug 2026 13:45:15 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1787258715; bh=fGQ8p/ydzDYF5p18iI1NUJx5X2DrQHoijZUVehmPFfI=; h=Resent-Date:Date:To:From:Cc:Subject:Resent-From:Resent-Sender: List-Id:List-Help:List-Post:List-Unsubscribe; b=aQS9zMyWY6Up1X9QQEWXwlEeUB5ALqrV6IQrJ+ohnvwsgLIy5e4JyX6QAE61ELNNT GVwHjhQoykFufY1ZuROP3VJJCOwE5P+tB4qkWPwAPJPLv1MXl4qaOj1sHJ4qOxsB0i ph7dVgfBAbO+sjiOhBhyeXNf03P7ANElS7llo3bU=
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -5.399
X-Spam-Level:
X-Spam-Status: No, score=-5.399 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.001, HTML_MESSAGE=0.001, MAILING_LIST_MULTI=-1, RCVD_IN_DNSWL_MED=-2.3, SPF_PASS=-0.001] autolearn=unavailable autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (2048-bit key) header.d=w3.org header.b="KDA5QEAs"; dkim=pass (2048-bit key) header.d=w3.org header.b="mVaj6FWI"; dkim=pass (2048-bit key) header.d=protonmail.com header.b="dMCzkXKy"
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id WmCzbHm6aAJ9 for <ietfarch-httpbisa-archive-bis2Juki@mail2.ietf.org>; Thu, 20 Aug 2026 13:45:14 -0700 (PDT)
Received: from mab.w3.org (mab.w3.org [IPv6:2600:1f18:7d7a:2700:d091:4b25:8566:8113]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id 73A9D12D0C6E3 for <httpbisa-archive-bis2Juki@ietf.org>; Thu, 20 Aug 2026 13:45:14 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=w3.org; s=s1; h=Subject:Content-Type:MIME-Version:Message-ID:Cc:From:To:Date:Reply-To :In-Reply-To:References; bh=fGQ8p/ydzDYF5p18iI1NUJx5X2DrQHoijZUVehmPFfI=; b=K DA5QEAsPFrXG228Oohs8eoK9e6wkpA/mfWaZ+G1N5n/UIvSg2jxm1+He987OGkXFIZWOKRlOjPckF JRTJ+GTZIxMbU1ywEwFgDjhnm6bzY5RISaPsoApMA1TfIA4WBaYpWOReWIJ5n6yPNxlCdemuF3Zdu FctTvpVeU6j0wHxUZw5x9Ou0NAXMu6Pnw14dYmJP6J2Bmoo9ohO2oYlKCCl5SbAq1ItOEUWx/HN3j gG4SWNBHGiQaH6/EGzAM0OGQwye3299pIB/XA2+yHDQtlHNVOg8LrvsTv4BoOzn5kG30uh/nqKUwm uvTTVeBBNojaKKCx55zqX2L7mjUFuqNjQ==;
Received: from lists by mab.w3.org with local (Exim 4.98.2) (envelope-from <ietf-http-wg-request@listhub.w3.org>) id 1wx9cY-00000002Vu5-3Vqp for ietf-http-wg-dist@listhub.w3.org; Thu, 20 Aug 2026 20:44:18 +0000
Resent-Date: Thu, 20 Aug 2026 20:44:18 +0000
Resent-Message-Id: <E1wx9cY-00000002Vu5-3Vqp@mab.w3.org>
Received: from ip-10-0-0-144.ec2.internal ([10.0.0.144] helo=pan.w3.org) by mab.w3.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from <cxres@protonmail.com>) id 1wx9cV-00000002Vsl-2JFc for ietf-http-wg@listhub.w3.internal; Thu, 20 Aug 2026 20:44:15 +0000
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=w3.org; s=s1; h=Content-Type:MIME-Version:Message-ID:Subject:Cc:From:To:Date:Reply-To :In-Reply-To:References; bh=fGQ8p/ydzDYF5p18iI1NUJx5X2DrQHoijZUVehmPFfI=; t=1787258655; x=1788122655; b=mVaj6FWIiAVExVQlU5h9oBflYXlXRxUtR3af8nEqVWmQtYZ 6U/GFPpEmiUm/BCM/1etiFb66hgaq+wsaoo4q0OJQ3AdkVvKrJBjuB5RzLjDBzST2YolWK8TTEZ/h mZjGS9Fm3h79QEj/85gGORXN/k1AciEt+QAPf678EiwrkzzgE7bYNaadhZ64nBCv8p2nKEcTfNmpF u8iCxFVDkiUa2+yxShlNAVr3ZvuKAi+UdoLgg1+GxAl7TGqrYM/9Lvs/rr1g8FPX8jRXZNaVZuzeB KFuPBKZrDtG8eWIhQdH+I35kd/Hv2w3Fr2x/OjwiIKAtnyHyfJh7BI4EI/AHbHuA==;
Received-SPF: pass (pan.w3.org: domain of protonmail.com designates 109.224.244.26 as permitted sender) client-ip=109.224.244.26; envelope-from=cxres@protonmail.com; helo=mail-24426.protonmail.ch;
Received: from mail-24426.protonmail.ch ([109.224.244.26]) by pan.w3.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from <cxres@protonmail.com>) id 1wx9cT-0000000ECV4-3D1t for ietf-http-wg@w3.org; Thu, 20 Aug 2026 20:44:15 +0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail3; t=1787258646; x=1787517846; bh=fGQ8p/ydzDYF5p18iI1NUJx5X2DrQHoijZUVehmPFfI=; h=Date:To:From:Cc:Subject:Message-ID:Feedback-ID:From:To:Cc:Date: Subject:Reply-To:Feedback-ID:Message-ID:BIMI-Selector; b=dMCzkXKyCgZmsruf+xmaqRRP51MTRNF373a2Waf/XqFum1W49KOz094e0jSLW40qg +Cog+5aVgUOZhRqt8/90bTr2hX7kkVJPVGMcH5D1/37SRsvSL4Dc76HX+2Iipm0ZZc Eu/zufCVKZvq5lydPJtJuhe4C9wyPubUHDV6UDdq97L0QrMlptmNgggR+qRUlzQizw WIjOCZ6ra/7Tqc8lNUx+vLCmP4WwYO9OriMhSXZxmNzhCBau+tvtwFCwuuffozCliy 3jJ9EyVF++3rgb5bua640NNKyeNrKmveh4wK2x38I6imDafvZFg7Zh6H4gwDK8HLuz 7zmiV79p/0ahQ==
Date: Thu, 20 Aug 2026 20:44:03 +0000
To: Kévin Dunglas <kevin@dunglas.fr>
From: Rahul Gupta <cxres@protonmail.com>
Cc: HTTP Working Group <ietf-http-wg@w3.org>, "httpapi@ietf.org" <httpapi@ietf.org>
Message-ID: <3834l8jHtxm65XFYjBn2le--IGjK7vtO1xKljgFaWN3nRStCIVqLVQWpFF4CCzcNvqzFrL7FECa-t3wRKLdAMZXB5grmcrlqrB_SFG06PDE=@protonmail.com>
Feedback-ID: 919445:user:proton
X-Pm-Message-ID: 1f90c91551dd6cd1bc1dab97b859732cbbcaa4c9
MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/pgp-signature"; micalg="pgp-sha512"; boundary="------628005dcf29f130188d7af0d077d75de1a366155ed2d76970cd1a39e9b0d054b"; charset="utf-8"
X-W3C-Hub-DKIM-Status: validation passed: (address=cxres@protonmail.com domain=protonmail.com), signature is good
X-W3C-Hub-Spam-Status: No, score=-6.8
X-W3C-Hub-Spam-Report: BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, DMARC_PASS=-0.001, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, W3C_AA=-1, W3C_DB=-1, W3C_IRA=-1, W3C_WL=-1
X-W3C-Scan-Sig: pan.w3.org 1wx9cT-0000000ECV4-3D1t e452ae5061d31d6821448ad54d2d335d
X-Original-To: ietf-http-wg@w3.org
Subject: Events Query in Mercure Re: Mercure Protocol: spec stabilized for 1.0, refreshed Internet-Draft
Archived-At: <https://www.w3.org/mid/3834l8jHtxm65XFYjBn2le--IGjK7vtO1xKljgFaWN3nRStCIVqLVQWpFF4CCzcNvqzFrL7FECa-t3wRKLdAMZXB5grmcrlqrB_SFG06PDE=@protonmail.com>
Resent-From: ietf-http-wg@w3.org
X-Mailing-List: <ietf-http-wg@w3.org> archive/latest/54138
X-Loop: ietf-http-wg@w3.org
Resent-Sender: ietf-http-wg-request@w3.org
Precedence: list
List-Id: <ietf-http-wg.w3.org>
List-Help: <https://www.w3.org/email/>
List-Post: <mailto:ietf-http-wg@w3.org>
List-Unsubscribe: <mailto:ietf-http-wg-request@w3.org?subject=unsubscribe>

Hi Kévin,

Thanks for implementing Events Query in Mercure. And doing it so soon.

I had also started working on an implementation during the weekend, but I had two disadvantages: I do not speak Golang which forced me to use AI and I find that at times the coding proclivities of Claude are borderline offensive. It took me two more rewrites on the weekend implementation to get it in the form that I can share and might be instructive. It was also helpful to look at your implementation in the interim and stolen bits and pieces from it. The Draft PR is at https://github.com/dunglas/mercure/pull/1364.

The first and most important part of Events Query is that it is a standardized model to query for events - it allows clients to ask for additional modalities (say over EventSource) that servers can now provide. This allows servers to tune updates to client requirements. It does not mandate a request or response format. You would see in the PR that after refactoring your code, I built Events Query using form-encoding (with Mercure data model save the additional "events" property) for requests and Event Stream for response that you already had implemented (SSE are a valid, although anaemic response). It is only after I had step-by-step implemented the data model parsing, headers and content negotiation, did I add JSON subscription requests and Multipart notifications responses. Adding a new parser for subscriptions or new format for responses is now as simple as writing a parser or encoder according to the template and two lines to wire it up in `parser.go` or `encoder.go` respectively. You can play with new formats to your heart's content.

Choosing multipart/digest instead of multipart/mixed is a better pattern for Mercure as it side-steps your concerns. The default message/rfc822 part allows for headers that provide room for response fields like Event-ID or Mercure prefixed headers. The body can be used to send messages in any format you want -- there is no need to convert data to text or base64 (or deal with line breaks). I also have a great parser for multipart https://github.com/CxRes/multipart-fetch that is being used in production code, which breaks the parts into their own fetch responses.

The fact that you can send a message in another format with multipart is much more powerful than the comment hack in Event Stream (it is not a feature in my reading of the spec). You could, for example, use application/problem+json to send control messages. I am sending an empty "part" (containing only line breaks) as heartbeat, but if that is too heavy, we can use one empty part for multiple heartbeats.

In working with the code, it seems to me that things in Mercure are built around the limitations of SSE, especially writing to the hub. A real opportunity would be to send arbitrary media type in POST to the hub with a Mercure structured field or similar carrying the properties the hub needs to be aware of. And then multipart/mixed would be an ideal response type to forward those arbitrary media-type notifications. A step down would be allow clients to POST message/rfc822 messages. Events Query shines when you give users the freedom to send data however they want.

As for the code, I have mostly left your QUERY implementation untouched (except to fix conneg: goautoneg library was not consistent with RFC9110; and missing content-type for QUERY, which was counter to guidance of RFC10008). The only thing that I am slightly nervous about (for the Events Query side) is how the duration header modifies the timers; it seems correct but I am not 100% certain. This will not affect existing implementation as the code does not kick-in when the duration is zero (which is always true in the non-Events Query path).

Looking forward to your feedback on the PR,

Best Regards,
Rahul


On Sunday, August 16th, 2026 at 7:09 PM, Kévin Dunglas <kevin@dunglas.fr> wrote:

> 

> 

> Hi Rahul,
> 

> 

> 

> I opened a draft PR adding Events Query support to the Mercure Hub: https://github.com/dunglas/mercure/pull/1358
> 

> 

> 

> Could you check if it's going in the right direction and implements Events Query correctly?
> 

> 

> 

> I decided to only support "multipart/mixed" for now, as it fits well with the opaque nature of Mercure's payload-agnostic events compared to JSON sequences or an ad hoc format.
> 

> 

> 

> Overall, it was straightforward, but I think I'm filling the extension slot your I-D anticipates in §2.4.3, and here are some limitations of the current implementation compared to the Server-Sent Events transport:
> 

> 

> 

> 1. Mercure needs event IDs for its state reconciliation feature (reconnecting without losing events after a connection loss). It's provided by SSE's "id" field, but there is no comparable solution in Events Query. I "invented" a "Content-Event-Id" header for the multipart/mixed body parts, but I'm not very happy with it. Per RFC 2046, a 'Mercure-' prefixed part header cannot be relied on (non-Content- fields may be ignored or discarded by gateways), and Events Query §9.2.2 excludes them from body parts entirely. Another alternative would be to define a custom format for the Mercure payload, but this would give less flexibility to the end user and feels less native than "multipart/mixed". Another alternative would be to use headers defined in Michael Toomim's HTTP Resource Versioning (https://datatracker.ietf.org/doc/draft-toomim-httpbis-versions/) but it's not standardized yet and currently only accepts ASCII values, meaning IRI IDs (recommended by Mercure) would require a percent-encoding convention that both sides must reverse, and IDs aren't guaranteed to be IRIs at all. RFC 2045 Content-ID also doesn't work because it requires angle brackets syntax, which cannot carry IRIs.
> 

> 

> 

> 2. SSE has a "comment" feature (lines starting with a colon are ignored by clients), which is very practical for preventing disconnections/timeouts from HTTP/1 intermediaries such as reverse proxies. It seems there is no easy way to do that with Events Query, as MIME multipart/mixed lacks an inline comment syntax. We could use synthetic messages, but they will be received by clients, which mixes protocol layers. The only workaround I've found is to bound response durations below intermediary timeouts (the PR implements the Events Query duration mechanism), but this introduces reconnection churn SSE doesn't have.
> 

> 

> 

> The main advantage over SSE is that multipart parts could carry binary events, which SSE can't do without base64-encoding (binary has been a non-goal for Mercure so far). Not implemented in the PR yet, but I may work on it at some point.
> 

> 

> 

> Best,
> 

> 

> 

> Kévin
> 

> 

> On Thu, Aug 13, 2026 at 6:10 PM Rahul Gupta <cxres@protonmail.com> wrote:
> 

> > Hi Kevin,
> > 

> > The spec has two independent implementations, so I would say it is settled enough that you should be able to test it with a Mercure hub (and it would be good feedback for the spec). You can look at the libraries linked in Implementation Status for inspiration, it is quite simple to implement. Or ask me if you have questions!
> > 

> > The caveat is that it is still a proposal at HTTPAPI, so not so mature in terms of IETF process.
> > 

> > BR/Rahul
> > 

> > On Thursday, August 13th, 2026 at 8:13 PM, Kévin Dunglas <kevin@dunglas.fr> wrote:
> > 

> > > Hi Rahul,
> > > 

> > > Noted, thanks for the clarification. As Mark suggested, I'm working on a
> > > problem statement, and this will be in it.
> > > 

> > > Also: whenever you feel Events Query is mature enough, I'd be glad to add
> > > support for it to the reference Mercure hub. It could be the most direct way to
> > > find out whether the composition actually holds.
> > > 

> > > Best,
> > > 

> > > Kévin Dunglas
> > > Les-Tilleuls.coop
> > > 

> > > On Thu, Aug 13, 2026 at 3:57 PM Rahul Gupta <cxres@protonmail.com> wrote:
> > > 

> > > > Hi Kevin,
> > > > 

> > > > Events Query does not need to be subject resource-centric. As you suggest at the end of the mail, it can work with a hub resource as well (baring section 10) in a similar way as SSE, with a minor extension to the QUERY data-model. I mentioned it precisely because I also see it as composable, something that could benefit Mercure users in the future.
> > > > 

> > > > Best Regards,
> > > > Rahul
> > > > 

> > > > 

> > > > On Wednesday, August 12th, 2026 at 10:42 PM, Kévin Dunglas <kevin@dunglas.fr> wrote:
> > > > 

> > > > > Hi Rahul,
> > > > > 

> > > > > Fair point on venue. Mercure does not extend HTTP; it is an application
> > > > > protocol on top of it, so HTTPAPI may well be the better home. I would
> > > > > rather have that routed than assume it, so I am putting the question to
> > > > > the HTTP WG chairs and the AD, and will follow whichever answer comes
> > > > > back.
> > > > > 

> > > > > Thanks for your work on Events Query. I follow the proposal, and it looks indeedmore complementary to Mercure, than an alternative to it.
> > > > > 

> > > > > Events Query is resource-centric: notifications for events on a given resource, temporal
> > > > > coordination across responses out of scope, authorization left to the
> > > > > server.
> > > > > 

> > > > > On the other hand, Mercure is deliberately hub-based (It was heavily inspired by
> > > > > WebSub in the beginning).
> > > > > 

> > > > > Topics are decoupled from origin resources, one connection multiplexes many topics,
> > > > > authorization is specified (RFC 9396 authorization_details in an RFC 9068 access token,
> > > > > discoverable per RFC 9728 etc), and reconnection is defined with
> > > > > Last-Event-ID replay from the hub.
> > > > > 

> > > > > Also, the refreshed draft already allows QUERY (RFC 10008) for subscription.
> > > > > Hubs must support GET, since that is what EventSource uses,
> > > > > and can also accept any other safe method (QUERY is explicitly listed) that
> > > > > can carry the topic matcher parameters in the request body,
> > > > > so subscribers can send matcher lists too large for
> > > > > intermediary URI length limits.
> > > > > 

> > > > > So the two look composable rather than exclusive. A hub is itself a
> > > > > resource, and I see nothing that would stop a hub from serving its
> > > > > stream via Events Query alongside Event Stream.
> > > > > 

> > > > > Best regards and thanks for your reply,
> > > > > 

> > > > > Kévin Dunglas
> > > > > Les-Tilleuls.coop
> > > > > 

> > > > > On Wed, Aug 12, 2026 at 2:38 AM Rahul Gupta <cxres@protonmail.com> wrote:
> > > > > 

> > > > > > Hi Kevin,
> > > > > > 

> > > > > > For Mercure, HTTPAPI might be a more appropriate venue for discussion. Nothing in it modifies HTTP or requires HTTP extension itself.
> > > > > > 

> > > > > > As a shameless plug: you might want to check out my Events Query proposal https://cxres.github.io/events-query/draft-gupta-httpapi-events-query.html as a powerful SSE alternative, which should be useful even for Mercure.
> > > > > > 

> > > > > > BR/Rahul
> > > > > > 

> > > > > > On Tuesday, August 11th, 2026 at 6:10 PM, Kévin Dunglas <kevin@dunglas.fr> wrote:
> > > > > > 

> > > > > > > 

> > > > > > > Hi there,
> > > > > > > 

> > > > > > > I am re-announcing the Mercure Protocol on this list. The spec was first
> > > > > > > published in 2018 (draft-dunglas-mercure-00, October 2018) and has been
> > > > > > > in continuous use and revision since. It has now stabilized for a 1.0
> > > > > > > release. The reference implementation is currently tagged v1.0.0-alpha.3
> > > > > > > while the code catches up to the spec, and I have refreshed the
> > > > > > > Internet-Draft accordingly.
> > > > > > > 

> > > > > > > - Datatracker: https://datatracker.ietf.org/doc/draft-dunglas-mercure/- Spec source (pinned): https://github.com/dunglas/mercure/blob/v1.0.0-alpha.3/spec/mercure.md
> > > > > > > - Reference implementation: https://github.com/dunglas/mercure
> > > > > > > 

> > > > > > > Mercure is a hub-based publish/subscribe protocol over HTTP and SSE,
> > > > > > > designed to push updates to web browsers and HTTP clients. It targets
> > > > > > > the "server-to-client real-time updates" use case that today is usually
> > > > > > > served by ad-hoc WebSocket protocols.
> > > > > > > 

> > > > > > > For context, the I-D was first submitted in October 2018, brought to
> > > > > > > this list in 2020
> > > > > > > (https://lists.w3.org/Archives/Public/ietf-http-wg/2020JulSep/0020.html)
> > > > > > > and surfaced again in 2022 in Michael Toomim's "Mnot's Pub/Sub for the
> > > > > > > Web" thread
> > > > > > > (https://lists.w3.org/Archives/Public/ietf-http-wg/2022JanMar/0164.html)
> > > > > > > The protocol has been in production use across multiple ecosystems for
> > > > > > > roughly seven years.
> > > > > > > 

> > > > > > > A note on timing and relevance: SSE has become the de-facto transport for
> > > > > > > streaming output from AI systems. The OpenAI and Anthropic APIs, and the
> > > > > > > Model Context Protocol, all stream tokens over SSE. Mercure is SSE-native and
> > > > > > > adds the pieces those ad-hoc uses lack: authorization, multiplexing, discovery,
> > > > > > > and reconnection with state reconciliation, all over plain HTTP. A standardized,
> > > > > > > authenticated way to stream incremental results to browsers and HTTP clients is
> > > > > > > more useful now than when this work started.
> > > > > > > 

> > > > > > > What is new since draft-dunglas-mercure-07 (2020) is largely a matter of
> > > > > > > removing Mercure-specific machinery in favor of standards that did not exist,
> > > > > > > or were not mature, when the protocol was first drafted in 2018:
> > > > > > > 

> > > > > > > - URL matching now uses the WHATWG URL Pattern standard instead of URI
> > > > > > > Templates. URI Templates (RFC 6570) define expansion, not matching, and
> > > > > > > Mercure had to specify matching itself; URL Pattern is purpose-built for
> > > > > > > matching and did not exist in 2018. The matcher set is reduced to two types,
> > > > > > > Exact and URL Pattern.
> > > > > > > - Authorization now uses OAuth 2.0 Rich Authorization Requests
> > > > > > > (authorization_details, RFC 9396) instead of a bespoke "mercure" JWT claim.
> > > > > > > The hub is an OAuth 2.0 protected resource; access tokens follow the JWT
> > > > > > > access token profile (RFC 9068), are presented and error-reported per the
> > > > > > > Bearer usage spec (RFC 6750), and auth requirements are discoverable via
> > > > > > > OAuth 2.0 Protected Resource Metadata (RFC 9728, published 2025). None of
> > > > > > > these existed or were usable in 2018.
> > > > > > > - Security hardening
> > > > > > > - Editorial pass for IETF style and consistency.
> > > > > > > 

> > > > > > > The result is a smaller spec that reuses existing IETF and web standards rather
> > > > > > > than reinventing them, and that a generic OAuth resource-server library can
> > > > > > > enforce.
> > > > > > > 

> > > > > > > Deployment status:
> > > > > > > 

> > > > > > > - Reference hub (Go, ~5k GitHub stars) used in production:
> > > > > > > https://github.com/dunglas/mercure
> > > > > > > - FrankenPHP, the modern PHP application server (~11.1k GitHub stars,
> > > > > > > now supported by the PHP Foundation), ships a native Mercure hub,
> > > > > > > exposes it through native PHP functions, and uses it internally for
> > > > > > > its hot-reload feature: https://frankenphp.dev
> > > > > > > - First-class integration in Symfony (official real-time solution),
> > > > > > > API Platform, Laravel, Spiral, and others; community clients across
> > > > > > > JavaScript, Python, PHP, Java, .NET, Rust, Swift, and more.
> > > > > > > - Production deployments include UEFA Euro 2020, COP26, France Titres
> > > > > > > (ANTS, French government agency for secure documents), France Médias
> > > > > > > Monde, M6, Treezor (Société Générale group), Multitude Bank,
> > > > > > > BRAC Bank, Yousign, Rectangle Health,
> > > > > > > Lush, Adore Me, Printify, Sellsy, and others. A fuller list:
> > > > > > > https://mercure.rocks/references
> > > > > > > 

> > > > > > > I would like to gauge whether there is interest in pursuing this work
> > > > > > > within HTTP, or whether the WG would prefer that I take it to the
> > > > > > > independent stream. I will follow up with the co-chairs separately with
> > > > > > > a concrete request.
> > > > > > > 

> > > > > > > Reviews and feedback on the refreshed draft are very welcome.
> > > > > > > 

> > > > > > > Thanks,
> > > > > > > 

> > > > > > > Kévin Dunglas
> > > > > > > Les-Tilleuls.coop
> > > > > > >