logo
Kurashizu Blogwhere ideas flow
  • Home
  • News
  • Blog
  • About
  • Home
  • News
  • Blog
  • About

© 2026 Kurashizu. All rights reserved.

Admin·New Post·Service Status
Powered by Cloudflare·30.10.26
← Back to news

Parley: Federated, decentralised chat that speaks plain IRC

Original article
git.mills.io|243 points|116 comments|by davidcollantes|Sep 28, 2026

Parley: Federated, Decentralised Chat that speaks plain IRC

Build Status Test Status Go Reference Docker Pulls License: MIT

Parley is a decentralized, federated communication system designed to be compatible with standard IRC. Instead of a central server, individuals or organizations host their own instances tied to their specific domains.

🌐 Core Architecture & Identity

Parley allows you to interact with the network using any traditional IRC client (such as irssi, WeeChat, or Textual) without needing additional plugins.

How it works:

  1. Discovery: Instances locate one another via DNS and "well-known" identity documents.
  2. Transport: Messages are signed and exchanged over HTTPS.
  3. Addressing: User identities follow an email-like format: user@domain.
User IdentityHosting DomainExample Command
alice@foo.comfoo.com/msg alice@foo.com hello
bob@bar.combar.com/msg bob@bar.com hi there

🛠 Technical Update: Refining Mention Notifications (#39)

A recent update addressed a bug where notifications were being pushed to too many users when multiple people shared the same nickname across different instances.

The Problem

Previously, the namesAccount function triggered a mention whenever a nickname appeared as a standalone word (since colons are treated as word boundaries).

Scenario: If bob exists on both foo.com and bar.com in the same room:

  • A message like bob:bar.com: lunch? sent from foo.com would notify both Bobs.
  • A simple bob: lunch? sent from bar.com would also notify the Bob on foo.com.

Because the raw text is federated exactly as typed, every instance containing a "bob" would trigger a push notification.

The Solution

The logic for identifying a mention has been updated to match how the sender actually perceives the user (R189):

  • Qualified Names: bob:bar.com (similar to bob@bar.com) always refers specifically to the Bob on bar.com.
  • Bare Nicks: A plain bob now only refers to the Bob on the sender's own instance. It only triggers a local account mention if the sender is also local.
  • Filtering: Strings like bar inside alice:bar.com are ignored.
  • Validation: Only domains belonging to the local instance or a known peer are considered valid.

Old Logic: Any "bob" = All Bobs notified →\rightarrow→ New Logic: Mention  ⟹  Specific Identity\text{Mention} \implies \text{Specific Identity}Mention⟹Specific Identity

This ensures that strings like bob:D or bob:10 still correctly resolve to "bob" while preventing cross-instance notification spam.

Implementation Details

  • The pushConsidered function now references s.peers under the existing s.mu lock.
  • Protocol Changes: Updated parley.bt with a NAMES [read-as-the-sender-was-shown-them] node under PUSH [considered] and updated docs/PROTOCOL.md.

✅ Verification & Testing

The following checks were performed to ensure stability:

  • make test passed successfully.
  • Race condition check (-race) passed.
  • Integration test TestOnlyTheBobThatWasMeantIsPushed passed 10 consecutive iterations.
  • bte check parley.bt returned 0 errors.
  • bte fmt confirmed no formatting changes needed.
  • demo/demo.sh (Skipped: Docker unavailable in current environment).

📈 Recent Project Activity

The project continues to evolve with various improvements across the stack:

ComponentChange Description
ChatImplemented rate limiting for accounts and refined the spec.
ConfigRemoved config files in favor of CLI flags, environment variables, and DB settings.
FeaturesAdded support for the +reply tag and the ability for users to edit their messages across all instances.
HomecloudAdded synchronization of household members into accounts.
WebCompletely rebuilt the interface using templ components.
SecurityEstablished a dedicated SECURITY.md for reporting vulnerabilities.

For more details, explore the source code or check the main branch.