chr33s / bye
git clone https://github.com/chr33s/bye.git
Bye is an open-source email and calendar platform inspired by HEY.
+0
stars, 24h · #31,414
+~0
stars, 7 days · #31,889
+86
stars, 30 days · #6,201
87
★ total
6
forks · 2 open issues
Star history (as recorded here)
LanguageTypeScript
LicenseMIT
Created2026-09-25 (27d ago)
Last push10d ago
Watchers2
OwnerUser
Links
- GitHub: github.com/chr33s/bye
- Homepage: https://bye.chr33s.dev
- Releases · Issues · Hacker News mentions
README excerpt
# Bye. ### _Say bye to what matters, and hey to the rest._ **Bye** is an open-source email and calendar platform inspired by HEY's public feature set. It is built in TypeScript on Cloudflare primitives, with Effect v4 and Alchemy. Core flows have been validated locally in Node, workerd and cloudflare in production.tmutmu - **Email:** a screened Inbox, Newsletters, Receipts, follow-ups, search, drafts and more. - **Calendar:** events, invitations, tasks, reminders and time tracking. - **Client apps:** a PWA, CLI/TUI, and React Native apps for mobile and desktop. - **Open source:** MIT licensed; the code is available here for you to inspect and run. https://github.com/user-attachments/assets/ba2b19e1-0675-4500-9c8d-58ff4973fe1c Source for the demo reel: `demo-reel/` --- The product and architecture are specified in `spec.md`; this repository implements that design on Cloudflare primitives. Alchemy v2 beta defines the deployment, which has not yet been run against Cloudflare. Pinned baseline: `effect@4.0.2`, `alchemy@2.0.0-beta.81`, Node 24.21.0, pnpm 12.10.1 (see `.mise.toml`). Every dependency is an exact version; the Effect family is pinned through `pnpm-workspace.yaml` overrides. Native React pins match their bundled renderers, and Babel remains on 7 because React Native's transform plugins require it. The desktop platform family and AsyncStorage retain the versions supported by its native hosts and patches. Miniflare stays on its newest stable release (`latest` currently points to an alpha); WebView retains its newer 16.0.0 release from the `next` channel. ## Layout [code] ## Commands [code] ### Local development `pnpm dev` runs every Worker, Durable Object, D1 database, R2 bucket, KV namespace, queue and container locally through `alchemy dev`. MailCore serves the PWA and the API on one origin, `http://localhost:1337`. PublicSite uses 1338 and SigMirror 1339; a Worker fails to start rather than move to another port. Set `APP_ORIGIN=http://localhost:1337` so the instance document names that origin, and `MAIL_RENDER_ORIGIN=http://127.0.0.1:1337` so message rendering gets a separate origin on the same Worker. `DOMAIN` doesn't cover `dev-*` stages. `STAGE` must be `dev- `: the guard refuses other stages, and alchemy's own default (`dev_$USER`) is not a valid stage name. Logs are written to `.alchemy/log/ / `. To point the CLI at it, use `BYE_INSECURE_LOOPBACK=1` with `BYE_API=http://localhost:1337` or `bye instance add http://localhost:1337`. Clients are not built per server. The apps and CLI default to the hosted service and can add any compatible instance: they validate its `/.well-known/bye-instance` document and RFC 8414 metadata without credentials, then sign in there with PKCE and an issuer-checked callback (RFC 9207). Onboarding hands off with `bye://add-instance?url= `. In the CLI, `BYE_API` overrides the saved default for one invocation. Operators without a CI pipeline can deploy into their own Cloudflare account through the onboardin