diff --git a/.travis.yml b/.travis.yml
index f7ccc54f6c3e65228a1ab91ed8fabe3ca0db6dda..58f628c3441462d3d1b11fdf65f8ec7dfcba4670 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -51,15 +51,7 @@ install:
   - source activate test-environment
   - ldd $HOME/miniconda/envs/test-environment/lib/qt5/plugins/platforms/*.so
   - pip install coveralls
-  - pip install pylibscrypt
-  - pip install libnacl
-  - pip install requests
-  - pip install base58
-  - pip install quamash
-  - pip install aiohttp
-  - pip install jsonschema
-  - pip install git+https://github.com/ucoin-io/ucoin-python-api.git
-  - pip install git+https://github.com/Insoleet/pretenders.git@develop
+  - pip install -r requirements.txt
   - python gen_resources.py
   - python gen_translations.py
   - python setup.py build
diff --git a/ci/appveyor/build.cmd b/ci/appveyor/build.cmd
index 308be15b301a3bcda38d7210f044d11e95e26864..bd4410c0b09eb36a4b4391aff179bddf92770125 100644
--- a/ci/appveyor/build.cmd
+++ b/ci/appveyor/build.cmd
@@ -11,15 +11,7 @@ pyrcc5 -version
 
 lrelease -version
 
-pip install pylibscrypt
-pip install libnacl
-pip install requests
-pip install base58
-pip install git+https://github.com/Insoleet/quamash.git@sockets_only
-pip install aiohttp
-pip install jsonschema
-pip install git+https://github.com/ucoin-io/ucoin-python-api.git
-pip install pretenders
+pip install -r requirements.txt
 
 python gen_resources.py
 if %errorlevel% neq 0 exit /b 1s
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..635144a1005f91e4eeb89d5e52f38f14c4956af1
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,9 @@
+pylibscrypt
+libnacl
+requests
+base58
+aiohttp
+jsonschema
+pretenders
+git+https://github.com/ucoin-io/ucoin-python-api.git
+git+https://github.com/Insoleet/quamash.git@sockets_only
\ No newline at end of file