Releases: Dayotter/dayotter
Release list
v0.4.0 — Teams · a smarter Otter · activation & lifecycle · deploy anywhere
This is the biggest release since the first public one. You can now run a real team on DayOtter, Otter (the scheduling assistant) got a lot more capable, and there is a whole new layer of work to help people actually get set up and stick around. It also runs in more places, with more of the security and reliability work that a self-hosted product needs.
Thank you to everyone who filed issues, tested deploys, and sent patches this cycle. Two contributors in particular did work that shaped this release, credited below.
Teams
A huge thank you to Naude Opperman (@Naude555), who prototyped this whole set of team features on his own fork and shared it back. Most of what is below started as his work; we re-implemented it against the current codebase and shipped it.
- Choose who you meet. On a team's collective booking page, the person booking can pick which members they want in the room, and the calendar instantly shows only the times when everyone chosen is free.
- Book a team meeting internally. Any member can schedule a meeting across chosen teammates that lands on everyone's calendar, with a heads-up about who is busy and the option to book over commitments when the meeting simply has to happen.
- See your whole schedule. The bookings calendar now shows your held focus blocks and synced calendar events alongside your meetings, color-coded, in month, week, and agenda views.
- Shareable team availability calendar. Publish a read-only, link-only view of when the team is busy over the next week, and drop it on your own site with a copy-paste embed. It shows busy vs free only, never meeting titles or emails.
- Booking eligibility per member. Keep someone on the team so their time still counts, while taking them off the public booking links with a single toggle.
- Transfer team ownership, so an owner can step back or leave cleanly.
- Co-hosts are now first-class on collective bookings, which is the groundwork for everything above.
Otter got smarter
- Set up recurring and back-to-back meetings in one go ("every Monday standup", "three interviews at 2, 2:15, 2:30").
- Carry an ad-hoc location ("a review on Zoom") and offer a menu of locations per booking type.
- Answer questions and edit an existing booking (title, location, attendees) from the command bar, mobile, or SMS, not just create new ones.
- Hold "focus" drafts as real focus blocks, not meetings, so they defend your time.
- Remember facts you tell it, and a daily cost ceiling on the public booking assistant so a busy page can never run up the bill.
Getting set up and staying (new)
- Lifecycle emails that help a new account reach its first booking: a nudge to share your link, a nudge to connect a calendar, a first-booking celebration, and an optional weekly digest. Off by default, plain-text founder voice, one-click unsubscribe, and hard safety limits so nobody is ever over-emailed.
- A starter event type is created on first sign-in, so a brand-new account has something to share immediately instead of a blank page.
- Pro features preview instead of hard-blocking. On the hosted plan, a locked feature now shows a real, blurred preview of itself with an invitation to upgrade, rather than a bare wall. Self-hosters are unaffected, everything stays unlocked.
Runs in more places
- One-click and one-command deploys: Render template, plus first-class configs for DigitalOcean, Fly.io, Heroku, and Railway, and a deploy guide.
- One-command self-host upgrade: backup, migrate, health-check, and automatic rollback if the new version does not come up.
Security and reliability
- Security scanning in CI: static analysis, a dynamic scan, and secret and dependency scanning, plus a documented secure-development process.
- Event access codes are hashed with a slow, salted KDF (scrypt) instead of stored in the clear.
- Rate limits on the write-heavy booking routes, and a tightened header and link boundary in outbound email.
- CI now gates every PR on lint, type-check, tests, and the full production build, so a build-only break can no longer reach a deploy.
- Fixes: the contact form no longer loses messages on a mail hiccup, the availability troubleshooter understands team events, Microsoft connections show your real account email, Pro checkout self-heals a missing Stripe customer, and the noisy Redis errors during builds are gone.
Contributors
- @Naude555 (Naude Opperman) prototyped the Teams feature set that anchors this release.
- @originalmagneto fixed a Docker out-of-memory build failure and an undeliverable-URL crash, made a missing translation key degrade gracefully instead of blanking the booking page, and sharpened the booking grid's loading and alignment.
Thank you both.
Upgrading
This release adds database migrations (through 0062). After pulling, run pnpm --filter @dayotter/db migrate (or the usual deploy.sh, which now backs up and can roll back on its own). The new team features, the starter event type, and the lifecycle emails are safe defaults; lifecycle emails stay off until you set LIFECYCLE_EMAILS=1.
Full changelog: v0.3.0...v0.4.0
v0.3.0 — Otter answers & acts · 2FA · embeddable booking · Android on Google Play · deploy anywhere
The biggest release yet — 58 changes since v0.2.0. Otter goes from drafting single actions to answering questions and acting across your calendar, the Android app is live on Google Play, and self-hosting gains a safe upgrade command plus one-click deploys on every major platform.
📱 The Android app (v0.3.0) is live on Google Play: https://play.google.com/store/apps/details?id=com.dayotter.app
🦦 Otter (AI)
- Ask real questions from the command bar, the mobile Ask bar, and inbound SMS/WhatsApp — "how busy am I this week?", "when's my next meeting?", "am I free Friday?" — instead of "I only help with scheduling". (#186)
- Edit existing bookings by voice/text — rename, change location, add/remove guests — not just reschedule or cancel. (#187)
- Focus holds become real focus blocks on your calendar, including recurring personal/focus holds. (#185, #188)
- Found bookings are actionable — bulk cancel/reschedule, an aggregate "analyze my schedule" tool, and Otter now sees your synced Google / Outlook / Apple events.
- Expanded tool set + a prompt & knowledge catalogue; timezone and config fixes.
📅 Booking & scheduling
- Multiple locations per event type with a booking-page picker (#103)
- Requires-confirmation / opt-in bookings — the slot is held while the host approves or declines (#100)
- Monthly & yearly booking limits (#104) and offset slot start times (#106)
- First-class out-of-office with delegate redirect (#102)
- Availability troubleshooter — see exactly why a slot isn't bookable (#131)
- Calendly importer — bring event types & schedules across (#115)
🔌 Platform & integrations
- Two-factor authentication (TOTP + recovery codes), web and mobile (#119, #147)
- Embeddable booking widget — a React SDK + embed route (#116)
- App registry / in-app app store for integrations (#107)
- Jitsi Meet as a video provider (#110)
- Booking-page analytics pixels — GA4 / GTM / Meta / Fathom / Plausible (#114)
- Localization — booking-page language picker, plus Italian & Dutch locales (#126)
📱 Mobile — Android live on Google Play (v0.3.0)
- Native 2FA sign-in + approve/decline pending requests
- Event-editor parity — locations, limits, recurring, group, access codes
- Out-of-office + availability troubleshooter screens
- Floating "Ask DayOtter" voice launcher; Focus & fragmentation insights
- Production crash fix (zod v4), redesigned sign-in, session reset on logout
🚀 Self-hosting & deploy
- Safe upgrade command —
deploy/upgrade.sh(back up → pull → migrate → restart → health-check → roll back on failure), plus aversionfield on/api/health - One-click / config-as-code deploys for Render, DigitalOcean, Heroku, Fly.io, and Railway — alongside the existing AWS one-click and Docker Compose
🔒 Hardening & docs
- Hardened Calendly import, CalDAV egress, and public booking input; error-logging hardening
- Performance: parallelized recurring finalize, deduped preference reads, batched imports
- Full documentation audit to match the shipped feature set
Full changelog: v0.2.0...v0.3.0
v0.2.0 — multi-language, bring-your-own-AI, any CalDAV, mobile parity
Everything merged since v0.1.0.
No database migrations and no breaking changes — upgrading is a pull and a rebuild.
🌍 Otter speaks six languages
The booking page and Otter's UI are now localised in English, Spanish, French,
German, Portuguese and Italian. (#80, #92)
- Locale resolves stored preference →
Accept-Language→ default, and there's a
language picker in Settings → Preferences on both web and mobile. (#86) - Resolved on the server, so there's no hydration flash, and the marketing site stays
statically rendered. - Scope: the booking page and Otter's chrome are translated; the rest of the dashboard
is still English.
🤖 Bring your own AI provider
Otter is no longer tied to Claude. Set AI_PROVIDER and point it at whatever you run. (#83, #85)
anthropic(default) oropenai— whereopenaicovers any OpenAI-compatible
endpoint: OpenAI, Groq, OpenRouter, Together, Azure OpenAI, or a local
Ollama / LM Studio, viaOPENAI_BASE_URL.- Every AI feature works on either provider, including the streaming conversational
command bar (ported to OpenAI function-calling, not just the single-shot commands). - Models are overridable:
ANTHROPIC_MODEL_DEEP/FAST,OPENAI_MODEL_DEEP/FAST. - Defaults to
anthropic, so existing deployments need no changes.
📅 Connect any CalDAV server, not just iCloud
Apple iCloud was the only CalDAV option; now it's any server. (#82)
- Presets for Fastmail and mailbox.org, plus "Other CalDAV server" with a custom
URL — Nextcloud, Radicale, self-hosted, whatever you run. - Usernames no longer have to be email addresses (Nextcloud/Radicale use plain usernames).
- Security: a user-supplied server URL is now DNS-resolved and rejected if it points
at loopback, link-local, or private ranges — a regex check wasn't enough once arbitrary
URLs were allowed.
📱 The mobile app caught up with the web
Seven features that previously existed only on the web now have native screens. (#87)
- CRM connections, Billing/plan, Payouts (Connect balance + withdraw),
Packages & credits. - Team detail — member roster with roles and round-robin weights, add/remove members,
and collective rules. - Group polls — list, create with candidate times, see the per-option tally, finalize.
- Routing forms — list, create, rename, activate/deactivate, delete.
- Cancelling or rescheduling now captures an optional reason, sent to attendees.
New REST endpoints (added because the web read this data server-side, so no JSON
existed — useful to any API consumer, not just the app):
GET /api/integrations/crm · GET /api/payments/status · GET /api/teams/{id} +
DELETE /api/teams/{id}/members/{memberId} · GET /api/polls[/{id}] ·
GET /api/routing[/{id}]
Still web-only on purpose: the deep routing rule-builder and poll option editor render
read-only on mobile.
🔔 Android push is configurable per deployment
Android notifications go through Firebase Cloud Messaging, which needs your Firebase
project — so it's now pluggable rather than absent. (#93)
- Drop a
google-services.jsonintoapps/mobile/, or pointGOOGLE_SERVICES_JSONat
one (an EAS file secret). If it's absent the app still builds and runs — only
Android push stays off, so contributors aren't blocked. - Full runbook in
docs/INTEGRATIONS.md→ Mobile push (Android / FCM). - iOS push and the server side needed no changes; delivery already went through Expo.
🖥️ Website
- The interactive "Ask Otter" demo now sits directly below the hero instead of four
sections down, and replays the reschedule example on scroll. (#94)
Upgrade notes
- No migrations. No schema changes in this range.
- No config required.
AI_PROVIDERdefaults toanthropic; every new variable is
optional and commented out in.env.example. - Want a non-Claude provider? Set
AI_PROVIDER=openaiplusOPENAI_API_KEY(and
OPENAI_BASE_URLfor a self-hosted or third-party endpoint). - Want Android push? Follow the FCM runbook — it needs your own Firebase project.
Full changelog: v0.1.0...v0.2.0
v0.1.0 — first public release
The first tagged cut of DayOtter, marking the point the project became a public,
self-hostable open-source repo. Everything below was already shipped by this
commit — the tag exists so later releases have something to diff against.
Scheduling core
- Booking pages backed by a DST-correct availability engine (integer-ms slot math).
- Calendar sync for Google, Microsoft/Outlook and Apple iCloud, with a cached
busy-block layer and push subscriptions where the provider supports them. - Calendar Inbox, recurring bookings (per-occurrence and whole-series
cancel/reschedule), buffers, and daily/weekly meeting caps.
Otter (AI)
- Confirm-first scheduling assistant: a dashboard command bar and conversational
chat that read your real availability. Otter proposes; you approve — it never
writes to your calendar on its own. - A booking-page assistant so visitors can ask for a time (host-disableable).
- A dedicated AI security module: scope enforcement + prompt-injection guardrails.
Teams, routing & payments
- Teams with round-robin assignment and weights, routing forms, and group polls.
- Stripe Connect (Express): hosts get paid directly, a $100 withdraw threshold,
and refunds that correctly reverse the transfer. - Session packages and prepaid client credits.
Reminders & notifications
- Email, Slack, WhatsApp, SMS (Twilio), browser web push and mobile push.
- Talk to Otter over SMS/WhatsApp, plus an AI voice receptionist.
Platform
- Editions: self-host with every feature free, or the hosted cloud Pro plan.
- Public REST API (v1) with API keys, outbound webhooks with delivery history and
replay, and an in-process plugin SDK. - Native iOS/Android app (Expo).
Hardening
- A security + completeness audit pass (H1–H5, M1–M10 and lower findings):
Connect refund/transfer correctness, package-credit redemption, DST window math,
race-safe meeting caps, and all-day OOO handling. - SSRF-safe outbound fetch and encrypted OAuth token storage.
- SEO/GEO readiness:
llms.txt, an AI-crawler robots policy, per-page keywords,
andAGENTS.md.