Skip to content

OpenRemote 0.4.2

Choose a tag to compare

@github-actions github-actions released this 28 Oct 13:24
· 170 commits to main since this release

A machine-side CLI that says what it knows, a console that says why a rule cannot run, and a second way in for people who live in a terminal.

OpenRemote is one window for the agent harnesses on your computer - Claude Code, Codex, grok, pi, opencode, agy. Most of what changed here is small and honest rather than new: places where a command or a pane answered a question it had not actually asked.

Install from a terminal

  • npm install -g @morewebs/openremote, then openremote. No installer to download. The first run fetches the prebuilt desktop app once (about 28MB), checks both binaries against the release's own checksums, keeps them under %LOCALAPPDATA%\moreweb\openremote\<release>\, and starts the console. Later runs need no network at all. openremote --update moves to a newer release, --version says which one is cached, --where prints the path it would start. Windows x64 for now; on macOS and Linux it says so and points at the release page. A release that was built without the portable pair reports where to get the installer instead of downloading something half-right.

The machine-side CLI says what it knows

  • A flag where a code belongs is refused, not sent. openremote-daemon enroll --data-dir /srv/openremote used to hand --data-dir to the registry as the pairing code, so the first thing a person met was "that code is not valid" - and the sensible next step was to mint another code for a flag. It now names the flag, prints the one usage line, and exits 2. The same extraction caught enroll --data-dir /srv/x, which the arity check had counted as an extra code.
  • An expired install code says so. A mistyped or expired code answered with the wire token (invalid_code) or the generic refusal. It now reads: "That code is not valid. Codes are single use and expire after five minutes; mint a new one from the machine list." When the registry sends its own sentence, that sentence is kept; an unknown failure still carries its HTTP status so it can be identified.
  • status stopped claiming reachability it never measured. The line came from a record the last daemon left behind, so a healthy machine would print "Connecting to OpenRemote Cloud." for ever, and "Reachable" could never print at all. The one state the files do hold - a credential the registry refused - is still printed, because signing in again is the only way back; everything else is silence. Asking a daemon that is actually running whether the relay is blocked is a follow-up, not something this command can guess.
  • agent --data-dir /srv/openremote no longer runs against the default folder. A command that takes no arguments refuses one, names it back, prints the one usage line and exits 2 - which is what a unit file written the obvious way needed to hear.

The console

  • A rule that cannot run says why, and the list agrees with the palette. A rule whose machine left the account was still offered Run now in the list while Ctrl+K refused to offer it at all, and its machine was named by a raw id. One predicate answers for both now, with a title per reason ("The machine this rule ran on is no longer in your account", "Its machine has not come online yet") and a row that says what the machine is.
  • Editing a rule no longer moves it. When the saved machine was not in the online list, the editor seeded its picker from the first online one, so changing a schedule silently rewrote where the rule runs. The saved machine is kept and shown as offline; a machine that has left the account turns Save off with a line saying where to go instead.
  • A chat called "Settings" is the chat. Ctrl+K broke every tie by insertion order, and every action is inserted before every chat, so a chat with its own name lost to the Settings view and Enter opened the view. A tie now prefers the label that begins with the query, then a chat over an action, then the order the rows came in - and only when two rows scored exactly the same.
  • A dropped stream says it is reconnecting. A stream that drops is retried with a backoff that grows to half a minute, and nothing outside the stream knew: the transcript stopped while the status still said running. The pane header says the word quietly after the title, and the sidebar row's tooltip repeats it.
  • Restoring a saved layout asks first, naming how many panes close and that the chats themselves stay in the sidebar - and asks nothing when the window is empty, when the shape is already on screen, or when the shape cannot open at all. A shape saved in a wide window also came back as slivers in a narrow one; it is fitted to the window it lands in now, every pane held at a readable width.
  • Search finds a chat inside a folded project. A chat in a folded project could not be found from the sidebar's own search, because its row only draws while the project is open. A search opens the projects it matches and folds them back when the query is cleared, and a folded project is remembered across restarts.
  • A capped group says it is capped. The palette stopped at eight rows per group and said nothing, so a query matching nine hid the ninth. A cut group now ends with "and N more" over "Refine the search to narrow it".
  • Discover and the endpoint pane say a failed read failed. "No plugins found" and "the refresh failed" were the same screen, and the endpoint pane could say "No custom endpoints yet" over a poll that never answered. Both say what happened, in the pane's own error style, with a Try again that runs the same call.
  • Three chats waiting ask at once instead of one after another, so the waiting lines arrive together and a failed ask costs only its own line.

Known

  • An installed app still does not look for a newer version. Moving to a newer release means running a newer installer over it, or openremote --update if you installed through npm.

Installing this

The installers are unsigned by decision, so Windows shows SmartScreen the first time: More info, then Run anyway. On macOS, right-click the app and choose Open. Android refuses an update whose version code does not exceed the one installed; this build's code is higher.

Linux gets both an AppImage, which runs anywhere, and a .deb for Debian and Ubuntu. Windows gets the same app twice, as a setup .exe and an .msi, for whichever your machine prefers. The Android file is the one APK, listed under both its version-free and versioned names. The daemon download, SHA256SUMS and the third-party notices are for servers, not desktops.

If you would rather not run an installer at all, npm install -g @morewebs/openremote puts an openremote command in your terminal that does the same job.

Upgrading keeps your chats, your settings and any paired phone.

No account is needed for Local mode: chats, harnesses, plugins and rules all run on this computer, and nothing about them is sent anywhere. Cloud mode is the part that talks to a relay, and it runs only if you sign in to it. If you find something wrong, the issue tracker is the fastest way to tell us.