diff --git a/README.md b/README.md
index 83451c7def02e67cf0cead6da63ca147d5aaf153..5bb3aef89b3ecd0bbbc31a09956d00e74af16059 100644
--- a/README.md
+++ b/README.md
@@ -117,3 +117,8 @@ Flamenco Worker responds to the following POSIX signals:
 Run `python setup.py zip` to create a distributable zip file. It contains the Wheel,
 example configuration file, this README.md, license information and system integration
 files.
+
+Run `pyinstaller flamenco-worker.spec` to create a distributable directory in
+`dist/flamenco-worker-{version}` that contains a directly runnable Flamenco Worker.
+This build then doesn't require installing Python or any dependencies, and can be
+directly run on a target machine of the same OS.
diff --git a/flamenco-worker.py b/flamenco-worker.py
new file mode 100644
index 0000000000000000000000000000000000000000..daa23dc01d8b8ddb24ba75378a6653a6019884cd
--- /dev/null
+++ b/flamenco-worker.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python3
+
+# This script serves as entry point for PyInstaller.
+
+from flamenco_worker import cli
+
+cli.main()
diff --git a/flamenco-worker.spec b/flamenco-worker.spec
new file mode 100644
index 0000000000000000000000000000000000000000..3a097704d79d10ac8185b0be94ddb93e27b32157
--- /dev/null
+++ b/flamenco-worker.spec
@@ -0,0 +1,40 @@
+# -*- mode: python -*-
+
+# This definition is used by PyInstaller to build ready-to-run bundles.
+
+from flamenco_worker import __version__
+
+block_cipher = None
+
+
+a = Analysis(['flamenco-worker.py'],
+             pathex=['./flamenco-worker-python'],
+             binaries=[],
+             datas=[('flamenco-worker.cfg', '.'),
+                    ('README.md', '.'),
+                    ('CHANGELOG.md', '.'),
+                    ('LICENSE.txt', '.')],
+             hiddenimports=[],
+             hookspath=[],
+             runtime_hooks=[],
+             excludes=[],
+             win_no_prefer_redirects=False,
+             win_private_assemblies=False,
+             cipher=block_cipher)
+pyz = PYZ(a.pure, a.zipped_data,
+             cipher=block_cipher)
+exe = EXE(pyz,
+          a.scripts,
+          exclude_binaries=True,
+          name='flamenco-worker',
+          debug=False,
+          strip=False,
+          upx=True,
+          console=True )
+coll = COLLECT(exe,
+               a.binaries,
+               a.zipfiles,
+               a.datas,
+               strip=False,
+               upx=True,
+               name='flamenco-worker-%s' % __version__)
diff --git a/requirements-dev.txt b/requirements-dev.txt
index f122cc5e13fe465da12d6a3e4440814493b65b9f..bcd9c6e5556ce328bfa2a67dc9e23f4d8dc56fde 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1,2 +1,3 @@
 -r requirements-test.txt
 ipython
+pyinstaller