Patch notes
TikLive TTS changelog
Every patch we ship, with its new features, fixes and behavior changes.
v1.8.6
New backend
The biggest update so far
Under the hood, the entire server that runs inside the app was rewritten from scratch. On the outside: Kick arrives as a fourth platform, a side menu you arrange however you want, a section for an AI assistant to operate the app for you, the Music Bot redesigned with YouTube playlists, automatic announcements during the stream, a voice that holds up far better against Google service drops, and a pile of translation gaps closed so the voice always speaks in your language.
Kick, fourth platform
Until now the app read TikTok, Twitch and YouTube. Kick was ruled out: its site blocked any direct connection from the app. Now it works: the app connects straight to Kick and feeds its chat into the same flow as the other three. From the platform selector you add your Kick channel just like any other.
What comes through from Kick:
- Chat messages, with their emotes.
- TTS: the voice reads them in the same queue as everything else.
- Moderation: mute, ban and everything else in the Moderation view.
- Platform badge on every message, filters in the chat overlay, mobile control.
What does not come through from Kick: subscriptions, gifts and raids. Chat only.
Kick chat travels over a public Kick channel, with no authentication. It's a little more fragile than the other platforms: if Kick changes its site, the connection cuts out until it's patched from the app. The other platforms are unaffected. A watchdog reconnects on its own if Kick goes 5 minutes without sending a message.
More tools: the side menu, your way
The left menu was fixed: every section, always, in the same order. Now there's a new section, More tools, with a store-style view of all the app's tools (Overlays, Music Bot, Clips, Soundpad, Mobile control, Moderation, MCP Agent), each with its preview image and a description.
- Show or hide each tool in the side menu.
- Reorder the menu by dragging items, Trello-style.
- Chat and Settings stay fixed: they can't be hidden or moved.
On new installs, Clips and Mobile control start hidden so the menu is cleaner out of the box; add them from here when you need them. If you were already using them, they stay where they were. The first time you open the section there's a guided tour that explains it.
MCP Agent (advanced)
New MCP Agent section inside More tools. It lets an AI assistant (Claude Desktop, Claude Code) operate the app for you: read the chat, moderate, handle the music, check the stream status.
- It's on by default, but only accepts connections from your own PC.
- Actions that break things (ban, mute, disconnect, change settings) sit behind a second switch that starts off.
- The section carries the endpoint link, the config snippets ready to paste, and a table of everything the agent can do, grouped by area.
- It's born hidden from the side menu; you enable it from More tools when you want it.
Music Bot redesigned
The view was redesigned entirely: an iOS-style switch instead of the old chip, the request queue and the bot rules in two columns (one on narrow screens), a progress bar that moves in real time, a button to remove each track from the queue, and now you can see how many songs a playlist has.
It also supports YouTube playlist links. Before it only accepted individual tracks; now if you paste (or someone requests) a playlist URL, the bot expands it and queues every track. Chat !p commands are no longer read aloud on any platform; before they could slip into the TTS.
Automatic announcements during the stream
A new announcement plays through the TTS voice inviting your audience to download the app. It fires by stream time:
- First announcement 15 minutes after connecting the first channel.
- Next at one hour of session.
- Next at two hours.
- From then on, every 90 minutes.
The counter starts when you connect the first channel, on any platform, and stops when you disconnect them all. Adding a platform mid-stream doesn't reset the count. Disconnecting and reconnecting counts as a new session. The text is spoken in your TTS voice's language, not fixed in Spanish.
Along the same lines: the "the creator just joined" announcement is now unique per session. Before, if the admin typed on several platforms at once, it played once for each. Now it plays a single time and only resets on reconnect.
Making the voice always speak your language
Several gaps were closed where the app bypassed its own translation system:
- Emojis and emotes. They're now painted as an image in the chat and filtered out of the TTS equally across all four platforms. Before, Twitch read out the
:name: of its emotes.
- Event announcements. The text the app builds for the TTS on detecting a gift, a join, a follow, a sub, a cheer, a raid, a like or a share was hardcoded in Spanish. Now it's spoken in your voice's language.
- OBS alerts overlay. It was almost all in Spanish inside the code; now translated to the app's 10 languages.
- Likes and followers overlays. The number is now formatted according to the active language, not fixed to Spanish format.
- Main window. Around 15 loose strings that had gone untranslated (notices, clip counter, Twitch authorization, etc.).
- Server errors. The error messages you see as a popup notice are now translated too.
The 10 languages are now level, each with the same number of strings.
Voice fixes and improvements
- Real order. The queue is now sorted by the moment each message was written, not by the order it reached the app. Since chat messages pass through moderation (with variable delay) and joins and gifts don't, before a "so-and-so joined" or your own message could jump ahead of earlier messages still in moderation.
- Resume on re-enable. If you turned off the global TTS switch with pending messages and turned it back on, those messages got stuck and the voice stayed silent until the next new message. Now the pending queue resumes on re-enable.
-
TTS more resistant to Google drops. Google's free voice service cuts out when you ask for many phrases in a row (it returns empty audio). Now the app:
- Caches to disk the phrases already spoken (greetings, gift names, nicknames): they replay instantly without being requested again.
- Retries up to 2 times when the audio comes back empty.
- If Google cuts out in series, it waits a bit and carries on (5 s, 15 s, 60 s) instead of locking up; a successful request resets it.
- In practice: fewer voice silences during long streams.
YouTube no longer goes silently mute
YouTube sometimes stops sending messages without any error: an internal token expires and the app doesn't notice. Before, YouTube chat went mute forever, with no warning. Now there's a watchdog: if 4 minutes pass without a single YouTube message, it forces automatic reconnection with the same retries it already used on an error. It doesn't touch TikTok, Twitch or Kick.
Under the hood: backend rebuilt from scratch
The entire server that runs inside the app was rewritten, from a monolithic file to 17 independent areas (settings, language, moderation, channels, chat, overlays, mobile, sound, bot, clips, promos, telemetry, MCP agent, etc.).
- An area that fails to start no longer takes the others down.
- It was reviewed function by function against the old server. Along the way real bugs surfaced and got fixed: the save and moderation actions accepted requests from any origin; the Status panel in Advanced didn't show whether a TikTok channel was connected; like counters from an already-disconnected channel could trigger a phantom flicker in the overlay.
- Settings are saved atomically: they don't get corrupted if the power cuts out mid-save.
- The Music Bot downloader now closes cleanly on Windows when you quit.
- The frontend was also rebuilt on the inside (same approach as the backend); it doesn't change how it looks or how it's used.
- Every version goes through automated tests and a style review before it's built.
None of this changes how you use the app.
Anonymous usage metrics
An anonymous usage count is added (which features get used, how many sessions, retention) to a server of our own. Your name, nicknames, IDs, IP, chat text, and the value of your settings (only the name of the setting you changed) never leave your machine. No machine identifier. If it isn't configured, the app doesn't make a single request. Errors and crashes go to a separate system, also our own, and feed the "Report bug" button.
Other changes
- The sidebar banners now rotate with a smooth transition every 30 seconds, and the central banner under the chat was refreshed. The banners open the Discord invite on click.
- New community banner in the menu, with rounded corners.
- The connection status notice now shows only when you're live, not always.
- Smooth animation when switching views, in the main window, the mobile panel and the new store. It respects the "reduce motion" setting.
- The tools' preview images were optimized (from around 11 MB to half a MB total).
- From here on, interface icons are vector graphics, not emojis.
Behavior notes:
- The voice engine and the connection logic for TikTok, Twitch and YouTube don't change. A message can stop being read for the same reasons as before (muted, non-follower with the filter off, spam, language) and no new ones.
- Kick viewers without a stable identifier are moderated by name and marked with ⚠, same as already happened on the other platforms: that penalty is lost if the person changes their name.
- The self-promo voice announcement plays on its own, by stream time, with no switch to turn it off.
- Marking a clip from mobile now only saves the OBS replay. The local desktop clip marker is no longer recorded in that case; before it was saved twice.
- New installs start with Clips and Mobile control hidden from the menu.
- The MCP Agent is on by default but only listens on your own PC; destructive actions sit behind a second switch that's off.
Thanks
Thanks to @FedMasteer for their code contribution to this release.
v1.7.2
Fix
Real app shutdown
Bug: clicking the Windows title bar X didn't close the app. It minimized to tray and stayed there — server, WebSocket, TTS, and global shortcuts, all running in the background with no visible window. Easy to miss, since the only sign was the system tray icon.
Now the X shuts everything down: the server closes, any in-flight telemetry gets cut, global shortcuts are released, and the process exits, with nothing left hanging in Task Manager.
The tray icon still exists while the app is open (to reopen the window with a double-click, or quit from its menu), it just stopped being the default destination on close.
No action required on your part — the fix applies as soon as you update.
v1.7.0
Moderation
New feature: viewer moderation
Until now, there was nothing you could do from the app when someone misbehaved in your chat. The TTS read anything that passed the spam filter, no matter who sent it. Blocking a word meant leaving the Chat view, going into Advanced, and hunting for the panel by hand. And there was no notion of "who is this person": every message was anonymous to the app, with no memory from one stream to the next.
This update adds a Moderation section to the left menu and, around it, several ways to act on a specific viewer.
Viewer log
Everyone who interacts in your streams gets logged: their name, the platform, and the last time they showed up. The log is saved to disk and survives closing the app and updates.
The table has two separate tabs, Followers and Non-followers, both moderated the same way. You can search by name, filter by platform or status (muted, banned, no punishment), and sort by recent activity or alphabetically.
Each viewer has five actions available:
- Mute: their messages still show in chat, dimmed with an icon, but the TTS doesn't read them. 15 minutes, 1 hour, or indefinite.
- Ban: their messages don't show up at all. They also don't reach the OBS overlays or the mobile remote.
- ★ Mark as follower: add them by hand to the followers list.
- Clear punishments: resets them back to zero.
- ✕: removes them from the log.
Temporary punishments expire on their own, even if the app is closed when they're due to expire.
Important: this is in-app moderation. Muting or banning doesn't block anyone on TikTok, Twitch or YouTube; it only changes how the TTS and your chat window behave.
Moderate from chat, without going anywhere
Clicking anyone's name in the live chat opens the same menu: mute, mark as follower, or block a word. No need to switch views mid-stream.
"Read non-followers"
A new toggle in the Chat view. On, the default, the TTS reads everyone. Off, it only reads followers and anyone you've marked by hand; everyone else still shows up in chat, just without voice.
It's worth understanding how someone becomes a follower, because it's not obvious: the app can't ask the platform for your follower list. It only learns of a follow if it sees it happen live, while you're connected. Or if you mark it yourself. That means someone who's followed you for a year will show up under "Non-followers" until you mark them.
So: be careful turning the toggle off on day one. With a brand-new log, you'd silence almost your entire regular audience. It makes sense after several streams, once real follows have accumulated.
Block a word in seconds
The "Blocked words" button in the Chat view now opens a window with a single field. Copy the offending word from chat, paste it, hit Enter, and the server applies it instantly, no reconnecting and no leaving the view. The window doesn't close after adding one, so during a spam wave you can paste several in a row. From there, a link to Advanced lets you view and edit the full list.
Chat follows what's being read
Chat used to force-scroll to the bottom on every new message, making it impossible to read anything during a busy stream. Now it follows the message the TTS is currently reading, which is usually several messages behind the latest one. Scroll up and it stays put so you can read in peace.
Guided tutorial
The first time you open Moderation, a 9-step walkthrough starts that explains everything above as one single feature, not scattered pieces. You can replay it anytime with the "View tutorial" button inside the section.
Other changes in this pass
- Clearing the viewer log requires typing DELETE in a confirmation window, instead of the browser's gray box. It wipes marked followers, mutes, and bans, and can't be undone.
- Restyled table: sticky header on scroll, alternating rows, colored statuses.
- The log doesn't track how many messages, gifts, or likes each person sent. It only stores the last time they showed up.
- Translations: everything new is available in all 10 app languages (es/en/it/pt/fr/de/zh/ja/ko/ru).
No action required on your part. It works as soon as you update, with the non-followers toggle on so nothing changes until you decide.
Behavior notes:
- This patch doesn't touch the connection logic to TikTok, Twitch or YouTube, or the voice engine. A message can now go unread for two new reasons, muted user or non-follower with the filter off, and no others.
- YouTube has no follow events: those viewers are always marked by hand. On Twitch, named follows require being logged in with your own account; without that, no one becomes a follower automatically. On TikTok it works with no setup needed.
- If a viewer has no stable identifier on their platform, the app recognizes them by name and flags them with ⚠ in the table: that punishment is lost if the person changes their name.
v1.5.9
August 2026 · Patch
New feature: bug report system with session logging
Until now, when a streamer hit a problem, the only way to report it was writing on Discord with no technical context: no logs, no way to know what actually happened server-side. Catching and fixing bugs depended on the user being able to describe the error well.
A "Report Bug" button was added to the sidebar (between "Advanced" and the language selector) that opens a simple form.
- Discord nick and channel link (TikTok/Twitch/YouTube).
- An open box to describe what happened in your own words, no technical questions.
- Optional field to add anything else (error messages, when it happened, etc.).
On submit, the report is sent automatically to the project's Discord, attaching the full technical log of your session (from the moment you opened the app) so the problem can be diagnosed without asking you for extra steps.
Persistent logging
- Event logs are now saved to disk per session, not just in memory. They used to be lost when the app closed.
- Coverage expanded: uncaught errors from the server, from Electron's main process, and from the client (previously invisible) are now logged too.
- Automatic 14-day retention, with a size cap per session, it doesn't grow unbounded.
- The old "Logs" section inside Advanced was removed. Logging now lives integrated into the report flow, not as a separate panel to review by hand.
Security: the Discord webhook link is never exposed on the client or checked into the repo's source code. It lives in a local file outside git, and public builds inject it at compile time via GitHub Actions.
Behavior notes:
- This change doesn't touch connection logic (TikTok, Twitch, YouTube) or the TTS/chat pipeline. Both keep working the same.
- Only affects the diagnostics/report system and the Clips view (see improved copy below).
New feature: guided tutorial for new users
The "Report Bug" button already existed, but nothing else was explained: a streamer installing the app for the first time had no guidance on how to link their channel and connect. They had to guess, or ask on Discord.
Language selector first, before anything else
Previously, every new popup (welcome, donation, bug report) showed directly in Spanish, regardless of the user's language. Now, on first launch a mandatory language selector appears (10 languages), with its own text already in the language detected from the browser. Only after choosing does the rest of the notices show, correctly translated.
Interactive guided tutorial (new)
- Welcome notice: "Want us to show you how to connect?", with the option to start the tutorial or skip it.
- 6-step tutorial with an animated spotlight over the app's real buttons: Settings → Linked channels → Add channel → choose platform → enter username → Save. The last step explicitly clarifies you need to start streaming on the platform first, and only then come back and tap "Connect all", not before.
- On completion: on-screen confetti and a personal message wishing you luck with the stream, with a request for a shoutout on your channel if you'd like to help more people discover the app.
Popup reordering: the popup chain (welcome → tutorial → bug report → donation) now always ends with the donation notice last, so it doesn't compete visually with any tutorial or functional notice.
Behavior notes:
- This change doesn't touch connection logic, TTS, or the bug report system itself. It only adds the onboarding layer and reorders when each popup appears.
- The tutorial only triggers for fresh installs, without touching any of your current settings. No user action required.
Other changes in this pass
- Improved copy in "Clip Markers": now explains that the Ctrl+Shift+M shortcut marks the exact timestamp of the live moment, so you can jump straight to those minutes in the recording while editing, without rewatching the whole stream.
- "Donate" button heart is now red.
- Translations: report form, Clips copy, language selector, welcome notice, 6-step tutorial and closing message are available in all 10 app languages (es/en/it/pt/fr/de/zh/ja/ko/ru).
- Spotlight (driver.js) and confetti (canvas-confetti) libraries vendored locally in
public/vendor/, no external CDN dependency, work offline.
- Em dashes removed from all newly added text (looked off, replaced with regular punctuation).
- Fix: translatable placeholders (
data-i18n-placeholder) were never applied on language switch. Now they are.
v1.5.8
July 2026 · Patch
New option: don't read the gift amount in the TTS
A new control lets you turn off the spoken dollar-value announcement for TikTok gifts.
Until now, whenever someone sent a gift, the TTS would always also say its dollar equivalent (e.g. "User sent 5 Rose, worth $1.29"). For several streamers this was annoying or unwanted, with no way to disable it without turning off gift announcements entirely.
There's now a new "Read gift amount" checkbox, next to "Announce gifts". It's on by default, so current behavior doesn't change for anyone unless they turn it off manually.
- On (default): the TTS keeps saying the amount, same as before.
- Off: the TTS only says the user, quantity and gift name, without the amount.
Behavior notes:
- The toggle only affects what's spoken. The visual chat still always shows the ≈ $X USD badge next to the gift message, whether the toggle is on or off.
- Doesn't affect Twitch (bits) or YouTube. The change is specific to the dollar amount of TikTok gifts.
- The state is saved like the other toggles (persists between sessions, syncs with the mobile remote).
Fix: TTS forced "User says: comment" with no way to disable it
Fixes a bug reported in issue #14.
A recent change made the TTS always insert the word "says" between the username and the comment (e.g. "User says: hi"), with no way to go back to the previous format ("User: hi"). Some streamers preferred the old format and had no way to switch it.
There's now an independent "Say 'says'" toggle, next to the existing "Say username" toggle. The username is still controlled separately.
Additionally, the connector word is now localized to the active TTS voice instead of being fixed to Spanish: "says" in English, "diz" in Portuguese, "dit" in French, "sagt" in German, an honorific suffix in Japanese/Korean, and equivalents across the rest of the 12 supported voice languages.
Behavior notes:
- This fix doesn't change any other TTS or existing filter behavior.
- The new setting is 100% local (saved in the client config) and doesn't require reconfiguring already-saved channels or voices.
- Tested live against a real Japanese TikTok stream, confirming all 3 cases: connector on (default voice), connector off, and voice switched to Japanese.
New "Accessibility" section in Advanced Settings
Built for streamers with low vision, motion/photosensitivity, or who need a slower chat readout.
Added:
- Reduce motion: turns off animations (glows, bounces, scroll) across all 7 OBS overlays. Applies live without reloading the browser source.
- Text and button size: scales the whole app (main window, settings panel and chat overlay), not just chat. 4 levels (Normal to Maximum).
- High contrast: reinforces borders and secondary text in the main window and advanced settings for better readability.
- Slow TTS voice: enables a slower, more paced narrator reading.
- Color-independent platform indicator: the chat overlay now marks TikTok/Twitch/YouTube with a letter (T/W/Y) in addition to color, for colorblind users.
Behavior notes:
- All settings are saved server-side and sync live to any already-open window or overlay (WebSocket), no need to reload OBS.
- Overlays that already use
?size= or ?speed= in their OBS URL keep that manual value. The accessibility setting doesn't override it.
- The credits overlay doesn't stop scrolling with "reduce motion" (that's its whole purpose), it just scrolls slower.
- Doesn't affect the language filter, blocked-words filter, or the TTS engine. Changes are isolated to readability/motion.
Fix: Settings no longer connects anything
Fixes a UX issue introduced by the app's original design: the "Settings" screen mixed configuring with connecting, causing confusion about where to actually start the chat connection.
Previously, the Settings view had two spots that triggered a live connection: the "Main connection" panel (TikTok only, a legacy shortcut) and a "Connect all" button inside "Additional channels". This duplicated the real connection entry point and made it easy to connect by accident while only meaning to save a channel.
Now Settings is only for defining which channels to use:
- Removed the "Main connection" section.
- "Additional channels" is now called "Linked channels".
- The button to add a channel now says "Save" and only saves/links it, without triggering any connection.
- Actually connecting now happens only from the "Connect all" button in the Chat view, unchanged in behavior.
No user action required. Already-saved channels keep working the same, only where the connect button lives has changed.
Behavior notes:
- This fix doesn't touch the connection logic itself (TikTok, Twitch, YouTube) or the TTS/chat pipeline. Both keep working server-side exactly the same.
- Only affects which controls appear in the Settings view.