Closes#154
The sender of the message wouldn't see the children particle since we
only fetch the children once. And perhaps the firestore local cache
doesn't have the children particles or some other race condition. But
now, we fetch the live children.
This should anyways use the same number of reads as before since
attachments do not change.
Lets a particle's creator delete their own message from the TopBar
dropdown. Other viewers see a "This particle was deleted" tombstone in
place and playback auto-advances after ~2s, keeping indices stable for
concurrent watchers.
- Add optional deleted_at / deleted_by_human_id to non-container
particle variants and isParticleDeleted helper.
- Add softDeleteParticle Firestore helper.
- New DeleteParticleOverlay confirmation and DeletedParticleView
tombstone.
- Hide reactions (bar + 1-7 keybinding) on tombstoned particles.
- Show "Deleted particle" + Trash2 icon in the stream list preview.
Closes#146https://claude.ai/code/session_01M2ShnZPvWfQzzvuu3Xm8b9
Co-authored-by: Claude <noreply@anthropic.com>
Closed streams grow unbounded as teams age and can reach 1000s of items,
while open streams stay bounded by active work. Switch the streams list
to subscribe per-status so each tab only pulls what it renders, and cap
the closed tab to a 50-item window that grows via a Load more action.
The open tab remains unbounded so per-row realtime features — autoplay,
huddle indicators — keep full coverage of the streams that matter.
Closed streams are archived and don't need push behavior, which side-
steps the autoplay baseline-reset and huddle-on-page-2 risks that made
pagination complicated for the open tab.
Refs flowy-live/llink#138.
Co-authored-by: Claude <noreply@anthropic.com>
* increases timeout
* refactor: reuse constants for redis db
* avoid closing connection on pong error
* fix: prevent electron from pausing timer executions
Our pings could be paused when our app is backgrounded.
* refactor: remove unnecessary refs
* fix: presence unreliable within same pod
It was broadcasting presence changes to other pods, but not notifying
clients connected to the same pod
- New cron job in cluster
- Handle presence and other concerns
- Toggle in app to disable email notifications
- Handles other edge cases such as cooldown period
- Simple html email with simple message
Closes#117
* setup infra for pusher service
* setup client sdk for pusher service
* fix: ping parse failure
* fix: send pong back to client
avoid disconnections every 2.5 minutes
* increase replicas
* feat: show presence and compose indicator
It wasn't progressing, likely because the metadata for a screen
recording was not read by the video html element. So we fallback to our
own duration metadata.
Closes#135
Closes#131
Fundamentally, we cannot afford to composite webcam and screen on the
client. We should create two streams and then combine them with ffmpeg
processing in the backend / orion.
* first pass implementation
* remove screenrecord shortcut hint
* refactor
* fix: prevent mirror review of screen recording
* feat: allow recording with webcam overlay
* fix: review screen recording without clipped content
* tidy keyboard hints consistent position
* refactor: re-use one component for screen picker
huddles and screen clips use same picker component now. We had to make
sure that tailwind works for both of them.
* fix: improve visibility of keyboard hints
During compose video or screen recording, the keyboard hints were
invisible if the content was super bright.
This created some distortion because while we were hiding the autoplay
window, this would not stop it's media. It's better to stop the media
completely
Resolves#110
Goes the extra mile and supports markdown for sending code and formatted
text, almost document-like. It feels more like GitHub's comments and
text areas.