Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
daa6d6e
Add server info panel and password rotation features
JacksonTheMaster Feb 3, 2026
695ebf9
Add Expert Settings configuration options to the web UI
JacksonTheMaster Feb 3, 2026
a18cd71
removed backup retention vals from PrintConfigDetails
JacksonTheMaster Feb 3, 2026
9210de9
Refactor password rotation to generate a random 6-digit password and 

JacksonTheMaster Feb 3, 2026
5a4b72c
bump version to 5.12.1
JacksonTheMaster Feb 3, 2026
da4b92e
Add Expert Settings configuration options to the web UI
JacksonTheMaster Feb 3, 2026
d9c19c8
removed backup retention vals from PrintConfigDetails
JacksonTheMaster Feb 3, 2026
33a26f1
Refactor password rotation to generate a random 6-digit password and 

JacksonTheMaster Feb 3, 2026
aebb540
bump version to 5.12.1
JacksonTheMaster Feb 3, 2026
3aafbe7
feat: Implement interactive CLI dashboard in an effort to improve CLI

JacksonTheMaster Feb 5, 2026
0fc825a
fix: Increase buffer size for global console channel to improve log o

JacksonTheMaster Feb 5, 2026
098b4c1
Update panel order and enhance key bindings help text for improved us

JacksonTheMaster Feb 5, 2026
23d1ba6
improved initialization flow by rearranging after start tasks and rem

JacksonTheMaster Feb 5, 2026
f6e2b19
Enhance dashboard functionality:
JacksonTheMaster Feb 5, 2026
39d9e36
review: Update config page varibale names to match others (TrueSelect

JacksonTheMaster Feb 6, 2026
dbfe255
fix: Add mutex for dashboard hooks to prevent race conditions
JacksonTheMaster Feb 6, 2026
4e14630
Merge branch 'nightly' into feat-cli-improvement
JacksonTheMaster Feb 6, 2026
114a38f
Merge pull request #149 from StationeersServerUI/feat-cli-improvement
JacksonTheMaster Feb 6, 2026
4ef3a5e
run go mod tidy
JacksonTheMaster Feb 6, 2026
d675493
feat: Implement backup download functionality and enhance UI backup c

JacksonTheMaster Feb 6, 2026
0227b59
feat: Add Discord download command and button interaction for backup 

JacksonTheMaster Feb 6, 2026
ddd5064
fix: Update ghcr docker builds for nightly to include '-nightly' suff

JacksonTheMaster Feb 6, 2026
8d98469
improved localized config page headline
JacksonTheMaster Feb 6, 2026
854df76
feat: Add back button functionality to sliding tabs on config page an

JacksonTheMaster Feb 6, 2026
eae72ee
add expert settings localization strings
JacksonTheMaster Feb 6, 2026
5a32297
fix: Update fetchStatusCmd to use GetGameBranch to correctly show gam

JacksonTheMaster Feb 7, 2026
7bfe9ea
fix: reduce deadlock risk by optimizing dashboard hooks by reducing l

JacksonTheMaster Feb 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .github/workflows/ghcr-build-nightly.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:

- name: Lowercase the repo name
run: |
echo "IMAGE_NAME=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV
echo "IMAGE_NAME=${GITHUB_REPOSITORY,,}-nightly" >> $GITHUB_ENV

- name: Extract metadata
id: meta
Expand All @@ -31,8 +31,7 @@ jobs:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=raw,value=nightly
flavor: |
latest=false
type=raw,value=latest

- name: Set up QEMU
uses: docker/setup-qemu-action@v3
Expand Down
7 changes: 7 additions & 0 deletions UIMod/onboard_bundled/assets/css/config.css
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,13 @@
background-position: center;
}

/*Back icon - left arrow*/
.back-icon {
background-image: url("/static/icons/back.webp");
background-repeat: no-repeat;
background-position: center;
}

/* Detection Manager Icon - radar/search icon */
.detection-icon {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23ffffff'%3E%3Cpath d='M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z'/%3E%3Cpath d='M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-1 5h2v2h-2v-2zm0-2h2v1h-2v-1zm0-1h2v1h-2v-1z'/%3E%3C/svg%3E");
Expand Down
12 changes: 10 additions & 2 deletions UIMod/onboard_bundled/assets/css/home.css
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,14 @@
opacity: 0.8;
}

.restore-btn {
.backup-actions {
display: flex;
gap: 8px;
flex-shrink: 0;
}

.restore-btn,
.download-btn {
padding: 10px 18px;
background-color: rgba(0, 255, 171, 0.1);
color: var(--text-bright);
Expand All @@ -445,7 +452,8 @@
text-transform: uppercase;
}

.restore-btn:hover {
.restore-btn:hover,
.download-btn:hover {
background-color: var(--primary);
color: #000;
}
Expand Down
Binary file added UIMod/onboard_bundled/assets/icons/back.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions UIMod/onboard_bundled/assets/js/console-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ function handleConsole() {
"Balancing gas mixtures... kaboom imminent, run you fool!",
"Spoiler: object reference not set to an instance of an object, lol",
"Fun fact: SSUI was originally a simple powershell script",
"Fun fact: This dashboard was supposed to look like the retro computer from Stationeers. We tried, ok?",
"Convincing server that 'out of memory' is just a state of mind.",
"Moo, Moo! I'm a cow!",
"Welcome home, Sir!"
Expand Down
48 changes: 47 additions & 1 deletion UIMod/onboard_bundled/assets/js/server-api.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ function fetchBackups() {
const backupType = "Dotsave"
const fileName = "Backup Index: " + backup.Index;
const formattedDate = "Created: " + new Date(backup.SaveTime).toLocaleString();
const isDotsave = backupType === "Dotsave";

li.innerHTML = `
<div class="backup-info">
Expand All @@ -85,7 +86,10 @@ function fetchBackups() {
</div>
<div class="backup-date">${formattedDate}</div>
</div>
<button class="restore-btn" onclick="restoreBackup(${backup.Index})">Restore</button>
<div class="backup-actions">
${isDotsave ? `<button class="download-btn" onclick="downloadBackup(${backup.Index})">Download</button>` : ''}
<button class="restore-btn" onclick="restoreBackup(${backup.Index})">Restore</button>
</div>
`;

backupList.appendChild(li);
Expand Down Expand Up @@ -208,6 +212,48 @@ function restoreBackup(index) {
.catch(err => console.error(`Failed to restore backup ${index}:`, err));
}

function downloadBackup(index) {
const status = document.getElementById('status');
status.hidden = false;
typeTextWithCallback(status, 'Preparing download...', 20, () => {});

fetch('/api/v2/backups/download', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ index: index })
})
.then(response => {
if (!response.ok) {
return response.json().then(err => { throw new Error(err.error || 'Download failed'); });
}
const disposition = response.headers.get('Content-Disposition');
let filename = `backup_${index}.save`;
if (disposition) {
const match = disposition.match(/filename="(.+)"/);
if (match) filename = match[1];
}
return response.blob().then(blob => ({ blob, filename }));
})
.then(({ blob, filename }) => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
a.remove();
status.hidden = true;
})
.catch(err => {
console.error(`Failed to download backup ${index}:`, err);
showPopup('error', 'Download failed: ' + err.message);
status.hidden = true;
});
}

function pollRecurringTasks() {
window.gamserverstate = false;

Expand Down
12 changes: 10 additions & 2 deletions UIMod/onboard_bundled/localization/de-DE.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
"UIText_UpdateFailed": "Aktualisierung fehlgeschlagen. Bitte versuche es spÀter erneut."
},
"config": {
"UIText_BackToDashboard": "ZurĂŒck zum Dashboard",
"UIText_ConfigHeadline": "Einstellungen",
"UIText_ServerConfig": "Server Konfiguration",
"UIText_DiscordIntegration": "Discord-Integration",
"UIText_SLPModIntegration": "Launchpad Mods",
Expand All @@ -32,6 +34,7 @@
"UIText_BasicSettings": "Basis",
"UIText_NetworkSettings": "Netzwerk",
"UIText_AdvancedSettings": "Erweitert",
"UIText_TerrainSettings": "Weltgenerierung",
"basic": {
"UIText_BasicServerSettings": "Grundlegende Servereinstellungen",
"UIText_ServerName": "Servername",
Expand Down Expand Up @@ -82,6 +85,8 @@
"UIText_ServerExePathInfo2": "Aus SicherheitsgrĂŒnden nicht ĂŒber UI editierbar, aber manuell in config.json Ă€nderbar.",
"UIText_AdditionalParams": "ZusÀtzliche Parameter",
"UIText_AdditionalParamsInfo": "Format: EigenParam1 Wert1 EigenParam2 Wert2",
"UIText_ShowExpertSettings": "Experteneinstellungen anzeigen",
"UIText_ShowExpertSettingsInfo": "Die Experteneinstellungen anzeigen, um auf spezielle Konfigurationsoptionen zuzugreifen. Die Konfiguration muss nach Änderung dieser Einstellung gespeichert werden, damit die Änderungen wirksam werden.",
"UIText_AutoRestartServerTimer": "Geplanter Gameserver Neustart",
"UIText_AutoRestartServerTimerInfo": "<p>Zeitraum in <strong>Minuten</strong> oder <strong>Zeitformat (z. B. 15:04 oder 03:04 Uhr)</strong> um einen automatischen Neustart des Spielservers zu planen. 0 = deaktiviert, 1440 = 24 Stunden usw. Vor dem Neustart wird <strong>im Spiel</strong> die Meldung „Achtung, der Server wird in 30/20/10/5 Sekunden neu gestartet!“ angezeigt .</p>",
"UIText_GameBranch": "Spiel Branch",
Expand Down Expand Up @@ -117,6 +122,10 @@
"UIText_AdminCommandChannelInfo": "Channel fĂŒr Admin-Befehle",
"UIText_ControlPanelChannel": "Kontrollpanel Channel",
"UIText_ControlPanelChannelInfo": "Channel fĂŒr Kontrollpanel",
"UIText_ServerInfoPanelChannel": "Server-Info-Panel Channel",
"UIText_ServerInfoPanelChannelInfo": "Optionaler Channel, der den Servernamen fĂŒr Benutzer (nicht Admins) anzeigt und Benutzern die Möglichkeit gibt, das aktuelle Server-Passwort abzurufen.",
"UIText_RotateServerPassword": "Server-Passwort rotieren",
"UIText_RotateServerPasswordInfo": "Rotiert das Server-Passwort automatisch bei jedem Serverstart. Spieler können das aktuelle Passwort ĂŒber einen Button im \"Server-Info-Panel Channel\" abrufen.",
"UIText_StatusChannel": "Statuskanal",
"UIText_StatusChannelInfo": "Server Status Updates",
"UIText_ConnectionListChannel": "Verbindungslisten Channel",
Expand Down Expand Up @@ -157,8 +166,7 @@
"UIText_SLP_UpdateWorkshopModsDesc": "Aktualisiert alle installierten Workshop-Mods auf die neueste Version. Dieser Vorgang kann je nach Anzahl der Mods einige Zeit dauern.",
"UIText_SLP_UpdateButton": "Workshop-Mods aktualisieren",
"UIText_SLP_InstalledMods": "Installierte Mods"
},
"UIText_TerrainSettings": "Weltgenerierung"
}
},
"setup": {
"UIText_FooterText": "Hilfe benötigt? Schaue ins Stationeers Server UI Github Wiki.",
Expand Down
13 changes: 13 additions & 0 deletions UIMod/onboard_bundled/localization/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
"UIText_UpdateFailed": "Update failed. Please try again later."
},
"config": {
"UIText_BackToDashboard": "Back to Dashboard",
"UIText_ConfigHeadline": "Settings & Configuration",
"UIText_ServerConfig": "Server Configuration",
"UIText_DiscordIntegration": "Discord Integration",
"UIText_SLPModIntegration": "Launchpad Mods",
Expand All @@ -33,6 +35,11 @@
"UIText_NetworkSettings": "Network Settings",
"UIText_AdvancedSettings": "Advanced Features",
"UIText_TerrainSettings": "World generation",
"tabDescriptions": {
"UIText_ServerConfigTabDescription": "Here you can configure settings related to your gameserver like basic settings like server name and password, network settings like ports and UPnP, and SSUI settings like automatic SSUI updates, scheduled gameserver restarts and more.",
"UIText_DiscordIntegrationTabDescription": "Configure the Discord integration for real-time server status updates, remote management, player connection tracking, and community engagement. Learn more about the Discord integration and setup instructions in the <href href='https://github.com/SteamServerUI/StationeersServerUI/wiki/Discord-Integration'>Wiki.</href>",
"UIText_SLPModIntegrationTabDescription": "Easily manage your Stationeers mods with our Stationeers Launch Pad (SLP) integration. Learn more about the SLP integration in the <href href='https://github.com/SteamServerUI/StationeersServerUI/wiki/Modding-with-StationeersLaunchPad'>Wiki.</href>"
},
"basic": {
"UIText_BasicServerSettings": "Basic Server Settings",
"UIText_ServerName": "Server Name",
Expand Down Expand Up @@ -83,6 +90,8 @@
"UIText_ServerExePathInfo2": "Not editable from the UI for security reasons, but you can edit it manually in the config.json file.",
"UIText_AdditionalParams": "Additional Parameters",
"UIText_AdditionalParamsInfo": "Format: CustomParam1 Value1 CustomParam2 Value2",
"UIText_ShowExpertSettings": "Show Expert Settings",
"UIText_ShowExpertSettingsInfo": "Show the Expert Settings and access special configuration options below. The config needs to be saved after changing this setting for the changes to take effect.",
"UIText_AutoRestartServerTimer": "Scheduled Gameserver Restart",
"UIText_AutoRestartServerTimerInfo": "<p>Timeframe in <strong>minutes</strong> or <strong>time format (e.g., 15:04 or 03:04PM)</strong> to schedule an automatic gameserver restart. 0 = disabled, 1440 = 24 hours, etc. You will see 'Attention, server is restarting in 30/20/10/5 seconds!' messages <strong>ingame</strong> before the restart.</p>",
"UIText_GameBranch": "Game Branch",
Expand Down Expand Up @@ -117,6 +126,10 @@
"UIText_AdminCommandChannelInfo": "Channel for admin commands",
"UIText_ControlPanelChannel": "Control Panel Channel",
"UIText_ControlPanelChannelInfo": "Channel for control panel",
"UIText_ServerInfoPanelChannel": "Server Info Panel Channel",
"UIText_ServerInfoPanelChannelInfo": "Optional channel which shows server name for users (not admins) and gives users the option to retrieve the current server password.",
"UIText_RotateServerPassword": "Rotate Server Password",
"UIText_RotateServerPasswordInfo": "Automatically rotates the server password on each server start. Players can get the current password via a button in the \"Server Info Panel Channel\"",
"UIText_StatusChannel": "Status Channel",
"UIText_StatusChannelInfo": "Server status updates",
"UIText_ConnectionListChannel": "Connection List Channel",
Expand Down
12 changes: 10 additions & 2 deletions UIMod/onboard_bundled/localization/sv-SE.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
"UIText_UpdateFailed": "Uppdateringen misslyckades. Försök igen senare."
},
"config": {
"UIText_BackToDashboard": "Tillbaka till dashboard",
"UIText_ConfigHeadline": "InstÀllningar",
"UIText_ServerConfig": "Konfiguration",
"UIText_DiscordIntegration": "Discord-integration",
"UIText_SLPModIntegration": "Launchpad Mods",
Expand All @@ -32,6 +34,7 @@
"UIText_BasicSettings": "Grund",
"UIText_NetworkSettings": "NĂ€tverk",
"UIText_AdvancedSettings": "Avancerad",
"UIText_TerrainSettings": "VĂ€rldsgenerering",
"basic": {
"UIText_BasicServerSettings": "GrundlÀggande serverinstÀllningar",
"UIText_ServerName": "Servernamn",
Expand Down Expand Up @@ -82,6 +85,8 @@
"UIText_ServerExePathInfo2": "Kan inte redigeras frÄn grÀnssnittet av sÀkerhetsskÀl, men du kan Àndra det manuellt i config.json-filen.",
"UIText_AdditionalParams": "Ytterligare parametrar",
"UIText_AdditionalParamsInfo": "Format: AnpassadParam1 VĂ€rde1 AnpassadParam2 VĂ€rde2",
"UIText_ShowExpertSettings": "Visa expertinstÀllningar",
"UIText_ShowExpertSettingsInfo": "Visa expertinstÀllningarna för att fÄ tillgÄng till speciella konfigurationsalternativ nedan. Konfigurationen mÄste sparas efter att denna instÀllning Àndrats för att Àndringarna ska trÀda i kraft.",
"UIText_AutoRestartServerTimer": "Schemalagd spelserveromstart",
"UIText_AutoRestartServerTimerInfo": "<p>Tidsram i <strong>minuter</strong> eller <strong>tidsformat (t.ex. 15:04 eller 03:04PM)</strong> för att schemalÀgga en automatisk omstart av spelservern. 0 = inaktiverad, 1440 = 24 timmar, etc. Du kommer att se meddelandet &#x27;Observera, server startar om 30/20/10/5 sekunder!&#x27; <strong>i spelet</strong> före omstarten.</p>",
"UIText_GameBranch": "Spel-Branch",
Expand Down Expand Up @@ -115,6 +120,10 @@
"UIText_AdminCommandChannelInfo": "Kanal för admin-kommandon",
"UIText_ControlPanelChannel": "Kontrollpanelkanal",
"UIText_ControlPanelChannelInfo": "Kanal för kontrollpanel",
"UIText_ServerInfoPanelChannel": "Serverinfo-panelkanal",
"UIText_ServerInfoPanelChannelInfo": "Valfri kanal som visar servernamn för anvÀndare (inte administratörer) och ger anvÀndare möjligheten att hÀmta det aktuella serverlösenordet.",
"UIText_RotateServerPassword": "Rotera serverlösenord",
"UIText_RotateServerPasswordInfo": "Roterar automatiskt serverlösenordet vid varje serverstart. Spelare kan hÀmta det aktuella lösenordet via en knapp i \"Serverinfo-panelkanalen\".",
"UIText_StatusChannel": "Statuskanal",
"UIText_StatusChannelInfo": "Uppdateringar om serverstatus",
"UIText_ConnectionListChannel": "Anslutningslistkanal",
Expand Down Expand Up @@ -155,8 +164,7 @@
"UIText_SLP_UpdateWorkshopModsDesc": "Uppdatera alla installerade workshop-mods till deras senaste versioner. Denna process kan ta lite tid beroende pÄ antalet mods.",
"UIText_SLP_UpdateButton": "Uppdatera Workshop-mods",
"UIText_SLP_InstalledMods": "Installerade Mods"
},
"UIText_TerrainSettings": "VĂ€rldsgenerering"
}
},
"setup": {
"UIText_FooterText": "Behöver du hjÀlp? Kolla Stationeers Server UI Github Wiki.",
Expand Down
Loading
Loading