Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions .github/actions/cask-audit/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ inputs:
required: true
core:
description: >
Generate the homebrew-cask core variant (drops the --no-quarantine hint,
which core rejects) instead of the tap variant.
Generate the homebrew-cask core variant (drops the command-line
quarantine workaround) instead of the tap variant.
required: false
default: 'false'
audit-args:
Expand Down Expand Up @@ -52,6 +52,10 @@ runs:
variant=""
[ "$CORE" = "true" ] && variant="--core"
bash scripts/gen-homebrew-cask.sh "$TAG" $variant > out/Casks/voltius.rb
if grep -q -- '--no-quarantine' out/Casks/voltius.rb; then
echo "::error::Generated cask uses Homebrew's removed --no-quarantine option"
exit 1
fi
cat out/Casks/voltius.rb

- name: Style and audit
Expand Down
56 changes: 44 additions & 12 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.30.0] - 2026-08-24

### Added

- Cloud sync is now yours to choose, group by group and setting by setting.
Settings → Sync gains a switch per group — themes, interface, shortcuts,
app settings, recent people — and each individual setting gains a cloud
button in its row's hover controls, so a single value can stay on this
device without switching its whole group off. A held-back value never enters
the uploaded backup, and a copy already on the server is withdrawn when you
switch the setting off. Each group also lists what it is keeping local, which is the
- Your settings are now yours to sync group by group and setting by setting.
Settings → Sync gains a second block, "Settings", below the existing Sync
Preferences block that already governed hosts, identities, keys and the rest.
It carries one switch per group — Themes, Interface, Shortcuts, App settings,
Recent people — and each individual setting gains a cloud button in its own
row's hover controls, so a single value can stay on this device without
switching its whole group off. A held-back value never enters the uploaded
backup, and a copy already on the server is withdrawn when you switch the
setting off. Each group also lists what it is keeping local, which is the
only control for the handful of settings that have no row of their own.
- The default shell is no longer synced unless you ask for it. A shell path is
wrong on another machine by construction, so it is now device-scoped: it
Expand All @@ -26,11 +30,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
the uploaded backup — and out of any third-party sync destination, such as
the gist-sync plugin — until you opt it in from the cloud button beside the
latitude and longitude fields.
- Snippets now have their own cloud sync switch. Settings → Sync gains a
Snippets row alongside hosts, identities, keys, folders and port forwarding,
so the whole collection can stay off the backup — individual snippets could
already be excluded one at a time from their card. Switching Folders off now
also stops snippet folders syncing, which is what their cards already showed.
- Snippets now have their own cloud sync switch. The Sync Preferences block
gains a Snippets row alongside Hosts, Identities, SSH Keys, Folders and Port
Forwarding, so the whole collection can stay off the backup — individual
snippets could already be excluded one at a time from their card. Switching
Folders off now also stops snippet folders syncing, which is what their cards
already showed.
- Terminal font size is now a setting of its own in Appearance, overriding the
active theme, where before changing it meant cloning a theme or scaling the
whole UI. On mobile a two-finger pinch on the terminal drives the same value.
It stays on this device — a size that reads well on a phone does not read
well on a desktop — so it is never synced.

### Changed

Expand All @@ -49,6 +59,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
collision in a panel that also has a Shortcuts group — and the same word was
used for terminal panes; both now say what they mean. "Недавние люди" became
"Недавние контакты", which is what the counts beside it already said.
- Pasting went to the wrong terminal. With more than one terminal on screen,
the paste landed in whichever session the pane had opened last rather than
the one that received the keystroke.
- Your own tmux works inside a persistent session again. A persistent session
wraps the remote shell in Voltius's own tmux, and that wrapper leaked its
socket and its `C-b` prefix into the shell: `tmux ls` listed Voltius's
private sessions instead of yours, `tmux attach` refused to nest at all, and
a forced nest lost every prefix key. The wrapper now clears the multiplexer
environment and gives up its prefix. The fix reaches new sessions; a session
started before this release keeps the old wrapper until it is restarted.
- On a host that has screen but not tmux, the wrapper no longer swallows
`C-a`. A bare `C-a d` inside your own nested screen detached Voltius's
session instead, closing the connection and reconnecting underneath you.
- Duplicating a session no longer lands in your home directory when the
original's working directory has since been deleted. The directory probe
read the kernel's `<path> (deleted)` form verbatim, so the duplicate's `cd`
could never succeed; it now falls back to the nearest directory that still
exists. The same stale path also reached the stored working directory and
the file panel's follow-cwd.
- Exporting or deploying a key whose public half was never stored no longer
fails with "Public key not found". The public half is derived from the
private key instead.

## [0.29.0] - 2026-08-20

Expand Down
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 5 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,18 +95,16 @@ brew install --cask voltiusapp/voltius/voltius

Voltius is ad-hoc signed but not yet notarized (no Apple Developer account yet).
If macOS Gatekeeper blocks the first launch, right-click the app and choose
**Open**, or install with `--no-quarantine`:
**Open**. To clear the quarantine flag from an existing installation instead,
run:

```sh
brew install --cask --no-quarantine voltiusapp/voltius/voltius
xattr -dr com.apple.quarantine /Applications/Voltius.app
```

If you download the `.dmg` directly and macOS says **"Voltius.app is damaged and
cannot be opened"**, the download was quarantined — clear the flag and launch again:

```sh
xattr -cr /Applications/Voltius.app
```
cannot be opened"**, the same command clears the quarantine flag after you copy
Voltius to Applications.

### Windows — winget

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "voltius",
"version": "0.29.0",
"version": "0.30.0",
"packageManager": "pnpm@11.5.2",
"type": "module",
"scripts": {
Expand Down
12 changes: 5 additions & 7 deletions scripts/gen-homebrew-cask.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@
# e.g. gen-homebrew-cask.sh v0.4.0
#
# --core emit the variant intended for a homebrew-cask *core* submission
# rather than for the VoltiusApp/homebrew-voltius tap. Core rejects
# casks whose caveats tell the user to reinstall with
# --no-quarantine, so that hint is dropped there; the right-click
# Open instructions stay, which core does accept for an app that is
# ad-hoc signed but not notarized.
# rather than for the VoltiusApp/homebrew-voltius tap. The tap gives
# an optional command for clearing the quarantine flag; core keeps
# only the accepted right-click Open instructions.
#
# Requires: gh (authenticated), awk. Reads the .dmg.sha256 release assets.
set -euo pipefail
Expand All @@ -27,8 +25,8 @@ if [ "$VARIANT" = "--core" ]; then
QUARANTINE_HINT=""
else
QUARANTINE_HINT="
To skip the warning entirely, install with:
brew install --cask --no-quarantine voltiusapp/voltius/voltius
To clear the quarantine flag from an existing installation instead, run:
xattr -dr com.apple.quarantine /Applications/Voltius.app
"
fi

Expand Down
2 changes: 1 addition & 1 deletion src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "voltius"
version = "0.29.0"
version = "0.30.0"
description = "Open-Source SSH & SFTP Client"
authors = ["Voltius Contributors"]
edition = "2021"
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"productName": "Voltius",
"version": "0.29.0",
"version": "0.30.0",
"identifier": "com.voltius.app",
"build": {
"beforeDevCommand": "pnpm dev",
Expand Down