Lurker - Devlog

Alright! I got the rest of the issues closed out that wrapped up to 1.0.2 milestone.

  • Fixed: a DM buffer would open as soon as someone started typing at you, almost like you were telepathic; this has been fixed.
  • Fixed: pressing shift+esc would resurrect closed buffers from the dead (until a refresh returned them back to the grave); this has been fixed.
  • Added: there is now a chat.show_event_host to show the userhost on join/part/nick change lines (that have not been consolidated; turn off chat.consolidate_joins to see everything).
  • Fixed: previously we resolved an issue with case sensitivity issues with channel names, that same issue has now been preventatively fixed for direct messages.
  • Added: there is now a tools/fold-buffer-case.ts script that can be run from inside the container to fix duplicate buffers created by the previous issue.
  • Fixed: if you joined a channel that required registration before sending a message, it was unclear why your messages were not being read; now there is an in-buffer system message letting you know that the channel requires registration.
  • Added: Cmd+Left/Right and Home/End now jump to the logical start and end of the current line in the input bar, instead of the visual start/end. You may like this, you may hate it, let me know.

That’s it! With that, v1.0.2 is done and it’s time to move onto v1.1.0, which will be a more feature-packed release.

I cut a new release today, v1.0.3. I decided to make everyone’s life easier, I would try to cut releases more frequently at certain milestones, or I guess when I feel like QA is solid, I dunno. Who knows why I do the things I do? I’ve been trying to figure it out out my whole life.

Here’s what has changed since the last changelog…

  • identd was implemented kind of incorrectly, that has now been resolved.
  • added AGENTS.md to help external LLM agents that may wish to open PRs against the project
  • many more messages will show up in the server buffer now, where previously far too many were silently dropped
  • updated some dependencies
  • New ignore system modeled after irssi’s fantastic ignore system
  • Received :emoji: shortcodes are converted into emoji automatically for you
  • On desktop, typing : brings up an emoji suggestion menu just like for @ # and clicking > does, instead of using the mobile suggester bar.
  • Fixed: /list now brings up the channel list modal, like I swear it used to.
  • Fixed: on Firefox, the input area would not expand vertically automatically; this has been resolved.

That’s it! Time to go enjoy the rest of my day off.

Another day, another release! v1.0.4…

  • Added: the LURKER title in the top left has now become a full buffer with an input and system level debug message type stuff
    • There were also a lot of minor visual polish tweaks that accompanied this change.
  • Added: a new /network slash command can be used to set up and manage networks from the input bar, no GUI required
  • Added: new /get and /set commands let you manipulate config variables from the input bar, also no GUI required
  • Improved: the ‘send’ button is now disabled when there is nothing in the input area.
  • New: you can now change your default quit message via chat.quit_message setting
  • Fixed: if your chosen nick was taken on connect, the auto-changed nick was not appearing in your input bar nick readout.
  • Fixed: up/down arrow keys were not allowing you to navigate multiple lines of text in the input area, this has been fixed.
  • Some other visual polish tweaks and fixes.

That’s it! v1.0.4 is now live on app.lurker.chat as well as available to pull from GitHub container registry, etc…

After a day of rest, I am back at it. I cut a new release for just a few changes, but one big one. v1.0.5 is out now!

  • Changed: unread DMs now display in yellow (as if there is a highlight in them) to make unread DMs more distinctive among a sea of different buffers.
  • Improved: identd could be flaky under some circumstances, hopefully worked those out now…
  • Improved: the highlight system has been completely overhauled, it is now similar to the ignore system released a few days ago; it is way more powerful and features a better matching algorithm that handles not-ascii scripts better. Out of the other IRC clients I checked, only weechat and lurker do this properly.

That’s it! See ya tomorrow probably…

I was trying to avoid cutting a new release until I hit 1.1.0 properly but stuff started to pile up too much, so I cut another release… v1.0.6!

  • kofany contributed a PR which makes it possible to put lurker ident behind oidentd. there’s more info for people curious about this in the pull request.
  • Fixed an issue where ‘MONITOR unknown command’ would occur when changing your nick after it was automatically changed on connect due to a nickname collision.
  • In the message list, nicknames are now interactive in most places, it shows the context menu and has ‘reply’ and ‘copy nickname’ affordances now.
  • Added full RPE2E encryption support for channels (this was a big one).
  • Fixed stale channels lingering in the network channel list even after refreshing it.
  • Adjusted the : emoji suggestion panel to only come up after typing at least two characters of the emoji to search for; before now this was making it difficult to send emoticons like :smiley:
  • Fixed a style inconsistency in the input bar on desktop, where your user modes were accent colored when channel modes are not accent colored in the status bar.
  • Added new look.modal.overlay option, which allows you to change or remove the backdrop for modals on desktop. If you really do not like the word mark wallpaper, this one is for you…
  • Added the ability to clear a saved network password in the edit network modal.
  • Fixed an issue that was preventing reordering of pinned buffers if one of the pinned buffers was promoted to the friend section.
  • In theory, improved how much visual space is maintained when auto-scrolling the buffer list, it should be 2x as much as before if not more, and work more consistently at larger font sizes. Though initial feedback has not indicated this worked…
  • skdoo fixed an issue which was cutting off the sub-section area in the settings sidebar when look.font.size was set to large sizes.

That’s it! This is now live on app.lurker.chat and can be fetched from GitHub / container registry. Have fun.

Stuff piled up so I decided to cut another release, v1.0.7!

  • Added Beta XDCC support for standalone clients.
  • Added CTCP support for standard CTCP queries with configurable replies.
  • Added support for inbound/outbound channel invites.
  • Added the ability to mark a nick as a “relay bot” so that relayed messages appear from the sending nick and not the relay bot.
  • Added back/forward navigation using Cmd/Ctrl+[ and ] keys.
  • Added ‘smart sorting’ to the Cmd/Ctrl+K quick switcher.
  • Added ability to turn off message action bar that appears on hover, it is replaced by a left click / single tap context menu with the same affordances.
  • Added unread highlight badge for clients installed in PWA mode with push notifications enabled.
  • Improved the jump-to message functionality used across the app for toasts, notifications, searches, etc.
  • Improved the tapping/hover situation on mobile considerably.
  • Improved the ‘notification’ settings for buffers, you can now silence notifications and unread counts, crammed into a radio picker similar to Discord.
  • Improved the way ‘notice’ message types behave; this is elaborate and hard to describe succintly.
  • Fixed issue where a very active channel never stopped scrolling, even if you scrolled up to see older messages.
  • Fixed an issue that was preventing nicknames from being selected among a text selection in the message list.
  • Added placeholder/barebones content for a vitepress site to live at https://docs.lurker.chat

Umm, I think that’s it! Enjoy!

More stuff piled up, so I cut a new point release, v1.0.8 is out now!

  • Added beta ZNC/Soju-like bouncer support, so you can connect to your lurker instance with other clients
  • Optimization pass so the client starts up faster than ever and doesn’t risk disconnects and other strange issues on low-powered systems
  • Added support for joining password protected channels.
  • Redesigned the way some controls are accessed in the sidebar.

This is out on app.lurker.chat as well as the :latest and :1.0.8 container images.

I pushed out another small non-versioned update with some of the last cards in the prior milestone…

  • Changes to hopefully fix drift / out of date unread badge on the PWA icon.
  • Fix some bugs around which messages get marked as unread in the server buffer to hopefully cut down on noise there.
  • Fix stuck online peers from networks that don’t support MONITOR.
  • Some very small UX tweaks around the main client interface.

That’s it! This is live in the container image as well as app.lurker.chat.

I pushed out the last (hopefully) version of 1.0 just now, 1.0.9. The changelog is the same as above, basically, with extra PR that did some refactoring of the import/export system but didn’t really change any functionality.

Now work moves on to the next milestone, admin & onboarding improvements.

Whoa, 6 days without ‘release’??? :blue_circle: :blue_circle: That must be a record.

Lurker v1.1.0 is out now! This is a big one with new features and a big overhaul of the uploader system.

Uploads got rebuilt

  • You can now choose where uploads go. New storage backends: your own disk, S3/R2, Zipline, Chibisafe — alongside the existing ones.
  • Admins can configure which uploaders exist and which ones users are allowed to pick.
  • You can upload audio and video, not just images.
  • You can delete an upload, and it actually destroys the file at the provider — not just the history row.
  • Location data and other metadata is now stripped from everything you upload, including animated GIFs and SVGs. It was already stripped from ordinary photos; those two slipped through.
  • Images are re-encoded to WebP instead of JPEG. Smaller files, and transparency support, makes it better than JPEG.
  • The upload progress bar tells the truth. It used to hit “100%” the moment the file reached the server, then sit there for the whole (much slower) upload to the provider. Now it tells you which stage it’s on.
  • Big uploads no longer balloon the server’s memory — they stream to disk instead of being held in RAM.

Uploads browser

  • You can search your uploads by filename, and filter by type.
  • It’s a grid of thumbnails now instead of a cramped list, with bigger thumbnails.
  • Clicking one opens it in the viewer, and left/right arrows walk through the rest.

Media viewer / lightbox

  • Video and audio play inside Lurker instead of throwing you out to a new tab. Text files open too (if they can).
  • There’s a copy-link button in the lightbox now.

Admin & setup

  • New admin panel separate from the regular app settings.
  • First-run setup flow for a fresh install.
  • Admins can define networks for the whole instance, and lock users to them.

Other

  • Channel-name tab completion now cycles properly on repeat Tab, and suggests by recency. (Contributed by @JawshTheDark.)
  • Docs: self-hosted disk uploads, and the Cloudflare hotlink-protection trap.
  • Assorted bug fixes: upload errors from providers no longer get swallowed, a couple of flaky tests fixed, the uploader picker no longer appears when there’s only one option.
  • Dependency updates.

Lurker for Android prototype…

And same thing for iOS…

And video of the prototypes working with app.lurker.chat too

Lurker v1.1.1 just went out! This was mainly about getting support for the mobile apps in place, and getting oidentd working better for some vocal users in the IRC channel.

That’s it!

Stay frosty.

4 posts were merged into an existing topic: Lurker for iOS - Devlog

Oops, forgot to say Lurker 1.1.2 went out this morning!

  • Added support for APNs and FCM push notifications (for first-party mobile apps)
  • Added chghost support and message consolidation support
  • Added extended-join support (new option chat.show_join_account)
  • Changed: zipline uploads now user /raw/ urls
  • Changed: removed /local/ path from local uploads
  • Fixed: settings button could become unresponsive (hopefully fixed)
  • Fixed: chat.allow_split_messages was not working properly.
  • Big database migration to change how open/closed buffers are tracked.

Lurker v1.1.3 release just got cut!

  • Fixed an issue where the big migration in the last release could take a long time and cause problems with external database replication…
  • Fixed an issue where push devices for native apps were mislabeled in the web client’s notification client list
  • Added client protocol spec / guide to the docs site
  • If a server provides a timestamp for a message, we record that timestamp and not the time we received the message.
  • We’re also internally recording msgid to lay the groundwork for possible future reply / react support.
  • The server now reports accurate notify status on message arrivals that properly reflect the ignore rules.
  • Fixed an issue where the /part command didn’t work as expected.
  • Overhauled the “automatically reconnect” system so it will actually, like, reconnect you reliably, automatically.
  • Fixed an issue (hopefully) that caused the message list and/or input bar to disappear on mobile Chrome.
  • Admin screens like invites and users will automatically refresh as you click on them, so stale data doesn’t persist confusingly.
  • mIRC color codes are properly stripped from notifications.

I’ll post some stuff about the iOS client later. iOS client probably needs its own thread…

Busy day! I cranked hard and got v1.1.4 out tonight.

  • Fixed issue where spoilers created with ||spoiler tagging|| were basically invisible.
  • Added backend improvement where the server can tell clients the maximum allowed upload size.
  • Added backend improvement: LURKER_MAX_UPLOAD_MB declares max upload MBs, which helps if you’re using Cloudflared and your upload maximum is a hard 100mb limit.
  • Fixed some edge cases around auto-reconnection that could cause auto-reconnect attempts to end early.
  • Added /j and /p shortcuts, and /shrug ¯_(ツ)_/¯
  • Added backend improvement: the server can tell clients there is no more message content in a buffer.
  • Fixed a login redirect loop.
  • Fixed identd to now properly use the Lurker account name for the user, not their nickname.
  • Added admin ability to override identd per user in the Admin → User menu.
  • Fixed issue where Lurker usernames were case sensitive and could have spaces or other unusual characters in them (:man_facepalming:t2:)
  • New page on https://docs.lurker.chat explaining Lurker’s IRCv3 support and why it supports the various capabilities.
  • Added new count badge of unread highlights that appears in the mobile app (by the back button) and on the desktop app (if you have the channel list collapsed) to aid in visibility of important unread messages.
  • Various dependency updates.

This is out now on app.lurker.chat and your favorite (and only) GitHub container registry!

Another Lurker update is comin’ at you fast and loose. Here it comes! Put your hands up, kid, c’mon! You gotta catch it!

  • Added new chat.keep_position_on_send option, which maintains your scroll position when you send a message instead of jumping to the bottom. Off by default, which maintains existing behavior.
  • A handful of changes were made to the websocket to improve it, basically. The most visible change should be that when you load in a buffer that has a lot of event noise, and you have join consolidation turned on, you shouldn’t see the ‘load in’ effect in the buffer as much as you used to, or at all.
  • Overhauled the system behind event consolidation and filtering. The main improvement is that you can now choose different event filter levels between desktop and mobile. So on desktop you could show all events with consolidation, and on mobile you could just hide all event noise entirely.
  • Backend improvements (and matching client side improvements) to how the bookmarks system conveys bookmarks to the client (this was a bit wacky before, it’s more normal now).

You can snag it from all the usual places.

Note you need this update to use the latest iOS beta! Probably.

I’m posting release notes only on GitHub now. Find notes for new builds over there.