byGalax
7ebc5f6c9d
feat(P5C.T2): per-conv 'mentions only' toggle + notification gate
2026-05-16 22:22:04 +02:00
byGalax
b8b451ef4f
feat(P5C.T2-sql): conversation_members.mentions_only column
2026-05-16 22:17:04 +02:00
byGalax
d7c0c3d0a2
feat(P5C.T1): empty-state for empty chat-list search results
2026-05-16 22:14:33 +02:00
byGalax
70ce824120
docs(P5C): Phase 5C polish plan (4 spec sub-items)
2026-05-16 22:12:27 +02:00
byGalax and Claude Sonnet 4.6
d10840e0b2
feat(P5B.T6): composer Spielen button + bubble dispatch + game-picker
...
Wires mini-game entry points: createGamePayload helper in conversationFeatures.ts (GamePayload import added), game state/handler/picker-dialog/modal-mount/open-event-listener in ConversationPage.tsx (DM-only guard uses conversation.members[].userId camelCase as confirmed), and parsed.kind==='game' bubble branch in MessageBubble.tsx dispatching chatapp:open-game CustomEvent.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 21:58:10 +02:00
byGalax
cd59ee30d6
feat(P5B.T5): GameModal — picks board + turn/winner status
2026-05-16 21:53:42 +02:00
byGalax
e56e22631b
feat(P5B.T4): TicTacToeBoard + ConnectFourBoard render-only components
2026-05-16 21:51:06 +02:00
byGalax
dbf90504b4
feat(P5B.T3): useGame hook with realtime + makeMove
2026-05-16 21:49:00 +02:00
byGalax and Claude Sonnet 4.6
256a613134
feat(P5B.T2): GamePayload + games wrappers + winner-detect helpers + tests
...
Adds conversation_games table type + game_make_move RPC to db-types, GamePayload variant and parseMessagePayload branch to shared/attachments, games.ts with createGame/getGame/makeGameMove wrappers plus pure tttWinningLine/c4WinningCells/c4DropRow/isBoardFull helpers, 11 tests covering all winner helpers, and re-export from chat/index.ts.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 21:47:36 +02:00
byGalax
e1423dba32
feat(P5B.T1): conversation_games table + game_make_move RPC + RLS + realtime
2026-05-16 21:42:47 +02:00
byGalax
7730828403
docs(P5B): Phase 5B implementation plan (Mini-Games)
2026-05-16 21:39:12 +02:00
byGalax
ecbd11e369
feat(P5A.T5): composer Watch-Together button + bubble dispatch
2026-05-16 21:30:22 +02:00
byGalax and Claude Sonnet 4.6
7d5f3b37cd
feat(P5A.T4): WatchTogetherModal — YouTube IFrame + drift reconcile
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 21:26:59 +02:00
byGalax and Claude Sonnet 4.6
7ce6b1c1d4
feat(P5A.T3): useWatchSession hook with realtime + throttled push
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 21:23:39 +02:00
byGalax
4399d39f08
feat(P5A.T2): WatchTogetherPayload + wrappers + parseYouTubeUrl + tests
2026-05-16 21:21:30 +02:00
byGalax
ad239ec549
feat(P5A.T1): conversation_watch_sessions table with RLS + realtime
2026-05-16 21:16:38 +02:00
byGalax
d1193142ae
docs(P5A): Phase 5A implementation plan (Watch-Together / YouTube)
2026-05-16 21:14:38 +02:00
byGalax
997252c4cb
chore(desktop): release v0.19.1
2026-05-16 21:07:11 +02:00
byGalax and Claude Sonnet 4.6
890d5dc2b7
feat(P4C.T4): SoundboardSettings — sync hook mount + per-row badges + remote-delete
...
Mount useSoundboardSync in SoundboardManagerDialog, thread badges map through
SoundboardCategoryGroup/SoundboardRow, render a cloud-state glyph badge inline
with each row's size/mime metadata, and wrap handleDelete to attempt a
best-effort remote delete via deleteRemoteSound before the local deleteSound call.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 21:02:26 +02:00
byGalax
759113b9ce
feat(P4C.T3): useSoundboardSync — initial diff + realtime + debounced push
2026-05-16 20:58:48 +02:00
byGalax
f981904e7f
feat(P4C.T2): shared soundboards wrappers + sealed-blob crypto + tests
2026-05-16 20:53:48 +02:00
byGalax
1fe196b839
feat(P4C.T1): user_soundboards table + soundboards storage bucket + RLS
2026-05-16 20:49:10 +02:00
byGalax
1b4cf63e07
docs(P4C): Phase 4C implementation plan (Soundboard Cloud-Sync, E2E encrypted)
2026-05-16 20:46:57 +02:00
byGalax and Claude Sonnet 4.6
18197a9f95
feat(P4B.T7): MessageBubble renders whiteboard kind with Öffnen button
...
Adds a whiteboard branch to the MessageBubble ternary chain that renders
a card with an icon, label, and Öffnen button dispatching the
chatapp:open-whiteboard CustomEvent. ConversationPage now listens for
that event via a useEffect and calls setOpenWhiteboardId to open the
modal.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 20:38:03 +02:00
byGalax
383245ec90
feat(P4B.T6): composer 'Whiteboard' button creates board + sends bubble
2026-05-16 20:36:03 +02:00
byGalax
5e59ee22f6
feat(P4B.T5): WhiteboardModal — fullscreen container + toolbar + clear-confirm
2026-05-16 20:29:24 +02:00
byGalax
be6f5b9c6f
feat(P4B.T4): WhiteboardCanvas — pen/eraser drawing engine
2026-05-16 20:27:09 +02:00
byGalax and Claude Sonnet 4.6
2243c646ac
feat(P4B.T3): useWhiteboardStrokes hook with INSERT + bulk DELETE realtime
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 20:25:22 +02:00
byGalax and Claude Sonnet 4.6
3df7cc01ea
feat(P4B.T2): WhiteboardPayload + shared whiteboards CRUD wrappers + tests
...
Adds WhiteboardPayload wire-format variant to MessagePayload/ParsedMessagePayload,
creates the whiteboards.ts CRUD wrapper (createWhiteboard, listWhiteboardStrokes,
insertWhiteboardStroke, clearWhiteboardStrokes), writes 5 unit tests (38/38 pass),
re-exports from chat/index.ts, and registers conversation_whiteboards +
whiteboard_strokes in packages/db-types so typecheck passes cleanly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 20:23:45 +02:00
byGalax
f95858c703
feat(P4B.T1): whiteboards + whiteboard_strokes tables with RLS + realtime
2026-05-16 20:01:28 +02:00
byGalax
d29e2c1174
docs(P4B): Phase 4B implementation plan (Whiteboard / Snapshot-Sync)
2026-05-16 19:59:10 +02:00
byGalax and Claude Sonnet 4.6
11a9c8b173
feat(P4A.T4): wire ImageAnnotator into composer attachment preview
...
Hover an image attachment in the composer to reveal a pencil-edit button;
clicking it opens ImageAnnotator and Save replaces the File in attachments[].
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 19:48:57 +02:00
byGalax
d623a59c87
feat(P4A.T3): annotator toolbar — tool/color/width/undo/redo controls
2026-05-16 19:46:00 +02:00
byGalax and Claude Sonnet 4.6
2a2e334f51
feat(P4A.T2): annotator drawing engine — pen/arrow/rect/circle/text/highlighter
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 19:44:04 +02:00
byGalax
9228cc635c
feat(P4A.T1): ImageAnnotator modal skeleton with canvas mount + op-stack types
2026-05-16 19:41:36 +02:00
byGalax
7056bfdd1c
docs(P4A): Phase 4A implementation plan (Image Annotation vor Send)
2026-05-16 19:38:26 +02:00
byGalax
e8a5d6dc5e
chore(desktop): release v0.19.0
2026-05-16 19:25:55 +02:00
byGalax and Claude Sonnet 4.6
c5851195c7
fix(call): strip-toggle icon no longer touches its frame edges
...
Shrink the StripToggleIcon SVG from 18x18 to 14x14 px so the 2-people
icon sits centred with ~11 px of breathing room inside its 36x36 button,
matching the h-4/w-4 small-icon convention used elsewhere in InCallPanel.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 19:21:26 +02:00
byGalax
258ad3511d
fix(screen-share): preset dims no longer crop non-16:9 monitors
...
Pass width/height as { ideal: N } constraints (not exact values) so
Chromium preserves the source's aspect ratio instead of cropping
non-matching monitors. Previously a 1920x1200 monitor under a 1080p
preset lost the bottom 120px including the Windows taskbar.
The auto-preset fallback now omits width/height entirely (both set to
undefined) so getDisplayMedia uses the screen's native resolution.
Cast through `unknown` to satisfy LiveKit's VideoResolution type, which
declares width/height as plain number but Chromium accepts the full
MediaTrackConstraints shape at runtime.
2026-05-16 19:19:30 +02:00
byGalax
2583613d7f
feat(P3.T7): RemoteRevokedScreen overlay for own-device revocation
2026-05-16 19:15:15 +02:00
byGalax and Claude Sonnet 4.6
04d9909e92
feat(P3.T6): Settings 'Geräte' tab with revoke + this-device badge
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 19:13:31 +02:00
byGalax and Claude Opus 4.7
e05f5445e7
feat(P3.T5): useOwnDevices hook with realtime refresh
...
Adds useOwnDevices React hook that fetches the user device list via
listOwnDevices and re-fetches on any postgres_changes event on the
devices table, matching the channel/filter convention in AuthContext.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 19:10:48 +02:00
byGalax
a4f7a16c90
feat(P3.T4): ensure device row + revoke-realtime + revokedRemotely flag
2026-05-16 19:08:17 +02:00
byGalax
f6e0e4dd09
feat(P3.T3): app:hostname IPC for device-name default
2026-05-16 19:04:03 +02:00
byGalax
d449e128a8
docs(hotfix): screen-share taskbar crop + strip-toggle icon padding plan
2026-05-16 18:59:59 +02:00
byGalax and Claude Sonnet 4.6
5b0aa24a8d
feat(P3.T2): DeviceRecord.revokedAt + revokeDevice wrapper
...
Extend DeviceRecord with revokedAt field, update registerDevice and
listOwnDevices selects to include revoked_at, add revokeDevice RPC
helper, update db-types to reflect T1 migration schema, and add
vitest coverage for all new behaviour.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 18:52:34 +02:00
byGalax and Claude Sonnet 4.6
540b506f91
feat(P3.T1): devices.revoked_at + revoke_device RPC + realtime publication
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 18:48:22 +02:00
byGalax
ede0d00f5b
docs(P3): Phase 3 implementation plan (Session/Device List + Revoke)
2026-05-16 18:45:46 +02:00
byGalax
ef1f9f45d8
fix(desktop): swap GIF provider from Tenor (closed Jan 2026) to GIPHY
...
Google closed Tenor v2 to new API clients in Jan 2026, so the only
people who could use the picker were those with a pre-existing Google
Cloud Console key. Swapped to GIPHY's Developer API (still open, free
keys at https://developers.giphy.com/dashboard/ ).
- Env var renamed VITE_TENOR_API_KEY → VITE_GIPHY_API_KEY
- Endpoint, response mapping, error sentinel updated
- File still named tenor.ts for import-path stability — renaming
later if it bothers anyone
- Public GifResult interface unchanged so the picker UI didn't need
edits beyond the error-message switch
2026-05-16 18:25:18 +02:00
byGalax and Claude Opus 4.7
95156a65eb
feat(desktop): view-once image attachments (sender toggle + recipient lightbox + tombstone)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 18:18:39 +02:00
byGalax
915569db39
feat(shared): mark_attachment_viewed + view_once on AttachmentHandle
2026-05-16 18:12:15 +02:00
byGalax
526f9d7bcc
feat(db): message_attachments.view_once + mark_attachment_viewed RPC
2026-05-16 18:09:36 +02:00
byGalax
cd79b77e6f
feat(desktop): GIF button + picker wired into composer
2026-05-16 18:07:40 +02:00
byGalax
7726498218
feat(desktop): GIF picker popover (Tenor + trending/search/recent)
2026-05-16 18:05:45 +02:00
byGalax
f1d9602a76
fix(desktop): read Tenor API key from VITE_TENOR_API_KEY env, no hardcoded credential
2026-05-16 18:03:20 +02:00
byGalax
45bcbb449c
feat(desktop): Tenor v2 GIF search/featured/recent client
2026-05-16 18:02:01 +02:00
byGalax
ef98efb938
feat(desktop): mention notifications via realtime + osNotify
2026-05-16 17:59:57 +02:00
byGalax
7355b343c8
feat(shared): sendEncryptedMessage inserts mention rows after the message row
2026-05-16 17:57:52 +02:00
byGalax
1a39c1bb33
feat(shared): parseMentionUsernames + insertMentions helpers
2026-05-16 17:55:20 +02:00
byGalax
70209be1de
feat(db): message_mentions table (RLS: mentioned user + author can SELECT)
2026-05-16 17:52:40 +02:00
byGalax
3dbeabd268
feat(desktop): pin/unpin from message context menu + side panel
2026-05-16 17:51:01 +02:00
byGalax
6bff163f09
feat(desktop): pinned-messages side panel
2026-05-16 17:47:39 +02:00
byGalax
ddeedeb71d
feat(desktop): pinned-messages pill in conv header
2026-05-16 17:45:43 +02:00
byGalax
7e85ffe548
feat(desktop): usePinnedMessages live hook
2026-05-16 17:43:45 +02:00
byGalax
0d30a462b3
feat(shared): pinned-messages list/pin/unpin helpers
2026-05-16 17:42:09 +02:00
byGalax
745b8cd69d
feat(db): pinned_messages table (≤5 per conv via trigger)
2026-05-16 17:39:42 +02:00
byGalax
5ace6735d8
docs(plan): phase 2 — messaging (pinned / mentions / GIF / view-once)
2026-05-16 17:36:21 +02:00
byGalax
ffaa6ceb70
feat(mobile): SecurityCenter — PIN change, recovery, reset, migration retry
2026-05-16 17:23:04 +02:00
byGalax
ccac822cb9
feat(mobile): settings hub with security section + signout
2026-05-16 17:21:57 +02:00
byGalax
74a0ef6c32
refactor(mobile): chats header opens settings instead of inline logout
2026-05-16 17:18:56 +02:00
byGalax
9de2c368bf
feat(desktop): optional wipe-on-close (Settings -> Sicherheit)
2026-05-16 17:17:59 +02:00
byGalax
88345420e0
refactor(mobile): AttachmentImage drops device-keyed props
2026-05-16 17:17:37 +02:00
byGalax
0354676d2f
refactor(mobile): MessageBubble drops ownDeviceId prop
2026-05-16 17:17:30 +02:00
byGalax
cb7bd99fb4
refactor(mobile): conversation detail uses ownUserId + drops senderDeviceId
2026-05-16 17:13:47 +02:00
byGalax
3b55fcaf2c
feat(mobile): (app) layout routes by userKeyState
2026-05-16 17:11:05 +02:00
byGalax
7ae1d5ba8c
feat(mobile): UserKey unlock screen (PIN entry + recovery tab + reset)
2026-05-16 17:09:50 +02:00
byGalax
50bfb5b137
feat(desktop): wipe local crypto + caches on sign-out
2026-05-16 17:09:01 +02:00
byGalax
41359816f1
feat(mobile): UserKey setup screen (PIN + optional recovery code)
2026-05-16 17:08:47 +02:00
byGalax
8ad212291a
feat(desktop): apply friend nicknames in header / bubble / mentions / call tile
2026-05-16 17:06:18 +02:00
byGalax
18a6365586
feat(mobile): PinInput component — 6-digit numeric pad
2026-05-16 17:04:25 +02:00
byGalax
898b7469bb
feat(desktop): set-nickname dialog + right-click trigger in friends list
2026-05-16 17:01:38 +02:00
byGalax
a5eadef663
feat(desktop): friendNicknames local store + useNickname hook
2026-05-16 16:58:14 +02:00
byGalax
e8074e7da0
feat(desktop): empty-state for empty conversation
2026-05-16 16:56:27 +02:00
byGalax
88409aff5d
feat(desktop): empty-state for friends list
2026-05-16 16:54:12 +02:00
byGalax and Claude Opus 4.7
b7d7a85253
feat(desktop): empty-state for chat list
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 16:51:37 +02:00
byGalax
502c6af1b8
feat(desktop): EmptyState primitive component
2026-05-16 16:49:16 +02:00
byGalax
adc9686035
refactor(mobile): AuthProvider exposes userKeyState instead of device record
2026-05-16 16:47:55 +02:00
byGalax
472665b980
fix(desktop): tray badge — IPC handler died when icon.ico missing from packaged resources
2026-05-16 16:47:19 +02:00
byGalax
c52c65faa9
feat(mobile): userIdentity orchestrator (setup/unlock/cache/change-PIN/reset)
2026-05-16 16:43:50 +02:00
byGalax
79f1786ac6
feat(desktop): Settings — 🌐 Global toggle per voice hotkey
2026-05-16 16:43:00 +02:00
byGalax
ca77214e2d
fix(desktop): voice hotkeys are window-scoped unless Global is toggled
...
The old code registered every enabled hotkey through Electron globalShortcut
API, which captures system-wide. Setting M as mute meant m could not be
typed in any other app. Now the OS-level registration only happens when
binding.global === true; otherwise the existing window-keydown listener
handles it.
2026-05-16 16:41:20 +02:00
byGalax
8c27e8eafa
feat(mobile): legacyDeviceVault helper for per-device key probing
2026-05-16 16:41:18 +02:00
byGalax
69733168ed
feat(desktop): add 'global' flag to voice hotkey binding (default false)
2026-05-16 16:38:51 +02:00
byGalax
bf87add18d
feat(mobile): extend cryptoBackend with pwhash + scalarMultBase
2026-05-16 16:37:09 +02:00
byGalax
c871687fd2
refactor(desktop): derivePublicKey via CryptoBackend.scalarMultBase
2026-05-16 16:35:36 +02:00
byGalax
61a1eb37ea
refactor(shared): route userKey through CryptoBackend (no libsodium-wrappers-sumo)
2026-05-16 16:33:50 +02:00
byGalax
9b9802ff6e
docs(plan): phase 1 — quality & fixes (hotkey-bug, tray-audit, empty-states, nicknames, memory-wipe)
2026-05-16 16:33:38 +02:00
byGalax
2463081949
feat(shared): extend CryptoBackend with pwhash + scalarMultBase
2026-05-16 16:30:52 +02:00
byGalax
1eea80c529
chore(mobile): check:env script lints .env.local against .env.example
2026-05-16 16:27:21 +02:00
byGalax
830dac4cdd
fix(mobile): defer crypto backend init into AppBootstrap (prevents white-screen)
2026-05-16 16:25:10 +02:00