diff --git a/src/temporal/t.stac/libstac/staclib.py b/src/temporal/t.stac/libstac/staclib.py
index 330db53eb9..026a74bf89 100644
--- a/src/temporal/t.stac/libstac/staclib.py
+++ b/src/temporal/t.stac/libstac/staclib.py
@@ -20,6 +20,8 @@
 import json
 from datetime import datetime
 from dateutil import parser
+from io import StringIO
+from pprint import pprint
 import grass.script as gs
 from grass.exceptions import CalledModuleError
 from grass.pygrass.vector import VectorTopo
@@ -90,7 +92,7 @@ def get_all_collections(self):
             gs.fatal(_("Error getting collections: {}".format(e)))
 
     def get_collection(self, collection_id):
-        """Get a collection from STAC Client"""
+        """Get a collection frofrom io import StringIOm STAC Client"""
         try:
             collection = self.client.get_collection(collection_id)
             self.collection = collection.to_dict()
@@ -120,7 +122,7 @@ def search_api(self, **kwargs):
             gs.fatal(_("Error searching STAC API: {}".format(e)))
 
         try:
-            sys.stdout.write(f"Search Matched: {search.matched()} items\n")
+            gs.message(_(f"Search Matched: {search.matched()} items"))
         except e:
             gs.warning(_(f"No items found: {e}"))
             return None
@@ -267,6 +269,17 @@ def print_summary(data, depth=1):
             sys.stdout.write(f"# {indentation}{key}: {value}\n")
 
 
+def print_json_to_stdout(data, pretty=False):
+    """Pretty print data to stdout"""
+    if pretty:
+        output = StringIO()
+        pprint(data, stream=output)
+        sys.stdout.write(output.getvalue())
+    else:
+        json_output = json.dumps(data)
+        sys.stdout.write(json_output)
+
+
 def print_list_attribute(data, title):
     "Print a list attribute"
     sys.stdout.write(f"{'-' * 75}\n")
@@ -403,7 +416,6 @@ def region_to_wgs84_decimal_degrees_bbox():
         float(c)
         for c in [region["ll_w"], region["ll_s"], region["ll_e"], region["ll_n"]]
     ]
-    sys.stdout.write("BBOX: {}\n".format(bbox))
     return bbox
 
 
diff --git a/src/temporal/t.stac/t.stac.catalog/t.stac.catalog.py b/src/temporal/t.stac/t.stac.catalog/t.stac.catalog.py
index 37eb48dd11..d17bc2df38 100644
--- a/src/temporal/t.stac/t.stac.catalog/t.stac.catalog.py
+++ b/src/temporal/t.stac/t.stac.catalog/t.stac.catalog.py
@@ -161,13 +161,7 @@ def main():
                 return None
         else:
             client_dict = client.to_dict()
-            if pretty_print:
-                output = StringIO()
-                pprint(client_dict, stream=output)
-                sys.stdout.write(output.getvalue())
-            else:
-                json_output = json.dumps(client.to_dict())
-                sys.stdout.write(json_output)
+            libstac.print_json_to_stdout(client_dict, pretty_print)
 
     except Exception as e:
         gs.fatal(_("Error: {}".format(e)))
diff --git a/src/temporal/t.stac/t.stac.collection/t.stac.collection.py b/src/temporal/t.stac/t.stac.collection/t.stac.collection.py
index e71998ff99..f1c38c4a5f 100644
--- a/src/temporal/t.stac/t.stac.collection/t.stac.collection.py
+++ b/src/temporal/t.stac/t.stac.collection/t.stac.collection.py
@@ -149,14 +149,8 @@ def main():
             if basic_info:
                 return libstac.print_basic_collection_info(collection_dict)
             return libstac.print_summary(collection_dict)
-        else:
-            if pretty_print:
-                output = StringIO()
-                pprint(collection_dict, stream=output)
-                sys.stdout.write(output.getvalue())
-            else:
-                json_output = json.dumps(collection_dict)
-                sys.stdout.write(json_output)
+        elif format == "json":
+            return libstac.print_json_to_stdout(collection_dict, pretty_print)
 
 
 if __name__ == "__main__":
diff --git a/src/temporal/t.stac/t.stac.item/t.stac.item.py b/src/temporal/t.stac/t.stac.item/t.stac.item.py
index a4ce9a3199..eead0c7f3c 100644
--- a/src/temporal/t.stac/t.stac.item/t.stac.item.py
+++ b/src/temporal/t.stac/t.stac.item/t.stac.item.py
@@ -251,6 +251,11 @@
 # % description: Dowload and import assets
 # %end
 
+# %flag
+# % key: p
+# % description: Pretty print the JSON output
+# %end
+
 # %option G_OPT_M_NPROCS
 # %end
 
@@ -261,6 +266,7 @@
 import sys
 from pprint import pprint
 import json
+from io import StringIO
 from contextlib import contextmanager
 import grass.script as gs
 from grass.pygrass.utils import get_lib_path
@@ -347,6 +353,7 @@ def main():
     item_metadata = flags["i"]
     asset_metadata = flags["a"]
     download = flags["d"]
+    pretty_print = flags["p"]  # optional
 
     # Output options
     strds_output = options["strds_output"]  # optional
@@ -378,13 +385,9 @@ def main():
         if format == "plain":
             return libstac.collection_metadata(collection)
         elif format == "json":
-            return json.dumps(collection)
-        else:
-            # Return plain text by default
-            return libstac.collection_metadata(collection)
+            return libstac.print_json_to_stdout(collection, pretty_print)
 
     # Start item search
-
     if intersects:
         # Convert the vector to a geojson
         output_geojson = "tmp_stac_intersects.geojson"
@@ -403,7 +406,7 @@ def main():
 
     # Set the bbox to the current region if the user did not specify the bbox or intersects option
     if not bbox and not intersects:
-        gs.message(_("Setting bbox to current region: {}".format(bbox)))
+        gs.verbose(_("Setting bbox to current region: {}".format(bbox)))
         bbox = libstac.region_to_wgs84_decimal_degrees_bbox()
 
     if datetime:
@@ -450,12 +453,14 @@ def main():
     # Report item metadata
     if item_metadata:
         if format == "plain":
+            gs.message(_("bbox: {}\n".format(bbox)))
             gs.message(_(f"Items Found: {len(list(items))}"))
             for item in items:
                 stac_helper.report_stac_item(item)
             return None
         if format == "json":
-            return json.dumps([item.to_dict() for item in items])
+            item_list = [item.to_dict() for item in items]
+            return libstac.print_json_to_stdout(item_list, pretty_print)
 
     for item in items:
         asset = collect_item_assets(item, asset_keys, asset_roles=item_roles)
@@ -466,13 +471,16 @@ def main():
         strds_output = os.path.abspath(strds_output)
         libstac.register_strds_from_items(collection_items_assets, strds_output)
 
-    gs.message(_(f"{len(collection_items_assets)} Assets Ready for download..."))
     if asset_metadata:
-        for asset in collection_items_assets:
-            if format == "plain":
+        if format == "plain":
+            gs.message(
+                _(f"{len(collection_items_assets)} Assets Ready for download...")
+            )
+            for asset in collection_items_assets:
                 libstac.report_plain_asset_summary(asset)
-            if format == "json":
-                return pprint(asset)
+
+        if format == "json":
+            return libstac.print_json_to_stdout(collection_items_assets, pretty_print)
 
     if download:
         # Download and Import assets