fix(startos): audit packaging — drop stale sdk-build, add aarch64, complete i18n - #1
Open
helix-nine wants to merge 1 commit into
Open
fix(startos): audit packaging — drop stale sdk-build, add aarch64, complete i18n#1helix-nine wants to merge 1 commit into
helix-nine wants to merge 1 commit into
Conversation
…mplete i18n This fork maintains only the StartOS wrapper: it consumes the image upstream publishes and never builds or pushes one of its own. Changes are confined to startos/, the build files, and CI; no application code is touched. Build: - Delete sdk-build/. Its build script copied startos/*.ts in before bundling, but 19 of those copies were also committed, frozen at 0.1.1:0 / image tag 0.5.2 while startos/ said 0.5.3. Build startos/ directly instead: the SDK and ncc move to the root package.json as startos:check / startos:build, with the packaging tsconfig and a commonjs marker beside the source. The marker is load-bearing — the app root is "type": "module", and `s9pk pack` require()s the bundle. - The package cannot use the SDK's s9pk.mk, which needs `npm run build` to be the ncc step while here it is the Vite build, so the Makefile stays bespoke. - Bump @start9labs/start-sdk 2.0.6 -> 2.0.9; pack with an assets dir. CI — stop publishing images: - Both release.yml and test-build.yml built the app and pushed it to ghcr.io/<this repo>. Drop those jobs entirely; each workflow now only packs an s9pk against the tag named in the manifest. Nothing in CI writes to a container registry. - test-build.yml previously rebuilt the released tag as amd64-only on every push to main and force-pushed it over the multi-arch image, plus :latest. That is how 0.5.2 lost its arm64 layer. Removing the job removes the hazard. - Release and artifact names now derive from the packed manifest, with ':' replaced by '_' since git refs cannot contain it. Package: - arch was ['x86_64'] although the published image is amd64+arm64, excluding ARM servers entirely. Now ['x86_64', 'aarch64']. - Drop the alerts block: it no longer exists in the SDK 2.0 types, passes typecheck only because setupManifest infers its generic from the argument, and is discarded at pack time. - packageRepo now points at this fork, which is where the packaging lives; upstreamRepo and marketingUrl stay on the application's own repo. - Remove a dead duplicate setInterfaces from index.ts; start-core reads only main/init/uninit/createBackup/manifest/actions from the bundle. - Drop four migration-less version files and set other: []. The packed manifest still reports canMigrateFrom "<=0.5.3:1". - main.ts defers to the image CMD via sdk.useEntrypoint() rather than restating it. - The long description still advertised "BraiinsOS+ / CGMiner API", predating the asic-rs rewrite. i18n: translations.ts was an empty stub. Populate es_ES/de_DE/pl_PL/fr_FR for all six keys and add those locales to the descriptions and release notes. Docs: startos/README.md was a scaffold citing a manifest.yaml that does not exist and StartOS 0.4.0.x; rewritten against writing-readmes.md, with instructions.md rewritten against writing-instructions.md. Both now state that no data is written to the mounted volume — all state is browser localStorage, so backups capture nothing. Verified on StartOS 0.4.0.1 (x86_64): installs, daemon starts, health green, UI reachable over LAN, LAN egress from the container works, a real /24 scan completes, stop/restart clean, /data empty.
helix-nine
force-pushed
the
audit/startos-packaging-review
branch
from
July 30, 2026 22:59
a4225ad to
30e58eb
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Full audit of the StartOS packaging ahead of Community Registry listing. This fork maintains only the StartOS wrapper: it consumes the image upstream publishes and never builds or pushes one of its own. Changes are confined to
startos/, the build files, and CI — no application code is touched, so the fork stays cleanly rebasable on upstream.What was broken
sdk-build/shipped stale duplicate source. Its build script copiedstartos/*.tsin before bundling, but 19 of those copies were also committed, frozen at version0.1.1:0and image tag0.5.2whilestartos/said0.5.3. Deleted; the package now buildsstartos/directly.CI was publishing container images from this fork. Both
release.ymlandtest-build.ymlbuilt the app and pushed it toghcr.io/<this repo>. This fork maintains only the StartOS wrapper, so both jobs are gone: each workflow now just packs an s9pk against the tag named in the manifest, and nothing in CI writes to a container registry.That also removes a destructive bug.
test-build.ymlrebuilt the released tag as amd64-only on every push tomainand force-pushed it over the multi-arch image, plus:latest— which is why0.5.2in GHCR has no arm64 layer while0.5.3still does.The manifest locked out ARM.
arch: ['x86_64'], although the published0.5.3image is genuinely amd64 + arm64 — which excluded every ARM server. Now['x86_64', 'aarch64'], verified by packing the aarch64 s9pk.A dead duplicate
setInterfacesinindex.ts.start-corereads onlymain/init/uninit/createBackup/manifest/actionsfrom the bundle, so it was never invoked. Restored to canonical plumbing.Four version files with no-op migrations.
v0_4_2/v0_4_7/v0_5_0/v0_5_2all had emptyup. Removed,other: []. The packed manifest still reportscanMigrateFrom: "<=0.5.3:1", so every prior install upgrades in one hop.The
alertsblock no longer exists in SDK 2.0. It passed typecheck only becausesetupManifestinfers its generic from the argument, and was discarded at pack time regardless. Removed.The marketplace long description was factually wrong — it advertised "BraiinsOS+ / CGMiner API", predating the asic-rs rewrite.
i18n was a scaffold, not an implementation.
translations.tswas an empty stub. Nowes_ES/de_DE/pl_PL/fr_FRacross all six keys, plus those locales on the manifest descriptions and release notes.startos/README.mdwas a dead scaffold citing amanifest.yamlthat does not exist and StartOS 0.4.0.x. Rewritten against the packaging guide'swriting-readmes.md;instructions.mdrewritten againstwriting-instructions.md.Also: SDK
2.0.6→2.0.9,main.tsdefers to the imageCMDviasdk.useEntrypoint()instead of duplicating it,packageRepopoints at this fork, and stale release steps corrected inCONTRIBUTING.mdandCLAUDE.md.Known limitation, now documented
The service writes nothing to its mounted volume. All user state — miner list, names, captured power ceilings, and saved miner API passwords — lives in the browser's
localStorage(blisspoint.state.v2). Somainmounts at/dataand stays empty, andBackups.ofVolumes('main')captures nothing: a restore yields an empty miner list. Confirmed empirically on the box. Changing it is an application decision, so this PR documents it prominently in both the README limitations and the user-facing instructions rather than leaving the backup silently implying it works.Test plan
Verified on a real StartOS 0.4.0.1 box (x86_64):
make x86→ builds and packsblisspoint_x86_64.s9pkatv0.5.3:1, sdk 2.0.9.make armalso packs, confirming the arm64 image resolves.start-cli package install -s blisspoint_x86_64.s9pk→ installs as0.5.3:1.start-cli package start blisspoint→ daemon starts; logs showBlisspoint serving on :80.{"result": "success", "message": "The web interface is ready"}.node server/serve.cjson0.0.0.0:80andproxy-rson127.0.0.1:8081only./24. This is the whole premise of the service.GET /api/scan?subnet=<lan>swept a real/24and returned cleanly./api/healthboth work end-to-end.stopis immediate and clean (no PID-1 signal hang, sorunAsInitis not needed);startreturns to green./dataconfirmed empty after install, start, restart and a scan.Not covered: miner control itself — pause/resume and power-target were not exercised against real hardware, as no ASIC was available on the test network. The transport around them is verified; the control paths are not.