Skip to content

Plan: hosted boxes (boxctl.io) as an onctl provider - #1157

Merged
cdalar merged 2 commits into
mainfrom
ai/boxes-provider-plan
Oct 4, 2026
Merged

cdalar merged 2 commits into
mainfrom
ai/boxes-provider-plan

Conversation

@cdalar

@cdalar cdalar commented Oct 4, 2026

Copy link
Copy Markdown
Owner

Design doc only (docs/plans/boxes-provider.md). Nothing is built yet.

Summary

Make boxctl.io's hosted Firecracker boxes another onctl provider, onctl -p boxes ..., instead of shipping and renaming a separate boxctl CLI. That name is taken by an earlier project that also installs a boxctl binary.

Technical details

  • The boxes API maps onto CloudProviderInterface almost one to one: Deploy/Destroy/Pause/Resume/List/GetByName, plus ImageLister.
  • Two gaps, each with a hook:
    • Boxes have no reachable IP. A new optional Dialer interface lets tools.Remote run ssh over the provider's tunnel, so create -a, deploy, action, upload/download and WaitForSSH all work. Interactive onctl ssh uses a ProxyCommand through a new onctl ssh-proxy, which also lets plain ssh, scp and rsync reach boxes.
    • No key registry. Deploy authorizes the key over the exec endpoint.
  • Box-only features become optional interfaces (PortForwarder, SizeLister, IdleTTLSetter), following the existing ImageLister/Restarter pattern.
  • boxctl claude → onctl claude. It's ported as is (~1.9k lines with tests), boxes-only in v1, with a path to running on any provider later.
  • The Claude Code plugin moves here and is renamed /onctl:*.
  • The boxctl CLI is retired. The server and its API don't change.
  • Rollout: 5 independent PRs.

Open questions (in the doc)

Provider ID (boxes?); onctl login vs onctl boxes login; names for backups (import is taken); release coupling; the websocket dependency.

🤖 Generated with Claude Code

https://claude.ai/code/session_01U8g3mHkS6JmtYVYc4AjcV4

Instead of renaming the boxctl CLI -- the name is taken by an earlier
project that also installs a `boxctl` binary -- make the hosted service
another onctl provider, `-p boxes`, next to hetzner and aws. The API maps
onto CloudProviderInterface almost one to one; the gaps are reaching a
box with no reachable IP (an optional Dialer interface, plus `onctl
ssh-proxy` as ssh's ProxyCommand) and authorizing the key after deploy.
Box-only features become optional interfaces, `boxctl claude` becomes
`onctl claude`, the Claude Code plugin moves here, and the boxctl CLI is
retired.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U8g3mHkS6JmtYVYc4AjcV4
@cdalar
cdalar merged commit d295e69 into main Oct 4, 2026
13 checks passed
@codecov

codecov Bot commented Oct 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 36.93%. Comparing base (2f5cb90) to head (6399095).
⚠️ Report is 5 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #1157   +/-   ##
=======================================
  Coverage   36.93%   36.93%           
=======================================
  Files          51       51           
  Lines        5656     5656           
=======================================
  Hits         2089     2089           
  Misses       3567     3567           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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.

1 participant

⌂ 换网址