Skip to content

Releases: yakuda-stack/OSC-DreamChatbox

v1.6.5 ai translation (local,online) / notification sound

Choose a tag to compare

@yakuda-stack yakuda-stack released this 01 Oct 15:35

[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 / -rocm package 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).
  • 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).
  • 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

Choose a tag to compare

@yakuda-stack yakuda-stack released this 29 Sep 10:25

[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"). Besides libxcb-cursor0, Qt's xcb plugin also needs
    libxcb-randr0 and libxcb-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 in usr/lib/extra like 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

Choose a tag to compare

@yakuda-stack yakuda-stack released this 29 Sep 09:42

[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 like Status: {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 in scripts/build_appimage.sh:
    • it used the system's python3 and 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 gives PermissionError as soon
      as another user – or the catalog test – starts it.

v1.6.2

Choose a tag to compare

@yakuda-stack yakuda-stack released this 28 Sep 22:36

[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.de was shut down and now redirects to adminForge's
    LibreTranslate, so the app got a web page instead of JSON. The Lingva
    default is now lingva.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") and lt.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.de gets 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 MPRIS Volume; 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

Choose a tag to compare

@yakuda-stack yakuda-stack released this 28 Sep 17:41

[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}

Choose a tag to compare

@yakuda-stack yakuda-stack released this 27 Sep 17:22

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}`

Choose a tag to compare

@yakuda-stack yakuda-stack released this 27 Sep 13:02

[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_TEXTS in
    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 key hw_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

Choose a tag to compare

@yakuda-stack yakuda-stack released this 26 Sep 11:11

🟢 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; #word searches 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
    in docs/PLUGIN_API.md.

MediaPlay

  • {album} – the album, when the player reports one (MPRIS
    xesam:album on 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

Choose a tag to compare

@yakuda-stack yakuda-stack released this 26 Sep 10:01

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.json with all settings and plugin settings. Plain
    profile .json files 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": false for plugins that do not work in
    terminal mode. They are not loaded there (a note in the log and in
    DCB-plugin-status instead of a traceback). Missing = true, so every
    existing plugin behaves as before; the window is not affected.
    Documented in docs/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 the headless
    flag.

v1.5.6 lyrics length and appimage with python 3.12, 3.13 and 3.14

Choose a tag to compare

@yakuda-stack yakuda-stack released this 26 Sep 00:55

[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 python3 if it fits,
    otherwise an installed python3.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 a SyntaxError deep inside the UI.

Changed

  • scripts/build_appimage.sh: downloads ready-made wheels for every
    version in DCB_PYVERS (default 3.12 3.13 3.14), no matching Python
    needed on the build machine. For 3.13+ the aifc/audioop backports
    for SpeechRecognition are added explicitly.
  • README: Python badge now says 3.12+; AppImage section names the
    supported Python versions.