diff --git a/src/freedombone-app-gogs b/src/freedombone-app-gogs
index 03b87d76a5e43b9e1273f8458c011c24efcd5c2f..9a1615a952c8b65f841f2c56e01f6db75ce94456 100755
--- a/src/freedombone-app-gogs
+++ b/src/freedombone-app-gogs
@@ -139,7 +139,7 @@ function gogs_create_database {
     fi
 
     function_check create_database
-    create_database gogs "$GOGS_ADMIN_PASSWORD"
+    create_database gogs "$GIT_ADMIN_PASSWORD"
 }
 
 function reconfigure_gogs {
@@ -302,7 +302,7 @@ function backup_remote_gogs {
         suspend_site ${GIT_DOMAIN_NAME}
 
         function_check backup_database_to_friend
-        backup_database_to_friend $GOGS_USERNAME
+        backup_database_to_friend gogs
 
         echo $"Obtaining Gogs settings backup"
 
diff --git a/src/freedombone-app-wekan b/src/freedombone-app-wekan
new file mode 100755
index 0000000000000000000000000000000000000000..d0894e2b3b5f8185eafca484a177e4beb4922fd6
--- /dev/null
+++ b/src/freedombone-app-wekan
@@ -0,0 +1,494 @@
+#!/bin/bash
+#
+# .---.                  .              .
+# |                      |              |
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
+#
+#                    Freedom in the Cloud
+#
+# Wekan kanban
+#
+# License
+# =======
+#
+# Copyright (C) 2017 Bob Mottram <bob@freedombone.net>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+VARIANTS=''
+
+IN_DEFAULT_INSTALL=0
+SHOW_ON_ABOUT=0
+
+WEKAN_DOMAIN_NAME=
+WEKAN_CODE=
+WEKAN_PORT=8081
+WEKAN_ONION_PORT=8120
+WEKAN_REPO="https://github.com/wekan/wekan"
+WEKAN_COMMIT='dc547c38d1f5ca72729f6d8f81eb03671ca15934'
+FLOW_ROUTER_REPO="git://github.com/wekan/flow-router.git"
+FLOW_ROUTER_COMMIT='0c1f6423ed9b68eb00cfb1a19492438917a38956'
+WEKAN_DIR=/etc/wekan
+
+wekan_variables=(ONION_ONLY
+                 WEKAN_DOMAIN_NAME
+                 WEKAN_CODE
+                 DDNS_PROVIDER
+                 MY_USERNAME)
+
+function logging_on_wekan {
+    echo -n ''
+}
+
+function logging_off_wekan {
+    echo -n ''
+}
+
+function remove_user_wekan {
+    remove_username="$1"
+}
+
+function add_user_wekan {
+    new_username="$1"
+    new_user_password="$2"
+    echo '0'
+}
+
+function install_interactive_wekan {
+    if [[ $ONION_ONLY != "no" ]]; then
+        GIT_DOMAIN_NAME='wekan.local'
+        write_config_param "WEKAN_DOMAIN_NAME" "$WEKAN_DOMAIN_NAME"
+    else
+        function_check interactive_site_details
+        interactive_site_details wekan
+    fi
+    APP_INSTALLED=1
+}
+
+function change_password_wekan {
+    curr_username="$1"
+    new_user_password="$2"
+}
+
+function reconfigure_wekan {
+    echo -n ''
+}
+
+function upgrade_wekan {
+    CURR_WEKAN_COMMIT=$(get_completion_param "wekan commit")
+    if [[ "$CURR_WEKAN_COMMIT" == "$WEKAN_COMMIT" ]]; then
+        return
+    fi
+
+    systemctl stop wekan
+
+    # update to the next commit
+    function_check set_repo_commit
+    set_repo_commit $WEKAN_DIR "wekan commit" "$WEKAN_COMMIT" $WEKAN_REPO
+
+    systemctl start wekan
+}
+
+function backup_local_wekan {
+    source_directory=$WEKAN_DIR/data
+    if [ -d $source_directory ]; then
+        systemctl stop wekan
+
+        dest_directory=wekan
+        function_check suspend_site
+        suspend_site wekan
+
+        function_check backup_database_to_usb
+        backup_database_to_usb wekan
+
+        function_check backup_directory_to_usb
+        backup_directory_to_usb $source_directory $dest_directory
+
+        function_check restart_site
+        restart_site
+
+        systemctl start wekan
+    fi
+}
+
+function restore_local_wekan {
+    if [ -d $WEKAN_DIR ]; then
+        systemctl stop wekan
+
+        function_check restore_database
+        restore_database gogs ${WEKAN_DOMAIN_NAME}
+
+        temp_restore_dir=/root/tempwekan
+        function_check restore_directory_from_usb
+        restore_directory_from_usb $temp_restore_dir wekan
+        cp -r $temp_restore_dir$WEKAN_DIR/data/* $WEKAN_DIR/data/
+
+        systemctl start wekan
+    fi
+}
+
+function backup_remote_wekan {
+    if grep -q "wekan domain" $COMPLETION_FILE; then
+        temp_backup_dir=$WEKAN_DIR/data
+        if [ -d $temp_backup_dir ]; then
+            systemctl stop wekan
+
+            function_check suspend_site
+            suspend_site wekan
+
+            echo $"Backing up Wekan installation"
+
+            function_check backup_database_to_friend
+            backup_database_to_friend wekan
+
+            function_check backup_directory_to_friend
+            backup_directory_to_friend $temp_backup_dir wekan
+
+            function_check restart_site
+            restart_site
+
+            systemctl start wekan
+        else
+            echo $"wekan domain specified but not found in ${temp_backup_dir}"
+        fi
+    fi
+}
+
+function restore_remote_wekan {
+    if [ -d $WEKAN_DIR ]; then
+        systemctl stop wekan
+
+        function_check restore_database_from_friend
+        restore_database_from_friend wekan
+
+        temp_restore_dir=/root/tempwekan
+        function_check restore_directory_from_usb
+        restore_directory_from_friend $temp_restore_dir wekan
+        cp -r $temp_restore_dir$WEKAN_DIR/data/* $WEKAN_DIR/data/
+
+        systemctl start wekan
+    fi
+}
+
+function remove_wekan {
+    systemctl stop wekan
+    systemctl disable wekan
+    if [ -f /etc/systemd/system/wekan.service ]; then
+        rm /etc/systemd/system/wekan.service
+    fi
+    systemctl daemon-reload
+
+    function_check remove_nodejs
+    remove_nodejs wekan
+
+    nginx_dissite wekan
+
+    if [ -d $WEKAN_DIR ]; then
+        rm -rf $WEKAN_DIR
+    fi
+    if [ -f /etc/nginx/sites-available/wekan ]; then
+        rm /etc/nginx/sites-available/wekan
+    fi
+    function_check drop_database
+    drop_database wekan
+    function_check remove_onion_service
+    remove_onion_service wekan ${WEKAN_ONION_PORT}
+    remove_app wekan
+    remove_completion_param install_wekan
+    sed -i '/wekan/d' $COMPLETION_FILE
+
+    groupdel -f gogs
+    userdel -r wekan
+    remove_meteor
+}
+
+function wekan_create_database {
+    if [ -f ${IMAGE_PASSWORD_FILE} ]; then
+        WEKAN_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
+    else
+        if [ ! ${GIT_ADMIN_PASSWORD} ]; then
+            WEKAN_ADMIN_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
+        fi
+    fi
+    if [ ! $WEKAN_ADMIN_PASSWORD ]; then
+        return
+    fi
+
+    function_check create_database
+    create_database gogs "$WEKAN_ADMIN_PASSWORD"
+}
+
+function install_wekan_main {
+    if [[ $(app_is_installed wekan_main) == "1" ]]; then
+        return
+    fi
+
+    if [ ! -d /var/www/wekan ]; then
+        mkdir /var/www/wekan
+    fi
+    if [ -d $WEKAN_DIR ]; then
+        rm -rf $WEKAN_DIR
+    fi
+
+    if [ -d /repos/wekan ]; then
+        mkdir -p $WEKAN_DIR
+        cp -r -p /repos/wekan/. $WEKAN_DIR
+        cd $WEKAN_DIR
+        git pull
+    else
+        function_check git_clone
+        git_clone $WEKAN_REPO $WEKAN_DIR
+    fi
+
+    if [ ! -d $WEKAN_DIR ]; then
+        echo $'Unable to clone wekan repo'
+        exit 783251
+    fi
+
+    # an unprivileged user to run as
+    useradd -d $WEKAN_DIR/ wekan
+    groupadd wekan
+
+    cd $WEKAN_DIR
+    git checkout $WEKAN_COMMIT -b $WEKAN_COMMIT
+    set_completion_param "wekan commit" "$WEKAN_COMMIT"
+
+    chown -R wekan:wekan $WEKAN_DIR
+
+    WEKAN_ONION_HOSTNAME=$(add_onion_service wekan 80 ${WEKAN_ONION_PORT})
+    set_completion_param "wekan onion domain" "$WEKAN_ONION_HOSTNAME"
+
+    wekan_nginx_site=/etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    if [[ ${ONION_ONLY} == "no" ]]; then
+        function_check nginx_http_redirect
+        nginx_http_redirect ${WEKAN_DOMAIN_NAME}
+        echo 'server {' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '    listen 443 ssl;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '    listen [::]:443 ssl;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo "    root /var/www/${WEKAN_DOMAIN_NAME}/htdocs;" >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo "    server_name ${WEKAN_DOMAIN_NAME};" >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '    access_log /dev/null;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo "    error_log /dev/null;" >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        function_check nginx_ssl
+        nginx_ssl ${WEKAN_DOMAIN_NAME}
+        function_check nginx_disable_sniffing
+        nginx_disable_sniffing ${WEKAN_DOMAIN_NAME}
+        echo '    add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '    location / {' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        function_check nginx_limits
+        nginx_limits ${WEKAN_DOMAIN_NAME} '15m'
+        echo "        proxy_pass http://localhost:$WEKAN_PORT;" >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '    }' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '    fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '    error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '    error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '    location = /robots.txt {' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '        allow all;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '        log_not_found off;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '        access_log /dev/null;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '    }' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        nginx_keybase ${WEKAN_DOMAIN_NAME}
+        echo '}' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+        echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    else
+        echo -n '' > /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    fi
+    echo 'server {' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo "    listen 127.0.0.1:${WEKAN_ONION_PORT} default_server;" >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo "    root /var/www/$WEKAN_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo "    server_name $WEKAN_DOMAIN_NAME;" >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '    access_log /dev/null;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo "    error_log /dev/null;" >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    function_check nginx_disable_sniffing
+    nginx_disable_sniffing ${WEKAN_DOMAIN_NAME}
+    echo '    add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '    location / {' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    function_check nginx_limits
+    nginx_limits ${WEKAN_DOMAIN_NAME} '15m'
+    echo "        proxy_pass http://localhost:$WEKAN_PORT;" >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '    }' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '    fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '    error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '    error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '    location = /robots.txt {' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '        allow all;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '        log_not_found off;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '        access_log /dev/null;' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '    }' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    echo '' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+    nginx_keybase ${WEKAN_DOMAIN_NAME}
+    echo '}' >> /etc/nginx/sites-available/${WEKAN_DOMAIN_NAME}
+
+    function_check nginx_ensite
+    nginx_ensite wekan
+
+    install_completed wekan_main
+}
+
+function install_wekan {
+    apt-get -qy install build-essential c++ capnproto curl
+
+    function_check install_nodejs
+    install_nodejs wekan
+
+    install_wekan_main
+    install_meteor
+
+    cd $WEKAN_DIR
+
+    su -c 'npm install babel-runtime' - wekan
+    su -c 'npm install node-gyp' - wekan
+    su -c 'npm install node-pre-gyp' - wekan
+    su -c 'npm install fibers' - wekan
+    su -c 'npm install bcrypt' - wekan
+    su -c 'npm install bson' - wekan
+    su -c 'npm install es6-promise' - wekan
+    su -c 'npm install meteor-node-stubs' - wekan
+    su -c 'npm install winston' - wekan
+    su -c 'npm install winston-zulip' - wekan
+    su -c 'npm install xss' - wekan
+
+    # Remove any directories from previous installs
+    if [ -d $WEKAN_DIR/.meteor ]; then
+        rm -rf $WEKAN_DIR/.meteor
+    fi
+    if [ -d $WEKAN_DIR/app ]; then
+        rm -rf $WEKAN_DIR/app
+    fi
+    if [ -d $WEKAN_DIR/app_build ]; then
+        rm -rf $WEKAN_DIR/app_build
+    fi
+
+    # Get additional packages
+    mkdir -p $WEKAN_DIR/.meteor/packages
+    chown wekan:wekan --recursive $WEKAN_DIR/.meteor
+    cd $WEKAN_DIR/.meteor/packages
+    if [ ! -d /repos/flowrouter ]; then
+        su -c "git clone --depth 1 -b master $FLOW_ROUTER_REPO kadira-flow-router" - wekan
+    else
+        mkdir kadira-flow-router
+        cp -r -p /repos/flowrouter/. kadira-flow-router
+        cd kadira-flow-router
+        git pull
+        cd ..
+    fi
+    cd kadira-flow-router
+    git checkout $FLOW_ROUTER_COMMIT -b $FLOW_ROUTER_COMMIT
+    cd ..
+    if [ ! -d /repos/meteoruseraccounts ]; then
+        su -c "git clone --depth 1 -b master $METEOR_USERACCOUNTS_REPO meteor-useraccounts-core" - wekan
+    else
+        mkdir meteor-useraccounts-core
+        cp -r -p /repos/meteoruseraccounts/. meteor-useraccounts-core
+        cd meteor-useraccounts-core
+        git pull
+        cd ..
+    fi
+    cd meteor-useraccounts-core
+    git checkout $METEOR_USERACCOUNTS_COMMIT -b $METEOR_USERACCOUNTS_COMMIT
+    cd ..
+    if [ ! -f $WEKAN_DIR/.meteor/packages/meteor-useraccounts-core/package.js ]; then
+        echo $"File not found: $WEKAN_DIR/.meteor/packages/meteor-useraccounts-core/package.js"
+        exit 7289529
+    fi
+    sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' $WEKAN_DIR/.meteor/packages/meteor-useraccounts-core/package.js
+    cd $WEKAN_DIR/.meteor
+    su -c "$WEKAN_DIR/.meteor/meteor -- help" - wekan
+
+    # Build app
+    if [ ! -d $WEKAN_DIR/app ]; then
+        echo $'No app subdirectory found'
+        exit 294569
+    fi
+    cd $WEKAN_DIR/app
+    su -c "$WEKAN_DIR/.meteor/meteor add standard-minifier-js" - wekan
+    su -c "$WEKAN_DIR/.meteor/meteor npm install" - wekan
+    su -c "$WEKAN_DIR/.meteor/meteor build --directory $WEKAN_DIR/app_build" - wekan
+    cp $WEKAN_DIR/app/fix-download-unicode/cfs_access-point.txt $WEKAN_DIR/app_build/bundle/programs/server/packages/cfs_access-point.js
+    chown wekan:wekan $WEKAN_DIR/app_build/bundle/programs/server/packages/cfs_access-point.js
+    sed -i "s|build\/Release\/bson|browser_build\/bson|g" $WEKAN_DIR/app_build/bundle/programs/server/npm/node_modules/meteor/cfs_gridfs/node_modules/mongodb/node_modules/bson/ext/index.js
+    if [ ! -d $WEKAN_DIR/app_build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt ]; then
+        echo $"No subdirectory found: $WEKAN_DIR/app_build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt"
+        exit 479832
+    fi
+    cd $WEKAN_DIR/app_build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt
+    su -c 'rm -rf node_modules/bcrypt' - wekan
+    su -c 'npm install bcrypt' - wekan
+    cd $WEKAN_DIR/app_build/bundle/programs/server/
+    su -c 'npm install' - wekan
+    mv $WEKAN_DIR/app_build/bundle ../build
+
+    if [ ! -f $WEKAN_DIR/build/main.js ]; then
+        echo $'main.js not found'
+        exit 7828252
+    fi
+
+    # Cleanup
+    rm -R $WEKAN_DIR/.meteor
+    rm -R $WEKAN_DIR/app
+    rm -R $WEKAN_DIR/app_build
+
+    chown -R wekan:wekan $WEKAN_DIR
+
+    function_check install_mariadb
+    install_mariadb
+
+    function_check get_mariadb_password
+    get_mariadb_password
+
+    function_check wekan_create_database
+    wekan_create_database
+
+    # daemon
+    echo '[Unit]' > /etc/systemd/system/wekan.service
+    echo 'Description=Wekan' >> /etc/systemd/system/wekan.service
+    echo 'After=syslog.target' >> /etc/systemd/system/wekan.service
+    echo 'After=network.target' >> /etc/systemd/system/wekan.service
+    echo '' >> /etc/systemd/system/wekan.service
+    echo '[Service]' >> /etc/systemd/system/wekan.service
+    echo 'User=wekan' >> /etc/systemd/system/wekan.service
+    echo 'Group=wekan' >> /etc/systemd/system/wekan.service
+    echo "WorkingDirectory=$WEKAN_DIR" >> /etc/systemd/system/wekan.service
+    echo "ExecStart=/usr/local/bin/node $WEKAN_DIR/build/main.js" >> /etc/systemd/system/wekan.service
+    echo 'Environment=PATH=/usr/bin:/usr/local/bin' >> /etc/systemd/system/wekan.service
+    echo 'Environment=NODE_ENV=production' >> /etc/systemd/system/wekan.service
+    echo 'Restart=on-failure' >> /etc/systemd/system/wekan.service
+    echo '' >> /etc/systemd/system/wekan.service
+    echo '[Install]' >> /etc/systemd/system/wekan.service
+    echo 'WantedBy=multi-user.target' >> /etc/systemd/system/wekan.service
+    systemctl enable wekan.service
+    systemctl daemon-reload
+    systemctl start wekan.service
+
+    systemctl restart nginx
+
+    set_completion_param "wekan domain" "$WEKAN_DOMAIN_NAME"
+
+    APP_INSTALLED=1
+}
+
+# NOTE: deliberately there is no "exit 0"
diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise
index 80853e1e45393186c042a3a488f863c14a818e20..c31ce669517e0e8024f3d4963c8ed581757744fd 100755
--- a/src/freedombone-image-customise
+++ b/src/freedombone-image-customise
@@ -1274,6 +1274,10 @@ function image_preinstall_repos {
     git clone $TOXID_REPO $rootdir/repos/toxid
     git clone $TOXIC_REPO $rootdir/repos/toxic
     git clone $TURTL_REPO $rootdir/repos/turtl
+    git clone $WEKAN_REPO $rootdir/repos/wekan
+    git clone $FLOW_ROUTER_REPO $rootdir/repos/flowrouter
+    git clone $METEOR_USERACCOUNTS_REPO $rootdir/repos/meteoruseraccounts
+    git clone $METEOR_REPO $rootdir/repos/meteor
     #git clone $ZERONET_REPO $rootdir/repos/zeronet
     #git clone $QTOX_REPO $rootdir/repos/qtox
 }
diff --git a/src/freedombone-utils-meteor b/src/freedombone-utils-meteor
new file mode 100755
index 0000000000000000000000000000000000000000..1b14bea65bd752c1b975a198ff7a620ad7f7c29b
--- /dev/null
+++ b/src/freedombone-utils-meteor
@@ -0,0 +1,220 @@
+#!/bin/bash
+#
+# .---.                  .              .
+# |                      |              |
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
+#
+#                    Freedom in the Cloud
+#
+# Functions for installing meteor
+# See meteor.com
+#
+# License
+# =======
+#
+# Copyright (C) 2017 Bob Mottram <bob@freedombone.net>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+METEOR_RELEASE='1.4.4.1'
+METEOR_REPO="https://github.com/meteor/meteor"
+METEOR_COMMIT='b52c6587d7542c0f27481a3bee8c65be06068ac1'
+METEOR_USERACCOUNTS_REPO="git://github.com/meteor-useraccounts/core.git"
+METEOR_USERACCOUNTS_COMMIT='2e8986813b51f321f908d2f6211f6f81f76cd627'
+
+function meteor_cleanUp {
+    rm -rf "$TARBALL_FILE"
+    rm -rf "$INSTALL_TMPDIR"
+}
+
+function install_meteor_script {
+    meteor_dir=$1
+
+    if [ ! $meteor_dir ]; then
+        echo $'No meteor install directory specified'
+        exit 692025
+    fi
+
+    if [ ! -d $meteor_dir ]; then
+        echo $'Meteor install directory not found'
+        exit 845382
+    fi
+
+    if [[ "$(arch)" == "arm"* ]]; then
+        echo 'meteor does not support ARM'
+        exit 8362952
+    fi
+    if [[ "$(arch)" == "i386" || "$(arch)" == "x86_32" ]]; then
+        PLATFORM="os.linux.x86_32"
+    else
+        PLATFORM="os.linux.x86_64"
+    fi
+
+    RELEASE="$METEOR_RELEASE"
+
+    DIR_PREFIX="/usr/local"
+
+    TARBALL_URL="$https://meteorinstall-4168.kxcdn.com/packages-bootstrap/${RELEASE}/meteor-bootstrap-${PLATFORM}.tar.gz"
+    INSTALL_TMPDIR="$meteor_dir/.meteor-install-tmp"
+    TARBALL_FILE="$meteor_dir/.meteor-tarball-tmp"
+
+    # Remove temporary files now in case they exist.
+    meteor_cleanUp
+
+    if [ -d $INSTALL_TMPDIR ]; then
+        rm -rf $INSTALL_TMPDIR
+    fi
+    mkdir "$INSTALL_TMPDIR"
+
+    if [ ! -f ${TARBALL_FILE} ]; then
+        echo "Downloading Meteor distribution"
+        # keep trying to curl the file until it works (resuming where possible)
+        MAX_ATTEMPTS=10
+        RETRY_DELAY_SECS=5
+        set +e
+        ATTEMPTS=0
+        while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]
+        do
+            ATTEMPTS=$((ATTEMPTS + 1))
+
+            curl --progress-bar --fail --continue-at - \
+                 "$TARBALL_URL" --output "$TARBALL_FILE"
+
+            if [ $? -eq 0 ]
+            then
+                break
+            fi
+
+            echo "Retrying download in $RETRY_DELAY_SECS seconds..."
+            sleep $RETRY_DELAY_SECS
+        done
+    fi
+
+    if [ ! -f ${TARBALL_FILE} ]; then
+        echo $'meteor tarball could not be downloaded'
+        exit 7272452
+    fi
+
+    tar -xzf "$TARBALL_FILE" -C "$INSTALL_TMPDIR" -o
+
+    if [ ! -f ${INSTALL_TMPDIR}/.meteor/meteor ]; then
+        echo $'tarball not extracted'
+        exit 693252
+    fi
+
+    mv "${INSTALL_TMPDIR}/.meteor" "$meteor_dir"
+
+    meteor_cleanUp
+
+    echo ''
+    echo "Meteor ${RELEASE} has been installed in $meteor_dir/.meteor"
+
+    METEOR_SYMLINK_TARGET="$(readlink "$meteor_dir/.meteor/meteor")"
+    METEOR_TOOL_DIRECTORY="$(dirname "$METEOR_SYMLINK_TARGET")"
+    LAUNCHER="$meteor_dir/.meteor/$METEOR_TOOL_DIRECTORY/scripts/admin/launch-meteor"
+
+    if cp "$LAUNCHER" "$DIR_PREFIX/bin/meteor" >/dev/null 2>&1; then
+        echo "Writing a launcher script to $DIR_PREFIX/bin/meteor for your convenience."
+        cat <<"EOF"
+
+To get started fast:
+
+  $ meteor create ~/my_cool_app
+  $ cd ~/my_cool_app
+  $ meteor
+
+Or see the docs at:
+
+  docs.meteor.com
+
+EOF
+    elif type sudo >/dev/null 2>&1; then
+        echo "Writing a launcher script to $DIR_PREFIX/bin/meteor for your convenience."
+        echo "This may prompt for your password."
+
+        # New macs (10.9+) don't ship with /usr/local, however it is still in
+        # the default PATH. We still install there, we just need to create the
+        # directory first.
+        # XXX this means that we can run sudo too many times. we should never
+        #     run it more than once if it fails the first time
+        if [ ! -d "$DIR_PREFIX/bin" ] ; then
+            sudo mkdir -m 755 "$DIR_PREFIX" || true
+            sudo mkdir -m 755 "$DIR_PREFIX/bin" || true
+        fi
+
+        if sudo cp "$LAUNCHER" "$DIR_PREFIX/bin/meteor"; then
+            cat <<"EOF"
+
+To get started fast:
+
+  $ meteor create ~/my_cool_app
+  $ cd ~/my_cool_app
+  $ meteor
+
+Or see the docs at:
+
+  docs.meteor.com
+
+EOF
+        else
+            cat <<EOF
+
+Couldn't write the launcher script. Please either:
+
+  (1) Run the following as root:
+        cp "$LAUNCHER" /usr/bin/meteor
+  (2) Add "\$meteor_dir/.meteor" to your path, or
+  (3) Rerun this command to try again.
+
+Then to get started, take a look at 'meteor --help' or see the docs at
+docs.meteor.com.
+EOF
+        fi
+    else
+        cat <<EOF
+
+Now you need to do one of the following:
+
+  (1) Add "\$meteor_dir/.meteor" to your path, or
+  (2) Run this command as root:
+        cp "$LAUNCHER" /usr/bin/meteor
+
+Then to get started, take a look at 'meteor --help' or see the docs at
+docs.meteor.com.
+EOF
+    fi
+
+}
+
+function install_meteor {
+    apt-get -yq install curl
+    if [ ! -d $INSTALL_DIR/meteor ]; then
+        mkdir $INSTALL_DIR/meteor
+    fi
+    cd $INSTALL_DIR/meteor
+    install_meteor_script
+}
+
+function remove_meteor {
+    if [ -f /usr/local/bin/meteor ]; then
+        rm /usr/local/bin/meteor
+    fi
+    if [ -f /usr/bin/meteor ]; then
+        rm /usr/bin/meteor
+    fi
+}
+
+# NOTE: deliberately no exit 0