Skip to content

docs(rfc): propose repository migration for a smaller core - #4426

Draft
drew wants to merge 2 commits into
mainfrom
docs/4425-repository-migration-rfc/drew
Draft

drew wants to merge 2 commits into
mainfrom
docs/4425-repository-migration-rfc/drew

Conversation

@drew

@drew drew commented Oct 12, 2026

Copy link
Copy Markdown
Collaborator

Summary

Propose splitting OpenShell into a smaller core and focused repositories so new maintainers can own platforms, packaging, SDKs, and provider integrations. Keep RFC 0019 short and conversational for early discussion.

Related Issue

Closes #4425

Changes

  • Define the proposed repository responsibilities and ownership expectations.
  • Outline an incremental migration, risks, and alternatives.
  • Leave macOS isolation, microVM placement, host process assembly, and cross-repository compatibility as open questions.

Testing

  • Markdown lint passes (mise exec -- markdownlint-cli2 rfc/0019-repository-migration/README.md).
  • git diff --check passes.
  • Unit and E2E tests are not applicable to this RFC-only change.

Checklist

  • Follows Conventional Commits
  • Commits are signed off (DCO)
  • Architecture documentation updates are not applicable to this draft proposal.

Signed-off-by: Drew Newberry <anewberry@nvidia.com>
@copy-pr-bot

copy-pr-bot Bot commented Oct 12, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

Signed-off-by: Drew Newberry <anewberry@nvidia.com>
@SDAChess SDAChess mentioned this pull request Oct 13, 2026
2 of 37 tasks
| --- | --- |
| `openshell` | CLI, gateway, and supervisor builds for Linux, Windows, and macOS; Linux sandbox runtime with Linux, gVisor, Kata, and Firecracker support; prover; a compute driver that assembles these pieces as host processes. Publishes containers and binaries. |
| `openshell-desktop` | macOS isolation and container integration, Podman, Docker, and possibly microVM support. |
| `openshell-packages` | The one-line `install.sh` installation path and RPM, DEB, and Snap packages. |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Simon pointed me here from #3510 (Fedora packaging), so a few notes from that work on where the packaging line might fall. Take these as ideas.

It might help to separate two kinds of packaging, because they couple to core very differently:

Oliver raised the lockstep concern on #4244: distro packaging needs build flags, dependencies and toolchain versions kept in sync with core. One way to keep a separate packages repo honest might be for core to document a small source-build contract (supported features, environment variables, minimum toolchain, expected outputs) and to run a cheap from-source smoke build in its own CI, so drift shows up in core before it reaches a packaging repo. That could also keep the option open of leaving the from-source recipes with core while openshell-packages owns publishing and installation.

`systemd-spawn` intended to mean `systemd-nspawn`, and what do other platforms use?
- Where do shared Rust interfaces live, and how do we test compatibility and
coordinate security fixes across repositories?
- Which component should move first, and who wants to maintain each new home?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From the packaging side, the repackaging-published-binaries pieces (the RPM/DEB/Snap that consume release artifacts, install.sh, the Homebrew formula) look like the lowest-risk first move, since they don't depend on core's build flags. The from-source distro builds might be better to move once a source-build contract like the one above exists.

One question: how should artifacts from a packages repo feed core's release qualification? RFC 0016 says release qualification validates install and uninstall behavior using candidate artifacts, so it would be good to say whether the packages repo produces those artifacts for core's qualification to consume, or whether qualification runs from the packages repo against a pinned core release.

| `openshell-homebrew` | The Homebrew tap and `openshell.rb` formula. |
| `openshell-windows` | MSI installer and MXC driver. |
| `openshell-kubernetes` | Helm chart, Kubernetes compute driver supporting gVisor, Kata, Firecracker, and runc, and an operator. Publishes the Helm chart. |
| `openshell-sdks` | Go, Python, Rust, and TypeScript SDKs. |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder whether we could have one repo per SDK as I expect there is no much overlap in the maintainer group for each SDK, respectively. Since all language also uses different toolchains and setups, wdyt about using:

  • openshell-sdk-python
  • openshell-sdk-rust
  • openshell-sdk-typescript
  • openshell-sdk-go

For the rust SDK I could imagine to keep it in core as the reference SDK, especially if the CLI is leveraging the SDK, too, as part of core (which would lead to a circular dependency among repos).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Granularitywise this would be similar to the openshell-provider-<provider> taxonomy, so shouldn't be a problem.

@drew drew Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That feels like a lot of machinery. Do we get a lot of benefit to keeping them separate? I would be worried that SDKs would drift and we'd get stuck in a tedious release process across all these repos.

My initial thought is it'd be easier to have our agents keep things in sync from a single monorepo.

I saw this a little different from providers since SDKs are more tightly coupled to core releases vs providers which would entirely be on their own release cadence.


| Repository | Owns and publishes |
| --- | --- |
| `openshell` | CLI, gateway, and supervisor builds for Linux, Windows, and macOS; Linux sandbox runtime with Linux, gVisor, Kata, and Firecracker support; prover; a compute driver that assembles these pieces as host processes. Publishes containers and binaries. |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's about moving the CLI also in an own repo, to ensure that it only access the gateway via the rust SDK ?

Alternatively, if the CLI is using the rust SDK, then the rust SDK should be also part of this repository to avoid circular dependencies across repos (see below my comment on the SDK repos)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call. I'd lean towards keeping the rust sdk in the core repo and developing the cli the same.

| `openshell-packages` | The one-line `install.sh` installation path and RPM, DEB, and Snap packages. |
| `openshell-homebrew` | The Homebrew tap and `openshell.rb` formula. |
| `openshell-windows` | MSI installer and MXC driver. |
| `openshell-kubernetes` | Helm chart, Kubernetes compute driver supporting gVisor, Kata, Firecracker, and runc, and an operator. Publishes the Helm chart. |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would also add the operator story here as in-scope.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've got the operator listed under the Kubernetes repo. Did you have something else in mind?


These are the proposed homes and responsibilities:

| Repository | Owns and publishes |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Additional repos that I could see and that address diferent contributor personas:

  • openshell-docs --> Documentation generation (pulling from other repos) and website generation.
  • openshell-addons --> useful addons like the policy interceptor or other examples.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

openshell-enhancements (or OEPs)?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We already have RFCs, I'd prefer to keep that over OEPs. +1 to openshell-docs.

| `openshell-sdks` | Go, Python, Rust, and TypeScript SDKs. |
| `openshell-providers-<provider>` | One repository per provider, such as AWS, Google, OCI, or GitHub, with test infrastructure suited to that integration. |

Each repository should have named maintainers and own its tests and published

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In othe CNCF projects (like Knative), automation helped quite a bit to keep those permission in sync from a central definition from the main repo.

We used Prow as the build system, the Kubernetes test infrastructure and supported on the CNCF servers, which helped in this (is uses its own DSL with /.. commands). I wonder whether Prow integration is on the table or not, but it would give us some nice support to inspect the build servers, like on https://prow.k8s.io/

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm definitely in favor of adding some automation.

More repositories mean more release and CI coordination. Changes that cross a
boundary may take longer, and an integration can fall behind core. Explicit
ownership, compatibility checks, and a gradual migration should help, but this
only works if the new repositories attract maintainers.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should also ensure to have at least two maintainers per repository and mention this somewhere in this doc.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd like to see actual maintainer names as well. I don't think it will be tenable for the current maintainers to be the default maintainers for all repos to start. The maintainer community needs to grow substantially to support this.

`systemd-spawn` intended to mean `systemd-nspawn`, and what do other platforms use?
- Where do shared Rust interfaces live, and how do we test compatibility and
coordinate security fixes across repositories?
- Which component should move first, and who wants to maintain each new home?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm happy to drive the work on the golang SDK, and as it tangent to the rest, I think it also makes a good first candidate.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds great!

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs(rfc): propose repository migration for a smaller core

5 participants