Matthew Meszaros
|
0ae4db2c41
|
feat: make self-hosted auth work without a mail relay by rewriting the platform SMTP transport with real AUTH and TLS (it did neither, so SMTP_USERNAME/SMTP_PASSWORD were dead and every documented relay was unreachable), adding MAIL_TRANSPORT=smtp|log|ses with a log transport that prints codes so a fresh install can sign in with no relay, demoting the emailed login code to AUTH_LOGIN_CODE=always|new_device|off (off on self-host, per NIST SP 800-63B and OWASP ASVS), claiming the first owner through a single-use setup link or WARMBLY_BOOTSTRAP_* instead of register-then-psql, deriving every emailed URL from APP_URL rather than a hardcoded app.warmbly.com that leaked live reset tokens to the vendor, fixing the confirm hooks that read path params against paramless routes and broke login, register and reset confirmation in the dashboard everywhere, adding generic OIDC with PKCE, one-time state, verified nonce and (issuer,subject) identity binding, enforcing 2FA on the social paths that skipped it, adding a per-IP limiter and trusted-proxy handling to the unthrottled auth group, refusing boot on the published default secrets, and dropping mailpit from the default stack (#99)
|
2026-08-14 14:57:09 +02:00 |
|
Matthew Meszaros
|
10217039f0
|
feat: undo send in the iOS app: instant compose and reply sends swap the sent toast for a dark UndoSendBanner capsule counting down to the server's scheduled_at with an Undo button that cancels via DELETE unibox/scheduled/:task_id, compose undo reopens the sheet through the draft-resume path with the full payload and reply undo re-presents UniboxComposer prefilled from a UniboxReplySnapshot, 404 collapses to an Already sent toast, expiry flips the capsule to Sent briefly, and the User model gains undo_send_seconds (default 30 when absent)
|
2026-07-19 18:53:21 +02:00 |
|
Matthew Meszaros
|
0c6ef58bd8
|
feat: iOS core plumbing for the AI + compose port: APIClient gains a native SSE stream method (Bearer-attached byte stream with one refresh retry on 401, data:-line parsing, 600s timeout for long agent runs, task cancellation aborts the run server-side), OrgPermissions gains the Use AI bit (32768), and the realtime spine maps the ai_session audit entity to a new ai invalidation domain
|
2026-07-19 15:04:35 +02:00 |
|
Matthew Meszaros
|
d6b7885e8b
|
feat: mobile push notifications end to end - APNs provider-token client, device_tokens table with session-scoped register/delete endpoints, a push channel in notification preferences (web + iOS toggles), and Redis-backed immediate-then-digest batching (first event pushes now, bursts summarize when the 5h window closes) wired in backend and consumer, with iOS registration/badge sync and docs for the channel, endpoints, and APNS_* deploy env
|
2026-07-13 16:11:15 +02:00 |
|
Matthew Meszaros
|
38f32abb91
|
feat: close the iOS realtime gaps against the web spine - route EMAIL_STATUS/EMAIL_ERROR to mailboxes+analytics, SUBSCRIPTION/PLAN/BILLING/LIMIT to billing, DEAL and BOOKING to CRM, refresh analytics on inbox arrivals, and add a foreground socket nudge so a suspension-killed connection recovers instantly instead of ~30s late
|
2026-07-13 16:10:47 +02:00 |
|
Matthew Meszaros
|
b379be9732
|
feat: qualify self.task in the openSocket admission check - with the type-checker crash worked around, Xcode 26.6 surfaces the real diagnostic: the locked closure's bare 'task' resolves to the local declared later in the function and is rejected as captured before declaration
|
2026-07-11 10:44:57 +02:00 |
|
Matthew Meszaros
|
04cf24c98d
|
feat: hoist the socket url resolution out of the guard condition entirely - across three CI crashes the Xcode 26.6 type checker dies whenever the async urlProvider closure property is bound or awaited inside a guard condition under StrictConcurrency, so the read, the await and the unwrap are now three plain statements
|
2026-07-11 10:41:26 +02:00 |
|
Matthew Meszaros
|
da1a6efbf8
|
feat: make the websocket urlProvider a non-optional closure with a nil-returning default because the Xcode 26.6 type checker also crashes on referencing an optional async closure property, not just on optional-chained calls; behavior is unchanged (nil result still schedules a reconnect)
|
2026-07-11 10:37:33 +02:00 |
|
Matthew Meszaros
|
e5f5623dc4
|
feat: unblock iOS CI - unwrap the websocket urlProvider in two steps because 'await urlProvider?()' crashes the Xcode 26.6 Swift type checker (works on 27), and build only the arm64 simulator slice in CI since the generic destination was doubling the compile for no extra signal
|
2026-07-11 10:34:07 +02:00 |
|
Matthew Meszaros
|
928e1924b2
|
feat: iOS session handling survives network blips and explains sign-outs - token refresh only drops the session on definitive rejections (network errors rethrow and keep tokens), a missing token now kicks cleanly to sign-in instead of hanging, and the auth welcome step shows an amber session-expired notice when the app signed the user out
|
2026-07-11 10:12:41 +02:00 |
|
Matthew Meszaros
|
9e77738c5f
|
feat: keep users signed in through backend outages - bootstrap distinguishes a real 401 (clear token, show sign-in) from an unreachable or erroring server, which now lands on a sky unreachable screen that keeps the session and retries automatically every few seconds
|
2026-07-07 07:27:16 +02:00 |
|
Matthew Meszaros
|
b4fde65a7d
|
feat: iOS environment wiring - AppConfig backend/websocket endpoints, the observable AppEnvironment composing API/session/realtime/badges, and app entitlements for Sign in with Apple
|
2026-07-07 05:57:59 +02:00 |
|
Matthew Meszaros
|
4f55903165
|
feat: iOS realtime layer - Phoenix channels websocket client with heartbeats and rejoin backoff, org/user channel subscriptions, presence state sync, and per-feature event pulses driving live query invalidation
|
2026-07-07 05:57:11 +02:00 |
|
Matthew Meszaros
|
5710c86d9e
|
feat: iOS core layer - async APIClient with idempotency keys and typed errors, Codable models mirroring the backend wire contracts (including the Group title key), session store with permission checks, and a keychain-backed token store
|
2026-07-07 05:57:01 +02:00 |
|