diff --git a/requirements.in b/requirements.in
new file mode 100644
index 0000000000000000000000000000000000000000..14d5b5110c3ac8699f57877f43ca879545e45945
--- /dev/null
+++ b/requirements.in
@@ -0,0 +1,17 @@
+Django
+graphene
+graphene-django
+elasticsearch-dsl>=5.3.0,<6.0.0
+django-elasticsearch-dsl
+django-extensions
+pytest
+pytest-django
+pytest-env
+oic
+pyjwt
+iso8601
+arrow
+bleach
+snapshottest
+psycopg2
+dsnparse
diff --git a/requirements.txt b/requirements.txt
index 920f9cf5ae35830e5630575edc147bc17d61d71c..2dbe94ae78224439d6d10df2b1f389258e3b1bc4 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,17 +1,59 @@
-Django>=2,<2.1
-graphene>=2.0,<3.0
-graphene-django>=2.0,<3.0
-elasticsearch-dsl>=5.3.0,<6.0.0
-django-elasticsearch-dsl>=0.4.4,<0.5
-django-extensions>=1.9.9,<2.0
-pytest>=3.3,<4.0
-pytest-django>=3.1.2,<3.2
-pytest-env>=0.6.2,<0.7
-oic>=0.12.0,<0.13
-pyjwt>=1.5.3,<1.6
-iso8601>=0.1.12,<0.2
-arrow>=0.12.0,<0.13
-bleach>=2.1.1,<2.2
-snapshottest>=0.5.0,<0.6
-psycopg2>=2.7,<2.8
-dsnparse>=0.1.11,<0.2
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile --output-file requirements.txt requirements.in
+#
+alabaster==0.7.11         # via oic
+aniso8601==3.0.2          # via graphene
+arrow==0.12.1
+asn1crypto==0.24.0        # via cryptography
+atomicwrites==1.1.5       # via pytest
+attrs==18.1.0             # via pytest
+beaker==1.10.0            # via oic
+bleach==2.1.3
+certifi==2018.4.16        # via requests
+cffi==1.11.5              # via cryptography
+chardet==3.0.4            # via requests
+cryptography==2.2.2       # via pyopenssl
+django-elasticsearch-dsl==0.5.0
+django-extensions==2.0.7
+django==2.0.6
+dsnparse==0.1.11
+elasticsearch-dsl==5.4.0
+elasticsearch==5.5.3      # via elasticsearch-dsl
+future==0.16.0            # via oic, pyjwkest
+graphene-django==2.0.0
+graphene==2.1.2
+graphql-core==2.0         # via graphene, graphql-relay
+graphql-relay==0.4.5      # via graphene
+html5lib==1.0.1           # via bleach
+idna==2.7                 # via cryptography, requests
+iso8601==0.1.12
+mako==1.0.7               # via oic
+markupsafe==1.0           # via mako
+more-itertools==4.2.0     # via pytest
+oic==0.14.0
+pluggy==0.6.0             # via pytest
+promise==2.1              # via graphene, graphene-django, graphql-core, graphql-relay
+psycopg2==2.7.5
+py==1.5.3                 # via pytest
+pycparser==2.18           # via cffi
+pycryptodomex==3.6.3      # via oic, pyjwkest
+pyjwkest==1.4.0           # via oic
+pyjwt==1.6.4
+pyopenssl==18.0.0         # via oic
+pytest-django==3.3.2
+pytest-env==0.6.2
+pytest==3.6.2
+python-dateutil==2.7.3    # via arrow, elasticsearch-dsl
+pytz==2018.4              # via django
+requests==2.19.1          # via oic, pyjwkest
+rx==1.6.1                 # via graphql-core
+singledispatch==3.4.0.3   # via graphene-django
+six==1.11.0               # via bleach, cryptography, django-extensions, elasticsearch-dsl, graphene, graphene-django, graphql-core, graphql-relay, html5lib, more-itertools, oic, promise, pyjwkest, pyopenssl, pytest, python-dateutil, singledispatch, snapshottest
+snapshottest==0.5.0
+termcolor==1.1.0          # via snapshottest
+typing==3.6.4             # via promise
+urllib3==1.23             # via elasticsearch, requests
+webencodings==0.5.1       # via html5lib