Hummingbard is an experimental client for building decentralized communities on top of Matrix.

Hummingbard

Hummingbard is an experimental client for building decentralized communities on top of Matrix. See a live instance on hummingbard.com

What Works

  • Register local and federated users
  • Federated logins with existing Matrix accounts
  • Join local and federated spaces
  • Follow local and federated users
  • Generic post editor (markdown)
  • Quick posts, with images/attachments/links/youtube/etc
  • Blog posts with slug/metadata
  • Replies to posts
  • Sharing posts on profiles and across spaces
  • User feed
  • Public feed
  • Create local and federated spaces
  • Different space types - community, gallery
  • Customize spaces and user profiles with basic info, custom CSS
  • Deeply nested spaces (/music/jazz/fusion)

What Doesn't Work

  • Private spaces and user profiles
  • Embedded chat in spaces
  • Direct Messages
  • Registration flows

Dendrite

Hummingbard relies on these features that are currently only implemented in Dendrite, or expected to be implemented soon:

There is a temporary patch in our forked Dendrite for paginating threads. This should not be necessary once upstream Dendrite implements threads fully.

Install

To run Hummingbard, you'll need:

  • Dendrite fork configured and running
  • redis (for session storage)
  • postgres (for various non-Matrix storage)
  • goose for migrations

Steps:

  1. Clone the repo
  2. Copy config-sample.toml to config.toml, update with DB config etc.
  3. Run make
  4. Run migrations in db/migrations
  5. Run npm run build in /ui/js
  6. Pull a JSON dump for large matrix rooms with curl 'https://matrix-client.matrix.org:443/_matrix/client/r0/publicRooms?limit=500' > bigrooms.json (we avoid large rooms to help Dendrite not consume too much resources)
  7. Run the binary ./bin/hummingbard

You may want to:

  1. Put Hummingbard behind Nginx
  2. Server static files via Nginx
  3. Use a systemd unit if appropriate

License

The code is currenly licensed under AGPLv3. I may choose a more permissive license in the future.

Comments
  • handle users trying to create spaces with uppercase characters

    handle users trying to create spaces with uppercase characters

    It seems that you're currently allowed to attempt to create spaces containing uppercase characters.

    When the space is created, you're redirected to a url to that space containing the uppercase characters, and you get a 404.

  • [hard problem] How to do Anonymous voting in a privacy-respecting and decentralised manner, while still allowing mutability, but not allowing excessive spam?

    [hard problem] How to do Anonymous voting in a privacy-respecting and decentralised manner, while still allowing mutability, but not allowing excessive spam?

    This one is inspired from reddit; Upvotes/Downvotes and "Karma".

    On matrix, this is hard, because you need to have each event be associated to their corresponding user and server, and so any "vote" (be it an upvote or a downvote) is associated with a user.

    However, when you have anonymity coupled with the voting, something strange can happen where an "invisible hivemind", who does not wish to be exposed to harassment or be identified, can vote on a certain article/comment, and (to some degree) exert a "wisdom of the crowd" onto a certain subject or opinion.

    However, this anonymity and universal access comes with one problem; spam, and/or "botting" the vote, to influence the upvote/downvote ratio with a horde of automated requests.

    Reddit handles this by centralising access to the upvote/downvote mechanism, and anonymising the public aggregate to number and ratio. It applies some clever algorithm behind the scenes to detect popularity, and fixes a position on the "front page" with that "velocity".

    The problems with HummingBard, then, are the following;

    1. How can you anonymize voters?
    2. How can you allow voters to retract or alter their vote after casting it?
    3. How can you aggregate this in an efficient manner, while keeping anonymity?
    4. How can you be spam-resistant in this system? (resistant, not invincible, as i think this will become a tradeoff and a compromise)
    5. Is it possible to make easy calculations for how popular or how "active" a post is, in this manner?
  • [hard problem] How to do

    [hard problem] How to do "Repeats" (reblogs/retweets) in a federated, distributed, quick, and resilient fashion?

    (Note: not "repost", "reposting" is the act of taking a post and copying it wholesale into a new one, basically plagiarising the original post if it is original content such as Art or Literature)

    One thing that turned out to be a Hard Problem across HummingBard is the notion of "reblogging"/"retweeting"/"boosting", or here, called "repeating" (like a classic telecommunications Repeater).

    The specific part where this becomes a hard problem to solve is when events need to be referenced outside of their respective rooms, somehow.

    Lets say that feed X creates post Alpha (A), this post is liked and replied to in its own manner, now lets say that feed Y, possibly over federation, wants to "repeat" post Alpha. This "repeated" post will be referenced with A'.

    How would this be accomplished in a manner that allows the other feed to view post A''s edits, comments, reactions, and other things, while also allowing tumblr-style "chaining" (or quoting, from the twitter world) of these posts?

    Lets say a "chained" post is called post Beta, B, this post has an internal reference to Alpha, so it is B{A'} (if i can continue to use this pseudo-algebra for a second).

    In twitter semantics, quote-tweets, this is just a "soft link", with the original post being able to be deleted, and the "quote" showing that the original tweet was deleted.

    In tumblr semantics, reblogs, this is a "hard link", with the original post being able to be deleted, but it's contents "carrying on" with each subsequent reblog. (this also had some internal security issues, where the contents of this reblogged post could be edited by clients before sending to the server)

    So there are three questions;

    1. What kind of linking would we want for HB? I mean the difference between such "hard linking" and "soft linking". (I'm personally leaning towards hard linking, because that allows some social dynamics that tumblr was able to capture very well.) Maybe we could have the user be able to choose this for themselves? "Sub-post" vs "quote".
    2. How can we make this efficient? If you have a hard-linked (or even soft-linked with transient visibility of each sub-linked post) post with many edits, reactions, or other "relations" to each individual post in the "chain", how to you efficiently fetch and/or store this?
    3. How can this be resilient? Matrix rooms are self-contained, if any server fails, that means that as long as you have your local copy of it, and have a local user in the room, you can have legitimate access to that post. This is not the case when event references cross rooms, because the dynamics of which server is joined in that room, or which server even has the event, changes with this. Then, how can you design a system that is able to preserve links between posts in a true manner, in a way that could update the reactions, comments, and other relations when able, and store efficiently and reliably when any one server, user, or post in that chain (when it's hard-linked) is deleted or not accessible anymore? (Think also about room upgrades, where an event is only accessible in a room with a previous version, and when every user moves on from that, it is hard to find, or even possibly insecure to access, or - when room versioning has gone this far - it is incompatible with the software of the current homeserver)
  • Joining a space requires retries

    Joining a space requires retries

    The 'Join @space' button joins a room (returns right json), refreshes the page, but it seems like the session doesn't update. Clicking join again seems to update the session.

  • Desktop client

    Desktop client

    Probably not part of any near-term plans, but might make for a good help-wanted task?

    Most obvious pick for early tests is probably https://github.com/nodegui/svelte-nodegui

    Later on Tauri might present an even better alternative, but it’s still a bit early: https://github.com/tauri-apps/tauri

Related tags
A Matrix-iMessage puppeting bridge

A Matrix-iMessage puppeting bridge. The bridge runs on a Mac or jailbroken iPhone (soon™). A websocket proxy is required to receive appservice events from the homeserver.

Jan 2, 2023
Bridge between mattermost, IRC, gitter, xmpp, slack, discord, telegram, rocketchat, twitch, ssh-chat, zulip, whatsapp, keybase, matrix, microsoft teams, nextcloud, mumble, vk and more with REST API
Bridge between mattermost, IRC, gitter, xmpp, slack, discord, telegram, rocketchat, twitch, ssh-chat, zulip, whatsapp, keybase, matrix, microsoft teams, nextcloud, mumble, vk and more with REST API

bridge between mattermost, IRC, gitter, xmpp, slack, discord, telegram, rocketchat, twitch, ssh-chat, zulip, whatsapp, keybase, matrix, microsoft teams, nextcloud, mumble, vk and more with REST API (mattermost not required!)

Jan 4, 2023
Notifies you about new matrix messages on your LaMetric Time

Matrix -> LaMetric Time bridge This small golang app notifies you about new messages on your LaMetric Time. This should be run on a Raspberry Pi or so

Sep 29, 2022
Decentralized VPN in golang
Decentralized VPN in golang

LCVPN - Light decentralized VPN in golang Originally this repo was just an answer on a question "how much time it'll take to write my own simple VPN i

Dec 28, 2022
Decentralized VPN
Decentralized VPN

Decentralized VPN The RadVPN doesn't need any central point as it connects to other nodes directly (full mesh) it has built-in router that helps packe

Jan 8, 2023
A decentralized P2P networking stack written in Go.

noise noise is an opinionated, easy-to-use P2P network stack for decentralized applications, and cryptographic protocols written in Go. noise is made

Dec 29, 2022
⛵ EdgeVPN: the immutable, decentralized, statically built VPN. NO central server!

⛵ EdgeVPN Fully Decentralized. Immutable. Portable. Easy to use Statically compiled VPN Usage Generate a config: ./edgevpn -g > config.yaml Run it on

Jan 3, 2023
Decentralized Chat ( 去中心化的聊天系统 )

dchat Introduce dchat (Decentralized Chat) 一款去中心化的聊天系统。 Features 轻量级 Unix指令交互 去中心化 断线重连 支持集群 分布式ID Start Install go get -u github.com/awesome-cmd/dcha

Jul 2, 2022
A modular is an opinionated, easy-to-use P2P network stack for decentralized applications written in Go.

xlibp2p xlibp2p is an opinionated, easy-to-use P2P network stack for decentralized applications written in Go. xlibp2p is made to be minimal, robust,

Nov 9, 2022
Node of the decentralized oracle network, bridging on and off-chain computation

Chainlink is middleware to simplify communication with blockchains. Here you'll find the Chainlink Golang node, currently in alpha. This initial imple

Dec 31, 2022
Renloi: a decentralized finance network for golang

Intro to Renloi A digital decentralized version of cash will allow extremely fas

Jun 9, 2022
USENET-inspired decentralized internet discussion system
USENET-inspired decentralized internet discussion system

===============================================================================

Jan 6, 2023
Xlibp2p: an opinionated, easy-to-use P2P network stack for decentralized applications written in Go

xlibp2p xlibp2p is an opinionated, easy-to-use P2P network stack for decentraliz

Nov 9, 2022
Steve - A peer-to-peer (p2p) decentralized network

Steve Steve is a peer-to-peer (p2p) decentralized network that enables people to

Feb 5, 2022
A cross-platform, decentralized, chat app based on SaltyIM for functionality and GioUI for UI

This project is shifted at https://git.mills.io/saltyim/app Salty UI A cross-platform, decentralized, chat app based on SaltyIM for functionality and

Aug 30, 2022
🚥 Yet another pinger: A high-performance ICMP ping implementation build on top of BPF technology.

yap Yet-Another-Pinger: A high-performance ICMP ping implementation build on top of BPF technology. yap uses the gopacket library to receive and handl

Nov 9, 2022
A Lightweight VPN Built on top of Libp2p for Truly Distributed Networks.
A Lightweight VPN Built on top of Libp2p for Truly Distributed Networks.

Hyprspace A Lightweight VPN Built on top of Libp2p for Truly Distributed Networks. demo.mp4 Table of Contents A Bit of Backstory Use Cases A Digital N

Dec 29, 2022
Walrus 🕑 Real-time event streaming platform built on top of gRPC streams
Walrus 🕑 Real-time event streaming platform built on top of gRPC streams

Walrus ?? Real-time event streaming platform built on top of gRPC streams Table of Contents About the project Built With How it works Getting Started

Sep 24, 2022
Dotcel - Domain name application built on top of celestia

dotcel dotcel is a blockchain built using Cosmos SDK and Tendermint and created

Feb 7, 2022