Releases: doable-team/heyflare
Release list
heyflare 0.3.0
Third release. 43 commits since 0.2.0, and almost all of them are one thing: heyflare has a calendar.
Calendar
Modelled on HEY's, which does not draw an hour grid and stack boxes in it. Five migrations (0011–0015) apply themselves on first run; nothing existing is touched.
- Three views, no month. Week is seven columns that stack vertically and scroll, so a fortnight is a scroll rather than a click. Day runs horizontally — the day is a strip you read left to right, titles turned on their side like books on a shelf. Year is a weekday-aligned ribbon.
- Night is drawn, not hidden. The hours you sleep are compressed into a starry band, so the part of the day you actually use gets the room. Free time is drawn to scale and stamped.
- Day photos — a cover image behind a day, at full strength with no scrim; blocks over it keep a white keyline.
- Google Calendar, calendar-only. Connect an account for calendar without granting mail scope, and manage each connection separately. Calendars are listed under the account they came from, each with a checkbox, a colour and a default. Imported palettes are muted to one band, because these blocks are filled solid rather than drawn as pale chips.
- Subscribe by URL (ICS), with RRULE expansion that keeps wall-clock time across daylight saving.
- Drag to move and resize, in both the week and the day, with quarter-hour snapping. A press under 4px is still a click.
- Circle an event in dark ink, the way you would on paper. Duplicate an event. Habits, journal and flexible tasks.
- Week view has an Apple-style hour gutter and rules — a deliberate departure from HEY, because a seven-day column needs the reference.
- Arrow keys move within the calendar; ← and → hand focus to the sidebar and the assistant. The calendar always opens on today.
iOS app
apps/ios — Tauri 2, same shape as the Mac app.
Fixed
- Custom-domain sending was broken outright on the Cloudflare path. Every message set its own
Message-ID, which Cloudflare generates itself and rejects — refusing the whole send rather than dropping the header. No fork with the binding configured could send anything. Only allowlisted headers are sent now, threading kept, and a refusal reports Cloudflare's own reason instead of failing mutely. - Moving an event could quietly undo itself. The update to Google was a
PUT, which replaces the whole event; without aneventTypein the payload, birthdays, holidays and working-location entries were rejected. The failure was swallowed, so the next sync pulled the old copy back a minute later. Now aPATCH, and a refusal puts the row back at once and says why. - Deleting a repeating Google event removed one occurrence. Google's expansion stores each occurrence as its own row with no rule tying them together, so "all events" had no series to act on — and the scope dialog never appeared. Instances are now matched by their shared iCalUID.
- Short events covered the ones after them. A block is never drawn shorter than 22px, which in the week is 69 minutes; the column layout reserved 15 and saw no conflict. It now reserves what is actually drawn.
- The assistant input stayed one line. It sized itself by counting newlines, so a long message with no break in it wrapped out of sight. It now measures what the browser actually rendered.
Under the hood
D1 writes were roughly 125,000 a day against a 100,000 free-tier cap, most of it recording that nothing had changed. An idle cron tick now writes nothing at all: status, sync tokens and timestamps are persisted when something actually changed, when a calendar recovers from an error, or every ten minutes. Calendars you have unchecked sync every six hours instead of every minute — the visibility flag had never been consulted. Counting events per calendar no longer scans every event you own on each page load.
Notes
- Mac app: the DMG is ad-hoc signed (not notarized), so macOS may say "heyflare is damaged" after downloading. Clear the quarantine flag once:
xattr -dr com.apple.quarantine /Applications/heyflare.app
- Calendar sending/Google: connecting a calendar needs the Google Calendar API enabled on your Cloud project; the app now says so with a link rather than showing an empty list.
- Updating a self-hosted server never touches your data:
npx create-heyflare deployorgit pull && npm run deploy. Migrations apply themselves.
heyflare 0.2.0
Second release. 32 commits since 0.1.0.
New
- Power through new — press
oin the Imbox to stack every new message on one page, bodies open, each with its own actions (reply inline, reply later, set aside, bubble up, move, labels, collections, notes, trash). Nothing is marked seen by scrolling past it; "Mark all as seen" clears the queue. - Native macOS app (
apps/mac, Tauri 2 + WebKit, 5.9 MB): menu bar with shortcuts, dock badge for new mail and the Screener, system notifications that open the thread, window state, persistent login, a first-run server prompt, and one-click in-app updates. Google sign-in opens in your default browser through a one-time handoff link, and links inside emails open externally. - Update awareness —
GET /api/version, an "Update available" row in the sidebar, and a dialog explaining that your database is untouched. Seedocs/UPDATING.md. - Arrow-key navigation everywhere — ↑↓ move through mail or scroll a reading page, ← focuses the sidebar, → opens the assistant, Enter opens. Threads step message to message with Enter to expand. The 1–9 shortcuts are gone.
- One contact per person — contacts no longer repeat once per connected account, with an "Applies to" choice (all accounts, or just one address) for destinations and bundling.
- Keyboard cursor on the item pages — Set Aside, Bubble Up, Screened out, Drafts, Clips, Collections, Files, Labels.
Fixed
- Inline
cid:images in email bodies now render (pasted screenshots, signature logos). - "Show quoted text" did nothing on the first click (#1).
- Typing
@in the assistant swallowed the character, making email addresses impossible (#2). - Sent draft cards in the assistant collapse to a one-line "Sent", including sends made from the composer.
- Paper Trail read and unread were visually identical; unopened mail now counts as new.
- Escape returns from a bundle; the focused row no longer hides under the sticky header.
- The assistant closes with ⌘J from anywhere, is a resizable side panel, and no longer blocks arrow keys.
Notes
- Mac app: the DMG is ad-hoc signed (not notarized), so macOS may say "heyflare is damaged" after downloading. Clear the quarantine flag once:
xattr -dr com.apple.quarantine /Applications/heyflare.app
- Updating a self-hosted server never touches your data:
npx create-heyflare deployorgit pull && npm run deploy. Migrations apply themselves.
heyflare 0.1.0
First public release.
- HEY-style email client on Cloudflare Workers + D1: Screener, Imbox, The Feed, Paper Trail, Reply Later, Set Aside, Bubble Up, Bundles, Clips, Collections, Labels, Files
- Gmail via OAuth (no history import, minute sync + sync-on-focus) and custom-domain mailboxes (Cloudflare Email Routing / Email Sending or Resend)
- Unified inbox across accounts, user-wide screening decisions, Google profile photos + BIMI logos
- Built-in AI agent (side panel, tools, Reply with AI, summaries, learned memory) with Anthropic, OpenAI, xAI, OpenRouter, Gemini or any OpenAI-compatible endpoint
- Notion-minimal shadcn UI, dedicated mobile UI, TOTP two-factor auth
- Deploy with the Cloudflare button,
npm create heyflare@latest, or a fork + Workers Builds
Mac app: the DMG is ad-hoc signed (not notarized yet), so macOS may say "heyflare is damaged and can't be opened" after downloading. The build is fine — clear the quarantine flag once:
xattr -dr com.apple.quarantine /Applications/heyflare.app