{"id":50436993,"url":"https://github.com/amiantos/lurker","last_synced_at":"2026-05-31T17:31:17.024Z","repository":{"id":359223331,"uuid":"1231655321","full_name":"amiantos/lurker","owner":"amiantos","description":"Lurker is a beautiful self-hosted modern IRC client with a retro flair, most easily described as \"your personal IRCCloud, with Weechat looks\".","archived":false,"fork":false,"pushed_at":"2026-05-28T05:16:44.000Z","size":5027,"stargazers_count":4,"open_issues_count":19,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-28T05:22:41.703Z","etag":null,"topics":["express","irc","irc-client","irc-framework","self-hosted","vue"],"latest_commit_sha":null,"homepage":"https://lurker.chat","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amiantos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-07T06:56:39.000Z","updated_at":"2026-05-28T05:16:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/amiantos/lurker","commit_stats":null,"previous_names":["amiantos/lurker"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/amiantos/lurker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amiantos%2Flurker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amiantos%2Flurker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amiantos%2Flurker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amiantos%2Flurker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amiantos","download_url":"https://codeload.github.com/amiantos/lurker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amiantos%2Flurker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33742185,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["express","irc","irc-client","irc-framework","self-hosted","vue"],"created_at":"2026-05-31T17:31:16.385Z","updated_at":"2026-05-31T17:31:17.019Z","avatar_url":"https://github.com/amiantos.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1\u003e\n  \u003cimg src=\"docs/assets/lurker-icon.png\" alt=\"\" width=\"48\" height=\"48\" align=\"top\"\u003e\u0026nbsp;\u0026nbsp;Lurker\n\u003c/h1\u003e\n\n[![CI](https://github.com/amiantos/lurker/actions/workflows/test.yml/badge.svg)](https://github.com/amiantos/lurker/actions/workflows/test.yml)\n[![Docker image](https://github.com/amiantos/lurker/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/amiantos/lurker/pkgs/container/lurker)\n[![codecov](https://codecov.io/github/amiantos/lurker/graph/badge.svg?token=2KAFLPWKHG)](https://codecov.io/github/amiantos/lurker)\n[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/amiantos/lurker/badge)](https://scorecard.dev/viewer/?uri=github.com/amiantos/lurker)\n[![License: MPL 2.0](https://img.shields.io/badge/License-MPL_2.0-brightgreen.svg)](LICENSE)\n[![IRC: #lurker](https://img.shields.io/badge/IRC-%23lurker%20on%20Libera.Chat-1459b8)](https://web.libera.chat/#lurker)\n\nLurker is a self-hosted modern IRC client with a retro flair, most easily described as \"your personal [IRCCloud](https://www.irccloud.com), with [Weechat](https://weechat.org) looks\".\n\nLurker 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.\n\n# Features\n\n- **Always-on and multi-user.** Each invited user connects to their own set of IRC networks, and Lurker stays connected when they're away.\n- **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.\n- **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.\n- **Image uploads.** Paste, drag, or pick an image; Lurker optimizes it, uploads it to [x0.at](https://x0.at) or [catbox.moe](https://catbox.moe), inserts the link into your message, and keeps a history of all your uploads.\n- **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.\n- **Installable.** Lurker is a PWA — install it as a native-feeling app on your phone, Mac, or PC straight from the browser.\n\n# Screenshot (as macOS PWA)\n\n\u003cimg src=\"docs/assets/screenshot.png\" alt=\"Lurker IRC client screenshot\" width=\"100%\"\u003e\n\n# Rave Reviews\n\n- `\u003ccfuser\u003e amiantos: holy shit, you made something better than irccloud`\n- `\u003camigojapan\u003e great, now that amiantos's chat client is catching up to IRC cloud, I think I can switch to it as my daily driver`\n- `\u003cskdoo\u003e amiantos makes cool shit`\n- `\u003cjadeia\u003e lurker is really nice. this is streets ahead of irccloud in terms of design and ease of use.`\n\n# Stack\n\n- **Server** — TypeScript on Node (run via `tsx`), Express, `irc-framework`, `ws`, `better-sqlite3`, `sharp`, `web-push`\n- **Client** — TypeScript, Vue 3, Vite, Pinia, `vue-router`\n- **Tooling** — Vitest, oxlint, oxfmt\n\n# Installation\n\n## Install (Docker — Recommended)\n\n```bash\ncurl -O https://raw.githubusercontent.com/amiantos/lurker/main/docker-compose.yml\ndocker compose up -d\n```\n\nThen open \u003chttp://localhost:8015\u003e and create your admin account. Username + password is the default; passkeys are optional. See [SELF_HOSTING.md](docs/SELF_HOSTING.md) for the full guide — reverse proxy + HTTPS, enabling passkeys, push notifications, updating, and backups.\n\n## Deploy on DigitalOcean\n\nStand 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](docs/digitalocean.md)**.\n\n## Manual Install (without Docker)\n\n```bash\nnpm run install:all\nnpm run client:build\nnpm start\n```\n\nThe server listens on port 8010 by default and stores everything in `./data/`. Override with the envvars documented in [`.env.example`](.env.example).\n\n## Development\n\n```bash\nnpm run install:all\ncp .env.example .env   # defaults assume the local hostname documented in the file\nnpm run dev\n```\n\n# Documentation\n\n- **[Self-hosting guide](docs/SELF_HOSTING.md)** — reverse proxy + HTTPS, passkeys, web push, updating, backups, and troubleshooting.\n- **[Deploy on DigitalOcean](docs/digitalocean.md)** — the one-shot droplet walkthrough.\n- **[MCP \u0026 HTTP API](docs/MCP.md)** — drive Lurker from agents, scripts, or other external tools.\n\n# Community\n\n- Chat in **#lurker** on [Libera.Chat](https://libera.chat).\n- Discuss Lurker and read my devlog over on [The Eye of Providence](https://discuss.bradroot.me/tags/c/projects/13/lurker/39).\n- Say hi — I'm **amiantos** on Libera.Chat and [MansionNET](https://inthemansion.com).\n\n# License\n\nMozilla Public License 2.0 — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famiantos%2Flurker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famiantos%2Flurker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famiantos%2Flurker/lists"}