Save is not publish

A build note on Nyxel Connect, scoped editor handoffs, review releases, and the production work that is still missing.

Last updated: August 1, 2026

4 min read

Nyxel has had a useful local Save button for a while. It validates the current document and writes ordinary JSON back to the storefront repository. The public demo does something similar inside an isolated temporary session.

That is enough for editing, but it is not a publishing model.

A production flow needs to answer a different set of questions. Which saved revision is being reviewed? Which commit produced the Preview? Is that exact deployment ready? What will be promoted to production? Can a scheduled publish still happen after the editor is closed?

This pass adds the first serious version of that boundary. I am calling it Nyxel Connect.

Connect is not the editor

The editor should not hold GitHub, Vercel, Shopify, or storage credentials. It should edit documents, request a render, and ask for a review Release.

Connect is a separate Shopify-facing host. It owns the Nyxel Project record and the Release ledger while leaving each provider in charge of its own resources:

  • Shopify owns the installation identity, catalog, and checkout;
  • GitHub owns the customer’s storefront repository and commits;
  • Vercel owns Preview and production deployment artifacts;
  • Nyxel owns revisions, release state, and the short-lived capability given to the editor.
The package underneath that host is deliberately small. @nyxel/connect contains the Project, Revision, and Release vocabulary plus narrow GitHub and Vercel clients. The SvelteKit app handles Shopify sessions, persistence, editor handoffs, and scheduled work.

Nyxel Connect showing provider readiness, merchant onboarding, and the release model.

The interface is mostly a setup surface right now. That is intentional. If provider credentials are missing, it explains what is required instead of showing controls that cannot work.

A Release is an immutable candidate

Saving still only saves documents. Creating a Release takes that saved projection, writes it to a release branch, and asks Vercel for a Preview deployment.

The state is explicit:

draft → building → ready → publishing → published
                    ↘ scheduled ↗

A ready Release can be reviewed at its own URL. Publishing promotes that same candidate instead of rebuilding whatever happens to be in the browser later. Scheduling records a time against the durable Release, so closing the editor does not cancel it.

Failures stay attached to the Release. I would rather show “this deployment failed” than let one Save button quietly mean editing, persistence, deployment, and production promotion at once.

The handoff is narrow

Connect opens the standalone editor with a one-use code for one Project. The editor exchanges it for a short-lived encrypted capability, removes the code from the URL, and uses that capability for project-scoped document, Canvas, Preview, and Release requests.

Provider tokens never enter the editor bundle. A capability for one Project cannot be reused against another one.

This is still a bootstrap implementation, not a completed security review. The important part of this pass is that the trust boundary is visible in the code instead of being deferred to a future hosting decision.

Preview still has one job

The release work also made me tighten the existing editor Preview.

Canvas is still the place for selection and editing. Preview is still the real storefront route with product forms, navigation, filters, and cart behavior. When a node is selected in the Navigator, Preview can now scroll to the corresponding section and show the same labeled accent boundary used by Canvas. It accounts for sticky storefront chrome so the label is not hidden under the header.

Nyxel Preview focused on the section selected in the Navigator while the storefront route remains interactive.

The marker is a wayfinding aid, not an editing overlay. Opening Preview without a selected node produces the clean storefront again.

What is actually ready

The state machine, provider clients, Shopify installation sessions, Redis-backed records, scoped editor handoff, review deployment route, and scheduled-publish worker are implemented in the repository.

The full product flow is not ready. GitHub and Vercel access still use server-side bootstrap credentials rather than a finished customer-owned authorization flow. Webhook reconciliation, production rollback, operational hardening, and a real merchant release have not been proven. The public demo therefore does not show Review or Publish controls.

That makes Connect Partial, not launched.

The next useful checkpoint is one credentialed installation that can create a customer-owned repository, open the editor through the scoped handoff, build a review Release, publish that exact candidate, and roll back deliberately. Until that entire path works, Save remains Save.