check if release exists before attempting to create it again
more part-saving optimisations for certain scenarios
convert start.py to use concurrent.futures instead of multiprocessing.pool