From 0e8bd7aad3a742273b11572173795f575295ed5e Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Wed, 8 Apr 2026 15:37:07 -0500
Subject: [PATCH 01/15] translation strings for fork prep
---
translations/en.json | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/translations/en.json b/translations/en.json
index 440c7f1..eda2c4d 100644
--- a/translations/en.json
+++ b/translations/en.json
@@ -219,7 +219,7 @@
"cacheDesc": "map files will still load either way, this'll just make sure they're in cache when a new update rolls out.",
"captureTrace": "This setting tells Fermi to capture _trace properties from the server, enabling this may cause progressive JSON decoding to not work (might require a reload)",
"clearWellKnowns": "Re-fetch .well-known records:",
- "description": "These are for developers of Spacebar/Fermi, if you don't know what you're doing, please don't mess with these settings.",
+ "description": "These are for developers of Harmony/Fermi, if you don't know what you're doing, please don't mess with these settings.",
"gatewayComp": "Disable Gateway compression:",
"reportSystem":"Enable experimental reporting system:",
"logGateway": "Log received gateway events (log level info):",
@@ -392,10 +392,10 @@
"addBot": "Add to guild",
"alreadyHave": "Already have an account?",
"box1Items": "Direct Messaging|Reactions support|Invites|Account switching|User settings|Developer portal|Bot invites|Translation support",
- "box1title": "Fermi is a Spacebar-compatible client seeking to be as good as it can be with many features including:",
+ "box1title": "Fermi is a Harmony-compatible client seeking to be as good as it can be with many features including:",
"box3description": "We always appreciate some help, whether that be in the form of bug reports, or code, or even just pointing out some typos.",
"box3title": "Contribute to Fermi",
- "compatableInstances": "Spacebar-compatible instances:",
+ "compatableInstances": "Harmony-compatible instances:",
"createAccount": "Create account",
"dobField": "Date of birth:",
"emailField": "Email:",
@@ -478,7 +478,7 @@
},
"jankInfo": "Client information",
"leaveGuild": "Leave guild",
- "leaving": "You're leaving Spacebar",
+ "leaving": "You're leaving Harmony",
"loaded": "Loaded",
"localuser": {
"2faCode:": "Code:",
@@ -512,7 +512,7 @@
"connections": "Connections",
"createApp": "Create application",
"customSound": "Custom sound",
- "customStatusWarn": "Spacebar does not support custom status being displayed at this time so while it'll accept the status, it will not do anything with it",
+ "customStatusWarn": "Harmony does not support custom status being displayed at this time so while it'll accept the status, it will not do anything with it",
"deleteAccount": "Account deletion",
"deleteAccountButton": "Delete account",
"description": "Description:",
@@ -868,8 +868,12 @@
"traces": "$1 ($2ms) $3"
},
"typing": "$2 {{PLURAL:$1|is|are}} typing",
- "unableToConnect": "Unable to connect to the Spacebar server. Please try logging out and back in.",
+ "unableToConnect": "Unable to connect to the Harmony server. Please try logging out and back in.",
"unableToPin": "Unable to pin message",
+ "sbWarns":{
+ "regi":"Spacebar instances are no longer officially supported by Fermi, while it'll likely still work, Harmony is recommended. Continue?",
+ "in":"Spacebar instances are no longer officially supported by Fermi, while it'll likely still work, Harmony is recommended. If you're the instance owner, please look into switching your instance over to the fork called Harmony."
+ },
"unpinMessage": "Unpin message",
"updateAv": "Updates available",
"uploadBanner": "Upload banner:",
From 14e6c79970e43073976a25e78f1ae75b3c438d52 Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Wed, 8 Apr 2026 15:38:46 -0500
Subject: [PATCH 02/15] remove code fetching instances from spacebar
---
src/index.ts | 28 ----------------------------
1 file changed, 28 deletions(-)
diff --git a/src/index.ts b/src/index.ts
index ea7a2d6..6720efb 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,7 +1,6 @@
import http from "http";
import fs from "node:fs/promises";
import path from "node:path";
-import {observe} from "./stats.js";
import {getApiUrls} from "./utils.js";
import {fileURLToPath} from "node:url";
import {readFileSync} from "fs";
@@ -164,33 +163,6 @@ for (const instance of instances) {
instanceNames.set(instance.name, instance);
}
-async function updateInstances(): Promise {
- try {
- const response = await fetch(
- "https://raw.githubusercontent.com/spacebarchat/spacebarchat/master/instances/instances.json",
- );
- const json = (await response.json()) as Instance[];
- for (const instance of json) {
- if (instanceNames.has(instance.name)) {
- const existingInstance = instanceNames.get(instance.name);
- if (existingInstance) {
- for (const key of Object.keys(instance)) {
- if (!(key in existingInstance)) {
- existingInstance[key] = instance[key];
- }
- }
- }
- } else {
- instances.push(instance as any);
- }
- }
- observe(instances);
- } catch (error) {
- console.error("Error updating instances:", error);
- }
-}
-
-updateInstances();
/*
app.set("trust proxy", (ip: unknown) => {
if (typeof ip !== "string") return false;
From fda1fb61cd97d7f058bc6f0f94f73a139733d2e4 Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Wed, 8 Apr 2026 15:52:29 -0500
Subject: [PATCH 03/15] untrue info
---
InstanceInfo.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/InstanceInfo.md b/InstanceInfo.md
index 6deb0c8..7107e8e 100644
--- a/InstanceInfo.md
+++ b/InstanceInfo.md
@@ -32,7 +32,6 @@ Anything with a `?` in-front of its `:` are optional, though you must either inc
Some of these values may not be used right now, though they will likely be used in the future, so feel free to fill out what you like, though the more you fill out the more information we can give the users about your instance in the future.
`language` should be [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1_codes).
`country` should be [ISO 8166-2 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).
-You can also add yourself to [this](https://github.com/spacebarchat/spacebarchat/tree/master/instances) list, and you should, though there are **some disadvantages** to only being in that list such as not being on the Fermi Discovery list which shows Guilds more higher up on the Fermi client, etc.
# Questions
## Do I have to do this to let Fermi Client connect to my server?
From aafdf9a4a18f64a24943b1c13f45bb118e41a633 Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Wed, 8 Apr 2026 15:52:54 -0500
Subject: [PATCH 04/15] update readme
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 6bf2e62..28c06f5 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
# Fermi
-Fermi is a [Spacebar](https://spacebar.chat) Client written in TS, HTML, and CSS.
+Fermi is a [Harmony](https://redir.fermi.chat/server) Client written in TS, HTML, and CSS.

From 15ecfa8b07f665dd70a59a0bf8dd6bb7c7210b8b Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Wed, 8 Apr 2026 15:53:19 -0500
Subject: [PATCH 05/15] don't display
---
src/webpage/instances.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/webpage/instances.json b/src/webpage/instances.json
index a5d49c5..8b50437 100644
--- a/src/webpage/instances.json
+++ b/src/webpage/instances.json
@@ -3,7 +3,8 @@
"name": "Spacebar",
"description": "The official Spacebar instance.",
"image": "https://raw.githubusercontent.com/spacebarchat/spacebarchat/master/branding/png/Spacebar__Icon-Discord.png",
- "url": "https://spacebar.chat"
+ "url": "https://spacebar.chat",
+ "display":false
},
{
"name": "Fastbar",
From ddff2a104804065c55bb32ce1d43bea2476d48f3 Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Wed, 8 Apr 2026 15:53:52 -0500
Subject: [PATCH 06/15] add comment
---
src/webpage/oauth2/auth.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/webpage/oauth2/auth.ts b/src/webpage/oauth2/auth.ts
index faf0032..1693211 100644
--- a/src/webpage/oauth2/auth.ts
+++ b/src/webpage/oauth2/auth.ts
@@ -47,6 +47,7 @@ type botjsonfetch = {
if (window.location.pathname.startsWith("/oauth2")) {
const users = getBulkUsers();
const params = new URLSearchParams(window.location.search);
+ //TODO replace me
const well = params.get("instance") || "https://spacebar.chat";
const permstr = params.get("permissions");
const joinable: Specialuser[] = [];
From 5bc05448fdf47dc48bd9f541b29f3ebfeb852412 Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Wed, 8 Apr 2026 15:54:09 -0500
Subject: [PATCH 07/15] purge comment
---
src/webpage/utils/progessiveLoad.ts | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/src/webpage/utils/progessiveLoad.ts b/src/webpage/utils/progessiveLoad.ts
index 134769b..6daa41d 100644
--- a/src/webpage/utils/progessiveLoad.ts
+++ b/src/webpage/utils/progessiveLoad.ts
@@ -315,12 +315,3 @@ export async function ProgessiveDecodeJSON(
await prog.ready;
return identifyType(prog) as Promise>;
}
-/*
-const test = [1, 2, 3, 4, 5, 6];
-const blob = new Blob([JSON.stringify(test)]);
-ProgessiveDecodeJSON("https://api.github.com/repos/spacebarchat/server/git/refs")
- .then(async (obj) => {
- console.log(await obj.getWhole()); //returns the ping object
- })
- .then(console.warn);
-//*/
From 0392b6ec4798ee62a3ba252a13568fb66b7b0146 Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Wed, 8 Apr 2026 15:54:30 -0500
Subject: [PATCH 08/15] update english server string
---
translations/en.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/translations/en.json b/translations/en.json
index eda2c4d..6393e18 100644
--- a/translations/en.json
+++ b/translations/en.json
@@ -200,7 +200,7 @@
}
},
"channelLink": "# $1",
- "clientDesc": "Client version: $1\n\n[Join the official Fermi guild]($2/invite/USgYJo?instance=https%3A%2F%2Fspacebar.chat)\n\n[Help translate Fermi](https://translatewiki.net/wiki/Translating:JankClient#sortable:3=desc) \n\n[Help create Fermi](https://github.com/MathMan05/Fermi)\n\n[Help maintain the server Fermi relies on](https://github.com/spacebarchat/server)\n\n[Read the blog](https://blog.fermi.chat/)\n\nCalculated rights: $3",
+ "clientDesc": "Client version: $1\n\n[Join the official Fermi guild]($2/invite/USgYJo?instance=https%3A%2F%2Fspacebar.chat)\n\n[Help translate Fermi](https://translatewiki.net/wiki/Translating:JankClient#sortable:3=desc) \n\n[Help create Fermi](https://github.com/MathMan05/Fermi)\n\n[Help maintain the server Fermi relies on](https://redir.fermi.chat/server)\n\n[Read the blog](https://blog.fermi.chat/)\n\nCalculated rights: $3",
"commands": {
"errorNotValid": "$1 is not a valid choice for $2",
"required": "$1 is a required part of this command"
From 536e7397c7469caf882712b4a68369b6405db95e Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Wed, 8 Apr 2026 15:56:47 -0500
Subject: [PATCH 09/15] more changes
---
README.md | 2 +-
translations/en.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 28c06f5..8b57abe 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ You can view the current roadmap on https://github.com/users/MathMan05/projects/
AI code due to not being GPLv3 compatable is not allowed in this repo. I thought this didn't need to be said, but it does.
And to be clear, *any* use of AI is not allowed in Fermi.
## Link
-The official Spacebar server for Fermi: https://fermi.chat/invite/USgYJo?instance=https%3A%2F%2Fspacebar.chat
+The official Spacebar server for Fermi: https://redir.fermi.chat/invite
The current hosted instance of Fermi: https://fermi.chat/
diff --git a/translations/en.json b/translations/en.json
index 6393e18..6d4ee8f 100644
--- a/translations/en.json
+++ b/translations/en.json
@@ -200,7 +200,7 @@
}
},
"channelLink": "# $1",
- "clientDesc": "Client version: $1\n\n[Join the official Fermi guild]($2/invite/USgYJo?instance=https%3A%2F%2Fspacebar.chat)\n\n[Help translate Fermi](https://translatewiki.net/wiki/Translating:JankClient#sortable:3=desc) \n\n[Help create Fermi](https://github.com/MathMan05/Fermi)\n\n[Help maintain the server Fermi relies on](https://redir.fermi.chat/server)\n\n[Read the blog](https://blog.fermi.chat/)\n\nCalculated rights: $3",
+ "clientDesc": "Client version: $1\n\n[Join the official Fermi guild](https://redir.fermi.chat/invite)\n\n[Help translate Fermi](https://translatewiki.net/wiki/Translating:JankClient#sortable:3=desc) \n\n[Help create Fermi](https://github.com/MathMan05/Fermi)\n\n[Help maintain the server Fermi relies on](https://redir.fermi.chat/server)\n\n[Read the blog](https://blog.fermi.chat/)\n\nCalculated rights: $3",
"commands": {
"errorNotValid": "$1 is not a valid choice for $2",
"required": "$1 is a required part of this command"
From 746f5fe10513b8cf91417e483f23a9e62e6182b6 Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Wed, 8 Apr 2026 15:58:39 -0500
Subject: [PATCH 10/15] translate link short
---
src/webpage/index.html | 2 +-
translations.md | 2 +-
translations/en.json | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/webpage/index.html b/src/webpage/index.html
index 8c90cac..e02a4ee 100644
--- a/src/webpage/index.html
+++ b/src/webpage/index.html
@@ -85,7 +85,7 @@
Date: Wed, 8 Apr 2026 16:03:15 -0500
Subject: [PATCH 11/15] change name
---
InstanceInfo.md | 2 +-
src/index.ts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/InstanceInfo.md b/InstanceInfo.md
index 7107e8e..0f92ada 100644
--- a/InstanceInfo.md
+++ b/InstanceInfo.md
@@ -21,7 +21,7 @@ Inside of `webpage` you'll see a file called `instances.json` in that file you'l
"discord"?:,
"github"?:,
"email"?:,
- "spacebar":?:,
+ "harmony":?:,
"matrix"?:,
"mastodon"?:
}
diff --git a/src/index.ts b/src/index.ts
index 6720efb..573d06a 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -148,7 +148,7 @@ export type instance = {
discord?: string;
github?: string;
email?: string;
- spacebar?: string;
+ harmony?: string;
matrix?: string;
mastodon?: string;
};
From eca1aa76aa073fb58ba3cb5d79cbdda882418d22 Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Wed, 8 Apr 2026 16:04:55 -0500
Subject: [PATCH 12/15] update names
---
InstanceInfo.md | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/InstanceInfo.md b/InstanceInfo.md
index 0f92ada..c6bb2fe 100644
--- a/InstanceInfo.md
+++ b/InstanceInfo.md
@@ -21,7 +21,7 @@ Inside of `webpage` you'll see a file called `instances.json` in that file you'l
"discord"?:,
"github"?:,
"email"?:,
- "harmony":?:,
+ "harmony":?:,
"matrix"?:,
"mastodon"?:
}
@@ -36,9 +36,9 @@ Some of these values may not be used right now, though they will likely be used
# Questions
## Do I have to do this to let Fermi Client connect to my server?
No, you may choose to not do this, this just makes it easier for people using Fermi Client to find and use your instance as it's in the dropdown menu for instances, though the user may enter any instance they please.
-## If my instance isn't Spacebar is that allowed to be entered?
-If it's Spacebar compatible then yes, it may be entered. Though if there are **too many incompatibilities** however, it may not be included, or may need a warning of sorts.
-## I'm hosting my own instance of Spacebar and would like to change the default instance on my instance of Fermi Client to my own instance.
+## If my instance isn't Harmony is that allowed to be entered?
+If it's Harmony compatible then yes, it may be entered. Though if there are **too many incompatibilities** however, it may not be included, or may need a warning of sorts.
+## I'm hosting my own instance of Harmony and would like to change the default instance on my instance of Fermi Client to my own instance.
Just change the first entry in the list to your own, and it should connect without issue.
-## Why would I put my instance in this list over the official Spacebar list?
+## Why would I put my instance in this list over the official Harmony list?
While putting your instance in the other list will get it to show up on Fermi client, this list does have more settings, and will show up earlier in the results, though either list will work to get in the dropdown menu.
From b7b00fde2a643c8f32120176ce5a7206bf87bdf5 Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Wed, 8 Apr 2026 17:06:03 -0500
Subject: [PATCH 13/15] update coc link
---
CODE_OF_CONDUCT.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 9887eae..42ed5e4 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -1,5 +1,5 @@
# Code of conduct
It's nothing complicated, I want to foster a nice community, if there's any issues feel free to contact me in any way you see fit, though please don't create problems for me. I'm just one person and I want to work on this project, not community management. I will likely start with a warning or two if any issues arise, though this is up to my (mathium05) sole discretion.
-Generally follow https://docs.spacebar.chat/contributing/conduct/ and you should be fine. Do not try to pull technicalities, this is a FOSS project, not a court of law.
+Generally follow https://redir.fermi.chat/coc and you should be fine. Do not try to pull technicalities, this is a FOSS project, not a court of law.
Happy coding!
From ba60c17fb98ca17bba7ac0d75509317edf253413 Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Sun, 12 Apr 2026 15:38:04 -0500
Subject: [PATCH 14/15] delete fastbar for bad uptime and being spacebar
---
src/webpage/instances.json | 20 --------------------
1 file changed, 20 deletions(-)
diff --git a/src/webpage/instances.json b/src/webpage/instances.json
index 8b50437..d33a287 100644
--- a/src/webpage/instances.json
+++ b/src/webpage/instances.json
@@ -5,25 +5,5 @@
"image": "https://raw.githubusercontent.com/spacebarchat/spacebarchat/master/branding/png/Spacebar__Icon-Discord.png",
"url": "https://spacebar.chat",
"display":false
- },
- {
- "name": "Fastbar",
- "description": "The best Spacebar instance with 95% uptime, running under on a NVME drive running with bleeding edge stuff <3",
- "image": "https://spacebar.greysilly7.xyz/logo.png",
- "url": "https://greysilly7.xyz",
- "language": "en",
- "country": "US",
- "display": true,
- "urls": {
- "wellknown": "https://greysilly7.xyz",
- "api": "https://api-spacebar.greysilly7.xyz/api",
- "cdn": "https://cdn-spacebar.greysilly7.xyz",
- "gateway": "wss://gateway-spacebar.greysilly7.xyz"
- },
- "contactInfo": {
- "discord": "greysilly7",
- "github": "https://github.com/greysilly7",
- "email": "greysilly7@gmail.com"
- }
}
]
From 63c30b4d50952b30acc316807d5f6280789984ed Mon Sep 17 00:00:00 2001
From: MathMan05
Date: Sun, 12 Apr 2026 15:43:22 -0500
Subject: [PATCH 15/15] fix zero
---
src/webpage/settings.ts | 6 +++---
src/webpage/utils/utils.ts | 10 +++++++---
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/webpage/settings.ts b/src/webpage/settings.ts
index 4c5c6a0..485d02a 100644
--- a/src/webpage/settings.ts
+++ b/src/webpage/settings.ts
@@ -1003,9 +1003,6 @@ class InstancePicker implements OptionsElement {
}
for (const instance of json) {
- if (instance.display === false) {
- continue;
- }
const option = document.createElement("option");
option.disabled = !instance.online;
option.value = instance.name;
@@ -1024,6 +1021,9 @@ class InstancePicker implements OptionsElement {
} else {
option.label = instance.name;
}
+ if (instance.display === false) {
+ continue;
+ }
datalist.append(option);
}
}
diff --git a/src/webpage/utils/utils.ts b/src/webpage/utils/utils.ts
index 84d62e3..2ac7bfc 100644
--- a/src/webpage/utils/utils.ts
+++ b/src/webpage/utils/utils.ts
@@ -371,8 +371,12 @@ class Directory {
export {Directory};
-const mobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent) || (window.matchMedia && window.matchMedia("(pointer: coarse)").matches);
-const iOS = /iPhone|iPad|iPod/i.test(navigator.userAgent) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);
+const mobile =
+ /iPhone|iPad|iPod|Android/i.test(navigator.userAgent) ||
+ (window.matchMedia && window.matchMedia("(pointer: coarse)").matches);
+const iOS =
+ /iPhone|iPad|iPod/i.test(navigator.userAgent) ||
+ (navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1);
export {mobile, iOS};
const datalist = document.getElementById("instances");
@@ -451,7 +455,7 @@ export async function getapiurls(str: string): Promise {
//region Instance list
export async function getInstanceInfo(str: string): Promise {
// wait for it to be loaded...? Where is this even comming from?
- if (stringURLMap.size == 0) {
+ if (stringURLMap.size === 0) {
await new Promise((res, _) => {
let intervalId = setInterval(() => {
if (stringURLMap.size !== 0) {