twtxtis a multi-user twtxt client in the form of a web app and api. It supports multiple users and also hosts user feeds directly and provides a familiar "social" experience with minimal user profiles.
It also supports "rich" text by utilising Markdown as well as multimedia such as photos, videos and even audio.
There is also a set of Mobile Apps available for both the App Store and Play Store.
There is also a publicly (free) available Pod available at:
NOTE: I, James Mills, run this first (of which I hope to be many)
Sponsor this project to support the development of new features, improving existings ones and fix bugs! Or contact Support for help with running your own Pod! Or host your own Twtxt feed and support our Extensions.
Goryon for Twt available for both the App Store and Play Store.
Install Goryon today on your mobile device here
This project offers fully-managed, 1-click instances of this platform we call Twt.social pods.
Please visit Twt.social to get your pod today!
As a first point, please try to use one of the pre-built binaries that are available on the Releases page.
We provide Homebrew formulae for macOS users for both the
command-line client (
twt) as well as the server (
brew tap jointwt/twtxt brew install twtxt
Run the server:
Run the command-line client:
Building from source
This is an option if you are familiar with Go development.
- Clone this repository (this is important)
git clone https://github.com/jointwt/twtxt.git
- Install required dependencies (this is important)
Note that in order to get the media upload functions to work, you need to
install ffmpeg and its associated
-dev packages. Consult your distribution's package
repository for availability and names.
- Build the binaries
- Login to your Twt.social pod:
$ ./twt login INFO Using config file: /Users/prologic/.twt.yaml Username:
- Viewing your timeline
$ ./twt timeline INFO Using config file: /Users/prologic/.twt.yaml > prologic (50 minutes ago) Hey @rosaelefanten 👋 Nice to see you have a Twtxt feed! Saw your [Tweet](https://twitter.com/koehr_in/status/1326914925348982784?s=20) (_or at least I assume it was yours?_). Never heard of `aria2c` till now! 🤣 TIL > dilbert (2 hours ago) Angry Techn Writers ‣ https://dilbert.com/strip/2020-11-14
- Making a Twt (post):
$ ./twt post INFO Using config file: /Users/prologic/.twt.yaml Testing `twt` the command-line client INFO posting twt... INFO post successful
Deploy with Docker Compose
Run the compose configuration:
docker-compose up -d
Then visit: http://localhost:8000/
NOTE: Registrations are disabled by default so hence the
-R flag above.
Then visit: http://localhost:8000/
You can configure other options by specifying them on the command-line:
$ ./twtd --help Usage of ./twtd: -E, --admin-email string default admin user email (default "firstname.lastname@example.org") -N, --admin-name string default admin user name (default "Administrator") -A, --admin-user string default admin user to use (default "admin") --api-session-time duration timeout for api tokens to expire (default 240h0m0s) --api-signing-key string secret to use for signing api tokens (default "PLEASE_CHANGE_ME!!!") -u, --base-url string base url to use (default "http://0.0.0.0:8000") -b, --bind string [int]:<port> to bind to (default "0.0.0.0:8000") --cookie-secret string cookie secret to use secure sessions (default "PLEASE_CHANGE_ME!!!") -d, --data string data directory (default "./data") -D, --debug enable debug logging --feed-sources strings external feed sources for discovery of other feeds (default [https://feeds.twtxt.net/we-are-feeds.txt,https://raw.githubusercontent.com/jointwt/we-are-twtxt/master/we-are-bots.txt,https://raw.githubusercontent.com/jointwt/we-are-twtxt/master/we-are-twtxt.txt]) --magiclink-secret string magiclink secret to use for password reset tokens (default "PLEASE_CHANGE_ME!!!") -F, --max-fetch-limit int maximum feed fetch limit in bytes (default 2097152) -L, --max-twt-length int maximum length of posts (default 288) -U, --max-upload-size int maximum upload size of media (default 16777216) -n, --name string set the pod's name (default "twtxt.net") -O, --open-profiles whether or not to have open user profiles -R, --open-registrations whether or not to have open user registgration --session-expiry duration timeout for sessions to expire (default 240h0m0s) --smtp-from string SMTP From to use for email sending (default "PLEASE_CHANGE_ME!!!") --smtp-host string SMTP Host to use for email sending (default "smtp.gmail.com") --smtp-pass string SMTP Pass to use for email sending (default "PLEASE_CHANGE_ME!!!") --smtp-port int SMTP Port to use for email sending (default 587) --smtp-user string SMTP User to use for email sending (default "PLEASE_CHANGE_ME!!!") -s, --store string store to use (default "bitcask://twtxt.db") -t, --theme string set the default theme (default "dark") -T, --twts-per-page int maximum twts per page to display (default 50) -v, --version display version information --whitelist-domain strings whitelist of external domains to permit for display of inline images (default [imgur\.com,giphy\.com,reactiongifs\.com,githubusercontent\.com]) pflag: help requested
Configuring your Pod
At a bare minimum you should set the following options:
-s bitcask:///path/to/data/twtxt.db(we will likely simplify/default this)
-Rto enable open registrations.
-Oto enable open profiles.
Most other configuration values should be done via environment variables.
It is recommended you pick an account you want to use to "administer" the pod with and set the following environment values:
In order to configure email settings for password recovery and the
/abuse endpoints, you should set appropriate
It is highly recommended you also set the following values to secure your Pod:
These values should be generated with a secure random number generator and
be of length
64 characters long. You can use the following shell snippet
to generate secrets for your pod for the above values:
$ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 64 | head -n 1
DO NOT publish or share these values. BE SURE to only set them as env vars.
You can deploy
twtxt to a Docker Swarm
cluster by utilising the provided
twtxt.yaml Docker Stack. This also depends on
and uses the Traefik ingress load balancer so you must
also have that configured and running in your cluster appropriately.
docker stack deploy -c twtxt.yml
In the News
- 07-12-2020: Console-30 from the Console weekly newslsetter on open-source proejcts.
- 30-11-2020: Reddit post on r/golang
Support the ongoing development of twtxt!
Interested in contributing to this project? You are welcome! Here are some ways you can contribute:
- File an Issue -- For a bug, or interesting idea you have for a new feature or just general questions.
- Submit a Pull-Request or two! We welcome all PR(s) that improve the project!
Please note: If you wish to contribute to this project off-Github please get in touch with us and let us know! We have this project mirrored to private Git hosting using Gitea and can fully support external collaborator this way (even via email!).
Thank you to all those that have contributed to this project, battle-tested it, used it in their own projects or products, fixed bugs, improved performance and even fix tiny typos in documentation! Thank you and keep contributing!
Stargazers over time
- rss2twtxt -- RSS/Atom to Twtxt aggregator.
- Twt.social -- Hosted platform for Twt.social pods like twtxt.net.
- Goryon -- Our Flutter iOS and Android Mobile App.
- we-are-twtxt -- A voluntary user contributed registry of users, bots and interesting feeds.
- jointwt.org -- Our JoinTwt.org landing page.
twtxt is licensed under the terms of the MIT License