Repository files navigation

LocalChat

A private, zero-install team chat that runs on your own Wi-Fi.

One ~5 MB binary. No accounts. No cloud. No telemetry. Double-click. Share the LAN URL. Done.

BuildReleaseLicense: MITPlatform: Windows

LocalChat — chat UI


Why LocalChat?

Slack and Teams need internet, accounts, and SaaS pricing. IRC needs a server admin and config files. Discord owns your data.

LocalChat is the missing fourth option for offices, classrooms, hackathons, homelabs, secure facilities, factory floors, ships, planes, and anywhere else people share a network but not necessarily the internet:

  • One binary, no install. Drop LocalChat.exe on a desktop. Double-click. That's the whole setup.
  • Air-gapped friendly. Zero outbound traffic. Works on a router with no WAN.
  • No accounts. Pick a name, you're in. Identity is bound to a per-browser key so usernames can't be impersonated.
  • End-to-end encrypted DMs. The host process literally cannot read direct messages.
  • Persistent. Channels, members, message history, reactions and uploads survive restarts.
  • Tiny. ~5 MB on disk, ~5 MB RAM at 200 users / 50 channels.

Features

💬 ChannelsPublic, private, lobby. Create, invite, join, leave.
🔐 1:1 DMsTrue end-to-end encryption.
📞 Voice & video callsDirect peer-to-peer between users.
📎 File sharingDrag & drop, image previews, lightbox.
↩️ Replies & reactionsQuote any message. React with any emoji.
👋 Mentions, typing, presence, read receiptsAll the modern niceties.
🛡️ Admin dashboardLive metrics, kick/ban, broadcast, settings.
🌗 Light & dark themesPolished, mobile-friendly UI.
🔁 Auto-reconnectSurvives sleep, Wi-Fi roams, network blips.
🚫 No telemetryNot a single outbound request.

60-second quick start

  1. Download LocalChat.exe from the latest release.
  2. Double-click. A tray icon appears; the host's browser opens automatically.
  3. Allow it through Windows Firewall (Private network is enough).
  4. Read the LAN URL from the tray tooltip — e.g. https://192.168.1.42:5000 — and share it with anyone on the same Wi-Fi.
  5. They open the URL, pick a name, and start chatting. No install, no signup.

💡 The first visit shows a browser warning because the cert is self-signed. Click Advanced → Proceed. To replace it with a real cert, see app/scripts/.

Admin dashboard

Admin dashboard

Tray → Open admin dashboard opens the dashboard with the auto-generated admin token pre-filled. From there:

  • See live metrics (users, messages, uploads, uptime).
  • Kick or ban users.
  • Broadcast announcements to #general.
  • View and delete channels and uploaded files.
  • Change settings (port, max upload, history cap, autostart on boot, allow LAN admin access).

The admin API is localhost-only by default and gated by a per-install token.

Where your data lives

On first launch LocalChat opens a tiny browser page asking where to keep its data. Pick any folder you like (the default is C:\LocalChat on Windows). The chosen path is remembered in %APPDATA%\LocalChat\config.json (or ~/.config/localchat/config.json on Linux/macOS), so the exe can be moved, replaced, or upgraded without losing your data — and without asking again.

Inside the chosen folder you'll find:

  • localchat.db — single SQLite file holding users, channels, messages, reactions, read receipts, bans, and the per-database server_id.
  • uploads/ — raw uploaded blobs (atomic writes, sha-prefixed names).
  • tls/ — self-signed certificate + key (or your Let's Encrypt cert).
  • logs/localchat.log — rolling app log.
  • config.json — server settings, banlist, admin token.

Want a clean slate? Stop the app, delete the data folder (and the AppData config if you want to be re-prompted), restart.

Override the data folder for a single launch with LOCALCHAT_HOME=D:\path\to\folder.

Building from source

cd app
cargo run --release # tray + browser auto-open
cargo build --release --features tray # produces target/release/localchat.exe

CI publishes a single LocalChat.exe when you push a tag (git tag v2.0.0 && git push origin v2.0.0).

🛠️ Hacking on the internals? See DESIGN.md for the full architecture — concurrency model, persistence layout, E2EE protocol, wire spec, and a file-by-file map of the codebase.

Roadmap

  • macOS & Linux tray builds
  • Mobile-native client (LAN-only, serverless)
  • Group voice/video rooms
  • Slash commands & bots
  • Per-channel notification preferences
  • Searchable history

PRs welcome.

License

MIT — do anything you want; attribution appreciated.


Built with Rust 🦀 because boring infrastructure should be fast and tiny.

About

Private, zero-install LAN team chat. One ~5 MB Rust binary — no accounts, no cloud, no telemetry. Channels, replies, reactions, file sharing, voice/video calls, and end-to-end encrypted DMs. Double-click to run; share the LAN URL.

Resources

Code of conduct

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

LocalChat

A private, zero-install team chat that runs on your own Wi-Fi.

One ~5 MB binary. No accounts. No cloud. No telemetry. Double-click. Share the LAN URL. Done.

BuildReleaseLicense: MITPlatform: Windows

LocalChat — chat UI


Why LocalChat?

Slack and Teams need internet, accounts, and SaaS pricing. IRC needs a server admin and config files. Discord owns your data.

LocalChat is the missing fourth option for offices, classrooms, hackathons, homelabs, secure facilities, factory floors, ships, planes, and anywhere else people share a network but not necessarily the internet:

  • One binary, no install. Drop LocalChat.exe on a desktop. Double-click. That's the whole setup.
  • Air-gapped friendly. Zero outbound traffic. Works on a router with no WAN.
  • No accounts. Pick a name, you're in. Identity is bound to a per-browser key so usernames can't be impersonated.
  • End-to-end encrypted DMs. The host process literally cannot read direct messages.
  • Persistent. Channels, members, message history, reactions and uploads survive restarts.
  • Tiny. ~5 MB on disk, ~5 MB RAM at 200 users / 50 channels.

Features

💬 ChannelsPublic, private, lobby. Create, invite, join, leave.
🔐 1:1 DMsTrue end-to-end encryption.
📞 Voice & video callsDirect peer-to-peer between users.
📎 File sharingDrag & drop, image previews, lightbox.
↩️ Replies & reactionsQuote any message. React with any emoji.
👋 Mentions, typing, presence, read receiptsAll the modern niceties.
🛡️ Admin dashboardLive metrics, kick/ban, broadcast, settings.
🌗 Light & dark themesPolished, mobile-friendly UI.
🔁 Auto-reconnectSurvives sleep, Wi-Fi roams, network blips.
🚫 No telemetryNot a single outbound request.

60-second quick start

  1. Download LocalChat.exe from the latest release.
  2. Double-click. A tray icon appears; the host's browser opens automatically.
  3. Allow it through Windows Firewall (Private network is enough).
  4. Read the LAN URL from the tray tooltip — e.g. https://192.168.1.42:5000 — and share it with anyone on the same Wi-Fi.
  5. They open the URL, pick a name, and start chatting. No install, no signup.

💡 The first visit shows a browser warning because the cert is self-signed. Click Advanced → Proceed. To replace it with a real cert, see app/scripts/.

Admin dashboard

Admin dashboard

Tray → Open admin dashboard opens the dashboard with the auto-generated admin token pre-filled. From there:

  • See live metrics (users, messages, uploads, uptime).
  • Kick or ban users.
  • Broadcast announcements to #general.
  • View and delete channels and uploaded files.
  • Change settings (port, max upload, history cap, autostart on boot, allow LAN admin access).

The admin API is localhost-only by default and gated by a per-install token.

Where your data lives

On first launch LocalChat opens a tiny browser page asking where to keep its data. Pick any folder you like (the default is C:\LocalChat on Windows). The chosen path is remembered in %APPDATA%\LocalChat\config.json (or ~/.config/localchat/config.json on Linux/macOS), so the exe can be moved, replaced, or upgraded without losing your data — and without asking again.

Inside the chosen folder you'll find:

  • localchat.db — single SQLite file holding users, channels, messages, reactions, read receipts, bans, and the per-database server_id.
  • uploads/ — raw uploaded blobs (atomic writes, sha-prefixed names).
  • tls/ — self-signed certificate + key (or your Let's Encrypt cert).
  • logs/localchat.log — rolling app log.
  • config.json — server settings, banlist, admin token.

Want a clean slate? Stop the app, delete the data folder (and the AppData config if you want to be re-prompted), restart.

Override the data folder for a single launch with LOCALCHAT_HOME=D:\path\to\folder.

Building from source

cd app
cargo run --release # tray + browser auto-open
cargo build --release --features tray # produces target/release/localchat.exe

CI publishes a single LocalChat.exe when you push a tag (git tag v2.0.0 && git push origin v2.0.0).

🛠️ Hacking on the internals? See DESIGN.md for the full architecture — concurrency model, persistence layout, E2EE protocol, wire spec, and a file-by-file map of the codebase.

Roadmap

  • macOS & Linux tray builds
  • Mobile-native client (LAN-only, serverless)
  • Group voice/video rooms
  • Slash commands & bots
  • Per-channel notification preferences
  • Searchable history

PRs welcome.

License

MIT — do anything you want; attribution appreciated.


Built with Rust 🦀 because boring infrastructure should be fast and tiny.

About

Private, zero-install LAN team chat. One ~5 MB Rust binary — no accounts, no cloud, no telemetry. Channels, replies, reactions, file sharing, voice/video calls, and end-to-end encrypted DMs. Double-click to run; share the LAN URL.

Resources

Code of conduct

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

LocalChat

A private, zero-install team chat that runs on your own Wi-Fi.

One ~5 MB binary. No accounts. No cloud. No telemetry. Double-click. Share the LAN URL. Done.

BuildReleaseLicense: MITPlatform: Windows

LocalChat — chat UI


Why LocalChat?

Slack and Teams need internet, accounts, and SaaS pricing. IRC needs a server admin and config files. Discord owns your data.

LocalChat is the missing fourth option for offices, classrooms, hackathons, homelabs, secure facilities, factory floors, ships, planes, and anywhere else people share a network but not necessarily the internet:

  • One binary, no install. Drop LocalChat.exe on a desktop. Double-click. That's the whole setup.
  • Air-gapped friendly. Zero outbound traffic. Works on a router with no WAN.
  • No accounts. Pick a name, you're in. Identity is bound to a per-browser key so usernames can't be impersonated.
  • End-to-end encrypted DMs. The host process literally cannot read direct messages.
  • Persistent. Channels, members, message history, reactions and uploads survive restarts.
  • Tiny. ~5 MB on disk, ~5 MB RAM at 200 users / 50 channels.

Features

💬 ChannelsPublic, private, lobby. Create, invite, join, leave.
🔐 1:1 DMsTrue end-to-end encryption.
📞 Voice & video callsDirect peer-to-peer between users.
📎 File sharingDrag & drop, image previews, lightbox.
↩️ Replies & reactionsQuote any message. React with any emoji.
👋 Mentions, typing, presence, read receiptsAll the modern niceties.
🛡️ Admin dashboardLive metrics, kick/ban, broadcast, settings.
🌗 Light & dark themesPolished, mobile-friendly UI.
🔁 Auto-reconnectSurvives sleep, Wi-Fi roams, network blips.
🚫 No telemetryNot a single outbound request.

60-second quick start

  1. Download LocalChat.exe from the latest release.
  2. Double-click. A tray icon appears; the host's browser opens automatically.
  3. Allow it through Windows Firewall (Private network is enough).
  4. Read the LAN URL from the tray tooltip — e.g. https://192.168.1.42:5000 — and share it with anyone on the same Wi-Fi.
  5. They open the URL, pick a name, and start chatting. No install, no signup.

💡 The first visit shows a browser warning because the cert is self-signed. Click Advanced → Proceed. To replace it with a real cert, see app/scripts/.

Admin dashboard

Admin dashboard

Tray → Open admin dashboard opens the dashboard with the auto-generated admin token pre-filled. From there:

  • See live metrics (users, messages, uploads, uptime).
  • Kick or ban users.
  • Broadcast announcements to #general.
  • View and delete channels and uploaded files.
  • Change settings (port, max upload, history cap, autostart on boot, allow LAN admin access).

The admin API is localhost-only by default and gated by a per-install token.

Where your data lives

On first launch LocalChat opens a tiny browser page asking where to keep its data. Pick any folder you like (the default is C:\LocalChat on Windows). The chosen path is remembered in %APPDATA%\LocalChat\config.json (or ~/.config/localchat/config.json on Linux/macOS), so the exe can be moved, replaced, or upgraded without losing your data — and without asking again.

Inside the chosen folder you'll find:

  • localchat.db — single SQLite file holding users, channels, messages, reactions, read receipts, bans, and the per-database server_id.
  • uploads/ — raw uploaded blobs (atomic writes, sha-prefixed names).
  • tls/ — self-signed certificate + key (or your Let's Encrypt cert).
  • logs/localchat.log — rolling app log.
  • config.json — server settings, banlist, admin token.

Want a clean slate? Stop the app, delete the data folder (and the AppData config if you want to be re-prompted), restart.

Override the data folder for a single launch with LOCALCHAT_HOME=D:\path\to\folder.

Building from source

cd app
cargo run --release # tray + browser auto-open
cargo build --release --features tray # produces target/release/localchat.exe

CI publishes a single LocalChat.exe when you push a tag (git tag v2.0.0 && git push origin v2.0.0).

🛠️ Hacking on the internals? See DESIGN.md for the full architecture — concurrency model, persistence layout, E2EE protocol, wire spec, and a file-by-file map of the codebase.

Roadmap

  • macOS & Linux tray builds
  • Mobile-native client (LAN-only, serverless)
  • Group voice/video rooms
  • Slash commands & bots
  • Per-channel notification preferences
  • Searchable history

PRs welcome.

License

MIT — do anything you want; attribution appreciated.


Built with Rust 🦀 because boring infrastructure should be fast and tiny.

About

Private, zero-install LAN team chat. One ~5 MB Rust binary — no accounts, no cloud, no telemetry. Channels, replies, reactions, file sharing, voice/video calls, and end-to-end encrypted DMs. Double-click to run; share the LAN URL.

Resources

Code of conduct

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

LocalChat

A private, zero-install team chat that runs on your own Wi-Fi.

One ~5 MB binary. No accounts. No cloud. No telemetry. Double-click. Share the LAN URL. Done.

BuildReleaseLicense: MITPlatform: Windows

LocalChat — chat UI


Why LocalChat?

Slack and Teams need internet, accounts, and SaaS pricing. IRC needs a server admin and config files. Discord owns your data.

LocalChat is the missing fourth option for offices, classrooms, hackathons, homelabs, secure facilities, factory floors, ships, planes, and anywhere else people share a network but not necessarily the internet:

  • One binary, no install. Drop LocalChat.exe on a desktop. Double-click. That's the whole setup.
  • Air-gapped friendly. Zero outbound traffic. Works on a router with no WAN.
  • No accounts. Pick a name, you're in. Identity is bound to a per-browser key so usernames can't be impersonated.
  • End-to-end encrypted DMs. The host process literally cannot read direct messages.
  • Persistent. Channels, members, message history, reactions and uploads survive restarts.
  • Tiny. ~5 MB on disk, ~5 MB RAM at 200 users / 50 channels.

Features

💬 ChannelsPublic, private, lobby. Create, invite, join, leave.
🔐 1:1 DMsTrue end-to-end encryption.
📞 Voice & video callsDirect peer-to-peer between users.
📎 File sharingDrag & drop, image previews, lightbox.
↩️ Replies & reactionsQuote any message. React with any emoji.
👋 Mentions, typing, presence, read receiptsAll the modern niceties.
🛡️ Admin dashboardLive metrics, kick/ban, broadcast, settings.
🌗 Light & dark themesPolished, mobile-friendly UI.
🔁 Auto-reconnectSurvives sleep, Wi-Fi roams, network blips.
🚫 No telemetryNot a single outbound request.

60-second quick start

  1. Download LocalChat.exe from the latest release.
  2. Double-click. A tray icon appears; the host's browser opens automatically.
  3. Allow it through Windows Firewall (Private network is enough).
  4. Read the LAN URL from the tray tooltip — e.g. https://192.168.1.42:5000 — and share it with anyone on the same Wi-Fi.
  5. They open the URL, pick a name, and start chatting. No install, no signup.

💡 The first visit shows a browser warning because the cert is self-signed. Click Advanced → Proceed. To replace it with a real cert, see app/scripts/.

Admin dashboard

Admin dashboard

Tray → Open admin dashboard opens the dashboard with the auto-generated admin token pre-filled. From there:

  • See live metrics (users, messages, uploads, uptime).
  • Kick or ban users.
  • Broadcast announcements to #general.
  • View and delete channels and uploaded files.
  • Change settings (port, max upload, history cap, autostart on boot, allow LAN admin access).

The admin API is localhost-only by default and gated by a per-install token.

Where your data lives

On first launch LocalChat opens a tiny browser page asking where to keep its data. Pick any folder you like (the default is C:\LocalChat on Windows). The chosen path is remembered in %APPDATA%\LocalChat\config.json (or ~/.config/localchat/config.json on Linux/macOS), so the exe can be moved, replaced, or upgraded without losing your data — and without asking again.

Inside the chosen folder you'll find:

  • localchat.db — single SQLite file holding users, channels, messages, reactions, read receipts, bans, and the per-database server_id.
  • uploads/ — raw uploaded blobs (atomic writes, sha-prefixed names).
  • tls/ — self-signed certificate + key (or your Let's Encrypt cert).
  • logs/localchat.log — rolling app log.
  • config.json — server settings, banlist, admin token.

Want a clean slate? Stop the app, delete the data folder (and the AppData config if you want to be re-prompted), restart.

Override the data folder for a single launch with LOCALCHAT_HOME=D:\path\to\folder.

Building from source

cd app
cargo run --release # tray + browser auto-open
cargo build --release --features tray # produces target/release/localchat.exe

CI publishes a single LocalChat.exe when you push a tag (git tag v2.0.0 && git push origin v2.0.0).

🛠️ Hacking on the internals? See DESIGN.md for the full architecture — concurrency model, persistence layout, E2EE protocol, wire spec, and a file-by-file map of the codebase.

Roadmap

  • macOS & Linux tray builds
  • Mobile-native client (LAN-only, serverless)
  • Group voice/video rooms
  • Slash commands & bots
  • Per-channel notification preferences
  • Searchable history

PRs welcome.

License

MIT — do anything you want; attribution appreciated.


Built with Rust 🦀 because boring infrastructure should be fast and tiny.

About

Private, zero-install LAN team chat. One ~5 MB Rust binary — no accounts, no cloud, no telemetry. Channels, replies, reactions, file sharing, voice/video calls, and end-to-end encrypted DMs. Double-click to run; share the LAN URL.

Resources

Code of conduct

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

LocalChat

A private, zero-install team chat that runs on your own Wi-Fi.

One ~5 MB binary. No accounts. No cloud. No telemetry. Double-click. Share the LAN URL. Done.

BuildReleaseLicense: MITPlatform: Windows

LocalChat — chat UI


Why LocalChat?

Slack and Teams need internet, accounts, and SaaS pricing. IRC needs a server admin and config files. Discord owns your data.

LocalChat is the missing fourth option for offices, classrooms, hackathons, homelabs, secure facilities, factory floors, ships, planes, and anywhere else people share a network but not necessarily the internet:

  • One binary, no install. Drop LocalChat.exe on a desktop. Double-click. That's the whole setup.
  • Air-gapped friendly. Zero outbound traffic. Works on a router with no WAN.
  • No accounts. Pick a name, you're in. Identity is bound to a per-browser key so usernames can't be impersonated.
  • End-to-end encrypted DMs. The host process literally cannot read direct messages.
  • Persistent. Channels, members, message history, reactions and uploads survive restarts.
  • Tiny. ~5 MB on disk, ~5 MB RAM at 200 users / 50 channels.

Features

💬 ChannelsPublic, private, lobby. Create, invite, join, leave.
🔐 1:1 DMsTrue end-to-end encryption.
📞 Voice & video callsDirect peer-to-peer between users.
📎 File sharingDrag & drop, image previews, lightbox.
↩️ Replies & reactionsQuote any message. React with any emoji.
👋 Mentions, typing, presence, read receiptsAll the modern niceties.
🛡️ Admin dashboardLive metrics, kick/ban, broadcast, settings.
🌗 Light & dark themesPolished, mobile-friendly UI.
🔁 Auto-reconnectSurvives sleep, Wi-Fi roams, network blips.
🚫 No telemetryNot a single outbound request.

60-second quick start

  1. Download LocalChat.exe from the latest release.
  2. Double-click. A tray icon appears; the host's browser opens automatically.
  3. Allow it through Windows Firewall (Private network is enough).
  4. Read the LAN URL from the tray tooltip — e.g. https://192.168.1.42:5000 — and share it with anyone on the same Wi-Fi.
  5. They open the URL, pick a name, and start chatting. No install, no signup.

💡 The first visit shows a browser warning because the cert is self-signed. Click Advanced → Proceed. To replace it with a real cert, see app/scripts/.

Admin dashboard

Admin dashboard

Tray → Open admin dashboard opens the dashboard with the auto-generated admin token pre-filled. From there:

  • See live metrics (users, messages, uploads, uptime).
  • Kick or ban users.
  • Broadcast announcements to #general.
  • View and delete channels and uploaded files.
  • Change settings (port, max upload, history cap, autostart on boot, allow LAN admin access).

The admin API is localhost-only by default and gated by a per-install token.

Where your data lives

On first launch LocalChat opens a tiny browser page asking where to keep its data. Pick any folder you like (the default is C:\LocalChat on Windows). The chosen path is remembered in %APPDATA%\LocalChat\config.json (or ~/.config/localchat/config.json on Linux/macOS), so the exe can be moved, replaced, or upgraded without losing your data — and without asking again.

Inside the chosen folder you'll find:

  • localchat.db — single SQLite file holding users, channels, messages, reactions, read receipts, bans, and the per-database server_id.
  • uploads/ — raw uploaded blobs (atomic writes, sha-prefixed names).
  • tls/ — self-signed certificate + key (or your Let's Encrypt cert).
  • logs/localchat.log — rolling app log.
  • config.json — server settings, banlist, admin token.

Want a clean slate? Stop the app, delete the data folder (and the AppData config if you want to be re-prompted), restart.

Override the data folder for a single launch with LOCALCHAT_HOME=D:\path\to\folder.

Building from source

cd app
cargo run --release # tray + browser auto-open
cargo build --release --features tray # produces target/release/localchat.exe

CI publishes a single LocalChat.exe when you push a tag (git tag v2.0.0 && git push origin v2.0.0).

🛠️ Hacking on the internals? See DESIGN.md for the full architecture — concurrency model, persistence layout, E2EE protocol, wire spec, and a file-by-file map of the codebase.

Roadmap

  • macOS & Linux tray builds
  • Mobile-native client (LAN-only, serverless)
  • Group voice/video rooms
  • Slash commands & bots
  • Per-channel notification preferences
  • Searchable history

PRs welcome.

License

MIT — do anything you want; attribution appreciated.


Built with Rust 🦀 because boring infrastructure should be fast and tiny.

About

Private, zero-install LAN team chat. One ~5 MB Rust binary — no accounts, no cloud, no telemetry. Channels, replies, reactions, file sharing, voice/video calls, and end-to-end encrypted DMs. Double-click to run; share the LAN URL.

Resources

Code of conduct

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

LocalChat

A private, zero-install team chat that runs on your own Wi-Fi.

One ~5 MB binary. No accounts. No cloud. No telemetry. Double-click. Share the LAN URL. Done.

BuildReleaseLicense: MITPlatform: Windows

LocalChat — chat UI


Why LocalChat?

Slack and Teams need internet, accounts, and SaaS pricing. IRC needs a server admin and config files. Discord owns your data.

LocalChat is the missing fourth option for offices, classrooms, hackathons, homelabs, secure facilities, factory floors, ships, planes, and anywhere else people share a network but not necessarily the internet:

  • One binary, no install. Drop LocalChat.exe on a desktop. Double-click. That's the whole setup.
  • Air-gapped friendly. Zero outbound traffic. Works on a router with no WAN.
  • No accounts. Pick a name, you're in. Identity is bound to a per-browser key so usernames can't be impersonated.
  • End-to-end encrypted DMs. The host process literally cannot read direct messages.
  • Persistent. Channels, members, message history, reactions and uploads survive restarts.
  • Tiny. ~5 MB on disk, ~5 MB RAM at 200 users / 50 channels.

Features

💬 ChannelsPublic, private, lobby. Create, invite, join, leave.
🔐 1:1 DMsTrue end-to-end encryption.
📞 Voice & video callsDirect peer-to-peer between users.
📎 File sharingDrag & drop, image previews, lightbox.
↩️ Replies & reactionsQuote any message. React with any emoji.
👋 Mentions, typing, presence, read receiptsAll the modern niceties.
🛡️ Admin dashboardLive metrics, kick/ban, broadcast, settings.
🌗 Light & dark themesPolished, mobile-friendly UI.
🔁 Auto-reconnectSurvives sleep, Wi-Fi roams, network blips.
🚫 No telemetryNot a single outbound request.

60-second quick start

  1. Download LocalChat.exe from the latest release.
  2. Double-click. A tray icon appears; the host's browser opens automatically.
  3. Allow it through Windows Firewall (Private network is enough).
  4. Read the LAN URL from the tray tooltip — e.g. https://192.168.1.42:5000 — and share it with anyone on the same Wi-Fi.
  5. They open the URL, pick a name, and start chatting. No install, no signup.

💡 The first visit shows a browser warning because the cert is self-signed. Click Advanced → Proceed. To replace it with a real cert, see app/scripts/.

Admin dashboard

Admin dashboard

Tray → Open admin dashboard opens the dashboard with the auto-generated admin token pre-filled. From there:

  • See live metrics (users, messages, uploads, uptime).
  • Kick or ban users.
  • Broadcast announcements to #general.
  • View and delete channels and uploaded files.
  • Change settings (port, max upload, history cap, autostart on boot, allow LAN admin access).

The admin API is localhost-only by default and gated by a per-install token.

Where your data lives

On first launch LocalChat opens a tiny browser page asking where to keep its data. Pick any folder you like (the default is C:\LocalChat on Windows). The chosen path is remembered in %APPDATA%\LocalChat\config.json (or ~/.config/localchat/config.json on Linux/macOS), so the exe can be moved, replaced, or upgraded without losing your data — and without asking again.

Inside the chosen folder you'll find:

  • localchat.db — single SQLite file holding users, channels, messages, reactions, read receipts, bans, and the per-database server_id.
  • uploads/ — raw uploaded blobs (atomic writes, sha-prefixed names).
  • tls/ — self-signed certificate + key (or your Let's Encrypt cert).
  • logs/localchat.log — rolling app log.
  • config.json — server settings, banlist, admin token.

Want a clean slate? Stop the app, delete the data folder (and the AppData config if you want to be re-prompted), restart.

Override the data folder for a single launch with LOCALCHAT_HOME=D:\path\to\folder.

Building from source

cd app
cargo run --release # tray + browser auto-open
cargo build --release --features tray # produces target/release/localchat.exe

CI publishes a single LocalChat.exe when you push a tag (git tag v2.0.0 && git push origin v2.0.0).

🛠️ Hacking on the internals? See DESIGN.md for the full architecture — concurrency model, persistence layout, E2EE protocol, wire spec, and a file-by-file map of the codebase.

Roadmap

  • macOS & Linux tray builds
  • Mobile-native client (LAN-only, serverless)
  • Group voice/video rooms
  • Slash commands & bots
  • Per-channel notification preferences
  • Searchable history

PRs welcome.

License

MIT — do anything you want; attribution appreciated.


Built with Rust 🦀 because boring infrastructure should be fast and tiny.

About

Private, zero-install LAN team chat. One ~5 MB Rust binary — no accounts, no cloud, no telemetry. Channels, replies, reactions, file sharing, voice/video calls, and end-to-end encrypted DMs. Double-click to run; share the LAN URL.

Resources

Code of conduct

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

LocalChat

A private, zero-install team chat that runs on your own Wi-Fi.

One ~5 MB binary. No accounts. No cloud. No telemetry. Double-click. Share the LAN URL. Done.

BuildReleaseLicense: MITPlatform: Windows

LocalChat — chat UI


Why LocalChat?

Slack and Teams need internet, accounts, and SaaS pricing. IRC needs a server admin and config files. Discord owns your data.

LocalChat is the missing fourth option for offices, classrooms, hackathons, homelabs, secure facilities, factory floors, ships, planes, and anywhere else people share a network but not necessarily the internet:

  • One binary, no install. Drop LocalChat.exe on a desktop. Double-click. That's the whole setup.
  • Air-gapped friendly. Zero outbound traffic. Works on a router with no WAN.
  • No accounts. Pick a name, you're in. Identity is bound to a per-browser key so usernames can't be impersonated.
  • End-to-end encrypted DMs. The host process literally cannot read direct messages.
  • Persistent. Channels, members, message history, reactions and uploads survive restarts.
  • Tiny. ~5 MB on disk, ~5 MB RAM at 200 users / 50 channels.

Features

💬 ChannelsPublic, private, lobby. Create, invite, join, leave.
🔐 1:1 DMsTrue end-to-end encryption.
📞 Voice & video callsDirect peer-to-peer between users.
📎 File sharingDrag & drop, image previews, lightbox.
↩️ Replies & reactionsQuote any message. React with any emoji.
👋 Mentions, typing, presence, read receiptsAll the modern niceties.
🛡️ Admin dashboardLive metrics, kick/ban, broadcast, settings.
🌗 Light & dark themesPolished, mobile-friendly UI.
🔁 Auto-reconnectSurvives sleep, Wi-Fi roams, network blips.
🚫 No telemetryNot a single outbound request.

60-second quick start

  1. Download LocalChat.exe from the latest release.
  2. Double-click. A tray icon appears; the host's browser opens automatically.
  3. Allow it through Windows Firewall (Private network is enough).
  4. Read the LAN URL from the tray tooltip — e.g. https://192.168.1.42:5000 — and share it with anyone on the same Wi-Fi.
  5. They open the URL, pick a name, and start chatting. No install, no signup.

💡 The first visit shows a browser warning because the cert is self-signed. Click Advanced → Proceed. To replace it with a real cert, see app/scripts/.

Admin dashboard

Admin dashboard

Tray → Open admin dashboard opens the dashboard with the auto-generated admin token pre-filled. From there:

  • See live metrics (users, messages, uploads, uptime).
  • Kick or ban users.
  • Broadcast announcements to #general.
  • View and delete channels and uploaded files.
  • Change settings (port, max upload, history cap, autostart on boot, allow LAN admin access).

The admin API is localhost-only by default and gated by a per-install token.

Where your data lives

On first launch LocalChat opens a tiny browser page asking where to keep its data. Pick any folder you like (the default is C:\LocalChat on Windows). The chosen path is remembered in %APPDATA%\LocalChat\config.json (or ~/.config/localchat/config.json on Linux/macOS), so the exe can be moved, replaced, or upgraded without losing your data — and without asking again.

Inside the chosen folder you'll find:

  • localchat.db — single SQLite file holding users, channels, messages, reactions, read receipts, bans, and the per-database server_id.
  • uploads/ — raw uploaded blobs (atomic writes, sha-prefixed names).
  • tls/ — self-signed certificate + key (or your Let's Encrypt cert).
  • logs/localchat.log — rolling app log.
  • config.json — server settings, banlist, admin token.

Want a clean slate? Stop the app, delete the data folder (and the AppData config if you want to be re-prompted), restart.

Override the data folder for a single launch with LOCALCHAT_HOME=D:\path\to\folder.

Building from source

cd app
cargo run --release # tray + browser auto-open
cargo build --release --features tray # produces target/release/localchat.exe

CI publishes a single LocalChat.exe when you push a tag (git tag v2.0.0 && git push origin v2.0.0).

🛠️ Hacking on the internals? See DESIGN.md for the full architecture — concurrency model, persistence layout, E2EE protocol, wire spec, and a file-by-file map of the codebase.

Roadmap

  • macOS & Linux tray builds
  • Mobile-native client (LAN-only, serverless)
  • Group voice/video rooms
  • Slash commands & bots
  • Per-channel notification preferences
  • Searchable history

PRs welcome.

License

MIT — do anything you want; attribution appreciated.


Built with Rust 🦀 because boring infrastructure should be fast and tiny.

About

Private, zero-install LAN team chat. One ~5 MB Rust binary — no accounts, no cloud, no telemetry. Channels, replies, reactions, file sharing, voice/video calls, and end-to-end encrypted DMs. Double-click to run; share the LAN URL.

Resources

Code of conduct

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

LocalChat

A private, zero-install team chat that runs on your own Wi-Fi.

One ~5 MB binary. No accounts. No cloud. No telemetry. Double-click. Share the LAN URL. Done.

BuildReleaseLicense: MITPlatform: Windows

LocalChat — chat UI


Why LocalChat?

Slack and Teams need internet, accounts, and SaaS pricing. IRC needs a server admin and config files. Discord owns your data.

LocalChat is the missing fourth option for offices, classrooms, hackathons, homelabs, secure facilities, factory floors, ships, planes, and anywhere else people share a network but not necessarily the internet:

  • One binary, no install. Drop LocalChat.exe on a desktop. Double-click. That's the whole setup.
  • Air-gapped friendly. Zero outbound traffic. Works on a router with no WAN.
  • No accounts. Pick a name, you're in. Identity is bound to a per-browser key so usernames can't be impersonated.
  • End-to-end encrypted DMs. The host process literally cannot read direct messages.
  • Persistent. Channels, members, message history, reactions and uploads survive restarts.
  • Tiny. ~5 MB on disk, ~5 MB RAM at 200 users / 50 channels.

Features

💬 ChannelsPublic, private, lobby. Create, invite, join, leave.
🔐 1:1 DMsTrue end-to-end encryption.
📞 Voice & video callsDirect peer-to-peer between users.
📎 File sharingDrag & drop, image previews, lightbox.
↩️ Replies & reactionsQuote any message. React with any emoji.
👋 Mentions, typing, presence, read receiptsAll the modern niceties.
🛡️ Admin dashboardLive metrics, kick/ban, broadcast, settings.
🌗 Light & dark themesPolished, mobile-friendly UI.
🔁 Auto-reconnectSurvives sleep, Wi-Fi roams, network blips.
🚫 No telemetryNot a single outbound request.

60-second quick start

  1. Download LocalChat.exe from the latest release.
  2. Double-click. A tray icon appears; the host's browser opens automatically.
  3. Allow it through Windows Firewall (Private network is enough).
  4. Read the LAN URL from the tray tooltip — e.g. https://192.168.1.42:5000 — and share it with anyone on the same Wi-Fi.
  5. They open the URL, pick a name, and start chatting. No install, no signup.

💡 The first visit shows a browser warning because the cert is self-signed. Click Advanced → Proceed. To replace it with a real cert, see app/scripts/.

Admin dashboard

Admin dashboard

Tray → Open admin dashboard opens the dashboard with the auto-generated admin token pre-filled. From there:

  • See live metrics (users, messages, uploads, uptime).
  • Kick or ban users.
  • Broadcast announcements to #general.
  • View and delete channels and uploaded files.
  • Change settings (port, max upload, history cap, autostart on boot, allow LAN admin access).

The admin API is localhost-only by default and gated by a per-install token.

Where your data lives

On first launch LocalChat opens a tiny browser page asking where to keep its data. Pick any folder you like (the default is C:\LocalChat on Windows). The chosen path is remembered in %APPDATA%\LocalChat\config.json (or ~/.config/localchat/config.json on Linux/macOS), so the exe can be moved, replaced, or upgraded without losing your data — and without asking again.

Inside the chosen folder you'll find:

  • localchat.db — single SQLite file holding users, channels, messages, reactions, read receipts, bans, and the per-database server_id.
  • uploads/ — raw uploaded blobs (atomic writes, sha-prefixed names).
  • tls/ — self-signed certificate + key (or your Let's Encrypt cert).
  • logs/localchat.log — rolling app log.
  • config.json — server settings, banlist, admin token.

Want a clean slate? Stop the app, delete the data folder (and the AppData config if you want to be re-prompted), restart.

Override the data folder for a single launch with LOCALCHAT_HOME=D:\path\to\folder.

Building from source

cd app
cargo run --release # tray + browser auto-open
cargo build --release --features tray # produces target/release/localchat.exe

CI publishes a single LocalChat.exe when you push a tag (git tag v2.0.0 && git push origin v2.0.0).

🛠️ Hacking on the internals? See DESIGN.md for the full architecture — concurrency model, persistence layout, E2EE protocol, wire spec, and a file-by-file map of the codebase.

Roadmap

  • macOS & Linux tray builds
  • Mobile-native client (LAN-only, serverless)
  • Group voice/video rooms
  • Slash commands & bots
  • Per-channel notification preferences
  • Searchable history

PRs welcome.

License

MIT — do anything you want; attribution appreciated.


Built with Rust 🦀 because boring infrastructure should be fast and tiny.

About

Private, zero-install LAN team chat. One ~5 MB Rust binary — no accounts, no cloud, no telemetry. Channels, replies, reactions, file sharing, voice/video calls, and end-to-end encrypted DMs. Double-click to run; share the LAN URL.

Resources

Code of conduct

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages