Skip to content

Offline and air-gapped use #227

Open

Description

@Kinflou

Epic. How Comline works with no internet access, across every repository. The draft proposal is ComlineProject/docs#163 (proposals/offline/).

Situations (all in scope)

  • an offline developer machine;
  • an isolated build or CI network;
  • an air-gapped deployment;
  • bringing the tooling itself into a sealed network.

Decided

  • Choosing is separate from getting. add and a future update write pins. Getting already-pinned bytes follows the rules below.

  • Default: a build fetches missing pinned content on demand.

    • A hard offline switch (--offline, an environment variable, machine config) forbids all network access, and lists everything missing in one error.
    • comline fetch fetches ahead of time exactly what a build would.
  • Package settings can only tighten: explicit fetching, required hashes. The strictest setting wins. Offline is absolute, and a dependency's settings apply only to its own builds.

  • Hashes are mandatory:

    • for registry dependencies, always;
    • for git dependencies, when offline or when the package requires them;
    • for any dependency with more than one source.

    A mismatch is a hard error naming the source.

  • Identity is the hash; location is replaceable. Bytes can come from:

    • several ordered sources per dependency (from the package, machine or organisation mirrors, and root additions for hashed transitive pins, which add and never replace);
    • a shared hash-keyed cache;
    • vendoring, mirrors, or signed bundles.

    The order is mirrors, then the root's additions, then the package's own sources.

  • Generated code's dependencies: publishing the runtimes to crates.io and npm is a 1.0 requirement. Until then, document vendoring.

  • Tooling: release artifacts with checksums and signatures, reproducible builds, an SBOM, and an offline docs bundle.

  • Nothing calls home: the runtime and generated code reach only their peer, there is no telemetry and no update check, and the language server never fetches.

Tracking

Proposal: ComlineProject/docs#163 (draft).

Stage 1, fetching rules

Stage 2, cache and vendoring

Stage 3, sources and mirrors

Stage 4, bundles

Stage 5, tooling into the gap

Stage 6, generated code's dependencies (1.0)

Related: ComlineProject/cli#1 (publish comline to crates.io), ComlineProject/docs#102 (reserve package names).

Activity

  1. added
    P2Soon
    toolingCLI, language server, editor
    designNeeds a design decision
    securitySecurity and safety
    on Nov 9, 2026
  2. Kinflou commented on Nov 9, 2026

    @Kinflou
    MemberAuthor

    Details decided (docs#163 updated):

    • Settings: fetch policy in the project's comline.toml; layered machine and organisation TOML for offline, mirrors, cache and keys; strictest wins.
    • Sources are never frozen.
    • Cache: platform cache dir with an optional read-only organisation layer, never evicted automatically.
    • Mirrors are the only route unless fallback = true.
    • Bundles: deterministic .tar.zst, minisign-signed; unsigned ones refused by default.
    • Releases: minisign plus GitHub attestations, with a CycloneDX JSON SBOM.

    Still open: whether comline fetch takes --for <target>.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2SoondesignNeeds a design decisionsecuritySecurity and safetytoolingCLI, language server, editor

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions