Commit Graph
100 Commits
Author SHA1 Message Date
Arjun Patel 8ed8e2cccb use sexier audio waveform 2026-06-11 09:55:04 -07:00
Arjun PatelandGitHub cf94003b3f chore: bump desktop to v1.5.2 (#257) 2026-06-10 16:38:22 -07:00
Arjun PatelandGitHub aa2b2f7432 show private indicator for appropriate streams (#255)
* show private for sterams with no other members

* invalid calculation

* refactor: more readable code

* fix type error

* format
2026-06-09 12:38:52 -07:00
Arjun PatelandGitHub e886c56dd9 fix: prebundle deps before loading electron app (#254)
Electron Forge restarts the renderer process without fully restarting the Vite dev server, so the browser gets a fresh page with a new hash but the Vite server still has the old pre-bundle cache — mismatch causes the 504 outdated error every other time we launch.
2026-06-09 11:11:01 -07:00
Arjun PatelandGitHub 946d141897 infra: cleanup tsconfig and add typecheck (#253) 2026-06-09 10:47:48 -07:00
Arjun PatelGitHubCodeRabbitcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
92894c4af8 paginate open streams (#252)
* paginate for open and closed streams

* fix: add platform abstraction for deeplink (#251)

* fix: add platform abstraction for deeplink

This was crashing App.tsx due to the deep link listener calling methods on window which do not exist.

* fix: apply CodeRabbit auto-fixes

Fixed 1 file(s) based on 1 unresolved review comment.

Co-authored-by: CodeRabbit <[email protected]>

* log error

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <[email protected]>

* cleanup

* fix: import

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <[email protected]>
2026-06-09 10:43:27 -07:00
Arjun PatelGitHubCodeRabbitcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
f38835ceee fix: add platform abstraction for deeplink (#251)
* fix: add platform abstraction for deeplink

This was crashing App.tsx due to the deep link listener calling methods on window which do not exist.

* fix: apply CodeRabbit auto-fixes

Fixed 1 file(s) based on 1 unresolved review comment.

Co-authored-by: CodeRabbit <[email protected]>

* log error

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <[email protected]>
2026-06-09 10:01:22 -07:00
Arjun PatelandGitHub a94a986fbf fix: invalid dock badge count (#250) 2026-06-09 09:28:55 -07:00
Arjun PatelandGitHub 1aceab582c docs typo (#248) 2026-06-09 09:12:03 -07:00
Arjun PatelandGitHub c1f5b6c8c1 Implement membership notifications and deep-link handling for Electron desktop app (#246)
* security: add cors for desktop app scheme

* Revert "security: add cors for desktop app scheme"

This reverts commit d450fced75.

* ignore tags

* add commands for windows dev

* cleanup unnecessary parts of main desktop process

* resolve lint errors

* add format command for go

* fix: send email on new member joining

Closes #228

* add proper deeplinking on desktop

The desktop app was merely focusing before, but now it will navigate to the proper route

* honor email notifications setting

* prevent sending email when no recipients
2026-06-09 08:04:18 -07:00
Arjun PatelandGitHub 9184d002d3 update copy for sign in views (#238)
* update copy for sign in views

This disambiguates whether the view is for sign up or sign in.

* format

* escape character

* format

* update workflow names
2026-06-02 09:39:11 -07:00
Arjun PatelandGitHub 0439c51c2e docs (#237) 2026-06-02 08:56:29 -07:00
Arjun PatelandGitHub 628c191137 ci: add pr quality gate for golang (#236)
* ci: add pr quality gate for golang

* test formatting error

* fix job

* format
2026-06-02 08:46:01 -07:00
Arjun PatelandGitHub 79cc14490a chore: bump mobile version to v0.6.1 (#235) 2026-06-02 08:40:36 -07:00
Arjun PatelandGitHub 99622743c9 chore: bump desktop version to v1.5.1 (#234)
* create runbook for deployments

* create runbook for deployments
2026-06-02 08:40:10 -07:00
Arjun PatelandGitHub fa3c8268b2 infra: add pr quality gate for client applications (#233)
* add gh action for quality gate

* test quality gate

* fix job

* rename gh action jobs

* format
2026-06-02 08:04:58 -07:00
Arjun PatelandGitHub a8a0b7db1b infra: add linting and formatting for js projects (#230)
* wip

* wip

* wip

* format

* wip(mobile): lint and format

* cleanup

* nits

* nits

* idiomatic react

* nit

* format all root files
2026-06-02 07:44:24 -07:00
Arjun Patel 2fe562ce2b fix: editing text particle not updating immediately
Closes #229
2026-06-01 10:03:34 -07:00
Arjun Patel fb771a7408 update email notification cta 2026-05-31 12:39:38 -07:00
Arjun Patel 189d5e296b ci: remove artifact uploads during windows build
Resolves issues with artifact storage being full
2026-05-30 12:04:02 -07:00
Arjun Patel 613a350292 chore: bump versions 2026-05-30 11:12:08 -07:00
2eba834838 feat: use inline markdown editor (#227)
* Use inline WYSIWYG markdown editor for long text messages

Desktop: replace the Write/Preview tab toggle in the compose card with
MDXEditor, an inline WYSIWYG that renders markdown as you type (Obsidian/
Notion feel) and round-trips plain markdown, matching how particle content
is stored. Immersive mode is unchanged — short, plain notes still get the
centered large-type textarea, and ⌘+M still drops into the rich editor.
Shortcut handling moves to the capture phase so ⌘+Enter / Esc win over the
editor's own key handling.

Mobile: render markdown on the display side via react-native-marked's
useMarkdown hook (no FlatList, so it nests cleanly in the existing
ScrollView). Mirrors desktop's immersive-vs-card logic: short plain notes
stay centered; anything with markdown renders formatted instead of showing
raw syntax. Composer stays plain text.

https://claude.ai/code/session_019DU6V5z6Nr4Vu7b1fBDnq4

* cleanup desktop app description

* Fix markdown editor rendering and pasted-link duplication

- Restore heading/list typography in the editor: MDXEditor relies on the
  browser's default styles for <h1>/<ul> sizing, which Tailwind's Preflight
  resets. Markdown shortcuts fired but the block looked unchanged. Style the
  editor content explicitly, mirroring the rendered display.
- Keep pasted/typed URLs as plain text (linkPlugin disableAutoLink) so they
  don't become `[url](url)`, which duplicated both the URL and its preview
  card. Also dedupe extractUrls defensively so a repeated URL yields one card.

https://claude.ai/code/session_019DU6V5z6Nr4Vu7b1fBDnq4

* Complete GFM support: tables, task lists, strikethrough

Editor: add tablePlugin so markdown tables round-trip and render. Task
lists (`- [ ]`), strikethrough, code (inline + fenced), headings, lists,
quotes, and links already work via listsPlugin/core/markdownShortcut. CSS:
suppress the disc bullet on task-list items (they draw their own checkbox)
and style tables.

Display: render task-list checkboxes (no stray bullet), GFM tables, and
strikethrough so the read view matches what the editor produces.

https://claude.ai/code/session_019DU6V5z6Nr4Vu7b1fBDnq4

* Unify markdown on one engine (Milkdown Crepe)

Replace the two-engine setup (MDXEditor for editing + react-markdown for
display) with a single Crepe-based component used for both. Editing is inline
WYSIWYG with full GFM that actually works — task lists, tables, and code
blocks via type-to-create / the slash menu — and read-only mode renders the
exact same way, so write and read can no longer drift (the root cause of the
heading/list/table/checkbox bugs).

- markdown-editor.tsx: Crepe wrapper supporting edit + readOnly, themed to the
  glass card via --crepe-* variable overrides (scoped to .milkdown so they win
  over frame-dark's own definitions).
- text-particle-view.tsx: render the message card with the read-only editor;
  drop the react-markdown component map.
- Remove now-unused deps: @mdxeditor/editor, react-markdown, remark-gfm,
  rehype-highlight, highlight.js.

The compose immersive mode (short, centered plain text) is unchanged.

https://claude.ai/code/session_019DU6V5z6Nr4Vu7b1fBDnq4

* Fix Crepe slash-menu transparency and match the app font

The floating menus (slash menu, toolbar, link tooltip) portal to <body>,
outside .milkdown, so the --crepe-* overrides never reached them and their
background fell back to transparent — unreadable over the content. Declare the
palette on those selectors too, keep --crepe-color-surface (near-)opaque so the
menus read clearly, and add a backdrop blur.

Also set --crepe-font-default/title to inherit (and a monospace stack for code)
so the editor uses the application font instead of Crepe's bundled Noto faces.

https://claude.ai/code/session_019DU6V5z6Nr4Vu7b1fBDnq4

* Give the slash menu the full card by padding the editor, not the card

Crepe appends the slash menu to .milkdown and (in this version) doesn't expose
a way to portal it to <body>, so it's clipped by the editor's scroll box. That
box sat inside the card's p-5 padding, so the menu cut off at the padding edge.
Move the padding onto the ProseMirror content instead and drop the redundant
inner scroll container, so the menu's clipping bounds become the full card.

https://claude.ai/code/session_019DU6V5z6Nr4Vu7b1fBDnq4

* tweaks

* mobile: render markdown text consistent with desktop

---------

Co-authored-by: Claude <[email protected]>
2026-05-30 11:10:49 -07:00
7b000429e9 mobile: follow a just-sent particle when at the end of a stream (#226)
When the local user sends a particle while positioned on the last one in a
stream, advance playback to the newly created particle so they stay caught up
and the stream isn't left in an unseen state. If they're browsing earlier
particles, their position is left untouched.

The mobile reducer only auto-advanced on PARTICLE_ADDED when status was
already "ended", so sending while sitting on (but not finished with) the last
particle left it unseen. This threads an onParticleCreated callback from
ComposeDock's default send paths up to StreamView, which follows the particle
via goToParticle only when currentIndex is the last slot — mirroring desktop's
StreamView.handleParticleCreated.

Co-authored-by: Claude <[email protected]>
2026-05-30 11:09:44 -07:00
Arjun Patel 0cd126818a adjust email invitation copy 2026-05-29 11:21:34 -07:00
Arjun Patel 832ebe9376 chore: bump version 2026-05-28 13:08:04 -07:00
Arjun Patel 9645391f6a chore: bump version 2026-05-28 12:46:03 -07:00
Arjun PatelandGitHub 0ae3ab5505 cleanup desktop and mobile assets and icons (#223)
This fixes quirks for different platforms
2026-05-28 12:45:25 -07:00
Arjun Patel 3bfc15945d infra: add cross-platform tooling with Taskfile 2026-05-28 11:21:57 -07:00
talksik 91abacc2de chore: bump version 2026-05-28 10:30:44 -07:00
Arjun Patel e5d1349ad7 feat: paginate stream page indicator
Closes #221
2026-05-28 10:12:41 -07:00
Arjun Patel 563c91e7d5 infra: add logging wrapping
Resolves issues with gcp cloud logging quirks such as field names
2026-05-27 15:49:27 -07:00
Arjun Patel e804cee229 refactor: use slog instead of logrus 2026-05-27 15:20:53 -07:00
Arjun Patel 72bc41733f chore: bump version 2026-05-26 17:22:38 -07:00
96f5a727d6 feat(mobile): add support for huddles to mobile app (#219)
* feat(mobile): add huddles with LiveKit

Mirrors the desktop huddle window: tap the headphones button on a stream
to fetch a LiveKit token from Orion and join a video room. Active huddles
show a red badge on the stream card (participant count) and a red Join
pill in the stream top bar — both driven by huddle_active_participants
synced from the LiveKit webhook.

The HuddleScreen lives at its own route (not a modal/window): video tile
grid with placeholders for camera-off, mic/camera toggles, and a leave
button. Adds the LiveKit RN SDK plus the WebRTC + LiveKit Expo config
plugins for prebuild.

https://claude.ai/code/session_01Po5tAD17MXhnqGQ9hKh6PC

* fix(mobile): exiting from huddle

* fix: pause stream during huddle

---------

Co-authored-by: Claude <[email protected]>
2026-05-26 16:37:37 -07:00
Arjun Patel 746e52158d ci: fix build dep 2026-05-26 15:41:54 -07:00
Arjun PatelandGitHub 64f02d1c3b feat: ship a web app (#218)
* feat(orion): add endpoint for link metadata

* refactor: cleanup comments

* wip: plumbing for building a web app

* setup deployment materials for web app

* fix(web): favicon
2026-05-26 15:37:35 -07:00
Arjun Patel 173c63508a fix(mobile): unregister push token on invalid session 2026-05-26 10:43:15 -07:00
Arjun Patel 54bc77444b chore: bump version 2026-05-26 10:27:09 -07:00
Arjun Patel 636ef484ad feat(mobile): allow rear camera recordings
Closes #211
2026-05-26 10:24:54 -07:00
Arjun Patel 0eddf4639a fix(mobile): properly pause and resume other audio during recording 2026-05-26 10:21:42 -07:00
Arjun Patel e7fed5f037 feat(mobile): edit text messages 2026-05-26 10:10:49 -07:00
Arjun Patel ec01ca77e4 fix(mobile): sign in race condition
Closes #217
2026-05-26 10:00:52 -07:00
Arjun PatelandGitHub d262f734f0 Mobile notifications for iOS (#210)
* mobile: wire notification registration and listener

* implement backend components for push notifications

* refactor: agentic comment cleanup

* docs: use proper module name for particle processor

* set required env variables for push notifications

* bump version

* fix: always upsert push token on mobile start

* Revert "fix: always upsert push token on mobile start"

This reverts commit 90ff18a788.

* send push notifications regardless of online status
2026-05-18 12:44:31 -07:00
talksik a564ea819b bump version 2026-05-17 16:52:23 -07:00
talksik 9fd28e26a0 bump version 2026-05-17 16:52:09 -07:00
talksik 2492188c50 fix: prevent nesting of formatted text reactions
Usage of map was causing issues if the text reaction had special
characters.

Closes #205
2026-05-17 16:51:37 -07:00
talksik 4b468ed1ae chore: bump version 2026-05-01 09:24:07 -07:00
talksik ff2ed72e22 perf: reduce mobile video size
Improves upload and playback speed
2026-05-01 09:23:52 -07:00
talksik 127c57fa7c chore: bump version 2026-04-30 18:21:14 -07:00
talksik 1a08bfac8c chore: bump version 2026-04-30 17:57:14 -07:00
talksik 5b8aefd994 mobile: improve usability for exiting stream 2026-04-30 17:52:37 -07:00
talksik 43ad4d3b62 mobile: show transcript preview for media particles in stream list 2026-04-30 17:49:13 -07:00
talksik 13d3df2b51 mobile: consistent dark theme as desktop 2026-04-30 17:46:09 -07:00
talksik 424f27737b feat: improve usability with clickable keyboard hints
This allows people to use the app even if they aren't used to their
keyboard.
Closes #186
2026-04-30 17:45:03 -07:00
talksik aaf9ad4518 show progress during upload
More explicit feedback of the state of their upload. Also prevents
recording more media at the same time or interacting with the stream
which would feel stale to the human since they just created something
and it's yet to be present in the stream.
2026-04-30 17:23:17 -07:00
talksik 3051b1558f feat: captions on mobile
Closes #199
2026-04-30 17:14:15 -07:00
talksik a6a4757a8e fix: stream actions not working
Multiple sheets compete with each other and cause silent failure on ios.
2026-04-30 16:53:48 -07:00
talksik 6832c273cd fix: prevent restart playback after transcoding completion
Closes #201
2026-04-30 16:39:23 -07:00
talksik 39ac3ed290 create backfill for transcoding media particles
Closes #192
2026-04-30 08:20:24 -07:00
talksik 89906dba7c refactor: abstraction for transcoding 2026-04-30 07:30:55 -07:00
talksik 91a2030f9b fix: worker utilizing incorrect bucket 2026-04-30 07:04:50 -07:00
talksik ef7d5bfa59 fix desktop playback aspect ratio for mobile 2026-04-29 18:17:45 -07:00
Arjun PatelandGitHub e3461dd5cd mobile v0.1 with deployment for ios (#191)
* stage 1: project init

* stage 2: skeleton with navigation

* step 2.5: streams list

* step 4: stream playback experience

* step 5-6: compose experience

* fix: broken record

* transcode media particles to mp4

* build: reproducible go generate

* build: rename skaffold module for particle processor worker

* infra: increase particle processor worker resources

Was dealing with OOM errors

* tweaks to mobile

* log transcode work

* view on desktop placeholder

* tweak padding

* cap video resolution to save on memory

* infra: bump memory limits as insurance

* ux improvements

* update bundle id for mobile

* config for mobile
2026-04-29 17:39:11 -07:00
Arjun Patel 3a11a82cd3 refactor: organize desktop vs. mobile into separate folders 2026-04-29 08:42:56 -07:00
Arjun Patel 3d9fe67936 chore: bump version 2026-04-29 07:55:38 -07:00
Arjun Patel aacea01c1f feat: text reactions
Closes #180
2026-04-29 07:44:26 -07:00
Arjun Patel eb1e77b4c1 fix: allow next / prev particle during pause 2026-04-29 07:16:39 -07:00
Arjun Patel 1f2ab9b752 show keyboard hints for space pause 2026-04-29 07:16:16 -07:00
Arjun Patel a216b0722f fix: go to new local particle after creation
If human is on the last particle of the stream and creates a new one, this would navigate them there, as it makes sense to consider them caught up.
2026-04-29 06:49:13 -07:00
Arjun Patel f642d13ba1 feat: allow toggle stream-view play/pause 2026-04-29 06:16:24 -07:00
Arjun Patel 70087cf4e5 refactor: precondition for record toggle 2026-04-29 06:11:57 -07:00
Arjun Patel 0f73d685c2 refactor: narrow auth service to smaller units
Easier for testing, and omits need for full dep injection for pusher service, where we passed in nil for deps dangerously.
2026-04-27 16:14:37 -07:00
Arjun Patel 48d6d5cb07 refactor: unit testable units and cleaner dep injection 2026-04-27 16:07:28 -07:00
talksik 013c453dd3 chore: bump version 2026-04-25 14:25:42 -07:00
talksik 6b755a426b feat: add sound effects for hud actions
Closes #174
2026-04-25 14:25:24 -07:00
talksik 13c6bbd0fb refactor: re-structure stream playback control 2026-04-25 13:48:37 -07:00
talksik cf143f232d fix: prevent exit countdown during editing text 2026-04-25 13:10:32 -07:00
talksik a686d85e96 fix: papercuts around last particle in stream
Pause when holding space during close countdown. Prevent arrow keys
starting exit countdown when on last particle
2026-04-25 13:06:26 -07:00
talksik 03ced6d180 fix: pause playback during delete particle overlay 2026-04-25 12:49:01 -07:00
talksik 1c3b4447cf infra: hook up sentry 2026-04-25 12:43:30 -07:00
talksik 1e7a14d703 fix: set proper cluster name 2026-04-24 16:14:57 -07:00
talksik 0ac395ceb6 refactor: unused imports 2026-04-22 09:13:49 -07:00
talksik 110f4594be refactor: use shared mocks for tests 2026-04-22 09:06:10 -07:00
talksik 2e9ff742a0 send admin alert when new network created 2026-04-22 08:50:03 -07:00
64a21198b3 Add comprehensive error handling and recovery UI (#173)
* feat(electron): error handling foundation

Adds the infrastructure for a coherent client-side error story:

- `lib/errors.ts`: canonical ApiError + QuotaExceededError, `toUserMessage`
  (friendly strings for ApiError/ZodError/network errors, strips Electron
  IPC message prefixes), `logError` (expected), `reportError` (unexpected).
- `lib/query-client.ts`: QueryClient factory with sane retry defaults (no
  retry on 4xx except 408/429, 2 retries otherwise; 0 mutation retries),
  `QueryCache` onError logs + opts in via `meta.toastOnError`, and
  `MutationCache` onError toasts `toUserMessage(err)` by default with
  `meta.suppressToast` as the opt-out.
- `components/app-error-boundary.tsx` + `error-fallback.tsx`: two boundaries
  (top-level outside the router, route-level inside) with a Card-based
  fallback offering 'Go home' + 'Try again'. Route boundary resets on
  pathname change and clears React Query error cache on retry.
- `main/ipc-utils.ts` + main.ts migration: `safeHandle` wraps ipcMain.handle
  so main-process failures log with full stack and surface a sanitized
  message to the renderer. `link:fetch-metadata` keeps its null contract
  but now logs.
- `useCreateParticle` opts out of the global toast (compose-overlay renders
  its own quota UX) so nothing double-toasts.

Render crashes now have a recovery UI, every mutation gets a free error
toast, and silent-catch cleanup + Sentry land in follow-up PRs.

* refactor(errors): defer mutation errors to global handler

Now that MutationCache toasts via toUserMessage by default, the per-hook
onError duplicates drop away. Also normalizes inline query-error UI and
surfaces a previously-silent failure.

Mutations — removed redundant onError toasts:
- network-selector: useAcceptInvitation, createNetwork (inline)
- network-settings: useInviteMembers, useRevokeInvitation, useRemoveMember
- network-billing: useCreateCheckoutSession, useCreatePortalSession
  (onSuccess toasts stay — they carry domain context like network name)

Queries — consistent inline error UX via toUserMessage:
- network-selector: failed-to-load state gets a "Try again" button
- network-billing: "Couldn't load billing" includes friendly reason
- network-settings: useNetworkInvitations failure now surfaces a hint
  (previously rendered as "0 pending" — silently wrong)

Trimmed noisy JSDoc from PR 1 files (errors.ts, query-client.ts,
app-error-boundary.tsx, error-fallback.tsx, ipc-utils.ts).

* refactor(errors): route silent catches through logError/reportError

Every catch now either surfaces, re-throws, or calls logError with a scope
tag. No more empty catches or bare console.error:

- auth-store: signInToFirebase / restoreSession / signOut paths gain
  logError context. Behavior is unchanged (best-effort local sign-out,
  fall back to login on restore failure).
- use-stream-autoplay: Audio.play() and download-URL fetches log their
  failures instead of dropping silently (both are nice-to-haves so UX
  stays silent — but we can now trace "why didn't autoplay trigger?").
- pusher-client: ws errors / parse failures / server errors / listener
  crashes all routed through logError, and listener bugs (which silently
  break user flows) now go through reportError so they're actually
  surfaced in observability.
- settings-page: email-notifications toggle now toasts on failure
  instead of silently reverting with no explanation.
- huddle-app: screen-share failures use logError.

* feat(errors): add Sentry observability behind a sinks facade

logError / reportError now route through a pair of sinks installed at
bootstrap by each process (main + every renderer entry). No call site
knows about Sentry — if sentryDsn is empty, the sinks simply aren't
installed and logError/reportError stay console-only.

- appConfig.sentryDsn: per-env string (empty for now — populate when
  ops creates the DSNs). Empty is the no-op mode for dev.
- lib/errors.ts: installErrorSinks({ capture, breadcrumb }) gates
  Sentry.captureException / Sentry.addBreadcrumb. Everything flows
  through toUserMessage and the two existing call types.
- lib/sentry.ts: initSentryRenderer() for the main window + autoplay,
  huddle, and screen-record renderers.
- main/sentry.ts: initSentryMain() runs before anything else in
  main.ts to catch bootstrap failures. Captures uncaught exceptions
  and the crash reporter automatically.
- main/ipc-utils.ts::safeHandle now routes through reportError.
- main.ts::fetchLinkMetadata logs via logError.

* chore: cleanup reexports

* fix(errors): use relative import so main-process bundle resolves

Rollup in vite.main.config.ts doesn't know about the `@/` alias (only the
renderer configs do). After PR 4 made `lib/errors.ts` reachable from main,
its `@/config/env` import broke the main build with:

  [vite]: Rollup failed to resolve import "@/config/env" from "lib/errors.ts"

Swap to a relative import — the module is now genuinely isomorphic.

* build(vite): resolve @/ alias in main + preload configs

The four renderer vite configs all resolve "@" to ./src; main and preload
didn't, so any main-reachable file using @/ imports would break the
bundle. Mirror the same alias block in both configs and revert
lib/errors.ts + src/main/* to the project's @/ convention.

* fix invalid tsconfig field

* comment

* feat(errors): fallback handlers for unhandled rejections and errors

Sentry's global integrations natively capture window.onerror /
unhandledrejection (renderer) and uncaughtException / unhandledRejection
(main). When a DSN is configured we let Sentry own those paths to avoid
double-capturing. When it isn't (dev, unconfigured prod), we attach
minimal listeners that route through reportError so stray promise
rejections and uncaught errors at least hit the console and the facade.

This closes the one gap where a bare click-handler promise rejection
(no try/catch, not a useMutation) would otherwise be invisible.

* Revert "feat(errors): fallback handlers for unhandled rejections and errors"

This reverts commit ed84b29c6b.

---------

Co-authored-by: Claude <[email protected]>
Co-authored-by: Arjun from Flowy Labs <[email protected]>
2026-04-20 19:22:02 -07:00
Arjun Patel bd7a0c4fb8 ci: remove unnecessary env variables 2026-04-20 17:41:02 -07:00
Arjun Patel 7bc06d1dc5 ci: add deployment workflows for different services 2026-04-20 17:29:33 -07:00
talksik 2deef1fe37 fix: prevent email notifications to removed members
Content will retain an older member in visible_to, even if that member
was removed from the network.
2026-04-18 07:37:07 -07:00
talksik 30469fda66 revert "fix: prevent writing to nonexistent firestore docs"
This reverts commit 46170eb5d3.
2026-04-16 18:00:51 -07:00
talksik 5e930d3c2e chore: bump version 2026-04-16 15:38:48 -07:00
98fdc98c76 feat: surface privacy policy and terms in sign-in and settings (#171)
Adds an implicit-consent disclaimer under the sign-in "Continue" button
and a new "Legal" section in the settings page. Both link out to the
policies hosted on flowylabs.ai via the existing openExternal bridge.

https://claude.ai/code/session_01U6gT7XFQ8Rtm3FStsHG63j

Co-authored-by: Claude <[email protected]>
2026-04-16 15:37:28 -07:00
Arjun PatelandGitHub ef899ee5cd security: access control for particles (#169)
* setup firebase custom token

* docs

* docs

* feat: allow admin removing members from a network

* fix: properly handle fallback avatar and names

This is especially helpful in the case of members who were removed from
a network
2026-04-16 15:14:34 -07:00
talksik 28b1ff542b feat: add support email
This will help humans whether they have billing questions or otherwise.
2026-04-16 09:15:31 -07:00
talksik 61a6904cc2 add nav bar to sign in flow 2026-04-16 09:14:50 -07:00
567884433d fix: render correct meta key in keyboard hints on Windows/Linux (#168)
Hardcoded ⌘ glyphs in compose hints were misleading on non-mac
platforms. Add a tiny platform helper sourced from the existing
window.electronWindow.platform bridge and substitute "Ctrl" off mac.
Closes #167.

https://claude.ai/code/session_01YZY4wUqACT7mgibHr2Yncx

Co-authored-by: Claude <[email protected]>
2026-04-16 09:04:29 -07:00
talksik 7da3ec6ab6 build: set windows icons properly 2026-04-15 13:32:53 -07:00
talksik ae38234e17 chore: bump version 2026-04-15 13:24:32 -07:00
talksik b508499dbd ci: fix no metadata for azure 2026-04-15 12:41:36 -07:00
talksik 111acb445c ci: fix duplicate signtool flags 2026-04-15 12:25:13 -07:00
talksik 6755ab9a1b ci: use newer sign tool for windows
The electron forge one won't support azure trusted account signing
2026-04-15 12:12:13 -07:00