Commit Graph
100 Commits
Author SHA1 Message Date
SalastilandClaude Sonnet 5.5 9b14536112 moho 1.0.0-rc.5
Fifth release candidate: GIFs on every service with a picker, idle detection, YouTube and GIF cards on every service including over Tor, the tray's number counted by the window, mentions-only counts that survive a mute, and Discord mutes set on the account.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-10 16:37:23 -04:00
SalastilandClaude Sonnet 5.5 5d826a785d Mirror script: MIRROR_GITEA reaches Gitea by its own address for the files Cloudflare will not take
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-10 16:33:00 -04:00
SalastilandClaude Sonnet 5.5 99e03116e9 Mirror script: a file over Cloudflare's 100 MB limit stays on GitHub only, said plainly, instead of stopping the mirror before nobilis
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-10 16:28:04 -04:00
SalastilandClaude Sonnet 5.5 ee0120ff5e A deploy tidies first: old AppImages, debug and cross builds, and a daemon build directory past 8 GB are removed, so a checkout stops growing to a hundred gigabytes
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-10 16:12:52 -04:00
SalastilandClaude Sonnet 5.5 7803cc38a6 A mute stops the interruptions, not the count: a muted channel still shows its mentions in the list, the rail, the switcher and the tray; a muted direct message shows none; and muting on Discord is written to the account as it is on Matrix
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-10 13:33:05 -04:00
SalastilandClaude Sonnet 5.5 987f31cf77 The number beside a conversation is what is addressed to you: mentions in a channel, each unread message in a direct message - the bold name says there is activity, a count of it does not
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-10 13:21:56 -04:00
SalastilandClaude Sonnet 5.5 336335a8a3 Scrolling a long unread run no longer snaps back: the place being read is found through the bar laid over the top of the log, not read off the bar, so a card or picture settling above does not put the view back where the bar appeared
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-10 13:17:22 -04:00
SalastilandClaude Sonnet 5.5 638b02e07f nobilis: link cards survive edits and reach backlog on every service
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 23:07:05 -04:00
SalastilandClaude Sonnet 5.5 8064e79bc3 nobilis: YouTube cards for accounts on Tor, from the video's page when oEmbed is refused
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 22:57:05 -04:00
SalastilandClaude Sonnet 5.5 1e314f85b6 The tray's number is the window's: counted by the rail's rule - muted and hidden conversations out, a direct message by each unread message, anywhere else by its mentions - and told to the tray whenever it changes, instead of a tally of its own that drifted
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 20:08:34 -04:00
SalastilandClaude Sonnet 5.5 07f4fc2ef6 The window does not load the forum's own files itself: the daemon fetches them through the account's route, and asked for from the reader's address the host refuses them and Tor is bypassed
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 19:06:23 -04:00
SalastilandClaude Sonnet 5.5 55248eb583 GIFs: a linked GIF is drawn as the picture - silent, looping, without the player - on every service, a GIF picker with trending, categories and search, and Klipy/Tenor/Giphy pages are never probed (#331)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 17:55:10 -04:00
SalastilandClaude Sonnet 5.5 23c87dd353 Idle detection: how long since anything was used, from the system where it will say and moho's own windows where it will not; a setting for it and for how long; the plaque says Idle (away) and keeps what was chosen checked (#332)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 17:35:58 -04:00
SalastilandClaude Sonnet 5.5 069371959a moho 1.0.0-rc.4: the rail's mention counts and Matrix unmute fixes join the release
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 15:40:06 -04:00
SalastilandClaude Sonnet 5.5 95f1784dbc A room unmuted on the account stops being drawn as muted: the buffer merge takes the flags the daemon leaves out as cleared; an unmute the server did not take is reported
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 15:37:39 -04:00
SalastilandClaude Sonnet 5.5 0dc048cdc0 Server rail: a tile counts the mentions waiting in it and not the messages, and a muted room counts for nothing, mentions included
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 15:28:01 -04:00
SalastilandClaude Sonnet 5.5 dc94dc3aca moho 1.0.0-rc.4
Fourth release candidate: a rebuilt tray, statuses by service, Do not disturb that silences notifications, and fixes to switching servers, Matrix rate limits and mutes, and Discord's connection.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 15:21:54 -04:00
SalastilandClaude Sonnet 5.5 745641a1ad The window stays where it is put: the link coming up is acted on once, a refresh does not follow the open conversation to its server, and the tray is told only what changed; Matrix's invisible is called offline; a mute held on a Matrix account can be taken off from the menu
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 11:45:38 -04:00
SalastilandClaude Sonnet 5.5 c1bcb72a38 Status: the plaque and the tray offer what each service has; idle from the tray reaches Discord and IRC and leaves the rest online; do-not-disturb silences desktop notifications everywhere
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 11:26:52 -04:00
SalastilandClaude Sonnet 5.5 0dfff0d74b nobilis: Matrix rate limits are waited out (status from the tray)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 11:15:38 -04:00
SalastilandClaude Sonnet 5.5 53fb0f34ce Tray: no notifications switch of its own - Do not disturb is that, and now silences an account's desktop notifications and the taskbar flash (#330)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 11:07:50 -04:00
SalastilandClaude Sonnet 5.5 24106e51f4 Tray: a bubble drawn for the system's colour scheme with the number waiting on it; a menu of what is new, Status, notifications, Settings, Restart moho and Quit; no daemon plumbing (#330)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 11:00:10 -04:00
SalastilandClaude Sonnet 5.5 b151ef8c07 nobilis: Discord request timeouts, history fetch guard, gateway tally
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-09 10:37:44 -04:00
SalastilandClaude Sonnet 5.5 c6206958b4 moho 1.0.0-rc.3
Third release candidate: Discord forums, a redesigned interface and settings, the one-box composer, Discord's notices and read-only channels, and window recovery after a crash.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 23:51:16 -04:00
Salastil 1993e308d0 nobilis: forums read live and archived posts 2026-10-08 23:40:36 -04:00
Salastil f6ecc6f634 nobilis: forum search diagnostics 2026-10-08 23:37:16 -04:00
Salastil f8b69909be nobilis: forum posts 2026-10-08 23:33:04 -04:00
SalastilandClaude Sonnet 5.5 dd0c25e054 Discord forums: a pane of posts (title, tags, first message, replies, age, picture, reaction), search, sort, older posts, New Post; a forum has no message box (#329)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 23:26:07 -04:00
SalastilandClaude Sonnet 5.5 06bb812ed0 Recovery also covers a page that exits cleanly while its window is still there (that is what the log showed); the URL is logged
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 23:12:07 -04:00
SalastilandClaude Sonnet 5.5 6899694394 A window whose page dies is reloaded and the reason is logged (it was left as an empty shell with nothing said)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 22:59:21 -04:00
SalastilandClaude Sonnet 5.5 6a329c61e9 Dialogs: the profile card, room search and the three events panes are built from Modal (own heading supported); one scrim, one Escape stack (#315)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 22:54:50 -04:00
SalastilandClaude Sonnet 5.5 dad55432b4 Server rail: the + is pinned below the list, under a rule and above the cog; the list scrolls above it
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 22:50:28 -04:00
SalastilandClaude Sonnet 5.5 d7c4215473 Discord's notices drawn as cards: a glyph, the time, the words and a button bar - red where it acts on the account (#328)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 22:45:03 -04:00
SalastilandClaude Sonnet 5.5 2a4f797b7f Opening Discord's notices reads its cards again once a run (#328)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 22:36:52 -04:00
SalastilandClaude Sonnet 5.5 ff7d313b46 Where the message box would be: a banner saying why nothing can be written here; embed fields and footer drawn (#328)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 22:32:40 -04:00
SalastilandClaude Sonnet 5.5 9f03d6b8dd Channel list: channels hold their place instead of jumping to the top as each message arrives; direct messages still go by recency
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 22:22:19 -04:00
SalastilandClaude Sonnet 5.5 2b41c5eb1c Join: browsing an IRC network's channels asks the daemon for a page, times out after a minute, can be stopped, and says when the network refuses
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 22:14:43 -04:00
SalastilandClaude Sonnet 5.5 b4c1ced186 User footer: the join button goes; the rail's + is the one way in
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 22:08:12 -04:00
SalastilandClaude Sonnet 5.5 50aaa97041 Quiet buttons (Cancel and its kind) get their own fill, lighter than any dialog or panel behind them
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 22:02:36 -04:00
SalastilandClaude Sonnet 5.5 cc4c9f667d Settings rail: 'You' becomes 'Personal', a rule under each heading, About set apart by a rule above (#327)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 21:58:57 -04:00
SalastilandClaude Sonnet 5.5 f8936c6734 Room settings: a tabbed dialog - Security, Moderation, Advanced - instead of a 400px popover (#324)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 21:56:20 -04:00
SalastilandClaude Sonnet 5.5 078fe41261 Mentions page: service and unread filters, day groups, two-line bodies, put away one at a time (#314)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 21:53:34 -04:00
SalastilandClaude Sonnet 5.5 f8dcccdb8f Accounts and Join: groups open when there are few accounts, Remove in a danger zone, the add form stays open with a Cancel, Join picks its account and says Join (#323)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 21:51:06 -04:00
SalastilandClaude Sonnet 5.5 82a0bdf8a8 Settings: a Keybinds page - every shortcut listed, and the global hotkey is recorded by pressing it (#322)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 21:48:22 -04:00
SalastilandClaude Sonnet 5.5 adca84d657 Settings: a Notifications page - desktop notifications, sound, taskbar flash, unread badge (#321)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 21:45:53 -04:00
SalastilandClaude Sonnet 5.5 fe6ad97dae Settings: an Appearance page - layout, spacing, zoom, clock, relative times, reduce motion (#320)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 21:43:29 -04:00
SalastilandClaude Sonnet 5.5 66a0c0f20a Settings: the gear opens it directly, a grouped rail with Accounts and Downloads as pages, a search over every setting, one switch for every boolean, segmented sign-in, a saved tick (#319)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 18:21:28 -04:00
SalastilandClaude Sonnet 5.5 7f4c356eb3 (edited) says when, on hover, for edits seen live (#300)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 18:15:47 -04:00
SalastilandClaude Sonnet 5.5 59d4893fbc Incoming calls: Discord's and Matrix's in one list, one style, stacked (#325)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 18:12:26 -04:00
SalastilandClaude Sonnet 5.5 f12007679b Thread panel: the room's own message box in thread mode - emoji, names, files, formatting (#310)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 18:09:52 -04:00
SalastilandClaude Sonnet 5.5 420a2f793c Dialogs: forward picker, message source, bot forms, poll, space rooms, folder settings, rules and the screen picker move onto the shared frame; the events panes share its scrim; a dialog focuses its first text box (#315, mostly)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 18:05:47 -04:00
SalastilandClaude Sonnet 5.5 2ef9e35c9e Header: one 48px row with a divider across every column, toggles drawn filled when on, and the topic beside the name (#289)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 18:01:17 -04:00
SalastilandClaude Sonnet 5.5 c026609e4b User footer: muted and deafened are red, the voice buttons stay put on every service, and the status is a popout with a custom status and Apply to all accounts (#290)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 17:54:41 -04:00
SalastilandClaude Sonnet 5.5 506140db86 Reactions: a sentence over each one naming the emoji and who gave it; the daemon answers who reacted on request (#303)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 17:48:26 -04:00
SalastilandClaude Sonnet 5.5 3a74cf030b Pins: a banner over the log for Discord and Matrix with a click-through to each, and the count on the header button (#311)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 17:42:25 -04:00
SalastilandClaude Sonnet 5.5 87ea3b8c31 Media: several pictures in one message lay out as a grid; SPOILER_ files are blurred until clicked (#304)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 17:39:11 -04:00
SalastilandClaude Sonnet 5.5 a59c1abc25 Composer: one box with the + on the left and emoji, stickers, voice and Send on the right; Send only when there is something to send (#306)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 17:34:06 -04:00
SalastilandClaude Sonnet 5.5 15e7061f97 Attachment tray: cards with name and size, spoiler toggle, token-coloured remove; dropped files go into the tray (#308)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 17:29:17 -04:00
SalastilandClaude Sonnet 5.5 99fd0d350f Emoji picker: arrow-key walking, Enter picks the top result, skin tones kept in prefs (#313)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 17:22:16 -04:00
SalastilandClaude Sonnet 5.5 817cb1e6fc Lightbox: step through the conversation's media, wheel/pinch zoom with panning, Copy picture, grows in (#312)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 17:17:58 -04:00
SalastilandClaude Sonnet 5.5 28d8b3c54e Autocomplete: one style for names, commands and emoji; member pictures; :shortcode emoji while typing (#309)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 17:12:23 -04:00
SalastilandClaude Sonnet 5.5 f48185e67a Reply bar: its own surface, the author's face, Esc to cancel, focus on reply, @ ping switch on Discord (#307)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 17:08:01 -04:00
SalastilandClaude Sonnet 5.5 9ba630cb17 Shift+Enter makes a new line, and pasted line breaks stay (#305)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 17:00:39 -04:00
SalastilandClaude Sonnet 5.5 5cb30cec24 Dialogs: a shared frame with a close button, focus kept inside and handed back, scrim below the title bar (#315, partly)
lib/dialogs.ts watches for anything marked role=dialog aria-modal and gives it the keyboard: it takes focus when it opens, Tab and Shift+Tab stay inside the topmost one, and closing returns focus (to the message box when what had it is gone). That covers every dialog at once. Modal.tsx is the common frame - heading, X, Escape on the layer stack, growing in - and the reason prompt, the export dialog and the leave confirmation use it. The .modal-scrim stops under the title bar so the window stays draggable.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 16:54:49 -04:00
SalastilandClaude Sonnet 5.5 6d8a050271 Motion pass: hover fades, turning fold arrows, arriving messages, reaction pop, overlays growing in (#283)
Rows, buttons and menu items fade between states on the shared durations. The fold arrow rotates instead of being swapped. A message said a moment ago arrives (fade and rise); history does not. A reaction that is new or has gone up pops. Popovers, pickers, dialogs and the switcher grow in, scrims fade, and the jump-to-present pill slides up. All of it stands still when the system asks for reduced motion.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 16:51:43 -04:00
SalastilandClaude Sonnet 5.5 55fd19282e Open a conversation at its first unread, with a bar that says how many are above (#301)
Opened with a lot unread, the log starts at the New line rather than at the end. While that line is out of sight above, a strip along the top says how many new messages since when and offers Mark as read; clicking the words goes back to the line. The line goes where reading stopped (the time last marked read) when the conversation has not been loaded yet. The harness now sweeps up anything a run leaves behind.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 16:48:41 -04:00
SalastilandClaude Sonnet 5.5 fcb7df5d3a Context menu: place it by its layout size, not the size it is drawn at mid-animation
The entry animation scales the menu, so measuring it with getBoundingClientRect parked it a few pixels past the window's edge once it reached full size. The layout check caught it.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 15:07:08 -04:00
SalastilandClaude Sonnet 5.5 4065963640 Context menu: keyboard navigation, checked items, shortcut hints, entry animation, anchored to its button (#317)
Arrow keys, Home and End move through the entries, Enter does the focused one, Tab or Escape closes it and gives focus back. role=menu and menuitem(checkbox). An entry can be checked (the status menu uses it instead of appending a tick to the label) or show its shortcut. It fades and scales in, closes when the window is left or something scrolls, and a menu button's menu opens beside the button.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 15:05:53 -04:00
SalastilandClaude Sonnet 5.5 2d1b8beb8d Toasts: slide in and out, three kinds, pause on hover, fold repeats, cap at three, optional action (#318)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 15:02:16 -04:00
SalastilandClaude Sonnet 5.5 33129f9056 Thread panel: reads the display settings, groups replies, says '1 reply', follows the newest reply (#269)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 15:00:11 -04:00
SalastilandClaude Sonnet 5.5 c5e761924a Escape closes the top layer only; full-page panels close on Escape (#270)
Every popup, dialog and panel registers in the order it opened (lib/layers.ts) and Escape goes to the last one, not to all of them. Twenty-odd window-level Escape listeners moved onto it. Settings, Accounts, Downloads and Join close on Escape, under whatever opened over them. A field that handles Escape itself still wins.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:57:51 -04:00
SalastilandClaude Sonnet 5.5 2c8609ca98 Buttons: primary, subtle and one danger; the restarts ask first (#316)
Cancel is the quiet button next to a filled one, in every dialog; Decline on an invitation is quiet too. There is one filled red danger button, with the outline version in theme.css gone. Restart Tor and Restart daemon ask again in place.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:53:09 -04:00
SalastilandClaude Sonnet 5.5 3a7677ef16 Comfy messages in Discord's shape; amber mentions, one code and quote style, marked system lines, a red NEW pill (#295, #302)
A 40px picture, the name with its time beside it, air above each new speaker, and the time of a follow-up line in the picture's column on hover. Classic keeps its time column and bubbles are unchanged. A mention row is amber instead of the selection blue. Quotes, code blocks and inline code have one look each. Join, part and topic lines get a mark in the picture's column so their text lines up. The New divider is a red rule with its marker at the right. The harness's rail selector uses aria-label now that tiles have no title.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:50:50 -04:00
SalastilandClaude Sonnet 5.5 843288d61a Voice channel list: faces, muted and deafened marks, a speaking ring, a collapsible heading (#293)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:45:56 -04:00
SalastilandClaude Sonnet 5.5 c912ed3522 Member list: faces, presence dots, click for the profile (#288)
Where the service reports presence each member gets their picture and a dot (idle amber, do-not-disturb red, offline a hollow ring). Clicking a member opens their profile; Shift+click, or the menu, mentions them. The Discord daemon now sends each member's avatar.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:43:09 -04:00
SalastilandClaude Sonnet 5.5 8072b2496b Server rail: mention counts, folders that say what is waiting and stay open, instant name flyout, pill growth, a + tile; red close button (#285, #291)
A server tile with a mention shows how many are waiting in the corner its service mark sat in. A closed folder gets the pill and the summed count. Which folder is open is remembered. The browser's slow tooltip is replaced by an instant flyout in the app's style, the pill grows on hover, and a dashed + tile at the foot of the list opens Join. The close button goes red on hover and maximise/restore have their own glyphs.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:35:55 -04:00
SalastilandClaude Sonnet 5.5 6a82c3261c Pending sends dim only their text and failed ones can be deleted; one set of dots; short ageing times; Up-to-edit and a proper editor (#272, #277, #278, #280, part of #300)
A pending row dims what was said, not the upload ring beside it, and a failed send has Delete beside Retry. Presence dots share one palette and one stylesheet (do-not-disturb red, offline and away a hollow ring, connecting pulsing and no longer labelled Offline), also used by the server header's connection dot. Relative times in the column are short (now, 8m, 3h, Yest, Mar 3) and age on one shared timer. Up arrow in an empty box edits your last message; the editor is multi-line, stays open when it loses focus, has a hint, and an empty save asks about deleting.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:31:41 -04:00
SalastilandClaude Sonnet 5.5 6598043483 Six bugs from the UI audit: nested voice button, folded categories, muted mentions, overlapping corners, typing strip, pinned service marks (#271, #273, #274, #275, #276, #281)
The voice row's Disconnect is a sibling of the join button, not inside it. A folded category keeps its unread channels visible and counts what is waiting, not how many channels it has. A muted channel or server still shows a mention, and a quiet muted row dims. Toasts move to the top right so they cannot sit under or over the file panel or a verification. The typing strip always keeps its line and has animated dots. The pinned page marks each room with its service.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:26:21 -04:00
SalastilandClaude Sonnet 5.5 57e185645f Hover toolbar: fades in, reachable by keyboard, Edit and Copy, recent reactions (#298)
It is always in the page and see-through until the row is pointed at or has focus in it, so it fades and its buttons can be tabbed to. Gone from join lines, notices and unsent messages. Your own messages get Edit; every message with text gets Copy text; the four reactions are the account's recent ones topped up with the usual. Room above the first line so it is no longer clipped.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:18:33 -04:00
SalastilandClaude Sonnet 5.5 0033955adf Copy and Copy text on every message; Copy message link on Discord (#299)
The row's own context menu replaced the window's, so right-clicking highlighted text offered no Copy. It now leads with Copy for the selection, then Copy text for the whole message. Discord gets Copy message link beside Open in Discord, from the daemon's existing link.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:16:01 -04:00
SalastilandClaude Sonnet 5.5 bf45147b47 Replies jump to the original; names and pictures open the profile (#296, #297)
A reply's whole preview line goes to the message it answers, bringing it into view first and saying so if it is gone. It shows the author's picture and name colour where the original is loaded. A name or avatar opens the profile card, as in Discord, Slack and Element. The highlight on a jumped-to row now fades out as well as in.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:14:35 -04:00
SalastilandClaude Sonnet 5.5 ad0f0c08cf Voice panel: a horizontal microphone bar, the connection's latency, and a share button (#292)
The three rising strokes looked like phone signal but were the microphone level. It is now a bar along the panel that fills as you speak (polled ten times a second, on a square-root scale between a quiet room and loud speech), with the voice server's round trip beside the title in green, amber or red. Discord calls get a screen-share button.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:11:20 -04:00
SalastilandClaude Sonnet 5.5 1eef37ee76 Ctrl+K quick switcher and keyboard navigation (#287)
Ctrl+K opens a switcher over every account's conversations: what is waiting first, then a ranked search by name and place. Alt+Up/Down move through the channel list as drawn, Alt+Shift+Up/Down to the next with something waiting, Ctrl+, opens Settings. A search button sits in the main window's title bar.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:06:28 -04:00
SalastilandClaude Sonnet 5.5 2745a2f532 Mark as read on channels, categories and servers; Escape reads what you are in (#286)
Channel rows and the header menu offer Mark as read while something is waiting. Every category heading has a menu now, with Mark as read first (custom headings keep Rename and Remove). A server tile's menu leads with it too. Escape reads the conversation you are in and goes to its end, Shift+Escape reads the server - from the message box too, but never when a menu, dialog or picker is open or another field has focus.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 14:02:36 -04:00
SalastilandClaude Sonnet 5.5 b2464e4b3a Date separators in the message list (#294)
A centred "Today", "Yesterday" or full date where the day changes, and on the first line drawn. Days are compared by the wall clock, and lines with no time are ignored.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 13:58:49 -04:00
SalastilandClaude Sonnet 5.5 4ca37dd3ed Unread channels read as unread; mentions are red; one badge style (#284)
Unread rows go bold with a bar at the edge. Mention badges (channel rows, rail corners, the mentions button) are red with white text instead of the selection blue. The five differently sized badges share one rule in two sizes.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 13:56:16 -04:00
SalastilandClaude Sonnet 5.5 3cdfe37c6f Apply the design tokens across the stylesheet; one class name per thing (#282)
Colours, shadows, layers, transition durations, radii, font sizes and weights now come from theme.css instead of literals. Timestamps and reply previews use the quieter text colour. The status dot in the join dialogs and the voice panel's mic bars no longer share class names with the avatar's presence dot and the voice recorder's level bar. Dead rules removed; icons are drawn at their own optical size. A test fails if the stylesheet uses an undefined custom property.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-08 13:50:21 -04:00
SalastilandClaude Opus 5.5 9db25c8d73 Define the tokens the stylesheet used but never had; add danger, mention, motion, shadow, layer and type tokens (#268, part of #282)
Seven undefined custom properties made borders fall back to the text colour (ExportDialog's dates, the emoji picker, the history gap, the voice play button); they now point at real tokens. theme.css gains visible hover/pressed/selected fills, red and amber, muted text, motion, shadow, z-index, radius, font-size and weight tokens, a keyboard focus ring and a global reduced-motion rule. Icon buttons hover neutral instead of blue.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 21:01:37 -04:00
SalastilandClaude Opus 5.5 88375ba485 UI screenshot harness for before/after pictures (#326)
scripts/ui-shots.mjs photographs a fixed list of scenes from an isolated copy of the app (scratch home, its own daemon, a fake IRC server with several days of history) and records motion as mp4. Discord-shaped screens come from a test-only state hook that exists only when main is started with MOHO_UI_SHOTS=1. The launch and fake-server code is shared with the layout check in scripts/lib/harness.mjs.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 20:52:58 -04:00
SalastilandClaude Sonnet 5.5 9888c8050c Staged files go to Discord as one message; the upload ring fills as it uploads
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-07 19:57:12 -04:00
SalastilandClaude Sonnet 5.5 6edae7a7f0 Sneedchat: pictures posted back to back by a script no longer merge into one URL
[url=X][img]X[/img][/url] pairs were collapsed to a bare URL with no separator, so two in a row became one address that loaded neither.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-07 19:46:19 -04:00
SalastilandClaude Sonnet 5.5 a8d9f419ad Mirror script: the 'does the release exist yet' probe no longer prints a traceback when it does not
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-07 19:30:44 -04:00
SalastilandClaude Sonnet 5.5 6c6de335d1 Layout check finds the channel row by its title: the name no longer carries the #
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-07 18:06:12 -04:00
SalastilandClaude Sonnet 5.5 25c362a194 moho 1.0.0-rc.2
Second release candidate: YouTube cards for every kind of video, the formatting strip and right-click menu in the message box, typing anywhere, one # per channel row (#237, #265, #266, #267).

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-07 17:47:46 -04:00
SalastilandClaude Sonnet 5.5 ccdf09044a Channel rows say # once: the glyph is the hash, so the name drops its own
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-07 17:41:21 -04:00
SalastilandClaude Sonnet 5.5 b5f920f1ff Typing anywhere in the window goes into the message box
Printable keys, paste and coming back to the window focus the box when nothing else is being typed into and no dialog is open, as other chat clients do.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-07 17:35:23 -04:00
SalastilandClaude Sonnet 5.5 9ca477cc54 Formatting for selected text in the message box (#267)
A strip appears over a selection offering what the service can carry: Discord Markdown (bold, italic, underline, strike, code, spoiler, quote), Matrix the subset its daemon converts, Sneedchat BBCode with colour, IRC control codes with colour, Kick nothing. The box shows the formatting; it becomes the service's markup only when sent. Ctrl+B/I/U go through the same path. IRC strikethrough and monospace now render in received messages too.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-07 15:18:49 -04:00
SalastilandClaude Sonnet 5.5 b2a62101a6 Right-click menu where text is typed, with spelling suggestions (#265, #266)
Chromium says what is misspelled and what could replace it; the window draws the menu in the app's own style: suggestions and Add to dictionary, then Undo, Redo, Cut, Copy, Paste, Delete, Select all. Every field gets it, main window and popouts alike.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-07 15:18:49 -04:00
SalastilandClaude Sonnet 5.5 03687965f4 Update nobilis: YouTube cards survive Tor exits being refused (#237)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-07 15:06:42 -04:00
SalastilandClaude Sonnet 5.5 916abd4b18 Every YouTube video gets the card: live and premiere thumbnails fall back instead of vanishing (#237)
Live broadcasts and unstarted premieres have no hqdefault picture; the 404 hid the whole embed. Try the live and smaller pictures, then show a dark frame. Also recognise watch links with v= after other parameters, music.youtube.com and youtube-nocookie.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-07 15:00:40 -04:00