diff --git a/.gitignore b/.gitignore
index 2bf2c86d8c..0e06e5aa00 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,7 +4,6 @@
 # Build directory
 [Bb]uild*/
 doc-build/
-cmake-build*/
 
 # Generated source files
 src/common/scm_rev.cpp
diff --git a/src/core/crypto/key_manager.cpp b/src/core/crypto/key_manager.cpp
index 5a1943a5ce..e1b520333d 100644
--- a/src/core/crypto/key_manager.cpp
+++ b/src/core/crypto/key_manager.cpp
@@ -648,14 +648,14 @@ void KeyManager::ReloadKeys() {
 
     if (Settings::values.use_dev_keys) {
         dev_mode = true;
-        LoadFromFile(suyu_keys_dir / "dev.keys", 1);
+        LoadFromFile(suyu_keys_dir / "dev.keys", false);
     } else {
         dev_mode = false;
-        LoadFromFile(suyu_keys_dir / "prod.keys", 2);
+        LoadFromFile(suyu_keys_dir / "prod.keys", false);
     }
 
-    LoadFromFile(suyu_keys_dir / "title.keys", 3);
-    LoadFromFile(suyu_keys_dir / "console.keys", 4);
+    LoadFromFile(suyu_keys_dir / "title.keys", true);
+    LoadFromFile(suyu_keys_dir / "console.keys", false);
 }
 
 static bool ValidCryptoRevisionString(std::string_view base, size_t begin, size_t length) {
@@ -666,26 +666,11 @@ static bool ValidCryptoRevisionString(std::string_view base, size_t begin, size_
                        [](u8 c) { return std::isxdigit(c); });
 }
 
-void KeyManager::LoadFromFile(const std::filesystem::path& file_path, int key_type) {
+void KeyManager::LoadFromFile(const std::filesystem::path& file_path, bool is_title_keys) {
     if (!Common::FS::Exists(file_path)) {
-        switch (key_type) {
-        case 1:
-            LOG_ERROR(Crypto, "Issue with Development key file at '{}': File not found",
-                      file_path.generic_string());
-            return;
-        case 2:
-            LOG_ERROR(Crypto, "Issue with Production key file at '{}': File not found",
-                      file_path.generic_string());
-            return;
-        case 3:
-            LOG_INFO(Crypto, "Issue with Title key file at '{}': File not found",
-                     file_path.generic_string());
-        case 4:
-            LOG_INFO(Crypto, "Issue with Console key file at '{}': File not found",
-                     file_path.generic_string());
-        default:
-            LOG_ERROR(Crypto, "Unknown Key Type");
-        }
+        LOG_ERROR(Crypto, "Failed to load key file at '{}': File not found",
+                  file_path.generic_string());
+        return;
     }
 
     std::ifstream file;
@@ -1322,4 +1307,4 @@ bool KeyManager::AddTicket(const Ticket& ticket) {
     SetKey(S128KeyType::Titlekey, key.value(), rights_id[1], rights_id[0]);
     return true;
 }
-} // namespace Core::Crypto
\ No newline at end of file
+} // namespace Core::Crypto
diff --git a/src/core/crypto/key_manager.h b/src/core/crypto/key_manager.h
index 0d4cfe72af..005062345e 100644
--- a/src/core/crypto/key_manager.h
+++ b/src/core/crypto/key_manager.h
@@ -312,7 +312,7 @@ private:
     RSAKeyPair<2048> eticket_rsa_keypair{};
 
     bool dev_mode;
-    void LoadFromFile(const std::filesystem::path& file_path, int key_type);
+    void LoadFromFile(const std::filesystem::path& file_path, bool is_title_keys);
 
     void DeriveGeneralPurposeKeys(std::size_t crypto_revision);
 
diff --git a/src/core/loader/nax.cpp b/src/core/loader/nax.cpp
index 3b7b005ff4..725cb228d0 100644
--- a/src/core/loader/nax.cpp
+++ b/src/core/loader/nax.cpp
@@ -55,6 +55,10 @@ AppLoader_NAX::LoadResult AppLoader_NAX::Load(Kernel::KProcess& process, Core::S
             return {ResultStatus::ErrorMissingProductionKeyFile, {}};
         }
 
+        if (!Core::Crypto::KeyManager::KeyFileExists(true)) {
+            return {ResultStatus::ErrorMissingProductionKeyFile, {}};
+        }
+
         return {ResultStatus::ErrorNAXInconvertibleToNCA, {}};
     }
 
diff --git a/src/core/loader/nsp.cpp b/src/core/loader/nsp.cpp
index 3016d5f25f..39198c9b66 100644
--- a/src/core/loader/nsp.cpp
+++ b/src/core/loader/nsp.cpp
@@ -102,6 +102,10 @@ AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::KProcess& process, Core::S
             return {ResultStatus::ErrorMissingProductionKeyFile, {}};
         }
 
+        if (!Core::Crypto::KeyManager::KeyFileExists(true)) {
+            return {ResultStatus::ErrorMissingProductionKeyFile, {}};
+        }
+
         return {ResultStatus::ErrorNSPMissingProgramNCA, {}};
     }
 
diff --git a/src/core/loader/xci.cpp b/src/core/loader/xci.cpp
index e9abb199a1..d4722ac4c0 100644
--- a/src/core/loader/xci.cpp
+++ b/src/core/loader/xci.cpp
@@ -71,6 +71,10 @@ AppLoader_XCI::LoadResult AppLoader_XCI::Load(Kernel::KProcess& process, Core::S
         return {ResultStatus::ErrorMissingProductionKeyFile, {}};
     }
 
+    if (!xci->HasProgramNCA() && !Core::Crypto::KeyManager::KeyFileExists(true)) {
+        return {ResultStatus::ErrorMissingProductionKeyFile, {}};
+    }
+
     const auto result = nca_loader->Load(process, system);
     if (result.first != ResultStatus::Success) {
         return result;
diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp
index 92615564d9..4b9265febf 100644
--- a/src/suyu/main.cpp
+++ b/src/suyu/main.cpp
@@ -1755,10 +1755,9 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa
     if (!ContentManager::AreKeysPresent()) {
         QMessageBox::warning(this, tr("Derivation Components Missing"),
                              tr("Encryption keys are missing. "
-                                "In order to use this emulator"
-                                "you need to provide your own prod.keys"
-                                "Some games might also require your own title.keys as well"
-                                "in order to play them."));
+                                "You need to provide both your own title.keys "
+                                "and your own prod.keys "
+                                "in order to play games"));
         return false;
     }