Follow buttons here act as you, not as @admin.
| Label | Kind | State | Action |
|---|---|---|---|
| indiekit-demo.rmendes.net | source | — | — |
| fediversereport.com | source | — | — |
| wedistribute.org | source | — | — |
| hnrss.org | source | — | — |
| hnrss.org | source | — | — |
| hnrss.org | source | — | — |
| hnrss.org | source | — | — |
| hnrss.org | source | — | — |
| hnrss.org | source | — | — |
| hnrss.org | source | — | — |
| hnrss.org | source | — | — |
| 9to5google.com | source | — | — |
| hnrss.org | source | — | — |
| hnrss.org | source | — | — |
| cvefeed.io | source | — | — |
| thebeatcommunity.com | source | — | — |
| contabo-status.com | source | — | — |
| www.techdirt.com | source | — | — |
| beehaw.org | source | — | — |
| beehaw.org | source | — | — |
Pull request (OPEN) · PR #1001 fix(frontend): load the app script once the page is parsed · @rmdes
Fixes #1000
Drops async from the app script so it runs after the document is parsed, and custom elements are defined once their content exists. A module script is deferred by default, so defer is kept only to say so.
Checked with the proxy reproduction from the issue: five errors and no add-another buttons with async defer, none and both buttons with defer.
Issue ouverte · Issue #1000 Frontend components can start before their content is parsed · @rmdes
The app script is loaded with async defer (packages/frontend/layouts/default.njk:46). For a module script async wins, so the script can run while the page is still being parsed. It defines the custom elements, and an element that has been opened but not yet filled gets connectedCallback straight away: add-another looks for #add-button (components/add-another/index.js:27) before it exists, getElement throws, and the component never sets up.
It depends on timing, so it shows up on some loads and not others. To make it repeatable, I sent /posts/create?type=photo through a proxy that pauses for 1.5 s after the <add-another> start tag. With async defer:
No element matching #add-button
No element matching .file-input__progress
No element matching label
No element matching .label
No element matching .geo-input
and no add-another buttons. With defer alone: no errors, both buttons.
async came in with Stimulus (b9d05da), which waited for the document before connecting controllers; it became a problem when the components moved to custom elements (e.g. 914c8fd).
Commit sur main · 24b659a · @rmdes
attributes() returned on the first falsy value instead of skipping it, so everything after it was lost. The summary field’s editor-locale is empty when application.locale is unset, which dropped editor-status=“false” and editor-toolbar=“false” after it and turned the summary into a full editor.
Article URL: https://www.reddit.com/r/founder/comments/1x25aws/genius_or_midlife_crisis/
Comments URL: https://news.ycombinator.com/item?id=50038133
Points: 1
# Comments: 0
Pull request (OPEN) · PR #999 fix(frontend): don’t drop attributes after one without a value · @rmdes
Fixes #998
Skips an attribute without a value instead of returning, as 37e15d5 intended. Adds a test with an empty attribute followed by others (fails before the change, passes after).
Issue ouverte · Issue #998 Frontend attributes() drops every attribute after one without a value · @rmdes
attributes() in packages/frontend/lib/globals/attributes.js returns as soon as it meets a value that is empty or false, so every attribute after it is lost. The early return came in with 37e15d5 (January 2023, “don’t return attributes with falsy values”); continue was meant.
The article summary shows it. summary-field.njk passes "editor-locale": application.locale before "editor-status": "false" and "editor-toolbar": "false". application.locale has no default (only publication.locale does), so on an install that doesn’t set it, the two false attributes are dropped and the one-line summary gets the full editor toolbar and status bar.
Pull request (OPEN) · PR #997 feat(frontend): choose an existing media file from the editor and file fields · @rmdes
Fixes #996
Adds a “Browse media…” button to the editor toolbar and to the file input. It opens a <dialog> listing files from the media endpoint (q=source, with “Show more” following paging.after). Choosing a file inserts  for a photo or [filename](url) otherwise in the editor, or fills the file input’s path.
<template> rendered by the component, so they are localised; the new mediaBrowser keys are in every frontend locale.browse-media), alongside the existing ones.test/unit/utils/media-browser.js covers listing, choosing, paging, the empty and error messages, and cancelling.Tested on the quickstart stack with an image built from this branch, in English and French: the photo field, and the article, note and photo content editors.
Article URL: https://nishtahir.com/build-your-own-decision-model/
Comments URL: https://news.ycombinator.com/item?id=50037949
Points: 451
# Comments: 102
Commit sur main · 88287f1 · @rmdes
691b359 made component lookups throw when an element is missing. Four lookups are of elements that are absent by design, each already followed by a null check: the file-input picker and the geo-input button live only in a until connectedCallback clones them in, a tag-input hint and error message are only rendered when given, and the textarea status bar can be turned off. The throw aborted connectedCallback, so the upload button on photo, video, audio and featured fields and the find location button were never wired, and the category field rendered as a plain input. Those four go back to querySelector with nullable types. New component tests mount file-input and geo-input as custom elements in jsdom.
Commit sur main · 5637cf4 · @paulrobertlloyd
feat(indiekit): show more configured endpoints in homepage guidance
Commit sur main · 07f959e · @paulrobertlloyd
feat(endpoint-auth): use url filter for endpoint urls
Commit sur main · 526ed5d · @paulrobertlloyd
…Micropub By removing mention of Micropub, we can then show more endpoints that can be included in a website’s head
Commit sur main · 0f8640e · @paulrobertlloyd
feat(frontend): use url filter for absolute urls in default layout
Issue ouverte · Issue #996 Choose an existing media file from the editor and file fields · @rmdes
Today the only way to reuse an uploaded file is to copy its URL from /files.
I’d like to add a “Browse media” button next to the editor’s image upload button and next to file-input’s “Upload file” button. It would open a dialog listing the media endpoint’s files (q=source, paged by uid) and insert or fill in the chosen one. Built the way the other frontend components are: a native <dialog>, localised strings in the component template, the existing icons.
I’ve run a version of this on my own site for a while; a screenshot of it follows.
Pull request (OPEN) · PR #995 fix(frontend): don’t throw looking up elements that may be absent · @rmdes
Fixes #994.
Those four lookups go back to querySelector, with types that admit null; every other getElement call is unchanged. New tests mount file-input and geo-input as custom elements in jsdom and fail without the fix. They are the first component tests in the package, so tell me if you’d rather they live elsewhere.
Found while running a build of main; worth having before beta 30.
Issue ouverte · Issue #994 Frontend components drop the upload, find location and tag input set-up on main · @rmdes
Since 691b359, component lookups throw when an element is missing. Four lookups are of elements that are absent by design, each followed by a null check the throw now makes unreachable:
file-input/index.js:48 and geo-input/index.js:30: the picker and the button live only in a <template> until connectedCallback clones them in.tag-input/index.js:7-8: a hint and an error message are only rendered when given.textarea/index.js:171: the status bar can be turned off with editor-status="false".The throw aborts connectedCallback, so on main the upload button next to photo, video, audio and featured URL fields, the find location button, and the category tag input are never set up. Nothing is lost (the URL fields and the editor’s own image upload still work), but those three are missing.
Reproduction: open /posts/create?type=photo. There is no “Upload file” button next to the photo URL field, and the console shows No element matching .file-input__picker, No element matching .geo-input__button and No element matching .error-message.

Article URL: https://www.sciencealert.com/secret-of-orange-cats-finally-revealed-after-60-year-search
Comments URL: https://news.ycombinator.com/item?id=50037711
Points: 101
# Comments: 75
Article URL: https://twitter.com/robsandhu/status/2108987321786007853
Comments URL: https://news.ycombinator.com/item?id=50037218
Points: 2
# Comments: 0
Pull request (OPEN) · PR #993 Use canonicalUrl filter in Nunjucks templates, and show all configured endpoints on homepage · @paulrobertlloyd
Somewhat related improvements:
canonicalUrl filter in all Nunjucks templates where an endpoint’s mount path (or frontend asset path) needs to be prefixed with the application URLgetEndpointUrls method that was used to provide a list of endpoint mount paths for use on the homepage guidances that can be added to a website’s ` to support installed/configured endpointsArticle URL: https://housing.over.pizza/
Comments URL: https://news.ycombinator.com/item?id=50036864
Points: 530
# Comments: 189
Article URL: https://twitter.com/lymanstoneky/status/2107227592151445963
Comments URL: https://news.ycombinator.com/item?id=50036400
Points: 5
# Comments: 1
Article URL: https://twitter.com/bzamayo/status/2108498107184934914
Comments URL: https://news.ycombinator.com/item?id=50036394
Points: 3
# Comments: 0
Article URL: https://twitter.com/ashxhart/status/2108580126094963038
Comments URL: https://news.ycombinator.com/item?id=50036277
Points: 1
# Comments: 1

States across the US are slowly rolling out support for adding your driver’s license or ID to the Google Wallet app on Android.
more…Article URL: https://www.ft.com/content/052610c5-22b4-4dd4-932e-b7f9f0628b6a
Comments URL: https://news.ycombinator.com/item?id=50035886
Points: 170
# Comments: 108
Commit sur main · f8c7376 · @rmdes
A request without source_url syndicated one post, the oldest awaiting syndication, and stopped. The endpoint exists to be pinged after a deploy or on a schedule, so a backlog of several posts, which is what a deploy that publishes more than one post or an outage at a target leaves behind, needed as many pings as posts. Work through every post that still has a target to reach, oldest first and one at a time, recording each result on its post as before, and respond with a result per post. A target that fails is noted on its post and the batch carries on; an error updating a post stops the batch, and the posts not reached are still awaiting syndication for the next request. A request arriving while a batch is running is told so rather than syndicating the same posts again, since a deploy webhook and a scheduled request can coincide. Two tests sent the post URL as syndication.url, which the endpoint has never read (the form sends syndication.source_url, as the README documents). They passed because the fallback happened to pick the only post; they now send the documented parameter. The mock content store accepts more than one post so a test can seed a backlog.
Article URL: https://motherduck.com/blog/why-duckdb-20-is-faster/
Comments URL: https://news.ycombinator.com/item?id=50035530
Points: 196
# Comments: 61
Commit sur main · 54f193e · @rmdes
The share form sends a bookmark to the Micropub endpoint but offers no way to say where it should be syndicated, so a shared bookmark never reaches a syndicator unless the target is edited afterwards. Render a checkbox per configured target, as the post form does, and forward each chosen one as its own mp-syndicate-to parameter: URLSearchParams would otherwise join an array into one comma-separated value the Micropub endpoint does not match. A target whose info cannot be read is shown disabled with the reason, the same as the post form since the syndicator-info change. Tests load the two syndicators the test configuration already knows about and check the form renders a checkbox per target, that both chosen targets come back as separate values on the created post, and that a chosen target stays checked when the form is re-rendered with errors.
Article URL: https://vermaden.wordpress.com/2026/10/10/freebsd-cope-with-signal-fuckup/
Comments URL: https://news.ycombinator.com/item?id=50035448
Points: 3
# Comments: 0
Commit sur main · 21624e4 · @rmdes
The share form sends a bookmark to the Micropub endpoint but offers no way to say where it should be syndicated, so a shared bookmark never reaches a syndicator unless the target is edited afterwards. Render a checkbox per configured target, as the post form does, and forward each chosen one as its own mp-syndicate-to parameter: URLSearchParams would otherwise join an array into one comma-separated value the Micropub endpoint does not match. A target whose info cannot be read is shown disabled with the reason, the same as the post form since the syndicator-info change. Tests load the two syndicators the test configuration already knows about and check the form renders a checkbox per target, that both chosen targets come back as separate values on the created post, and that a chosen target stays checked when the form is re-rendered with errors.
Commit sur main · 2f89cd1 · @rmdes
…y parameters A bookmarklet, a share sheet or a reader’s ‘Post’ button has a URL and usually a title to hand over, and the share endpoint already accepts them. The create form did not, so a client had to choose between the share form’s fixed bookmark and an empty post form. Accept url and name on /posts/create. The URL goes to the field the post type has for one (bookmark-of, in-reply-to, like-of or repost-of) and to the content where the type has none; the name only where the type has a name field. Anything already in the form wins, so a re-rendered form is not overwritten.
Commit sur main · b792c1a · @rmdes
The README promises filter for every list query and gives /micropub?q=source&filter=web as the example, but the source query ignored it: the parameter only ever reached the configuration queries. Honour it for posts as a case-insensitive match on the name and content, and accept category alongside it for posts carrying that category. Filtering keeps paging: getCursor takes an optional query that is merged into the range condition and into the hasNext/hasPrev probes, so a filtered page reports whether more filtered items exist rather than whether more items exist at all. Existing callers are unaffected; the parameter defaults to an empty object. Tests cover the cursor filter in util, and for the endpoint: match by name, match by content, match by category, both together across two pages, and no match.
Commit sur main · 77a6266 · @rmdes
A category arrives as typed. Surrounding whitespace, an empty value from a blank form field, and the same word in another case each became a distinct category on the site, and every list built from categories, the q=category query included, grew a near-duplicate for it. Trim each value, drop the empties, and fold case-insensitive duplicates onto the first spelling given, at the point where properties are normalised so every write path is covered. A category left with nothing is removed rather than stored as an empty array. Casing is otherwise left as the author wrote it: folding onto a canonical spelling is a separate question.
Article URL: https://twitter.com/satyanadella/status/2108931348857827686
Comments URL: https://news.ycombinator.com/item?id=50035193
Points: 7
# Comments: 0
Commit sur main · 47b995d · @rmdes
…elector The last clause of the selector was missing its closing parenthesis. Browsers recover from the error, which is why nothing visibly broke, but a selector that only works through parser error recovery is one engine update away from throwing, and it misleads anyone reading it.
Commentaire de pull request · PR #992 feat(indiekit): declare a collection’s indexes with addCollection · @paulrobertlloyd
Brill, thanks @rmdes!
Commit sur main · df0b8f8 · @rmdes
A plug-in declares the indexes a collection needs where it adds the collection, as an array of a key plus any createIndex options, and the core creates them once the database is connected and before serving. The literal posts and media list in index.js goes: the Micropub and media endpoints declare the properties.uid index themselves, and the Microsub endpoint declares its three instead of creating them at init.
Commit sur main · e8bc4df · @paulrobertlloyd
feat(endpoint-microsub): add localised strings
Pull request (OPEN) · PR #992 feat(indiekit): declare a collection’s indexes with addCollection · @rmdes
Fixes #979.
Indiekit.addCollection(name, indexes) takes an optional array of indexes, each a key plus any createIndex options such as unique. The core creates them in createIndexes(), called from server() after the plug-ins are installed and before serving; creating an existing index is a no-op, so it runs on every start.
The literal posts and media loop in index.js goes: the Micropub and media endpoints declare { key: { "properties.uid": 1 } } where they add their collections, and the Microsub endpoint declares its three (channel + id unique, channel + uid unique, channel + url) instead of creating them at init. The uid backfill stays where it was. Docs page updated.
Two core tests (declared indexes are created, a collection declares none by default); the Microsub index test moves with the declaration.
Pull request (OPEN) · PR #991 fix(endpoint-micropub): honour filter on q=source, add category · @rmdes
Fixes #990.
filter is a case-insensitive match on a post’s name or content, category an exact category; both are cast to strings so nothing reaches the database as an operator, and both are passed to getCursor as its filter so paging keeps working within the match (the cursor’s filter option landed with #944).
Four integration tests, seen failing first. README documents category.
This is one of the last six changes ported from my fork; nothing here needs to hold a release.
Issue ouverte · Issue #990 q=source ignores the documented filter parameter · @rmdes
packages/endpoint-micropub/README.md:41 says list queries support filter, limit and offset. lib/controllers/query.js reads filter (line 32) but applies it only to configuration queries (line 121); the posts list returned by q=source never sees it.
Reproduction: /micropub?q=source&filter=web returns every post.
Pull request (OPEN) · PR #989 feat(endpoint-syndicate): syndicate every post awaiting syndication per request · @rmdes
Fixes #988.
A request without source_url works through every published post that still has a target, oldest first, one at a time, and responds with a result per post; a second such request arriving while one runs is told syndication is already in progress. A request with source_url behaves as before.
On the way: two existing tests sent syndication.url, a field the endpoint never read, and passed by coincidence; they now send source_url. The mock store replies persist so a batch can write several files.
This is one of the last six changes ported from my fork; nothing here needs to hold a release.
Issue ouverte · Issue #988 A syndication request without source_url handles one post only · @rmdes
getPostData in packages/endpoint-syndicate/lib/utils.js:30-33 takes limit(1) and returns the oldest post awaiting syndication, so a deploy webhook or a scheduled request after a build syndicates one post per call. With several posts published between builds, the rest wait for as many further requests.
Reproduction: publish two posts with mp-syndicate-to, POST /syndicate once: the first is syndicated, the second still has its target.
Pull request (OPEN) · PR #987 feat(endpoint-posts): pre-fill the create form from the query string · @rmdes
Fixes #986.
url goes to the post type’s URL field (bookmark-of, in-reply-to, like-of or repost-of), or to its content when the type has none; name only where the type has a name field. Anything already in the form wins. README gains a section mirroring the share endpoint’s.
Three integration tests, seen failing first.
This is one of the last six changes ported from my fork; nothing here needs to hold a release.
Issue ouverte · Issue #986 Post creation form cannot be pre-filled from the query string · @rmdes
packages/endpoint-posts/lib/middleware/post-data.js:20 reads only type from the query. The share endpoint documents url, name and content pre-filling, so a bookmarklet or a reader’s post button can hand over a page; the posts endpoint cannot, which rules out a pre-filled reply, like, repost or bookmark.
Reproduction: /posts/create?type=bookmark&url=https://example.website/article&name=An+article renders an empty form.
Pull request (OPEN) · PR #985 fix(frontend): close the tabindex clause in add-another’s focusable selector · @rmdes
Fixes #984.
One character: the missing ).
This is one of the last six changes ported from my fork; nothing here needs to hold a release.
Issue ouverte · Issue #984 add-another’s focusable selector is missing a closing bracket · @rmdes
packages/frontend/components/add-another/index.js:3 ends with [tabindex]:not([tabindex="-1"] and no closing ). Browsers recover from the malformed last clause today, which is why nothing visibly breaks, but the selector as written is invalid and the tabindex clause is not reliably applied when focusing a newly added item.