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
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
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
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
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
byGalax
cb46483f5d
feat(mobile): AppBootstrap boundary — defers crypto init, catches global throws
2026-05-16 16:24:34 +02:00
byGalax
87fed820dc
feat(mobile): BootSplash + BootError fallback views for AppBootstrap
2026-05-16 16:23:26 +02:00
byGalax
c430a590fc
fix(mobile): lazy env proxy so missing EXPO_PUBLIC vars throw inside React
2026-05-16 16:21:02 +02:00
byGalax
3b884b0415
docs(mobile): document EAS Secrets contract for EXPO_PUBLIC_*
2026-05-16 16:14:23 +02:00
byGalax
90fa0a7e95
chore(desktop): release v0.18.8
2026-05-16 15:35:24 +02:00
byGalax
767db72847
fix(desktop): drop bright border on Settings SubSection cards
...
The inner cards (Nachrichten-Ton / Klingelton / Audio-Gerät / Hotkeys /
…) looked like they had a stark white outline. The cause: --color-line
is a semi-transparent white token, and applying the `/60` alpha modifier
in `border-line/60` overrides the original alpha — so the inner border
ended up brighter than the outer Section's normal `border-line`.
Drop the border entirely. Background tint + caps heading is enough
grouping signal in a tab-pattern panel.
2026-05-16 15:33:36 +02:00
byGalax
0288d7a476
chore(desktop): release v0.18.7
2026-05-16 15:30:14 +02:00
byGalax
34b972ec2a
refactor(desktop): Settings = tab pattern instead of scroll + observer
...
The previous build used IntersectionObserver to highlight whichever
section was in view. With nine sections of unequal heights and smooth-
scroll firing observer callbacks mid-scroll, the active highlight
drifted (clicking 'Konto' showed 'Soundboard' as active because the
last section never crossed the observer's 20%-30% band).
Switched to a tab pattern (macOS System Settings / Discord / GitHub
style): the sidebar selects ONE section, only that section renders.
`useState<TabId>` is the single source of truth; no observer, no
scrolling between sections, no anchor links to clash with HashRouter.
Mobile fallback (<lg) gets a `<select>` dropdown above the panel.
Drops the now-unused `id` prop from Section and removes the
IntersectionObserver effect.
2026-05-16 15:28:03 +02:00
byGalax
c55173800b
chore(desktop): release v0.18.6
2026-05-16 01:13:54 +02:00
byGalax
fc9f1ec143
fix(desktop): Settings sidebar redirected to /chats instead of scrolling
...
App uses HashRouter, so an <a href="#profile"> changes the routing
hash and the router can't find a match — it falls back to /chats.
Replace anchors with buttons that scroll the target section via
scrollIntoView and update the active highlight optimistically.
2026-05-16 01:12:50 +02:00
byGalax
12e4b597a0
chore(desktop): release v0.18.5
2026-05-16 01:09:54 +02:00