Skip to content

Infinite scroll, and read markers that follow you across clients - #309

Open
matheusfillipe wants to merge 46 commits into
stack/wide-pagesfrom
stack/infinite-scroll
Open

matheusfillipe wants to merge 46 commits into
stack/wide-pagesfrom
stack/infinite-scroll

Conversation

@matheusfillipe

Copy link
Copy Markdown
Contributor

Reading back in a channel meant clicking "Load older messages" over and over, and opening Obby on another device always dropped you at the bottom.

Now history loads as you scroll, both up and down, with skeleton rows while it arrives. Chats open on a red New messages line at the last message you actually read, shared between your clients through draft/read-marker. The marker only moves while you are looking at the newest messages.

sequenceDiagram
  participant P as Phone
  participant S as Server
  participant D as Desktop
  D->>S: JOIN #chan
  S->>D: MARKREAD #chan timestamp=T1
  Note over D: opens on the "New messages" line after T1
  Note over P: user reads to the bottom
  P->>S: MARKREAD #chan timestamp=T2
  S->>D: MARKREAD #chan timestamp=T2
  Note over D: unread badge clears, the mention notification closes
Loading

Where to look:

  • ChannelMessageList.tsx: loading at either edge replaces the load button, one arrow takes you to the bottom (or back to the present after a search jump), and the unread line.
  • store/handlers/readMarker.ts: when we send MARKREAD (app visible, at the bottom, stored marker known) and what an incoming one clears.
  • store/handlers/history.ts: older channel pages go to the local history first and are shown from there.
  • Smaller fixes: our account is now recorded from 900/901 (without it we never sent a marker), and waking the machine pings the server and reconnects a dead socket.

Channel markers need obbyworld/ObbyIRCd#26. Until it is deployed, only private chats get them.

@coderabbitai

coderabbitai Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 165 files, which is 65 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 6043ba70-a702-4a25-8654-c1dadbfc0e36
📥 Commits

Reviewing files that changed from the base of the PR and between 9371f2f and 62ce1d1.

⛔ Files ignored due to path filters: 1
  • src-tauri/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing: 165
  • AGENTS.md
  • lefthook.yml
  • package.json
  • src-tauri/Cargo.toml
  • src-tauri/src/lib.rs
  • src-tauri/vendor/swift-rs/.gitattributes
  • src-tauri/vendor/swift-rs/.gitignore
  • src-tauri/vendor/swift-rs/Cargo.toml
  • src-tauri/vendor/swift-rs/LICENSE-APACHE
  • src-tauri/vendor/swift-rs/LICENSE-MIT
  • src-tauri/vendor/swift-rs/src-rs/autorelease.rs
  • src-tauri/vendor/swift-rs/src-rs/build.rs
  • src-tauri/vendor/swift-rs/src-rs/dark_magic.rs
  • src-tauri/vendor/swift-rs/src-rs/lib.rs
  • src-tauri/vendor/swift-rs/src-rs/swift.rs
  • src-tauri/vendor/swift-rs/src-rs/swift_arg.rs
  • src-tauri/vendor/swift-rs/src-rs/swift_ret.rs
  • src-tauri/vendor/swift-rs/src-rs/test-build.rs
  • src-tauri/vendor/swift-rs/src-rs/types/array.rs
  • src-tauri/vendor/swift-rs/src-rs/types/data.rs
  • src-tauri/vendor/swift-rs/src-rs/types/mod.rs
  • src-tauri/vendor/swift-rs/src-rs/types/object.rs
  • src-tauri/vendor/swift-rs/src-rs/types/scalars.rs
  • src-tauri/vendor/swift-rs/src-rs/types/string.rs
  • src-tauri/vendor/swift-rs/tests/test_bindings.rs
  • src/App.tsx
  • src/components/layout/AppLayout.tsx
  • src/components/layout/ChannelMessageList.tsx
  • src/components/layout/ChatArea.tsx
  • src/components/layout/MemberList.tsx
  • src/components/layout/SearchPane.tsx
  • src/components/message/JsonLogMessage.tsx
  • src/components/message/MessageAvatar.tsx
  • src/components/message/MessageItem.tsx
  • src/components/pages/BotsPage.tsx
  • src/components/pages/ChannelSettingsPage.tsx
  • src/components/pages/EmojiPacksPage.tsx
  • src/components/pages/ServerSettingsPage.tsx
  • src/components/pages/SettingsPage.tsx
  • src/components/pages/TwoFactorPage.tsx
  • src/components/ui/ExternalLinkGuard.tsx
  • src/components/ui/ExternalLinkWarningModal.tsx
  • src/components/ui/HomeScreen.tsx
  • src/components/ui/HoverTooltip.tsx
  • src/components/ui/LinkHoverLayer.tsx
  • src/components/ui/LinkWrapper.tsx
  • src/components/ui/MediaCommentsSidebar.tsx
  • src/components/ui/OAuthSection.tsx
  • src/components/ui/SkeletonRow.tsx
  • src/components/ui/UploadProgressBar.tsx
  • src/components/ui/UploadProgressOverlay.tsx
  • src/components/ui/settings/SettingRenderer.tsx
  • src/hooks/useConnectionResilience.ts
  • src/hooks/useMessageJump.ts
  • src/hooks/useMessageSending.ts
  • src/lib/history/historyLines.ts
  • src/lib/irc/IRCClient.ts
  • src/lib/irc/handlers/channels.ts
  • src/lib/irc/handlers/connection.ts
  • src/lib/irc/handlers/index.ts
  • src/lib/irc/handlers/messages.ts
  • src/lib/ircUtils.tsx
  • src/lib/jumpToMessage.ts
  • src/lib/modal/BaseModal.tsx
  • src/lib/modal/ConfirmDialog.tsx
  • src/lib/notifications.ts
  • src/lib/openUrl.ts
  • src/lib/ownPrivateMessage.ts
  • src/locales/cs/messages.mjs
  • src/locales/cs/messages.po
  • src/locales/de/messages.mjs
  • src/locales/de/messages.po
  • src/locales/en/messages.mjs
  • src/locales/en/messages.po
  • src/locales/es/messages.mjs
  • src/locales/es/messages.po
  • src/locales/fi/messages.mjs
  • src/locales/fi/messages.po
  • src/locales/fr/messages.mjs
  • src/locales/fr/messages.po
  • src/locales/it/messages.mjs
  • src/locales/it/messages.po
  • src/locales/ja/messages.mjs
  • src/locales/ja/messages.po
  • src/locales/ko/messages.mjs
  • src/locales/ko/messages.po
  • src/locales/nl/messages.mjs
  • src/locales/nl/messages.po
  • src/locales/pl/messages.mjs
  • src/locales/pl/messages.po
  • src/locales/pt/messages.mjs
  • src/locales/pt/messages.po
  • src/locales/ro/messages.mjs
  • src/locales/ro/messages.po
  • src/locales/ru/messages.mjs
  • src/locales/ru/messages.po
  • src/locales/sv/messages.mjs
  • src/locales/sv/messages.po
  • src/locales/tr/messages.mjs
  • src/locales/tr/messages.po
  • src/locales/uk/messages.mjs
  • src/locales/uk/messages.po
  • src/locales/zh-TW/messages.mjs
  • src/locales/zh-TW/messages.po
  • src/locales/zh/messages.mjs
  • src/locales/zh/messages.po
  • src/protocol/mode.ts
  • src/store/handlers/auth.ts
  • src/store/handlers/batches.ts
  • src/store/handlers/botTools.ts
  • src/store/handlers/channels.ts
  • src/store/handlers/connection.ts
  • src/store/handlers/e2ee.ts
  • src/store/handlers/history.ts
  • src/store/handlers/messages.ts
  • src/store/handlers/metadata.ts
  • src/store/handlers/named-modes.ts
  • src/store/handlers/privateChatArrival.ts
  • src/store/handlers/pushbot.ts
  • src/store/handlers/readMarker.ts
  • src/store/handlers/tictactoe.ts
  • src/store/handlers/users.ts
  • src/store/handlers/whois.ts
  • src/store/helpers.ts
  • src/store/index.ts
  • src/store/pendingJoins.ts
  • src/types/index.ts
  • tests/App.test.tsx
  • tests/components/ChatArea.test.tsx
  • tests/components/HomeScreen.icon.test.ts
  • tests/components/MetadataDisplay.test.tsx
  • tests/components/ServerSettingsPage.test.tsx
  • tests/components/ServerSummary.test.tsx
  • tests/components/TooltipPanel.test.tsx
  • tests/components/layout/ChannelMessageList.opening.test.tsx
  • tests/components/layout/ChannelMessageList.scroll.test.tsx
  • tests/components/pages/ChannelSettingsPage.test.tsx
  • tests/components/pages/SettingsPage.test.tsx
  • tests/components/pages/TwoFactorPage.test.tsx
  • tests/components/ui/ExternalLinkGuard.test.tsx
  • tests/components/ui/OAuthSection.test.tsx
  • tests/fixtures/localStorageBacking.ts
  • tests/lib/channelTypes.test.ts
  • tests/lib/history/historyLines.test.ts
  • tests/lib/irc/receiveTime.test.ts
  • tests/lib/ircClient.test.ts
  • tests/lib/ircClientWake.test.ts
  • tests/lib/ownPrivateMessage.test.ts
  • tests/protocol/labeledResponseBatch.test.ts
  • tests/protocol/mode.test.ts
  • tests/setup.ts
  • tests/store/botTools.test.ts
  • tests/store/bouncerConnect.test.ts
  • tests/store/chathistory.test.ts
  • tests/store/connectToSavedServers.test.ts
  • tests/store/deleteServerBouncer.test.ts
  • tests/store/e2eeResilience.test.ts
  • tests/store/historyWindow.test.ts
  • tests/store/join.test.ts
  • tests/store/localHistory.test.ts
  • tests/store/ownAway.test.ts
  • tests/store/readMarker.test.ts
  • tests/store/refusedJoin.test.ts
  • tests/store/sameNetworkAccounts.test.ts
  • tests/store/typingTags.test.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@matheusfillipe
matheusfillipe added this pull request to stack #308 October 12, 2026 11:27
@github-actions

Copy link
Copy Markdown

Pages Preview
Preview URL: https://stack-infinite-scroll.obsidianirc.pages.dev

Automated deployment preview for the PR in the Cloudflare Pages.

… and keep unseen messages unread while history is late
ValwareIRC
ValwareIRC previously approved these changes Oct 17, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants