diff --git a/requirements.txt b/requirements.txt
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,4 @@
 Click
 Deprecated
 PyYAML
+sentry-sdk
diff --git a/swh/core/cli/__init__.py b/swh/core/cli/__init__.py
--- a/swh/core/cli/__init__.py
+++ b/swh/core/cli/__init__.py
@@ -9,6 +9,7 @@
 
 import click
 import pkg_resources
+import sentry_sdk
 import yaml
 
 LOG_LEVEL_NAMES = ['NOTSET', 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']
@@ -65,13 +66,20 @@
 @click.option('--log-config', default=None,
               type=click.File('r'),
               help="Python yaml logging configuration file.")
+@click.option('--sentry-dsn', default=None,
+              help="DSN of the Sentry instance to report to")
+@click.option('--sentry-debug/--no-sentry-debug',
+              help="Enable debugging of sentry")
 @click.pass_context
-def swh(ctx, log_level, log_config):
+def swh(ctx, log_level, log_config, sentry_dsn, sentry_debug):
     """Command line interface for Software Heritage.
     """
     signal.signal(signal.SIGTERM, clean_exit_on_signal)
     signal.signal(signal.SIGINT, clean_exit_on_signal)
 
+    if sentry_dsn:
+        sentry_sdk.init(dsn=sentry_dsn, debug=sentry_debug)
+
     if log_level is None and log_config is None:
         log_level = 'INFO'
 
diff --git a/swh/core/tests/test_cli.py b/swh/core/tests/test_cli.py
--- a/swh/core/tests/test_cli.py
+++ b/swh/core/tests/test_cli.py
@@ -1,7 +1,11 @@
-#
+# Copyright (C) 2019  The Software Heritage developers
+# See the AUTHORS file at the top-level directory of this distribution
+# License: GNU General Public License version 3, or any later version
+# See top-level LICENSE file for more information
 
 import logging
 import textwrap
+from unittest.mock import patch
 
 import click
 from click.testing import CliRunner
@@ -45,7 +49,9 @@
         click.echo('Hello SWH!')
 
     runner = CliRunner()
-    result = runner.invoke(swhmain, ['test'])
+    with patch('sentry_sdk.init') as sentry_sdk_init:
+        result = runner.invoke(swhmain, ['test'])
+    sentry_sdk_init.assert_not_called()
     assert result.exit_code == 0
     assert result.output.strip() == 'Hello SWH!'
 
@@ -90,6 +96,63 @@
     assert result.output.strip() == '''Hello SWH!'''
 
 
+def test_sentry(swhmain):
+    @swhmain.command(name='test')
+    @click.pass_context
+    def swhtest(ctx):
+        click.echo('Hello SWH!')
+
+    runner = CliRunner()
+    with patch('sentry_sdk.init') as sentry_sdk_init:
+        result = runner.invoke(swhmain, ['--sentry-dsn', 'test_dsn', 'test'])
+    assert result.exit_code == 0
+    assert result.output.strip() == '''Hello SWH!'''
+    sentry_sdk_init.assert_called_once_with(
+        dsn='test_dsn',
+        debug=False,
+    )
+
+
+def test_sentry_debug(swhmain):
+    @swhmain.command(name='test')
+    @click.pass_context
+    def swhtest(ctx):
+        click.echo('Hello SWH!')
+
+    runner = CliRunner()
+    with patch('sentry_sdk.init') as sentry_sdk_init:
+        result = runner.invoke(
+            swhmain, ['--sentry-dsn', 'test_dsn', '--sentry-debug', 'test'])
+    assert result.exit_code == 0
+    assert result.output.strip() == '''Hello SWH!'''
+    sentry_sdk_init.assert_called_once_with(
+        dsn='test_dsn',
+        debug=True,
+    )
+
+
+def test_sentry_env(swhmain):
+    @swhmain.command(name='test')
+    @click.pass_context
+    def swhtest(ctx):
+        click.echo('Hello SWH!')
+
+    runner = CliRunner()
+    with patch('sentry_sdk.init') as sentry_sdk_init:
+        env = {
+            'SWH_SENTRY_DSN': 'test_dsn',
+            'SWH_SENTRY_DEBUG': '1',
+        }
+        result = runner.invoke(
+            swhmain, ['test'], env=env, auto_envvar_prefix='SWH')
+    assert result.exit_code == 0
+    assert result.output.strip() == '''Hello SWH!'''
+    sentry_sdk_init.assert_called_once_with(
+        dsn='test_dsn',
+        debug=True,
+    )
+
+
 @pytest.fixture
 def log_config_path(tmp_path):
     log_config = textwrap.dedent('''\