Releases: yakuda-stack/OSC-DreamChatbox
Release list
v1.6.5 ai translation (local,online) / notification sound
[v1.6.5] – 2026-10-01
Changed
- Textbox page tidied up. Translation has its own collapsible
card between To Text and Presets (service, keys, test, plus a
"Chatbox display" section with Show original + translation and
Say when a translation is running). The card head shows the active
service and target language while collapsed. - To Text is shorter: the record button / text field now come right
after language and microphone; Send as (shorter labels: Standard /
Line / Variables) lives in a collapsible section whose arrow shows the
current route. Long hint texts shortened or moved into tooltips.
Added
- Favorite translation services. The service is now picked in the
To Text card (above the input language). The Translation card only
holds the settings (Settings for – follows the active service, Test
checks the one shown), with a ★ Favorite toggle per service – once
you have favorites, the dropdown shows just those. If the active
service is no favorite, the first favorite takes over. - Both service dropdowns are grouped under Translator and
AI Translation headers. - Translate with an AI (
core/ai_translator.py) – five new
services in the dropdown:- Local AI – Ollama: offline on your own PC. Install (Arch:
ollama/-cuda/-rocmpackage matching the GPU, other distros:
the official script, Windows: download page), Start Ollama,
Download model (ollama pull), Ollama URL for a server elsewhere. - Claude Code, Gemini CLI, ChatGPT (Codex CLI): use the
vendor's own program with your normal account login – no API key
typed into the app. Install (Claude: official installer, Gemini /
Codex: npm into~/.local, no sudo) and Log in open a terminal;
the card shows whether the program is installed and logged in. - Custom AI: your own command or curl call (LM Studio, llama.cpp,
vLLM, a remote Ollama …);{prompt}is the finished request,
{model}the model field. Button for an OpenAI-compatible example. - Editable model dropdown per service (Ollama lists the installed
models first). Defaults:gemma3:4b,haiku,flash,
gpt-5.6-luna– the fast ones, a chat line should not wait. - Works everywhere a translation happens (Speech to Text, Text to
Text, Two-way). If the AI fails, the normal fallback chain
(Lingva → Google → adminForge) takes over; Test shows the exact
reason (e.g. not logged in, model not downloaded).
- Local AI – Ollama: offline on your own PC. Install (Arch:
- Notification sound (Options → OSC → new Notification card,
community wish):- When: Never (default), When the chatbox appears (first
message after the chatbox was empty – cleared or ~30 s without a
message, not every update) or Only on translations and AFK (a
translated message from any service, AI and Two-way included, or
going AFK). - Play the sound in: VRChat (default – its chatbox sound via the
third argument of/chatbox/input, everyone nearby hears it),
OSC-DreamChatbox (only on your PC – built-in chime or your own
.wav; pw-play / paplay / aplay, winsound on Windows, no new
dependency) or Both. - ▶ Test next to it tests exactly what is selected (VRChat: a short
"🔔 Notification test" message with sound). - Custom avatar parameter (VRChat / Both, default
DreamNotify):
a Bool set true for one second on every notification, for avatars
with their own sound (set up in Unity – see README).
- When: Never (default), When the chatbox appears (first
- Custom translator: answers of OpenAI-compatible / Ollama chat APIs
(choices[0].message.content,message.content,response) are
found without a# response:line.
v1.6.4
[v1.6.4] – 2026-09-29
AppImage-only release – the app itself is unchanged from v1.6.3.
Fixed
- AppImage still did not start on a fresh Ubuntu 22.04 / Mint 21
(the AppImage catalog test kept reporting "exited within 11
seconds"). Besideslibxcb-cursor0, Qt's xcb plugin also needs
libxcb-randr0andlibxcb-xkb1, which a minimal 22.04 does not
have either – without them Qt aborts with "Could not load the Qt
platform plugin xcb". Both now ship inusr/lib/extralike the other
xcb libraries and are only used when the system has none.
Tested by starting the AppImage in a freshly bootstrapped Ubuntu
22.04 (no Python, only the packages the catalog test installs) as a
normal user: the window comes up.
v1.6.3
[v1.6.3] – 2026-09-29
More community wishes (Discord): an empty chatbox when there is nothing
to show, and a choice of what "Hide media while paused" hides in All in
one.
Added
- Options: "Clear chatbox when there is nothing to send"
(clear_when_empty, off by default). When every app is off or has
nothing to show – e.g. the song was paused with Hide media while
paused – one empty message removes the old text at once instead of
VRChat keeping it for ~30 s. Only ever the app's own automatic text:
a message typed and sent by hand is never cleared by this. Respects
the chatbox rate limit like every other send; Advanced mode clears on
its one-second tick. - MediaPlay: "In All in one" choice under Hide media while paused
(media_pause_scope): Remove only the MediaPlay parts (default,
what 1.6.1 already did – status, hardware and the rest keep going) or
Pause the whole All in one (nothing from All in one while no song
plays; plugin and chat lines still go out).
Fixed
- A song-only AIO line left its decoration behind – with no song,
🎵 {title} 🎵came out as🎵 🎵. A line whose placeholders are all
MediaPlay ones now disappears completely (or shows the idle symbol).
Mixed lines likeStatus: {text} | {title}keep their other part. - AppImage quit right after starting on Ubuntu 22.04 / Mint 21
(reported by the AppImage catalog test: "exited within 11 seconds").
Two causes, both fixed inscripts/build_appimage.sh:- it used the system's
python3and only carried packages for
3.12–3.14 – Ubuntu 22.04 has 3.10. The AppImage now brings its
own Python 3.12 (python-build-standalone) and needs no Python on
the system at all. - Qt ≥ 6.5 does not start without
libxcb-cursor0, which many
Ubuntu/Mint installs lack. It (and the other small xcb libraries Qt
wants) now ships inside the AppImage and is only used when the
system has none. - on top: every file in the AppImage is now readable for every user.
Some were owner-only (600), which givesPermissionErroras soon
as another user – or the catalog test – starts it.
- it used the system's
v1.6.2
[v1.6.2] – 2026-09-29
Translation works again, and the player volume can go into the chatbox.
Fixed
- Lingva: "Expecting value: line 1 column 1" – the default instance
lingva.adminforge.dewas shut down and now redirects to adminForge's
LibreTranslate, so the app got a web page instead of JSON. The Lingva
default is nowlingva.ml, and a web page is reported as "no longer a
Lingva server". On top of that, every public Lingva instance currently
hands the text back untranslated (its Google scraping broke
upstream) – the app now recognises that and falls back instead of
sending the original text. - Google (keyless) HTTP 429 – requests now go out with a browser
User-Agent (the app's own one got blocked much sooner), and on a
429/403 a second keyless Google endpoint is tried before giving up.
Changed
- Default translation service: LibreTranslate Online on
translate.adminforge.de(was Lingva). No key, no Google tracking,
German operator with imprint and a no-logging statement. Existing
configs still on Lingva are switched over once
(stt_migrated_v162); picking Lingva again afterwards sticks.
LibreTranslate Online is now first in the service list.
Added
- LibreTranslate Online: two keyless servers in the dropdown –
translate.adminforge.de(adminForge, imprint, "no tracking, no
logging") andlt.pyrine.net(private, no imprint/privacy notice,
fewer languages). Both checked: HTTPS, no key required, working. - One more fallback: when the chosen service, Lingva and Google all
fail,translate.adminforge.degets the last try. - MediaPlay: player volume –
{volume}(65%) and{volume_db}
(-3.7 dB) for custom strings, AIO and the canvas (new Volume
output on the MediaPlay block), plus a Player volume checkbox under
Playback time & progress that adds🔊 65%to the song line (off by
default). It is the player's own slider, read via MPRISVolume; the
card shows it next to the detected player. Players that do not report
it leave it empty – many browsers, and Windows, where GSMTC has no
volume at all.
All from the community (Discord).
v1.6.1
[v1.6.1] – 2026-09-28
Community wishes: hide the paused song, and more room in Advanced mode.
Added
- MediaPlay: "Hide media while paused" – new checkbox under the
player choice (media_only_playing, off by default). When on, a
paused or stopped player counts as "nothing playing": the media line
disappears, or shows the idle symbol if that is switched on. Works for
the normal line, the custom string, All in one and every media
placeholder. The card still says which player is paused
(paused – hidden). Saved per profile like every other option. - Advanced mode: side panels can be dragged wider – the Blocks
palette and the Block inspector sit in a splitter now instead of a
fixed 196 / 232 px. Drag the edge next to the canvas; the widths are
remembered (graph_panel_widths), folding a panel away and back keeps
its width, and the canvas never gets narrower than 320 px. - Advanced mode: the inspector's Text field grows with its text –
it was a fixed 72 px box with a scrollbar and half the panel empty
below. Now it gets taller line by line (wrapped lines count) up to
420 px and only scrolls after that.
Both from the community (Discord).
v1.5.10 Fix:** `{text_t2}
Fixed
{text_tX}of other templates used the active template's list
index – with 2 texts in template 1,{text_t2}only ever showed the
first two texts of template 2. Every template now walks its own list
(own position, Random order respected), still on the same clock. They
also keep rotating when the active template has only one text or
Personal Status is off.- The other templates were still capped at 20 texts, and
{text_tX_N}only took two-digit slot numbers – both now go to 100.
v1.5.9 100 status and select temp sensor and ram_used}` / `{vram_used}`
[v1.5.9] – 2026-09-27
From user feedback: more status texts, a CPU temp sensor picker and
numbers-only RAM/VRAM placeholders.
Added
- Personal Status: up to 100 texts per template (was 20) – for
people who use the rotation as a quote list.STATUS_MAX_TEXTSin
core/constants.py. The text rows are built on demand, so nothing
gets heavier until you raise Number of texts.{text_N},
{text_tX_N}, the placeholder menu, the node canvas (Status text
entry) and the Advanced variable list all follow. Existing configs
are padded, nothing is lost. - CPU temp sensor dropdown in the CPU box of the Hardware card.
Lists every temperature sensor with its current value – Linux: all
hwmon nodes, id = driver + label (k10temp/Tccd1, stable across
boots); Windows: every temperature in LibreHardwareMonitor's tree.
Automatic (default) behaves as before; a sensor that is gone falls
back to automatic with one log line. Config keyhw_cpu_temp_sensor. {ram_used},{vram_used},{vram2_used}– used/total as numbers
only.{ram_usage}/{vram_usage}stay as they were (numbers and/or
percent, whatever is ticked), so no existing string changes.
v1.5.8
🟢 Windows Support: Complete & Stable (v.1.3.0)
🟢 Linux Support: Complete & Stable (v1.2.6)
[v1.5.8] – 2026-09-26
Store search with tags, three new MediaPlay placeholders and a
bigger plugin catalogue.
Added
Plugin store: search and tags
- Search field above the store: finds plugins by name, description,
author and tags. Several words must all match;#wordsearches only
the tags. - Tag dropdown next to it (most used tags first), and the tags on every
tile are clickable – one click filters the store by that tag. The
detail page lists them too. - Status shows "2 of 5 plugin(s)" while filtered, and a short hint when
nothing matches. - New manifest key
"tags": ["weather", "clock"]– lower case, up to 8,
each up to 24 characters. A#, capitals or a comma separated string
are cleaned up, never refused; older apps ignore the key. Documented
indocs/PLUGIN_API.md.
MediaPlay
{album}– the album, when the player reports one (MPRIS
xesam:albumon Linux, the media session on Windows). It was already
listed in the placeholder picker but never filled.{remaining}– time left in the song.{progress_percent}– how far in, e.g.34%.- All three stay empty when the player does not say (no album tag, a
stream without a length) and drop out together with their separators.
Names as in the chatbox converter.
Plugin catalogue (v1.1.8)
- New in the store: Life Stats (clock, countdown, weather, heart
rate, text from files) and Linux Extras (from VRCOSC)
(vrcosc_modules, Linux only). - The clock moved from World Stats to Life Stats; Life Stats takes the
clock settings over on its first start.
Changed
- README: store search, the new MediaPlay placeholders and the plugins
in the store.
Tests
tests/test_plugin_tags.py: tag clean-up, manifest parsing, search
and tag order.tests/test_media_custom_mode.py:{album}{remaining}
{progress_percent}, including the empty case.
v1.5.7
All notable changes to OSC-DreamChatbox are documented here.
🟢 Windows Support: Complete & Stable (v.1.3.0)
🟢 Linux Support: Complete & Stable (v1.2.6)
[v1.5.7] – 2026-09-26
Plugins travel with profiles, a Default profile, profile
import/export, saving on exit – and a headless flag for plugins.
Added
Plugins in profiles
- A profile now lists its plugins at the end of the file:
"plugin_oscleash": true,"plugin_afk": false, … Loading a profile
switches them on/off. - Each profile keeps the settings of its plugins in
profiles/plugins/<name>.json: options, custom string, own line,
position and block order. The "may write to the chatbox" answer stays
per machine. - A profile that needs a plugin you don't have asks once whether to
install it from the store. Plugins that are not in the store (or not
for your system) are only logged – no crash, the profile loads anyway. - A plugin installed later (store, .zip or rescan) that the active
profile already lists asks whether to load its saved on/off state and
settings. Several at once share one popup. - At start, plugins the active profile does not know yet are listed in
one popup: save them into the profile? With no profile active, the
popup asks which profile they should go into. Each plugin is asked
only once. - Profiles made before v1.5.7 (no
plugin_keys) leave plugins exactly
as they are.
Profiles
- Default profile: a fresh install – or anyone without a profile –
starts with a profile called Default. - Save on exit (Options › General › Profiles, on by default): the
active profile is saved when the app closes, plugin settings included. - Export / Import (Options › General › Profiles): one
<name>.dcbprofile.jsonwith all settings and plugin settings. Plain
profile.jsonfiles import too. An existing name can be replaced or
imported under another name; afterwards the app offers to switch to
it. An import never changes your OSC target or theme.
Plugin API
- New manifest key
"headless": falsefor plugins that do not work in
terminal mode. They are not loaded there (a note in the log and in
DCB-plugin-statusinstead of a traceback). Missing =true, so every
existing plugin behaves as before; the window is not affected.
Documented indocs/PLUGIN_API.md.
Changed
- Rename and delete of a profile take its plugin settings file along.
- README: profiles section and plugin flags updated.
Tests
tests/test_profile_plugins.py: plugin keys, settings file,
switching, missing plugins, popups, import/export and theheadless
flag.
v1.5.6 lyrics length and appimage with python 3.12, 3.13 and 3.14
[v1.5.6] – 2026-09-26
Max length for lyrics and an AppImage that runs on Python 3.12 –
Ubuntu 24.04 / Mint 22 no longer need a separate Python 3.14.
Added
- Lyrics › Max length: a slider right under Lyrics, same as the one
for the song title (10–144 characters). Long lyrics lines are cut hard
(no "…") so the songbar, the Custom Box frame and the slim characters
still fit into VRChat's 144 characters instead of being cut off. The
symbol in front (♪) stays. Works for the normal layout and for
{lyrics}in custom, All in one and Advanced mode strings. Default: all
the way right = no limit, so existing setups do not change. - Tests for the lyrics Max length (cut, default, out-of-range values).
Fixed
- AppImage on Python 3.12 / 3.13: the AppImage only carried the
compiled modules (PyQt6.sip, zeroconf, setproctitle, …) for the Python
of the build machine (3.14). On distros with Python 3.12 PyQt6 did not
load, and installing Python 3.14 separately did not reliably help. The
AppImage now bundles them for 3.12, 3.13 and 3.14 side by side –
Python picks the matching ones by itself – with almost no extra size. - The AppImage start script uses the system
python3if it fits,
otherwise an installedpython3.14/3.13/3.12, and otherwise
explains in plain words which Python is needed instead of a traceback. - Starting from source with Python older than 3.12 now ends with a clear
message instead of aSyntaxErrordeep inside the UI.
Changed
scripts/build_appimage.sh: downloads ready-made wheels for every
version inDCB_PYVERS(default3.12 3.13 3.14), no matching Python
needed on the build machine. For 3.13+ theaifc/audioopbackports
for SpeechRecognition are added explicitly.- README: Python badge now says 3.12+; AppImage section names the
supported Python versions.