Lurker is a beautiful self-hosted modern IRC client with a retro flair, most easily described as "your personal IRCCloud, with Weechat looks". https://lurker.chat
  • TypeScript 81.7%
  • Vue 16.9%
  • JavaScript 0.6%
  • CSS 0.5%
  • Shell 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Brad Root 93b2b105a0
Merge pull request #654 from amiantos/command-aliases-and-shrug
Add /j and /p aliases and a /shrug command (#412, #532)
2026-07-25 14:56:46 -07:00
.github Bump the actions group across 1 directory with 3 updates 2026-07-19 07:39:46 +00:00
deploy docs: add AGENTS.md and normalize license headers to MPL-2.0 2026-06-18 15:55:58 -07:00
docs Fix two doc inaccuracies Copilot caught 2026-07-25 11:44:05 -07:00
integrations/autonotes Bump esbuild 2026-06-15 04:59:52 +00:00
server Address review: the cap describes a body, not a file 2026-07-25 11:15:00 -07:00
shared Report the real reason a legacy username is grandfathered 2026-07-25 00:14:56 -07:00
tools docs: add AGENTS.md and normalize license headers to MPL-2.0 2026-06-18 15:55:58 -07:00
vue_client Address review: /shrug skipped the split/flood gate 2026-07-25 14:43:29 -07:00
.dockerignore Add Dockerfile and compose for self-hosted deployment 2026-05-10 01:00:16 -07:00
.env.example Fix two doc inaccuracies Copilot caught 2026-07-25 11:44:05 -07:00
.gitignore chore: untrack + gitignore data2/session-secret.key (accidentally committed in 793275a) 2026-07-01 20:18:05 -07:00
.oxfmtrc.json build: switch formatter from Prettier to oxfmt 2026-05-20 15:26:48 -07:00
.oxlintrc.json lint: teach vitest/expect-expect about expectVerbError helper 2026-06-18 19:55:34 -07:00
AGENTS.md Fix oxfmt trailing whitespace in AGENTS.md 2026-06-18 18:44:51 -07:00
docker-compose.caddy.yml docs: add AGENTS.md and normalize license headers to MPL-2.0 2026-06-18 15:55:58 -07:00
docker-compose.override.yml.example docs: add AGENTS.md and normalize license headers to MPL-2.0 2026-06-18 15:55:58 -07:00
docker-compose.yml Add built-in ZNC-style IRC bouncer (opt-in) 2026-07-03 14:01:13 -04:00
Dockerfile docs: add AGENTS.md and normalize license headers to MPL-2.0 2026-06-18 15:55:58 -07:00
LICENSE relicense from Elastic License 2.0 to MPL 2.0 2026-05-18 10:50:51 -07:00
package-lock.json Bump version to 1.1.3 2026-07-22 16:27:12 -07:00
package.json Bump version to 1.1.3 2026-07-22 16:27:12 -07:00
README.md docs: bring bouncer docs up to the soju-parity + TLS-default reality 2026-07-04 01:07:33 -07:00
ROADMAP.md docs: fix oxfmt formatting + correct the through-line critical path 2026-07-05 13:02:22 -07:00
SECURITY.md Clarify security policy wording 2026-06-16 00:19:43 -07:00
tsconfig.base.json build: set up TypeScript, oxlint, and Prettier toolchain 2026-05-20 12:39:37 -07:00
tsconfig.json Make the case-fold buffer repair re-runnable; fold DMs too (#289) 2026-06-17 19:06:50 -07:00
vitest.config.ts Address code review 2026-07-13 01:23:17 -07:00

  Lurker

CI Docker image codecov OpenSSF Scorecard License: MPL 2.0 IRC: #lurker

Lurker is a self-hosted modern IRC client with a retro flair, most easily described as "your personal IRCCloud, with Weechat looks".

Lurker runs as an always-on server that stays connected to IRC on your behalf, keeps full message history, and lets you reattach from any browser — desktop or mobile — picking up exactly where you left off. Open it on as many devices and tabs as you like; read state, settings, and history stay in sync everywhere; when all clients are disconnected, auto-away sets your status, and web push notifications inform you of highlights. Oh, and the icon rules.

Features

  • Always-on and multi-user. Each invited user connects to their own set of IRC networks, and Lurker stays connected when they're away.
  • Full history and search. Every message is stored and searchable. Auto-away triggers after your last client disconnects, and smart push notifications fire on highlights.
  • IRC with Modern Convienences. Peer presence, automatic nick regain, join/part summarization, tab nickname completion, message drafts, saved messages, user notes, and a searchable channel browser w/ cache.
  • Image uploads. Paste, drag, or pick an image; Lurker optimizes it, uploads it to x0.at or catbox.moe, inserts the link into your message, and keeps a history of all your uploads.
  • Customizable UI. The beautiful retro terminal-style interface has 40+ settings to customize it how you want, and you can freely pin and rearrange channels and DMs.
  • Installable. Lurker is a PWA — install it as a native-feeling app on your phone, Mac, or PC straight from the browser.
  • Built-in bouncer. Opt-in, TLS-by-default IRC listener: attach any client — from mIRC to modern IRCv3 clients like Halloy, gamja, and Goguma — to your always-on connection. Speaks SASL, network discovery (soju.im/bouncer-networks), and on-demand scrollback (draft/chathistory) for capable clients, with history playback on attach for the rest. See the self-hosting guide.

Screenshot (as macOS PWA)

Lurker IRC client screenshot

Rave Reviews

  • <cfuser> amiantos: holy shit, you made something better than irccloud
  • <amigojapan> great, now that amiantos's chat client is catching up to IRC cloud, I think I can switch to it as my daily driver
  • <skdoo> amiantos makes cool shit
  • <jadeia> lurker is really nice. this is streets ahead of irccloud in terms of design and ease of use.

Stack

  • Server — TypeScript on Node (run via tsx), Express, irc-framework, ws, better-sqlite3, sharp, web-push
  • Client — TypeScript, Vue 3, Vite, Pinia, vue-router
  • Tooling — Vitest, oxlint, oxfmt

Installation

Install (Docker)

curl -O https://raw.githubusercontent.com/amiantos/lurker/main/docker-compose.yml
docker compose up -d

Then open http://localhost:8015 and create your admin account. Username + password is the default; passkeys are optional. See SELF_HOSTING.md for the full guide — reverse proxy + HTTPS, enabling passkeys, push notifications, updating, and backups.

Lurker.Chat Managed Hosting

Don't want to run a server yourself? Lurker.Chat is official managed hosting: an always-on Lurker instance with backups, updates, and HTTPS handled for you — $5/mo, with a 14-day money-back guarantee.

Deploy on DigitalOcean

Stand up a public, HTTPS-enabled Lurker on a fresh droplet from a single pasted script — no SSH required, with passkeys, web push, and TLS all configured for you. Step-by-step instructions are in docs/digitalocean.md.

Manual Install (without Docker)

npm run install:all
npm run client:build
npm start

The server listens on port 8010 by default and stores everything in ./data/. Override with the envvars documented in .env.example.

Development

npm run install:all
cp .env.example .env   # defaults assume the local hostname documented in the file
npm run dev

Note on install scripts. A few dependencies build native code or fetch a platform binary at install time — better-sqlite3 (root), esbuild (root and docs/), and sharp/workerd (docs/). Each is pre-approved in that workspace's allowScripts allowlist, so npm runs them without prompting; core-js is intentionally denied — its only install script prints a funding message. The vue_client workspace has no install-script dependencies, so it has no allowlist. The allowScripts field is ignored by npm older than 11.16.

Documentation

Community

License

Mozilla Public License 2.0 — see LICENSE.