docs: def setup_experiment(debug=True, verbose=False, app=None):
      """Check the app and, if it's compatible with Wallace, freeze its state."""
      print_header()
  
      # Verify that the package is usable.
      log("Verifying that directory is compatible with Wallace...")
      if not verify_package(verbose=verbose):
          raise AssertionError(
              "This is not a valid Wallace app. " +
              "Fix the errors and then try running 'wallace verify'.")
  
      # Verify that the Postgres server is running.
      try:
          psycopg2.connect(database="x", user="postgres", password="nada")
      except psycopg2.OperationalError, e:
          if "could not connect to server" in str(e):
              raise RuntimeError("The Postgres server isn't running.")
  
      # Load psiTurk configuration.
      config = PsiturkConfig()
      config.load_config()
  
      # Check that the demo-specific requirements are satisfied.
      try:
          with open("requirements.txt", "r") as f:
              dependencies = f.readlines()
      except:
          dependencies = []
  
      pkg_resources.require(dependencies)
  
      # Generate a unique id for this experiment.
      id = "w" + str(uuid.uuid4())[0:28]
  
      # If the user provided an app name, use it everywhere that's user-facing.
      if app:
          id_long = id
          id = str(app)
  
      log("Running as experiment " + id + "...")
  
      # Copy this directory into a temporary folder, ignoring .git
      dst = os.path.join(tempfile.mkdtemp(), id)
      to_ignore = shutil.ignore_patterns(
          ".git/*",
          "*.db",
          "snapshots",
          "data",
          "server.log"
      )
      shutil.copytree(os.getcwd(), dst, ignore=to_ignore)
  
      click.echo(dst)
  
      # Save the experiment id
      with open(os.path.join(dst, "experiment_id.txt"), "w") as file:
          if app:
              file.write(id_long)
          else:
              file.write(id)
  
      # Zip up the temporary directory and place it in the cwd.
      if not debug:
          log("Freezing the experiment package...")
          shutil.make_archive(
              os.path.join("snapshots", id + "-code"), "zip", dst)
  
      # Change directory to the temporary folder.
      cwd = os.getcwd()
      os.chdir(dst)
  
      # Check directories.
      if not os.path.exists("static/scripts"):
          os.makedirs("static/scripts")
      if not os.path.exists("templates"):
          os.makedirs("templates")
      if not os.path.exists("static/css"):
          os.makedirs("static/css")
  
      # Rename experiment.py to wallace_experiment.py to aviod psiTurk conflict.
      os.rename(
          os.path.join(dst, "experiment.py"),
          os.path.join(dst, "wallace_experiment.py"))
  
      # Copy files into this experiment package.
      src = os.path.join(
          os.path.dirname(os.path.realpath(__file__)),
          "custom.py")
      shutil.copy(src, os.path.join(dst, "custom.py"))
  
      heroku_files = [
          "Procfile",
          "requirements.txt",
          "psiturkapp.py",
          "worker.py",
          "clock.py",
      ]
  
      for filename in heroku_files:
          src = os.path.join(
              os.path.dirname(os.path.realpath(__file__)),
              "heroku",
              filename)
          shutil.copy(src, os.path.join(dst, filename))
  
      clock_on = config.getboolean('Server Parameters', 'clock_on')
  
      # If the clock process has been disabled, overwrite the Procfile.
      if not clock_on:
          src = os.path.join(
              os.path.dirname(os.path.realpath(__file__)),
              "heroku",
              "Procfile_no_clock")
          shutil.copy(src, os.path.join(dst, "Procfile"))
  
      frontend_files = [
          "static/css/wallace.css",
          "static/scripts/wallace.js",
          "static/scripts/reqwest.min.js",
          "templates/error_wallace.html",
          "templates/launch.html",
          "templates/complete.html",
          "static/robots.txt"
      ]
  
      for filename in frontend_files:
          src = os.path.join(
              os.path.dirname(os.path.realpath(__file__)),
              "frontend",
              filename)
          shutil.copy(src, os.path.join(dst, filename))
  
      time.sleep(0.25)
  
      os.chdir(cwd)
  
      return (id, dst)