diff --git a/README.md b/README.md
index eda0c4ac5ed7bdb01785975a7469274de510332b..27019810032a6e6670e4aa2419dc733415791511 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # simple-vps-provider
 
-Turn your home server to DigitalOcean / Linode / Vultr with a simple script.
+Turn your server/desktop to DigitalOcean / Linode / Vultr with a super-simple script.
 
 No complex configuration, no fancy dependency, no management cost. This project is designed for single user home server. It allows you to easily get a server for testing and dev.
 
diff --git a/src/daemon-test.sh b/archived/daemon-test.sh
similarity index 100%
rename from src/daemon-test.sh
rename to archived/daemon-test.sh
diff --git a/http-root/base64zip.js b/archived/http-root/base64zip.js
similarity index 100%
rename from http-root/base64zip.js
rename to archived/http-root/base64zip.js
diff --git a/http-root/index.html b/archived/http-root/index.html
similarity index 100%
rename from http-root/index.html
rename to archived/http-root/index.html
diff --git a/http-root/pako.js b/archived/http-root/pako.js
similarity index 100%
rename from http-root/pako.js
rename to archived/http-root/pako.js
diff --git a/http-root/res/bulma.min.css b/archived/http-root/res/bulma.min.css
similarity index 100%
rename from http-root/res/bulma.min.css
rename to archived/http-root/res/bulma.min.css
diff --git a/http-root/res/clipboard.min.js b/archived/http-root/res/clipboard.min.js
similarity index 100%
rename from http-root/res/clipboard.min.js
rename to archived/http-root/res/clipboard.min.js
diff --git a/http-root/res/clippy.svg b/archived/http-root/res/clippy.svg
similarity index 100%
rename from http-root/res/clippy.svg
rename to archived/http-root/res/clippy.svg
diff --git a/http-root/res/jquery.min.js b/archived/http-root/res/jquery.min.js
similarity index 100%
rename from http-root/res/jquery.min.js
rename to archived/http-root/res/jquery.min.js
diff --git a/http-root/res/sha256.min.js b/archived/http-root/res/sha256.min.js
similarity index 100%
rename from http-root/res/sha256.min.js
rename to archived/http-root/res/sha256.min.js
diff --git a/http-root/res/sheet/css/main.css b/archived/http-root/res/sheet/css/main.css
similarity index 100%
rename from http-root/res/sheet/css/main.css
rename to archived/http-root/res/sheet/css/main.css
diff --git a/http-root/res/sheet/css/util.css b/archived/http-root/res/sheet/css/util.css
similarity index 100%
rename from http-root/res/sheet/css/util.css
rename to archived/http-root/res/sheet/css/util.css
diff --git a/http-root/res/sheet/fonts/OpenSans/OpenSans-Regular.ttf b/archived/http-root/res/sheet/fonts/OpenSans/OpenSans-Regular.ttf
similarity index 100%
rename from http-root/res/sheet/fonts/OpenSans/OpenSans-Regular.ttf
rename to archived/http-root/res/sheet/fonts/OpenSans/OpenSans-Regular.ttf
diff --git a/http-root/res/sheet/fonts/font-awesome-4.7.0/css/font-awesome.min.css b/archived/http-root/res/sheet/fonts/font-awesome-4.7.0/css/font-awesome.min.css
similarity index 100%
rename from http-root/res/sheet/fonts/font-awesome-4.7.0/css/font-awesome.min.css
rename to archived/http-root/res/sheet/fonts/font-awesome-4.7.0/css/font-awesome.min.css
diff --git a/http-root/res/sheet/js/main.js b/archived/http-root/res/sheet/js/main.js
similarity index 100%
rename from http-root/res/sheet/js/main.js
rename to archived/http-root/res/sheet/js/main.js
diff --git a/http-root/res/sheet/vendor/animate/animate.css b/archived/http-root/res/sheet/vendor/animate/animate.css
similarity index 100%
rename from http-root/res/sheet/vendor/animate/animate.css
rename to archived/http-root/res/sheet/vendor/animate/animate.css
diff --git a/http-root/res/sheet/vendor/bootstrap/css/bootstrap.min.css b/archived/http-root/res/sheet/vendor/bootstrap/css/bootstrap.min.css
similarity index 100%
rename from http-root/res/sheet/vendor/bootstrap/css/bootstrap.min.css
rename to archived/http-root/res/sheet/vendor/bootstrap/css/bootstrap.min.css
diff --git a/http-root/res/sheet/vendor/bootstrap/js/bootstrap.min.js b/archived/http-root/res/sheet/vendor/bootstrap/js/bootstrap.min.js
similarity index 100%
rename from http-root/res/sheet/vendor/bootstrap/js/bootstrap.min.js
rename to archived/http-root/res/sheet/vendor/bootstrap/js/bootstrap.min.js
diff --git a/http-root/res/sheet/vendor/bootstrap/js/popper.js b/archived/http-root/res/sheet/vendor/bootstrap/js/popper.js
similarity index 100%
rename from http-root/res/sheet/vendor/bootstrap/js/popper.js
rename to archived/http-root/res/sheet/vendor/bootstrap/js/popper.js
diff --git a/http-root/res/sheet/vendor/jquery/jquery-3.2.1.min.js b/archived/http-root/res/sheet/vendor/jquery/jquery-3.2.1.min.js
similarity index 100%
rename from http-root/res/sheet/vendor/jquery/jquery-3.2.1.min.js
rename to archived/http-root/res/sheet/vendor/jquery/jquery-3.2.1.min.js
diff --git a/http-root/res/sheet/vendor/perfect-scrollbar/perfect-scrollbar.css b/archived/http-root/res/sheet/vendor/perfect-scrollbar/perfect-scrollbar.css
similarity index 100%
rename from http-root/res/sheet/vendor/perfect-scrollbar/perfect-scrollbar.css
rename to archived/http-root/res/sheet/vendor/perfect-scrollbar/perfect-scrollbar.css
diff --git a/http-root/res/sheet/vendor/select2/select2.min.css b/archived/http-root/res/sheet/vendor/select2/select2.min.css
similarity index 100%
rename from http-root/res/sheet/vendor/select2/select2.min.css
rename to archived/http-root/res/sheet/vendor/select2/select2.min.css
diff --git a/http-root/res/sheet/vendor/select2/select2.min.js b/archived/http-root/res/sheet/vendor/select2/select2.min.js
similarity index 100%
rename from http-root/res/sheet/vendor/select2/select2.min.js
rename to archived/http-root/res/sheet/vendor/select2/select2.min.js
diff --git a/http-root/strftime.js b/archived/http-root/strftime.js
similarity index 100%
rename from http-root/strftime.js
rename to archived/http-root/strftime.js
diff --git a/http-root/template.js b/archived/http-root/template.js
similarity index 100%
rename from http-root/template.js
rename to archived/http-root/template.js
diff --git a/requirements.log b/archived/requirements.log
similarity index 100%
rename from requirements.log
rename to archived/requirements.log
diff --git a/src/cron-callback.sh b/src/cron-callback.sh
new file mode 100644
index 0000000000000000000000000000000000000000..dd5e441dbff936d9879e0fc3cfeedd6c143699e1
--- /dev/null
+++ b/src/cron-callback.sh
@@ -0,0 +1,80 @@
+#!/bin/bash
+# pacman -S cdrkit qemu-base
+
+workdir=./data
+mkdir -p "$workdir"
+cd "$workdir"
+mkdir -p base vm tmp
+
+function generate_metadata () {
+    local name=$1
+    echo "local-hostname: $name"
+}
+function generate_userdata () {
+    local username=$1
+    local password=$2
+    local name=$3
+    # TODO: allow public key?
+    echo "#cloud-config
+system_info:
+  default_user:
+    name: $username
+    home: /home/$username
+
+password: $password
+chpasswd: { expire: False }
+hostname: $name
+
+# configure sshd to allow users logging in using password 
+# rather than just keys
+ssh_pwauth: True
+"
+}
+
+function download_cloud_img_if_not_exist () {
+    local cloudimg="$1"
+    [[ "$1" != "focal-server-cloudimg-amd64.img" ]] && echo "ERROR: cloudimg not supported"
+    [[ -f "base/$cloudimg" ]] || aria2c -o "base/$cloudimg" https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img || ! echo "Failed to download ubuntu cloudimg" || return $?
+}
+
+function create_vm_if_not_exist () {
+    local name=$1
+    local cores=$2
+    local ram=$3
+    local disk=$4
+    local cloudimg=$5
+    local username=$6
+    local password=$7
+    local vnc=$8
+    local ports="$9"
+
+    if [[ -f "vm/$name/disk.img" ]]; then
+        # already exists
+        :
+    else
+        download_cloud_img_if_not_exist "$cloudimg" || return $?
+        rm -rf "vm/$name" ; mkdir -p "vm/$name"
+        # create it
+        generate_metadata "$name" > "vm/$name/meta-data" || return $?
+        generate_userdata "$username" "$password" "$name" > "vm/$name/user-data" || return $?
+        ( cd "vm/$name" ; genisoimage  -output initimg.iso -volid cidata -joliet -rock user-data meta-data ) || return $?
+        qemu-img create -f qcow2 -F qcow2 -o backing_file="../../base/focal-server-cloudimg-amd64.img" "vm/$name/disk.img" || return $?
+        qemu-img resize "vm/$name/disk.img" "$disk" || return $?
+    fi
+}
+
+function start_vm_if_not_running () {
+    local name=$1
+    local options="$2"
+
+    # start it
+    qemu-system-x86_64 -drive file="vm/$name/disk.img",if=virtio -cdrom "vm/$name/initimg.iso" -cpu host --enable-kvm -bios /usr/share/edk2-ovmf/x64/OVMF.fd -net nic,model=rtl8139 &
+    pid=$!
+    echo PID=$pid
+    # TODO
+}
+
+[[ $2 = "" ]] && echo "Temp script to create VM. Usage: $0 MY_GOOD_VM11 :11" && exit 1
+create_vm_from "$1" 2 4G 50G __hardcoded__ r 1 "$2" __hardcoded__ || exit $?
+echo "DEBUG: sshpass -p 1 ssh -p 30472 r@localhost"
+
diff --git a/src/init.settings b/src/init.settings
new file mode 100644
index 0000000000000000000000000000000000000000..be9b8fbce1388560d8848543ce5bc9050208f9e9
--- /dev/null
+++ b/src/init.settings
@@ -0,0 +1,4 @@
+# name;cloudimg;disk;username;password
+instance1;focal-server-cloudimg-amd64.img;60G;r;1
+gitlab-ci;focal-server-cloudimg-amd64.img;60G;r;1
+httptest ;focal-server-cloudimg-amd64.img;60G;r;1
diff --git a/src/runtime.settings b/src/runtime.settings
new file mode 100644
index 0000000000000000000000000000000000000000..fca2de23e7dda152534edf2e5a663e496afb532a
--- /dev/null
+++ b/src/runtime.settings
@@ -0,0 +1,4 @@
+# name;options
+instance1;focal-server-cloudimg-amd64.img;60G;-m 2G -smp 2 -vnc :11 -net user,hostfwd=tcp::30472-:22
+gitlab-ci;focal-server-cloudimg-amd64.img;40G;-m 4G -smp 4 -vnc :12 -net user,hostfwd=tcp::30473-:22
+httptest ;focal-server-cloudimg-amd64.img;20G;-m 1G -smp 1 -vnc :13 -net user,hostfwd=tcp::30474-:22
diff --git a/src/vm.list b/src/vm.list
deleted file mode 100644
index a570254e61b25f25397f004a5f846b8f04f7f75f..0000000000000000000000000000000000000000
--- a/src/vm.list
+++ /dev/null
@@ -1,5 +0,0 @@
-# hostname,cores,mem,disk,base-img,username,password,ports
-
-instance1,4,8G,60G,focal-server-cloudimg-amd64.img,r,1,22
-gitlab-ci,2,2G,40G,focal-server-cloudimg-amd64.img,r,1,22
-httptest,1,1G,20G,focal-server-cloudimg-amd64.img,r,1,22 80 443