Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
291 commits
Select commit Hold shift + click to select a range
718210f
feat(devtools): add Experiments panel to developer tools settings
Just-Insane Mar 29, 2026
dfebd09
test(flags): cover experiment bucketing and add changeset
Just-Insane Mar 29, 2026
a53112f
feat(polls): implement MSC3381 polls with creator dialog and timeline…
Just-Insane Apr 6, 2026
d9a6656
chore: add changeset for feat-polls
Just-Insane Apr 6, 2026
117949f
feat(bookmarks): add message bookmarks (MSC4438)
Just-Insane Apr 6, 2026
f726833
test(bookmarks): add unit tests for MSC4438 bookmark domain and repos…
Just-Insane Apr 6, 2026
2a9fa52
chore: add changeset for message-bookmarks
Just-Insane Apr 6, 2026
68d35f9
chore(codespace): add devcontainer for iPad browser + SSH signing
Just-Insane Apr 6, 2026
d327e19
chore(codespace): add Fira Code font + ligatures
Just-Insane Apr 6, 2026
426ef74
chore(codespace): split onCreate/postCreate for prebuild caching
Just-Insane Apr 6, 2026
53930d4
chore(codespace): fix image tag, install OMZ+P10k, wire dotfiles bare…
Just-Insane Apr 6, 2026
d9a10cb
fix(codespace): suppress corepack download prompt, source nvm in onCr…
Just-Insane Apr 6, 2026
6361351
fix(codespace): chown pnpm store volume before writing
Just-Insane Apr 6, 2026
3fcd6c1
chore(devcontainer): add tmux, fix terminal font, add GitHub MCP server
Just-Insane Apr 6, 2026
76e0c49
fix(devcontainer): use browser-safe font and compatible p10k glyphs f…
Just-Insane Apr 6, 2026
ff1b207
fix(devcontainer): use Menlo as terminal font for iOS compatibility
Just-Insane Apr 6, 2026
bccc48f
update devcontainer settings
Just-Insane Apr 7, 2026
2964e89
fix(devcontainer): restore missing fontFamily settings
Just-Insane Apr 7, 2026
b3304bb
Update fontfamily
Just-Insane Apr 7, 2026
06c9810
chore(devcontainer): sync extensions list with installed extensions
Just-Insane Apr 7, 2026
ac899aa
Update container config
Just-Insane Apr 7, 2026
dcb56f6
fix(devcontainer): load signing key into ssh-agent in postCreate
Just-Insane Apr 7, 2026
e848f3a
feat(devcontainer): add SSH_AUTH_KEY secret support for server access
Just-Insane Apr 7, 2026
a294d16
fix(devcontainer): disable extension MCP auto-discovery, fix p10k sed…
Just-Insane Apr 7, 2026
2eeaa43
fix(devcontainer): enable shell integration for Copilot Chat terminal
Just-Insane Apr 7, 2026
a4751d4
chore(devcontainer): switch dotfiles branch to codespaces
Just-Insane Apr 8, 2026
1ad6b03
fix(bookmarks): add missing focusId to MSC4438 settings SettingTile
Just-Insane Apr 8, 2026
12888d9
fix(devtools): add focusId to ExperimentsPanel SettingTile
Just-Insane Apr 8, 2026
ac4e5b4
fix(presence): skip REST presence fetch when userId is empty string
Just-Insane Apr 9, 2026
755588b
fix(bookmarks): soft-delete item before updating index in removeBookmark
Just-Insane Apr 9, 2026
49a98b3
feat(polls): expose max_selections in poll creator dialog
Just-Insane Apr 9, 2026
6a27271
test(polls): unit-test pure functions; export extractPollData/compute…
Just-Insane Apr 11, 2026
35acb82
test(presence): add useUserPresence unit tests
Just-Insane Apr 11, 2026
4404e84
feat(presence): add presenceMode setting and Discord-style status picker
Just-Insane Apr 11, 2026
8f69b61
feat(presence): Discord-style presence picker with Idle, DND, and Inv…
Just-Insane Apr 11, 2026
1ba25f8
fix(bookmarks): wire useInitBookmarks and fix orphan tombstoning
Just-Insane Apr 12, 2026
c178b77
feat(presence): add presence badges to sidebar and fix sliding sync p…
Just-Insane Mar 31, 2026
ac75284
chore: add changeset for presence-sidebar-badges
Just-Insane Mar 31, 2026
c7d44d8
fix(presence): skip REST presence fetch when userId is empty string
Just-Insane Apr 9, 2026
ce458fb
test(presence): add useUserPresence unit tests
Just-Insane Apr 11, 2026
f7c7fee
feat(presence): add presenceMode setting and Discord-style status picker
Just-Insane Apr 11, 2026
b86b5de
feat(presence): Discord-style presence picker with Idle, DND, and Inv…
Just-Insane Apr 11, 2026
a71bdab
feat(presence): auto-idle after inactivity timeout
Just-Insane Apr 12, 2026
ca97c9b
chore: add changeset for presence-auto-idle
Just-Insane Apr 12, 2026
594fda0
fix(bookmarks): strip deleted flag on re-add to guarantee re-activation
Just-Insane Apr 12, 2026
31441ad
feat(bookmarks): show Recently Removed section with Restore button
Just-Insane Apr 12, 2026
d8da869
fix: auto-format poll test imports for prettier compliance
Just-Insane Apr 12, 2026
4a15b74
fix: remove unused params from mock Room callbacks
Just-Insane Apr 12, 2026
b0a8091
fix(security): block prototype-polluting keys in deepMerge
Just-Insane Apr 12, 2026
264e4ab
fix(presence): restore missing experiment config helpers and clean pr…
Just-Insane Apr 12, 2026
878f2fc
fix(presence): resolve missing deps and stabilize presence hook tests
Just-Insane Apr 12, 2026
e4d24b2
test(bookmarks): format repository tests for prettier compliance
Just-Insane Apr 13, 2026
05fa657
fix: address PR #589 review comments
Just-Insane Apr 13, 2026
a2d5683
fix(bookmarks): react to item-level account data events and fix remov…
Just-Insane Apr 13, 2026
64f531b
perf: memoize VList timeline items to prevent mass re-renders
Just-Insane Apr 10, 2026
c9f4537
fix(timeline): make mutationVersion optional in UseProcessedTimelineO…
Just-Insane Apr 10, 2026
885cf0b
fix(timeline): satisfy lint rules in TimelineItem memo component
Just-Insane Apr 10, 2026
70e4552
chore: add changeset for perf-timeline-item-memo
Just-Insane Apr 10, 2026
2b9758f
fix(timeline): preempt atBottom to prevent Jump to Latest flashing at…
Just-Insane Apr 10, 2026
8aea0a1
fix(timeline): suppress intermediate VList scroll events after progra…
Just-Insane Apr 10, 2026
7322feb
fix(timeline): set programmatic guard in scrollToBottom; keep guard a…
Just-Insane Apr 10, 2026
bc4eb26
fix(notifications): defer notification jump until live timeline is no…
Just-Insane Apr 11, 2026
c3d7cf5
fix(timeline): skip scroll-cache save when viewing a historical event…
Just-Insane Apr 11, 2026
76c8f70
test(timeline): add useProcessedTimeline unit tests + fix stale itemI…
Just-Insane Apr 11, 2026
32c504c
perf(timeline): restore VList cache + skip 80 ms timer on room revisit
Just-Insane Apr 9, 2026
57ce5a0
fix(timeline): correct scroll-cache save/load paths
Just-Insane Apr 9, 2026
2ee4554
fix(timeline): save scroll cache in pendingReadyRef recovery path
Just-Insane Apr 10, 2026
bdea2e7
chore: add changeset for perf-timeline-scroll-cache
Just-Insane Apr 10, 2026
89f4632
fix(timeline): preempt atBottom to prevent Jump to Latest flashing at…
Just-Insane Apr 10, 2026
394aca2
fix(timeline): suppress intermediate VList scroll events after progra…
Just-Insane Apr 10, 2026
44c9dd2
test(timeline): add roomScrollCache unit tests
Just-Insane Apr 11, 2026
ac4fd94
fix: auto-format roomScrollCache test file for prettier compliance
Just-Insane Apr 12, 2026
781a8e2
refactor(timeline): replace eslint-disables with custom areEqual comp…
Just-Insane Apr 14, 2026
4eeaa38
feat(room-nav): show topic/last-message preview for space and home rooms
Just-Insane Apr 12, 2026
260a4e8
fix(sliding-sync): increase LIST_TIMELINE_LIMIT to 5 for message prev…
Just-Insane Apr 12, 2026
9036ec9
chore: add changeset for room-message-preview
Just-Insane Apr 12, 2026
db9c1a4
feat(dm-list): show latest message preview below room name
Just-Insane Apr 12, 2026
216aa6a
chore: add changeset for dm message preview
Just-Insane Apr 12, 2026
b848ac2
feat(dm-list): add toggle to hide DM message preview
Just-Insane Apr 12, 2026
ec10020
fix(settings): give DM Message Preview its own card in Visual Tweaks
Just-Insane Apr 12, 2026
20376bf
refactor(sliding-sync): gate listTimelineLimit behind message preview…
Just-Insane Apr 14, 2026
581f2ce
feat(dev-tools): add rotate-sessions developer tool
Just-Insane Mar 31, 2026
86701ca
chore: add changeset for devtool-rotate-sessions
Just-Insane Mar 31, 2026
ce11afe
fix(ui): phantom unread dot + blank notification page recovery
Just-Insane Apr 13, 2026
4b29d29
fix: use || instead of ?? for DM preview fallback chain The nullish …
Just-Insane Apr 14, 2026
1939599
fix: use useLayoutEffect for auto-scroll recovery after timeline rese…
Just-Insane Apr 14, 2026
77fbe22
fix(timeline): use scrollToIndex for stay-at-bottom and remove premat…
Just-Insane Apr 14, 2026
fa8bb1e
fix(timeline): use timestamp-based settling window to suppress spurio…
Just-Insane Apr 14, 2026
2202bec
fix(bookmarks): add Fragment key, guard missing eventId, fix removeBo…
Just-Insane Apr 15, 2026
cd5192b
fix(dev-tools): address review feedback for rotate-sessions
Just-Insane Apr 15, 2026
8cdf36a
chore: remove accidentally committed scratch files
Just-Insane Apr 15, 2026
4e5b037
fix(timeline): address review feedback for timeline-item-memo
Just-Insane Apr 15, 2026
e5bdd7c
fix(presence): address review feedback for presence sidebar badges
Just-Insane Apr 15, 2026
3f03876
fix(presence): address review feedback for presence-auto-idle
Just-Insane Apr 15, 2026
4cb00a5
fix(room-nav): address review feedback for message preview
Just-Insane Apr 15, 2026
0231581
fix(presence): 5min default, wire visibility reset, add tests
Just-Insane Apr 15, 2026
1f9dae9
test(room-nav): add useRoomLastMessage unit tests (28 tests)
Just-Insane Apr 15, 2026
9d9dce7
fix(polls): handle encrypted poll events in timeline filter
Just-Insane Apr 15, 2026
f78496d
fix: scope roomScrollCache to userId
Just-Insane Apr 15, 2026
29e4076
refactor: align presence-auto-idle with sw-push-session-recovery
Just-Insane Apr 15, 2026
10fa77c
Merge branch 'fix/vlist-hover-transform' into fix/ui-regressions
Just-Insane Apr 15, 2026
12b379e
Merge branch 'feat/presence-sidebar-badges' into feat/presence
Just-Insane Apr 15, 2026
2b39316
Merge branch 'feat/presence-auto-idle' into feat/presence
Just-Insane Apr 15, 2026
69179c1
style: fix lint errors from merge
Just-Insane Apr 15, 2026
6e8f572
chore: add changeset for timeline scroll fixes
Just-Insane Apr 15, 2026
9ebd8d3
Merge branch 'dev' into fix/async-callback-rejections
Just-Insane Apr 15, 2026
da4a07b
Merge branch 'dev' into feat/room-message-preview
Just-Insane Apr 15, 2026
d7fd640
fix(presence): address review feedback
Just-Insane Apr 15, 2026
82bde31
fix(dev-tools): add error handling for prepareToEncrypt
Just-Insane Apr 15, 2026
e0eb8ab
Merge branch 'dev' into feat/polls
Just-Insane Apr 15, 2026
7680897
fix(polls): strip invalid vote selections instead of discarding entir…
Just-Insane Apr 15, 2026
850e025
fix(room-nav): use effective event type for decrypted message preview…
Just-Insane Apr 15, 2026
eac371a
fix(timeline): add behavior parameter to scrollToBottom callback
Just-Insane Apr 15, 2026
5af258a
fix(timeline): use timestamp settling window for programmatic scroll …
Just-Insane Apr 15, 2026
7bb22d2
fix(nav): check DM membership before space parents in useRoomNavigate
Just-Insane Apr 15, 2026
42c59ad
chore(prompts): add rebuild integration and review upstream PRs prompts
Just-Insane Apr 15, 2026
cb24302
chore: fix lint and format issues
Just-Insane Apr 15, 2026
3149a37
chore: fix lint and format issues
Just-Insane Apr 15, 2026
56de896
chore: fix lint and format issues
Just-Insane Apr 15, 2026
ca65cef
docs(changeset): clarify Megolm session rotation description
Just-Insane Apr 15, 2026
cbd653e
docs(changeset): accurately describe unhandled-rejection suppression …
Just-Insane Apr 15, 2026
8e07aec
fix(timeline): arm scroll guard in ResizeObserver and scrollToBottom
Just-Insane Apr 15, 2026
8fee117
docs: clarify that listTimelineLimit scales with message preview setting
Just-Insane Apr 15, 2026
c9763ab
fix(timeline): set programmaticScrollToBottomRef before all bottom-pi…
Just-Insane Apr 15, 2026
93b7fb8
fix(timeline): remove scroll settling guard, match upstream scroll ap…
Just-Insane Apr 16, 2026
eefceb9
fix(nav): check DM membership before space parents in useRoomNavigate
Just-Insane Apr 15, 2026
809a9bb
fix(preview): close decryption race in useRoomLastMessage
Just-Insane Apr 16, 2026
6dcb99e
fix(timeline): add hysteresis to atBottom threshold
Just-Insane Apr 16, 2026
dc21873
fix(preview): poll/location preview, mxid localpart fallback
Just-Insane Apr 16, 2026
8c3c0e7
fix(presence): retry setPresence on failure for app resume reliability
Just-Insane Apr 16, 2026
2727ac7
fix(timeline): suppress jump button flash during initial scroll settle
Just-Insane Apr 16, 2026
be8c28a
fix(timeline): remove scroll hysteresis, match upstream 100px threshold
Just-Insane Apr 16, 2026
7bddc4f
fix(timeline): chase bottom when content grows while user is pinned
Just-Insane Apr 16, 2026
71138ec
Update personal config.json
Just-Insane Apr 16, 2026
29fa6ea
fix(timeline): restore useLayoutEffect auto-scroll, fix new-message s…
Just-Insane Apr 16, 2026
23dbfc6
fix(timeline): restore useLayoutEffect auto-scroll, fix new-message s…
Just-Insane Apr 16, 2026
ad50ff1
fix(timeline): restore useLayoutEffect auto-scroll, fix new-message s…
Just-Insane Apr 16, 2026
83031b2
fix(timeline): restore useLayoutEffect auto-scroll, fix new-message s…
Just-Insane Apr 16, 2026
6cfb025
fix(timeline): restore upstream scroll pattern for new messages
Just-Insane Apr 16, 2026
4e4cace
fix(timeline): restore upstream scroll pattern for new messages
Just-Insane Apr 16, 2026
bd31c97
fix(timeline): restore upstream scroll pattern for new messages
Just-Insane Apr 16, 2026
17ccebd
fix(timeline): restore upstream scroll pattern for new messages
Just-Insane Apr 16, 2026
4148bfa
fix(timeline): align scrollToBottom with upstream, fix eventId race
Just-Insane Apr 17, 2026
1ac909d
fix(timeline): align scrollToBottom with upstream, fix eventId race
Just-Insane Apr 17, 2026
1392b77
fix(timeline): align scrollToBottom with upstream, fix eventId race
Just-Insane Apr 17, 2026
399418b
fix(timeline): align scrollToBottom with upstream, fix eventId race
Just-Insane Apr 17, 2026
30a26ea
feat(timeline): add video aspectRatio and VList itemSize hint
Just-Insane Apr 17, 2026
c8189ea
fix(timeline): skip scroll handler during init to prevent jitter
Just-Insane Apr 17, 2026
5c94190
perf(timeline): skip redundant re-render on TimelineReset
Just-Insane Apr 17, 2026
29fc1d0
perf(timeline): hide content during genuine TimelineReset re-render
Just-Insane Apr 17, 2026
4f2e3e0
feat(timeline): show skeleton overlay while measuring first-visit rooms
Just-Insane Apr 17, 2026
32917c2
fix(timeline): eliminate room-open and jump-to-message jitter
Just-Insane Apr 17, 2026
1b5b284
fix(timeline): skip TimelineReset hide for additive sliding-sync resets
Just-Insane Apr 17, 2026
700ea1e
Merge branch 'feat/devtool-rotate-sessions' into feat/developer-tools
Just-Insane Apr 17, 2026
272eff3
Merge branch 'feat/feature-flag-env-vars' into feat/developer-tools
Just-Insane Apr 17, 2026
5b58dd5
Merge branch 'feat/media-dimension-hints' into perf/timeline-rendering
Just-Insane Apr 17, 2026
1c5dc03
Merge branch 'fix/timeline-jitter' into perf/timeline-rendering
Just-Insane Apr 17, 2026
7cf0def
Merge fix/ui-regressions into perf/timeline-rendering (resolve confli…
Just-Insane Apr 17, 2026
deae460
Merge perf/timeline-item-memo into perf/timeline-rendering (resolve c…
Just-Insane Apr 17, 2026
131fe1c
fix(timeline): guard cache restore, unread dots, and jump scroll-back
Just-Insane Apr 17, 2026
4e4d368
fix(timeline): prevent double-render and content-chase flash
Just-Insane Apr 18, 2026
7579368
perf(sidebar): debounce room preview and DM sort updates
Just-Insane Apr 18, 2026
f9c5b4d
fix(timeline): restore room-open position and dedupe overlap
Just-Insane Apr 18, 2026
399c7cb
chore(timeline): clean reveal comment
Just-Insane Apr 18, 2026
f8986c1
fix(preview): resolve display names in room previews
Just-Insane Apr 18, 2026
78cdd24
fix(timeline): invalidate stale room scroll cache
Just-Insane Apr 19, 2026
5f41827
Merge branch 'dev' into feat/presence
Just-Insane Apr 19, 2026
111d57e
Merge branch 'dev' into feat/room-message-preview
Just-Insane Apr 19, 2026
b60c2dc
Merge branch 'dev' into feat/message-bookmarks
Just-Insane Apr 19, 2026
77f806a
Merge branch 'dev' into feat/polls
Just-Insane Apr 19, 2026
68d653d
Merge branch 'dev' into fix/async-callback-rejections
Just-Insane Apr 19, 2026
5cc0da5
fix(presence): normalize dnd state handling
Just-Insane Apr 19, 2026
e1adb09
fix(preview): remove timeline spillover
Just-Insane Apr 19, 2026
3bea590
fix(bookmarks): remove unrelated branch spillover
Just-Insane Apr 19, 2026
fd9e007
chore(bookmarks): fix branch validation issues
Just-Insane Apr 19, 2026
e4e6b83
fix(timeline): remove stale room scroll restore
Just-Insane Apr 19, 2026
abc83a2
chore(timeline): fix room timeline formatting
Just-Insane Apr 19, 2026
7835ed1
feat(timeline): restore room cache by event anchor
Just-Insane Apr 19, 2026
b4ee4ee
fix(timeline): resolve anchored cache restore wiring
Just-Insane Apr 19, 2026
ed9915c
fix(timeline): finalize anchored cache restore
Just-Insane Apr 19, 2026
efd8578
fix(timeline): align reset relinking with upstream
Just-Insane Apr 19, 2026
ef01765
fix(presence): harden desktop auto-idle detection
Just-Insane Apr 19, 2026
5814956
fix(timeline): stabilize bottom pin and unread fallback
Just-Insane Apr 19, 2026
b2878b5
fix(timeline): align initial room-fill thresholds
Just-Insane Apr 19, 2026
1e15b4b
fix(notifications): open joined rooms at live timeline on notificatio…
Just-Insane Apr 13, 2026
164a6b6
fix(notifications): prefer live timeline before event-scoped jump
Just-Insane Apr 13, 2026
143e012
fix(notifications): defer event-scoped jump until event appears in li…
Just-Insane Apr 13, 2026
910d13a
fix(notifications): improve notification jump reliability
Just-Insane Apr 18, 2026
67b1a11
fix(notifications): guarantee jump timeout fallback
Just-Insane Apr 19, 2026
a7f8c1a
fix(sw): reuse preloaded session in handleMinimalPushPayload
Just-Insane Apr 15, 2026
ce68c59
fix(sw): improve push notification reliability and encrypted room han…
Just-Insane Apr 15, 2026
84fadae
fix(sw): add media and notification diagnostics
Just-Insane Apr 19, 2026
c4ca608
fix(timeline): stabilize bottom pin and unread fallback
Just-Insane Apr 19, 2026
157df81
fix(timeline): align initial room-fill thresholds
Just-Insane Apr 19, 2026
be5bcd2
fix(timeline): align reset relinking with upstream
Just-Insane Apr 19, 2026
1fc16ae
fix(notifications): skip in-app notification for active room
Just-Insane Apr 17, 2026
0491959
fix(notifications): pass room and userId context to reaction notifica…
Just-Insane Apr 12, 2026
f6a7cd7
fix(badge): only clear app badge when foregrounded
Just-Insane Apr 16, 2026
2ef5386
fix(notifications): normalize DM room names
Just-Insane Apr 18, 2026
afc2b49
feat(types): add experiment config, sessionSync types and useExperime…
Just-Insane Apr 12, 2026
6b89dc6
fix(sw): increase session TTL to 24h and add requestSessionWithTimeou…
Just-Insane Apr 11, 2026
d863695
fix(sw): reset heartbeat backoff on foreground sync; warm preloadedSe…
Just-Insane Apr 11, 2026
52bbbc6
fix(notifications): restore background visibility sync
Just-Insane Apr 18, 2026
ff50906
fix(sw): recover session sync without controller
Just-Insane Apr 19, 2026
f95c396
test(notifications): align jumper room mock with room utils
Just-Insane Apr 19, 2026
39e25e3
test(notifications): use current jotai hydrate api
Just-Insane Apr 19, 2026
e12a4b0
test(notifications): initialize jumper atoms via jotai store
Just-Insane Apr 19, 2026
ead2bb1
fix(notifications): avoid jumper ref lint error
Just-Insane Apr 19, 2026
e6e6048
fix: kick sliding sync on foreground return
Just-Insane Apr 15, 2026
449de0a
fix(config): enable SW session sync phases for reliable mobile notifi…
Just-Insane Apr 15, 2026
b851f43
feat(cache): unregister service workers on Clear Cache
Just-Insane Apr 16, 2026
a374275
fix(nav): check DM membership before space parents in useRoomNavigate
Just-Insane Apr 15, 2026
21f0f39
Merge branch 'feat/message-bookmarks' into integration
Just-Insane Apr 21, 2026
1e483cc
Merge branch 'feat/polls' into integration
Just-Insane Apr 21, 2026
344536c
Merge branch 'feat/presence' into integration
Just-Insane Apr 21, 2026
0b2b720
Merge branch 'feat/room-message-preview' into integration
Just-Insane Apr 21, 2026
2144458
Merge branch 'fix/async-callback-rejections' into integration
Just-Insane Apr 21, 2026
90aee8c
Merge branch 'fix/notification-context-suppression' into integration
Just-Insane Apr 21, 2026
88840d7
Merge branch 'fix/notification-jump-core' into integration
Just-Insane Apr 21, 2026
93ebd90
Merge branch 'fix/notification-room-labels' into integration
Just-Insane Apr 21, 2026
4896b70
Merge branch 'fix/push-decryption-fallback' into integration
Just-Insane Apr 21, 2026
aeeb6ec
Merge branch 'fix/push-diagnostics' into integration
Just-Insane Apr 21, 2026
0338a34
Merge branch 'fix/sw-session-recovery-core' into integration
Just-Insane Apr 21, 2026
27ac950
Merge branch 'fix/timeline-bottom-pin' into integration-rebuild
Just-Insane Apr 21, 2026
6da27d6
Merge branch 'fix/timeline-reset-alignment' into integration-rebuild
Just-Insane Apr 21, 2026
88b7f05
Merge branch 'fix/cache-sw-unregister' into integration-rebuild
Just-Insane Apr 21, 2026
15911d4
Merge branch 'fix/dm-nav-priority' into integration-rebuild
Just-Insane Apr 21, 2026
8054b69
Merge branch 'personal/config' into integration-rebuild
Just-Insane Apr 21, 2026
ffd63b5
fix(notifications): add registration.active fallback for SW message r…
Just-Insane Apr 21, 2026
3484ec5
fix(timeline): remove duplicate MIN_INITIAL_SCROLL_ROOM_PX declaration
Just-Insane Apr 21, 2026
953c716
fix(timeline): restore missing refs and roomScrollCache utility
Just-Insane Apr 21, 2026
0b9b0fd
fix(lint): resolve all ESLint errors across integration
Just-Insane Apr 21, 2026
95c9993
feat(timeline): configurable message grouping threshold
Just-Insane Apr 22, 2026
f99f9ba
Merge feat/message-grouping into integration
Just-Insane Apr 22, 2026
1eb3847
fix(sw): defer skipWaiting to user-confirmed update prompt
Just-Insane Apr 22, 2026
5ba7bd7
Merge fix/sw-update-skipwaiting into integration
Just-Insane Apr 22, 2026
022649c
fix(room-nav): use stable room ID keys in virtualized room lists
Just-Insane Apr 22, 2026
dbef5d9
Merge fix/virtualizer-room-keys into integration
Just-Insane Apr 22, 2026
a8b17b8
fix(presence): add heartbeat to win back online state on multi-device
Just-Insane Apr 22, 2026
807d00f
Merge feat/presence into integration
Just-Insane Apr 22, 2026
13d1baf
fix(notifications): re-register pusher on mount and catch togglePushe…
Just-Insane Apr 22, 2026
1c50d87
fix(notifications): clear badge on foreground when highlights already…
Just-Insane Apr 22, 2026
708a76a
fix(notifications): restore unread fallback paths for non-DM rooms
Just-Insane Apr 22, 2026
3e373ce
fix(sw): remove 24h session TTL and guard event.data.json()
Just-Insane Apr 24, 2026
d570e4b
fix(sw): require focused+visible to suppress push on iOS
Just-Insane Apr 24, 2026
b2b043c
fix(timeline): restore visible timeline when loadEventTimeline fails
Just-Insane Apr 24, 2026
65b45ba
fix(SyncStatus): only show Connecting... on reconnect, not initial load
Just-Insane Apr 24, 2026
9199a87
fix(sw): guard decrypt-relay suppression with appFocused check
Just-Insane Apr 26, 2026
d82f8e4
revert(SyncStatus): restore upstream connecting banner condition
Just-Insane Apr 26, 2026
646a3e0
Merge origin/integration into perf/timeline-rendering
Just-Insane Apr 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/async-callback-rejections.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: patch
---

Suppress "Uncaught (in promise)" console noise for fire-and-forget `useAsyncCallback` call sites; errors are still surfaced to callers that await the returned promise and captured in `AsyncState`
5 changes: 5 additions & 0 deletions .changeset/devtool-rotate-sessions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: patch
---

Add developer tool to force-rotate outbound Megolm encryption sessions per room, useful for testing key rotation and bridge session recovery
5 changes: 5 additions & 0 deletions .changeset/feat-dm-message-preview.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: minor
---

feat(dm-list): show last-message preview below DM room name
5 changes: 5 additions & 0 deletions .changeset/feat-polls.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: minor
---

Add MSC3381 polls: create, vote on, and end polls directly in rooms (opt-in via `features.polls` in config.json).
5 changes: 5 additions & 0 deletions .changeset/feature-flag-env-vars.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: minor
---

Add build-time client config overrides via environment variables, with typed deterministic experiment bucketing helpers for progressive feature rollout and A/B testing.
5 changes: 5 additions & 0 deletions .changeset/fix-timeline-scroll-regressions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: patch
---

Fix timeline scroll regressions: stay-at-bottom, Jump to Latest button flicker, phantom unread dot, and blank notification page recovery
5 changes: 5 additions & 0 deletions .changeset/message-bookmarks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: minor
---

Add message bookmarks (MSC4438). Users can bookmark messages for easy retrieval via a new Bookmarks section in the home sidebar. Gated by an operator `config.json` experiment flag (`experiments.messageBookmarks`) and a per-user experimental settings toggle.
5 changes: 5 additions & 0 deletions .changeset/perf-timeline-item-memo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: patch
---

Memoize individual VList timeline items to prevent mass re-renders when unrelated state changes (e.g. typing indicators, read receipts, or new messages while not at the bottom).
5 changes: 5 additions & 0 deletions .changeset/perf-timeline-scroll-cache.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: patch
---

Cache VList item heights across room visits to restore scroll position instantly and skip the 80 ms opacity-fade stabilisation timer on revisit.
5 changes: 5 additions & 0 deletions .changeset/presence-auto-idle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: minor
---

feat(presence): add auto-idle presence after configurable inactivity timeout with Discord-style status picker
5 changes: 5 additions & 0 deletions .changeset/presence-sidebar-badges.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: patch
---

Add presence status badges to sidebar DM list and account switcher
5 changes: 5 additions & 0 deletions .changeset/reaction-notification-context.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: patch
---

Fix reaction notifications not being delivered by passing room and user context to the notification event filter
5 changes: 5 additions & 0 deletions .changeset/room-message-preview.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
default: minor
---

feat(room-nav): show topic and last-message preview for rooms in the sidebar, fetching enough timeline events to handle reactions and edits correctly
152 changes: 152 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
// Codespace configuration — lives on personal/config (not ephemeral dev/feat branches).
// This file intentionally targets browser-based use on iPad.
{
"name": "Sable",
// Using base + node feature instead of javascript-node:<tag> to avoid
// tag availability issues on newer Node versions.
"image": "mcr.microsoft.com/devcontainers/base:bookworm",

"features": {
"ghcr.io/devcontainers/features/node:1": { "version": "24" },
// Keep git up-to-date for SSH signing support (git ≥ 2.34).
"ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers/features/github-cli:1": {}
},

// ── Codespace user secrets ──────────────────────────────────────────────────
// Configure these at: github.com/settings/codespaces > Secrets
//
// GIT_SIGNING_KEY — passphrase-free SSH private key (ed25519 recommended).
// Add the matching public key to your GitHub account as a
// "signing key": github.com/settings/keys
// postCreate.sh will wire up git automatically if set.
//
// SSH_AUTH_KEY — passphrase-free SSH private key (ed25519 recommended).
// Add the matching public key to ~/.ssh/authorized_keys on
// any server you want to SSH into from the Codespace.
//
// GIT_USER_NAME — e.g. "Evie"
// GIT_USER_EMAIL — e.g. "evie@gauthier.id"
// ───────────────────────────────────────────────────────────────────────────

"remoteEnv": {
// Pin the pnpm store to a known path so the volume mount works across rebuilds.
"PNPM_STORE_DIR": "/home/vscode/.pnpm-store"
},

"customizations": {
"vscode": {
"settings": {
// ── Layout — tuned for iPad browser (vscode.dev / Codespaces web) ─────
// Move the activity bar to the top so it isn't hidden by the iOS Safari
// toolbar or the browser's combined title/status bar.
"workbench.activityBar.location": "top",
// Use a menu for the layout control — fewer tiny hit targets on touch.
"workbench.layoutControl.type": "menu",
// Place the panel (Terminal, Problems, Copilot Chat history) on the
// right so it doesn't fight with the keyboard on small screens.
"workbench.panel.defaultLocation": "right",
// Keep editor tabs visible and wrap them so none are hidden off-screen.
"workbench.editor.showTabs": "multiple",
"workbench.editor.wrapTabs": true,
// Disable minimap — saves horizontal space, improves touch accuracy.
"editor.minimap.enabled": false,
"editor.scrollBeyondLastLine": false,
// Larger default fonts for retina/HiDPI iPad displays.
// Fira Code is loaded as a web font by the tonsky.font-fira-code extension.
// This works for the Monaco *editor* (HTML/CSS rendered), but xterm.js uses
// canvas drawing — it does NOT reliably inherit CSS @font-face on iOS Safari.
// MesloLGS NF / Monaco / Meslo are not iOS system fonts either.
// → Editor: Fira Code via extension is fine.
// → Terminal: use Menlo only (ships with iOS since iOS 7, always available).
"editor.fontSize": 14,
"editor.fontFamily": "'MesloLGS NF', 'Fira Code', Menlo, 'Courier New', monospace",
"editor.fontLigatures": true,
"terminal.integrated.fontSize": 14,
"terminal.integrated.fontFamily": "Menlo, 'Courier New', monospace",
"terminal.integrated.fontLigatures.enabled": false,
"terminal.integrated.gpuAcceleration": "off",

// Use zsh (installed in onCreate) as the default terminal shell.
// Explicit profile with -l (login shell) ensures nvm / PATH additions
// from the devcontainer node feature are loaded inside the terminal.
"terminal.integrated.defaultProfile.linux": "zsh",
"terminal.integrated.profiles.linux": {
"zsh": { "path": "/bin/zsh", "args": ["-l"] }
},

// Shell integration MUST be enabled for Copilot Chat to run terminal
// commands. We set it explicitly because Powerlevel10k instant prompt
// can fire before VS Code injects its integration script and suppress
// the markers — postCreate.sh patches .zshrc to guard against this.
"terminal.integrated.shellIntegration.enabled": true,

// ── Git signing ───────────────────────────────────────────────────────
// postCreate.sh configures gpg.format and user.signingkey if
// GIT_SIGNING_KEY secret is present. This just keeps VS Code's git
// UI in sync.
"git.enableCommitSigning": true,
"git.confirmSync": false,

// ── Copilot Chat ──────────────────────────────────────────────────────
// Always show follow-ups and keep chat history accessible.
"github.copilot.chat.followUps": "always",
// Disable auto-discovery of extension-provided MCP servers (e.g. the
// io.github.github/github-mcp-server registered by vscode-pull-request-github).
// Our explicit HTTP server in .vscode/mcp.json is unaffected and handles all
// GitHub MCP calls without requiring a token prompt.
"chat.mcp.discovery.enabled": false
},
"extensions": [
// ── Copilot ───────────────────────────────────────────────────────────
"GitHub.copilot",
"GitHub.copilot-chat",
"GitHub.vscode-pull-request-github",
// ── Font (web font — required for terminal in browser/iPad) ───────────
"tonsky.font-fira-code",
// ── Theme ─────────────────────────────────────────────────────────────
"GitHub.github-vscode-theme",
// ── Formatting & linting ──────────────────────────────────────────────
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"streetsidesoftware.code-spell-checker",
"davidanson.vscode-markdownlint",
// ── Testing ───────────────────────────────────────────────────────────
"vitest.explorer",
// ── TypeScript / React ────────────────────────────────────────────────
"bradlc.vscode-tailwindcss",
"styled-components.vscode-styled-components",
"dsznajder.es7-react-js-snippets",
"formulahendry.auto-rename-tag",
"wix.vscode-import-cost",
// ── Utilities ─────────────────────────────────────────────────────────
"christian-kohler.path-intellisense",
"usernamehw.errorlens",
"gruntfuggly.todo-tree",
"wayou.vscode-todo-highlight",
"webpro.vscode-knip",
"lokalise.i18n-ally",
// ── Infrastructure ────────────────────────────────────────────────────
"hashicorp.terraform",
"zamerick.vscode-caddyfile-syntax"
]
}
},

// ── Port forwarding ─────────────────────────────────────────────────────────
"forwardPorts": [5173, 4173],
"portsAttributes": {
"5173": { "label": "Vite dev", "onAutoForward": "notify" },
"4173": { "label": "Vite preview", "onAutoForward": "notify" }
},

// ── Persistence ─────────────────────────────────────────────────────────────
// Named volume keeps the pnpm content-addressable store across rebuilds.
// Combined with the PNPM_STORE_DIR env var above so postCreate can also
// point pnpm at the same path.
"mounts": ["source=sable-pnpm-store,target=/home/vscode/.pnpm-store,type=volume"],

"postCreateCommand": "bash .devcontainer/postCreate.sh",
"onCreateCommand": "bash .devcontainer/onCreate.sh",
"remoteUser": "vscode"
}
60 changes: 60 additions & 0 deletions .devcontainer/onCreate.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#!/bin/bash
# onCreate.sh — runs during prebuild AND on first Codespace creation.
# No user secrets are available here — keep this purely about dependencies.
# Everything here is cached in the prebuild snapshot.
set -euo pipefail

# ── Ensure the node feature's PATH additions are active ──────────────────────
# The devcontainers node feature installs via nvm; source it so `node`/`pnpm`
# resolve correctly even in non-login, non-interactive shells.
export NVM_DIR="${NVM_DIR:-/usr/local/share/nvm}"
# shellcheck source=/dev/null
[ -s "${NVM_DIR}/nvm.sh" ] && source "${NVM_DIR}/nvm.sh" --no-use
# Activate the version pinned in .nvmrc / package.json engines.
nvm use 24 2>/dev/null || nvm use node

# ── Fix named-volume ownership ────────────────────────────────────────────────
# Docker mounts named volumes as root; fix ownership so the vscode user can write.
if [ -d "${PNPM_STORE_DIR:-}" ]; then
sudo chown -R "$(id -u):$(id -g)" "${PNPM_STORE_DIR}"
fi

# ── pnpm ──────────────────────────────────────────────────────────────────────
# Suppress corepack's interactive download-confirmation prompt in CI/prebuild.
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0

# Enable corepack so the exact pnpm version from package.json#packageManager is used.
corepack enable

# Point pnpm at the persistent named-volume store so packages survive rebuilds.
if [ -n "${PNPM_STORE_DIR:-}" ]; then
pnpm config set store-dir "${PNPM_STORE_DIR}"
fi

pnpm install

# ── Zsh + Oh My Zsh + Powerlevel10k ──────────────────────────────────────────
# Install these during prebuild so the first Codespace start is fast.
# The dotfiles checkout in postCreate.sh will provide .zshrc / .p10k.zsh.

# Install zsh and tmux if not already present (base:bookworm ships zsh, but be safe).
if ! command -v zsh &>/dev/null || ! command -v tmux &>/dev/null; then
sudo apt-get update -qq && sudo apt-get install -y -qq zsh tmux
fi

# Install Oh My Zsh non-interactively (KEEP_ZSHRC=yes preserves any existing .zshrc).
if [ ! -d "${HOME}/.oh-my-zsh" ]; then
KEEP_ZSHRC=yes CHSH=no RUNZSH=no \
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
fi

# Install Powerlevel10k as an OMZ custom theme.
P10K_DIR="${ZSH_CUSTOM:-${HOME}/.oh-my-zsh/custom}/themes/powerlevel10k"
if [ ! -d "${P10K_DIR}" ]; then
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${P10K_DIR}"
fi

# Make zsh the default shell for this user.
sudo chsh -s "$(command -v zsh)" "$(whoami)"

echo "✓ onCreate complete"
Loading