diff --git a/README.md b/README.md
index c59e351..5763df6 100644
--- a/README.md
+++ b/README.md
@@ -232,6 +232,9 @@ theme=zt_dark
 ## Autohide: set to 'autohide' to hide the left & right panels except when they're focused
 autohide=no_autohide
 
+## Exit Confirmation: set to 'disabled' to exit directly with no warning popup first
+exit_confirmation=enabled
+
 ## Footlinks: set to 'disabled' to hide footlinks; 'enabled' will show the first 3 per message
 ## For more flexibility, comment-out this value, and un-comment maximum-footlinks below
 footlinks=enabled
diff --git a/zulipterminal/cli/run.py b/zulipterminal/cli/run.py
index 87794e9..a3ccd9d 100755
--- a/zulipterminal/cli/run.py
+++ b/zulipterminal/cli/run.py
@@ -61,6 +61,7 @@ requests_logger.setLevel(logging.DEBUG)
 VALID_BOOLEAN_SETTINGS: Dict[str, Tuple[str, str]] = {
     "autohide": ("autohide", "no_autohide"),
     "notify": ("enabled", "disabled"),
+    "exit_confirmation": ("enabled", "disabled"),
 }
 
 COLOR_DEPTH_ARGS_TO_DEPTHS: Dict[str, int] = {
@@ -78,10 +79,14 @@ DEFAULT_SETTINGS = {
     "footlinks": "enabled",
     "color-depth": "256",
     "maximum-footlinks": "3",
+    "exit_confirmation": "enabled",
 }
 assert DEFAULT_SETTINGS["autohide"] in VALID_BOOLEAN_SETTINGS["autohide"]
 assert DEFAULT_SETTINGS["notify"] in VALID_BOOLEAN_SETTINGS["notify"]
 assert DEFAULT_SETTINGS["color-depth"] in COLOR_DEPTH_ARGS_TO_DEPTHS
+assert (
+    DEFAULT_SETTINGS["exit_confirmation"] in VALID_BOOLEAN_SETTINGS["exit_confirmation"]
+)
 
 
 def in_color(color: str, text: str) -> str:
@@ -537,6 +542,7 @@ def main(options: Optional[List[str]] = None) -> None:
                 incomplete_theme_text += "      (all themes are incomplete)"
             print(in_color("yellow", incomplete_theme_text))
         print_setting("autohide setting", zterm["autohide"])
+        print_setting("exit confirmation setting", zterm["exit_confirmation"])
         if zterm["footlinks"].source == ConfigSource.ZULIPRC:
             print_setting(
                 "maximum footlinks value",
diff --git a/zulipterminal/core.py b/zulipterminal/core.py
index f93d89e..2799210 100644
--- a/zulipterminal/core.py
+++ b/zulipterminal/core.py
@@ -70,12 +70,14 @@ class Controller:
         in_explore_mode: bool,
         autohide: bool,
         notify: bool,
+        exit_confirmation: bool,
     ) -> None:
         self.theme_name = theme_name
         self.theme = theme
         self.color_depth = color_depth
         self.in_explore_mode = in_explore_mode
         self.autohide = autohide
+        self.exit_confirmation = exit_confirmation
         self.notify_enabled = notify
         self.maximum_footlinks = maximum_footlinks
 
@@ -107,7 +109,12 @@ class Controller:
         self._exception_pipe = self.loop.watch_pipe(self._raise_exception)
 
         # Register new ^C handler
-        signal.signal(signal.SIGINT, self.exit_handler)
+        signal.signal(
+            signal.SIGINT,
+            self.prompting_exit_handler
+            if self.exit_confirmation
+            else self.no_prompt_exit_handler,
+        )
 
     def raise_exception_in_main_thread(
         self, exc_info: ExceptionInfo, *, critical: bool
@@ -621,7 +628,10 @@ class Controller:
         self.client.deregister(queue_id, 1.0)
         sys.exit(0)
 
-    def exit_handler(self, signum: int, frame: Any) -> None:
+    def no_prompt_exit_handler(self, signum: int, frame: Any) -> None:
+        self.deregister_client()
+
+    def prompting_exit_handler(self, signum: int, frame: Any) -> None:
         question = urwid.Text(
             ("bold", " Please confirm that you wish to exit Zulip-Terminal "),
             "center",

diff --git a/tests/cli/test_run.py b/tests/cli/test_run.py
index f1fde1c..7b4fe02 100644
--- a/tests/cli/test_run.py
+++ b/tests/cli/test_run.py
@@ -199,6 +199,7 @@ def test_valid_zuliprc_but_no_connection(
         "Loading with:",
         "   theme 'zt_dark' specified from default config.",
         "   autohide setting 'no_autohide' specified from default config.",
+        "   exit confirmation setting 'enabled' specified from default config.",
         "   maximum footlinks value '3' specified from default config.",
         "   color depth setting '256' specified from default config.",
         "   notify setting 'disabled' specified from default config.",
@@ -257,6 +258,7 @@ def test_warning_regarding_incomplete_theme(
         "\x1b[93m   WARNING: Incomplete theme; results may vary!",
         f"      {expected_warning}\x1b[0m",
         "   autohide setting 'no_autohide' specified from default config.",
+        "   exit confirmation setting 'enabled' specified from default config.",
         "   maximum footlinks value '3' specified from default config.",
         "   color depth setting '256' specified from default config.",
         "   notify setting 'disabled' specified from default config.",
@@ -475,6 +477,7 @@ def test_successful_main_function_with_config(
         "Loading with:",
         "   theme 'zt_dark' specified in zuliprc file (by alias 'default').",
         "   autohide setting 'autohide' specified in zuliprc file.",
+        "   exit confirmation setting 'enabled' specified from default config.",
         f"   maximum footlinks value {footlinks_output}",
         "   color depth setting '256' specified in zuliprc file.",
         "   notify setting 'enabled' specified in zuliprc file.",
diff --git a/tests/core/test_core.py b/tests/core/test_core.py
index 9f13a40..033f126 100644
--- a/tests/core/test_core.py
+++ b/tests/core/test_core.py
@@ -48,6 +48,7 @@ class TestController:
         self.in_explore_mode = False
         self.autohide = True  # FIXME Add tests for no-autohide
         self.notify_enabled = False
+        self.exit_confirmation = True
         self.maximum_footlinks = 3
         result = Controller(
             config_file=self.config_file,
@@ -60,6 +61,7 @@ class TestController:
             **dict(
                 autohide=self.autohide,
                 notify=self.notify_enabled,
+                exit_confirmation=self.exit_confirmation,
             ),
         )
         result.view.message_view = mocker.Mock()  # set in View.__init__

Add popup to confirm exiting the application
I raised a concern over this some time ago in [#zulip-terminal>Confirm before exiting? #T1341](https://chat.zulip.org/#narrow/stream/206-zulip-terminal/topic/Confirm.20before.20exiting.3F.20.23T1341); see there for motivation.

The design for this could be as follows:
- reuse our existing confirmation popup to trigger on the exit keypress, instead of it directly exiting the application
- enable this by default, but add a configuration file option to specify a preference
- perhaps also a command-line option, to both enable and disable it (eg. to support default=confirm, config=no-confirm, command-line=confirm)

The first step of these would be a good first issue, and if that goes well the later points could be included in the first PR or follow-up(s).

The exit keypress (`QUIT`) is listed in the help but doesn't connect to a specific event like most other symbolic keys (eg. `HELP`), since it is actually us setting the `Ctrl c` (`SIGINT`) signal handler in `core.py` which controls what happens here. Intercepting that flow of functions would be the first thing to try.

We may later want to explore a different approach where we block that signal completely in the same way that we block Ctrl+z/s, and then use regular keypress handling instead, though if the urwid main loop blocks then we may lose the ability to shut down as cleanly.
tests/cli/test_run.py::test_valid_zuliprc_but_no_connection tests/cli/test_run.py::test_warning_regarding_incomplete_theme[c-expected_complete_incomplete_themes0-(you tests/cli/test_run.py::test_warning_regarding_incomplete_theme[d-expected_complete_incomplete_themes1-(all tests/cli/test_run.py::test_successful_main_function_with_config[footlinks_disabled] tests/cli/test_run.py::test_successful_main_function_with_config[footlinks_enabled] tests/cli/test_run.py::test_successful_main_function_with_config[maximum-footlinks_3] tests/cli/test_run.py::test_successful_main_function_with_config[maximum-footlinks_0] tests/core/test_core.py::TestController::test_initialize_controller tests/core/test_core.py::TestController::test_initial_editor_mode tests/core/test_core.py::TestController::test_current_editor_error_if_no_editor tests/core/test_core.py::TestController::test_editor_mode_entered_from_initial tests/core/test_core.py::TestController::test_editor_mode_error_on_multiple_enter tests/core/test_core.py::TestController::test_editor_mode_exits_after_entering tests/core/test_core.py::TestController::test_narrow_to_stream tests/core/test_core.py::TestController::test_narrow_to_topic[all-messages_to_topic_narrow_no_anchor] tests/core/test_core.py::TestController::test_narrow_to_topic[topic_narrow_to_same_topic_narrow_with_anchor] tests/core/test_core.py::TestController::test_narrow_to_topic[topic_narrow_to_same_topic_narrow_with_other_anchor] tests/core/test_core.py::TestController::test_narrow_to_user tests/core/test_core.py::TestController::test_narrow_to_all_messages[None-537288] tests/core/test_core.py::TestController::test_narrow_to_all_messages[537286-537286] tests/core/test_core.py::TestController::test_narrow_to_all_messages[537288-537288] tests/core/test_core.py::TestController::test_narrow_to_all_pm tests/core/test_core.py::TestController::test_narrow_to_all_starred[index_all_starred0] tests/core/test_core.py::TestController::test_narrow_to_all_starred[index_all_starred1] tests/core/test_core.py::TestController::test_narrow_to_all_starred[index_all_starred2] tests/core/test_core.py::TestController::test_narrow_to_all_starred[index_all_starred3] tests/core/test_core.py::TestController::test_narrow_to_all_starred[index_all_starred4] tests/core/test_core.py::TestController::test_narrow_to_all_starred[index_all_starred5] tests/core/test_core.py::TestController::test_narrow_to_all_starred[index_all_starred6] tests/core/test_core.py::TestController::test_narrow_to_all_mentions[stream_mention__stream_wildcard] tests/core/test_core.py::TestController::test_narrow_to_all_mentions[stream+pm_mention__no_wildcard] tests/core/test_core.py::TestController::test_narrow_to_all_mentions[no_mention__stream+pm_wildcard] tests/core/test_core.py::TestController::test_narrow_to_all_mentions[stream+group_mention__pm_wildcard] tests/core/test_core.py::TestController::test_narrow_to_all_mentions[pm_mention__stream+group_wildcard] tests/core/test_core.py::TestController::test_narrow_to_all_mentions[group_mention__all_wildcard] tests/core/test_core.py::TestController::test_narrow_to_all_mentions[all_mention__stream_wildcard] tests/core/test_core.py::TestController::test_narrow_to_all_mentions[stream+group_mention__wildcard] tests/core/test_core.py::TestController::test_copy_to_clipboard_no_exception[copy tests/core/test_core.py::TestController::test_copy_to_clipboard_exception tests/core/test_core.py::TestController::test_open_in_browser_success[https://chat.zulip.org/#narrow/stream/test] tests/core/test_core.py::TestController::test_open_in_browser_success[https://chat.zulip.org/user_uploads/sent/abcd/efg.png] tests/core/test_core.py::TestController::test_open_in_browser_success[https://github.com/] tests/core/test_core.py::TestController::test_open_in_browser_fail__no_browser_controller tests/core/test_core.py::TestController::test_main tests/core/test_core.py::TestController::test_stream_muting_confirmation_popup[muted_streams0-unmuting] tests/core/test_core.py::TestController::test_stream_muting_confirmation_popup[muted_streams1-muting] tests/core/test_core.py::TestController::test_search_message[msg_ids0-Default_all_msg_search] tests/core/test_core.py::TestController::test_search_message[msg_ids0-redo_default_search] tests/core/test_core.py::TestController::test_search_message[msg_ids0-search_within_stream] tests/core/test_core.py::TestController::test_search_message[msg_ids0-pm_search_again] tests/core/test_core.py::TestController::test_search_message[msg_ids0-search_within_topic_narrow] tests/core/test_core.py::TestController::test_search_message[msg_ids1-Default_all_msg_search] tests/core/test_core.py::TestController::test_search_message[msg_ids1-redo_default_search] tests/core/test_core.py::TestController::test_search_message[msg_ids1-search_within_stream] tests/core/test_core.py::TestController::test_search_message[msg_ids1-pm_search_again] tests/core/test_core.py::TestController::test_search_message[msg_ids1-search_within_topic_narrow] tests/core/test_core.py::TestController::test_search_message[msg_ids2-Default_all_msg_search] tests/core/test_core.py::TestController::test_search_message[msg_ids2-redo_default_search] tests/core/test_core.py::TestController::test_search_message[msg_ids2-search_within_stream] tests/core/test_core.py::TestController::test_search_message[msg_ids2-pm_search_again] tests/core/test_core.py::TestController::test_search_message[msg_ids2-search_within_topic_narrow] tests/core/test_core.py::TestController::test_maximum_popup_dimensions[above_linear_range] tests/core/test_core.py::TestController::test_maximum_popup_dimensions[in_linear_range] tests/core/test_core.py::TestController::test_maximum_popup_dimensions[below_linear_range] tests/core/test_core.py::TestController::test_show_typing_notification[in_pm_narrow_with_sender_typing:start] tests/core/test_core.py::TestController::test_show_typing_notification[in_pm_narrow_with_sender_typing:stop]
tests/cli/test_run.py::test_in_color[red-\x1b[91m] tests/cli/test_run.py::test_in_color[green-\x1b[92m] tests/cli/test_run.py::test_in_color[yellow-\x1b[93m] tests/cli/test_run.py::test_in_color[blue-\x1b[94m] tests/cli/test_run.py::test_in_color[purple-\x1b[95m] tests/cli/test_run.py::test_in_color[cyan-\x1b[96m] tests/cli/test_run.py::test_get_login_label[json0-Email tests/cli/test_run.py::test_get_login_label[json1-Username] tests/cli/test_run.py::test_get_login_label[json2-Email] tests/cli/test_run.py::test_get_login_label[json3-Email] tests/cli/test_run.py::test_get_server_settings tests/cli/test_run.py::test_get_server_settings__not_a_zulip_organization tests/cli/test_run.py::test_main_help[-h] tests/cli/test_run.py::test_main_help[--help] tests/cli/test_run.py::test_zt_version[-v] tests/cli/test_run.py::test_zt_version[--version] tests/cli/test_run.py::test_parse_args_valid_autohide_option[--autohide-autohide] tests/cli/test_run.py::test_parse_args_valid_autohide_option[--no-autohide-no_autohide] tests/cli/test_run.py::test_parse_args_valid_autohide_option[--debug-None] tests/cli/test_run.py::test_main_multiple_autohide_options[options0] tests/cli/test_run.py::test_main_multiple_autohide_options[options1] tests/cli/test_run.py::test__parse_args_valid_notify_option[--notify-enabled] tests/cli/test_run.py::test__parse_args_valid_notify_option[--no-notify-disabled] tests/cli/test_run.py::test__parse_args_valid_notify_option[--profile-None] tests/cli/test_run.py::test_main_multiple_notify_options[options0] tests/cli/test_run.py::test_main_multiple_notify_options[options1] tests/cli/test_run.py::test_main_error_with_invalid_zuliprc_options[zulip_config0-Configuration tests/cli/test_run.py::test_main_error_with_invalid_zuliprc_options[zulip_config1-Configuration tests/cli/test_run.py::test_exit_with_error[1-] tests/cli/test_run.py::test_exit_with_error[2-helper] tests/cli/test_run.py::test__write_zuliprc__success tests/cli/test_run.py::test__write_zuliprc__fail_file_exists tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[63] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[56] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[7] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[54] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[48] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[6] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[45] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[40] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[5] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[36] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[32] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[4] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[27] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[24] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[3] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[18] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[16] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[2] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[9] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[8] tests/cli/test_run.py::test_show_error_if_loading_zuliprc_with_open_permissions[1]