Fast, neat discord TUI written in Crystal


  • v0.3.0 - March 20, 2019
  • v0.2.1 - March 20, 2019
  • v0.2.0 - March 16, 2019
  • v0.1.0 - March 13, 2019


crcophony /kəˈkɒf(ə)ni/

read: cacophony

release badge

A simple Discord terminal ui written in Crystal.


Self-bots are not allowed by Discord's Terms of Service. Using crcophony could technically count as using a self-bot. Use this project at your own risk, it isn't my fault if it gets you banned.

That being said, I'm trying my best to ensure the application is as safe as possible. You cannot do anything in crcophony that you can't do in the normal Discord client (in fact, there are things you can do in the Discord client that you can't do in crcophony) so it should be okay.

Bottom line: Use at your own risk



  • Ctrl+C: Quit Application
  • Enter: Send Message
  • Ctrl+W: Scroll Up
  • Ctrl+S: Scroll Down

Channel Switching

  • Ctrl+K: Open / Close Channel Selection Menu
  • Enter: Select Channel
  • Ctrl+W: Scroll Selection Up
  • Ctrl+S: Scroll Selection Down
  • ESC: Alternative Close Button

If you can think of stuff I am missing, open an issue c:


Using pre-built binary

Since the 0.1.0 release I have been including a static binary attached to releases. Here are instructions for running the application using these binaries;

  1. Go to the latest release and download the binary.
  2. Follow the steps in Gathering Data to set up your environment.
  3. Run ./crcophony from the directory you downloaded the binary to and it should run.

If the pre-built binary doesn't work, open an issue with as much information as possible (from log files and application error trace and such) and then maybe also try installing from source!

From source

If the pre-built binary didn't work for you, or you want to install from source by choice, here are the instructions;

  1. Install Crystal
  2. Install termbox following the instructions in their README.
  3. Clone this repo.
  4. Run shards install to install requirements.
  5. Follow the steps in Gathering Data to set up your environment.
  6. Run shards build to build the system, or use shards build --release to build with optimisations (slower build but potential speedups over non release mode).
  7. Run bin/crcophony to open the application.

Gathering Data

To use the system, you must gather the following information and export the data as environment variables. These variables are as follows;

  • CRCOPHONY_TOKEN: Your user token used to authenticate yourself with the client
  • CRCOPHONY_USER_ID: Your user id (might not be necessary, requires investigation and could be removed at a later point)

Here are the instructions for you to get these bits of data;

  1. Turn on Developer Mode
  2. To get the user_id, right click on your own name in the Users sidebar of any channel and click "Copy ID". This is the value you should put in as the user_id
  3. Follow this guide to get your token.

If you use the fish or bash shells, a sample .env file has been included in this project ( and env.sample.bash respectively). Simply rename the appropriate file to .env, populate the strings inside with your gathered data and run source .env in the directory to get the correct environment variables created.


  1. Fork it (
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request


  • freyamade - creator, maintainer


One stop shop for the updates made to the project with each version, and to check master's status against the latest release


  • Removed duplicate colour names so all 256 colours are available (requires shards update)
  • Now renders the timestamp at the right hand side of the screen, similar to some shell themes
  • Colour the title of embeds based on the colour that they are in the normal client

0.3.0 - Latest Release

  • Usernames now have colours
    • Powered by 256 colour terminals. No idea what will happen if you run the system on a system with less colours.


  • Fixed rendering issue regarding embeds with multi line descriptions
  • Fixed major issue regarding the application taking a lot of CPU usage to just run idly


  • Fixed issue with parts of messages being removed during the text wrapping process
  • Fixed bug that caused channel names to appear twice in the switcher with no search, when your previous channel also has notifications
  • Slightly improved channel searching algorithm
    • Searcher currently only searches through channel names, doesn't include server names to avoid issues
    • Uses an improved algorithm that scores channel names instead of using basic levenshtein ratios
  • Handling of attachments
    • Attachments are now displayed as links below the message body
  • Handling of embeds
    • Embeds are now rendered in text form below the message body, and below any attachments


  • Currently this application only supports server channels. DMs and Group Chats will come later.
  • Mentions are parsed back into usernames, and any mention of the connected user will show up in yellow.
  • Loading channel history when a channel is changed to (this can and will be improved).
  • Long messages are wrapped.
  • Unread messages are kept track of per channel, and a total number can be found at the top right corner.
  • Channel Switching that behaves somewhat similarly to Discord's client
    • Without providing search text, it will display the previously visited channel and channels that have notifications
    • Typing search text will filter channels based on Levenshtein ratios
      • The algorithm could be improved somewhat however
Github statistic:
  • 5
  • 0
  • 1
  • 0
  • about 5 hours ago


MIT License