diff --git a/fiddledl.sh b/fiddledl.sh
new file mode 100755
index 0000000..8b321ee
--- /dev/null
+++ b/fiddledl.sh
@@ -0,0 +1,187 @@
+###############################################################################
+# Copyright 2020 Michael Pfaff. See LICENSE.md for license.
+###############################################################################
+
+#!/usr/bin/env bash
+
+set -eE
+
+_context='script init'
+
+function trap_error {
+ echo "Error occurred during $_context on line $1" 1>&2
+}
+
+trap 'trap_error $LINENO' ERR
+
+###############################################################################
+# BEGIN CODE BY Teddy Skarin
+# https://github.com/fearside/ProgressBar/blob/master/progressbar.sh
+###############################################################################
+
+# 1. Create ProgressBar function
+# 1.1 Input is currentState($1) and totalState($2)
+function ProgressBar {
+# Process data
+ let _progress=(${1}*100/${2}*100)/100
+ let _done=(${_progress}*4)/10
+ let _left=40-$_done
+# Build progressbar string lengths
+ _done=$(printf "%${_done}s")
+ _left=$(printf "%${_left}s")
+
+# 1.2 Build progressbar strings and print the ProgressBar line
+# 1.2.1 Output example:
+# 1.2.1.1 Progress : [########################################] 100%
+printf "\rProgress : [${_done// /#}${_left// /-}] ${_progress}%%"
+
+}
+
+#"} fixes stupid vim highlighting
+###############################################################################
+# END CODE BY Teddy Skarin
+###############################################################################
+
+true=1
+false=0
+
+_name=""
+_fiddleId=""
+_firstRevision=""
+_lastRevision=""
+
+fail=$false
+
+while getopts ":hn:i:l:f:" opt; do
+ case ${opt} in
+ h )
+ echo "Usage:"
+ echo " fiddledl -h"
+ echo " fiddledl -n NAME -i FIDDLE_ID -l LAST_REVISION [-f FIRST_REVISION]"
+ echo ""
+ echo "Options:"
+ echo " -h"
+ echo " Show this help message."
+ echo " -n NAME"
+ echo " A friendly name to append to the result directory to assist in finding later."
+ echo " -i FIDDLE_ID"
+ echo " The id of the fiddle you want to download."
+ echo " -l LAST_REVISION"
+ echo " The last revision of the fiddle you would like to download."
+ echo " -f FIRST_REVISION"
+ echo " The first revision of the fiddle you would like to download."
+ exit 0
+ ;;
+ n )
+ _name=$OPTARG
+ echo "Name: $_name"
+ ;;
+ i )
+ _fiddleId=$OPTARG
+ echo "FiddleId: $_fiddleId"
+ ;;
+ l )
+ _lastRevision=$OPTARG
+ echo "Last revision: $_lastRevision"
+ ;;
+ f )
+ _firstRevision=$OPTARG
+ echo "First revision: $_firstRevision"
+ ;;
+ \? )
+ echo "Unrecognized option: $OPTARG" 1>&2
+ exit 64
+ ;;
+ : )
+ echo "Missing argument: $OPTARG requires an argument" 1>&2
+ exit 64
+ ;;
+ esac
+done
+shift $((OPTIND -1))
+
+if [[ ! -n $_name ]]; then
+ echo "Name not specified. Only fiddleId will be used for directory name."
+fi
+
+if [[ ! -n $_fiddleId ]]; then
+ echo "fiddleId must be specified."
+ #fail=$true
+ exit 64
+fi
+
+if [[ ! -n $_lastRevision ]]; then
+ echo "Last revision was not specified. First revision will be ignored and only the last revision will be downloaded."
+ #fail=$true
+fi
+
+if [[ ! -n $_firstRevision ]]; then
+ if [[ -n $_lastRevision ]]; then
+ echo "First revision not specified. Will be 1."
+ _firstRevision=1
+ fi
+fi
+
+read -p "Are you sure? [y/N] " -n 1 -r
+echo # (optional) move to a new line
+if [[ ! $REPLY =~ ^[Yy]$ ]]; then
+ exit 1
+fi
+
+if [[ ! -n $_name ]]; then
+ _dir="${_fiddleId}"
+else
+ _dir="${_fiddleId}-${_name}"
+fi
+
+mkdir "$_dir"
+
+if [[ -n $_lastRevision ]]; then
+ echo "Downloading..."
+
+ # start jobs in background
+ for (( i=_firstRevision; i<=_lastRevision; i++)); do
+ curl "https://fiddle.jshell.net/${_fiddleId}/${i}/show/" -H "Referer: http://fiddle.jshell.net/${_fiddleId}/${i}/" --output "${_dir}/${i}.html" >> /dev/null 2>&1 &
+ done
+
+ let _total=$((_lastRevision - _firstRevision))
+
+ # wait for jobs, counting as we go so we can track progress
+ while (( $(jobs | wc -l) > 0 )); do
+ _jobCount=$(jobs | wc -l)
+ let _doneCount=$(( _total - _jobCount))
+ #let _progress=$(( _doneCount / _total * 100))
+ #echo "$_progress% | $_doneCount/$_total ($_jobCount remaining)"
+ ProgressBar $_doneCount $_total
+ jobs > /dev/null
+ sleep 0.1
+ done
+ echo ""
+
+ echo "Patching..."
+
+ # patch files
+ for (( i=_firstRevision; i<=_lastRevision; i++)); do
+ { sed -i .scriptendfunk -e 's;//]]>;;g' "${_dir}/${i}.html"; sed -i .unpatched -e 's "// "https:// g' "${_dir}/${i}.html"; sed -i .stockcss -e 's;;;g' "${_dir}/${i}.html"; } &
+ done
+
+ # we run three different processes on each file, hence 3.
+ #let _total=$(( _total * 3 ))
+
+ # wait for jobs, counting as we go so we can track progress
+ while (( $(jobs | wc -l) > 0 )); do
+ _jobCount=$(jobs | wc -l)
+ let _doneCount=$(( _total - _jobCount))
+ #let _progress=$(( _doneCount / _total * 100))
+ #echo "$_progress% | $_doneCount/$_total ($_jobCount remaining)"
+ ProgressBar $_doneCount $_total
+ jobs > /dev/null
+ sleep 0.1
+ done
+ echo ""
+else
+ curl "https://fiddle.jshell.net/${_fiddleId}/show/" -H "Referer: http://fiddle.jshell.net/${_fiddleId}/" --output "${_dir}/latest.html"
+ sed -i .scriptendfunk -e 's;//]]>;;g' "${_dir}/latest.html"
+ sed -i .unpatched -e 's "// "https:// g' "${_dir}/latest.html"
+ sed -i .stockcss -e 's;;;g' "${_dir}/latest.html"
+fi