relmio 0.2.15 → 0.3.1

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
@@ -7,6 +7,49 @@ checks the registry separately after publication.
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## [0.3.1] - 2026-08-10
11
+
12
+ ### Changed
13
+
14
+ - Make the browser wizard beginner-friendly with a modern fixed-viewport
15
+ layout: all five active steps fit without document scrolling on common
16
+ 1280x720 laptops, while progress and safety context stay persistent beside
17
+ the active task.
18
+ - Keep narrow-phone documents fixed to the viewport and contain unavoidable
19
+ long-form overflow within the active task panel instead of the page.
20
+ - Expand the GitHub and npm walkthroughs with a hosted-install selector and
21
+ packaged, sanitized screenshots that document the current n8n workflow.
22
+
23
+ ### Security
24
+
25
+ - Restore a clean hosted-web dependency audit by pinning patched `js-yaml`
26
+ and `nanoid` releases and using the compatible `vinext` release that does
27
+ not include the currently vulnerable `image-size` parser.
28
+
29
+ ## [0.3.0] - 2026-08-05
30
+
31
+ ### Added
32
+
33
+ - Add a copy-ready n8n HTTP Request recipe to the local wizard, including the
34
+ private Chat Completions URL, Generic Credential Type → Bearer Auth fields,
35
+ the harmless `local-only` bearer placeholder, JSON headers, the structured
36
+ response-format body, and a full recipe copy action.
37
+ - Add the same structured `gpt-5.6-sol` example and importable cURL recipe to
38
+ the GitHub README, npm README, and n8n configuration guide.
39
+ - Add a repository-local changelog skill that standardizes Relmio's patch,
40
+ pre-1.0 feature, and stable major release numbering and metadata checks.
41
+
42
+ ### Changed
43
+
44
+ - Treat `0.3.0` as Relmio's major feature release within the pre-1.0 series;
45
+ it consolidates the key improvements shipped from v0.2.10 through v0.2.14:
46
+ resilient Windows OAuth/bootstrap flows, native Command Prompt installation,
47
+ compact accessible wizard recipes, verified Homebrew/package-manager
48
+ preparation, and release-time package checks.
49
+ - Keep the HTTP Request body aligned with n8n's `messages` format by targeting
50
+ `/v1/chat/completions`; the separate OpenAI Chat Model guidance continues to
51
+ support the Responses API where that node exposes the switch.
52
+
10
53
  ## [0.2.15] - 2026-08-05
11
54
 
12
55
  ### Fixed
package/README.md CHANGED
@@ -15,21 +15,29 @@
15
15
 
16
16
  ## See it working first
17
17
 
18
- Before setup, this sample n8n configuration shows GPT-5.6 model aliases in the
19
- OpenAI Chat Model selector. The exact model list depends on the signed-in
20
- ChatGPT account and can change over time.
18
+ This documented example follows a tested n8n OpenAI credential through a
19
+ published Telegram-triggered workflow. It is a product-operation record, not
20
+ an endorsement, sponsorship, or affiliation by OpenAI, n8n, Hostinger,
21
+ Telegram, or AppBuildersPH.
21
22
 
22
23
  <figure>
23
- <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/examples/gpt-56-model-selector.png" alt="Model selector listing GPT-5.6 Sol, Luna, and Terra model aliases" width="480">
24
- <figcaption>Compatibility preview: the model selector includes <code>gpt-5.6-sol</code>, <code>gpt-5.6-luna</code>, and <code>gpt-5.6-terra</code>.</figcaption>
24
+ <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/examples/n8n-openai-credential-connected.png" alt="n8n OpenAI credential dialog showing that the connection test succeeded" width="960">
25
+ <figcaption>The n8n OpenAI credential connection test succeeded; the credential value itself is obscured.</figcaption>
25
26
  </figure>
26
27
 
27
- After Relmio completes the installation, Docker shows the existing n8n stack
28
- and the new private OAuth sidecar running together.
28
+ <figure>
29
+ <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/examples/gpt-56-model-selector.png" alt="n8n model selector with gpt-5.6-terra selected and an account-specific model list" width="500">
30
+ <figcaption>This signed-in account's n8n model list includes <code>gpt-5.6-terra</code>; model availability is account-dependent and can change.</figcaption>
31
+ </figure>
32
+
33
+ <figure>
34
+ <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/examples/telegram-n8n-workflow-execution.png" alt="Successful n8n execution of a Telegram-triggered workflow with HTTP Request, Basic LLM Chain, and AI Agent branches" width="960">
35
+ <figcaption>The published Telegram-triggered n8n workflow completed successfully across its HTTP Request, Basic LLM Chain, and AI Agent branches.</figcaption>
36
+ </figure>
29
37
 
30
38
  <figure>
31
- <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/examples/sidecar-docker-containers-running.png" alt="Docker Desktop showing the n8n and n8n-openai-oauth containers running" width="960">
32
- <figcaption>Completed setup: the existing <code>n8n</code> stack and the <code>n8n-openai-oauth</code> sidecar are both running.</figcaption>
39
+ <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/examples/telegram-model-results.png" alt="Telegram conversation receiving HTTP Request, Basic LLM Chain, and AI Agent outputs" width="682">
40
+ <figcaption>Telegram received the HTTP Request, Basic LLM Chain, and AI Agent outputs sent by that workflow.</figcaption>
33
41
  </figure>
34
42
 
35
43
  Relmio is a local browser wizard that installs a private
@@ -80,10 +88,11 @@ tailored to the current self-hosted n8n and Hostinger VPS setup path.
80
88
  The hosted site and local wizard keep the original Relmio relay layout while
81
89
  adding a compact **System / Light / Dark** appearance control. System follows
82
90
  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.
91
+ On desktop, the local wizard keeps progress and sidecar-only safety notes in a
92
+ persistent rail beside the active task; its compact fixed-screen shell avoids
93
+ document scrolling on common laptop screens. On narrow phones, it switches to
94
+ a horizontal progress strip and keeps task scrolling inside the active panel.
95
+ The hosted site keeps the live GitHub star/version control visible.
87
96
 
88
97
  ## Quick start
89
98
 
@@ -184,28 +193,51 @@ it is not currently advertised as supported.
184
193
 
185
194
  ## Visual walkthrough
186
195
 
187
- All images below are sanitized previews with reserved addresses, fake server
188
- data, and no real credential or session information.
196
+ These current product screenshots use sanitized sample values wherever a setup
197
+ field might otherwise identify an environment. The VPS identity screen shows a
198
+ reserved sample address and sample SSH fingerprint; none of the images includes
199
+ an OAuth token, password, private key, or live wizard session URL.
200
+
201
+ ### 1. Choose a hosted installation method
202
+
203
+ <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/00-install-methods.png" alt="Hosted Relmio installation page with macOS/Linux, Homebrew, PowerShell, Command Prompt, and NPX choices" width="720">
204
+
205
+ The hosted page starts with the installation-method selector. Run the selected
206
+ command locally, not on the VPS.
189
207
 
190
- ### 1. Confirm the local ChatGPT/Codex sign-in
208
+ ### 2. Complete the local ChatGPT/Codex sign-in
191
209
 
192
- <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">
210
+ <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/01-local-sign-in-ready.png" alt="Sanitized preview-mode sample credential state, not a real saved-login confirmation" width="626">
193
211
 
194
- ### 2. Verify the VPS identity
212
+ This image shows a sanitized preview-mode sample credential state; it does not
213
+ confirm that a real local ChatGPT login was saved. During a real fresh login,
214
+ the browser confirmation states that the credentials were saved locally.
195
215
 
196
- <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">
216
+ ### 3. Verify the VPS identity
197
217
 
198
- ### 3. Choose the detected n8n container and network
218
+ <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/02-vps-identity-confirmed.png" alt="VPS identity confirmation with a sanitized sample address and SSH fingerprint" width="720">
199
219
 
200
- <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/03-n8n-detected.png" alt="Sanitized n8n discovery screen" width="720">
220
+ Confirm the SSH host fingerprint before authentication. The screenshot uses the
221
+ reserved sample host `vps.example.test`, a sample fingerprint, and a blank
222
+ password field.
201
223
 
202
- ### 4. Review the exact sidecar-only plan
224
+ ### 4. Choose the detected n8n container and network
203
225
 
204
- <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/04-install-plan.png" alt="Sanitized installation plan screen" width="720">
226
+ <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/03-n8n-detected.png" alt="Detected n8n container and shared Docker network" width="720">
205
227
 
206
- ### 5. Copy the verified n8n settings
228
+ Discovery is read-only; choose the existing n8n container and shared Docker
229
+ network.
207
230
 
208
- <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/05-bridge-ready.png" alt="Sanitized verified bridge screen" width="720">
231
+ ### 5. Review the exact sidecar-only plan
232
+
233
+ <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/04-install-plan.png" alt="Exact sidecar-only installation plan, including forbidden actions" width="720">
234
+
235
+ The plan names the allowed sidecar work and explicitly excludes edits or
236
+ restarts of n8n, a published host port, and a Traefik route.
237
+
238
+ ### 6. Copy the verified n8n settings
239
+
240
+ <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/setup/05-bridge-ready.png" alt="Private bridge ready screen with n8n OpenAI credential settings" width="720">
209
241
 
210
242
  Use these values in an n8n OpenAI credential:
211
243
 
@@ -219,6 +251,43 @@ Add Custom Header: Off
219
251
  The `local-only` value is a placeholder required by n8n. It is not an OpenAI
220
252
  Platform API key.
221
253
 
254
+ For an n8n **HTTP Request** node, use **Generic Credential Type** → **Bearer
255
+ Auth**, name the credential `openai-oauth`, and enter `local-only` as the
256
+ bearer token. Enable **Send Headers** with `Content-Type: application/json`,
257
+ then enable **Send Body** → **JSON** → **Using JSON** and paste:
258
+
259
+ ```json
260
+ {
261
+ "model": "gpt-5.6-sol",
262
+ "messages": [
263
+ {
264
+ "role": "user",
265
+ "content": "What is a robot?"
266
+ }
267
+ ],
268
+ "response_format": {
269
+ "type": "json_schema",
270
+ "json_schema": {
271
+ "name": "answer",
272
+ "schema": {
273
+ "type": "object",
274
+ "properties": {
275
+ "content": { "type": "string" }
276
+ },
277
+ "required": ["content"],
278
+ "additionalProperties": false
279
+ },
280
+ "strict": true
281
+ }
282
+ }
283
+ }
284
+ ```
285
+
286
+ Use `POST http://n8n-openai-oauth:10531/v1/chat/completions` as the URL. The
287
+ local wizard's **Copy HTTP request recipe** action supplies the same fields.
288
+ Replace the model only if the wizard reports a different ID. The full guide
289
+ has the importable cURL version.
290
+
222
291
  ## Important boundaries
223
292
 
224
293
  - Relmio does not create an OpenAI Platform API key.
@@ -228,7 +297,8 @@ Platform API key.
228
297
  - Relmio never edits, rebuilds, recreates, stops, or restarts the existing n8n
229
298
  container.
230
299
  - This is an unofficial community project, not affiliated with or endorsed by
231
- OpenAI, xAI, or n8n. Provider access, models, limits, and policies can change.
300
+ OpenAI, xAI, n8n, Hostinger, Telegram, or AppBuildersPH. Provider access,
301
+ models, limits, and policies can change.
232
302
  - Use it only where your account, subscription, provider terms, and applicable
233
303
  policies allow.
234
304
 
@@ -97,8 +97,9 @@ the chain.
97
97
 
98
98
  ## 3. HTTP Request node
99
99
 
100
- The HTTP Request recipe calls the bridge directly and does not need the n8n
101
- OpenAI credential.
100
+ The HTTP Request recipe calls the bridge directly with n8n's generic Bearer
101
+ Auth credential. It uses the Chat Completions route because the body below uses
102
+ the `messages` format shown in the n8n node.
102
103
 
103
104
  ### Copy-paste fields
104
105
 
@@ -111,69 +112,120 @@ POST
111
112
  URL:
112
113
 
113
114
  ```text
114
- http://n8n-openai-oauth:10531/v1/responses
115
+ http://n8n-openai-oauth:10531/v1/chat/completions
115
116
  ```
116
117
 
117
118
  Authentication:
118
119
 
119
120
  ```text
120
- None
121
+ Generic Credential Type
121
122
  ```
122
123
 
123
- Header 1 name:
124
+ Generic Auth Type:
124
125
 
125
126
  ```text
126
- Authorization
127
+ Bearer Auth
127
128
  ```
128
129
 
129
- Header 1 value:
130
+ Credential name:
130
131
 
131
132
  ```text
132
- Bearer local-only
133
+ openai-oauth
133
134
  ```
134
135
 
135
- Header 2 name:
136
+ Bearer token:
137
+
138
+ ```text
139
+ local-only
140
+ ```
141
+
142
+ Enable **Send Headers** and add this header:
143
+
144
+ Header name:
136
145
 
137
146
  ```text
138
147
  Content-Type
139
148
  ```
140
149
 
141
- Header 2 value:
150
+ Header value:
142
151
 
143
152
  ```text
144
153
  application/json
145
154
  ```
146
155
 
147
- JSON body:
156
+ Enable **Send Body**, select **JSON** for **Body Content Type**, and choose
157
+ **Using JSON** for **Specify Body**. Paste this body:
148
158
 
149
159
  ```json
150
160
  {
151
- "model": "PASTE_ONE_MODEL_ID_FROM_THE_WIZARD",
152
- "input": "Reply with exactly: bridge works"
161
+ "model": "gpt-5.6-sol",
162
+ "messages": [
163
+ {
164
+ "role": "user",
165
+ "content": "What is a robot?"
166
+ }
167
+ ],
168
+ "response_format": {
169
+ "type": "json_schema",
170
+ "json_schema": {
171
+ "name": "answer",
172
+ "schema": {
173
+ "type": "object",
174
+ "properties": {
175
+ "content": { "type": "string" }
176
+ },
177
+ "required": ["content"],
178
+ "additionalProperties": false
179
+ },
180
+ "strict": true
181
+ }
182
+ }
153
183
  }
154
184
  ```
155
185
 
156
- Enable **Send Headers** and **Send Body**, select a JSON body, and paste the
157
- object above.
186
+ If the wizard reports a different model ID, replace only `gpt-5.6-sol` with
187
+ that detected ID. The `local-only` bearer value is a harmless n8n placeholder;
188
+ it is not an OpenAI Platform API key.
158
189
 
159
190
  ### Importable cURL version
160
191
 
161
- The n8n HTTP Request node can import a cURL command. Replace only the model
162
- placeholder:
192
+ The n8n HTTP Request node can import this cURL command. Replace only the model
193
+ if the wizard reports a different ID:
163
194
 
164
195
  ```bash
165
196
  curl --request POST \
166
- --url http://n8n-openai-oauth:10531/v1/responses \
197
+ --url http://n8n-openai-oauth:10531/v1/chat/completions \
167
198
  --header 'Authorization: Bearer local-only' \
168
199
  --header 'Content-Type: application/json' \
169
200
  --data '{
170
- "model": "PASTE_ONE_MODEL_ID_FROM_THE_WIZARD",
171
- "input": "Reply with exactly: bridge works"
201
+ "model": "gpt-5.6-sol",
202
+ "messages": [
203
+ {
204
+ "role": "user",
205
+ "content": "What is a robot?"
206
+ }
207
+ ],
208
+ "response_format": {
209
+ "type": "json_schema",
210
+ "json_schema": {
211
+ "name": "answer",
212
+ "schema": {
213
+ "type": "object",
214
+ "properties": {
215
+ "content": { "type": "string" }
216
+ },
217
+ "required": ["content"],
218
+ "additionalProperties": false
219
+ },
220
+ "strict": true
221
+ }
222
+ }
172
223
  }'
173
224
  ```
174
225
 
175
- The placeholder header is included because it matches OpenAI-compatible
176
- client behavior. It is not a real API credential.
226
+ The cURL `Authorization` header is equivalent to the n8n Bearer Auth
227
+ credential. It is included so the command can be imported or run as a direct
228
+ connectivity check.
177
229
 
178
230
  ### Expression-driven HTTP body
179
231
 
@@ -182,8 +234,26 @@ After the fixed test succeeds, switch the entire JSON body field to
182
234
 
183
235
  ```javascript
184
236
  ={{ {
185
- model: "PASTE_ONE_MODEL_ID_FROM_THE_WIZARD",
186
- input: $json.prompt
237
+ model: "gpt-5.6-sol",
238
+ messages: [
239
+ {
240
+ role: "user",
241
+ content: $json.prompt
242
+ }
243
+ ],
244
+ response_format: {
245
+ type: "json_schema",
246
+ json_schema: {
247
+ name: "answer",
248
+ schema: {
249
+ type: "object",
250
+ properties: { content: { type: "string" } },
251
+ required: ["content"],
252
+ additionalProperties: false
253
+ },
254
+ strict: true
255
+ }
256
+ }
187
257
  } }}
188
258
  ```
189
259
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "relmio",
3
- "version": "0.2.15",
3
+ "version": "0.3.1",
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
@@ -123,8 +123,28 @@ async function copyText(value) {
123
123
  function renderHttpRequestBody(model) {
124
124
  element("result-http-body").textContent = JSON.stringify(
125
125
  {
126
- model,
127
- input: "Reply with exactly: bridge works",
126
+ model: model === "Not detected" ? "gpt-5.6-sol" : model,
127
+ messages: [
128
+ {
129
+ role: "user",
130
+ content: "What is a robot?",
131
+ },
132
+ ],
133
+ response_format: {
134
+ type: "json_schema",
135
+ json_schema: {
136
+ name: "answer",
137
+ schema: {
138
+ type: "object",
139
+ properties: {
140
+ content: { type: "string" },
141
+ },
142
+ required: ["content"],
143
+ additionalProperties: false,
144
+ },
145
+ strict: true,
146
+ },
147
+ },
128
148
  },
129
149
  null,
130
150
  2,
@@ -144,9 +164,16 @@ function copyHttpRecipe() {
144
164
  return [
145
165
  "Method: POST",
146
166
  `URL: ${element("result-http-url").textContent}`,
147
- "Authorization: Bearer local-only",
167
+ "Authentication: Generic Credential Type",
168
+ "Generic Auth Type: Bearer Auth",
169
+ "Credential: openai-oauth",
170
+ `Bearer token: ${element("result-key").textContent}`,
171
+ `Authorization: ${element("result-http-auth").textContent}`,
148
172
  "Content-Type: application/json",
149
- "Authentication: None",
173
+ "Send Headers: On",
174
+ "Send Body: On",
175
+ "Body Content Type: JSON",
176
+ "Specify Body: Using JSON",
150
177
  "JSON body:",
151
178
  element("result-http-body").textContent,
152
179
  ].join("\n");
@@ -598,7 +625,7 @@ element("install-button").addEventListener("click", async (event) => {
598
625
  element("result-model").textContent = firstModel;
599
626
  element("result-models").textContent = result.models.join(", ");
600
627
  element("result-http-url").textContent =
601
- `${result.baseUrl.replace(/\/$/u, "")}/responses`;
628
+ `${result.baseUrl.replace(/\/$/u, "")}/chat/completions`;
602
629
  renderHttpRequestBody(firstModel);
603
630
  showStep(5);
604
631
  setMessage(