Skip to content
Merged
Show file tree
Hide file tree
Changes from 85 commits
Commits
Show all changes
131 commits
Select commit Hold shift + click to select a range
d42d6a5
fix(media): stop off-screen media from loading itself
matheusfillipe Aug 30, 2026
952ba25
fix(irc): wait for sasl when the server splits its cap ack over two l…
matheusfillipe Aug 30, 2026
2f4c56d
fix(media): keep lazy images rendered so they actually load
matheusfillipe Aug 30, 2026
ee83e36
feat(palette): add the network log to quick actions
matheusfillipe Aug 30, 2026
e5693fd
feat(chat): make channel names in messages clickable
matheusfillipe Aug 30, 2026
ab2c7d5
chore: merge main into the branch
matheusfillipe Sep 2, 2026
f1c1e4b
chore(android): drop committed gradle output of a removed plugin
matheusfillipe Sep 2, 2026
c1d7657
feat(voice): redesign the voice and stream channel view, keep calls a…
matheusfillipe Sep 5, 2026
9af4577
feat(palette): open voice and stream channels from ctrl+k
matheusfillipe Sep 6, 2026
ed84ca4
fix(chat): drop the attachment link from a reply preview that shows t…
matheusfillipe Sep 6, 2026
aa4a6e9
feat(voice): put the call controls on the video, return to the previo…
matheusfillipe Sep 6, 2026
5edca69
feat(voice): release the mic when a call ends, add a local echo bot f…
matheusfillipe Sep 7, 2026
3913fbc
fix(i18n): stop the back camera button borrowing the go-back translation
matheusfillipe Sep 11, 2026
7144723
feat(media): record voice, video and screen messages, share location …
matheusfillipe Sep 11, 2026
72f301f
fix(media): play a video preview on first click, contain player crashes
matheusfillipe Sep 11, 2026
2d6fee6
feat(media): camera page for photos and videos, draggable location map
matheusfillipe Sep 18, 2026
6cc3bb4
feat(voice): choose the call microphone and camera, run one call at a…
matheusfillipe Sep 8, 2026
196d39e
feat(desktop): record a chosen rectangle of the screen natively
matheusfillipe Sep 18, 2026
065c245
feat(composer): attach files to the message instead of a send dialog
matheusfillipe Sep 18, 2026
1d06d10
style(composer): slim the message bar and line it up with the user panel
matheusfillipe Sep 26, 2026
e998918
feat(chat): mark messages that name you or reply to you
matheusfillipe Sep 18, 2026
c110ba5
feat(sidebar): channel folders, reworked sidebar, menus and focus han…
matheusfillipe Sep 27, 2026
65ff951
feat(bots): redesign the workflow card, history list and shared menus
matheusfillipe Oct 1, 2026
ea84c24
feat(chat): decode and restyle server link previews
matheusfillipe Oct 2, 2026
9a40eec
feat(chat): fold long messages by input device, escape code block fal…
matheusfillipe Oct 3, 2026
67637a1
feat(composer): one suggestion list for members, emojis and slash com…
matheusfillipe Oct 3, 2026
bf1c246
feat(sidebar): pick the channel kind from the first prefix typed
matheusfillipe Oct 6, 2026
34ecb61
feat(notices): show the motd in server notices and on the welcome page
matheusfillipe Oct 6, 2026
a7471c3
feat(chat): compact links with their address in a hover card
matheusfillipe Oct 6, 2026
6072fb6
feat(bots): one workflow line per bot run that opens its card
matheusfillipe Oct 7, 2026
869fe82
feat(sidebar): user panel with a status menu, taller message bar
matheusfillipe Oct 7, 2026
6736160
chore(tauri): update to 2.12, point dev hot reload at the device host
matheusfillipe Oct 7, 2026
c0715d2
feat(sidebar): one in-place row for add channel and message someone
matheusfillipe Oct 7, 2026
0b694cf
feat(mobile): android pip, ios keyboard and foreground events, backgr…
matheusfillipe Oct 7, 2026
979fa30
chore(i18n): translate mobile, voice, media and settings strings
matheusfillipe Oct 7, 2026
9b00f48
fix(voice): rejoin on drops, keep mute, listen-only without a mic
matheusfillipe Oct 7, 2026
ac566d9
fix(media): working uploads, camera mic only while recording, voice m…
matheusfillipe Oct 7, 2026
bdd4032
fix(connection): no toast for a dropped live socket, never reopen cal…
matheusfillipe Oct 7, 2026
65dba82
fix(chat): whisper headers, verb menu labels, readable topic hint
matheusfillipe Oct 7, 2026
6427d48
fix(mobile): keyboard keeps header and input in view, safe areas on s…
matheusfillipe Oct 7, 2026
d158499
style: real theme colors, one primary button style
matheusfillipe Oct 7, 2026
12cca00
chore(i18n): translate call layout, join refusals and pm menu
matheusfillipe Oct 8, 2026
78897e0
fix(voice): stay in the channel on hang up, retry throttled joins
matheusfillipe Oct 8, 2026
e84bf44
feat(mobile): one control layer over phone calls, fullscreen, fold vi…
matheusfillipe Oct 8, 2026
7ef1a59
feat(chat): pms work like channels and every chat can be reordered
matheusfillipe Oct 8, 2026
44d0f6b
fix(mobile): no gap under the app, keyboard steps aside for sheets
matheusfillipe Oct 8, 2026
8993adc
ci: wait for the tauri 2.12 options file on ios, install only platfor…
matheusfillipe Oct 10, 2026
a9ae2b5
chore(i18n): translate camera, server notices and toasts
matheusfillipe Oct 9, 2026
33d8544
feat(notices): server errors go to server notices with a badge
matheusfillipe Oct 9, 2026
a4100c6
feat(media): youtube plays in the installed apps through the web origin
matheusfillipe Oct 9, 2026
53b0b7a
feat(settings): dialogs become pages, profile pane, autosave, one emb…
matheusfillipe Oct 9, 2026
581541e
test(voice): give the mocked store a ui state so leaving a call reads it
matheusfillipe Oct 15, 2026
3f4ae0a
fix(notices): keep server notices silent and mark plain notices with …
matheusfillipe Oct 16, 2026
e450431
fix(user-panel): show our nick on the selected server
matheusfillipe Oct 16, 2026
e6e329d
fix(irc): send NICK after SASL so a persistent session gets its nick …
matheusfillipe Oct 16, 2026
5f6ab67
fix(chat): mount a newly opened chat's message list on the first frame
matheusfillipe Oct 16, 2026
a6db13b
feat(history): keep read history on the device, fill offline gaps fro…
matheusfillipe Oct 9, 2026
3086247
fix(discover): cards fit the column width
matheusfillipe Oct 9, 2026
0b18188
refactor(history): one chathistory request helper, bouncer disconnect…
matheusfillipe Oct 9, 2026
cf57514
feat(search): search saved messages and jump to any message
matheusfillipe Oct 9, 2026
6f60805
fix(search): fetch missed messages for gaps while searching, mark a g…
matheusfillipe Oct 10, 2026
9ea090f
test(history): build the full older database layout in upgrade tests
matheusfillipe Oct 10, 2026
45b96af
fix(desktop): mac freeze from duplicate media probes, mobile swipe ba…
matheusfillipe Oct 10, 2026
13fe2ce
feat(discover): plugins page mockup
matheusfillipe Oct 10, 2026
6884907
style: frosted glass for menus, dialogs, sheets and the palette
matheusfillipe Oct 10, 2026
ca7d71d
feat(mobile): phone pages stack with swipe back, outlined search result
matheusfillipe Oct 10, 2026
93c7cc7
fix: share location map, chat stays at the bottom around the keyboard…
matheusfillipe Oct 10, 2026
999c96c
fix(mobile): drag the location map on touch, still page on ios keyboa…
matheusfillipe Oct 10, 2026
14291cd
fix(web): reload into the nickname prompt after disconnecting in sing…
matheusfillipe Oct 10, 2026
f42d80c
fix(tauri): try ipv4 first and give each address its own connect timeout
matheusfillipe Oct 11, 2026
1e5bd85
feat: suggest nicknames in the invite dialog
matheusfillipe Oct 11, 2026
d2a5434
fix(history): show saved private messages on servers that keep only c…
matheusfillipe Oct 11, 2026
648c40e
fix: show and select a server as soon as it is added
matheusfillipe Oct 11, 2026
a2be87a
fix(mobile): enable send with only an attachment
matheusfillipe Oct 11, 2026
61a89da
fix(history): drop saved messages that were redacted while we were away
matheusfillipe Oct 11, 2026
16c47df
fix: keep the reply when sending files
matheusfillipe Oct 11, 2026
aa5ce98
fix(desktop): ask for screen recording before picking a region, open …
matheusfillipe Oct 11, 2026
f85a9c2
fix(metadata): set our own metadata again after the app restarts
matheusfillipe Oct 11, 2026
4128514
fix: leave sentence punctuation out of links
matheusfillipe Oct 11, 2026
77af7ef
fix(metadata): follow our metadata when another of our clients change…
matheusfillipe Oct 11, 2026
578eaef
docs: never send long-lived credentials anywhere but the ircd
matheusfillipe Oct 11, 2026
ebd9f6a
fix(metadata): read our own metadata from the server only
matheusfillipe Oct 11, 2026
daed194
fix: fill members from WHO with metadata we already fetched
matheusfillipe Oct 11, 2026
a7f58e2
fix: stop firefox recordings that have no audio track
matheusfillipe Oct 11, 2026
23102a7
refactor(notices): drop the unused server notices link from toasts
matheusfillipe Oct 16, 2026
235c4b8
feat: use wide screens on settings and list pages
matheusfillipe Oct 11, 2026
3380625
fix(voice): show voice channels with a mic icon and their bare name
matheusfillipe Oct 17, 2026
33a6b91
chore: merge stack/calls into stack/media
matheusfillipe Oct 17, 2026
434d4e4
chore: merge stack/media into stack/sidebar
matheusfillipe Oct 17, 2026
9c522ca
chore: merge stack/sidebar into stack/mobile
matheusfillipe Oct 17, 2026
f357885
chore: merge stack/mobile into stack/pages
matheusfillipe Oct 17, 2026
6639361
chore: merge stack/pages into stack/search
matheusfillipe Oct 17, 2026
6763884
chore: merge stack/search into stack/polish
matheusfillipe Oct 17, 2026
e023de8
chore: merge stack/polish into stack/wide-pages
matheusfillipe Oct 17, 2026
bb6cc42
fix(welcome): scroll a long motd, give it more width and hide the emp…
matheusfillipe Oct 19, 2026
8f5317e
fix(sidebar): tighten the gap above channel folders
matheusfillipe Oct 19, 2026
c1e61db
chore: merge stack/sidebar into stack/mobile
matheusfillipe Oct 19, 2026
4fc6a6a
chore: merge stack/mobile into stack/pages
matheusfillipe Oct 19, 2026
073311d
chore: merge stack/pages into stack/search
matheusfillipe Oct 19, 2026
f7b5f5c
chore: merge stack/search into stack/polish
matheusfillipe Oct 19, 2026
de12f85
chore: merge stack/polish into stack/wide-pages
matheusfillipe Oct 19, 2026
fc7de31
fix(chat): keep the read all chip compact with a full size tap area
matheusfillipe Oct 19, 2026
763acf0
fix(media): close an open image with the back button on android and i…
matheusfillipe Oct 19, 2026
ecee9c5
chore: merge stack/sidebar into stack/mobile
matheusfillipe Oct 19, 2026
d9cbbf5
chore: merge stack/mobile into stack/pages
matheusfillipe Oct 19, 2026
9398bee
chore: merge stack/pages into stack/search
matheusfillipe Oct 19, 2026
9afac2a
chore: merge stack/search into stack/polish
matheusfillipe Oct 19, 2026
85b4d19
chore: merge stack/polish into stack/wide-pages
matheusfillipe Oct 19, 2026
809616a
feat(mobile): close sheets with the browser back gesture and ask befo…
matheusfillipe Oct 19, 2026
e713375
chore: merge stack/pages into stack/search
matheusfillipe Oct 19, 2026
de576c0
chore: merge stack/search into stack/polish
matheusfillipe Oct 19, 2026
e06cab6
chore: merge stack/polish into stack/wide-pages
matheusfillipe Oct 19, 2026
54837b9
chore: merge main into stack/fixes
matheusfillipe Oct 20, 2026
5389d55
chore: merge stack/fixes into stack/calls
matheusfillipe Oct 20, 2026
b81bbc6
chore: merge stack/calls into stack/media
matheusfillipe Oct 20, 2026
46df832
chore: merge stack/media into stack/sidebar
matheusfillipe Oct 20, 2026
6ea1a6c
chore: merge stack/sidebar into stack/mobile
matheusfillipe Oct 20, 2026
9140928
chore: merge stack/mobile into stack/pages
matheusfillipe Oct 20, 2026
a6cbfcf
chore: merge stack/pages into stack/search
matheusfillipe Oct 20, 2026
3c8b2d3
chore: merge stack/search into stack/polish
matheusfillipe Oct 20, 2026
9a665f5
chore: merge stack/polish into stack/wide-pages
matheusfillipe Oct 20, 2026
9295c7b
chore: merge main into stack/fixes
matheusfillipe Oct 20, 2026
3fe18f4
chore: merge stack/fixes into stack/calls
matheusfillipe Oct 20, 2026
00c6910
chore: merge stack/calls into stack/media
matheusfillipe Oct 20, 2026
b74b180
chore: merge stack/media into stack/sidebar
matheusfillipe Oct 20, 2026
cf73e2e
chore: merge stack/sidebar into stack/mobile
matheusfillipe Oct 20, 2026
07d935d
chore: merge stack/mobile into stack/pages
matheusfillipe Oct 20, 2026
3814edb
chore: merge stack/pages into stack/search
matheusfillipe Oct 20, 2026
d00fb7d
chore: merge stack/search into stack/polish
matheusfillipe Oct 20, 2026
9371f2f
chore: merge stack/polish into stack/wide-pages
matheusfillipe Oct 20, 2026
1c1f394
chore: merge main into stack/wide-pages
matheusfillipe Oct 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 5 additions & 1 deletion .github/workflows/publish.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,8 @@ jobs:

- name: Setup Android SDK
uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1
with:
packages: platform-tools

- name: Install NDK
run: sdkmanager "ndk;27.0.11902837"
Expand Down Expand Up @@ -426,6 +428,8 @@ jobs:

- name: Setup Android SDK
uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1
with:
packages: platform-tools

- name: Install NDK
run: sdkmanager "ndk;27.0.11902837"
Expand Down Expand Up @@ -596,7 +600,7 @@ jobs:
- name: Start Tauri iOS build with WS server
run: |
npm run tauri ios build -- --open &
ADDR_FILE="${TMPDIR%/}/com.obsidianirc.dev-server-addr"
ADDR_FILE="src-tauri/gen/apple/.tauri/cli-options-server.json"
echo "Waiting for $ADDR_FILE…"
for i in $(seq 1 120); do
[ -f "$ADDR_FILE" ] && { echo "Addr file ready after ${i}s"; break; }
Expand Down
28 changes: 28 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,23 @@ Do not call `openExternalUrl` directly from any UI element without this protecti

---

## Credentials: long-lived secrets go only to the IRCd

**Critical invariant:** a long-lived credential (the SASL or server password, a personal
access token, a client certificate key) is sent only to the IRC server the user logs in to.
Never send one to a file host, an API or any other HTTP endpoint, even one the server
advertises, and even over https.

A service that needs to know who the user is gets a short-lived, single-purpose token
minted by the IRCd: `draft/authtoken` (`TOKEN GENERATE <service>`, one token per request).
The vendor `obby.world/FILEHOST` uploader works this way.

- `draft/FILEHOST` hosts are passwordless: POST the file with no credentials.
- We do not support `soju.im/FILEHOST`, since it logs in to the file host with the IRC
credentials. See https://github.com/obbyworld/obby/issues/203#issuecomment-4512606251.

---

## Zustand + React Gotchas

**Store action refs are unstable.** Functions from `useStore((s) => s.someAction)` change
Expand All @@ -211,6 +228,17 @@ for WKWebView's `IntersectionObserver`.

---

## Menus, panels and touch

- Dropdown menus go through `Menu` (`src/components/ui/Menu.tsx`); other floating panels go through `Popover`. Style their contents with the shared classes in the `@layer components` block of `src/index.css` (`surface-floating`, `row-interactive`, `row-meta`, …) so every panel stays one look.
- Hover hints use one look, the `tooltip-surface` class. A plain `title` attribute is enough: `TitleTooltipLayer` shows it in that style. Wrap richer content in `HoverTooltip`, and never style a tooltip by hand.
- Touch UI (bottom sheets, long-press, drag handles) follows `useIsTouchInput()`. Window width only decides layout, so a narrow desktop window still gets mouse UI.
- Lists that suggest completions above the chat input (members, emojis, slash commands) render through `SuggestionList` and take their arrow, Enter and Escape keys from `useSuggestionKeys`.
- Bottom sheets build on `BottomSheet` with the `sheet-row` and `sheet-action` classes; taps and holds go through `useShortTap` and `useLongPress`, which share one delay so they never fire together.
- Stray typing goes to the chat input. An open modal dialog takes it for its own text field, and an inline editor can claim it with `useTypingOwner`.

---

## Biome — intentional dep omissions

Always add suppression comment on the line **immediately before** the hook — pre-commit
Expand Down
21 changes: 21 additions & 0 deletions compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,27 @@ services:
timeout: 10s
retries: 3

obby-locked:
build:
context: .
dockerfile: Dockerfile
args:
VITE_HIDE_SERVER_LIST: ${LOCKED_HIDE_SERVER_LIST:-true}
VITE_DEFAULT_IRC_SERVER: ${LOCKED_IRC_SERVER:-wss://irc.h4ks.com:443}
VITE_DEFAULT_IRC_SERVER_NAME: ${LOCKED_IRC_SERVER_NAME:-h4ks.com}
VITE_DEFAULT_IRC_CHANNELS: ${LOCKED_IRC_CHANNELS:-#bots,#lobby,#minecraft}
container_name: obby-locked
ports:
- "3001:80"
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost/"]
interval: 30s
timeout: 10s
retries: 3
profiles:
- locked

gen-certs:
image: alpine:3.20
volumes:
Expand Down
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover, user-scalable=no, interactive-widget=resizes-content" />
<meta name="theme-color" content="#202225" />
<link rel="icon" type="image/x-icon" href="/images/obby.png">
</head>
Expand Down
Loading
Loading