diff --git a/projects/proquint/BUILD b/projects/proquint/BUILD
index 6df8403..05257fc 100644
--- a/projects/proquint/BUILD
+++ b/projects/proquint/BUILD
@@ -4,3 +4,14 @@ py_project(
         py_requirement("hypothesis"),
     ],
 )
+
+zapp_binary(
+    name = "qint",
+    main = "src/python/proquint/__main__.py",
+    imports = [
+        "src/python",
+    ],
+    deps = [
+        ":proquint",
+    ],
+)
diff --git a/projects/proquint/src/python/proquint.py b/projects/proquint/src/python/proquint/__init__.py
similarity index 100%
rename from projects/proquint/src/python/proquint.py
rename to projects/proquint/src/python/proquint/__init__.py
diff --git a/projects/proquint/src/python/proquint/__main__.py b/projects/proquint/src/python/proquint/__main__.py
new file mode 100644
index 0000000..1599502
--- /dev/null
+++ b/projects/proquint/src/python/proquint/__main__.py
@@ -0,0 +1,33 @@
+"""A CLI program for interacting with proquints."""
+
+import argparse
+from secrets import randbits
+import uuid
+
+from proquint import Proquint
+
+
+parser = argparse.ArgumentParser()
+g = parser.add_mutually_exclusive_group()
+g.add_argument("-g", "--generate", dest="generate", default=False, action="store_true")
+g.add_argument("-p", "--predictable", dest="predictable", default=False, action="store_true")
+g.add_argument("-d", "--decode", dest="decode", default=False, action="store_true")
+g.add_argument("-e", "--encode", dest="encode", default=False, action="store_true")
+parser.add_argument("-w", "--width", dest="width", type=int, default=32)
+
+
+def main():
+    opts, args = parser.parse_known_args()
+
+    if opts.generate:
+        print(Proquint.encode(randbits(opts.width), opts.width))
+    elif opts.predictable:
+        print(Proquint.encode(uuid.getnode(), 32))
+    elif opts.encode:
+        print(Proquint.encode(int(args[0]), opts.width))
+    elif opts.decode:
+        print(Proquint.decode(args[0]))
+
+
+if __name__ == "__main__":
+    main()