# built-ins
 from enum import Enum, auto
 from getpass import getuser
+from os import makedirs
+from os.path import exists
 from typing import Any, Callable, Optional, Sequence
 # ourselves
 from ircplom.tui_base import (BaseTui, PromptWidget, TuiEvent, Window,
 _LOG_PREFIX_OUT = '>'
 _LOG_PREFIX_IN = '<'
 
+_PATH_LOGS = 'logs'
+
 
 class _LogScope(Enum):
     'Where log messages should go.'
         super().__init__(**kwargs)
         self._title = f'{self.client_id} :DEBUG'
 
+    def log(self, msg: str) -> None:
+        super().log(msg)
+        if not exists(_PATH_LOGS):
+            makedirs(_PATH_LOGS)
+        with open(f'{_PATH_LOGS}/{self._title}.txt', 'a', encoding='utf8'
+                  ) as f:
+            f.write(msg + '\n')
+
     def _send_msg(self, verb: str, params: tuple[str, ...]) -> None:
         self._client_trigger('send_w_params_tuple', verb=verb, params=params)
 
                     scope, kwargs.get('target', ''))
         return super()._log_target_wins(**kwargs)
 
-    def log(self, msg: str, **kwargs) -> tuple[tuple[int, ...], str]:
-        win_ids, logged_msg = super().log(msg, **kwargs)
-        if kwargs.get('scope', None) == _LogScope.DEBUG\
-                and kwargs['prefix'] in {_LOG_PREFIX_IN, _LOG_PREFIX_OUT}:
-            with open(f'{kwargs["client_id"]}.log', 'a', encoding='utf8') as f:
-                f.write(f'{logged_msg}\n')
-        return win_ids, logged_msg
-
     def for_client_do(self, client_id: str, todo: str, **kwargs) -> None:
         'Forward todo to appropriate _ClientWindowsManager.'
         if client_id not in self._client_mngrs:
 
         if hasattr(self._term, 'size'):
             self.set_geometry()
 
+    def log(self, msg: str) -> None:
+        'Append msg to .history.'
+        self.history.append(msg)
+
     def taint(self) -> None:
         'Declare all widgets as in need of re-drawing.'
         self.history.taint()
         affected_win_indices = []
         for win in self._log_target_wins(**kwargs):
             affected_win_indices += [win.idx]
-            win.history.append(msg)
+            win.log(msg)
             if win != self.window:
                 self._status_line.taint()
         return tuple(affected_win_indices), msg