diff --git a/backup-tar/backup.sh b/backup-tar/backup.sh
index dd8f4a768818d4ec9380fba118c7b5d026e7ecf9..5165156035e81236fb1e9f5cc4994d22fd026f4d 100755
--- a/backup-tar/backup.sh
+++ b/backup-tar/backup.sh
@@ -2,18 +2,38 @@
 
 set -e
 
+COMPRESS_THRS=$(($(nproc) / 4))
+[[ $COMPRESS_THRS -eq 0 ]] && COMPRESS_THRS=1
+[[ $COMPRESS_THRS -gt 8 ]] && COMPRESS_THRS=8
+
 fail() {
     echo "$1" >&2
     exit 1
 }
 
-[[ "$1" = "full" ]] || [[ "$1" = "weekly" ]] || [[ "$1" = "daily" ]] || \
+TYPE=$1
+[[ "$TYPE" ]] || {
+    set -x
+    LAST_FULL=$(date --date=$(ls *.snar | sort | grep full | tail -n1 | sed 's/[.].*$//') +%s)
+    LAST_BIG=$(date --date=$(ls *.snar | sort | grep '\(full\|weekly\)' | tail -n1 | sed 's/[.].*$//') +%s)
+    NOW=$(date +%s)
+    # do a full backup every 8 weeks
+    if [[ $(($NOW - $LAST_FULL)) -ge $((3600 * 24 * 7 * 8)) ]]; then
+        TYPE=full
+    elif [[ $(($NOW - $LAST_BIG)) -ge $((3600 * 24 * 7)) ]]; then
+        TYPE=weekly
+    else
+        TYPE=daily
+    fi
+    set +x
+    echo "Performing $TYPE backup (autodetected)" >&2
+}
+[[ "$TYPE" = "full" ]] || [[ "$TYPE" = "weekly" ]] || [[ "$TYPE" = "daily" ]] || \
     fail "usage: $0 [full|weekly|daily]"
 
 TARGET=backup-$HOSTNAME@antea
 LOCAL_HOME_ID=$(stat -c %d /home)
 SOURCES=$(comm -12 <(getent passwd | cut -d: -f6 | sort) <(for i in /home/*; do [[ $(stat -c %d $i) -eq $LOCAL_HOME_ID ]] && echo $i; done))
-TYPE=$1
 TIMESTAMP=$(date +"%Y-%m-%d")
 
 BACKUP_FILE=${TYPE}/${TIMESTAMP}.tar.xz
@@ -36,5 +56,6 @@ fi
 set -x
 
 ssh $TARGET "mkdir -p $TYPE"
-tar --create --xz --xattrs --acls --listed-incremental=$INCFILE $SOURCES | ssh $TARGET "cat > $BACKUP_FILE"
+tar --create --xattrs --acls --listed-incremental=$INCFILE $SOURCES | \
+    xz -T$COMPRESS_THRS -3 | ssh $TARGET "cat > $BACKUP_FILE"
 scp $INCFILE $TARGET:$INCFILE_TGT