diff --git a/src/assets.qrc b/src/assets.qrc
index c37e4da..347779c 100644
--- a/src/assets.qrc
+++ b/src/assets.qrc
@@ -4,6 +4,7 @@
assets/ack.txt
assets/contributors.txt
assets/feather.desktop
+ assets/nodes.json
assets/images/appicons/32x32.png
assets/images/appicons/48x48.png
assets/images/appicons/64x64.png
diff --git a/src/assets/nodes.json b/src/assets/nodes.json
new file mode 100644
index 0000000..69a373d
--- /dev/null
+++ b/src/assets/nodes.json
@@ -0,0 +1,37 @@
+{
+ "mainnet": {
+ "tor": [
+ "xmrtolujkxnlinre.onion:18081",
+ "xmrag4hf5xlabmob.onion:18081",
+ "monero26mmldsallmxok2kwamne4ve3mybvvn2yijsvss7ey63hc4yyd.onion:18081",
+ "monero5sjoz5xmjn.onion:18081",
+ "mxcd4577fldb3ppzy7obmmhnu3tf57gbcbd4qhwr2kxyjj2qi3dnbfqd.onion:18081",
+ "moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion:18089",
+ "3hvpnd4xejtzcuowvru2wfjum5wjf7synigm44rrizr3k4v5vzam2bad.onion:18081",
+ "3t7v5zpcfxq2tocdofdcwxgrldco3elotz3iis4jtbbnscy5alezw7yd.onion:18081",
+ "4mslnrs5sfjxrb35.onion:18081",
+ "aytzr6aoxsegx2y6.onion:18081"
+ ],
+ "clearnet": [
+ "eu-west.node.xmr.pm:18089",
+ "eu-west-2.node.xmr.pm:18089",
+ "usa-east-va.node.xmr.pm:18089",
+ "canada.node.xmr.pm:18089",
+ "singapore.node.xmr.pm:18089",
+ "nodes.hashvault.pro:18081",
+ "node.supportxmr.com:18081",
+ "xmr-node-eu.cakewallet.com:18081",
+ "xmr-node-usa-east.cakewallet.com:18081",
+ "node.xmr.ru:18081",
+ "selsta1.featherwallet.net:18081",
+ "selsta2.featherwallet.net:18081"
+ ]
+ },
+ "stagenet": {
+ "tor": [],
+ "clearnet": [
+ "run.your.own.node.xmr.pm:38089",
+ "super.fast.node.xmr.pm:38089"
+ ]
+ }
+}
diff --git a/src/utils/nodes.cpp b/src/utils/nodes.cpp
index e8aa58a..dfea265 100644
--- a/src/utils/nodes.cpp
+++ b/src/utils/nodes.cpp
@@ -83,6 +83,37 @@ void Nodes::loadConfig() {
qDebug() << QString("Loaded %1 custom nodes from config").arg(m_customNodes.count());
}
+ // No nodes cached, fallback to hardcorded list
+ if (m_websocketNodes.count() == 0) {
+ QByteArray file = Utils::fileOpenQRC(":/assets/nodes.json");
+ QJsonDocument nodes_json = QJsonDocument::fromJson(file);
+ QJsonObject nodes_obj = nodes_json.object();
+
+ QString netKey;
+ if (m_ctx->networkType == NetworkType::MAINNET) {
+ netKey = "mainnet";
+ } else if (m_ctx->networkType == NetworkType::STAGENET) {
+ netKey = "stagenet";
+ }
+
+ if (nodes_obj.contains(netKey)) {
+ QJsonArray nodes_list;
+ if (m_ctx->isTails || m_ctx->isWhonix || m_ctx->isTorSocks) {
+ nodes_list = nodes_json[netKey].toObject()["tor"].toArray();
+ } else {
+ nodes_list = nodes_json[netKey].toObject()["clearnet"].toArray();
+ }
+ for (auto node: nodes_list) {
+ auto wsNode = FeatherNode(node.toString());
+ wsNode.custom = false;
+ wsNode.online = true;
+ m_websocketNodes.append(wsNode);
+ }
+ }
+
+ qDebug() << QString("Loaded %1 nodes from hardcoded list").arg(m_websocketNodes.count());
+ }
+
m_configJson[key] = obj;
this->writeConfig();
this->updateModels();