Skip to content

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 16 Jul 08:18
· 975 commits to main since this release

Owlat v0.3.0

Self-hosted server

From the admin dashboard → Settings → System & Updates → "Update now", or:

owlat upgrade --version 0.3.0

Manual upgrade (fetch compose + SHA256, verify, apply):

curl -fsSL https://github.com/wolvesdotink/owlat/releases/download/v0.3.0/docker-compose-0.3.0.yml -o docker-compose.yml
curl -fsSL https://github.com/wolvesdotink/owlat/releases/download/v0.3.0/docker-compose-0.3.0.yml.sha256 -o docker-compose.yml.sha256
sha256sum -c <(sed "s|docker-compose-0.3.0.yml|docker-compose.yml|" docker-compose.yml.sha256)
docker compose pull && docker compose up -d
docker compose --profile deploy run --rm convex-deploy

Desktop app

Download the installer for your OS from the assets below (macOS .dmg,
Windows .msi/.exe, Linux .AppImage/.deb). Existing installs
auto-update to this version.

Supply-chain verification (recommended)

cosign verify ghcr.io/wolvesdotink/web:0.3.0 \
  --certificate-identity-regexp "https://github.com/wolvesdotink/owlat/.github/workflows/.*@.*" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"
gh attestation verify docker-compose.yml --repo wolvesdotink/owlat

Images: web, mta, updater, convex-deploy, imap, mail-sync, code-worker, setup — all ghcr.io/wolvesdotink/<name>:0.3.0

What's Changed

Other Changes

  • feat(ui): micro-interaction kit — hover-reveal, spring press, stagger, ticker by @marcelxpfeifer in #180
  • docs: progressive-disclosure standard + PR checklist item by @marcelxpfeifer in #181
  • feat(ui): FF chart kit — UiTrendChart, UiSparkline, UiStatTile, UiBars by @marcelxpfeifer in #182
  • refactor(web): one meaning per word — Team Inbox, All activity, subscription topics by @marcelxpfeifer in #183
  • feat(postbox): labeled segmented view-mode control with server persistence by @marcelxpfeifer in #184
  • feat(web): human trust language for agent confidence + self-check flags by @marcelxpfeifer in #186
  • refactor(web): shared AgentTaskCard system for Reply Queue + Review Queue by @marcelxpfeifer in #187
  • feat(postbox): Today view — the focused default inbox landing surface by @marcelxpfeifer in #188
  • feat(postbox): centered reader overlay + keyboard flow for the Today view by @marcelxpfeifer in #189
  • feat(postbox): Daily Brief card by @marcelxpfeifer in #190
  • feat(marketing): re-add bento grid micro-animations by @marcelxpfeifer in #192
  • feat(web): auto-advance task flow for both agent queues by @marcelxpfeifer in #191
  • chore(marketing): remove the TrustBar highlights strip by @marcelxpfeifer in #193
  • refactor(postbox): one AI home in the thread reader by @marcelxpfeifer in #194
  • feat(postbox): resizable composer popups + dock + focus compose by @marcelxpfeifer in #195
  • feat(inbox): unified status chip + team snooze by @marcelxpfeifer in #196
  • feat(inbox): thread presence — who is viewing, who is replying by @marcelxpfeifer in #197
  • feat(inbox): soft-hold on send/approve while a teammate is replying by @marcelxpfeifer in #198
  • refactor(convex): reduce unbounded .collect()/.filter() and make the gate honest by @marcelxpfeifer in #199
  • feat(inbox): actionable All-activity feed + guided empty state by @marcelxpfeifer in #202
  • refactor(web): IA — the Send section (campaigns, automations, transactional, templates) by @marcelxpfeifer in #203
  • feat(inbox): Team Inbox rows on Postbox row DNA + per-user unread by @marcelxpfeifer in #200
  • feat(inbox): filter pills, needs-attention sort, URL state for Team Inbox by @marcelxpfeifer in #205
  • feat(inbox): assignment people notice — avatar picker, assign-to-me, notify by @marcelxpfeifer in #206
  • refactor(web): IA — first-class Delivery section with live health dot by @marcelxpfeifer in #204
  • refactor(campaigns): 3-step wizard — Setup, Content, Review (A/B opt-in) by @marcelxpfeifer in #207
  • feat(web): global Cmd-K across email objects by @marcelxpfeifer in #208
  • chore(deps): bump better-auth to patched 1.6.x (GHSA-86j7-9j95-vpqj) by @marcelxpfeifer in #211
  • feat(desktop): redesign app icon with brand background by @marcelxpfeifer in #210
  • feat(desktop): per-workspace accent frame + derived tints by @marcelxpfeifer in #214
  • feat(web): sidebar hide (Cmd-) + hover-peek overlay by @marcelxpfeifer in #215
  • feat(desktop): macOS traffic lights follow the sidebar by @marcelxpfeifer in #216
  • feat(desktop): workspace switching — visible, instant-feeling by @marcelxpfeifer in #218
  • feat(desktop): reply-from-notification, compose quick action, compose window memory + spring by @marcelxpfeifer in #219
  • feat(audience): Suppressions under Audience + inline "why no mail?" answer by @marcelxpfeifer in #213
  • feat: instance-level migrationMode flag (default off) by @marcelxpfeifer in #222
  • feat(api): per-user onboarding state (userOnboarding table) by @marcelxpfeifer in #220
  • feat(api): SES bounce & complaint feedback loop via SNS by @marcelxpfeifer in #225
  • feat(campaigns): one command center replaces index/all/reports by @marcelxpfeifer in #209
  • feat(campaigns): report redesign on the chart kit + A/B fold-in by @marcelxpfeifer in #228
  • feat(delivery): the health hub — verdict, trends, domains, thresholds by @marcelxpfeifer in #212
  • feat(desktop): a titlebar that earns its pixels by @marcelxpfeifer in #217
  • refactor(desktop): remove the menu-bar tray icon — close means quit, dock badge for unread by @marcelxpfeifer in #223
  • feat(api): campaignSenders table + send-time enforcement by @marcelxpfeifer in #226
  • feat(web): invite flow — copyable link, resend, mailbox reserved by default by @marcelxpfeifer in #224
  • feat(api): generic SMTP relay send-provider adapter by @marcelxpfeifer in #227
  • feat(api): shared-mailbox membership model (mailboxMembers + access choke point) by @marcelxpfeifer in #221
  • feat(web): admin "Campaign senders" settings page + custom-sender toggle by @marcelxpfeifer in #230
  • feat(web): team page redesign — members table, roles at point of choice by @marcelxpfeifer in #231
  • feat: create a team inbox + manage its members by @marcelxpfeifer in #232
  • feat(web): SMTP relay in the setup wizard with provider presets by @marcelxpfeifer in #233
  • feat(web): one Sending surface — transport card + guided switch by @marcelxpfeifer in #235
  • feat(web): first-login welcome flow + resumable per-user checklist by @marcelxpfeifer in #236
  • feat(web): campaign wizard sender picker replaces free-text from-fields by @marcelxpfeifer in #238
  • feat(web): team inboxes in the Postbox — sidebar, shared read state, stale-reply guard by @marcelxpfeifer in #239
  • feat: invite someone straight into a team inbox by @marcelxpfeifer in #237
  • feat(web): one import wizard for every provider (Gmail + generic IMAP unified) by @marcelxpfeifer in #240
  • feat: open campaigns to editors (guardrail now exists) by @marcelxpfeifer in #241
  • feat: send-as choice — reply as the team or as yourself by @marcelxpfeifer in #242
  • feat(desktop): draw the workspace accent frame in the native macOS window by @marcelxpfeifer in #229
  • feat(web): the fresh-start path — the default welcome by @marcelxpfeifer in #243
  • feat(web): move Audience below Send in the sidebar by @marcelxpfeifer in #244
  • feat: post-import "switch your sending" prompt (outbound-only, gated) by @marcelxpfeifer in #245
  • refactor(api): LLM provider-adapter registry (openai + openai-compatible), resolve env through it by @marcelxpfeifer in #247
  • feat: "Move my mailbox here" — staged full move with MX guidance by @marcelxpfeifer in #246
  • feat(web): rename Organization → Workspace + connected-workspaces manager in settings by @marcelxpfeifer in #249
  • feat(api): native Anthropic language adapter (@ai-sdk/anthropic) + pricing rows by @marcelxpfeifer in #248
  • feat(web): page transitions + a route-progress indicator by @marcelxpfeifer in #254
  • feat: turn the non-invited dead-end into a door (request access) by @marcelxpfeifer in #258
  • refactor(ui): named FF type scale + sweep settings system/operator by @marcelxpfeifer in #261
  • feat(web): optimistic mutations beyond Postbox (generalize the pattern) by @marcelxpfeifer in #252
  • refactor(docs): repair the illustration layer's token discipline by @marcelxpfeifer in #263
  • feat(web): a graceful post-setup restart handoff (no 24s apparent hang) by @marcelxpfeifer in #250
  • feat: provision a mailbox straight from the request (close the loop) by @marcelxpfeifer in #253
  • feat(web): right-click context menus, app-wide by @marcelxpfeifer in #257
  • refactor: kill full-reload navigation (menu, notification-open) by @marcelxpfeifer in #262
  • feat(web): backups in the dashboard — status, schedule, run-now by @marcelxpfeifer in #255
  • feat(web): a real empty-state system across primary list surfaces by @marcelxpfeifer in #251
  • fix(web): sanitize user-authored HTML before v-html in snippets & signatures by @marcelxpfeifer in #265
  • feat(api): Google + OpenRouter language adapters (with OpenRouter listModels) by @marcelxpfeifer in #260
  • refactor(web): extract useAutomationBadges (dedupe automation badge helpers) by @marcelxpfeifer in #268
  • feat(web): in-app transport editor (change sending provider without the CLI) by @marcelxpfeifer in #256
  • fix(web): verify the compose template on self-update (parity with system/update) by @marcelxpfeifer in #270
  • feat(setup): one-time token gate on the unauthenticated setup endpoints by @marcelxpfeifer in #269
  • fix(web): collapse the stacked onboarding checklists into one gated flow by @marcelxpfeifer in #274
  • refactor: sweep Fowler code smells across the monorepo by @marcelxpfeifer in #266
  • refactor(api): rename convex organizations module → workspaces by @marcelxpfeifer in #259
  • feat(api): aiProviderConfig table + encrypted key store + save/get/test functions by @marcelxpfeifer in #281
  • refactor(api): resolveAiConfig(ctx) + rename getLLMProvider → resolveLanguageModel across all call sites by @marcelxpfeifer in #282
  • feat(api): local-by-default embedding plane (+ optional hosted override, dimension guard) by @marcelxpfeifer in #283
  • feat(web): AI provider settings page (provider/model/key/base-url/embeddings + Test connection) by @marcelxpfeifer in #284
  • feat: first-login "Connect your AI" step + treat a stored key as satisfying the ai flag by @marcelxpfeifer in #285
  • feat: Azure adapter + live model picker + per-provider spend labels + Connect-your-AI docs by @marcelxpfeifer in #286
  • fix(api): mark the SMTP send-provider chain as 'use node' by @marcelxpfeifer in #287
  • feat(web): branded SPA cold-boot splash instead of a blank window by @marcelxpfeifer in #288
  • feat(web): collapse stacked onboarding surfaces into one adaptive Getting started by @marcelxpfeifer in #289
  • feat(inbox): sender-trust gate + code-agent injection check for inbound feature requests by @marcelxpfeifer in #272
  • fix(web): stop auth proxy trusting client X-Forwarded-For (rate-limit bypass) by @marcelxpfeifer in #264
  • fix(api): hardening bundle — multipart cap, rate-limit warn, audit attribution, api-key expiry by @marcelxpfeifer in #273
  • refactor(api): unify email normalization on @owlat/shared normalizeEmail by @marcelxpfeifer in #271
  • refactor(web): shared capitalize, personInitials, SendStatusBadge, webhook status map by @marcelxpfeifer in #276
  • refactor(web): remove avoidable unsafe casts and non-null-assertion clusters by @marcelxpfeifer in #277
  • fix(web): build requireAdmin token URL from trusted config; document internal routes by @marcelxpfeifer in #267
  • fix(web): confirm irreversible one-click destructive actions by @marcelxpfeifer in #275
  • feat: smooth invites on a brand-new instance (pre-domain-verification) by @marcelxpfeifer in #291
  • feat(desktop): native file dialogs + OS file-drop for uploads by @marcelxpfeifer in #290
  • feat(setup): persist wizard progress so a refresh does not wipe it by @marcelxpfeifer in #292
  • refactor(api): adopt getOrThrow for hand-rolled load-or-404 sites by @marcelxpfeifer in #294
  • refactor(marketing): adopt the shared button kit + type scale by @marcelxpfeifer in #278
  • feat(web): one delivery-readiness surface (transport + domain + DKIM/SPF/MX, one truth) by @marcelxpfeifer in #280
  • refactor(web): route list/detail reads through UiQueryBoundary (stop errors reading as empty) by @marcelxpfeifer in #293
  • feat(inbox): optimistic triage + undo for the agent inbox (Postbox parity) by @marcelxpfeifer in #296
  • feat(web): an honest first send — never complete it without a transport by @marcelxpfeifer in #295
  • feat(web): content-shaped skeletons instead of spinners on major surfaces by @marcelxpfeifer in #279
  • fix(web): make interactive rows keyboard-operable and labelled by @marcelxpfeifer in #297
  • feat(web): wire useUnsavedChanges into the editors that silently discard work by @marcelxpfeifer in #298
  • feat(web): make receiving (MX) setup visible before inbound is enabled by @marcelxpfeifer in #299
  • refactor(web): consolidate status-badge styling on semantic FF tokens by @marcelxpfeifer in #300
  • refactor(web): useRouteId helper for branded route-param ids by @marcelxpfeifer in #302
  • refactor(ui): consolidate the component kit (shared UiSpinner, UiModal conversion, z-index + label tokens) by @marcelxpfeifer in #301
  • refactor(web): split the three oversized SFCs (no behavior change) by @marcelxpfeifer in #303
  • refactor(api): adopt getOrThrow for the hand-rolled load-or-404 sites by @marcelxpfeifer in #306
  • feat(ui): type-aware toast lifetimes + info/warning types + assertive error announcements by @marcelxpfeifer in #304
  • docs(web): fix cookie-forwarding attribution in internal token-url note by @marcelxpfeifer in #305
  • Local-dev experience batch: auth.config root fix, dev auto-connect, seeded mailboxes, builder preview parity by @marcelxpfeifer in #307
  • fix(ui): keep content clear of the fixed desktop titlebar by @marcelxpfeifer in #309
  • fix(desktop): stop registering Cmd/Ctrl+K as a system-wide shortcut by @marcelxpfeifer in #308
  • Sidebar context toggle: Inbox ↔ Marketing by @marcelxpfeifer in #311
  • fix(web): collapse duplicated Postbox navigation into a single sidebar link by @marcelxpfeifer in #310
  • Remove the dashboard bottom status bar by @marcelxpfeifer in #313
  • fix(web): wire room selection and create-dialog navigation on chat index page by @marcelxpfeifer in #312
  • Admin team-inbox management, multi-team switching polish, and seeded team-inbox demo data by @marcelxpfeifer in #314
  • feat: Sealed Mail P0 scaffolding — CI triggers, openpgp, flags, createSecretBox, fixtures by @marcelxpfeifer in #316
  • feat: persist SPF/DKIM/DMARC verdicts on both inbound paths (Sealed Mail A1) by @marcelxpfeifer in #318
  • feat(api): thread auth verdicts into the reader queries (Sealed Mail A2) by @marcelxpfeifer in #320
  • feat(mta): outbound TLS policy switch + relay TLS floor by @marcelxpfeifer in #319
  • feat(mta): seal DKIM keys + relay credentials at rest by @marcelxpfeifer in #317
  • feat(web): sender-authentication badge + reply guard (flag senderAuthBadges) by @marcelxpfeifer in #321
  • feat: sender-impersonation heuristics (scanner rule + ingest-side flags) — Sealed Mail A4 by @marcelxpfeifer in #322
  • feat: TLS-RPT inbound ingestion + delivery-page dashboard by @marcelxpfeifer in #324
  • feat: publish our own MTA-STS policy (RFC 8461) by @marcelxpfeifer in #323
  • refactor(api): getMessageBody() accessor over all message-body reads + CI ratchet by @marcelxpfeifer in #327
  • feat: inbound ARC verification with trusted-forwarder overrides (Sealed Mail A5) by @marcelxpfeifer in #328
  • feat: outbound DMARC-alignment guard in delivery readiness + From pickers by @marcelxpfeifer in #325
  • feat(mta): DANE at send time (flag DANE_ENABLED) by @marcelxpfeifer in #329
  • feat(api): E2EE key vault + WKD publication + signed instance manifest (flag sealedMail) by @marcelxpfeifer in #326
  • feat(api): recipient key discovery + TOFU pinning by @marcelxpfeifer in #330
  • feat(api): outbound sealing — PGP/MIME with protected headers (flag sealedMail) by @marcelxpfeifer in #331
  • fix(api): mint GnuPG-compatible OpenPGP keys (legacy curve25519 profile) by @marcelxpfeifer in #333
  • feat(api): inbound unsealing + signature verification (decrypt-on-ingest) — Sealed Mail E4 by @marcelxpfeifer in #332
  • feat(web): trust surfaces — composer lock, sealed badges, key-change banner (Sealed Mail E5) by @marcelxpfeifer in #334
  • test(api): two-instance E2EE proof suite + manual QA script (Sealed Mail E7) by @marcelxpfeifer in #335
  • feat(api): key lifecycle — rotation, revocation, recovery kit (Sealed Mail E6) by @marcelxpfeifer in #337
  • feat(api): sealed at rest — seal all message bodies with an instance data key (Sealed Mail E8b) by @marcelxpfeifer in #336
  • fix: address PR #338 review findings by @marcelxpfeifer in #339
  • Sealed Mail — E2EE between instances, sender authenticity, transport security by @marcelxpfeifer in #338

Full Changelog: v0.2.1...v0.3.0