diff --git a/.circleci/config.yml b/.circleci/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..74a1ad29b8c87afe63e0412e573b3af8a538f751
--- /dev/null
+++ b/.circleci/config.yml
@@ -0,0 +1,87 @@
+# Python CircleCI 2.0 configuration file
+#
+# Check https://circleci.com/docs/2.0/language-python/ for more details
+#
+version: 2
+jobs:
+  build:
+    branches:
+      only:
+        - heroku
+    docker:
+      - image: circleci/python:3.6.6-stretch-node
+        environment:
+          DATABASE_URL: postgresql://root@localhost/opentech?sslmode=disable
+          PGHOST: localhost
+          PGUSER: root
+          DJANGO_SETTINGS_MODULE: opentech.settings.test
+          NPM_CONFIG_PRODUCTION: false
+          SEND_MESSAGES: false
+
+      - image: circleci/postgres:10.5
+        environment:
+          POSTGRES_USER: root
+          POSTGRES_DB: opentech
+
+    working_directory: ~/repo
+
+    steps:
+      - checkout
+
+      # Download and cache dependencies
+      - restore_cache:
+          keys:
+            - v1-python-{{ .Branch }}-{{ checksum "requirements.txt" }}
+            - v1-python-{{ .Branch }}-
+            - v1-python-
+
+
+      - restore_cache:
+          keys:
+            - v1-yarn-{{ .Branch }}-{{ checksum "opentech/static_src/yarn.lock" }}
+            - v1-yarn-{{ .Branch }}-
+            - v1-yarn-
+
+      - run:
+          name: install dependencies
+          command: |
+            sudo apt-get install rsync
+            python3 -m venv venv
+            . venv/bin/activate
+            pip install -r requirements.txt
+
+      - run:
+          name: buils static assets
+          command: |
+            cd opentech/static_src
+            yarn install --frozen-lockfile --cache-folder ~/.cache/yarn
+            npm run build:prod
+
+      - save_cache:
+          paths:
+            - ./venv
+          key: v1-python-{{ .Branch }}-{{ checksum "requirements.txt" }}
+
+      - save_cache:
+          paths:
+            - ~/.cache/yarn
+          key: v1-yarn-{{ .Branch }}-{{ checksum "opentech/static_src/yarn.lock" }}
+
+      # run tests!
+      # this example uses Django's built-in test-runner
+      # other common Python testing frameworks include pytest and nose
+      # https://pytest.org
+      # https://nose.readthedocs.io
+      - run:
+          name: run tests
+          command: |
+            . venv/bin/activate
+            python manage.py createcachetable
+            python manage.py collectstatic --no-input
+            python manage.py migrate
+            python manage.py test
+
+      - store_artifacts:
+          path: test-reports
+          destination: test-reports
+