Rebrand: Nexus Terminal → Alchementary Link

Renames the product across the codebase: Go module path, config/data
paths, keychain service name, export file extension, build tooling,
docs, and UI text. Sidebar brand mark now reads ">_ AlchementaryLink"
with "Alchementary" in the connection-group gold accent colour, and
the window title is "Alchementary Link".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019T8bJS8BCtY5GeSG2HBj1n
This commit is contained in:
Andy Dixon
2026-09-03 16:41:23 +01:00
co-authored by Claude Sonnet 5
parent 114060127f
commit 1a380a0e99
135 changed files with 678 additions and 674 deletions
+28 -28
View File
@@ -1,6 +1,6 @@
(function () {
/**
* Nexus Terminal — xterm.js terminal manager.
* Alchementary Link — xterm.js terminal manager.
* Creates, manages, and destroys xterm.js instances for SSH and Telnet sessions.
* Handles data routing, resizing, and search.
*/
@@ -52,7 +52,7 @@
const themeName =
(this.app.state.preferences || {}).terminalTheme || "charcoal";
const term = new Terminal({
theme: window.NexusTerminal.getTerminalTheme(themeName),
theme: window.AlchementaryLink.getTerminalTheme(themeName),
fontFamily:
profile.terminalFontFamily ||
'JetBrains Mono, Menlo, Monaco, Consolas, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", monospace',
@@ -155,7 +155,7 @@
const data = seq.repeat(lines);
const b64 = utf8ToBase64(data);
try {
window.NexusTerminal.wailsService.WriteSession(sessionId, b64);
window.AlchementaryLink.wailsService.WriteSession(sessionId, b64);
} catch (_) {
/* non-critical */
}
@@ -263,7 +263,7 @@
try {
const b64 = utf8ToBase64(data);
window.NexusTerminal.wailsService.WriteSession(sessionId, b64);
window.AlchementaryLink.wailsService.WriteSession(sessionId, b64);
// Broadcast to other connected sessions if enabled
if (this.app.state.broadcastMode) {
@@ -275,7 +275,7 @@
const otherSession = this.app.state.getSession(otherId);
if (otherSession && otherSession.state === "connected") {
try {
window.NexusTerminal.wailsService.WriteSession(otherId, b64);
window.AlchementaryLink.wailsService.WriteSession(otherId, b64);
} catch (_) {
/* non-critical */
}
@@ -570,7 +570,7 @@
* @param {string} themeName
*/
applyTheme(themeName) {
const themeObj = window.NexusTerminal.getTerminalTheme(themeName);
const themeObj = window.AlchementaryLink.getTerminalTheme(themeName);
for (const [, entry] of this.terminals) {
entry.term.options.theme = themeObj;
}
@@ -584,7 +584,7 @@
if (cols <= 0 || rows <= 0) return;
Promise.resolve(
window.NexusTerminal.wailsService.ResizeSession(sessionId, cols, rows),
window.AlchementaryLink.wailsService.ResizeSession(sessionId, cols, rows),
).catch((err) => console.error("ResizeSession error:", err));
}
@@ -593,7 +593,7 @@
entry.localRestarting = true;
try {
await window.NexusTerminal.wailsService.RestartLocalSession(
await window.AlchementaryLink.wailsService.RestartLocalSession(
sessionId,
entry.term.cols,
entry.term.rows,
@@ -617,7 +617,7 @@
let overlay = panel.querySelector(".terminal-disconnect-overlay");
if (overlay) return overlay;
const { createElement } = window.NexusTerminal;
const { createElement } = window.AlchementaryLink;
if (!createElement) return null;
overlay = createElement("div", "terminal-disconnect-overlay");
@@ -653,7 +653,7 @@
* @private
*/
_showTerminalContextMenu(sessionId, term, x, y) {
const { createElement, dismissContextMenus } = window.NexusTerminal;
const { createElement, dismissContextMenus } = window.AlchementaryLink;
dismissContextMenus();
const isMac = navigator.platform.indexOf("Mac") !== -1;
@@ -813,7 +813,7 @@
}
_promptFileDropAction(files, canUpload) {
const { createElement, escapeHtml, formatBytes } = window.NexusTerminal;
const { createElement, escapeHtml, formatBytes } = window.AlchementaryLink;
return new Promise((resolve) => {
const backdrop = createElement("div", "modal-backdrop");
const modal = createElement("div", "modal modal-sm");
@@ -951,7 +951,7 @@
const totalBytes = typeof file.size === "number" ? file.size : 0;
let uploadId = "";
try {
uploadId = await window.NexusTerminal.wailsService.SFTPUploadStart(
uploadId = await window.AlchementaryLink.wailsService.SFTPUploadStart(
sessionId,
remoteDir,
file.name,
@@ -962,14 +962,14 @@
const end = Math.min(offset + UPLOAD_CHUNK_BYTES, totalBytes);
const buffer = await this._readFileSlice(file, offset, end);
const base64Data = this._arrayBufferToBase64(buffer);
await window.NexusTerminal.wailsService.SFTPUploadChunk(uploadId, base64Data);
await window.AlchementaryLink.wailsService.SFTPUploadChunk(uploadId, base64Data);
}
await window.NexusTerminal.wailsService.SFTPUploadFinish(uploadId);
await window.AlchementaryLink.wailsService.SFTPUploadFinish(uploadId);
} catch (err) {
if (uploadId) {
try {
await window.NexusTerminal.wailsService.SFTPUploadCancel(uploadId);
await window.AlchementaryLink.wailsService.SFTPUploadCancel(uploadId);
} catch (_) {
/* noop */
}
@@ -1001,7 +1001,7 @@
}
_openUploadDirectoryPicker(sessionId) {
const { createElement, escapeHtml } = window.NexusTerminal;
const { createElement, escapeHtml } = window.AlchementaryLink;
return new Promise((resolve) => {
const backdrop = createElement("div", "modal-backdrop");
const modal = createElement("div", "modal modal-lg");
@@ -1223,12 +1223,12 @@
renderLoading();
try {
const targetPath =
path || (await window.NexusTerminal.wailsService.SFTPPwd(sessionId));
const files = await window.NexusTerminal.wailsService.SFTPList(
path || (await window.AlchementaryLink.wailsService.SFTPPwd(sessionId));
const files = await window.AlchementaryLink.wailsService.SFTPList(
sessionId,
targetPath,
);
const stat = await window.NexusTerminal.wailsService.SFTPStat(
const stat = await window.AlchementaryLink.wailsService.SFTPStat(
sessionId,
targetPath,
);
@@ -1320,7 +1320,7 @@
}
_buildPickerRow(entry, index) {
const { createElement } = window.NexusTerminal;
const { createElement } = window.AlchementaryLink;
const dataset = { path: entry.path || "" };
if (typeof index === "number") {
dataset.index = String(index);
@@ -1395,7 +1395,7 @@
* @private
*/
_exportTerminalOutput(sessionId, term) {
const { createElement } = window.NexusTerminal;
const { createElement } = window.AlchementaryLink;
const buffer = term.buffer.active;
const lines = [];
for (let i = 0; i < buffer.length; i++) {
@@ -1438,7 +1438,7 @@
* @private
*/
_showPortForwardPanel(sessionId) {
const { createElement, escapeHtml } = window.NexusTerminal;
const { createElement, escapeHtml } = window.AlchementaryLink;
const session = this.app.state.getSession(sessionId);
if (!session || session.protocol !== "ssh") {
this.app.notifications.error(
@@ -1502,7 +1502,7 @@
const renderForwards = async () => {
try {
const forwards =
(await window.NexusTerminal.wailsService.ListPortForwards(sessionId)) || [];
(await window.AlchementaryLink.wailsService.ListPortForwards(sessionId)) || [];
listEl.innerHTML = "";
if (forwards.length === 0) {
listEl.innerHTML =
@@ -1528,7 +1528,7 @@
});
stopBtn.addEventListener("click", async () => {
try {
await window.NexusTerminal.wailsService.StopPortForward(sessionId, fwd.id);
await window.AlchementaryLink.wailsService.StopPortForward(sessionId, fwd.id);
self.app.notifications.info("Forward stopped");
renderForwards();
} catch (err) {
@@ -1573,7 +1573,7 @@
}
try {
await window.NexusTerminal.wailsService.StartPortForward(sessionId, {
await window.AlchementaryLink.wailsService.StartPortForward(sessionId, {
id: "",
direction: direction,
bindHost: bindHost,
@@ -1604,10 +1604,10 @@
_buildTheme() {
const themeName =
(this.app.state.preferences || {}).terminalTheme || "charcoal";
return window.NexusTerminal.getTerminalTheme(themeName);
return window.AlchementaryLink.getTerminalTheme(themeName);
}
}
window.NexusTerminal = window.NexusTerminal || {};
window.NexusTerminal.TerminalManager = TerminalManager;
window.AlchementaryLink = window.AlchementaryLink || {};
window.AlchementaryLink.TerminalManager = TerminalManager;
})();