diff --git a/docs/releases.md b/docs/releases.md
index 91d32dfd..94ae9eba 100644
--- a/docs/releases.md
+++ b/docs/releases.md
@@ -34,6 +34,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release
 * German (thanks to [@cmeis](https://github.com/cmeis))
 * Indonesian (thanks to [@linerly](https://hosted.weblate.org/user/linerly/))
 * Japanese (thanks to [@shak](https://hosted.weblate.org/user/shak/))
+* Spanish (thanks to [@rogeliodh](https://github.com/rogeliodh))
 * Turkish (thanks to [@ersen](https://ersen.moe/))
 
 -->
diff --git a/web/src/components/Preferences.js b/web/src/components/Preferences.js
index 11b688e5..8fd00eee 100644
--- a/web/src/components/Preferences.js
+++ b/web/src/components/Preferences.js
@@ -423,7 +423,7 @@ const Appearance = () => {
 
 const Language = () => {
     const { t, i18n } = useTranslation();
-    const randomFlags = shuffle(["๐Ÿ‡ฌ๐Ÿ‡ง", "๐Ÿ‡บ๐Ÿ‡ธ", "๐Ÿ‡ง๐Ÿ‡ฌ", "๐Ÿ‡ฉ๐Ÿ‡ช", "๐Ÿ‡ฎ๐Ÿ‡ฉ", "๐Ÿ‡ฏ๐Ÿ‡ต", "๐Ÿ‡น๐Ÿ‡ท"]).slice(0, 3);
+    const randomFlags = shuffle(["๐Ÿ‡ฌ๐Ÿ‡ง", "๐Ÿ‡บ๐Ÿ‡ธ", "๐Ÿ‡ช๐Ÿ‡ธ", "๐Ÿ‡ง๐Ÿ‡ฌ", "๐Ÿ‡ฉ๐Ÿ‡ช", "๐Ÿ‡ฎ๐Ÿ‡ฉ", "๐Ÿ‡ฏ๐Ÿ‡ต", "๐Ÿ‡น๐Ÿ‡ท"]).slice(0, 3);
     const title = t("prefs_appearance_language_title") + " " + randomFlags.join(" ");
 
     // Remember: Flags are not languages. Don't put flags next to the language in the list.
@@ -434,6 +434,7 @@ const Language = () => {
             <FormControl fullWidth variant="standard" sx={{ m: 1 }}>
                 <Select value={i18n.language} onChange={(ev) => i18n.changeLanguage(ev.target.value)}>
                     <MenuItem value="en">English</MenuItem>
+                    <MenuItem value="es">Espaรฑol</MenuItem>
                     <MenuItem value="bg">ะ‘ัŠะปะณะฐั€ัะบะธ</MenuItem>
                     <MenuItem value="de">Deutsch</MenuItem>
                     <MenuItem value="id">Bahasa Indonesia</MenuItem>