Skip to content

v0.3.9 - #250

Closed
karatektus wants to merge 13 commits into
mainfrom
milestone/v0.3.8
Closed

v0.3.9#250
karatektus wants to merge 13 commits into
mainfrom
milestone/v0.3.8

Conversation

@karatektus

@karatektus karatektus commented Oct 20, 2026 •

Copy link
Copy Markdown
Owner

Collects the work for the v0.3.9 milestone on milestone/v0.3.9 and brings it to main together, the same way #182 does for v0.4.0.

Draft until the milestone is complete. Each feature and bug fix is reviewed as its own pull request into milestone/v0.3.9, and shows up here once merged there.

Pull requests into the milestone

PR What Closes State
#117 Swipe a mail row to read or archive it on a phone #147 open
#118 Choose what a row swipe does in each direction #148 open
#119 Long-press a mail row for an action sheet on a phone #149 open
#252 The release pull request is the suite run behind a tag #251 merged
#254 Fix: linked-issue reads the description of a PR into a milestone branch — (bug) merged; the same fix is on main as #255
#256 Calendar on a phone: a readable month, a toolbar and top bar that fit, a live now line #253 merged

Issues in the milestone without a pull request yet: #203, #202, #134.

How this branch works

  • Pull requests for v0.3.9 go into milestone/v0.3.9, not main. The first commit on this branch is the one from milestone/v0.4.0 that runs the E2E suite on pull requests into milestone/** and wip/**. Without it, a pull request into this branch would get no suite. The change is identical on both branches, so whichever reaches main first, the other merges cleanly.
  • main is merged into milestone/v0.3.9 as it moves, so this PR stays mergeable.
  • Changelog: each piece adds its entries under ## Unreleased. They become the v0.3.9 section at the release.
  • Closing issues: GitHub only closes an issue when a PR that names it merges into the default branch, so a Closes #N in a PR into this branch closes nothing. The list below gets a Closes #N for each issue whose PR has been merged here, and is updated as they land. The linked-issue check passes because this PR is labelled deployment.

Closes

Closes #251
Closes #253

🤖 Generated with Claude Code

…ches

A release's work is now collected on a milestone branch (milestone/v0.4.0)
before it reaches main, and the suite only ran on pull requests into main,
so nothing proposed for the milestone was tested. `milestone/**` joins
`main`, and `wip/**` comes along from wip/28, where it already runs the
suite on the phases of #28 — the same block on both, so they merge
without a conflict.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit d009ff7)
@karatektus karatektus added this to the v0.3.8 milestone Oct 20, 2026
@karatektus karatektus added the deployment Brings already-reviewed work to main (a milestone or release branch); needs no issue of its own label Oct 20, 2026
karatektus and others added 2 commits October 20, 2026 14:25
… branch (#254)

GitHub links an issue from "Closes #N" only in a pull request into the
default branch. Into milestone/v0.3.8 or a wip/ branch the closing
references stay empty, so the check failed on every such pull request
however its description named the issue (#252 was the first). For a pull
request into another branch, the description is now read for the same
keywords GitHub accepts.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Releasing asked for the E2E workflow to be started by hand on main before
a tag. Since main became protected, the Release vX.Y.Z pull request cannot
merge until that workflow is green on it, and its commit is what is tagged,
so a manual run only ran the same jobs twice. Releasing now says so, and to
update the branch if main moved after its checks ran, since the protection
does not ask for up-to-date branches.

The paragraph in CONTRIBUTING and the header of e2e.yml that said main is
not verified commit by commit describe main before it was protected; both
now describe it as it is.

Closes #251

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Oct 20, 2026
…, a live now line (#256)

The month chip is its title first, on up to two lines, then its time range
and place; a narrower day drops the end and the place for a third line of
title, long words are hyphenated, and an unanswered invitation has a
dashed bar. Below 39rem, where a day is bars, the grid shrinks and the
chosen day is listed in full under it: today at first, any tapped day
after, with a + for that day that the toolbar's + follows too. On a wider
touch screen the first tap opens a day's card and the second its entry
(calendar--month-tap, and a day-open: variant that the hover and the tap
share).

The calendar toolbar fits below 37rem with icons, a short date label and
smaller buttons, and under 22rem today's date in a box for Today. English
writes a same-month week as "Oct 20-26" (range_short_month). The top bar
tightens below 640px and moves Sync now, What's new and Send feedback into
the user menu. Dialogs are the whole screen below 768px, as compose is.

calendar--now moves the now line every minute on the view's clock and
redraws a view that shows the old day or the new one when the date
changes, which also moves the month's circle on today.

And a + on a day that has gone opened the editor on today:
DefaultEventStart::onDay pulled any past day to the next hour. A past day
now keeps its date.

Closes #253

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the area: calendar Concerns calendar label Oct 20, 2026
karatektus and others added 2 commits October 20, 2026 16:53
#260)

GitHub acts on "Closes #N" only for merges into the default branch, so
issues fixed on a milestone branch stayed open until the release reached
main. A workflow on merged pull requests into milestone/** now closes the
issues the description names, with a comment linking the pull request.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…isible (#258)

The list preview flattened the whole body and skipped short blocks to find
the first long one, so a one-line reply previewed as its attribution line or
the quoted mail. The quoted history (same seam as the reading view's "···")
and a "-- " signature are cut off first now, in HTML and plain text, and the
chrome skip only applies to bulk mail. The JMAP preview uses the same code.

The composer folded the quote with an inline display: none and its clean-up
removed only the toggle, so replies went out with an invisible quote. The
fold is removed in the editor and again on the server, and the reading view
reveals a folded quote in mail already received.

Closes #257

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
karatektus and others added 7 commits October 20, 2026 17:46
…#267)

EmailPatchApplier wrote seenAt for $seen and left MessageThread::$unreadCount alone, so the web list (which draws bold from that counter) disagreed with the phone app. $seen now goes through ThreadStatusUpdater::markRead(), the web UI's own path, and markRead() counts the whole thread rather than the messages passed in.

Closes #266

Co-authored-by: Philippe Delodder <7259755+phdelodder@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…#270)

Trashing a conversation with a message already in the bin queued that message as a move from Trash into Trash. webklex's move() then left the connection in EXAMINE and the server refused it ("NO Not permitted in EXAMINE state"), and the row had already lost its UID. ApplyImapFlagsHandler no longer sends a move into the folder a message is in (and gives the row its UID back), and ThreadStatusUpdater's trash(), archive() and restore() leave such messages out of the move.

Closes #269

Co-authored-by: Philippe Delodder <7259755+phdelodder@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…272)

A thread's labels are the union of its messages', so one deleted message put Trash on the thread and took the whole conversation out of the Inbox, its tab, label lists, All Mail, Unread, the badges and search, along with any reply threaded into it afterwards. The bin rule is now "carries Trash and has no message outside it", written once (binnedThreads()) for every list and badge and spelled out the same way in the search SQL. Option (b) of the issue.

Closes #268

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
expandedValueChanged() used closest('div') to reach the editor's wrapper, but closest() starts at the element itself and the editor is a div, so the wrapper never became a flex container and the editor stayed 170px tall, clipped by [contain:paint]. The wrapper is now the flex column and the editor grows (1 0 auto) to fill the window or its content; the plain-text field fills the expanded window too.

Closes #262

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…#275)

Every pull request added its paragraph under ## Unreleased in CHANGELOG.md at the same place, so the second of any two conflicted with the first once it merged, and each conflict fix re-ran the whole E2E suite. A pull request now adds changelog.d/<issue>-<words>.md; bin/changelog-release.sh, run in the Release vX.Y.Z pull request, collects the fragments (highlights first) and anything still under ## Unreleased into the release's section and deletes them. CHANGELOG.md stays the one file What's new, bin/release-notes.sh and GitHub read.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Every failure in the enable path (registering the service worker, the
browser's push subscription, the server's answer) ended in the same
"Something went wrong" and the exception was dropped, so a report from a
Pixel 8 could not say which. The pane now names the step and the
DOMException name or HTTP status, and logs the exception to the console.

Closes #277

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the area: settings Concerns settings label Oct 21, 2026
@karatektus karatektus closed this Oct 21, 2026
@karatektus
karatektus deleted the milestone/v0.3.8 branch October 21, 2026 17:19
@karatektus karatektus changed the title v0.3.8 v0.3.9 Oct 21, 2026
@karatektus karatektus mentioned this pull request Oct 21, 2026
@karatektus

Copy link
Copy Markdown
Owner Author

Continued in #283. Renaming this release from v0.3.8 to v0.3.9 renamed its branch to milestone/v0.3.9, and GitHub closes a pull request whose head branch is renamed. The commits are unchanged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: calendar Concerns calendar area: mail Concerns mail area: settings Concerns settings deployment Brings already-reviewed work to main (a milestone or release branch); needs no issue of its own documentation Improvements or additions to documentation

Projects

None yet

3 participants