cd "${ROOT}"
 . lib/abort_if_offline.sh
 . lib/abort_if_command_unknown.sh
+. lib/expect_n_args.sh
 
 abort_if_offline
 abort_if_command_unknown xz
 
-TEMP_DIR=$(mktemp -d)
-cd "${TEMP_DIR}"
+expect_n_args 0 4 '[discord] [mattermost] [signal] [telegram]' "$@"
 
 install_with_repo() {
     local APP_NAME=$1
     sudo apt install -y "${APP_NAME}-desktop"
 }
 
-install_with_repo mattermost deb.packages.mattermost.com pubkey.gpg stable
+install_telegram() {
+    local FILENAME_TGRAM_ARCHIVE=linux
+    local URL_TGRAM_ARCHIVE="https://telegram.org/dl/desktop/${FILENAME_TGRAM_ARCHIVE}"
+    local REL_PATH_TGRAM_DIR=Telegram
+    local REL_PATH_TGRAM_APP="${REL_PATH_TGRAM_DIR}/Telegram"
+    local PATH_TARGET="${ROOT}/telegram"
+    wget "${URL_TGRAM_ARCHIVE}"
+    tar xf "${FILENAME_TGRAM_ARCHIVE}"
+    mv "${REL_PATH_TGRAM_APP}" "${PATH_TARGET}"
+    rm -rf "${REL_PATH_TGRAM_DIR}"
+    rm "${FILENAME_TGRAM_ARCHIVE}"
+}
+
+install_discord() {
+    local FILENAME_DISCORD_DEB_SOURCE='download?platform=linux'
+    local FILENAME_DISCORD_DEB_TARGET=discord.deb
+    local URL_DISCORD="https://discord.com/api/${FILENAME_DISCORD_DEB_SOURCE}"
+    wget "${URL_DISCORD}"
+    mv "${FILENAME_DISCORD_DEB_SOURCE}" "${FILENAME_DISCORD_DEB_TARGET}"
+    sudo apt install "./${FILENAME_DISCORD_DEB_TARGET}"
+    rm "${FILENAME_DISCORD_DEB_TARGET}"
+}
+
+install_mattermost() {
+    install_with_repo mattermost deb.packages.mattermost.com pubkey.gpg stable
+}
 
-install_with_repo signal updates.signal.org/desktop/apt keys.asc xenial
+install_signal() {
+    install_with_repo signal updates.signal.org/desktop/apt keys.asc xenial
+}
 
-FILENAME_TGRAM_ARCHIVE=linux
-URL_TGRAM_ARCHIVE="https://telegram.org/dl/desktop/${FILENAME_TGRAM_ARCHIVE}"
-REL_PATH_TGRAM_DIR=Telegram
-REL_PATH_TGRAM_APP="${REL_PATH_TGRAM_DIR}/Telegram"
-wget "${URL_TGRAM_ARCHIVE}"
-tar xf "${FILENAME_TGRAM_ARCHIVE}"
-mv "${REL_PATH_TGRAM_APP}" "${ROOT}/"
-rm -rf "${REL_PATH_TGRAM_DIR}"
-rm "${FILENAME_TGRAM_ARCHIVE}"
+TEMP_DIR=$(mktemp -d)
+cd "${TEMP_DIR}"
 
-update_discord
+if [ "$#" -eq 0 ]; then
+    install_signal
+    install_telegram
+    install_discord
+    install_mattermost
+else
+    while [ "$#" -gt 0 ]; do
+        if [ "$1" = 'signal' ]; then
+            install_signal
+        elif [ "$1" = 'telegram' ]; then
+            install_telegram
+        elif [ "$1" = 'discord' ]; then
+            install_discord
+        elif [ "$1" = 'mattermost' ]; then
+            install_mattermost
+        else
+            echo "unrecognized target: $1"
+        fi
+        shift 1
+    done
+fi
 
 cd -
 rmdir "${TEMP_DIR}"
 
+++ /dev/null
-#!/usr/bin/env dash
-set -e
-ROOT=$(dirname "$0")
-cd "${ROOT}"
-. lib/abort_if_offline.sh
-
-TEMP_DIR=$(mktemp -d)
-cd "${TEMP_DIR}"
-
-FILENAME_DISCORD_DEB_SOURCE='download?platform=linux'
-FILENAME_DISCORD_DEB_TARGET=discord.deb
-URL_DISCORD="https://discord.com/api/${FILENAME_DISCORD_DEB_SOURCE}"
-wget "${URL_DISCORD}"
-mv "${FILENAME_DISCORD_DEB_SOURCE}" "${FILENAME_DISCORD_DEB_TARGET}"
-sudo apt install "./${FILENAME_DISCORD_DEB_TARGET}"
-rm "${FILENAME_DISCORD_DEB_TARGET}"
-
-cd -
-rmdir "${TEMP_DIR}"