Skip to content

Releases

v0.99.64

Choose a tag to compare

@pbtrung pbtrung released this 11 Nov 16:42

Fixes

  • Preserve replies when sending fails, recover failed storage writes and
    deferred history requests, and ignore late history for closed conversations.
  • Serialize concurrent searches and retain queue recovery after errors and
    timeouts. Reject queued searches after reconnecting to a new socket.
  • Validate saved receipts and preferences, handle cross-tab storage clearing,
    normalize IRC commands, harden message formatting and support single-token
    PONG replies.
  • Validate OAuth issuer identity and response types. OAuth configuration must
    match the provider's issuer exactly, including any trailing slash.
  • Refresh memoized message callbacks when their parent handlers change.

Maintenance

  • Split large persistence, backlog, messaging, connection and rendering modules
    along responsibility boundaries while preserving public imports.
  • Update compatible dependencies to their latest stable releases, including
    jsdom 31, and patch the minimatch advisory. TypeScript 7.0.2 remains the
    typechecker; TypeScript 6 remains for typescript-eslint's compiler API.
  • Add 38 regression/recovery tests and tighten coverage thresholds. Document
    findings, fixes, module boundaries and validation in doc/codebase-audit.md.

Validation

  • 725 unit/component tests and 64 desktop/mobile browser tests pass.
  • Typechecking, lint, formatting, production build and coverage checks pass.
  • Coverage: 89.96% statements, 83.35% branches, 90.12% functions, 90.01% lines.
  • npm audit reports zero vulnerabilities. Ten optional screenshot generators
    remain disabled by their existing configuration.

v0.99.63

Choose a tag to compare

@pbtrung pbtrung released this 09 Nov 18:48

Chat history and unread indicators now reflect the messages actually loaded in the browser.

  • Opening a conversation and scrolling back load the configured page size (200 by default), paginating within the server's CHATHISTORY limit.
  • The opening pill shows a loaded count such as 200+ new since 10:30, with + while more unread history may remain. Its timer lasts eight seconds and later messages don't reopen it.
  • The divider shows timestamped progress such as 200 loaded · more available · since 10:30, then an exact count once the opening read boundary is reached. It requires eight continuous seconds fully in view: scrolling away and returning starts a full eight seconds again instead of using leftover time. Each loaded history page also gets fresh reading time. The opening pill's eight-second timer is unchanged.
  • Read markers older than 24 hours show a zero-padded DD/MM/YY date, e.g. 08/11/26 10:30. The mobile pill keeps a compact single-line label, and the divider keeps the date and time on its smaller second line.
  • Pill and divider counts stay relative to the conversation's opening read boundary. Live read markers continue to advance normally at the bottom and hold while scrolled up. The history view distinguishes the browser buffer limit from the end of stored history.

Validation: 687 unit tests and four Chromium history tests passed, including the scroll-away-and-back timer regression and single-line dated pill at 320 pixels, along with type checking, lint and formatting checks.

Composer placeholder update:

  • Keep the original composer divider and typing indicator; remove the status bar.
  • Show the current channel member count in the input placeholder, for example #channel {42}, once the member list is loaded.

Validation: all 687 unit tests, type checking, lint and formatting checks passed.

v0.99.62

Choose a tag to compare

@pbtrung pbtrung released this 04 Nov 18:12

Changes since v0.99.61

  • Show the nickname truncation + only when the nickname exceeds the configured character limit. Nicknames exactly at the limit no longer get a marker from pixel overflow caused by wide letters, brackets or membership prefixes.
  • Fix doubled messages when opening a channel after connecting: match overlapping history deliveries even when message IDs are missing, while preserving intentional repeated messages and messages with distinct IDs.
  • Deduplicate live deliveries by message ID even if replay timestamps differ. Add IdleRPG regression coverage for overlapping channel history.
  • Preserve the unread divider and count banner when initial channel history finishes loading after login, preventing the banner from flashing and disappearing on the first channel open.
  • Keep the new-message count banner visible for the same eight seconds as the New messages divider, including while scrolled to the latest messages. Jump and dismiss actions remain available.
  • Document soju-rs interoperability and IRCv3 compatibility checks in the compatibility report.
  • Add the Monokai Pro theme with charcoal backgrounds, green accents, cyan links, and readable nickname colors.
  • Show your current nickname beside the composer on desktop and tablets, using the theme's nickname colors and respecting the Nick colors setting. It follows the active network and nickname changes, and is hidden below 768px to preserve typing space on phones.
  • Match the composer nickname and input font sizes to the chat font setting, with a 15px minimum on mobile.
  • Show the active channel or private conversation name as the composer placeholder.
  • Mark truncated nicknames in the columns layout with a theme-accent-colored + in the gap before the divider, like WeeChat, instead of an ellipsis.
  • Enforce nickname character limits even for narrow letters in proportional fonts, while preserving full nicknames for clicks and accessibility.
  • Match Glowing Bear's nickname hover tooltip: nickname followed by user@host when available, limited to 80 characters including an ellipsis for longer tooltips.
  • Remove the focus outline around network names when browser focus is restored, while retaining a background cue for keyboard navigation.
  • Show a Glowing Bear-style reconnection banner with an animated refresh icon. The composer hides while disconnected or reconnecting, then returns with its unsent draft after automatic reconnection. Reduced-motion preferences are respected.
  • Group reconnecting notices by their shared multiplex connection. Put application errors in one top banner stack, merge connection errors into the matching reconnecting notice, and keep unrelated errors independently dismissible.
  • Fix soju.im/unread snapshot replacement and partial read-marker handling without losing newer live messages or resurrecting messages already read elsewhere.
  • Keep private notices and non-ACTION CTCP messages from becoming mentions in existing private conversations.
  • Handle multiplex attach rejections without a network ID by falling back to ordinary per-network connections. Share keepalives and lag measurements across multiplexed networks.
  • Audit the soju-rs unread and multiplex extensions and add protocol regression coverage. See the audit report for findings, fixes, and scope.
  • Update npm dependencies and refresh the lockfile. Type checking uses TypeScript 7.0.2; TypeScript 6.0.3 remains installed to satisfy the latest typescript-eslint peer dependency.

Install

Unzip gamja-v0.99.62.zip and serve the gamja/ folder with any static web server (see doc/setup.md).

v0.99.61

Choose a tag to compare

@pbtrung pbtrung released this 30 Oct 04:09

Changes since v0.99.60

  • On reconnect, only the open buffer loads its missed messages. Every other buffer loads them once opened, so a connect no longer queries the bouncer's history of every busy channel.
  • Unread buffers and mentions still show right away. With soju-rs v0.99.24 (soju.im/unread), the bouncer reports which conversations have unread messages and mentions after their read marker, including conversations read on another device. With other servers, buffers with messages after their read marker are unread, and private conversations count as mentions.

Install

Unzip and serve the gamja/ folder with any static web server (see doc/setup.md).

v0.99.60

Choose a tag to compare

@pbtrung pbtrung released this 29 Oct 19:04

Changes since v0.99.59

  • Move “Only show unread buffers” from the left pane into Settings → Messages, next to “Show member list”.
  • Preserve the existing saved preference and buffer filtering behavior.

Install

Unzip and serve the gamja/ folder with any static web server (see doc/setup.md).

v0.99.59

Choose a tag to compare

@pbtrung pbtrung released this 29 Oct 16:44

Changes since v0.99.58

  • Font settings: only Inter and JetBrains Mono, and only for the messages and the message input; the buffer list, member list and header use the interface font again
  • Much smaller build (1.3 MB instead of 11 MB) now that the extra font packages are gone

Install

Unzip and serve the gamja/ folder with any static web server (see doc/setup.md).

v0.99.58

Choose a tag to compare

@pbtrung pbtrung released this 29 Oct 13:38

Changes since v0.99.56

  • Composer: Up and Down recall the messages sent in each buffer.
  • Shortcuts: Alt+N shows or hides the member list, Alt+L focuses the message input, Alt+G filters the buffer list, and Alt+< jumps back to the previous buffer.
  • Mobile: swipe right to open the buffer list or close the member list, and swipe left to do the opposite. On touch screens, an @ button next to Send completes nicknames, like Tab.
  • Buffer list: a toggle next to the filter shows only unread buffers.
  • User buffers on desktop use the channel header layout: Close and Settings beside the ⋮ menu, which holds Pin, Mute, Block and Search.
  • New messages: the scroll-down button counts new messages ("3 new"), the jump button says "12 new messages since 13:04" and can be dismissed, and the "New messages" divider disappears after 8 seconds in the visible buffer.
  • Settings → Font: choose the font and text size (10–24 px) of the buffer list, member list, buffer header and messages. Fonts available: Inter, System, Literata, Iosevka Aile, Iosevka, JetBrains Mono and System monospace.
  • Desktop: drag the inner edge of the buffer list or member list to resize it. Arrow keys also work, and a double-click resets it.
  • Internal: large modules (client connection, controller, state handlers, commands, Composer, BufferHeader, App, ChatScroller) are split into smaller ones, with no change in behavior.

Install

Unzip and serve the gamja/ folder with any static web server (see doc/setup.md).

v0.99.56

Choose a tag to compare

@pbtrung pbtrung released this 29 Oct 04:52
  • Fix the divider alignment in the columns layout between chat messages and events such as voice privilege changes, joins, and parts. Timestamps now keep the same size across rows.
  • Remove the Bouncer section from Settings → About. About shows the Gamja version, source and license links, and installed dependencies.

Validation: all 612 tests, TypeScript, lint, and formatting checks pass. Browser measurements confirm alignment across 48 combinations of text size, timestamp format, timestamp visibility, and nickname alignment.

v0.99.55

Choose a tag to compare

@pbtrung pbtrung released this 28 Oct 18:03

Remove the left sidebar footer and bring version information together in Settings → About.

  • Remove the sidebar's nick/status strip and version badge. Away status remains available through /away commands.
  • Add an About section to Settings on desktop and in the mobile section menu, with the Gamja version and source/license links.
  • Show connected soju / soju-rs bouncer versions when reported through IRC registration. A bouncer that supplies only its software name shows “Not reported”; plain IRC connections show that no bouncer is connected.
  • List the exact installed versions of React, React DOM, Zustand, Lucide, Linkify, Inter, and Vite used for the build.
  • Verify release versions through the build's version.json, which shares its version with About.

Validation: TypeScript, ESLint, Prettier, 612 unit/component tests, 57 browser tests, the production build, and release-script syntax checks passed. The 10 optional screenshot tests are skipped by default.

Download gamja-v0.99.55.zip and serve the contents of its gamja/ directory from your web server.

v0.99.54

Choose a tag to compare

@pbtrung pbtrung released this 28 Oct 17:49

Refine the channel header and message input, and add independent text sizing for the buffer area.

  • Desktop channel headers show More actions, nick list, Leave, and Settings in that order. Pin, Mute, Search, and Detach are available from the three-dot menu when supported by the server.
  • Remove the close buttons from mobile sidebar headers and the connection-status dot from network rows.
  • Add Appearance → Message input → Touch the edges, enabled by default. The input spans the chat pane with square corners; turn the option off to restore the rounded, inset input.
  • Replace interface-wide text scaling with Messages → Text size. Choose any whole-pixel size from 10 to 20 px, with 15 px as the default. Headers, sidebars, dialogs, and the composer keep their usual sizes.

Validation: TypeScript, ESLint, Prettier, 612 unit/component tests, 53 browser tests, and the production build passed. The 10 optional screenshot tests are skipped by default.

Download gamja-v0.99.54.zip and serve the contents of its gamja/ directory from your web server.