diff --git a/CHANGES.txt b/CHANGES.txt
index a2a5269..b479090 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,6 +1,12 @@
 Changes
 =======
 
+1.5b3 (2020-10-28)
+------------------
+
+- Add a --covers option, taking a quadkey, which limits the output to tiles
+  that cover the quadkey's tile (#66).
+
 1.5b2 (2020-10-16)
 ------------------
 
diff --git a/mbtiles/__init__.py b/mbtiles/__init__.py
index b918758..c8d075a 100644
--- a/mbtiles/__init__.py
+++ b/mbtiles/__init__.py
@@ -3,7 +3,7 @@
 import sys
 import warnings
 
-__version__ = "1.5b2"
+__version__ = "1.5b3"
 
 if sys.version_info < (3, 7):
     warnings.warn(
diff --git a/mbtiles/scripts/cli.py b/mbtiles/scripts/cli.py
index 17e2821..884f436 100644
--- a/mbtiles/scripts/cli.py
+++ b/mbtiles/scripts/cli.py
@@ -204,6 +204,7 @@ def extract_features(ctx, param, value):
 @click.option(
     "--progress-bar", "-#", default=False, is_flag=True, help="Display progress bar."
 )
+@click.option("--covers", help="Restrict mbtiles output to cover a quadkey")
 @click.option(
     "--cutline",
     type=click.Path(exists=True),
@@ -248,6 +249,7 @@ def mbtiles(
     rgba,
     implementation,
     progress_bar,
+    covers,
     cutline,
     open_options,
     warp_options,
@@ -351,6 +353,10 @@ def mbtiles(
                 )
                 warp_options["cutline"] = shapely.wkt.dumps(cutline_rev)
 
+        if covers is not None:
+            covers_tile = mercantile.quadkey_to_tile(covers)
+            west, south, east, north = mercantile.bounds(covers_tile)
+
         # Resolve the minimum and maximum zoom levels for export.
         if zoom_levels:
             minzoom, maxzoom = map(int, zoom_levels.split(".."))

diff --git a/tests/test_cli.py b/tests/test_cli.py
index 5808479..c17e0b4 100644
--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -483,3 +483,28 @@ def test_invalid_cutline(tmpdir, data, rgba_points_path, impl, filename):
         ],
     )
     assert result.exit_code == 1
+
+
+@pytest.mark.parametrize(("source", "quadkey", "zooms", "exp_num_results"), [("RGB.byte.tif", "0320", "4..4", 1), ("RGB.byte.tif", "032022", "6..6", 0)])
+def test_covers(tmpdir, data, source, quadkey, zooms, exp_num_results):
+    inputfile = str(data.join(source))
+    outputfile = str(tmpdir.join("export.mbtiles"))
+    runner = CliRunner()
+    result = runner.invoke(
+        main_group,
+        [
+            "mbtiles",
+            "--zoom-levels",
+            zooms,
+            "--covers",
+            quadkey,
+            inputfile,
+            outputfile,
+        ],
+    )
+    assert result.exit_code == 0
+    conn = sqlite3.connect(outputfile)
+    cur = conn.cursor()
+    cur.execute("select * from tiles")
+    results = cur.fetchall()
+    assert len(results) == exp_num_results

Add --covers option to define output extent
Would work like `--cutline` but without masking. Possible values:

* ~A GeoJSON FeatureCollection~
* A single web mercator quadkey string
* A single JSON-encoded `[x, y, z]` web mercator tile object
tests/test_cli.py::test_covers[RGB.byte.tif-0320-4..4-1] tests/test_cli.py::test_covers[RGB.byte.tif-032022-6..6-0]
tests/test_cli.py::test_cli_help tests/test_cli.py::test_dst_nodata_validation tests/test_cli.py::test_export_metadata[RGB.byte.tif] tests/test_cli.py::test_export_metadata[RGBA.byte.tif] tests/test_cli.py::test_export_overwrite tests/test_cli.py::test_export_metadata_output_opt tests/test_cli.py::test_export_tiles tests/test_cli.py::test_export_zoom tests/test_cli.py::test_export_jobs tests/test_cli.py::test_export_src_nodata tests/test_cli.py::test_export_dump tests/test_cli.py::test_export_tile_size[256] tests/test_cli.py::test_export_tile_size[512] tests/test_cli.py::test_export_bilinear tests/test_cli.py::test_skip_empty tests/test_cli.py::test_invalid_format_rgba tests/test_cli.py::test_rgba_png[RGBA.byte.tif] tests/test_cli.py::test_export_count[cf-4-10-70-RGB.byte.tif] tests/test_cli.py::test_export_count[cf-6-7-6-RGB.byte.tif] tests/test_cli.py::test_export_count[cf-4-10-12-rgb-193f513.vrt] tests/test_cli.py::test_export_count[mp-4-10-70-RGB.byte.tif] tests/test_cli.py::test_export_count[mp-6-7-6-RGB.byte.tif] tests/test_cli.py::test_export_count[mp-4-10-12-rgb-193f513.vrt] tests/test_cli.py::test_progress_bar[cf-RGBA.byte.tif] tests/test_cli.py::test_progress_bar[mp-RGBA.byte.tif] tests/test_cli.py::test_appending_export_count[cf-4-10-70-sources0] tests/test_cli.py::test_appending_export_count[mp-4-10-70-sources0] tests/test_cli.py::test_mutually_exclusive_operations tests/test_cli.py::test_input_required[inputfiles0] tests/test_cli.py::test_input_required[inputfiles1] tests/test_cli.py::test_append_or_overwrite_required tests/test_cli.py::test_cutline_progress_bar[cf-RGBA.byte.tif] tests/test_cli.py::test_cutline_progress_bar[mp-RGBA.byte.tif] tests/test_cli.py::test_invalid_cutline[cf-RGBA.byte.tif] tests/test_cli.py::test_invalid_cutline[mp-RGBA.byte.tif]