Skip to content

Reader updates and reproducible dependency maintenance - #43

Merged
aymericbeaumet merged 84 commits into
mainfrom
ab/dev
Oct 18, 2026
Merged

aymericbeaumet merged 84 commits into
mainfrom
ab/dev

Conversation

@aymericbeaumet

@aymericbeaumet aymericbeaumet commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Summary

TypeScript 6 remains for svelte-check's peer range while the aliased TypeScript 7 checker handles the worker. The exact wreq prerelease pins preserve the Rust 1.96 minimum; the newer stable pair requires Rust 1.98.

Verification

  • make setup
  • make check — 1,138 Rust tests and 364 client tests passed
  • make msrv
  • mise exec -- npm --prefix web run verify — rebuilt assets unchanged
  • mise exec -- cargo-deny --locked --all-features check
  • mise exec -- actionlint .github/workflows/ci.yml .github/workflows/release.yml
  • CI matrix and browser checks on the pushed head

aymericbeaumet and others added 30 commits September 21, 2026 17:06
The typed settings lived in src/config/preferences.rs but base.html redeclared
all eighteen of them in JavaScript and the Svelte panel declared their labels a
third time. One field table now produces both the browser validation rules and
the grouped form fields, so a setting cannot be added in one place and missed in
the others.

Retire offline_items: it is still accepted so existing aggr.toml files keep
parsing, but it no longer reaches the browser.
The dev server rewrote compiled asset references into Vite module entries and
negotiated a soft-refresh event with the browser client. Neither survives a
reader that has no build step, so the reload snippet is now just: unregister a
stale worker, purge its caches, reload on the build event.
Three pieces of the reader body were assembled in the browser: a click handler
that updated the fragment when a heading was clicked, a clone of each footnote
into a margin aside, and the target/rel/aria hardening of links leaving the
site. All three are now part of the rendered HTML, so they work with JavaScript
disabled and the stylesheet alone decides whether the margin column or the
footnote list is visible.
Bumps [bits-ui](https://github.com/huntabyte/bits-ui) from 2.19.0 to 2.19.3.
- [Release notes](https://github.com/huntabyte/bits-ui/releases)
- [Commits](https://github.com/huntabyte/bits-ui/compare/bits-ui@2.19.0...bits-ui@2.19.3)

---
updated-dependencies:
- dependency-name: bits-ui
  dependency-version: 2.19.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.9.3 to 7.0.2.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](microsoft/TypeScript@v5.9.3...v7.0.2)

---
updated-dependencies:
- dependency-name: typescript
  dependency-version: 7.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [svelte](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte) from 5.57.0 to 5.57.1.
- [Release notes](https://github.com/sveltejs/svelte/releases)
- [Changelog](https://github.com/sveltejs/svelte/blob/main/packages/svelte/CHANGELOG.md)
- [Commits](https://github.com/sveltejs/svelte/commits/svelte@5.57.1/packages/svelte)

---
updated-dependencies:
- dependency-name: svelte
  dependency-version: 5.57.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [sha2](https://github.com/RustCrypto/hashes) from 0.10.9 to 0.11.0.
- [Commits](RustCrypto/hashes@sha2-v0.10.9...sha2-v0.11.0)

---
updated-dependencies:
- dependency-name: sha2
  dependency-version: 0.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.13.3 to 26.6.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.6.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/cache](https://github.com/actions/cache) from 4 to 6.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](actions/cache@v4...v6)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 7 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v7...v8)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [base64](https://github.com/marshallpierce/rust-base64) from 0.22.1 to 0.23.1.
- [Changelog](https://github.com/marshallpierce/rust-base64/blob/master/RELEASE-NOTES.md)
- [Commits](marshallpierce/rust-base64@v0.22.1...v0.23.1)

---
updated-dependencies:
- dependency-name: base64
  dependency-version: 0.23.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
A Bear Blog post opened with `27 Sep, 2026` and kept it: the leading-date rule
already drops a line naming the item's day, but its parser knew seven layouts
and none of them allowed a comma after the month. Dates are now read by their
own module, in the forms publishers actually use (day or month first, any
abbreviation, ordinals, a weekday, a trailing time of day, slashed and dotted
numbers, RFC 3339 and 2822 stamps) and to the precision written. `September
2026` names a month and matches any day in it; `04/05/2026` keeps both readings
until the item settles which. A line is a date only when all of it is one, so
prose that mentions a date stays.

An essay that closed with `Eric Gullichsen, September 2026` kept that too,
because only the top of an article was cleaned. The last paragraph now goes on
the same terms as a leading byline: a person's name and a date and nothing
else, and the date must name the item's own day or month. A sign-off the item's
date does not confirm, or that says anything more, stays with the author.

Both run at build time as well as capture, so archived articles are fixed by
the next build.
sha2 0.11 and base64 0.23 (#35, #32), resvg 0.48.1, and 22 lockfile updates. The
sha1 and sha2 lines now share one `digest` generation, so importing its trait
twice is gone, as is the deny.toml skip for the retired sha2 0.10. The
workflows move to actions/cache 6 and actions/download-artifact 8 (#26, #30);
cache changed only its runtime, and download-artifact now fails a checksum
mismatch instead of warning, which the release artifacts it fetches pass.

feed-rs stays on 2.x. Its 3.0.0 keeps an item's iTunes media object only when
it has a title, description or content, so an episode whose only iTunes tag is
its duration loses it: four duration tests and the Spotify reconciliation
caught it, and nothing else would have. Dependabot now leaves the 3.x major
alone, as it already does wreq and wreq-util, which stay pinned to their
Apache-2.0 prereleases. The npm updates (#28, #31, #33, #34) target the `web/`
package the hand-written reader removed and have nothing left to update.
A `<lite-youtube>` or `<lite-vimeo>` facade is empty without its script,
so Readability dropped it and Simon Willison's talk lost its video. The
facade now becomes the embed it stands for before extraction, and the
Markdown links the video, which the reader plays inline.

Favicon-service images and favicon files are page decoration: they are
removed from bodies at build time and never chosen as an item preview.
A leading label link that names its own target and precedes another link
(`Comment` before `My comment on …`) is removed too.
Navigation inside the archive no longer loads a new document. app.js
fetches a page as soon as its link is pressed or hovered, and once a page
settles it also fetches the tabs, the neighbouring articles and rows that
stay on screen (bounded). Following a link swaps <main>, the page's head
metadata and window.AGGR (now read from #aggr-page) while the header and
tab bar stay. Per-page setup runs under an AbortController the next swap
ends. Scroll positions are kept per history entry and per list, and a
momentum scroll still running is stopped on arrival. Tabs activate on
touch release, so a tap lands even during a fling. Other sites, files,
failed responses and pages from a newer release fall back to ordinary
navigation. The speculation rules are gone.

- Podcast player: shows the show and episode titles, the archived length
  before playback, jump buttons with the length inside a circling arrow,
  a finish time only while playing, and a stacked layout on phones.
- Reading progress is 2px in the accent colour and keeps following the
  scroll under reduced motion; a fade below it keeps text off the bar.
  Without calc-size() (Safari) the folding header measures its title so
  no gap is left.
- Touch views no longer underline links, and hover underlines no longer
  stick after a tap. Rows highlight as a whole when pressed.
- The mobile tab bar sinks into the home-indicator area, 16px above the
  edge on Face ID iPhones instead of above the whole inset.
- Browse entries skip off-screen layout, halving the swap time on iOS.
Its four commits (the vanilla client, the Rust-rendered heading anchors,
the dev server without Vite, the Rust preference schema) reached main in
#25 and are all present here; recorded as merged without changes.
Already applied on ab/dev by the dependency update; the merge records it.
Already applied on ab/dev by the dependency update; the merge records it.
Already applied on ab/dev by the dependency update; the merge records it.
Already applied on ab/dev by the dependency update; the merge records it.
The web/ frontend it updates was removed with the hand-written reader; the
merge keeps it removed.
The web/ frontend it updates was removed with the hand-written reader; the
merge keeps it removed.
The web/ frontend it updates was removed with the hand-written reader; the
merge keeps it removed.
The web/ frontend it updates was removed with the hand-written reader; the
merge keeps it removed.
ammonia 4.2 moved to html5ever 0.40 and cssparser 0.38 while scraper and
dom_query stay a generation behind, and feed-rs 2 keeps quick-xml 0.41.
cargo deny check is warning-free again.
feed-rs 3 keeps a media object only when it has content, a title or a
description, so an item's `itunes:duration` or `itunes:image`, and a
`media:group` or bare `media:*` without `media:content` (YouTube
descriptions, Atom thumbnails), were lost. Parsing now reads those facts
from the XML and restores them to the entries that lack them, without
overriding what feed-rs kept. Author names lose the parentheses feed-rs
now keeps from `mail@host (Name)`.

Converting 18 live feeds (YouTube, Substack and Acast podcasts, HN,
Lobsters, blogs, JSON Feed, GitHub releases) gives identical items,
durations, thumbnails and content under feed-rs 2.4 and 3.0.
Enabling them only under (hover: hover) also turned them off for any
browser that reports no hover at all, such as headless Chrome in CI.
Touch screens (pointer: coarse) now drop the sticky underline instead,
and article links keep theirs.
ammonia 4.2.3 and rustls 0.23.46 close the current RustSec reports.
unsafe-libyaml stays ignored: serde_yaml_ng 0.10.0 still requires
0.2.11 and that advisory has no safe upgrade.
Arrival was taking the keyboard back to the page after a shortcut had
already focused search. Seated provider frames also lost the loading
cover, so the poster checks looked for an iframe that had left the card.
Arrival leaves a focused row in place, and the browser then scrolls that
row back into view. Focus the page before scrolling so the saved place
stays 300.
@aymericbeaumet aymericbeaumet changed the title Swap cached pages on top of the lightweight default Reader updates and reproducible dependency maintenance Oct 15, 2026
@aymericbeaumet

Copy link
Copy Markdown
Owner Author

@greptile review

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@aymericbeaumet

Copy link
Copy Markdown
Owner Author

@greptile review

@aymericbeaumet

Copy link
Copy Markdown
Owner Author

@greptile review

@aymericbeaumet
aymericbeaumet merged commit 1f06638 into main Oct 18, 2026
16 checks passed
@aymericbeaumet
aymericbeaumet deleted the ab/dev branch October 18, 2026 18:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant