Telodendria

Telodendria: The terminal branches of an axon.

Note: Telodendria is under heavy development. Please see the Project Status.

Telodendria is a Matrix homeserver implementation written from scratch in ANSI C. It is designed to be lightweight and simple, yet functional. Telodendria differentiates itself from other Matrix homeserver implementations because it:

Telodendria is on Matrix! Check out the official Matrix rooms:

Room Description
#telodendria-releases:bancino.net Get notified of new releases.
#telodendria-general:bancino.net General discussion and support for Telodendria.
#telodendria-issues:bancino.net Report issues with Telodendria.
#telodendria-patches:bancino.net Submit code patches to the Telodendria project.

Table of Contents

Download

Telodendria is distributed as source tarballs, in true Unix fashion. If you want, you can verify the checksum of your download, and check the signature. To check the signature, you'll need signify, and the signify public key: telodendria-signify.pub.

If your operating system has an official package or port of Telodendria, you should prefer to use that instead of manually downloading the source and building it. If your operating system's package or port is too out of date for your tastes, please contact the package's maintainers to notify them, or offer to update the package yourself.

Version Download Checksum Signature
No downloads here yet. See the Project Status for more information.

You can check out the change log here.

Building The Source

Telodendria is designed to be light enough that it can be built from source on just about any operating system. It only has the following requirements, all of which should be already available to you on a sufficiently complete operating system:

$ . tools/env.sh $ td build

If everything went well, that will produce build/telodendria, which you can then place wherever you want, and run as a system daemon. See the contrib folder for configuration examples.

If you're going to be doing more than just building the code, see The Build Script for full documentation on what the td script can do.

Configure Telodendria

Telodendria is designed to be extremely configurable. As such, it has a fairly extensive configuration file. The configuration file is passed to the Telodendria binary with the -c option, and is typically called /etc/telodendria.conf. It uses OpenBSD-style syntax, and consists of the following options.

There are example configuration files in the contrib folder of every source tarball, and in the CVS repository.

Project Status

Telodendria is a very ambitious project. There's a lot that needs to happen yet before it is usable. At the moment, there's nothing that even remotely ressembles a Matrix homeserver here; I'm still getting off the ground and building a foundation.

But just because there's nothing here yet doesn't mean you should go away! I could always use help, so you are more than welcome to help out if you want things to go quicker. Please see the Contributing section for details on how you can get involved.

The Telodendria roadmap is organized into phases, with each phase representing a new milestone in the project's lifetime.

Phase 1: Getting Off The Ground

A new open-source project needs a few basic things before development can begin. This phase covers the pre-development stage of Telodendria.

Phase 2: Building A Foundation

Matrix homeservers require a few prerequisites. In this phase, we build up all the tools required to properly implement a Matrix homeserver. This includes basic data structures, exchange format parsers, and more. We also build up a command line application, multi-threaded HTTP server, and architect a flat-file database framework.

Phase 3: Welcome To Matrix

When the foundations are laid, we can start implementing a real Matrix homeserver. This phase tracks our current progress in implementing the Matrix specification.

Phase 4: A Real Homeserver

The Matrix specification is only a part of what it takes to be a production-ready Matrix homeserver. While the spec details how clients and homeservers interact with each other, we still need a way to administer our homeserver. This phase tracks our progress on getting Telodendria packaged, as well as writing some useful administrative tools. Only when these things are completed can we call Telodendria "production-ready."

Documentation Status

This documentation needs just a little work. Here's the things on my list for that:

Rationale

I want a lightweight Matrix homeserver designed specifically for OpenBSD and other Unix-like operating systems. I want a homeserver that can be developed and compiled with built-in tools. I want it to function entirely on a base OS install without having to install any extra packages whatsoever. I've found that as far as these goals are concerned, the existing homeserver implementations fall short. This project aims to prove that Matrix homeservers can be lightweight and written in such a way that very few, if any, third-party libraries need to be pulled in.

I also want to learn how Matrix works, and I want to understand the code I'm running on my server, which is why I'm writing every component from scratch, even the HTTP server.

Telodendria is written entirely in portable ANSI C. It depends on no third-party C libraries other than the standard POSIX C library. The only thing you need to run it is a reverse proxy with HTTPS support, such as relayd(8), and a directory that data can be written to. Everything Telodendria needs to run itself is compiled into a single static binary, and the source code can be built anywhere, right out of the box. This makes it suitable for running in a chroot(8) environment.

Telodendria doesn't use a database like all the other homeservers. Instead, it operates more like email: it uses a flat-file data structure similar to Maildir to store data. The advantage of this is that it saves server maintainers from also having to maintain a database. It greatly simplifies the process of getting a Matrix homeserver up and running, and it makes it highly portable. It also is extremely easy to back up and restore with base tools; just tar(1) up the directory, and you're good to go.

Telodendria is developed and tested on OpenBSD, but you'll find that it should just run on any POSIX operating system without modification.

Project Goals

The goals of this project are generally divided into user goals, and developer goals, depending on who they impact the most. This isn't an exhaustive list, but it is a list of things that I want to prioritize, because other server implementations lack them.

The user goals are as follows:

The developer goals are as follows:

Getting Support

Telodendria is designed to be fairly straightforward, but that doesn't mean there won't be hiccups along the way. If you are struggling to get Telodendria up and running, you're more than welcome to reach out for support. Just join the #telodendria-general:bancino.net Matrix channel. Before you do though, make sure you're running the latest version of Telodendria and you've thoroughly read through all the relevant documentation.

Contributing

Telodendria is an open source project. As such, it welcomes contributions. There are many ways you can contribute, and any way you can is greatly appreciated.

Reporting Issues

If—after you've reached out to #telodendria-general:bancino.net—it has been determined that there is a problem with Telodendria, it should be reported to #telodendria-issues:bancino.net. There it can be discussed further. The issues room serves as the official issue tracker of Telodendria; although severe issues may be copied into a TODO file in the CVS repository just so they don't get lost.

Developing

The primary language used to write Telodendria code is ANSI C. Other languages you'll find in the Telodendria repository are shell scripts and HTML. If you have any experience at all with any of these languages, your contributions are valuable. Please follow the guidelines in this section to ensure the contribution workflow goes as smoothly as possible.

Getting The Code

If you'd like to hack on Telodendria, you'll need the following tools in addition to the tools required to build the source:

Note that all of these tools are built into OpenBSD. While you of course don't have to use OpenBSD to develop Telodendria, it may make the process a little easier. In fact, these tools were chosen precisely because they were built into OpenBSD, the operating system I use.

You can download an official release tarball if you would really like, but the preferred way is to check out the source code from CVS. This makes generating patches a lot easier.

$ cvs -d anoncvs@bancino.net:/cvs checkout -P Telodendria $ cd Telodendria

If you already checkout out the code previously, make sure you update your local copy before you start developing:

$ cvs -q update -dP

You should now have the latest Telodendria source code. Follow the Code Style as you make your changes. If the cvs command fails with a Connection refused error message, then try setting the CVS_RSH environment variable to ssh, like this:

$ export CVS_RSH=ssh

Then run the checkout again. Some versions of CVS don't use SSH to checkout by default, so if yours doesn't, you might want to put that line in your .bashrc or other shell init script.

Code Style

In general, these are the conventions used by the code base. This guide may be slightly outdated or subject to change, however. The source code itself is the absolute source of truth, so as long as you make your code look like the code surrounding it, you should be fine.

As far as actually formatting the code goes, such as where to put brackets and whether you use tabs or spaces, use indent(1) to take care of all of that. The root of the repository has a .indent.pro file that should automatically be loaded by indent(1) to set the correct rules. If you don't have access to a working indent(1), just indicate in your patch that I should run indent(1) on the code after applying it. I'll likely run my indent(1) on the code anyway though, just to make sure the spacing is consistent, if nothing else.

The Build Script

Telodendria uses a custom build script called td, for Telodendria developer. The td script is not only a build script, however. It does all kinds of cool things like format the source code, and generate patch files. td is the only supported way to develop Telodendria.

I opted to write a custom build script instead of just using make, because I felt that there is really no way to make a truly portable Makefile that could do everything I need. I was doing a lot of research on the differences between the GNU and BSD versions of make, and I felt it just wasn't worth it when I could write a small POSIX script that would run on both GNU systems and BSD systems without a fuss.

The td script is fairly intuitive. It operates somewhat like make, in that it has recipes that you specify on the command line. To start using it, just run the following command in your Telodendria directory:

$ . tools/env.sh

Note: You will have to run the above command every time you start a new terminal session, as nothing is persisted to your system. I believe in non-invasive, fully self-contained tooling, so it is up to you to hook the Telodendria tools into your environment if you want them to persist.

If you're going to be submitting patches, you should also configure a .env file in the project directory root, which td will include automatically for you. For the best experience, you'll want at least these values:

MXID=@your:matrix-id.net DISPLAY_NAME="Your Display Name" EDITOR=gedit # Or whatever your preferred editor is.

If you don't provide these values, td will deduce them from your environment. It uses your system username and hostname to create the MXID, and reads the password database to get your configured display name. It also uses vi as the default editor, which may not be suitable for all developers.

You can invoke td recipes with the following syntax:

$ td <recipe> ...

Multiple recipes can be invoked in a single run of td. At the moment, recipes are run unconditionally; that is, even if parts of a recipe fail, all following recipes still run.

Here is a complete list of recipes currently supported by td, and a description of what they do. Some recipes can alter their behavior based on certain environment variables. Those variables are also documented here.

Any environment variables noted above that td recipes use can be specified in a .env file in the root of the Telodendria directory. This saves you from constantly having to set the environment variables in your shell, as well as from having to pollute your user environment with Telodendria variables. td will automatically include the .env file on every run.

td will source the .env file, which means it executes it like a shell script. Any shell code inside of .env will be executed every time td is run.

Submitting Patches

Telodendria aims at remaining as minimal as possible. This doesn't just mean minimal code, it also means a minimal development process, which is why Telodendria doesn't use GitHub, GitLab, or even SourceHut. Instead, the contribution workflow operates on submitting patch files to a public Matrix room, sort of like the OpenBSD project operates on patch files sent to a public mailing list.

If you're not used to manually creating and submitting patches instead of opening a "pull request," you should be pleased to hear that submitting patches is fairly easy to do if you've got the CVS sources checked out. In fact, I find it easier than having to make a GitHub account, forking a project repository, and then making a pull request for it. Once you have made your changes in your local copy of the code, and you've configured your environment using the instructions in The Build Script, just run the patch recipe:

$ td patch

This will automatically generate a patch file for all your changes, and then open it in your preferred editor. You can also generate a patch for only certain files and directories. To do that, set PATCHSET, like this:

# Only write a patch for README.txt and the files in site/ $ PATCHSET="README.txt site/" td patch

As you'll notice, the top of the patch file should have some email-style headers that look like this:

From: Jordan Bancino <@jordan:bancino.net> Date: Fri Jul 29 03:21:21 PM EDT 2022 Subject: Document Patch Procedure

As much information as possible should be filled out for you, such as the date. An attempt to fill out the From header was also made, but the information there can be made more accurate by setting MXID to your Matrix ID, and DISPLAY_NAME to your real name in your environment, or the .env file. The Subject should very briefly describe what the patch is about.

You'll also notice these lines:

[ ] I have read the Telodendria Project developer certificiate of origin, and certify that I have permission to submit this patch under the conditions specified in it.

This is a checkbox that tells me whether or not you actually have the rights to submit your patch, and that once you submit the patch, your code is bound by the Telodendria license. The full text of the developer certificate of origin is as follows:

  1. The contribution was created in whole or in part by me, and I have the right to submit it under the open source license of the Telodendria project; or
  2. The contribution is based upon a previous work that, to the best of my knowledge, is covered under an appropriate open-source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the Telodendria project license; or
  3. The contribution was provided directly to me by some other person who certified (1), (2), or (3), and I have not modified it.
  4. I understand and agree that this project and the contribution are public and that a record of the contribution—including all personal information I submit with it—is maintained indefinitely and may be redistributed consistent with this project or the open-source licenses involved.

After the headers, but before the checkbox, write a more thorough description of the patch and why it was created. Then, send the resulting patch file to #telodendria-patches:bancino.net, so it can be discussed and reviewed by the community.

Try to keep your patches on topic—make one patch file per feature or bug fix being implemented. It is okay if your patches depend on previous patches, just indicate that in the patch. Note that it may take a while for patches to be committed, and some patches may not be committed at all. In either case, all sent patches are queued from the Matrix room into the public patch directory, so they can be referenced easier in the future. If you want to reference a submitted patch in a Matrix message or email, it might be a good idea to link to it in the public patch directory.

The public patch directory works as follows: when you send your patch to the Matrix room, it is downloaded by the Telodendria Bot and placed in the ingress/ directory, named as the message ID. Then, it is assigned a Telodendria patch ID and copied to the p/ directory as just ${id}.patch. This is a permanent link that will always reference your patch. Then, your patch is symlinked to the queue/ directory. I have a script that automatically ingresses patches and queues them for me, and I'll use this to review patches. If your patch is accepted, the queue symlink will be moved to the accepted/ directory and the patch is committed to the official CVS repository. If you patch is rejected for some reason, its symlink will be moved to the rejected/ directory. Regardless of the state of your patch, it will always remain permalinked in the p/ directory, and when it is accepted or rejected, Telodendria Bot will send a message.

You're always welcome to inquire about rejected patches, and request they be reviewed again, or you can use them as a starting point for future patches.

License

All of the code for Telodendria is licensed under a modified MIT license. Please consult the src/header.txt file for the actual license text. The Telodendria license text differs from the MIT license in the following ways:

The documentation for Telodendria is also licensed under the modified MIT license that lives in src/header.txt. Whether you obtain the documentation by printing, or otherwise downloading this page, or by checking it out from the CVS source, it is licensed the same as the code.

The Telodendria logo, however, belongs solely to the Telodendria project. It must only be used to represent the official Telodendria project, and may only appear in official Telodendria media. If Telodendria is forked, the logo must be removed from the project and optionally replaced by a different one. The logo may not be modified in any way or for any purpose.

Contributors

Telodendria would not be possible without the support of the following people:

Change Log

At this time, Telodendria does not have any tagged releases because it is not yet functional as a Matrix homeserver. Please check out the Project Status to see where things are currently at.

Resources


© 2022 Jordan Bancino <@jordan:bancino.net>