Setting up your machine

This section covers all the programs that we use on our machines daily and how we like everyone to set them up.

Some of these tools have their own dedicated pages. But this page would highlight defaults which are expected to be seen in all developer machines.

We run ubuntu! so this section only has instructions for ubuntu.

Please don't install software from snap or the software center.


When we open a terminal, what we see is called a shell. Linux/Unix have a good collection of shells. The one that comes by default in ubuntu is called bash.

We use z-shell or zsh. It sports things like better completion, auto-correct and a few other niceties.

$ sudo apt install zsh

There is a handy file called ~/.profile. We need zsh to use it as well.

$ ln -s ~/.profile ~/.zprofile

Go ahead and create a bin folder in your $HOME, where your custon scripts will live.

$ mkdir ~/bin

Oh my zsh

This is zsh framework/config that provides a solid base to start using zsh. Set it up with

$ sh -c "$(curl -fsSL"

If you dont have curl installed,

$ sudo apt install curl

At the end, it'll ask you to change the default shell to zsh. Please do it!

Logout and log back in. Open a terminal and hey presto!

Adding your own stuff to zsh

Since we're using oh-my-zsh, we need to add our own tweaks to it like custom environment variables or updates to $PATH in a specific location.

$ touch ~/.oh-my-zsh/custom/myconfig.zsh

Add stuff you need in this file.


We live and breathe javascript. We use a tool called nvm for our nodejs needs. This allows us to have multiple versions of node installed on our machines.

$ curl -o- | bash

This will update our ~/.zshrc or ~/.bashrc file with a $PATH update for nvm. Open the file and locate a section like (usually at the bottom)

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/" ] && \. "$NVM_DIR/" # This loads nvm

Cut it and then paste it in our ~/.oh-my-zsh/custom/myconfig.zsh file. All custom shell updates need to go here.

Open a new terminal and type in nvm. You should see the help output from nvm.

To install the latest node release,

$ nvm install node

After that completes, node, npx and npm should be available in your $PATH i.e you should be able to run those commands.


Git is what we use for version control.

$ sudo apt install git

Copy the following to ~/.gitconfig

  ps = "!git push origin $(git rev-parse --abbrev-ref HEAD)"
  pl = "!git pull origin $(git rev-parse --abbrev-ref HEAD)"
  ff = pull --ff-only
  ls = log --oneline --all --graph --decorate
  compaction-heuristic = true
  noprefix = true
  autostash = true
  name = john-mw
  email =
  default = current
  status = auto
  diff = auto
  branch = auto
  interactive = auto
  grep = auto
  ui = auto
  colorMoved = zebra
  defaultBranch = main

Please change john-mw and to what you've setup in github.


This is the industry standard for packaging and shipping applications.

Run the following, one by one to install it.

$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli docker-compose-plugin

Now to let your user run the docker command

$ sudo usermod -aG docker $USER

Logout and log back in. Now you should be able to run docker containers.

You can check by running this in the terminal.

$ docker run hello-world

Note: If you dont want docker running when you boot up your machine, run

$ sudo systemctl disable docker.service docker.socket


We install mongo from docker as it gives us the ability to have multiple versions of mongo on the same machine.

$ docker pull mongo

Now we create a container named local-dev-mongo

$ docker run -d -p 27017:27017 --name local-dev-mongo -v data-vol:$HOME/mongodb mongo

This expects a folder called mongodb in your home folder. If not already present, create it mkdir ~/mongodb

If you wish to get into the container

docker exec -it local-dev-mongo bash

To stop the container,

$ docker stop local-dev-mongo

To remove the container

$ docker container rm local-dev-mongo


This is a handy tool to view our mongo databases. Head over to the download page and get the archive for linux x64.

We should get a studio-3t-linux-x64.tar.gz archive in your Downloads folder. Extract it and we'll get a file.

$ cd ~/Downloads
$ chmod +x
$ ./

The last command will run the studio3T installer and install it to a default location. You should now have studio3T in your application menu.

Open it up and connect to localhost and set port to 27017

For us old fans of robo3T, we can get it from robo3T's release page.

Mongo CLI tools

Having the mongo cli tools is good for taking a peek into our databases, taking db dumps and other niceties.

Get the latest archive from Choose platform as Debian (its the base for ubuntu) and click Download.

$ cd ~/Downloads
$ tar xvf mongodb-database-tools-debian10-x86_64-100.6.0.tgz
$ mkdir ~/Programs
$ mv mongodb-database-tools-debian10-x86_64-100.6.0 ~/Programs/mongo-tools

We downloaded the archive and moved them to its own mongo-tools folder under ~/Programs folder.

To add the cli tools to our $PATH, so that we can run mongo, mongorestore or any of those tools, we need to make a small change in our zsh config.

In our ~/.oh-my-zsh/custom/myconfig.zsh file, add

export PATH="$HOME/Programs/mongo-tools/bin:$PATH"

Open a new terminal and we should be able to run mongo and the other cli tools.


Same deal as mongodb

$ docker pull postgres

Make a directory for postgres to store data

$ mkdir ~/postgresql

To create and run a container

$ docker run -d \
    --name local-dev-postgres \
    -e POSTGRES_PASSWORD=postgres \
    -e POSTGRES_USERNAME=postgres \
    -v ${HOME}/postgresql/:/var/lib/postgresql/data \
    -p 5432:5432 postgres

To connect to it

$ docker exec -it local-dev-postgres bash


This is a tool we use to view databases. Get the Linux Debian package (installer) from

We should see a dbeaver-ce_latest_amd64.deb in our Downloads folder.

cd ~/Downloads
sudo dpkg -i dbeaver-ce_latest_amd64.deb

If you get dependency errors when doing this, run

$ sudo apt install -f

Open dbeaver and then connect to our postgres instance.

  • Host: localhost
  • Port: 5432
  • Username: postgres
  • Password: postgres

PostgreSQL cli tools

Go to the postgres docs for latest documentation. Here's the TLDR;

$ sudo sh -c 'echo "deb $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
$ wget --quiet -O - | sudo apt-key add -
$ sudo apt-get update

We don't want to install postgresql.

Now to install the cli tools

$ sudo apt install postgresql-client-12

or which ever is the current one the above site. After this, we should be able to run psql or pg_dump from the terminal.

VS Code

VSCode is our editor of choice. Get it from Choose the .deb option for download.

You should get a file called code_1.70.0-1659589288_amd64.deb in your Downloads folder. The version number will be different.

cd ~/Downloads
sudo dpkg -i code_1.70.0-1659589288_amd64.deb

If you get dependency errors when doing this, run

$ sudo apt install -f

Open vscode and install the following extensions(Ctrl + Shift + x)



Terminator terminal

This is terminator. We can do vertical and horizontal splits in a single terminal window. Tabs work too :)

This is literally the only reason why we use it instead of gnome-terminal - the default terminal emulator in ubuntu.

$ sudo apt install terminator

Open terminator and right-click. Infinite productivity!


Tmux window

Tmux is whats called a terminal multiplexer. Think of terminator, but just for the shell.

$ sudo apt install tmux

Create its config file ~/.tmux.conf.

# improve colors
set -g default-terminal 'tmux-256color'
set-option -g terminal-overrides ",xterm-256color:RGB"
# start window numbers at 1 to match keyboard order with tmux window order
#set -g base-index 1
#set-window-option -g pane-base-index 1
# renumber windows sequentially after closing any of them
set -g renumber-windows on
# Mouse
set-option -g mouse on

# Reload ~/.tmux.conf
bind-key R source-file ~/.tmux.conf \; display-message "Reloaded!"

set -g status-position bottom
set -g status-bg colour234
set -g status-fg colour137
set -g status-left ''
set -g status-right '#[fg=colour233,bg=colour241,bold] %d/%m #[fg=colour233,bg=colour245,bold] %H:%M:%S '
set -g status-right-length 50
set -g status-left-length 20
setw -g mode-keys vi

setw -g window-status-current-format ' #I#[fg=colour250]:#[fg=colour255]#W#[fg=colour50]#F '
setw -g window-status-format ' #I#[fg=colour237]:#[fg=colour250]#W#[fg=colour244]#F '


Postman is a tool for doing API testing. Get it from

This is not a .deb file that we can install with dpkg or apt. We're going to have to be a bit manual about this.

$ cd Downloads/
$ tar -xzf Postman-linux-x64-7.32.0.tar.gz
$ sudo mkdir -p /opt/apps/
$ sudo mv Postman /opt/apps/
$ sudo ln -s /opt/apps/Postman/Postman /usr/local/bin/postman
$ postman

To create an entry in our application menu list, run

$ sudo nano /usr/share/applications/postman.desktop

and paste in

[Desktop Entry]
Comment=Postman Desktop App

Credits: tecmint


This is our internal messaging tool. Get it from

Make sure we get the .deb file.

$ cd ~/Downloads
$ sudo dpkg -i slack-desktop-4.27.156-amd64.deb

If you get dependency errors when doing this, run

$ sudo apt install -f

Open slack, login and slack away!