Repository navigation
moonlet 0.1.30
Apple Silicon build, signed with a Developer ID and notarized by Apple. Installed apps update themselves from Settings › Updates.
Heavy commands run on a free machine
An agent's test suites and builds no longer have to run on the machine the agent is on. List a project's heavy commands in .moonlet/config.toml:
[heavy]
commands = ["pnpm test", "pnpm build"]
outputs = ["coverage"]Once you approve the list, moonlet runs each one on the least busy machine you've lent: a Mac with Use this Mac for heavy commands on, a remote host, the central host itself, or a cloud machine. The agent stays where it is and doesn't notice the difference.
- Approve once. Settings › Projects lists a project's heavy commands. Agents run approved commands without asking, on the machines you approved them for. A command you add or change runs where the agent is until you approve it.
- The session's files, exactly. The machine runs the command in a copy that holds exactly the session's files. Every change the command makes, such as snapshots or
coverage/, is back in the session before the agent reads the result. - Nothing gets lost. If the machine goes away mid-run (a lid closes), the command runs again on the central host, and the agent gets that run's result.
- Jobs tab. Every routed command is a job of its session. The Jobs tab lists them: where each ran, how long it took, its exit status and its full output. The chat's Bash row shows where the command ran.
- Workers page. Settings › Machines › Workers shows each machine's load, slots, round trip and what it is running.
- Remote hosts can help too. Every connected tailnet host in Settings › Machines › Hosts, such as a Linux build box, has its own Use for heavy commands switch. The first time, it asks for a pairing code from the central host (
moonletd pairthere).
Cloud workers
The central host can rent machines from Hetzner Cloud when every worker is busy, or when you ask for one, and removes them once they are idle.
- Set it up in Settings › Machines › Cloud workers. Add a Hetzner API token. For Tailscale, either set up an OAuth client (guided, with a Check button) or paste an auth key. Limits: at most N machines, and machine-hours a month.
- Per project: a project's settings page turns cloud machines on and picks the machine type and location.
[heavy] machine_setupinstalls what its commands need. - Billed time counts. Hetzner bills every started hour, so an idle machine stays until just before its paid hour runs out, ready for the next command. Set the idle time to 0 to remove a machine as soon as its command ends.
- Ask for the cloud: the new-session composer has Run heavy commands in the cloud, and
moonlet worker upstarts a machine ahead of a long build. - What a machine gets: the project's files and the variables you approved in
[heavy] env. It never gets your git credentials, your provider token or your Tailscale secret.
This is new and has been tested against the providers' published API examples, not yet against a real Hetzner account. Set the limits low until you have seen it work.
Also new
- Task comments. The Task detail in Tasks mode and a session's Task tab show the task's comments, for Linear, Jira, ClickUp and GitHub issues, and take a new one (⌘↵ posts it).
- Every toast has a Dismiss button.
Fixes
- Pairing is tied to what is pairing. A pairing code from Settings › Phones pairs only a phone, and one from Hosts or
moonletd pairpairs only a Mac. Before, a device could pair as a Mac with a phone's code and get a Mac's rights. - The app no longer shows a Back, Forward and Reload menu on right-click.
- On the phone, sheets cover the tab bar on iOS.
Before you update
This release changes the protocol between the app, the daemon and other machines. Update everything that connects:
- Remote Macs: update moonlet on each one too. Until then their host row reads "Update moonlet on …".
- Linux hosts: run the install command again:
curl -fsSL https://github.com/1devstudio/moonlet/releases/latest/download/install.sh | sh - The phone app: a phone build older than this release can no longer connect. Install a build made from this version.
Routed commands and remote hosts have been tested with daemons on one machine, not yet between two real machines.