Skip to content

Until 1.2: Mac calendars, start alerts, and a new site - #2

Open
hmirin wants to merge 11 commits into
mainfrom
1.2-mac-calendars-and-site
Open

hmirin wants to merge 11 commits into
mainfrom
1.2-mac-calendars-and-site

Conversation

@hmirin

@hmirin hmirin commented Sep 30, 2026

Copy link
Copy Markdown
Contributor

Everything planned for Until 1.2: calendars without Google sign-in, meeting-start features, universal builds, and a rebuilt README and website.

App

  • Calendars on this Mac (EventKit). Until can show the events the Calendar app already syncs (iCloud, Google, Outlook/Exchange, CalDAV) without signing in. Mac calendars and Google accounts work side by side; events that appear through both are merged, and calendars whose account is also connected to Google start off. Google-only actions (Meet links, notes docs) stay on Google events.
  • First run. The popover offers Mac calendars first, Google sign-in second, and a sample day to try the timeline before connecting anything.
  • Start alert (optional): a floating card or a full-screen takeover on every display as a meeting starts, with Join, Snooze 1 min, and Dismiss.
  • Join shortcut: a second global shortcut joins the menubar meeting, or the one running or starting within 15 minutes.
  • 30+ meeting services, with path checks for hosts that also serve ordinary pages; Zoom and Teams can open in their desktop apps.
  • The menubar can hide the event title; the popover footer summarizes the day; the upcoming card shows up to three docs/designs/PRs linked from the invite; a location that is just a meeting link shows as the service name; "in now" is gone.

Distribution

  • UNIVERSAL=1 builds app and widget for Apple Silicon and Intel; release.sh turns it on.
  • The release workflow also uploads Until.dmg, so releases/latest/download/Until.dmg always works.
  • Homebrew cask template in packaging/homebrew/until.rb.

Docs and site

  • README rewritten (install, why Until, calendar sources, comparison, FAQ) plus README.ja.md, CONTRIBUTING, SECURITY, issue templates, and CHANGELOG.
  • Website rebuilt: direct download, trust strip, calendars, alerts, widgets, comparison, FAQ, a Japanese page at /ja/, JSON-LD, sitemap, per-language OG images. UI illustrations are SVGs generated by scripts/make-site-art.py for English and Japanese.
  • Privacy policy covers Calendar app access and the widget snapshot.

Verified

  • swift test (256 tests) and SwiftLint pass.
  • A universal release bundle: app, widget, and Sparkle are x86_64 + arm64; signature valid; calendar entitlement and usage strings present.
  • On a macOS 15.6 VM: onboarding, sample day, the Calendar access prompt, reading real Calendar app events after granting access, the floating and full-screen start alerts, Dismiss, and the join shortcut opening Google Meet.
  • Site pages at desktop and phone widths, English and Japanese.
  • Not yet: launching on an Intel Mac.

Before merging

Merging deploys the site (Pages builds docs/ from main), and its download button points at releases/latest/download/Until.dmg, which only exists once a release is built with the updated workflow.

  • Create combinatrix-ai/homebrew-tap with Casks/until.rb (README and site mention the tap).
  • Merge and tag v1.2.0 together, then fill the cask's sha256.
  • Repo settings: description, homepage until.combinatrix.ai, topics, social preview (docs/og-image.png), Discussions (the issue template links to them), labels good first issue and meeting-service.

Until can now use the events the Calendar app already syncs (iCloud,
Exchange, Google, CalDAV) without signing in. Mac calendars are one more
source next to Google accounts: they are listed in Settings grouped by
account, default off when the same account is connected to Google, and
events that duplicate a Google event are merged away. Google-only actions
(adding a Meet link, creating notes) stay on Google events.

The first-run popover now offers Mac calendars first, Google sign-in
second, and a sample day that shows the timeline before connecting
anything. Events also carry up to three non-meeting links from their
description or attachments for the upcoming card.
Ship en/ja InfoPlist.strings for the NSCalendars usage descriptions and
declare both localizations in the app's Info.plist.
- A second global shortcut joins the menubar meeting, or the joinable
  meeting that is running or starts within 15 minutes.
- An optional start alert puts the meeting on screen as it starts, as a
  floating card or a full-screen takeover on every display, until the
  user joins, snoozes a minute, or dismisses it.
- Meeting link detection covers 30+ services (Slack huddles, Discord,
  Jitsi, FaceTime, Chime, Gather, Tuple, Lark, Tencent Meeting, …), with
  path checks for hosts that also serve ordinary pages. Zoom and Teams
  links can open in their desktop apps.
- The menubar can hide the event title and show only the countdown.
- The popover footer summarizes today (events, booked time, longest
  free stretch left), and the upcoming card shows up to three links
  from the invite (docs, designs, PRs).
- UNIVERSAL=1 builds the app and the widget extension for Apple Silicon
  and Intel; release.sh turns it on by default.
- The release workflow also uploads the installer as Until.dmg so
  releases/latest/download/Until.dmg always points at the newest one.
- Add a Homebrew cask template for the combinatrix-ai/homebrew-tap repo.
- Document the new sources and the release steps in AGENTS.md.
Lead with install, the three reasons to use Until, calendar sources,
a comparison with similar apps, and an FAQ; add a Japanese README,
CONTRIBUTING, SECURITY, issue templates, and a changelog for 1.2.0.
The floating alert never becomes the key window, where bordered system
buttons lose their accent color; give Join a fixed tinted fill.
- Hero links straight to Until.dmg, offers the Homebrew command, and
  states the supported Macs; a trust strip follows.
- New sections for calendar sources (Mac calendars / Google), start
  alerts, desktop widgets, the smaller details, a comparison with
  MeetingBar, Dato, and Dot, and an FAQ.
- A Japanese page at /ja/ with hreflang links, JSON-LD, a sitemap,
  robots.txt, and a dedicated 1200x630 Open Graph image.
- Widget and start-alert images are rendered from the real views.
- The privacy policy covers Calendar app access and the widget snapshot.
Fall back to fewer chips when three don't fit on the card's line.
Replace the raster screenshots (hero, timeline, notification, start
alert, widget) with SVG drawings of the same UI, generated from one
layout with English and Japanese copy by scripts/make-site-art.py, so
the Japanese page shows Japanese UI and the art stays sharp. The
illustrations also show the 1.2 details (invite link chips, the day
summary). Open Graph images are rendered per language from
scripts/og-image.html by scripts/render-og.sh.
Invites from the Calendar app often carry the meeting link as the
location; rows, the upcoming card, alerts, and reminders now show the
service name (e.g. Google Meet) instead of the raw URL.
In the last half minute before a start the rounded countdown reached
zero and the menubar read "in now".

This branch has not been deployed

No deployments
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