relmio 0.3.0 → 0.4.0

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.
@@ -1,85 +1,84 @@
1
1
  # Publish and synchronize the npm package
2
2
 
3
- This guide is for the package maintainer. Run every command on the local
4
- computer in this repository, not on the VPS.
3
+ This guide is for the package maintainer. Run commands on a clean local
4
+ release worktree, never on the VPS. The repository and its reviewed release
5
+ commit are the source of truth.
5
6
 
6
- The repository is the release source of truth. The initial package is prepared
7
- in Git, validated by CI, published to npm from that exact commit, and then
8
- tagged with the same version. Later releases are tagged first and published
9
- from that exact tag by the trusted workflow. npm does not automatically edit
10
- `package.json`, `CHANGELOG.md`, or the Git repository after a publish.
11
-
12
- The first `relmio` publication is a one-time bootstrap with a narrowly scoped
13
- local access token because npm requires the package to exist before a trusted
14
- publisher can be attached. After that bootstrap, releases use the
15
- repository's `.github/workflows/publish.yml` OIDC workflow and no long-lived
16
- npm token.
7
+ Relmio is already configured as an npm trusted-publishing package. Every npm
8
+ release must come from the repository's `.github/workflows/publish.yml`
9
+ workflow using GitHub OIDC. Do not create, store, request, or use a local npm
10
+ access token for a Relmio release.
17
11
 
18
12
  ## Version contract
19
13
 
20
- Every release must use one semantic version in all of these places:
14
+ Every release uses one semantic version in all of these places:
21
15
 
22
16
  - `package.json`;
23
17
  - the top-level and root-package entries in `package-lock.json`;
24
18
  - the newest numbered release in `CHANGELOG.md`;
25
19
  - the Git tag `v<version>`;
20
+ - the GitHub release;
26
21
  - the version published to npm.
27
22
 
28
- Check the local files at any time:
23
+ Check local metadata with:
29
24
 
30
25
  ```bash
31
26
  npm run release:check
32
27
  ```
33
28
 
34
- On a tag build, CI also checks that the tag matches the files. The npm badge
35
- in the README is only an informational, potentially cached view of the
36
- registry's current `latest` version. The post-publish commands below perform
37
- the authoritative equality check.
29
+ The README badge can be cached. Post-release registry queries are the
30
+ authoritative publication check.
38
31
 
39
- ## One-time npm account setup
32
+ ## Trusted publisher contract
40
33
 
41
- 1. Sign in at <https://www.npmjs.com/>.
42
- 2. Configure an npm-supported second factor for package publishing. Depending
43
- on the account, npm may approve with a passkey/security key or request an
44
- authenticator one-time code.
45
- 3. Create one granular access token that can create and publish only the new
46
- package. Keep it in the ignored local `NPM_CREATE_ACCESS_TOKEN` environment
47
- variable and revoke it after trusted publishing is configured.
34
+ The npm package's **Trusted Publisher** configuration must remain:
48
35
 
49
- Never paste an npm password, passkey recovery material, 2FA code, or access
50
- token into chat, an issue, a shell-history example, or the repository.
36
+ | Field | Value |
37
+ |---|---|
38
+ | Publisher | GitHub Actions |
39
+ | Organization or user | `Demonbane18` |
40
+ | Repository | `relmio` |
41
+ | Workflow filename | `publish.yml` |
42
+ | Environment name | `npm` |
43
+ | Allowed action | Allow npm publish |
44
+
45
+ The workflow runs on a GitHub-hosted runner with `id-token: write` and the
46
+ protected `npm` environment. npm exchanges that workload identity for a
47
+ short-lived publishing credential and generates provenance for the public
48
+ package. The workflow contains no long-lived npm secret.
49
+
50
+ If this trusted-publisher configuration is missing or differs, stop. Repair it
51
+ through npm's package settings and review the repository environment policy
52
+ before attempting a release. Never substitute `npm login`, an `.npmrc` token,
53
+ an environment token, or a personal automation token.
51
54
 
52
55
  ## Prepare a release
53
56
 
54
- Start from a release branch. Do not retag or reuse an already published
55
- version.
57
+ Start from an isolated release branch and a clean worktree. Do not retag or
58
+ reuse an already published version.
56
59
 
57
60
  ### 1. Check the current state
58
61
 
59
62
  ```bash
60
63
  git status --short --branch
61
- npm view relmio version \
62
- --registry=https://registry.npmjs.org
64
+ git tag --sort=-version:refname | head
65
+ npm view relmio version --registry=https://registry.npmjs.org
63
66
  ```
64
67
 
65
- The worktree should contain only the changes intended for the release.
66
- Before the first Relmio publish, npm returns `E404` because the new package
67
- name has no published version yet. Confirm the exact package name is still
68
- available, then continue only from the reviewed rebrand commit.
68
+ Inspect the complete diff since the previous published tag. The worktree must
69
+ contain only reviewed release changes.
69
70
 
70
- ### 2. Bump the files without creating a tag
71
+ ### 2. Update version metadata without creating a tag
71
72
 
72
- For a backward-compatible bug or documentation release:
73
+ For a compatible patch:
73
74
 
74
75
  ```bash
75
76
  npm version patch --no-git-tag-version
76
77
  ```
77
78
 
78
- Use `minor` for a backward-compatible feature and `major` for a breaking
79
- change. The command updates both `package.json` and `package-lock.json`.
80
-
81
- Add a matching release heading and user-visible changes to `CHANGELOG.md`.
82
- Then run:
79
+ For Relmio's pre-1.0 series, use a minor bump for a meaningful new capability
80
+ or workflow. Update the dated `CHANGELOG.md` entry, keep `## Unreleased` above
81
+ it, and run:
83
82
 
84
83
  ```bash
85
84
  npm run release:check
@@ -92,194 +91,115 @@ npm ci --ignore-scripts
92
91
  npm run check
93
92
  npm audit --audit-level=high
94
93
  npm run package:build -- .release
94
+ npm pack --dry-run
95
95
  ```
96
96
 
97
- The package builder stages the concise npm README as the tarball's root
98
- `README.md`; it never changes the full GitHub README or its Mermaid diagrams.
99
- Review the emitted tarball file list. It must not contain:
100
-
101
- - `.env` or local-context files;
102
- - OAuth files or tokens;
103
- - SSH keys, passwords, or real VPS details;
104
- - browser session URLs;
105
- - test recordings or unredacted screenshots;
106
- - unrelated local build artifacts.
107
-
108
- Documentation images must be sanitized previews. Remember that `docs/**` is
109
- part of the npm package.
97
+ Review the emitted tarball file list. It must not contain credentials, local
98
+ environment files, SSH material, real infrastructure details, browser session
99
+ URLs, unredacted recordings, or unrelated build artifacts. The package builder
100
+ must stage `npm/README.md` as the tarball's root `README.md` without modifying
101
+ the full GitHub guide.
110
102
 
111
- Before changing a private repository to public, audit the complete Git
112
- history as well as the current worktree. Deleting a VPS address, email,
113
- credential, or token from the latest commit does not remove it from earlier
114
- commits. If history contains sensitive data, keep the repository private and
115
- perform a reviewed, coordinated history rewrite before the first public
116
- release.
103
+ When `web/**` changed, also run the web lint, typecheck, tests, production
104
+ Vercel build, and the approved browser QA. When installer or package-manager
105
+ surfaces changed, run their platform-focused tests and artifact checks.
117
106
 
118
- ### 4. Commit and run CI
107
+ ### 4. Open the release pull request
119
108
 
120
- Stage every intended change, then review the exact staged release:
109
+ Commit only the intended release files and push the release branch. The pull
110
+ request must record:
121
111
 
122
- ```bash
123
- RELEASE_VERSION="$(node -p "require('./package.json').version")"
124
- git add --all
125
- git status --short
126
- git diff --cached --check
127
- git diff --cached --stat
128
- git commit -m "release: v${RELEASE_VERSION}"
129
- git push
130
- ```
112
+ - the previous release tag and intended version;
113
+ - the provider/security boundary for changed behavior;
114
+ - root, web, installer, package, audit, and browser results as applicable;
115
+ - npm, Vercel, Homebrew, WinGet, and installer applicability;
116
+ - every known skip or unresolved risk.
131
117
 
132
- Merge the release commit into the repository's default branch according to
133
- the project workflow and wait for the default-branch CI run to pass. The
134
- remaining commands assume that branch is named `main`; substitute the actual
135
- default branch if it differs.
118
+ Wait for required review, CI, package-manager validation, and Vercel preview
119
+ checks. Do not bypass branch protection. Merge only the reviewed head commit.
136
120
 
137
- ## Publish the exact commit
121
+ ## Tag and publish the exact merged commit
138
122
 
139
- Check out the CI-approved default branch, update it without a merge commit,
140
- and record the exact clean commit:
123
+ After the default-branch CI and production deployment are green, resolve the
124
+ exact merged commit:
141
125
 
142
126
  ```bash
143
- git switch main
144
- git pull --ff-only
145
- test -z "$(git status --porcelain)"
146
- RELEASE_COMMIT="$(git rev-parse HEAD)"
147
- npm run release:check
127
+ git fetch origin
128
+ RELEASE_COMMIT="$(git rev-parse origin/main)"
129
+ git show -s --format='%H%n%s' "$RELEASE_COMMIT"
148
130
  ```
149
131
 
150
- Review the package from that commit. Immediately before publishing, fail if
151
- either the commit or worktree changed:
132
+ Confirm that commit contains the reviewed package version and changelog. Create
133
+ an annotated tag on that exact commit, push it, and verify the remote tag
134
+ target before creating the GitHub release:
152
135
 
153
136
  ```bash
154
- npm run package:build -- .release
155
- test "$RELEASE_COMMIT" = "$(git rev-parse HEAD)"
156
- test -z "$(git status --porcelain)"
137
+ RELEASE_VERSION="$(node -p "require('./package.json').version")"
138
+ git tag -a "v${RELEASE_VERSION}" "$RELEASE_COMMIT" -m "v${RELEASE_VERSION}"
139
+ git push origin "v${RELEASE_VERSION}"
140
+ git ls-remote origin "refs/tags/v${RELEASE_VERSION}^{}"
157
141
  ```
158
142
 
159
- For the first `relmio` publication only, place the already-created token in
160
- the environment without echoing it, write an owner-only temporary npm config,
161
- and publish the reviewed tarball:
143
+ Create the GitHub release from that tag with curated notes copied from the
144
+ matching changelog entry. Publishing the GitHub release triggers
145
+ `.github/workflows/publish.yml`; that workflow:
162
146
 
163
- ```bash
164
- umask 077
165
- NPM_CONFIG_USERCONFIG="$(mktemp)"
166
- trap 'rm -f "$NPM_CONFIG_USERCONFIG"' EXIT
167
- printf '%s\n' '//registry.npmjs.org/:_authToken=${NPM_CREATE_ACCESS_TOKEN}' \
168
- > "$NPM_CONFIG_USERCONFIG"
169
- export NPM_CONFIG_USERCONFIG NPM_CREATE_ACCESS_TOKEN
170
- npm whoami --registry=https://registry.npmjs.org
171
- LOCAL_VERSION="$(node -p "require('./package.json').version")"
172
- npm publish ".release/relmio-${LOCAL_VERSION}.tgz" \
173
- --ignore-scripts \
174
- --access public \
175
- --registry=https://registry.npmjs.org
176
- ```
147
+ 1. checks out the immutable release tag;
148
+ 2. runs the full release gate and audit;
149
+ 3. builds the reviewed tarball;
150
+ 4. skips safely if that immutable version already exists;
151
+ 5. otherwise publishes through npm trusted publishing;
152
+ 6. builds and attaches verified Windows release artifacts;
153
+ 7. generates a Homebrew formula candidate from the published npm tarball.
177
154
 
178
- Do not place the real token value in `.npmrc`, the workflow, a command-line
179
- argument, or Git. npm may still require its configured publishing second
180
- factor.
155
+ Never run `npm publish` locally. Never recreate or move a published tag.
181
156
 
182
- Verify the immutable registry result:
157
+ ## Verify delivered surfaces
158
+
159
+ After the workflow succeeds:
183
160
 
184
161
  ```bash
185
162
  LOCAL_VERSION="$(node -p "require('./package.json').version")"
186
163
  PUBLISHED_VERSION="$(npm view relmio version \
187
164
  --registry=https://registry.npmjs.org)"
188
165
  test "$LOCAL_VERSION" = "$PUBLISHED_VERSION"
189
- npm view "relmio@${LOCAL_VERSION}" dist.integrity \
166
+ npm view "relmio@${LOCAL_VERSION}" \
167
+ version dist.integrity dist.tarball \
190
168
  --registry=https://registry.npmjs.org
191
169
  ```
192
170
 
193
- The equality check must succeed before tagging.
194
-
195
- ## Switch future releases to trusted publishing
196
-
197
- Do this only after the first `relmio` version exists on npm and the
198
- `publish.yml` workflow is present on the GitHub default branch.
199
-
200
- On the npm package's **Trusted Publisher** form, use:
201
-
202
- | Field | Value |
203
- |---|---|
204
- | Publisher | GitHub Actions |
205
- | Organization or user | `Demonbane18` |
206
- | Repository | `relmio` |
207
- | Workflow filename | `publish.yml` |
208
- | Environment name | `npm` |
209
- | Allowed action | Allow npm publish |
210
-
211
- The environment must match `environment: npm` in the workflow. Add approval
212
- rules to the GitHub `npm` environment if a maintainer should explicitly
213
- approve each registry write.
214
-
215
- The workflow uses a GitHub-hosted runner, `id-token: write`, Node.js `22.14.0`,
216
- and npm `11.13.0`, which is separate from the application's reviewed npm
217
- `10.9.8` development runtime. npm exchanges the GitHub OIDC identity for a
218
- short-lived publishing credential and automatically generates provenance for
219
- public packages.
220
-
221
- After one trusted publish is verified:
222
-
223
- 1. change package publishing access to require 2FA and disallow tokens;
224
- 2. revoke `NPM_CREATE_ACCESS_TOKEN` and any older automation tokens;
225
- 3. keep normal development on npm `10.9.8`;
226
- 4. create future GitHub releases from reviewed `v<version>` tags to trigger
227
- the trusted workflow.
228
-
229
- The workflow safely skips a version already present on npm. This lets the
230
- GitHub release for the token-bootstrapped `v0.2.0` tag be created without a
231
- duplicate publish attempt.
232
-
233
- ## Tag the published release
234
-
235
- For the initial token-bootstrap release, create the tag on the exact published
236
- commit:
237
-
238
- ```bash
239
- RELEASE_VERSION="$(node -p "require('./package.json').version")"
240
- : "${RELEASE_COMMIT:?Run the publish steps above in this terminal first}"
241
- test "$RELEASE_COMMIT" = "$(git rev-parse HEAD)"
242
- git tag -a "v${RELEASE_VERSION}" "$RELEASE_COMMIT" -m "v${RELEASE_VERSION}"
243
- git push origin "v${RELEASE_VERSION}"
244
- ```
245
-
246
- The tag CI run validates that `v<version>` matches the package, lockfile, and
247
- changelog. For later OIDC releases, push the reviewed tag first and create the
248
- GitHub release from it; publishing the GitHub release triggers the trusted
249
- workflow. Copy the matching changelog entry into the release notes.
250
-
251
- ## Verify as a package user
252
-
253
- In a separate terminal, check the version and launch the exact release:
254
-
255
- ```bash
256
- npm view relmio version
257
- npx --yes --ignore-scripts relmio@PUBLISHED_VERSION
258
- ```
171
+ Also verify:
259
172
 
260
- Replace `PUBLISHED_VERSION` with the number just published. Confirm that the
261
- local wizard opens, then press Control+C before entering real credentials if
262
- this is only a smoke test.
173
+ - the GitHub release tag targets the reviewed merged commit;
174
+ - npm renders the registry-safe README and the package has provenance;
175
+ - the Vercel production deployment corresponds to the merged commit;
176
+ - hosted `install.sh`, `install.ps1`, and `install.cmd` still byte-match their
177
+ tested repository sources and invoke `relmio@latest`;
178
+ - Windows assets are attached to the GitHub release;
179
+ - Homebrew points to the exact npm tarball version and SHA-256;
180
+ - WinGet remains described as pending until its upstream catalog is actually
181
+ updated.
263
182
 
264
- The CLI currently has no `--help` argument parser. Do not use a `--help`
265
- invocation as a release check; it starts the wizard like any other argument.
183
+ Run the repository's distribution audit for the exact release version and do
184
+ not call the release synchronized while a required surface is red.
266
185
 
267
186
  ## If something goes wrong
268
187
 
269
- - `ENEEDAUTH`: run `npm login`, complete npm's browser approval, and retry
270
- `npm whoami`.
271
- - `E403`: confirm the intended npm account owns the package and complete the
272
- configured publishing second factor.
273
- - `EPUBLISHCONFLICT`: the version is immutable and already exists. Bump to a
274
- new patch version; never delete or overwrite it.
275
- - Registry version differs from `package.json`: stop before tagging. Determine
276
- whether the publish succeeded and prepare a new release if necessary.
277
- - The Git commit was pushed but npm publish failed: fix npm authentication or
278
- policy, rerun the gates on the same clean commit, and publish that version.
279
- - npm publish succeeded but the tag push failed: do not republish. Push the
280
- tag for the exact already-published commit.
281
- - `npx` cannot see a just-published version: verify the exact registry version
282
- and wait briefly for registry/CDN propagation.
283
-
284
- Do not publish from the VPS. Never put an npm access token in the GitHub
285
- Actions workflow; the trusted workflow authenticates only through OIDC.
188
+ - Trusted-publisher or OIDC failure: stop and inspect the GitHub environment,
189
+ workflow identity, npm trusted-publisher settings, and workflow logs. Do not
190
+ fall back to a token.
191
+ - `EPUBLISHCONFLICT`: the version is immutable and already exists. Verify
192
+ whether it is the intended artifact; otherwise prepare a new version.
193
+ - Registry version differs from repository metadata: stop. Do not move the tag
194
+ or overwrite npm.
195
+ - Tag push failed before the GitHub release: confirm whether the exact tag
196
+ exists remotely before retrying. Never force-update a release tag.
197
+ - GitHub release exists but publish failed: leave the tag immutable, fix the
198
+ trusted workflow or policy, rerun the reviewed automation, and preserve the
199
+ failure evidence.
200
+ - Vercel or package-manager delivery failed: keep the release status explicit
201
+ and repair only the affected reviewed surface.
202
+
203
+ Do not publish from the VPS. Do not put an npm token in local config, CI, chat,
204
+ issues, logs, or shell examples. Relmio publishing authenticates only through
205
+ the repository's short-lived GitHub OIDC identity.
package/docs/security.md CHANGED
@@ -1,8 +1,10 @@
1
1
  # Security and limitations
2
2
 
3
- This project handles two password-equivalent secrets: a ChatGPT OAuth
4
- credential and an SSH authentication method. Read this page before offering
5
- the wizard to another person.
3
+ The VPS/n8n path handles a ChatGPT OAuth credential and an SSH authentication
4
+ method. The local endpoint path can additionally handle an OpenAI Platform API
5
+ key, a Codex/ChatGPT session, and generated local capabilities. Treat every one
6
+ of these values as password-equivalent. Read this page before offering the
7
+ wizard to another person.
6
8
 
7
9
  ## Trust model
8
10
 
@@ -16,6 +18,20 @@ The design assumes:
16
18
 
17
19
  If any of those assumptions is false, do not use this design.
18
20
 
21
+ For a local Docker endpoint, the design additionally assumes:
22
+
23
+ - the local computer, operating-system account, and Docker Engine are trusted;
24
+ - the app receiving the Relmio capability displayed once by the wizard is
25
+ trusted and controlled
26
+ by the same person;
27
+ - a browser origin allowlist is not being used as a substitute for secret
28
+ storage; and
29
+ - a Codex client is trusted with App Server's broad agent and account surface.
30
+
31
+ The raw Codex App Server is not a multi-user boundary. It is for a trusted
32
+ native client owned by the same account holder, not a browser, shared service,
33
+ public app, or untrusted plugin.
34
+
19
35
  ## Controls implemented by the wizard
20
36
 
21
37
  - The web server binds only to `127.0.0.1`.
@@ -42,6 +58,45 @@ If any of those assumptions is false, do not use this design.
42
58
  - There is no host `ports` mapping and no reverse-proxy route.
43
59
  - The installer verifies the absence of a published port after startup.
44
60
 
61
+ ### Local endpoint controls
62
+
63
+ - Generated Compose files publish only literal
64
+ `127.0.0.1:<selected-port>:<container-port>` mappings.
65
+ - Every OpenAI `/v1` operation that can reach OpenAI and every Codex WebSocket
66
+ upgrade requires a random Relmio capability displayed once by the wizard;
67
+ only its SHA-256 verifier is persisted. Exact-origin CORS `OPTIONS` is a
68
+ non-forwarding metadata exception. The bearer remains valid until an
69
+ endpoint update rotates it.
70
+ - The Platform API key is accepted only for the OpenAI gateway. A transient,
71
+ network-disabled helper receives it over stdin and atomically seeds a private,
72
+ labeled Docker volume that the gateway mounts read-only. No host key file or
73
+ Compose environment value is created, and the key is never returned to the
74
+ browser after installation.
75
+ - ChatGPT sign-in is accepted only through the official Codex App Server
76
+ account flow. Relmio never returns or converts the resulting tokens.
77
+ - Browser requests to the OpenAI gateway require an exact configured `http`
78
+ or `https` origin. Wildcards and `null` are rejected; requests without an
79
+ `Origin` remain available to authenticated native clients and backends.
80
+ - Codex receives private named credential and workspace volumes. No host
81
+ directory, Docker socket, SSH key, browser profile, or home directory is
82
+ mounted into either local service.
83
+ - Local managed paths use mode `0700`, generated files use owner-only modes,
84
+ symlinks are rejected, and existing unmanaged directories are not
85
+ overwritten.
86
+ - The selected Docker context must resolve to a local Unix socket. Every
87
+ mutating command is pinned to that socket, Docker selector environment
88
+ overrides are removed, and native Windows is rejected before mutation.
89
+ - Each install uses a random Compose project identity. Containers, networks,
90
+ and volumes must carry matching Relmio ownership labels before update,
91
+ restart, recovery, or sign-in actions are allowed.
92
+ - Both long-running endpoint containers run as a non-root user, drop Linux
93
+ capabilities, set `no-new-privileges`, use a read-only root filesystem, and
94
+ have bounded temporary storage and resource limits.
95
+ - The one-shot OpenAI credential seed helper is the narrow exception: it has no
96
+ network, port, or logs; runs with a read-only root filesystem and strict
97
+ resource limits; and uses root plus only `CHOWN` long enough to atomically
98
+ make the stdin-seeded volume entry readable by the non-root gateway.
99
+
45
100
  ## What “private” means here
46
101
 
47
102
  Port `10531` is not reachable from the public internet or VPS host through a
@@ -67,6 +122,20 @@ expose it.
67
122
  - Revoke or refresh the session if the VPS may be compromised.
68
123
  - Prefer a dedicated personal VPS with current security updates.
69
124
 
125
+ The local capabilities have separate consequences:
126
+
127
+ - The OpenAI gateway capability can spend through the protected Platform API
128
+ key, subject to that Platform project's permissions and limits.
129
+ - The Codex capability can invoke broad App Server methods inside the isolated
130
+ container and use its signed-in ChatGPT/Codex session.
131
+ - An origin allowlist does not make a bearer embedded in browser JavaScript
132
+ private. Use browser access only for private same-owner local development.
133
+ - Do not expose either endpoint on a LAN, public IP, domain, reverse proxy, or
134
+ hosted service. Loopback binding and the bearer capability are both required.
135
+ - If a capability is disclosed, update the endpoint to rotate it. If an
136
+ upstream credential may be exposed, revoke or sign out through the provider
137
+ as well.
138
+
70
139
  ## Product and policy limitations
71
140
 
72
141
  - This is not an OpenAI Platform API key.
@@ -79,10 +148,29 @@ expose it.
79
148
  - Rate limits and account restrictions still apply.
80
149
  - OpenAI can change or discontinue service behavior and can suspend access for
81
150
  Terms or usage-policy violations.
151
+ - The local OpenAI-compatible endpoint requires a Platform API key. Its usage
152
+ is billed or credited to the associated Platform project; a ChatGPT
153
+ subscription or Codex for Open Source benefit is not substituted for API
154
+ billing.
155
+ - The local Codex option preserves the official App Server JSON-RPC protocol.
156
+ It does not provide `/v1/chat/completions`, `/v1/responses`, or any other
157
+ OpenAI API compatibility route.
158
+ - OpenAI documents App Server WebSocket transport as experimental and
159
+ unsupported for production. It rejects browser-origin requests and is
160
+ limited here to trusted native same-owner clients.
161
+ - Acceptance into Codex for Open Source is not treated by Relmio as permission
162
+ to repurpose credentials, share an account, bypass controls, or broaden the
163
+ scope of another agreement. Review the current
164
+ [program terms](https://learn.chatgpt.com/docs/codex-for-oss-terms).
82
165
 
83
166
  This repository does not claim that every possible use of the bridge is
84
167
  permitted. The account owner is responsible for reviewing the current
85
168
  [OpenAI Terms](https://openai.com/policies/terms-of-use/) and usage policies.
169
+ The local endpoint design follows the documented
170
+ [OpenAI API authentication](https://developers.openai.com/api/reference/overview#authentication),
171
+ [Codex authentication](https://learn.chatgpt.com/docs/auth), and
172
+ [Codex App Server](https://learn.chatgpt.com/docs/app-server) boundaries. This
173
+ is engineering guidance, not legal advice or an OpenAI approval.
86
174
 
87
175
  ## Dependency policy
88
176
 
@@ -91,6 +179,7 @@ The current release pins:
91
179
  - Node.js 22+
92
180
  - `ssh2` `1.17.0`
93
181
  - `openai-oauth` `2.0.0`
182
+ - `@openai/codex` `0.147.0` in the local Codex image
94
183
 
95
184
  The POSIX and native Windows PowerShell bootstraps reuse a compatible local
96
185
  Node.js runtime or download the matching current official Node.js 22 archive
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "relmio",
3
- "version": "0.3.0",
4
- "description": "Turn a supported ChatGPT/Codex OAuth sign-in into a private OpenAI-compatible endpoint, starting with self-hosted n8n.",
3
+ "version": "0.4.0",
4
+ "description": "Install private local OpenAI API and Codex endpoints with explicit provider credential boundaries, plus the existing isolated n8n sidecar.",
5
5
  "keywords": [
6
6
  "relmio",
7
7
  "gpt-5-6-sol",