Mastodon is a Ruby on Rails application with a React.js front-end. It follows standard practices of those frameworks, so if you are already familiar with Rails or React.js, you will not find any surprises here.
The best way of working with Mastodon in a development environment is installing all the dependencies on your system, rather than using Docker or Vagrant. You need Ruby, Node.js, PostgreSQL and Redis, which is a pretty standard set of dependencies for Rails applications.
An “environment” is a set of configuration values intended for a specific use case. Some environments could be: development, in which you intend to change the code; test, in which you intend to run the automated test suite; staging, which is meant to preview the code to end-users; and production, which is intended to face end-users. Mastodon comes with configurations for development, test and production.
The default value of
development, so you don’t need to set anything extra to run Mastodon in development mode. In fact, all of Mastodon’s configuration has correct defaults for the development environment, so you do not need an
.env file unless you need to customize something. Here are some of the different behaviours between the development environment and the production environment:
- Ruby code reloads itself when you change it, which means you don’t need to restart the Rails server process to see changes
- All errors you encounter show stack traces in the browser, rather than being hidden behind a generic error page
- Webpack runs continuously and re-compiles JS and CSS assets when you change any of the front-end files, and the pages automatically reload
- Caching is disabled by default
- An admin account with the e-mail
[email protected]:3000and password
mastodonadminis created automatically during
It should be noted that the Docker configuration distributed with Mastodon is optimized for the production environment, and so is an extremely bad fit for development. The Vagrant configuration, on the other hand, is meant specifically for development and not production use.
Run following commands in the project directory
In the development environment, Mastodon will use PostgreSQL as the currently signed-in Linux user using the
ident method, which usually works out of the box. The one command you need to run is
rails db:setup which will create the databases
mastodon_test, load the schema into them, and then create seed data defined in
mastodon_development. The only seed data is an admin account with the credentials
[email protected]:3000 /
Please keep in mind, by default Mastodon will run on port 3000. If you configure a different port for it, the generated admin account will use that number.
There are multiple processes that need to be run for the full set of Mastodon’s functionality, although they can be selectively omitted. To run all of them with just one command, you can install Foreman with
gem install foreman --no-document and then use:
In the Mastodon directory. This will start processes defined in
Procfile.dev, which will give you: A Rails server, a Webpack server, a streaming API server, and Sidekiq. Of course, you can run any of those things stand-alone depending on your needs.
||Run the Ruby test suite|
||Check the Ruby code for conformance with our code style|
Most notable libraries used
Knowledge and understanding of these libraries will simplify work with the Mastodon code.
haml, a templating language
devise, for authentication
doorkeeper, for acting as an OAuth 2 provider
paperclip, for file uploads and attachments
sidekiq, for background processing
immutable, for immutable data structures
react, for rendering the dynamic web application
react-redux, for managing React state
react-router-dom, for navigation within React
react-intl, for localizations within React
The following overview should not be seen as complete or authoritative, but as a rough guidance to help you find your way in the application.
||Code that binds business logic to templates|
||Code that can be used from views, i.e. common operations|
||Code that doesn’t fit in the other categories|
||Code that represents data entities|
||Code that generates JSON from models|
||Complex logical operations involving multiple models|
||Templates for generating HTML or other output|
||Code that executes outside the request-response cycle|
||Automated test suite|
||Code for the multi-column React.js application|
||Code for non-React.js pages|
CSS and other assets
||Code that turns into CSS via Sass|
||Server-side localizations in the YML format|
||Client-side localizations in the JSON format|
All locale files are normalized to ensure consistent formatting and key order, which minimizes changesets in version control.
||Normalize server-side translations|
||Normalize client-side translations|
Last updated September 17, 2019 · Improve this page