Tutorial | Installing Focalboard

by allsparkinfinite on 2025-06-28

The tutorials are getting more and more niche.

Project Management

A project management app is basically a to-do list, with the ability to add labels to the tasks. Labels can also be used to assign team members to each task or set priorities.
The most popular project management app is probably Jira. You may have also heard of Trello. These are both proprietary, and popular open source alternatives are Wekan and OpenProject. Software forges like GitHub and GitLab also have built-in project management features.

Mattermost used to develop Focalboard, alongside its flagship product, also named Mattermost - a chat app for the workspace, similar to Discord, Slack, or MS Teams. They then opted to discontinue Focalboard and merge its features into their main product. However, since Focalboard was open source software, its source code is still available to download and host.

All The Fancy Terms

The Agile methodology is a set of principles of project management which is very popular in software development, although its principles are probably useful in any large team handling complicated projects.
Work is divided into recurring timeboxes called Sprints, usually two weeks long, and a set of tasks are scheduled for each sprint.
Kanban boards are a way of grouping tasks by their completion status ("To Do", "In Progress", "Done", etc.), with each group being shown as a column. You can drag and drop tasks from one column to another for that sweet, sweet dopamine hit.

Most project management apps are built around these features.

Why Focalboard Over Other Better Project Management Apps?

Focalboard offers very little of the above features. Instead, it offers you complete flexibility over task labels, with even the status labels being optional. It does offer the ability to create boards that are grouped by any label you want, while Kanban boards are only ever grouped by completion status.
This feature is missing from most project management applications, with GitLab being the only other one to offer it. Gitlab was unfortunately too resource-intensive for me to want to use it, so I landed on Focalboard after a lot of searching. Viewing and modifying a lot of tasks based on one particular label is something I intended to do a lot, so I chose to prioritize this feature over everything else.

Installation

Installing Focalboard is very easy, and they have provided the instructions here. Even better, they have a docker image.
Unfortunately, this method of installation is only good for x86 CPUs. Hosting on a Raspberry Pi, I needed binaries built for ARM CPUs. I tried building my own from the source code but I ran into some problems, and I lack the knowledge necessary to make it work.
Luckily, someone has already built a docker image for ARM, and I just mooched off their hard work.

To install the Focalboard Docker image on an ARM device, you first make a folder. Create config.json and docker-compose.yml in that folder, and fill the files with the contents given here. The only thing you might need to change is the port number in docker-compose.yml. Go to the entry under the line that reads ports, and replace the number before the colon with the host port number you wish to use. Run docker compose up -d to start the server.

Focalboard also requires a websocket connection. This is a type of connection that stays open, instead of ending when the server sends a response. To set this up in NGINX, Focalboard has kindly provided the configuration here. After creating this configuration, just set up SSL and you should be ready to go!

Using PostgreSQL Database

Create an account and a database in Postgres for Focalboard to use. Then make the following changes to docker-compose.yml

services:
  focalboard:
    <everything that was there before>
    networks:
      - focalboard-network
networks:
  focalboard-network:
    external: true

Make the following changes to config.json

"dbtype": "postgres",
"dbconfig": "postgres://<focalboard_postgres_username>:<focalboard_postgres_password>@postgres-container/<focalboard_postgres_database_name>?sslmode=disable&connect_timeout=10"

Then run:

docker network create focalboard-network
docker network connect focalboard-network postgres-container
docker compose up -d