diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d3ab1fb0e0318d910e20670f72aa3e0233fb734c..c38a3fc3d5f8057905b3e70acfb1c76a4a87e680 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -8,5 +8,5 @@ include:
 install-wheel:
   extends: .install-wheel
   script:
-    - python3 -m yamltool
-    - yt
+    - python3 -m yamltool -h
+    - yt -h
diff --git a/README.rst b/README.rst
index 25a51ef1ae8484674f5d23b413976e74a2d78a84..46f8cf9f5ffd32fab169a3b8e1fe269d8b919576 100644
--- a/README.rst
+++ b/README.rst
@@ -7,6 +7,26 @@ This tool provides a simple command line interface to validate and pretty-print
 YAML documents while trying to preserve as much as possible from the original
 documents (like comments and anchors).
 
+Usage
+-----
+
+.. code:: shell
+
+   usage: yt [-h] [infile] [outfile]
+
+   YAML tool, a clone of the json.tool Python module for YAML.
+
+   This tool provides a simple command line interface to validate and pretty-print
+   YAML documents while trying to preserve as much as possible from the original
+   documents (like comments and anchors).
+
+   positional arguments:
+     infile      a YAML file to be validated or pretty-printed
+     outfile     write the output of infile to outfile
+
+     optional arguments:
+       -h, --help  show this help message and exit
+
 License
 -------
 
diff --git a/yamltool/__main__.py b/yamltool/__main__.py
index 2346b0e77329ed8d275726d9a1a0d8da017ba015..a978124242148e6be1316a86befc35d5315c08a6 100644
--- a/yamltool/__main__.py
+++ b/yamltool/__main__.py
@@ -6,10 +6,50 @@ documents (like comments and anchors).
 """
 
 
+import argparse
+import pathlib
+import sys
+import ruamel.yaml  # pylint: disable=import-error
+
+
 def main():
     """Main entrypoint."""
-    return
+    parser = argparse.ArgumentParser(
+        description=__doc__,
+        formatter_class=argparse.RawDescriptionHelpFormatter,
+    )
+    parser.add_argument(
+        "infile",
+        nargs="?",
+        type=argparse.FileType(encoding="utf-8"),
+        help="a YAML file to be validated or pretty-printed",
+        default=sys.stdin,
+    )
+    parser.add_argument(
+        "outfile",
+        nargs="?",
+        type=pathlib.Path,
+        help="write the output of infile to outfile",
+        default=None,
+    )
+    options = parser.parse_args()
+    with options.infile as infile:
+        try:
+            yaml = ruamel.yaml.YAML(typ="rt")
+            yaml.explicit_start = True
+            yaml.indent(mapping=2, sequence=4, offset=2)
+            yaml.preserve_quotes = True
+            if options.outfile is None:
+                out = sys.stdout
+            else:
+                out = options.outfile.open("w", encoding="utf-8")
+            yaml.dump_all(yaml.load_all(infile), out)
+        except Exception as ex:
+            raise SystemExit(ex)  # pylint: disable=raise-missing-from
 
 
 if __name__ == "__main__":
-    main()
+    try:
+        main()
+    except BrokenPipeError as exc:
+        sys.exit(exc.errno)