Search: names from the server, read posts from a local index #171

Merged
littlefox merged 3 commits from issue-154-search into main 2026-10-19 18:51:43 +00:00
Owner

Closes #154

Stacked on #170 (mute and follow), #168 (profiles) and #165. Until those merge, this diff includes them.

  • Names from the server: people and conferences.
  • Read posts from a local index of what this device has fetched anyway: subject, author, channel, date, and up to 4000 characters of text. Nothing is fetched just for the index (D-007).
    • Capped at 20 000 posts, oldest dropped.
    • IndexedDB in the browser, a file on desktop. Kept between sessions, cleared on logout.
  • Matching: every word, any order and case, newest first, with a snippet.
  • The view: 'Sök' under Alla kanaler (under Olästa on a phone), the palette, and /. It says what it covers.
  • kom_client::search (Index, Entry, the line format) with unit tests.

Verified:

  • new search.spec on desktop, Android and iPhone: find a read post by words in its body, a person by name (opens the profile), a hit opens the post, the index is still there after a reload, and gone after logout;
  • the palette spec;
  • the full suite: 259 passed; the 3 desktop _visual failures were the new nav button, diff checked and snapshots updated;
  • phone screenshot checked; clippy desktop, web and wasm.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8

Closes #154 Stacked on #170 (mute and follow), #168 (profiles) and #165. Until those merge, this diff includes them. - **Names from the server:** people and conferences. - **Read posts from a local index** of what this device has fetched anyway: subject, author, channel, date, and up to 4000 characters of text. Nothing is fetched just for the index (D-007). - Capped at 20 000 posts, oldest dropped. - IndexedDB in the browser, a file on desktop. Kept between sessions, cleared on logout. - **Matching:** every word, any order and case, newest first, with a snippet. - **The view:** 'Sök' under Alla kanaler (under Olästa on a phone), the palette, and `/`. It says what it covers. - `kom_client::search` (Index, Entry, the line format) with unit tests. Verified: - new search.spec on desktop, Android and iPhone: find a read post by words in its body, a person by name (opens the profile), a hit opens the post, the index is still there after a reload, and gone after logout; - the palette spec; - the full suite: 259 passed; the 3 desktop _visual failures were the new nav button, diff checked and snapshots updated; - phone screenshot checked; clippy desktop, web and wasm. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Who's here: presence dots next to names, idle times, a doing line of my own
Some checks are pending
ci / e2e (push) Has started running
ci / check (push) Successful in 13m35s
ci / desktop (push) Successful in 17m7s
4649eb09f3
Presence was only in the who-is-on list. One who-is-on-dynamic call,
refreshed on logins and logouts and every two minutes, now puts a dot by
logged-in people's names on posts, thread cards, the inbox and chats,
with how long ago they were active and what they're doing. The list
shows idle times, and I can set my own what-am-I-doing line.

Refs #156

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Sign up from the login page
Some checks are pending
ci / check (push) Has started running
ci / e2e (push) Has started running
ci / desktop (push) Has started running
b90242e66f
D-046: kom.lysator.liu.se accepts new accounts. 'Ny här? Skapa ett
konto' turns the form into one for a new account (name, password twice),
connects the usual way, creates the person and logs in with it. Refusals
are said plainly.

Refs #152

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Login: take the server from the form too
Some checks are pending
ci / e2e (push) Has started running
ci / check (push) Successful in 8m29s
ci / desktop (push) Successful in 12m56s
d84d731852
relay.spec once logged in through the default relay on iPhone: the
server typed before the field's input listener was attached was missed.
Submit now reads the server from the form like the name and password.

Refs #152

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Merge origin/main into issue-156-presence
Some checks are pending
ci / check (push) Has started running
ci / e2e (push) Has started running
ci / desktop (push) Has started running
fb20f2709c
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8

# Conflicts:
#	app/src/i18n.rs
#	docs/DESIGN.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Merge origin/main into issue-152-signup
All checks were successful
ci / check (push) Successful in 10m1s
ci / desktop (push) Successful in 16m42s
ci / e2e (push) Successful in 28m30s
72d116dd97
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Presence dot by person links too
Some checks are pending
ci / e2e (push) Has started running
ci / check (push) Successful in 9m46s
ci / desktop (push) Successful in 17m1s
4bebadd2f8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Merge pull request 'Sign up from the login page' (#164) from issue-152-signup into main
All checks were successful
ci / check (push) Successful in 11m5s
ci / desktop (push) Successful in 12m7s
ci / e2e (push) Successful in 24m24s
28c2df80b2
Merge origin/main into issue-156-presence
Some checks failed
ci / check (push) Successful in 11m5s
ci / desktop (push) Successful in 12m4s
ci / e2e (push) Failing after 35m50s
f58afcac18
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8

# Conflicts:
#	app/src/i18n.rs
e2e: tab names in either language
All checks were successful
ci / desktop (push) Successful in 13m25s
ci / check (push) Successful in 13m54s
ci / e2e (push) Successful in 32m28s
875fa6b30e
In the full suite i18n.spec leaves Bertil's UI in English, so
presence.spec couldn't find the Folk tab (CI run #285).

Refs #156

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
# Conflicts:
#	app/assets/main.css
#	app/src/i18n.rs
#151, D-048, D-049. A tap on an author, a name in the who-is-on list or
a person link opens a profile: avatar, presence or last login, the
presentation, recent posts, and Skriv brev. Avatars are the first
picture in the presentation, otherwise initials. On my own profile the
presentation and picture are edited by writing a new presentation as
elisp does (same recipients, a comment to the old one, then
set-presentation). A new account starts there.

Refs #151

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Profiles: person links open the profile; header avatars fit the line
Some checks failed
ci / check (push) Successful in 10m20s
ci / desktop (push) Successful in 12m30s
ci / e2e (push) Failing after 29m23s
dc0b72755f
links.spec now expects the profile (no longer the status page). A
post header's avatar is no taller than its text, so the lines below
don't shift.

Refs #151

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Mute and follow: people and subjects in elisp's filter list, threads ours
All checks were successful
ci / check (push) Successful in 8m30s
ci / desktop (push) Successful in 13m8s
ci / e2e (push) Successful in 28m2s
58f50c161f
#153. Tysta… on a post mutes its author, its subject or its thread, or
follows the thread. People and subjects go into elisp's
kom-permanent-filter-list when there's an elisp block (so the Emacs
client agrees), else into ours; threads are ours. Muted texts are read
unseen while reading on, with a count in the status line; followed
threads notify. Inställningar lists everything with a way to undo it.

Refs #153

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
#154. lyskomd can't search texts, so posts this device has fetched
anyway are indexed locally (IndexedDB in the browser, a file on
desktop), at most 20 000, and searched by all words; people and
channels come from the server by name. The view says what it covers.
Kept between sessions, cleared on logout.

Refs #154

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Visual snapshots: the Sök button in the left column
All checks were successful
ci / check (push) Successful in 9m35s
ci / desktop (push) Successful in 14m5s
ci / e2e (push) Successful in 27m21s
b9ddeb78ff
Refs #154

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Merge origin/main into issue-154-search
All checks were successful
ci / check (push) Successful in 9m28s
ci / desktop (push) Successful in 15m5s
ci / e2e (push) Successful in 27m16s
a20791984b
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
littlefox referenced this pull request from a commit 2026-10-19 21:34:01 +00:00
Sign in to join this conversation.
No description provided.