You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
[2.5.0] — 2026-08
Added
Ukrainian, Spanish and German interface languages. The localisation
engine now supports any number of languages instead of just Russian and
English. The core interface — navigation, page and section titles, buttons,
setting names, and the most frequent assistant replies — is translated;
anything not yet covered falls back to the original Russian rather than to
an invented machine translation.
A translation-coverage note under the language selector, e.g. "About 17%
of the interface is translated — the rest is shown in Russian." Choosing a
language should not promise more than it delivers.
Changed
Speech-recognition language now follows the interface language for all five
languages, not only Russian and English.
[2.4.0] — 2026-08
Added
Wake-word sensitivity slider. How closely a spoken word must match the
wake word was previously fixed in code; the right value depends on the
microphone and the recognition engine. The setting is clamped to 0.5–0.98 —
below that almost anything matches, above it almost nothing does.
Recording length setting (3–20 seconds). Rina previously always listened
for exactly eight seconds after the hotkey.
"Check models" button for the Vosk and Piper model paths. Picking the
wrong folder is easy, and until now it only surfaced later as an
unhelpful recognition error. The check also recognises the most common
mistake — pointing one level above the real model — and says so:
"The model seems to be inside: model-ru".
Fixed
A misleading comment in the wake-word matcher claimed the 0.8 threshold
matched heavily distorted variants. The measured similarity is 0.5 for those
and 0.75–0.89 for realistic ones; the documented example now matches reality.
[2.3.0] — 2026-08
Added
Installing plugins from a folder or a .zip archive, straight from the
Plugins tab. The contents are validated before anything is copied — manifest
present, main.py present, plugin.json readable and carrying an id — so a
wrong pick cannot leave debris that reports itself as a broken plugin on
every launch. Archives that wrap the plugin in a single nested folder are
handled, and installing over an existing plugin updates it.
Richer declarative plugin pages (API v2). Alongside Title, Text, Note, Items, Button and Divider, plugins can now describe: Input (a text field whose value is passed to on_action), Table (rows
with optional headers), Progress (a 0…1 bar), and Badge (a small status
label). Pages remain plain data and still serialise to JSON, so plugins stay
independent of the UI framework.
Changed
on_action(action, value) now receives a value, which is what makes input
fields possible.
[2.2.0] — 2026-08
Added
Export and import of commands. Move your commands to another computer or
keep a backup. The file carries a format version and a type, so an import
can tell a commands file from a history file and refuses the wrong one with
a clear reason rather than silently doing nothing.
History search — filter the log as you type; the counter and the empty
state follow the query ("No entries match …").
History export to readable text (grouped by day, with times and
speakers) or to JSON.
Changed
Importing commands adds to what you have instead of replacing it, and
duplicates are detected by trigger phrases rather than by id — an id from
another machine means nothing, but the phrases are what a command actually
is to you. Imported commands get fresh ids so they cannot collide with
local ones.
[2.1.0] — 2026-08
Added
Timers, alarms and reminders. "Set a timer for ten minutes", "remind me
in half an hour to call mum", "remind me at 15:00 to call the doctor",
"wake me at 7:30". Durations are understood as digits or words, including
"half an hour" and "an hour and a half", and absolute times resolve to the
next occurrence (tomorrow if the time has already passed today).
Asking about and cancelling what is scheduled by voice: "what timers do
I have", "cancel all timers".
A Reminders tab listing everything scheduled with a live countdown,
cancelling one or all, and a small form for adding a reminder by hand when
speaking is inconvenient.
Scheduled items are stored on disk and survive a restart — a reminder
that disappears when the app closes cannot be trusted.
Fixed
tr() raised a TypeError for any string containing a {text}
placeholder, because the name collided with the translation function's own
first argument. The parameter was renamed so this class of failure cannot
recur.