diff --git a/aleksis/core/templates/500.html b/aleksis/core/templates/500.html
index fee566258f556cf5ea2922abd170873d3c212733..d008cd5405f4e5eee73ddf175cab87057e563785 100644
--- a/aleksis/core/templates/500.html
+++ b/aleksis/core/templates/500.html
@@ -8,7 +8,7 @@
       <div class="card-content white-text">
         <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i>
         <span class="card-title">{% trans "Error" %} (500): {% blocktrans %}An unexpected error has
-          occured.{% endblocktrans %}</span>
+          occurred.{% endblocktrans %}</span>
         <p>
           {% blocktrans %}
             Your site administrators will automatically be notified about this
diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py
index ffdba5f45c55454489c8b21c81688458c9808163..67adbf943886d5e503a9009e56b8eeb7f1ed823c 100644
--- a/aleksis/core/util/core_helpers.py
+++ b/aleksis/core/util/core_helpers.py
@@ -23,8 +23,8 @@ from cachalot.signals import post_invalidation
 from cache_memoize import cache_memoize
 
 
-def copyright_years(years: Sequence[int], seperator: str = ", ", joiner: str = "–") -> str:
-    """Take a sequence of integegers and produces a string with ranges.
+def copyright_years(years: Sequence[int], separator: str = ", ", joiner: str = "–") -> str:
+    """Take a sequence of integers and produces a string with ranges.
 
     >>> copyright_years([1999, 2000, 2001, 2005, 2007, 2008, 2009])
     '1999–2001, 2005, 2007–2009'
@@ -38,11 +38,11 @@ def copyright_years(years: Sequence[int], seperator: str = ", ", joiner: str = "
         for range_ in ranges
     ]
 
-    return seperator.join(years_strs)
+    return separator.join(years_strs)
 
 
 def dt_show_toolbar(request: HttpRequest) -> bool:
-    """Add a helper to determin if Django debug toolbar should be displayed.
+    """Add a helper to determine if Django debug toolbar should be displayed.
 
     Extends the default behaviour by enabling DJDT for superusers independent
     of source IP.
diff --git a/docs/admin/01_core_concepts.rst b/docs/admin/01_core_concepts.rst
index cdd49c7183217897b09cf1fda5575307e0a5f08c..11c97f331fadab28a257773267821b08c42589b6 100644
--- a/docs/admin/01_core_concepts.rst
+++ b/docs/admin/01_core_concepts.rst
@@ -93,7 +93,7 @@ In contrast to persons, groups are supposed to be **linked to school
 terms** (but they don’t have to be). For example, the composition of a
 class or a course varies from school term to school term. In order to
 archive historical data according to local laws, these groups have to be
-separeted which is solved by linking them to a school term.
+separated which is solved by linking them to a school term.
 
 Manage groups
 ~~~~~~~~~~~~~
diff --git a/docs/admin/21_ldap.rst b/docs/admin/21_ldap.rst
index 7b123a594154950482a6cdf7ac095a3030ee5359..389b3fca9c9c0f0af8f2f54fe448d87daf7bf776 100644
--- a/docs/admin/21_ldap.rst
+++ b/docs/admin/21_ldap.rst
@@ -13,7 +13,7 @@ the AlekSIS system (see below).
 Installing packages for LDAP support
 ------------------------------------
 
-Installing the necessary librairies for LDAP support unfortunately is not
+Installing the necessary libraries for LDAP support unfortunately is not
 very straightforward under all circumstances. On Debian, install these packages::
 
   sudo apt install python3-ldap libldap2-dev libssl-dev libsasl2-dev python3-dev
diff --git a/docs/admin/22_registration.rst b/docs/admin/22_registration.rst
index 510500f2198ec6377c91d97bf1be903411f0daea..84ae59f0c881772b72ca023bdb68c53c62717fca 100644
--- a/docs/admin/22_registration.rst
+++ b/docs/admin/22_registration.rst
@@ -4,7 +4,7 @@ Registration and user invitations
 In addition to central management of user accounts, AlekSIS allows self-registration
 by users. Registration can be either fully open, or based on personal invitations.
 
-In a system handling ciritcal data, access control should be as tight as possible.
+In a system handling critical data, access control should be as tight as possible.
 However, there are scenarios where central account creation is not feasible, e.g.
 for optional guardian accounts. In such a scenario, the invitation system allows
 for processes like handing out invitation codes as a letter or through e-mail
diff --git a/docs/admin/31_monitoring.rst b/docs/admin/31_monitoring.rst
index 1847297352a135aafdff954d98eb2a2cc1a69573..0d079bf4b615e2c4bebb0af1dca6f736d4fce49f 100644
--- a/docs/admin/31_monitoring.rst
+++ b/docs/admin/31_monitoring.rst
@@ -58,7 +58,7 @@ Monitoring with Icinga2
 
 As already mentioned, there is a JSON endpoint at
 https://aleksis.example.com/health/. You can use an json check plugin to
-check seperate health checks or just use a HTTP check to check if the
+check separate health checks or just use a HTTP check to check if the
 site returns HTTP 200.
 
 Performance monitoring with Prometheus
diff --git a/docs/dev/01_setup.rst b/docs/dev/01_setup.rst
index e52941af0c77b266ffd74bf410cccb0ef04b2678..75cf677a7f43703dc5e6a389e97be28fcf813a02 100644
--- a/docs/dev/01_setup.rst
+++ b/docs/dev/01_setup.rst
@@ -2,7 +2,7 @@ Setting up the development environment
 ======================================
 
 AlekSIS and all official apps use `Poetry`_ to manage virtualenvs and
-dependencies. You should make yourself a bit confortable with poetry
+dependencies. You should make yourself a bit comfortable with poetry
 by reading its documentation.
 
 Poetry makes a lot of stuff very easy, especially managing a virtual
diff --git a/docs/dev/03_run_tests.rst b/docs/dev/03_run_tests.rst
index c50eda52d1c04d183c518a938a6f6a7a1c579ab3..9d38bdf6382d250ce6d1d05dfae37e699c268afa 100644
--- a/docs/dev/03_run_tests.rst
+++ b/docs/dev/03_run_tests.rst
@@ -29,7 +29,7 @@ setting certain environment variables:
 
 Selenium tests are enabled if `TEST_SELENIUM_BROWSERS` is non-empty.
 
-To set variables, use env to wrap the tox ommand::
+To set variables, use env to wrap the tox command::
 
   TEST_SELENIUM_BROWSERS=chrome,firefox tox
 
@@ -69,5 +69,5 @@ look like they should or for documentation purposes.
 To enable screenshots, add the `TEST_SCREENSHOT_PATH` environment variable
 when running the tests.
 
-If runnin multiple browsers, screenshots are placed in separate directories
+If running multiple browsers, screenshots are placed in separate directories
 per browser.
diff --git a/docs/user/01_registration.rst b/docs/user/01_registration.rst
index 3beb4fb51621af47b97a51a1cb6719773249ecf7..19d0b7a893c00f12b0c92fc5f71b0209edbaab8d 100644
--- a/docs/user/01_registration.rst
+++ b/docs/user/01_registration.rst
@@ -15,7 +15,7 @@ AlekSIS account.
   :alt: Signup formular
 
 If enabled, you have to verify your email address after signup. To do so, click
-on the link you recieved on the email address you entered in the signup form.
+on the link you received on the email address you entered in the signup form.
 
 .. note::
    Normally, AlekSIS does not allow public registratio, and all accounts are
@@ -32,5 +32,5 @@ enter it. You will be redirected to the signup form.
   :width: 100%
   :alt: Accept invitation
 
-If you've recieved an invitation link (e.g. via email), clicking the link
+If you've received an invitation link (e.g. via email), clicking the link
 will redirect you to the signup form automatically.
diff --git a/docs/user/02_personal_account.rst b/docs/user/02_personal_account.rst
index a506b9e759ddf0b9f0e8235db784c51c150317c8..fe584615cefbaf284a6b3ba2cfd7babeca076f0d 100644
--- a/docs/user/02_personal_account.rst
+++ b/docs/user/02_personal_account.rst
@@ -90,6 +90,6 @@ Authorized applications
 -----------------------
 
 On the page ``Account → Authorized applications`` you can see all
-external applications you authorized to retreive data about you from
+external applications you authorized to retrieve data about you from
 AlekSIS. That can be services provided by your local institution like a
 chat platform, for example.
diff --git a/docs/user/20_pwa.rst b/docs/user/20_pwa.rst
index 461bd113c14747843ac22f66a77bb22bde96d6d3..3b3b16514cae1c932d321cefc86dcdbd946c59e2 100644
--- a/docs/user/20_pwa.rst
+++ b/docs/user/20_pwa.rst
@@ -35,7 +35,7 @@ Firefox Desktop which nevertheless supports the other features.
 -  Chromium-based browsers (e.g. Chromium, Google Chrome, Microsoft
    Edge) will usually prompt you to install the PWA by a popup on both
    mobile and desktop devices; for the former using a banner and for the
-   latter using an appearing button in the adress bar. In both cases, a
+   latter using an appearing button in the address bar. In both cases, a
    click on the notification is enough to start the installation
    process.
 -  Firefox Mobile will also probably prompt you using a dot near the