-
Notifications
You must be signed in to change notification settings - Fork 44
feat(room-nav): show topic and last-message preview for rooms in the sidebar #669
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
Just-Insane
wants to merge
223
commits into
SableClient:dev
Choose a base branch
from
Just-Insane:feat/room-message-preview
base: dev
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from all commits
Commits
Show all changes
223 commits
Select commit
Hold shift + click to select a range
7c28e2b
Change GitHub owner from 'SableClient' to 'Just-Insane'
Just-Insane e977b36
Change default custom domain for Worker
Just-Insane 792fd83
Change default custom domain in variables.tf
Just-Insane 6ab811d
Change default custom domain to dev.cloudhub.social
Just-Insane a552488
Refactor config.json for new homeserver settings
Just-Insane 58ae0eb
chore: ignore .vscode/launch.json
Just-Insane ff747a3
ci: build latest Docker image from integration branch too
Just-Insane 024401b
ci: add Sentry env vars to Docker image build step
Just-Insane c40d5c8
ci: tag integration branch Docker image as 'integration'
Just-Insane a1aff9e
feat: add pre-push git hook for quality checks
Just-Insane 53a3aff
ci(docker): load env-specific client config overrides
Just-Insane 8366173
ci: integration uses preview env, dev uses production env
Just-Insane 02ced60
ci(workflows): trigger app deploys on config.json changes
Just-Insane 5090322
chore: codespace devcontainer config
Just-Insane bbb31fc
Update image
Just-Insane 34b1b4d
update startup script
Just-Insane 3edf610
Update setup-signing script
Just-Insane 37b6af1
Updates for ssh
Just-Insane 2ac47de
More script fixes
Just-Insane 68fdb85
more fixes
Just-Insane 6aa40cc
updates
Just-Insane 698bda0
add/setup extensions
Just-Insane 02e9d7a
Merge branch 'SableClient:dev' into personal/config
Just-Insane 2ab3bcd
chore(config): enable phase1 and phase2 session sync flags
Just-Insane 2cf9895
chore(config): add Copilot workspace instructions
Just-Insane bc6b57d
chore(config): remove devcontainer (setup didn't work out)
Just-Insane 94fae05
Revise GitHub Copilot workspace instructions
Just-Insane f68ee8e
Update branching instructions for syncing with upstream
Just-Insane 5c4fe1c
Revise instructions for clarity and consistency
Just-Insane 25258f1
Move `copilot-instructions.md` to correct location
Just-Insane bfee547
Clarify branch creation and PR instructions
Just-Insane 6df45a4
Docs have this location too...
Just-Insane a5f35e9
chore(config): split copilot-instructions into scoped instruction fil…
Just-Insane 201e230
Update git instructions in AGENTS.md
Just-Insane 04d59f5
Update git commands
Just-Insane 73beb8c
feat(presence): add presence badges to sidebar and fix sliding sync p…
Just-Insane 4a6289e
chore: add changeset for presence-sidebar-badges
Just-Insane 85a7f6d
fix(hooks): handle unhandled rejections in useAsyncCallback
Just-Insane 918f2d7
chore: add changeset for async-callback-rejections
Just-Insane bc58d6e
feat(flags): inject client config from GH environment variables at build
Just-Insane add3987
feat(flags): add typed experiment bucketing helper with rollout perce…
Just-Insane 718210f
feat(devtools): add Experiments panel to developer tools settings
Just-Insane dfebd09
test(flags): cover experiment bucketing and add changeset
Just-Insane a53112f
feat(polls): implement MSC3381 polls with creator dialog and timeline…
Just-Insane d9a6656
chore: add changeset for feat-polls
Just-Insane 117949f
feat(bookmarks): add message bookmarks (MSC4438)
Just-Insane f726833
test(bookmarks): add unit tests for MSC4438 bookmark domain and repos…
Just-Insane 2a9fa52
chore: add changeset for message-bookmarks
Just-Insane 68d35f9
chore(codespace): add devcontainer for iPad browser + SSH signing
Just-Insane d327e19
chore(codespace): add Fira Code font + ligatures
Just-Insane 426ef74
chore(codespace): split onCreate/postCreate for prebuild caching
Just-Insane 53930d4
chore(codespace): fix image tag, install OMZ+P10k, wire dotfiles bare…
Just-Insane d9a10cb
fix(codespace): suppress corepack download prompt, source nvm in onCr…
Just-Insane 6361351
fix(codespace): chown pnpm store volume before writing
Just-Insane 3fcd6c1
chore(devcontainer): add tmux, fix terminal font, add GitHub MCP server
Just-Insane 76e0c49
fix(devcontainer): use browser-safe font and compatible p10k glyphs f…
Just-Insane ff1b207
fix(devcontainer): use Menlo as terminal font for iOS compatibility
Just-Insane bccc48f
update devcontainer settings
Just-Insane 2964e89
fix(devcontainer): restore missing fontFamily settings
Just-Insane b3304bb
Update fontfamily
Just-Insane 06c9810
chore(devcontainer): sync extensions list with installed extensions
Just-Insane ac899aa
Update container config
Just-Insane dcb56f6
fix(devcontainer): load signing key into ssh-agent in postCreate
Just-Insane e848f3a
feat(devcontainer): add SSH_AUTH_KEY secret support for server access
Just-Insane a294d16
fix(devcontainer): disable extension MCP auto-discovery, fix p10k sed…
Just-Insane 2eeaa43
fix(devcontainer): enable shell integration for Copilot Chat terminal
Just-Insane a4751d4
chore(devcontainer): switch dotfiles branch to codespaces
Just-Insane 1ad6b03
fix(bookmarks): add missing focusId to MSC4438 settings SettingTile
Just-Insane 12888d9
fix(devtools): add focusId to ExperimentsPanel SettingTile
Just-Insane ac4e5b4
fix(presence): skip REST presence fetch when userId is empty string
Just-Insane 755588b
fix(bookmarks): soft-delete item before updating index in removeBookmark
Just-Insane 49a98b3
feat(polls): expose max_selections in poll creator dialog
Just-Insane 6a27271
test(polls): unit-test pure functions; export extractPollData/compute…
Just-Insane 35acb82
test(presence): add useUserPresence unit tests
Just-Insane 4404e84
feat(presence): add presenceMode setting and Discord-style status picker
Just-Insane 8f69b61
feat(presence): Discord-style presence picker with Idle, DND, and Inv…
Just-Insane 1ba25f8
fix(bookmarks): wire useInitBookmarks and fix orphan tombstoning
Just-Insane c178b77
feat(presence): add presence badges to sidebar and fix sliding sync p…
Just-Insane ac75284
chore: add changeset for presence-sidebar-badges
Just-Insane c7d44d8
fix(presence): skip REST presence fetch when userId is empty string
Just-Insane ce458fb
test(presence): add useUserPresence unit tests
Just-Insane f7c7fee
feat(presence): add presenceMode setting and Discord-style status picker
Just-Insane b86b5de
feat(presence): Discord-style presence picker with Idle, DND, and Inv…
Just-Insane a71bdab
feat(presence): auto-idle after inactivity timeout
Just-Insane ca97c9b
chore: add changeset for presence-auto-idle
Just-Insane 594fda0
fix(bookmarks): strip deleted flag on re-add to guarantee re-activation
Just-Insane 31441ad
feat(bookmarks): show Recently Removed section with Restore button
Just-Insane d8da869
fix: auto-format poll test imports for prettier compliance
Just-Insane 4a15b74
fix: remove unused params from mock Room callbacks
Just-Insane b0a8091
fix(security): block prototype-polluting keys in deepMerge
Just-Insane 264e4ab
fix(presence): restore missing experiment config helpers and clean pr…
Just-Insane 878f2fc
fix(presence): resolve missing deps and stabilize presence hook tests
Just-Insane e4d24b2
test(bookmarks): format repository tests for prettier compliance
Just-Insane 05fa657
fix: address PR #589 review comments
Just-Insane a2d5683
fix(bookmarks): react to item-level account data events and fix remov…
Just-Insane 4eeaa38
feat(room-nav): show topic/last-message preview for space and home rooms
Just-Insane 260a4e8
fix(sliding-sync): increase LIST_TIMELINE_LIMIT to 5 for message prev…
Just-Insane 9036ec9
chore: add changeset for room-message-preview
Just-Insane db9c1a4
feat(dm-list): show latest message preview below room name
Just-Insane 216aa6a
chore: add changeset for dm message preview
Just-Insane b848ac2
feat(dm-list): add toggle to hide DM message preview
Just-Insane ec10020
fix(settings): give DM Message Preview its own card in Visual Tweaks
Just-Insane 20376bf
refactor(sliding-sync): gate listTimelineLimit behind message preview…
Just-Insane 581f2ce
feat(dev-tools): add rotate-sessions developer tool
Just-Insane 86701ca
chore: add changeset for devtool-rotate-sessions
Just-Insane 4b29d29
fix: use || instead of ?? for DM preview fallback chain The nullish …
Just-Insane 2202bec
fix(bookmarks): add Fragment key, guard missing eventId, fix removeBo…
Just-Insane cd5192b
fix(dev-tools): address review feedback for rotate-sessions
Just-Insane 8cdf36a
chore: remove accidentally committed scratch files
Just-Insane e5bdd7c
fix(presence): address review feedback for presence sidebar badges
Just-Insane 3f03876
fix(presence): address review feedback for presence-auto-idle
Just-Insane 4cb00a5
fix(room-nav): address review feedback for message preview
Just-Insane 0231581
fix(presence): 5min default, wire visibility reset, add tests
Just-Insane 1f9dae9
test(room-nav): add useRoomLastMessage unit tests (28 tests)
Just-Insane 9d9dce7
fix(polls): handle encrypted poll events in timeline filter
Just-Insane 29e4076
refactor: align presence-auto-idle with sw-push-session-recovery
Just-Insane 12b379e
Merge branch 'feat/presence-sidebar-badges' into feat/presence
Just-Insane 2b39316
Merge branch 'feat/presence-auto-idle' into feat/presence
Just-Insane 69179c1
style: fix lint errors from merge
Just-Insane 9ebd8d3
Merge branch 'dev' into fix/async-callback-rejections
Just-Insane da4a07b
Merge branch 'dev' into feat/room-message-preview
Just-Insane d7fd640
fix(presence): address review feedback
Just-Insane 82bde31
fix(dev-tools): add error handling for prepareToEncrypt
Just-Insane e0eb8ab
Merge branch 'dev' into feat/polls
Just-Insane 7680897
fix(polls): strip invalid vote selections instead of discarding entir…
Just-Insane 850e025
fix(room-nav): use effective event type for decrypted message preview…
Just-Insane 7bb22d2
fix(nav): check DM membership before space parents in useRoomNavigate
Just-Insane 42c59ad
chore(prompts): add rebuild integration and review upstream PRs prompts
Just-Insane cb24302
chore: fix lint and format issues
Just-Insane 3149a37
chore: fix lint and format issues
Just-Insane 56de896
chore: fix lint and format issues
Just-Insane ca65cef
docs(changeset): clarify Megolm session rotation description
Just-Insane cbd653e
docs(changeset): accurately describe unhandled-rejection suppression …
Just-Insane 8fee117
docs: clarify that listTimelineLimit scales with message preview setting
Just-Insane 809a9bb
fix(preview): close decryption race in useRoomLastMessage
Just-Insane dc21873
fix(preview): poll/location preview, mxid localpart fallback
Just-Insane 8c3c0e7
fix(presence): retry setPresence on failure for app resume reliability
Just-Insane 71138ec
Update personal config.json
Just-Insane ad50ff1
fix(timeline): restore useLayoutEffect auto-scroll, fix new-message s…
Just-Insane 83031b2
fix(timeline): restore useLayoutEffect auto-scroll, fix new-message s…
Just-Insane bd31c97
fix(timeline): restore upstream scroll pattern for new messages
Just-Insane 17ccebd
fix(timeline): restore upstream scroll pattern for new messages
Just-Insane 1392b77
fix(timeline): align scrollToBottom with upstream, fix eventId race
Just-Insane 399418b
fix(timeline): align scrollToBottom with upstream, fix eventId race
Just-Insane 700ea1e
Merge branch 'feat/devtool-rotate-sessions' into feat/developer-tools
Just-Insane 272eff3
Merge branch 'feat/feature-flag-env-vars' into feat/developer-tools
Just-Insane 7579368
perf(sidebar): debounce room preview and DM sort updates
Just-Insane f8986c1
fix(preview): resolve display names in room previews
Just-Insane 5f41827
Merge branch 'dev' into feat/presence
Just-Insane 111d57e
Merge branch 'dev' into feat/room-message-preview
Just-Insane b60c2dc
Merge branch 'dev' into feat/message-bookmarks
Just-Insane 77f806a
Merge branch 'dev' into feat/polls
Just-Insane 68d653d
Merge branch 'dev' into fix/async-callback-rejections
Just-Insane 5cc0da5
fix(presence): normalize dnd state handling
Just-Insane e1adb09
fix(preview): remove timeline spillover
Just-Insane 3bea590
fix(bookmarks): remove unrelated branch spillover
Just-Insane fd9e007
chore(bookmarks): fix branch validation issues
Just-Insane ef01765
fix(presence): harden desktop auto-idle detection
Just-Insane 1e15b4b
fix(notifications): open joined rooms at live timeline on notificatio…
Just-Insane 164a6b6
fix(notifications): prefer live timeline before event-scoped jump
Just-Insane 143e012
fix(notifications): defer event-scoped jump until event appears in li…
Just-Insane 910d13a
fix(notifications): improve notification jump reliability
Just-Insane 67b1a11
fix(notifications): guarantee jump timeout fallback
Just-Insane a7f8c1a
fix(sw): reuse preloaded session in handleMinimalPushPayload
Just-Insane ce68c59
fix(sw): improve push notification reliability and encrypted room han…
Just-Insane 84fadae
fix(sw): add media and notification diagnostics
Just-Insane c4ca608
fix(timeline): stabilize bottom pin and unread fallback
Just-Insane 157df81
fix(timeline): align initial room-fill thresholds
Just-Insane be5bcd2
fix(timeline): align reset relinking with upstream
Just-Insane 1fc16ae
fix(notifications): skip in-app notification for active room
Just-Insane 0491959
fix(notifications): pass room and userId context to reaction notifica…
Just-Insane f6a7cd7
fix(badge): only clear app badge when foregrounded
Just-Insane 2ef5386
fix(notifications): normalize DM room names
Just-Insane afc2b49
feat(types): add experiment config, sessionSync types and useExperime…
Just-Insane 6b89dc6
fix(sw): increase session TTL to 24h and add requestSessionWithTimeou…
Just-Insane d863695
fix(sw): reset heartbeat backoff on foreground sync; warm preloadedSe…
Just-Insane 52bbbc6
fix(notifications): restore background visibility sync
Just-Insane ff50906
fix(sw): recover session sync without controller
Just-Insane f95c396
test(notifications): align jumper room mock with room utils
Just-Insane 39e25e3
test(notifications): use current jotai hydrate api
Just-Insane e12a4b0
test(notifications): initialize jumper atoms via jotai store
Just-Insane ead2bb1
fix(notifications): avoid jumper ref lint error
Just-Insane e6e6048
fix: kick sliding sync on foreground return
Just-Insane 449de0a
fix(config): enable SW session sync phases for reliable mobile notifi…
Just-Insane b851f43
feat(cache): unregister service workers on Clear Cache
Just-Insane a374275
fix(nav): check DM membership before space parents in useRoomNavigate
Just-Insane 21f0f39
Merge branch 'feat/message-bookmarks' into integration
Just-Insane 1e483cc
Merge branch 'feat/polls' into integration
Just-Insane 344536c
Merge branch 'feat/presence' into integration
Just-Insane 0b2b720
Merge branch 'feat/room-message-preview' into integration
Just-Insane 2144458
Merge branch 'fix/async-callback-rejections' into integration
Just-Insane 90aee8c
Merge branch 'fix/notification-context-suppression' into integration
Just-Insane 88840d7
Merge branch 'fix/notification-jump-core' into integration
Just-Insane 93ebd90
Merge branch 'fix/notification-room-labels' into integration
Just-Insane 4896b70
Merge branch 'fix/push-decryption-fallback' into integration
Just-Insane aeeb6ec
Merge branch 'fix/push-diagnostics' into integration
Just-Insane 0338a34
Merge branch 'fix/sw-session-recovery-core' into integration
Just-Insane 27ac950
Merge branch 'fix/timeline-bottom-pin' into integration-rebuild
Just-Insane 6da27d6
Merge branch 'fix/timeline-reset-alignment' into integration-rebuild
Just-Insane 88b7f05
Merge branch 'fix/cache-sw-unregister' into integration-rebuild
Just-Insane 15911d4
Merge branch 'fix/dm-nav-priority' into integration-rebuild
Just-Insane 8054b69
Merge branch 'personal/config' into integration-rebuild
Just-Insane ffd63b5
fix(notifications): add registration.active fallback for SW message r…
Just-Insane 3484ec5
fix(timeline): remove duplicate MIN_INITIAL_SCROLL_ROOM_PX declaration
Just-Insane 953c716
fix(timeline): restore missing refs and roomScrollCache utility
Just-Insane 0b9b0fd
fix(lint): resolve all ESLint errors across integration
Just-Insane 95c9993
feat(timeline): configurable message grouping threshold
Just-Insane f99f9ba
Merge feat/message-grouping into integration
Just-Insane 1eb3847
fix(sw): defer skipWaiting to user-confirmed update prompt
Just-Insane 5ba7bd7
Merge fix/sw-update-skipwaiting into integration
Just-Insane 022649c
fix(room-nav): use stable room ID keys in virtualized room lists
Just-Insane dbef5d9
Merge fix/virtualizer-room-keys into integration
Just-Insane a8b17b8
fix(presence): add heartbeat to win back online state on multi-device
Just-Insane 807d00f
Merge feat/presence into integration
Just-Insane 13d1baf
fix(notifications): re-register pusher on mount and catch togglePushe…
Just-Insane 1c50d87
fix(notifications): clear badge on foreground when highlights already…
Just-Insane 708a76a
fix(notifications): restore unread fallback paths for non-DM rooms
Just-Insane 3e373ce
fix(sw): remove 24h session TTL and guard event.data.json()
Just-Insane d570e4b
fix(sw): require focused+visible to suppress push on iOS
Just-Insane b2b043c
fix(timeline): restore visible timeline when loadEventTimeline fails
Just-Insane 65b45ba
fix(SyncStatus): only show Connecting... on reconnect, not initial load
Just-Insane 9199a87
fix(sw): guard decrypt-relay suppression with appFocused check
Just-Insane d82f8e4
revert(SyncStatus): restore upstream connecting banner condition
Just-Insane File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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" | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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" |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This changeset introduces a separate minor release entry for the DM message preview feature. If DM previews are intentionally part of this PR, the PR title/description should mention it; otherwise this changeset should probably be removed/split so release notes match the actual PR scope.