Repository navigation
v0.0.10
Key takeaways
- [Feature] Group and sort Messages your way: On the Messages page, use Group by to bucket mail by Sender, Domain, Labels, Category or Period, and sort by Sender, Size, Attachments or Category.
- [Feature] Pick months with two taps: On each mailbox's coverage map on the Backfill page, tap one month and then another to pick every missing month between them, using the quick-pick bar above the map.
- [Feature] Sparklines on the Backfill tiles: On the Backfill page, the Size tile now charts size copied over the last hour, and the DO writes today tile charts hourly Durable Object writes over the last 24 hours.
- [Fix] A bad message no longer fails a month: During a Backfill, a month's copy now skips a single message that Gmail refuses with an HTTP 400 error and finishes the rest of the month.
- [Fix] Missed new-mail syncs now run: The scheduled Gmail new-mail sync now runs a slot it missed after a restart, at the next watchdog check within 5 minutes.
App
- Messages has a Group by menu with Sender, Domain, Labels, Category and Period. The pager shows "N groups", and each open group loads its own pages.
- You can sort Messages by Sender and Size. Sorting by Attachments or Category is also available, and a column sorts only once its index is ready.
- A filter such as Domain now shows its total where one is available.
- Edit view greys out Pivot and shows the reason. Group stays on.
- Group by Period fixes:
- Each Period group shows its message count.
- Years now reach back to your oldest indexed month, not just 2026.
- Periods with no mail are hidden.
- "No rows match." no longer appears while grouping is on.
- Expand all and Collapse all work on grouped lists.
- Month picking on the Backfill coverage map:
- Tap a month, then another, to pick every missing month between them, even across years.
- Start on a picked month to unpick a range, or tap a year to pick all of it.
- Quick picks sit in a bar above the map: All missing, Last 3 months, Last 12 months and Clear queue. The Select months menu is gone.
- Picked months show a framed check. Months that can't be picked fade while you pick, and months already copied can't be picked.
- Nothing starts until you press Start backfill.
- The Backfill Size and DO writes today tiles now carry sparklines built from real data.
- The Size line restarts if the mailbox's Durable Object restarts, and returns once copying moves.
- The Account limits card is gone from the Backfill page. It remains unchanged on the Cloudflare usage page.
- The Plan tile now shows when your paid period ends.
- The UI kit is updated to support the grouped lists.
Gmail
- When Gmail answers 400 for a single message, MailCellar skips it, logs which message and Gmail's reason, and finishes the month.
- The month's count shows the gap left by a skipped message.
- Other Gmail fetch errors now include Gmail's own error message, so the cause is visible.
Search
- Messages can be sorted by date, sender, size, attachments or category, and grouped by sender, domain, label, category or period. Both work on the server, so they cover your whole mailbox, not just the loaded page.
- Sorting falls back to Date until the matching index exists.
- Groups are listed largest first, 50 to a page, and each group opens with its own filter.
- Sorting by Attachments lists mail with attachments first, then the rest by date. Sorting by Category reads each category by date, in name order.
- Paging was checked in both directions across 700 test messages for both new orders.
Sync
- New-mail sync now notices a slot that passed since the last saved run and runs it at the next watchdog alarm, within 5 minutes. This fixes slots lost when a deploy restarted the user's Durable Object between scheduling and the slot.
- Each Gmail sync alarm now logs its schedule decision: the schedule settings, last run, slot, whether a run was due, and the pause state. This makes a sync that fails to start easier to diagnose.
- These changes add no Durable Object writes.
Storage
- New indexes for Sender and Size (and for Attachments) are built before a month is indexed. The full backfill therefore indexes each message once.
- Indexing costs more writes per message. It was about 3.06 Durable Object rows per message before and is about 5.06 now. The Attachments index adds roughly 0.2 more.
- The index reservation per message rises from 4 to 6 rows.
- The sparkline data is kept in memory only and adds no Durable Object reads or writes.
Infra
- Paid-plan run budgets now end on their own date. The date moved to the billed period end, Oct 27 00:00 UTC, which was seven hours earlier than the earlier guess.
- Free's smaller run sizes and the 97.5k Durable Object write stop therefore return on time. Run, lane, list and census calls, CPU, index chunks, commit bytes and lane spend all follow the new date.
- The quota service re-reads your plan hourly instead of daily. A cancelled Workers subscription counts as Paid until its period ends, and that end date appears on the Plan tile and in the log.
- After the switch to Workers Free, the
limitssetting must be removed from the Wrangler config because Free can't accept it. - Spend is unchanged apart from one free billing API read an hour.
Pull requests (10)
- #103 Copy: skip and log a message Gmail answers 400 for, instead of failing the month (@bchoor)
- #101 Backfill: sparklines on the Size and DO writes tiles (@bchoor)
- #102 fix: Group by Period counts and years, Expand all; sort by Attachments and Category (@bchoor)
- #100 Paid's budgets end when billing says the period does (Oct 27 00:00 UTC) (@bchoor)
- #99 feat: Messages groups by Sender, Domain, Labels, Category and Period, and sorts by Sender and Size (@bchoor)
- #96 feat: pick months with two taps; quick picks in the bar above the map (@bchoor)
- #98 Log each Gmail sync alarm's schedule decision (@bchoor)
- #97 Backfill: drop the Account limits card (@bchoor)
- #91 feat: Sender and Size sort indexes, server sort and group endpoints (@bchoor)
- #95 Gmail sync runs a slot missed across a restart; Paid's budgets end Oct 27 on their own (@bchoor)
Full changelog: v0.0.9...v0.0.10