relmio 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,27 @@ version across `package.json`, `package-lock.json`, this file, the Git tag,
5
5
  and npm. Local checks validate the repository metadata; the publishing guide
6
6
  checks the registry separately after publication.
7
7
 
8
+ ## Unreleased
9
+
10
+ ## [0.2.7] - 2026-08-02
11
+
12
+ ### Changed
13
+
14
+ - Restore the original Relmio hosted layout and local browser wizard flow, with
15
+ the horizontal five-step Signal Spine and GitHub star/version control kept
16
+ visible.
17
+ - Add Astryx's built theme and accessible segmented appearance control to the
18
+ hosted app, plus lightweight System/Light/Dark preference support to the
19
+ local wizard.
20
+ - Add responsive dark-mode logo treatment, phone-sized controls, and matching
21
+ browser-wizard guidance to the GitHub and npm README variants.
22
+
23
+ ### Fixed
24
+
25
+ - Keep the checksum-verified temporary Node.js 22 runtime on the child process
26
+ path so Git Bash and other Node-free systems can launch the Relmio package
27
+ shim without falling back to a missing or outdated system `node` command.
28
+
8
29
  ## [0.2.6] - 2026-08-02
9
30
 
10
31
  ### Added
package/README.md CHANGED
@@ -72,9 +72,18 @@ installing the private n8n sidecar.
72
72
  </figure>
73
73
 
74
74
  Use the site's [Install wizard](https://relmio.vercel.app/install) page for a
75
- clickable macOS/Linux, PowerShell, Command Prompt, and NPX command switcher plus
76
- a preview of the same five gates used by the local self-hosted n8n and
77
- Hostinger VPS setup.
75
+ clickable macOS/Linux, PowerShell, Command Prompt, and NPX command switcher
76
+ tailored to the current self-hosted n8n and Hostinger VPS setup path.
77
+
78
+ ### Browser interface and theme modes
79
+
80
+ The hosted site and local wizard keep the original Relmio relay layout while
81
+ adding a compact **System / Light / Dark** appearance control. System follows
82
+ the computer's preference; Light and Dark are remembered on that browser only.
83
+ The local wizard keeps its horizontal five-step Signal Spine at the top of the
84
+ flow, and the hosted site keeps the live GitHub star/version control visible.
85
+ Both surfaces collapse their controls for narrow phone screens without
86
+ turning the setup flow into a side rail or requiring a separate mobile app.
78
87
 
79
88
  ## Quick start
80
89
 
@@ -115,12 +124,6 @@ Users who already have Node.js 22 or newer can run the npm package directly:
115
124
  npx --yes --ignore-scripts relmio@latest
116
125
  ```
117
126
 
118
- Either command opens the redesigned local wizard. Its Signal Spine keeps five
119
- trust gates visible: local sign-in, host verification, read-only n8n discovery,
120
- the exact sidecar plan, and the verified private endpoint. On a wide screen the
121
- route stays beside the current gate; on a small screen it becomes a compact
122
- progress strip.
123
-
124
127
  ### Requirements
125
128
 
126
129
  - On macOS/Linux/WSL/Git Bash: `curl`, `awk`, `tar`, and either `sha256sum` or
@@ -155,30 +158,28 @@ product name to n8n. SuperGrok/xAI OAuth is a gated feasibility item on the
155
158
  [provider roadmap](https://github.com/Demonbane18/relmio/blob/main/docs/roadmap.md);
156
159
  it is not currently advertised as supported.
157
160
 
158
- ## Updated browser wizard walkthrough
161
+ ## Visual walkthrough
159
162
 
160
163
  All images below are sanitized previews with reserved addresses, fake server
161
- data, and no real credential or session information. Only the current gate is
162
- actionable, and remote writes remain locked until the review checkbox is
163
- selected.
164
+ data, and no real credential or session information.
164
165
 
165
- ### Gate 1: Confirm the local ChatGPT/Codex sign-in
166
+ ### 1. Confirm the local ChatGPT/Codex sign-in
166
167
 
167
168
  <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/01-local-sign-in-ready.png" alt="Sanitized local sign-in ready screen" width="720">
168
169
 
169
- ### Gate 2: Verify the VPS identity
170
+ ### 2. Verify the VPS identity
170
171
 
171
172
  <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/02-vps-identity-confirmed.png" alt="Sanitized VPS fingerprint confirmation screen" width="720">
172
173
 
173
- ### Gate 3: Choose the detected n8n container and network
174
+ ### 3. Choose the detected n8n container and network
174
175
 
175
176
  <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/03-n8n-detected.png" alt="Sanitized n8n discovery screen" width="720">
176
177
 
177
- ### Gate 4: Review the exact sidecar-only plan
178
+ ### 4. Review the exact sidecar-only plan
178
179
 
179
180
  <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/04-install-plan.png" alt="Sanitized installation plan screen" width="720">
180
181
 
181
- ### Gate 5: Copy the verified n8n settings
182
+ ### 5. Copy the verified n8n settings
182
183
 
183
184
  <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/05-bridge-ready.png" alt="Sanitized verified bridge screen" width="720">
184
185
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "relmio",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "description": "Turn a supported ChatGPT/Codex OAuth sign-in into a private OpenAI-compatible endpoint, starting with self-hosted n8n.",
5
5
  "keywords": [
6
6
  "relmio",
package/src/ui/app.js CHANGED
@@ -9,7 +9,6 @@ const state = {
9
9
  discovery: null,
10
10
  networks: null,
11
11
  installAttempted: false,
12
- previewMode: false,
13
12
  };
14
13
 
15
14
  const element = (id) => document.getElementById(id);
@@ -126,12 +125,10 @@ async function waitForOAuthCompletion() {
126
125
 
127
126
  function showStep(step) {
128
127
  state.step = step;
129
- let activePanel = null;
130
128
  for (const panel of document.querySelectorAll("[data-step]")) {
131
129
  const active = Number(panel.dataset.step) === step;
132
130
  panel.hidden = !active;
133
131
  if (active) {
134
- activePanel = panel;
135
132
  panel.querySelector("h2")?.focus({ preventScroll: true });
136
133
  }
137
134
  }
@@ -144,12 +141,7 @@ function showStep(step) {
144
141
  marker.removeAttribute("aria-current");
145
142
  }
146
143
  }
147
- activePanel?.closest(".work-column")?.scrollIntoView({
148
- block: "start",
149
- behavior: window.matchMedia("(prefers-reduced-motion: reduce)").matches
150
- ? "auto"
151
- : "smooth",
152
- });
144
+ window.scrollTo({ top: 0, behavior: "smooth" });
153
145
  }
154
146
 
155
147
  async function api(path, { method = "GET", body } = {}) {
@@ -217,10 +209,8 @@ async function refreshAuthStatus({ fresh = false } = {}) {
217
209
  const loginButton = element("login-button");
218
210
  const next = element("signin-next");
219
211
  const formattedUpdatedAt = renderAuthUpdatedAt(status.authUpdatedAt);
220
- state.previewMode = status.previewMode === true;
221
- element("preview-badge").hidden = !state.previewMode;
222
212
 
223
- if (state.previewMode) {
213
+ if (status.previewMode) {
224
214
  indicator.classList.add("ready");
225
215
  element("auth-title").textContent = "Sanitized preview credential";
226
216
  element("auth-detail").textContent =
@@ -304,7 +294,7 @@ async function discover() {
304
294
  element("container-select"),
305
295
  result.containers.map((container) => ({
306
296
  value: container.name,
307
- label: `${container.name} · ${container.image}`,
297
+ label: `${container.name} - ${container.image}`,
308
298
  })),
309
299
  result.containers[0].name,
310
300
  );
@@ -493,16 +483,11 @@ element("install-button").addEventListener("click", async (event) => {
493
483
  element("result-models").textContent = result.models.join(", ");
494
484
  element("result-http-url").textContent =
495
485
  `${result.baseUrl.replace(/\/$/u, "")}/responses`;
496
- if (state.previewMode) {
497
- element("done-title").textContent = "The sanitized preview route is complete";
498
- }
499
486
  showStep(5);
500
487
  setMessage(
501
- state.previewMode
502
- ? "Sanitized preview complete. The endpoint and models below are sample data."
503
- : result.deploymentMode === "updated"
504
- ? "OAuth refreshed on the existing wizard-managed sidecar. n8n was not restarted."
505
- : "Installation verified. Your existing n8n was not restarted.",
488
+ result.deploymentMode === "updated"
489
+ ? "OAuth refreshed on the existing wizard-managed sidecar. n8n was not restarted."
490
+ : "Installation verified. Your existing n8n was not restarted.",
506
491
  );
507
492
  } catch (error) {
508
493
  showError(error);