Fix typos (user-facing and non-user-facing
diff --git a/.github/workflows/release-snap.yml b/.github/workflows/release-snap.yml
index afb22e841f..c415edd76e 100644
--- a/.github/workflows/release-snap.yml
+++ b/.github/workflows/release-snap.yml
@@ -15,7 +15,7 @@ jobs:
 
     strategy:
       # If any of the stages fail, then we'll stop the action
-      # to give release manager time to investigate the underyling
+      # to give release manager time to investigate the underlying
       # issue.
       fail-fast: true
       matrix:
diff --git a/extras/packaging/linux/README.md b/extras/packaging/linux/README.md
index a62e4dc58e..2958dfaef4 100644
--- a/extras/packaging/linux/README.md
+++ b/extras/packaging/linux/README.md
@@ -23,7 +23,7 @@ contains 2 major methods:
 
 We use [PyInstaller](https://pyinstaller.readthedocs.io/en/stable/) for the binaries. Normally pyinstaller offers two different modes:
 
-- Single directory (harder to distribute, low redundancy. Library files are shared accross different executables)
+- Single directory (harder to distribute, low redundancy. Library files are shared across different executables)
 - Single binary (easier to distribute, higher redundancy. Same libraries are statically linked to different executables, so higher total size)
 
 Since our binary size (in total 20 MiBs) is not that big, we have decided to choose the single binary mode for the sake of easier distribution.
diff --git a/extras/profiling/README.md b/extras/profiling/README.md
index c2487de4a6..0eef816656 100644
--- a/extras/profiling/README.md
+++ b/extras/profiling/README.md
@@ -1,7 +1,7 @@
 # HTTPie Benchmarking Infrastructure
 
 This directory includes the benchmarks we use for testing HTTPie's speed and the
-infrastructure to automate this testing accross versions.
+infrastructure to automate this testing across versions.
 
 ## Usage
 
@@ -35,5 +35,5 @@ You can customize these branches by passing `--local-repo`/`--target-branch`,
 and customize the repos by passing `--local-repo`/`--target-repo` (can either
 take a URL or a path).
 
-If you want to run a third enviroment with additional dependencies (such as
+If you want to run a third environment with additional dependencies (such as
 `pyOpenSSL`), you can pass `--complex`.
diff --git a/extras/profiling/benchmarks.py b/extras/profiling/benchmarks.py
index 5d47a3a125..ede4915f63 100644
--- a/extras/profiling/benchmarks.py
+++ b/extras/profiling/benchmarks.py
@@ -21,7 +21,7 @@
     $ python extras/profiling/benchmarks.py --fast
 
     # For verify everything works as expected, pass --debug-single-value.
-    # It will only run everything once, so the resuls are not realiable. But
+    # It will only run everything once, so the resuls are not reliable. But
     # very useful when iterating on a benchmark
     $ python extras/profiling/benchmarks.py --debug-single-value
 
diff --git a/httpie/context.py b/httpie/context.py
index 44aedd421c..da4d19257e 100644
--- a/httpie/context.py
+++ b/httpie/context.py
@@ -205,7 +205,7 @@ def _make_rich_console(
             theme=Theme(theme)
         )
 
-    # Rich recommends separting the actual console (stdout) from
+    # Rich recommends separating the actual console (stdout) from
     # the error (stderr) console for better isolation between parts.
     # https://rich.readthedocs.io/en/stable/console.html#error-console
 
diff --git a/httpie/manager/tasks/plugins.py b/httpie/manager/tasks/plugins.py
index a0180537f5..c3c7d540c7 100644
--- a/httpie/manager/tasks/plugins.py
+++ b/httpie/manager/tasks/plugins.py
@@ -165,7 +165,7 @@ def _uninstall(self, target: str) -> Optional[ExitStatus]:
             return self.fail('uninstall', target, 'couldn\'t locate the package')
 
         # TODO: Consider handling failures here (e.g if it fails,
-        # just rever the operation and leave the site-packages
+        # just revert the operation and leave the site-packages
         # in a proper shape).
         for file in files:
             with suppress(FileNotFoundError):
diff --git a/httpie/plugins/manager.py b/httpie/plugins/manager.py
index 0a25f320e4..27af6eedac 100644
--- a/httpie/plugins/manager.py
+++ b/httpie/plugins/manager.py
@@ -70,7 +70,7 @@ def load_installed_plugins(self, directory: Optional[Path] = None):
                 plugin = entry_point.load()
             except BaseException as exc:
                 warnings.warn(
-                    f'While loading "{plugin_name}", an error ocurred: {exc}\n'
+                    f'While loading "{plugin_name}", an error occurred: {exc}\n'
                     f'For uninstallations, please use either "httpie plugins uninstall {plugin_name}" '
                     f'or "pip uninstall {plugin_name}" (depending on how you installed it in the first '
                     'place).'
diff --git a/tests/test_cli_utils.py b/tests/test_cli_utils.py
index 2ea319d848..8041727b57 100644
--- a/tests/test_cli_utils.py
+++ b/tests/test_cli_utils.py
@@ -28,7 +28,7 @@ def test_lazy_choices():
         cache=False  # for test purposes
     )
 
-    # Parser initalization doesn't call it.
+    # Parser initialization doesn't call it.
     getter.assert_not_called()
 
     # If we don't use --lazy-option, we don't retrieve it.
@@ -69,7 +69,7 @@ def test_lazy_choices_help():
         cache=False  # for test purposes
     )
 
-    # Parser initalization doesn't call it.
+    # Parser initialization doesn't call it.
     getter.assert_not_called()
 
     # If we don't use `--help`, we don't use it.
diff --git a/tests/test_plugins_cli.py b/tests/test_plugins_cli.py
index 7be110de3b..2805792364 100644
--- a/tests/test_plugins_cli.py
+++ b/tests/test_plugins_cli.py
@@ -138,7 +138,7 @@ def test_broken_plugins(httpie_plugins, httpie_plugins_success, dummy_plugin, br
         UserWarning,
         match=(
             f'While loading "{broken_plugin.name}", an error'
-            ' ocurred: broken plugin'
+            ' occurred: broken plugin'
         )
     ):
         data = parse_listing(httpie_plugins_success('list'))
diff --git a/tests/utils/__init__.py b/tests/utils/__init__.py
index 79cafa07cd..8a575aef03 100644
--- a/tests/utils/__init__.py
+++ b/tests/utils/__init__.py
@@ -83,7 +83,7 @@ class Encoder:
     def __init__(self):
         self.substitutions = {}
 
-    def subsitute(self, data: bytes) -> str:
+    def substitute(self, data: bytes) -> str:
         idx = hash(data)
         self.substitutions[idx] = data
         return self.TEMPLATE.format(idx)
@@ -110,7 +110,7 @@ def write(self, data):
         try:
             self.original_buffer.write(data.decode(UTF8))
         except UnicodeDecodeError:
-            self.original_buffer.write(self.encoder.subsitute(data))
+            self.original_buffer.write(self.encoder.substitute(data))
         finally:
             self.original_buffer.flush()
 

Found via `codespell -q 3 -L datas,medias,warmup`