Proprietary chat services suck. The Polyphony project aims to change that by developing @polyproto, a federated identity and trusted message exchange protocol, as well chat software and -standards built on top of it. We are building sonata (a polyproto home server for identity federation), symfonia (a chat server implementing polyproto-chat), and a client to tie it all together. Our goal is a federated chat experience that feels at least as polished and easy to use as proprietary alternatives.
Through the MPL-2.0 license, we ensure that our software can be used by anyone, for any(-ish) purpose. The only major thing we ask is that improvements and changes to our software stay open source as well. Our software should benefit the public, not corporations.
Additionally, our Code of Conduct is a modified version of the Contributor Covenant, explicitly including otherkin and plural individuals and explicitly banning AI contributions.
An anti-establishment establishment
🏳️⚧️ Trans rights are human rights. Be gay, do crime, free palestine!
A roadmap for the work scheduled for sonata, our polyproto-core home server. After the first release in December, we'd like to pivot most of our efforts onto building polyproto-chat with a server and a first, usable client. 💜
I think if we can make a chat app where when you use it you feel like you are listening to I Love My Computer by Ninajirachi then that would be an immense success.
A roadmap for the work scheduled for sonata, our polyproto-core home server. After the first release in December, we'd like to pivot most of our efforts onto building polyproto-chat with a server and a first, usable client. 💜
Today in sonata, basic logic for fetching and verifying actor ID-certs from peers was implemented. Required next steps are persisting these in the database and adding more checks for full polyproto spec compliance
Next up, proper loading/storing of actor certificates to/from the database, and resolving them from other servers! Then, we are 80% of the way there to finally supporting actor certificates as well :)
We also implemented JSON canonicalization in sonata today! Responses now get correctly canonicalized, and requests get checked for proper canonicalization on arrival.
"Incidental", because the mascot wasn't something I explicitly mentioned as part of the commission. The artist just included it, and it was love at first sight
Released polyproto-rs (polyproto SDK for Rust) v0.19.0! Lots of neat things are in it :3 You can read the full changelog here, but below, you can also find an explained, rough breakdown :
The HttpClient through which you usually make all API calls to servers, can now accept self-signed TLS certs when you explicitly tell it to. This was a required addition to continue working on sonata, our home server, because the IdP software (comparable to a database specifically for storing user accounts and passwords, so that we don't have to worry about this and potentially screw it up ourselves) we are using to test exclusively serves traffic in an encrypted manner, even on localhost.
On the cryptography side, the PublicKey trait gained a to_hex() method to quickly access a hex-encoded DER representation of any public key BitString, and we finally landed PURR-2026-0010, enforcing JSON canonicalization end-to-end (both when sending data and when checking what comes in, exactly as the spec wants). The ID-Cert's BasicConstraints also got some much needed love, with new functions validate() , is_valid_for_actor() , and is_valid_for_home_server() covering RFC 5280 well-formedness and polyproto’s own constraint rules, easily accessible and implemented right in the reference crate.
Last but not least, I got to delete a lot of code by delegating some ASN.1/DER (basically a special, ancient, programming language agnostic data representation/layouting language, used by X.509 certificates) I previously implemented myself to crates we already depended on, and provided reference-checked implementations of exactly these things for us the whole time. This also discovered, then promptly resolved a lot of tiny but mean bugs around this kind of parsing, that we seem to have had before