Triptych Project

Three proposals for HTML:

  1. <form method="POST">
  2. <button action="/post/123" method="DELETE">
  3. <button action="/open" target="content">
Jump to:

Examples

These three small proposals make HTML significantly more expressive, enabling many common web applications to be built with pure hypertext.

Login and logout

<form action="/session" method="POST">
  <input name="email" type="text">
  <input name="password" type="password">
  <button>Login</button>
</form>
<button action="/session" method="DELETE">Logout</button>
Explanation

The most basic interaction of a web application, logging in and out, is made fully declarative and trivial to implement.

  • No superflous <form>
  • Logouts are now idempotent, and can be safely retried
  • Using the /session URL for all authentication actions simplifies the backend implementation

Editing a post

<form action="/posts/123" method="PUT">
<!-- Main form submission -->
<textarea name="content">I read the news today; oh boy.</textarea>
<button>Save</button>

<!-- Additional actions -->
<button action="/posts/123" method="GET">Cancel</button>
<button action="/posts/123/draft" method="PUT">Save Draft</button>
<button action="/posts/123" method="DELETE">Delete Post</button>
</form>
Explanation

This form demonstrates a basic HTML-only interface for editing a previously-submitted post, like one might do on a social media site, comment thread, or forum. Access to flexible <button> elements allows us to describe this interaction entirely with HTTP routes.

PUT /posts/123
Updates the post, replacing it with the contents of the form
GET /posts/123
Navigate away with no changes ("canceling" the update )
PUT /posts/123/draft
Save the post updates as a draft
DELETE /posts/123
Delete the post entirely

Declarative Page Updates

<div id="user-info"></div>
<form action="/users/354" method="PUT" target="#user-info">
  <input type="text" name="name">
  <input type="text" name="bio">
  <button>Submit</button>
</form>
Explanation

Using the target attribute, this form performs basic partial page replacement. When the form is submitted, it will replace <div id=user-info> with the result of PUT /users/354. This allows the page to update in response to user action without undergoing a full page reload.

The addition of this paradigm of to HTML lives alongside the traditional page load performed with the hyperlink. The <a> element is used to load a new, distinct resource, while a partial page replacement is used to update the state of an existing, already-loaded resources in response to user action.

FAQs

Q: Does this have any chance of happening?
A: Yes.

Once a feature is added to the HTML standard, it's there forever, so new features must be feasible for implementers, useful for developers, and beneficial for users. We expect Triptych to take take years and incorporate many rounds of feedback.

Nevertheless, they're worth the effort. We are working with browser implementers to specify this at the necessary level of detail and are making progress on the contributions required to land Triptych in browser engines.

Q: Why not do this in JavaScript?
A: Putting common functionality in HTML benefits everyone.

Web developers often have to implement the same patterns over and over again. Building proven functionality into HTML is a longstanding design principle, delightfully known as "Paving the Cowpaths."

These patterns were carefully chosen for their universality and power. Web developers frequently use HTTP lifecycle methods, set buttons to perform network requests, and update parts of the page based on the server response. The chosen grammar enables the most common subset of that functionality, letting developers save time, money, and code dependencies for the truly custom parts of their application.

Web browsers are also not the only HTML clients. Search engine crawlers, RSS readers, AI agents, even browsers features like Reader Mode—they all read and transform HTML to perform different, specialized functions. The more web functionality that is described in HTML, the better these products can be.

Q: Can I try Triptych today?
A: Yes, with a polyfill.

Check out the Triptych Polyfill (on GitHub).

Q: Why these specific features?
A: They generalize hypermedia controls.

One answer to this question is: because they are very useful and largely uncontroversial.

A more complicated answer is that these features complete HTML's ability to do Representational State Transfer (REST) by making it a sufficient self-describing representation for a much wider variety of problem spaces. That this can be accomplished with such tiny API changes is a testament to how effective HTML already is.

In September 2025, some members of the Triptych Project co-authored a research paper on what Triptych could accomplish for HTML as a hypertext, and what it reveals about where HTML could go next.

Q: What if I need the functionality provided by [HTML attribute library]?
A: You can still use them!

The three features chosen for Triptych are quite limited in scope relative to JavaScript offerings like htmx, hotwired, and unpoly. Triptych offers a basic, HTML-compatible version of those features; it's the greatest common denominator between them all.

Status

Now

Currently planning the Chromium implementation and the required changes to the web platform tests.

History

Aug 17, 2024
Published Triptych #1 on WHATWG issue tracker
Nov 10, 2024
Published Fetch Spec change for Triptych #1
May 30, 2025
Published HTML Spec change for Triptych #1
Sep 15, 2025
Published ACM research paper

Last Updated: Jan 15, 2026

Contact

Triptych Project is affiliated with the Montana State University Hypermedia Research Group.

For questions, reach out to Alexander Petros (contact@alexpetros.com) or Carson Gross (carson@bigsky.software)