diff --git a/configure.py b/configure.py
new file mode 100755
index 0000000..123d3cb
--- /dev/null
+++ b/configure.py
@@ -0,0 +1,160 @@
+#!/usr/bin/env python3
+import requests
+import argparse
+import os
+import glob
+import yaml
+import logging
+import sys
+import csv
+import re
+
+
+def load_yaml(yaml_file):
+    with open(yaml_file, "r") as stream:
+        return (yaml.safe_load(stream))
+
+
+def write_user_config(module_name, sources):
+    filename = 'user_config.tcl'
+    with open(os.path.join('src', filename), 'w') as fh:
+        fh.write("set ::env(DESIGN_NAME) {}\n".format(module_name))
+        fh.write('set ::env(VERILOG_FILES) "\\\n')
+        for line, source in enumerate(sources):
+            fh.write("    $::env(DESIGN_DIR)/" + source)
+            if line != len(sources) - 1:
+                fh.write(' \\\n')
+        fh.write('"\n')
+
+
+def get_project_source(yaml):
+    # wokwi_id must be an int or 0
+    try:
+        wokwi_id = int(yaml['project']['wokwi_id'])
+    except ValueError:
+        logging.error("wokwi id must be an integer")
+        exit(1)
+
+    # it's a wokwi project
+    if wokwi_id != 0:
+        url = "https://wokwi.com/api/projects/{}/verilog".format(wokwi_id)
+        logging.info("trying to download {}".format(url))
+        r = requests.get(url)
+        if r.status_code != 200:
+            logging.warning("couldn't download {}".format(url))
+            exit(1)
+
+        filename = "user_module_{}.v".format(wokwi_id)
+        with open(os.path.join('src', filename), 'wb') as fh:
+            fh.write(r.content)
+
+        # also fetch the wokwi diagram
+        url = "https://wokwi.com/api/projects/{}/diagram.json".format(wokwi_id)
+        logging.info("trying to download {}".format(url))
+        r = requests.get(url)
+        if r.status_code != 200:
+            logging.warning("couldn't download {}".format(url))
+            exit(1)
+
+        with open(os.path.join('src', "wokwi_diagram.json"), 'wb') as fh:
+            fh.write(r.content)
+
+        return [filename, 'cells.v']
+
+    # else it's HDL, so check source files
+    else:
+        if 'source_files' not in yaml['project']:
+            logging.error("source files must be provided if wokwi_id is set to 0")
+            exit(1)
+
+        source_files = yaml['project']['source_files']
+        if source_files is None:
+            logging.error("must be more than 1 source file")
+            exit(1)
+
+        if len(source_files) == 0:
+            logging.error("must be more than 1 source file")
+            exit(1)
+
+        if 'top_module' not in yaml['project']:
+            logging.error("must provide a top module name")
+            exit(1)
+
+        return source_files
+
+
+# documentation
+def check_docs(yaml):
+    for key in ['author', 'title', 'description', 'how_it_works', 'how_to_test', 'language']:
+        if key not in yaml['documentation']:
+            logging.error("missing key {} in documentation".format(key))
+            exit(1)
+        if yaml['documentation'][key] == "":
+            logging.error("missing value for {} in documentation".format(key))
+            exit(1)
+
+    # if provided, check discord handle is valid
+    if len(yaml['documentation']['discord']):
+        parts = yaml['documentation']['discord'].split('#')
+        if len(parts) != 2 or len(parts[0]) == 0 or not re.match('^[0-9]{4}$', parts[1]):
+            logging.error(f'Invalid format for discord username')
+            exit(1)
+
+
+def get_top_module(yaml):
+    wokwi_id = int(yaml['project']['wokwi_id'])
+    if wokwi_id != 0:
+        return "user_module_{}".format(wokwi_id)
+    else:
+        return yaml['project']['top_module']
+
+
+def get_stats():
+    with open('runs/wokwi/reports/metrics.csv') as f:
+        report = list(csv.DictReader(f))[0]
+
+    print('# Routing stats')
+    print()
+    print('| Utilisation | Wire length (um) |')
+    print('|-------------|------------------|')
+    print('| {} | {} |'.format(report['OpenDP_Util'], report['wire_length']))
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser(description="TT setup")
+
+    parser.add_argument('--check-docs', help="check the documentation part of the yaml", action="store_const", const=True)
+    parser.add_argument('--get-stats', help="print some stats from the run", action="store_const", const=True)
+    parser.add_argument('--create-user-config', help="create the user_config.tcl file with top module and source files", action="store_const", const=True)
+    parser.add_argument('--debug', help="debug logging", action="store_const", dest="loglevel", const=logging.DEBUG, default=logging.INFO)
+    parser.add_argument('--yaml', help="yaml file to load", default='info.yaml')
+
+    args = parser.parse_args()
+    # setup log
+    log_format = logging.Formatter('%(asctime)s - %(module)-10s - %(levelname)-8s - %(message)s')
+    # configure the client logging
+    log = logging.getLogger('')
+    # has to be set to debug as is the root logger
+    log.setLevel(args.loglevel)
+
+    # create console handler and set level to info
+    ch = logging.StreamHandler(sys.stdout)
+    # create formatter for console
+    ch.setFormatter(log_format)
+    log.addHandler(ch)
+
+    if args.get_stats:
+        get_stats()
+
+    elif args.check_docs:
+        logging.info("checking docs")
+        config = load_yaml(args.yaml)
+        check_docs(config)
+
+    elif args.create_user_config:
+        logging.info("creating include file")
+        config = load_yaml(args.yaml)
+        source_files = get_project_source(config)
+        top_module = get_top_module(config)
+        assert top_module != 'top'
+        write_user_config(top_module, source_files)
diff --git a/info.yaml b/info.yaml
new file mode 100644
index 0000000..482c112
--- /dev/null
+++ b/info.yaml
@@ -0,0 +1,46 @@
+--- 
+# TinyTapeout project information
+project:
+  wokwi_id:    0        # If using wokwi, set this to your project's ID
+#  source_files:        # If using an HDL, set wokwi_id as 0 and uncomment and list your source files here. Source files must be in ./src
+#    - counter.v
+#    - decoder.v
+#  top_module:  "seven_segment_seconds"      # put the name of your top module here, make it unique by prepending your github username
+
+# As everyone will have access to all designs, try to make it easy for someone new to your design to know what
+# it does and how to operate it.
+#
+# Here is an example: https://github.com/mattvenn/tinytapeout_m_segments/blob/main/info.yaml
+#
+# This info will be automatically collected and used to make a datasheet for the chip.
+documentation: 
+  author:       ""      # Your name
+  discord:      ""      # Your discord handle - make sure to include the # part as well
+  title:        ""      # Project title
+  description:  ""      # Short description of what your project does
+  how_it_works: ""      # Longer description of how the project works
+  how_to_test:  ""      # Instructions on how someone could test your project, include things like what buttons do what and how to set the clock if needed
+  external_hw:  ""      # Describe any external hardware needed
+  language:     "wokwi" # other examples include Verilog, Amaranth, VHDL, etc
+  doc_link:     ""      # URL to longer form documentation, eg the README.md in your repository
+  clock_hz:     0       # Clock frequency in Hz (if required) we are expecting max clock frequency to be ~6khz. Provided on input 0.
+  picture:      ""      # relative path to a picture in your repository
+  inputs:               # a description of what the inputs do
+    - clock
+    - reset
+    - none
+    - none
+    - none
+    - none
+    - none
+    - none
+  outputs:
+    - segment a         # a description of what the outputs do
+    - segment b
+    - segment c
+    - segment d
+    - segment e
+    - segment f
+    - segment g
+    - none
+
