Limerino

Limerino Beta — TestFlight build notes

Current beta: 1.1.9 build 383 · Build date

About the beta

These are the notes for Limerino’s TestFlight beta builds — what’s new and what got fixed before it reaches everyone in a public App Store release. When a version ships to the store, its final notes appear on the Releases page.

Builds are grouped by version: 1.1.9, the current beta · 1.1.8 · 1.1.6 · 1.1.5 · 1.1.4 · 1.1.3 · 1.1.2 · 1.1.1 · 1.1.0 · 1.0.9 · 1.0.8. A shipped version’s group opens with a link to its final App Store notes.

1.1.9 StreamElements bot controls, sharper emotes, full screen video, a stream from another channel and multi-view on iPad Builds 373 to 382

Build 383 —

Earnable now says when its empty list rests on a failed refresh.

Earnable now: when a refresh fails while badges are listed, the list stays under the usual banner. If the last listed badge then ends before another refresh lands, the screen shows its empty state with a warning line naming the cause, You’re offline or Couldn’t refresh, and a Try again button, instead of an empty state that read as a fresh answer.

VoiceOver: when the list empties by itself the announcement includes that cause, and a refresh whose answer removes every listed badge is announced as the empty state arriving.

Badge alerts, server side: Ends soon reminders for a badge whose end only Twitch’s text gives now wait on the stored drop campaigns, and a Discord post the server has to send again is rebuilt from the badge’s current state.

Build 382 —

Emote suggestions while watching in portrait, and a clearer permissions update for the AutoMod queue.

Watching in portrait: the emote suggestion row shows while you type. When the keyboard leaves too little room under the picture, the picture steps down to a smaller size for as long as the keyboard is up and returns to full width when it closes. It moves once per keyboard show or hide, never mid-sentence, and never so far that playback would pause.

Twitch permissions: the screen you reach from Update permissions is now titled Twitch permissions, names the account that must approve the code, and no longer reads like a fresh sign-in. If Twitch approves the code as a different account, the message names both accounts and says what to do.

AutoMod queue and moderator log: both recover more reliably when Twitch revokes a subscription or a permissions update lands mid-connection.

Build 381 —

Follow, unfollow and the watch bonus, with no ad request.

User cards and Channel Points: Follow, unfollow and Claim bonus run on Twitch’s own page inside Limerino. As it loads, that page used to contact an advertising service, the way it does in a browser; Limerino now refuses that one request before it leaves the device. Twitch’s own scripts run as before.

Nothing changes on screen: the three acts look and behave as they did in build 379.

Build 380 —

Twitch badge drops on Earnable now.

Earnable now: a badge whose Twitch drop is running carries an Available now mark, says what to do to earn it, and counts down to the end.

Upcoming: when Twitch lists a drop before it starts, an Upcoming section shows it with its start time.

Badge details: a Twitch drop card shows the campaign, what to do, when it starts and ends, and whether it is available now.

Badge alerts: a new Ends soon reminder tells you once when a badge you don’t have is about to stop being earnable. It follows the same two switches, Watch and clip badges and Sub and Bits badges.

The drop details come from Limerino’s server, which is switched on separately from this build. Until then, Earnable now looks the same as in build 379.

Build 379 —

Follow, unfollow and the watch bonus, back and native.

User cards: tap Follow, or tap Following and confirm to unfollow. The heart changes once Twitch answers. /follow and /unfollow in the composer work too.

Channel Points: when Twitch offers a watch bonus, a Claim bonus button sits beside your balance. One tap claims it; nothing is ever claimed for you.

Settings: two switches, both on: Behavior › User cards › Follow and unfollow, and Channel Points › Claim watch bonuses. Both sit under Web features.

Build 378 —

Nothing you can see.

This build carries internal preparation only. Everything on screen is the same as in build 377.

Build 377 —

The video list at large text sizes, and a steadier Hyper Red.

Video list: at the largest accessibility text sizes a channel’s video list now lays every row out in full. Rows no longer draw shorter than their cell, titles wrap whole instead of stopping at three lines, and the “no videos” and error text reads clearly in the light theme.

Emote effects: a FrankerFaceZ emote wearing Hyper Red together with Rainbow now turns smoothly from FrankerFaceZ’s orange through the colour wheel instead of flashing white through green, cyan and magenta on every turn. Hyper Red, Cursed and Rainbow on their own look the same as before.

Build 376 —

Four fixes from your reports.

Video: turning the phone sideways while a past broadcast from the channel’s video list is playing now keeps the video on screen with chat beside it, and turning back keeps it too. The Create clip sheet survives a rotation the same way, and the video list follows your text size.

Chat: a message typed on a connection that had quietly dropped now makes the app reconnect right away and send it once chat is back, instead of leaving it stuck.

Emote effects: FrankerFaceZ effects now move and colour the way FrankerFaceZ draws them. Rainbow turns the emote’s own colours through the wheel; Hyper Red and Cursed use FrankerFaceZ’s thresholds; Shake, Jam, Bounce, Spin, Arrive and Leave have its speed and shape; one motion runs on an emote at a time, with Rainbow and Slide alongside; a flipped emote’s motion flips with it.

Message box: on smaller iPhones with the video docked in portrait, the emote suggestions stay visible while the keyboard is open instead of leaving an empty band above the message box.

Badges: the badge you picked to wear is listed first, then every badge you hold.

Build 375 —

A stability pass across the whole app. More than sixty fixes from a full audit of Limerino, plus a set of fixes contributed by JoTurk. Nothing new to learn; things that used to go wrong quietly now behave.

Chat and message box: a reply you armed survives opening a clip or past broadcast from chat; a whisper to your own account is refused with a clear line; long whisper conversations keep marking new messages read; a saved message clears when a moderator deletes it; Mentions search accepts pasted names and long emoji runs; the slow-mode countdown counts down in every language; a broken /poll line opens the poll sheet and keeps your text.

Video and widgets: the player pane appears once when a stream starts and leaves once when it ends; the stream pauses while a page or an in-app Safari view covers it; replay chat reloads once per jump and recovers after a failed open; a quality you picked survives a pause; the Channel Status widget no longer stays OFFLINE for hours on a live channel.

Account, sign-in and 7TV: Delete Mention Vault data finishes even if you leave the screen; an unsent message survives signing out and back in; quiet times keep their time on daylight-saving days; dismissing the re-authorize sheet keeps you signed in; emotes added while you watch arrive crisp; emotes from a lapsed subscription drop out without a relaunch; Connect 7TV completes even if you close the sheet early; 7TV search keeps paging on iPad.

Also: banned-phrase groups survive a spam-filter switch, a moderator’s poll start or end reports the real result, the bug-report counter now counts the way the server does so a long emoji-heavy report is stopped in the app instead of failing on send, and Spotlight results follow the app language.

Build 374 —

New: Limerino in eight more languages. German, Spanish, French, Italian, Japanese, Portuguese (Brazil), Russian and Chinese (Traditional). Limerino follows your iPhone’s language, or the one you pick for it alone under Settings › Apps › Limerino › Language. Chat, Settings, alerts, menus, the widgets, the share sheet and the App Shortcuts phrases all follow it.

These translations are machine drafts that fluent reviewers are still checking, so some wording may read oddly or not fit its space. English stays the reference.

Please check: switch Limerino to one of the eight languages and walk through chat on a busy channel, Settings and a Settings search, a user card, a Predictions or Channel Points sheet and the message box. If a word is wrong, unclear or cut off, send a screenshot through Settings › Report a bug and say which language you use. German and French at the largest text sizes; Japanese and Chinese (Traditional) line breaks; Russian counts for 1, 2 to 4, and 5 and more.

Build 373 —

New: StreamElements bot controls. Link your StreamElements account under Profile › Connections. In your own channel, and in channels where StreamElements makes you a Bot Supervisor, Editor or Full Control, a bot button at the top of chat (or under ⋯) opens a page for the bot: mute or invite it, and change its timers, commands, spam filters, modules, Regulars, counters and quotes. Swipe back to return to chat. The Show bot controls in chat switch hides the button, and the privacy policy has a new section on StreamElements account linking.

New: sharper emotes. On high-resolution screens, emotes in chat, cheers and the emote picker load sharper art at exactly the same size.

New: more FFZ effects. ffzSlide, ffzArrive and ffzLeave now move, and No space pulls an emote up against the one before it. Reduce Motion or emote animation switched off keeps them still, and Show FFZ emote effects turns them off.

New: full screen video on iPhone. Turn your phone sideways while a stream plays in Limerino’s player and tap Full Screen, next to Close. The buttons fade with the player’s own controls, and Exit Full Screen, or Escape on a keyboard, returns to chat. With Chat over video, chat now runs the full height of the screen.

Changed: the player in portrait. The stream’s title sits under the video, with its category, viewers and uptime below it. A closed video becomes a floating glass card with a subtle LIVE pill, and chat scrolls behind it.

New: watch one channel while chatting in another. In the channel list, press and hold a live channel you have open and choose Watch stream here. The video switches to that channel, “Video from #name” shows under the player, and your chat stays where it is. Favorites › Save this pair keeps the combination for one tap later.

New: multi-view on iPad and iPhone Duo. In a wide window, Add to multi-view in the channel list puts up to four open live channels in a grid beside one or two chats. One plays live and the others show live stills; tap a still, or drag it onto the live tile, to watch it. Done returns to the usual layout.

Changed: the message box. The “Send a message” hint keeps its size after you add and delete an emote, name suggestions hold still while people talk, and an exact emote name or a colon and a name, like :kekw, puts that emote first. A letter typed right after an emote gets a space so the emote still shows, and VoiceOver reads your message plainly.

Fixed: a message sent right after coming back to the app. Chat takes a second or two to reconnect when you return from another app, and a message sent in that moment was turned away with “Not connected to chat yet”. It now waits for chat to reconnect and then sends.

Also: busy chats take less work to read, filter and list, and a long blocked list loads faster; animated GIF and APNG uploads go out without location, camera or text details, the same as photos.

Please check: linking StreamElements from your profile and a test timer or command on your own channel; emotes in a busy channel with the picker open; full screen with rotation lock on and off; Watch stream here while you switch chats; multi-view on an iPad; sending a message right after you come back to the app; and, on a real phone, a keyboard-up screenshot of the message box.

1.1.8 Predictions, Channel Points, Picture in Picture, and clips Builds 366 to 372, shipped

Final 1.1.8 release notes

Build 372 —

Fixed: Mention push alerts Off means off. With the switch off, Limerino no longer posts its own mention banners after you leave the app or during Picture in Picture. Mentions still land in Mentions and the Vault. Live, whisper and badge alerts keep their own switches under Activity alerts, and the switch now says so.

Fixed: notifications you already read no longer pile up. Reading a mention or a reply in chat clears its notification from Notification Center and tells us within seconds, the icon badge follows, and a mention you have read is marked read the next time you open the app. A “missed messages” alert now counts only the mentions you have not read, and none arrives when you have read them all; periodic summaries work the same way.

Fixed: a mention from a channel you have never opened. Tapping it now shows the message that mentioned you, highlighted, with a note if that channel’s earlier chat is not available and new messages arriving below.

Fixed: the timeout notice after a moderator frees you. When a timeout or ban is lifted early, the notice above chat and above the message box goes away when you tap the message box, come back to the channel or the app, or send a message that goes through. While a timeout is still in force, the notice stays until it ends.

New: Suggest your own name. Settings › Typing › Suggest your own name, off by default, lists your own name after the other people in chat once you type @ and the start of it.

Please check: Mention push alerts off while someone mentions you; reading mentions in chat and then going Home; a mention from a channel you have never opened with Ludicrous mode on; a timeout a moderator lifts early; and the new switch under Typing.

Build 371 —

New: your balance and Predictions at the top of chat. Your Channel Points balance in the open channel now sits at the top of chat; tap it for Channel Points. It shows a dash until Twitch answers, and the exact number below 100,000. Beside it, a Predictions button: moderators always see it, and viewers see it while a prediction runs. Chat rules moved out of ⋯: open them from the rules card before your first message, or from Chat rules on a warning, timeout or ban.

New: pronouns. Settings › Names & text › Pronouns has two switches, both off. Turn them on to see the pronouns people have set at pr.alejo.io, after their name in chat and under it on their card. With both off, nothing is looked up.

New: FrankerFaceZ emote effects. ffzX, ffzY, ffzW and ffzCursed after an emote now flip it, turn it upside down, widen it or make it black and white, and supporters’ effects such as ffzRainbow, ffzJam and ffzSpin animate. Tap the emote to see which effect it carries. Settings › Emote sources › Show FFZ emote effects turns them off.

New: chat backgrounds. Settings › Appearance › Chat background puts your own photo behind chat, for every channel or just one. Drag and pinch to frame it for portrait and landscape, and set its opacity, blur and saturation. A bright photo stays subtle so chat stays readable, and Reduce Transparency, Increase Contrast and Invert Colors hide it. Your photo stays on this device.

New: clips. While a channel is live, ⋯ › Create clip clips the moment and follows it until Twitch finishes it, then lets you watch, copy or share it. /clip now takes a title. Your clips, in your profile, lists the clips you made in Limerino on this device. Settings › Video › Create clips turns all of it off.

Changed: clips play in Limerino’s player. Clips from chat, a channel’s Clips list or Your clips start faster, with play, a slider, mute and a quality choice; if one can’t play there, Twitch’s player takes over. Past broadcasts still play in Twitch’s player in this build. The Videos and Clips browser shows placeholder rows while it loads, refreshes when you pull down, and adds a Show filter, Featured only and video lengths.

Also fixed: tapping a category in the emote picker lands on that category, without freezing or drifting; changing many settings at once, like an import or Reset all, saves once instead of stalling; Settings › Contact › mize’s channel opens the channel in Limerino; Copy whisper keeps the text on this device and clears it after 15 minutes; turning Web features back on refreshes a ban, timeout or pinned message; and starting a poll closes the New poll form once Twitch confirms it.

Please check: the balance at the top of erobb221 matching Channel Points; pronouns with both switches on; an emote with ffzX or ffzW; a bright and a dark chat background in light and dark themes; a clip from chat playing in Limerino’s player; far categories in the emote picker; and, on a real phone, a keyboard-up screenshot over a chat background.

Build 370 —

Changed: actions stay inside Limerino. Nothing sends you to Twitch to finish an action, except Report on Twitch. Following, unfollowing and claiming the watch bonus are gone, because Twitch doesn’t let apps do them, so a chatter’s card offers Whisper, Videos and Copy.

New: predictions in any channel. Tap the prediction at the top of chat, pick an outcome and an amount, and Predict; the row shows your pick, then the result. Your first one asks you to accept Twitch’s terms: Accept terms bets nothing, and your next Predict places it. Moderators, and Affiliates and Partners on their own channel, start, lock, resolve and cancel them from ⋯ › Predictions.

New: polls, pins and Hype Trains. Vote from the poll at the top of chat, or type /poll. Where the channel allows it, Add a vote spends Channel Points on an extra vote and shows the cost first. Moderators can start and end polls. Pinned messages show for every viewer, and Hype Trains show their progress once you turn them on.

New: Channel Points. ⋯ › Channel Points shows your balance and rewards to redeem, plus sub emote unlocks where the channel offers them: Twitch’s answer appears right under the emote, and the emote joins your picker in that channel. When Twitch offers you a resub to share, Share in chat posts it. Redemptions in chat name the reward.

New: why chat stops you. The line above the message box says what a channel needs before you can chat, like “Verified phone only” or “Verified users only”. ⋯ › Chat rules shows a channel’s rules. If a moderator warned, timed out or banned you, a row at the top of chat gives the reason. A warning also shows above the message box as soon as Limerino opens, and Acknowledge lets you keep chatting.

New: badges, moderation history and whispers. Settings › Badges › Twitch badge chooses the badge you wear, everywhere or in one channel. Moderators get Moderation history on a chatter’s card: past actions, messages and moderator comments, where you can add a comment or delete your own. Opening Whispers brings in your 20 most recent conversations from Twitch.

New: a switch for each feature. Ten switches, all on except Hype Train. Settings › Banners & chat modes has Show pinned message; Polls, Predictions and Hype Train under Live events; Chat rules; and Show when you’re warned or timed out. Settings › Channel Points has Channel Points, which covers emote unlocks too, and Show reward names. Settings › Behavior has Load earlier whispers and Moderation history. Long press a poll, prediction or Hype Train row to turn it off; Limerino asks first.

New: GIF size and Choose permissions. Settings › Emote & badge display › GIF size makes GIFs Small, Medium or Large. Choose permissions, in Settings › Account › Advanced, lets you turn off Twitch permissions before you approve; reading chat stays on, and features that need what you turned off say so.

Also fixed: every tab loads its message history, even if you switch tabs while the first is loading; a signed-in launch opens signed in from the start; a chatter’s Recent messages fill right after launch; and settings apply at launch without a lag.

Please check: a cold launch, and one after a restart; switching tabs while the first loads; Hype Train off under Live events; a small prediction in erobb221, with the terms step if you’ve never predicted; a poll vote; a cheap reward and, only with points to spare, an emote unlock; choosing your Twitch badge; Whispers; a card where you don’t moderate showing no follow date; on iPad, signing out in one window closing a card in the other; and, on a real phone, keyboard-up screenshots of the line above the message box.

Build 369 —

Changed: your settings and chat history belong to your Twitch account. Everything you set up in Limerino now belongs to the account you set it up with. Signing out keeps it on this device, signing back in brings it back, and another account signing in never sees it: settings, open channels, chat logs, whispers, the Inbox, drafts, your 7TV connection and image-upload headers.

Changed: signing out deletes nothing. Not your settings, and not your alert channels or alert keywords on the server. The one way to erase what an account kept on this device is Settings › Accounts, swipe, Remove; it now says exactly what it deletes and asks first.

Changed: a clearer wait while your sign-in is checked. When Limerino is still checking a stored sign-in, for example after an offline launch, Settings, Profile and Account say “Checking your Twitch sign-in” instead of showing you as signed out, with a Check again button.

Also changed: extra image-upload headers are saved per Twitch account, and the editor says when there is no account to save them for; an import or reset in Backup & restore that lands after the signed-in account changed is refused before anything is written; this device’s alert registration is released even after you sign out, and an alert meant for another account on this device is never shown. The privacy policy says all of this.

Please check: changing a few settings and opening channels, signing out (defaults, no open channels), then signing back in (everything back); with a second Twitch account, that it sees none of the first account’s settings, channels, chat logs, whispers or Inbox; Settings › Accounts, swipe, Cancel, then Remove; an offline launch showing “Checking your Twitch sign-in” and resolving once you are back online; your alert channels and keywords surviving a sign-out; the Extra headers editor signed out; and, with VoiceOver, hearing “Session verified” when the check completes.

Build 368 —

Fixed: problems you reported. Chat fits the screen again after you rotate the phone and back on a channel without video. Closing the video no longer cancels an image upload. A 7TV paint or badge goes away when the subscription behind it ends. Emote autocomplete no longer leaves the typed letters behind with predictive text on.

New: two video choices. In Settings › Video, turning “Live video player” off now turns live video off everywhere, so every channel opens as a chat room. “Start with video closed” (off by default) opens live channels on the Watch live bar instead of the player; tap the bar when you want the stream.

Changed: a thorough pass on the message box. The keyboard, your draft, a reply you started and a locked message stay put when you open or close the video. A message Twitch would refuse, such as one sent too soon in slow mode, is caught before the box clears, keeps your text and counts down the wait. Image uploads show a Cancel button and land in the channel you picked them in, whispers keep your draft and say when one did not go out, and the emote menu got fixes too.

New: badge alerts and Earnable now. Settings › Activity alerts has separate switches for new watch and clip badges and new sub and Bits badges, and the Badge now showing alert says when it is a badge you earned. Earnable now lists the Twitch badges you can still get and how.

New: supporter badges from more services. Settings › Emote & badge display › Badges from other services has three more switches, all on by default. One of them shows custom badges, which are pictures their holders upload.

Also fixed: a chat that could stay empty when you switched tabs right after launch; a Mac crash when a sheet opened over chat; and the theater restoring a live pane while the app was in the background. This build also carries the iPhone Duo layouts; nothing changes on other phones.

Please check: rotating on a channel with no live video; closing the video while a photo uploads; picking an emote suggestion with predictive text on; both video choices; opening and closing the video with a message half typed, a reply started or a message locked; sending twice quickly in slow mode; sending a message, a reply, /me and a whisper; switching tabs right after opening a channel; the new badge switches surviving a relaunch; and, on iPad and Mac, opening and closing sheets over chat.

Build 367 —

Changed: the second half of the code clean-up. The parts of the app that send messages, open sheets and alerts, draw chat rows, handle signing out, save mention alert settings, load emotes and replay chat in the theater were reorganised inside. Nothing should look or behave differently from build 366, so anything that does is worth a report, however small.

Fixed: the + button no longer shrinks and grows. With image uploads off at the largest text sizes, locking or unlocking a message used to make the + button visibly resize.

Please check: a cold launch and a relaunch from the background; opening Settings, the inbox, the channel switcher, your profile and a chatter’s card, one from inside another; signing out and back in; changing timestamps, text size and GIF animation while chat is moving; sending, replying, slash commands and retrying a failed message; chat replay in the theater on a past broadcast and a clip; mention alert settings surviving a relaunch; and, on iPad, a reply thread or moderator tool beside chat while you resize the window.

Build 366 —

Fixed: Emotes are back under the + button. With image uploads turned off, the + button in the message box opens the emote picker in one tap. With uploads turned on, it opens a menu with Emotes and Photo. The extra smiley on the right side of the message box is gone.

Fixed: the emote menu. The All control above your recent emotes no longer has a large purple background, searching is quicker, and animated emotes are not reloaded as you scroll.

Changed: a large clean-up of the app’s code. The files were reorganised and about 160,000 lines of old developer notes were removed. Nothing else should look or behave differently from build 362, so anything that does is worth a report, however small: a screen that opens differently, a setting that does not stick, a crash, or a layout that shifted.

Privacy policy. The policy now covers Limerino’s public badge list: the Twitch user-ID of everyone showing a Limerino badge, with the badges they show, so other chat apps can draw them. To stay out of it, choose None in Badges.

Please check: a cold launch and a relaunch from the background; signing out and back in; inserting emotes from + at the caret; sending, replying and slash commands; watching a stream in portrait and landscape and in the theater; the keyboard sitting on the message box; Settings changes surviving a relaunch; mention alerts, the inbox and whispers; and, on iPad, Split View and a second window.

1.1.6 iPad, Limerino badges, and a cleaner Profile and Settings Builds 360 to 362, shipped

Final 1.1.6 release notes

Build 362 —

New look: Profile and Settings. Both are now short lists of plain rows. Profile groups what you use into In chat, Connections, Channels, Your channel and Account, and Chat color has its own screen. Each Settings group opens its own screen, and the long explanations under switches are gone.

New: one Badges screen. It replaces Your badges and Limerino badges: your name with its badges as chat draws them, the Limerino badge chooser, your Twitch badges, and your 7TV badge, which you can now pick in the app when 7TV is connected. Open it from Profile, from Settings under Account, or from your own profile card.

Changed: compact chat rows are the default. If you never changed how chat rows look, chat switches to compact rows once after this update. Compact rows in Settings under Chat display turns them back off.

Changed: cards in chat. Tapping a badge in chat shows a plain list of that person’s badges, with each badge’s details one tap further. The profile card leads with Whisper, Videos and Copy username, and Report and Block moved to the bottom.

New: emotes in one tap. A button in the message field opens the emote picker, and your draft stays in view while you pick.

Fixed: the 7TV paint picker no longer leaves a gap under the top bar while scrolling; followed channels should load straight away after the app was in the background; and your settings now survive a lost or unreadable settings store, restored from a backup kept on your device.

Build 361 —

New: link Discord from Settings. The Discord row at the top of Settings says Link Discord until your account is linked, then shows your Discord name. It opens a Discord screen with the same controls as your profile, and if the server’s channels didn’t open after you linked, the screen says so and offers the fix.

New: Limerino badges. A new screen on your Profile lists every Limerino badge, the ones you have collected and the ones you haven’t, with how to get each one. If you hold a badge, you can choose which one shows beside your name in chat, or none. Tap the badges beside anyone’s name in chat to see what each badge is.

New: Lantern, a Halloween color palette. Pick it in Settings under Appearance: a plum night with candle-cream text and pumpkin highlights, in light, dark and true black.

New: saved themes. In Settings under Appearance, save your current look under a name, then apply it in one tap, rename it, update it or delete it, with undo.

Also: a jack-o’-lantern app icon for October; searching Settings for link discord or unlink finds the Discord row; and linking in the app now also lets you use /bug and /suggest in the Limerino Discord.

Build 360 —

New: BetterTTV Pro badges. Chat and Your badges now show BetterTTV Pro badges, yours included, while BetterTTV badges are on in Settings. To get them, Limerino tells BetterTTV your Twitch user ID and each channel you open while you are signed in; the switch’s note in Settings and the privacy policy say so.

Fixed: phrase alerts from channels you don’t follow. One-word highlight alerts that reach a closed Limerino now come only from your own channel and the followed channels that have mention alerts on, even with Ludicrous mode on. Ludicrous mode still covers mentions of your name everywhere.

Fixed: Discard and Retry on a message that didn’t send. When Twitch refuses a message, the reason now shows once, on the message itself, so Discard clears it completely and Retry no longer adds extra lines.

Fixed: follower emotes for subscribers. If you subscribe to a channel, its follower emotes now work for you in every channel: in the emote picker, in autocomplete, and in your own messages.

New: mute from a phrase alert. Press and hold a phrase alert notification to mute the person who said it.

Also fixed: a mention you read in one Shared Chat room no longer lights up again in the other; Limerino badges show for chatters in VOD and clip replay, and your badge goes away sooner after you unlink Discord; and the reply bar sits clear of a not-sent message card.

1.1.5 Limerino on iPad Builds 357 to 359

Build 359 —

Fixed: Limerino opens again on iOS 18 through 26. Builds 357 and 358 closed right after launch on iPhones and iPads running iOS 18 through 26. This build opens normally there again.

New: Limerino chat badges. Limerino now has chat badges of its own. They show right after Twitch badges and before 7TV, BTTV and FFZ badges.

New: highlight words that reach you when Limerino is closed. A highlight rule that is a single word, with System notification on, now sends a push when someone says that word in your own channel or a channel you follow, as long as Mention push alerts is on. The rule editor says which rules reach a closed app. You can alert on up to 10 words across your devices, each device keeping its own; very common words are refused, and a word that matches too often pauses itself for a day.

New: live alerts channel by channel. Live and offline alerts now start off for every channel. Touch and hold a channel in the channel list and choose Turn on live alerts, or turn on All channels in Settings, Activity alerts, Live alert channels. During quiet hours they arrive silently.

Better: mention alerts from smaller channels. Mentions now reach you from the smaller channels you follow, not only from big ones.

Fixed: 7TV paints. Image paints keep their real colours, with only the dark parts that would vanish brightened, and they stretch across the whole name. Paints that are only a glow or an outline now appear. Turn off Readable name colors in Settings to see 7TV name colors exactly as 7TV shows them.

Fixed: suggestions after /me. Emote and name suggestions now appear while you type after /me and other commands.

Fixed: a single gifted sub. It now shows as one line naming who received it, instead of reading like two gifts.

Changed: chat sits closer to the edges. In portrait, chat text now has less margin on each side.

Also fixed: messages Twitch refuses now show as not sent, with Discard and Retry; /timeout accepts forms like 1d12h; a message of yours removed by a moderator shows as deleted; replay chat on VODs and clips shows the channel’s emotes and badges; whispers no longer set off a second alert; muting from a notification sticks, and switching a muted channel back on brings its alerts back; and signing out clears the app’s notifications and unsent messages.

Build 358 —

Fixed: alerts from a window you just left. On iPad with two windows open, when you moved one window to the background, a highlight in the channel it was showing could arrive without an alert for a couple of seconds. It now alerts you right away.

Build 357 —

New: Limerino on iPad. Limerino is a native iPad app now. In a wide window the channel list sits beside the conversation, with search and the channels that are live marked; Control-Command-S shows or hides it. Two split channels sit side by side in a wide window and one above the other in a tall one, and Split View and Stage Manager work down to the smallest window.

New: sheets sized for iPad. A chatter’s card opens beside the name you tapped. Settings, a channel’s logs and the inbox show a list beside its detail, with Mentions, Highlights and Whispers side by side, 7TV emotes are a grid, and the share card fits what you are sharing.

New: several windows. Touch and hold a channel in the channel list and choose Open in New Window. Each window keeps its own channel, video and chat, and a mention alert or Handoff opens in the window showing that channel. This is the second window that build 356 turned off, back now that each window keeps its own channel.

New: keyboard and pointer. The menu bar has Settings…, Switch Channel… (Command-K) and Show or Hide Channel List. Tab and the arrow keys move through the suggestions above the message box, Return picks one and Escape closes them, and Settings has an optional Return sends messages, with Shift-Return for a new line. A pointer highlights what it is over, and a right-click on a message opens the same actions as a long press. The Favorite Channel widget and a stream’s Live Activity work on iPad too.

Fixed: the newest message stays in view under the “Checking…” card. When that card appears at the top of chat, the newest message now stays above the message box. Before, it could slide under the box until you scrolled.

On iPhone, nothing else changes. If anything on your iPhone looks or behaves differently from build 356, tell us which screen.

1.1.4 Steadier layout, the delay reading, and Live Activities Builds 355 to 356, shipped

Final 1.1.4 release notes

Build 356 —

Steadier layout when the screen changes size. The layout now follows a screen or window that changes size while you watch, and the video is never left locked to an orientation the screen cannot show. On iPhone, nothing should look different.

New: the Live Activities switch says when iOS has them off. If the Live Activities switch in Limerino’s Settings is on but Live Activities are turned off for Limerino in iOS Settings, a note under the switch now says so and offers Open iOS Settings.

Changed: a second window. Opening Limerino in a second window is off for now. It comes back in a later update, once each window keeps its own channel.

Build 355 —

Fixed: the delay reading in landscape. With chat beside the video, the stats on the landscape top bar showed the uptime but left out how far behind live you are, even when the bar had empty space. The bar now gives up the word “Portrait” on its exit button before it gives up the delay reading, so the reading stays on screen on most iPhones. The button keeps its icon and still takes you back to portrait, and the word returns whenever there is room for both.

1.1.3 Native video, a new app icon, and Siri Builds 330 to 354, shipped

Final 1.1.3 release notes

Build 354 —

Fixed: badges sit level with the name. A subscriber, moderator or 7TV badge beside a chatter’s name drew a little high compared with the browser and other clients. Badges, and the Shared Chat avatar that leads them, now sit centred on the name at every badge size.

Fixed: adding a custom command. The Add shortcut button in Settings stayed grey until both fields were filled in, and nothing said so. The form now says what it needs, each field shows an example, and the message you type is saved exactly as typed instead of being capitalised by the keyboard.

Build 353 —

Fixed: a stray line beside landscape video. With chat hidden in landscape, a thin light line could sit near the right edge of the video, most visible on smaller iPhones. The divider now goes away with the chat column and comes back with it.

Fixed: moderator warnings that looked like sent messages. If a moderator warned you, your next message was refused but still looked sent. It now shows “Not sent” right away, and chat explains that the warning has to be acknowledged on Twitch before you can chat in that channel again. VoiceOver speaks the warning.

Build 352 —

Fixed: closing immediately on launch. This build addresses the recurring startup crash that affected some phones before the first screen appeared. Update over your existing TestFlight installation to keep your saved channels, settings and sign-in.

Build 351 —

Fixed: a retry starts fresh. Retrying a failed message after a timeout or chat clear no longer carries the earlier crossed-out appearance into a successful send. A new moderation action still applies to the retried message.

Fixed: repeated timeout notices count once. Receiving the same timeout notification again no longer adds another action to the count or creates a second notice after busy chat has moved the original line away.

Fixed: video panels at larger text sizes. Poster titles and actions have enough room to remain readable. The viewer count has a larger VoiceOver target while keeping its compact appearance.

Fixed: follow history uses the available Twitch answer. Your own follow history, and broadcaster or moderator lookups that Twitch permits, can appear on user cards again. Unavailable follow information is left out instead of being described as not following. Subscription history still comes from ivr.fi.

Build 350 —

Fixed: the Portrait button in landscape. The button under the video that returns you to portrait answered nothing on a shipped build, and a purple block was painted behind it. It answers a tap again, and nothing is painted behind it.

Fixed: a timed-out message keeps its line. A message greyed by a timeout could lose its strike and its “Timed out for 10m” line when older chat loaded in behind it, and the line could appear a beat or two after the greying. Both stay, and the line now paints in the same instant as the strike.

Fixed: no blank band after an emote message. Accepting an emote suggestion, sending, or cancelling a message left an empty band between chat and the message box for a second or so — the bounce some of you reported. Chat sits on the message box the moment the message goes.

Fixed: taps under Increase Contrast, and on iOS 18. Several glass controls ignored a tap in those settings: the landscape chat toggle, the video poster, the theater-mode menu, the name on a reply or whisper header, the resend chip on a failed message, and the emote-suggestion chips. Each answers again; the press feedback is unchanged.

Fixed: a revealed message stays put. Tapping a mention or a reply scrolls to that message; if the screen then changed size — the reply pane opening, the keyboard coming or going, a rotation — the list jumped back to where you had been. The revealed message now stays in view.

Build 349 —

New: lead moderators are recognized. If Twitch made you a lead moderator, Limerino keeps every moderator power you had, and the /mod, /unmod, /vip, /unvip, /mods and /vips commands answer honestly instead of telling you that you must be the broadcaster. The broadcaster gets Add and Remove moderator and Add and Remove VIP on a chatter’s profile card. A lead moderator sees those rows with an Open Twitch handoff, because Twitch keeps that one step for its own site and app.

New: your own commands lead the “/” list. Type “/” in the message box and the shortcuts you saved in Settings come first, in alphabetical order, each marked with a small command symbol, ahead of Twitch’s own commands.

New: a timeout or ban is stated in chat. When a moderator times someone out or bans them, a plain line appears at the bottom of chat — “name has been timed out for 10m.” — and scrolls away with the conversation. Repeats collapse into one line with a count. It shows even with “Hide deleted messages” on, which used to leave a timeout stated nowhere at all.

Fixed: player controls on slower phones. On an iPhone 12 mini and similar, the video controls appeared but taps on them often did nothing. A thumb that lands a little wide of a button now still counts, a tap while the controls are still appearing no longer dismisses them, the auto-hide timer starts only once they are on screen, a refused Play, Pause or Mute now buzzes and says why, and the landscape edge tap that brings the controls back works again.

Fixed: chat sits flush on the message box again. Once the emote suggestions had appeared, the chat stayed lifted by the height of the suggestion bar until the keyboard went down, whether you backspaced the emote away, tapped a suggestion or sent the message. It now drops back the moment the suggestions go.

Fixed: gift, sub and watch-streak notices show their whole message. Longer notices were cut off after two lines. They now wrap to their full length, and VoiceOver reads them.

Fixed: the reply pane no longer hides the message you tapped. Tapping a mention scrolls to it and then, when the reply pane opens over it, keeps it in view.

Fixed: flicker with the reply bar open. Scrolled up in a busy chat with the reply bar open, the messages you were reading could flicker or step as new ones arrived. That path no longer redoes work on every frame, so the view holds still.

Fixed: a dead Send button. A message that could not be sent no longer leaves a lit Send button that does nothing.

Fixed: mentions you have already seen. A mention, thread reply or highlight that lands in the chat you are looking at is recorded as read, so the inbox badge counts only what arrived while you were somewhere else.

Build 348 —

New: Siri, Spotlight, Shortcuts, widgets and controls. Say “Open erobb221 in Limerino”, “Watch erobb221 in Limerino” or “Show my live Twitch favorites in Limerino”; channels you have opened appear in Spotlight, and the Shortcuts app lists every action. A Favorite Channel widget shows whether one channel is live, Control Center gets Resume watching and Open favorites, and Handoff carries the channel you are viewing to twitch.tv on a Mac. One switch — Settings › Device › Siri & Search, on by default — controls what Limerino offers Siri, Spotlight and Shortcuts, and turning it off takes back what it had already put there; your widget, the Control Center tiles and Handoff keep working, and signing out clears them. The first Limerino phrase you say asks whether to turn the app’s shortcuts on; accept it, or Siri answers from general knowledge instead of the app.

New: 7TV personal emotes, rendered natively. A chatter’s own personal emotes show in their messages wherever chat is drawn — live chat, replies, the mentions feed, highlights, history and VOD replay — and in nobody else’s. Your own usable ones get a Personal section in the emote picker, in search and in autocomplete. Settings › Emote sources › Show personal emotes, on by default; turning it off applies at once.

New: put your channels in the order you want. In the channel switcher, touch and hold the three short lines at the start of a row, then drag it up or down. Open channels and Favorites each keep their own order, and it sticks after a relaunch. Hold a row near the top or bottom edge and the list scrolls for you, so a long list is easy to rearrange in one go.

No-drag option. Every row’s long-press menu has a Move option — up, down, to top, to bottom — and with VoiceOver the same four moves are on the Actions rotor. Tapping, swiping, favoriting, splitting and closing channels work exactly as before, and dragging never switches, closes or unfavorites a channel.

While you are searching, Open channels cannot be dragged. Search puts the closest matches first, so a row’s position there is the search’s, not yours — dragging it would not stick. The handles come back as soon as you clear the search box. Favorites stay draggable while you search, because searching there only hides rows rather than reordering them.

Fixed: messages snapping back while you read older chat. In a fast-moving chat, scrolling up to read and then stopping could make the messages in front of you slide down for a split second and snap back each time new ones arrived. To keep your place as older messages leave the top of a full chat, Limerino shifts the view by the same amount, and that shift was reaching the screen a moment before the change it was making up for. The two now land together, so the messages you are reading stay put while the chat keeps moving underneath.

Fixed: the landscape controls over a bright stream. In landscape, the controls under the video — Portrait, the chat toggle and the LIVE pill — now sit on a flat dark surface instead of frosted glass, so nothing bands or smears behind them.

Also in this build. On the smallest iPhones the new grip takes room from the channel name, and most of that is given back here: long names should now wrap onto a second line instead of being cut off. Restoring your channels on launch also now prefers the current record for each channel, so an order you set is not undone by a leftover from a much older version.

Build 347 —

Fixed: the video switching itself to Twitch’s player. When Limerino’s own player hit a fault it could not name, it quietly handed the stream to the embedded player and said nothing. It now tries once more on its own, and if that fails it shows a card that names the problem and offers both Retry and the embedded player — your choice, not a silent swap. While a retry is running the card says so.

Fixed: coming back from a clip said the live stream was unavailable. After a minute or two in a clip, the live pane could return with “Live video isn’t available” over a stream that was plainly live, and only a Retry fixed it. It now waits for its own permission check the way a Watch tap does. A clip that refused to open also gives the live stream back instead of leaving a dead pane.

Quality selection on the native controls. Tap the video and the controls carry a quality button: Auto, plus whatever the channel is broadcasting. Your pick sticks, it is locked while an ad plays, the audio-only option is called “Audio only”, and two options with the same name are told apart by their bit rate.

The native player is now the standard. The Native/Embedded switch under the video is gone: Limerino plays streams with its own player by default, and Twitch’s embedded player is a choice in Settings › Video for anyone who wants it. If you had already chosen the embedded player there, that choice is kept.

VoiceOver and landscape. The two-finger double tap over a poster reaches your music or podcast instead of being swallowed; the quality list arriving is spoken; the controls no longer pull the VoiceOver cursor onto a button you did not touch; the landscape chat panel’s width control is a real slider; and the landscape controls bar animates when its buttons come and go instead of jumping.

Fixed: a handful of things that said what was not true. The Settings line no longer points at a Play button that is not on screen; a stream that has just ended says so instead of showing nothing; an “unavailable” card that used to appear whenever a routine permission refresh ran late is now a late refresh with a Retry that works; and signing out stops the stream.

Build 346 —

The centered glass app icon. Limerino’s app icon now uses the brighter, centered speech bubble seen on our website and Discord. Check it on your Home Screen, in Settings and Spotlight, and in notifications. On iOS 26 and iOS 27, try Default, Dark, Clear and Tinted styles at both icon sizes; on iOS 18, try Light, Dark and Tinted. The bubble and both eyes should stay visible against your wallpaper.

Whisper drafts stay open when you drag down. Dragging down on a whisper conversation no longer dismisses it while a draft is present. Clear the draft to dismiss the sheet normally.

The launch, bot-message and foreground chat-history fixes from build 344 remain included. After updating, check that your sign-in, open channels and settings are preserved. If an icon looks wrong, include your iOS version, icon style and a screenshot.

Build 345 —

Same app as build 344, sent through repaired pre-upload checks. Nothing in the app changed. The tooling that inspects a build before it goes out had three faults of its own (it misread a correctly signed player component, it could not see the test phone, and it called a running app dead); those are fixed, and 345 is the first build to pass through the corrected checks.

If 344 works for you, 345 will behave the same. The fixes from 344 still apply: the launch crash on some iOS 26.3 phones, bot messages that showed only their last word, and missed chat after switching apps.

Build 344 —

Fixed: a crash on launch on some iPhones. On a few phones running iOS 26.3 (an iPhone 15 Pro Max and an iPhone 11 among the reports), build 342 died before its first screen drew. The way the main chat screen was assembled made iOS walk a very deep type description on the tightest part of the launch stack; that is now measured on every build and pinned so it cannot creep back.

Fixed: bot messages that showed only their last word. PotatBotat’s commit and announcement lines, and any message that starts with an invisible anti-ping character, rendered as a single word such as “events” or “logic”. The whole line now shows.

Fixed: missed chat after switching apps. Coming back to a busy chat after a few minutes in another app could leave a hole in the history, and a late-arriving older message could land out of order below “Live from here”. Limerino now notices when its first catch-up came up short and loads the rest, and slots a late message where it belongs. A deletion or timeout that lands while a late message is still being slotted now strikes it too.

Build 343 —

Built with Apple’s iOS 27 tools. Nothing you use changed on purpose: this is the first build made with the new iOS 27 toolchain, a week ahead of the public iOS 27 release, so that on launch day Limerino behaves like an iOS 27 app instead of running in compatibility mode. On iOS 18 and iOS 26 the app looks and works as before. If anything looks different from build 342 on iOS 27, say which screen and which iOS version.

Everything from build 342 is unchanged — the Watch-start fix and the 7TV alias fix below are in this build too.

Build 342 —

Removing a 7TV emote that a channel holds under two names now removes the right one. A 7TV set can contain the same emote several times under different names. When a streamer or editor removed one of those copies, Limerino used to drop a different copy: the removed name kept rendering, a surviving name turned into plain text, and the grey “removed the 7TV emote …” line named the wrong one. Limerino now removes exactly the name that was removed on 7TV and leaves the other copies alone; renames of one such copy behave the same way, and the grey line names the copy that actually changed.

Doubled emotes in the picker. An emote a channel holds under two names shows as two cells in the emote picker, one per name, as it does on 7TV itself, and both names are available straight after a relaunch.

Watch starts on the first tap after you come back to the app. Returning to Limerino after a few minutes away and tapping Watch straight away could show “Live video isn’t available. Try again later.”, and Retry failed again instantly. Watch now waits for the availability check and starts, and Retry does the same.

Everything else from build 341 is unchanged.

Build 341 —

A two-segment player toggle under the video. Embedded | Native, both words always visible. One tap switches, and the stream reloads once on the other player; if the app cannot honour your choice right now, a small badge on the toggle says so briefly, and Settings › Video › Player type explains more. On the narrowest phones with Display Zoom and the largest text sizes the two words do not fit, so the toggle shows a two-arrows glyph instead; it works the same and VoiceOver reads the same choice.

A bug-fix pass over the whole player. The native player no longer treats your own pauses as buffering trouble: backgrounding the app, opening Settings or a clip, a phone call or tapping Pause used to make it buffer cautiously for a minute and a half afterwards. If a switch or a recovery ever stalls, the player shows its failure card with Retry instead of a dead poster. Closing a clip or a video from the channel’s list brings the live stream back when you had started it before. Settings › Video › Player type says why a choice could not be applied instead of always claiming it was saved. In landscape on the native player the controls bar keeps its close button on screen while you drag the chat divider, and the width you drag to is the width that sticks. On iPad, closing one Limerino window no longer stops video in another.

Everything from build 340 is unchanged. Quality selection is not on the native controls yet.

Build 340 —

The native player no longer depends on a list of approved builds. Limerino’s servers used to keep such a list, and builds 338 and 339 were quietly refused native playback by it and fell back to the embedded player. The list is gone from the app and from the servers; only an explicit emergency stop remains, for a genuine outage.

Everything else is as in build 339. The player switch under the video keeps its interim look for now; a proper two-segment toggle follows in the next build.

Build 339 —

Controls on the native player. Tap the video to show play/pause and mute, with a spinner while the stream connects or rebuffers. The controls hide themselves after a few seconds; tap the video again to bring them back or to dismiss them.

A buffer that adapts to your connection. The native player keeps the very low latency you get on a good Wi-Fi link, backs off a little after a stall, and eases back toward low latency once the stream has been stable for a while.

Switch players on the spot. A player switch sits in the strip under the video: it shows which player you are on, Native or Embedded, or, while a stream plays, how far behind live you are, and opens a small menu to change players. The same choice is in the landscape ⋯ menu and in Settings › Video › Player type. The “behind live” figure now also shows on the embedded player, rounded to about so many seconds.

Video starts only when you ask. Opening a channel shows the poster with Watch, and playback begins when you tap it. Returning to the app resumes a stream you had started; it never starts one you had not.

Staying on the native player. The app keeps its playback permission fresh the whole time it is open, retries a failed check instead of giving up, tries the native player once more before considering a switch, and never treats a momentary server hiccup as a reason to change players. When live playback does fail, a failure card with Retry replaces the blank or stale picture.

Landscape chat. Dragging the divider past the edge to hide chat leaves a full-height grab strip at the edge, and dragging it back brings chat back; on the native player the video follows the divider live while you drag. VoiceOver, Switch Control and Voice Control can now adjust the chat width.

Known limitation. If Limerino’s playback service is unreachable for more than about a minute and a half, opening a channel shows “Live video isn’t available right now” with Retry instead of loading video.

Build 338 —

A new app icon. The same mark as before, the lavender glass speech bubble with two eyes on a violet field, now rendered as a real three-dimensional object instead of a generated picture: crisp edges, clean highlights, and no noise around the eyes or the rim. On iOS 26 the icon is built from layers, so the Home Screen’s Dark, Clear and Tinted styles each get a proper version of their own; on iOS 18 the same icon appears with the system’s standard edge treatment and matching Dark and Tinted variants. iOS may keep showing the previous icon for a short while after the update until the Home Screen refreshes; a restart clears it.

Nothing else changes in this build. Chat, video, mention alerts and every setting behave exactly as in build 337.

Build 337 —

A native live player is now the default. Tap Watch and the stream plays in Limerino’s own player instead of a web page, at Twitch’s low-latency setting, with sound as soon as the picture arrives. While it connects, the channel preview stays up with a “Connecting…” note, then dissolves into live video. A small readout under the video shows how far behind the broadcaster you are. On your first launch of this build, Player type moves to Native once, even if you were on Embedded; Settings › Video › Player type lets you pick Embedded again, and that choice sticks. Ads play as Twitch serves them.

Close video really stops the player. No sound or streaming continues after it, and opening a clip or a past broadcast while live video plays stops the live sound the moment it opens.

VoiceOver. The video is one element, “Live video” (it says “connecting” until the picture arrives); “Stream started” is spoken when playback begins, and Magic Tap pauses and resumes.

Known limitations in this build. There are no on-player controls yet: Watch starts with sound, Close stops it, and the volume buttons set the level. Ads on the native player carry no “Ad” label yet. Backgrounding Limerino or taking a call while native video plays can leave the picture stalled or the sound off when you return: Close video, then Watch again. If the native player errors or never starts, switch Player type to Embedded. Chat, mention alerts and everything else are unchanged from build 336.

Build 336 —

Painted names are centred on the profile card again. Build 335’s full 7TV shadow chains reserved drawing room for the glow, and on centred surfaces the name was laid out against that wider box, so a name with a glow sat to the right of the avatar and the “On Twitch since” line beneath it. The name now lands where an unpainted name would, on the profile card, in the paint picker’s preview and in right-to-left layouts alike. Chat rows were never affected and are unchanged; the shadows themselves are exactly as in build 335.

Build 335 —

/me messages from bots render as actions again. Some announcement bots put an invisible joiner character at the very start of their /me text, and Limerino showed those lines as the literal word “ACTION” with a colon after the name. They now render as proper action lines: the name in its colour, the text in italics, no colon.

7TV paint shadows match the paint as designed. Painted names used to show a detached or thinned shadow because the app scaled the offsets, halved the blur and capped the chain. Still and animated paints, wrapped names and mixed-script names now carry the full shadow chain, and the message text beside a painted name stays unshadowed.

More groundwork, switched off. The native video player’s engine adapter and playback-authorization client landed underneath the app and stay off: the Settings player option reads as it did in build 334, and live video is the same web player.

Build 334 —

A launch-stability fix. On some iPhones Limerino could close itself about half a second after opening, before chat appeared. It was reported from an iPhone 11 on iOS 26.3.1. This build fixes it. If the app has ever closed on you right at launch, please try this one first thing.

Nothing else changed on purpose. The fix is in how the chat screen is assembled behind the scenes, so the banner card above chat, the landscape video layout and the emote peek are all worth a look — they should behave exactly as they did before.

Build 333 —

Open a GIF properly. Tap a GIF card, or choose View GIF from a message's actions, and the GIF opens in a viewer at full size with its caption and a “GIF via GIPHY” line. Share it, copy its link, or open it in the browser from the bar along the bottom; Done or a swipe down brings chat back exactly where you left it.

Two new message actions. Long-press a message that carries a GIF and the actions now include View GIF and Copy GIF link. VoiceOver finds the same View GIF action on the message, and Voice Control answers to “View GIF” or “Open GIF”.

It follows your motion settings. If your iPhone does not auto-play animated images, or Animate emotes and name colors is off in Limerino, the viewer shows the first frame with a Play button; with Dim Flashing Lights or Low Power Mode on it shows a still with a one-line note instead.

Build 332 —

The second groundwork build. Like build 330, this one is meant to change nothing you can see: every screen, gesture, and sound should behave exactly as it did in build 331, GIF cards included. Underneath it carries the next layer of the video player program — the playback coordinator, the live-video surface host, the adapter that wraps today’s web player, and the app-side reader for the availability policy Limerino’s own service now publishes. The coordinator, the adapter and the policy reader are not wired into anything you use: no new screen exists, no new network call runs on their behalf, and nothing starts at launch.

One piece is wired in on purpose. The video pane’s container is now the new surface host’s; the web player inside it is still build 329’s. Nothing about its pixels, size, or accessibility is meant to change — if the picture appears at a different size, animates in, or sits wrong for a moment when it opens, that is the bug to report.

On the wire. Limerino’s configuration service now sends one extra field alongside the video settings the app already fetches, and asks the phone to re-check that configuration each time instead of caching it for five minutes. The app ignores the new field; the re-check already reaches build 331 too. If VOD or clip chat replay ever fails to load, that is the thing to report.

What to check. Live streams in the pane and in theater, channel switches mid-stream, backgrounding and returning, the landscape chat divider, VOD and clip replay with chat replay (including a second open after a few minutes), the composer, the inbox, the widget. If you use Smart Invert or Classic Invert, open a stream and confirm the picture still looks normal rather than like a photo negative. If anything differs from build 331, that is a bug worth reporting.

Build 331 —

GIFs sent by Tier 2 and Tier 3 subscribers now play in chat. Twitch added a GIF feature to chat, and Limerino now shows them. The GIF appears as a card under the message that carried it and plays there; tap the card to open the GIF at its own address in the in-app browser. GIPHY hosts the pictures. Each streamer chooses whether their own channel allows GIFs, and the feature is still rolling out, so a channel with no GIFs in it is normal rather than a sign something is broken.

One switch turns them off. Settings › Emote & badge display › Show GIFs sent in chat is on unless you turn it off. With it off, a GIF arrives as the short description Twitch sends with it, shown as ordinary text, and your device never contacts GIPHY. The same short description stands in whenever a GIF cannot be shown, so nothing in the conversation goes missing.

It follows the motion settings you already have. With Animate emotes and name colors off, or with iOS set to dim flashing lights or to stop animated images playing by themselves, a GIF card holds still on the first frame instead of playing. Only GIFs you can actually see play at all, and they stop while a sheet covers the chat.

Build 330 —

The groundwork build. The first build of 1.1.3 changes nothing you can see: every screen, gesture, and sound is meant to behave exactly as it did in build 329. What it carries sits underneath — the first foundation pieces of the video player program: the architecture the player will be built on, and a set of deterministic test media the app’s own tests use. None of it is wired into the app you use today; the video player in this build is build 329’s.

What to check. Live streams in the pane and in theater, channel switches mid-stream, backgrounding and returning, VOD and clip replay with chat replay, the composer, the inbox, the widget. If anything differs from build 329, that is a bug worth reporting.

1.1.2 Landscape chat layouts, the bug-report campaign, and live emote updates Builds 297 to 329

Build 329 —

The polish wave. Eight coordinated passes over the interface land together in this build, most of them about the app fitting you — your text size, your keyboard, your screen.

Sheets that open at the right height. The combined inbox and the mention-alerts explainer now open full-height from the first frame at accessibility text sizes instead of clipping behind a half-height sheet — and lowering your text size mid-read no longer collapses them. Drags on sheet content scroll the content; the grabber resizes.

An inbox that fits every size. The freshness banner keeps its message and its Try Again control readable at every text size instead of ballooning to half the screen, VoiceOver hears stale-data changes exactly once — and a successful Try Again is announced only when the connection is actually back — and long whisper drafts keep their newest lines on screen, repainting instantly on a theme change.

Everywhere else. The empty chat state adapts to the space it actually has (and its overflow scroller no longer collapses mid-gesture while dismissing the keyboard); the welcome screen’s buttons and terms fit together at every text size; video error surfaces pick layouts that fit compact heights; settings rows sit on one unified surface; and the Home Screen widget renders true in full-color, tinted, and clear modes — with a freshness line and a spoken uptime that keep counting instead of freezing on their first value.

Build 328 —

Lock a message, send it again and again. Quick messages — the saved- messages sheet and its Settings screen — are gone. In their place the composer itself does the job: type something, press and hold Send for about half a second, and a ring charges around the button and clicks the message into place. The text stays put, the send glyph switches to the repeat symbol, and every tap of Send posts the same line again — Twitch normally refuses identical repeats, so the app quietly alternates an invisible character to keep them flowing while the visible text never changes.

One tap out. While locked, an X sits at the far left of the composer: tapping it unlocks and clears in one motion. Switching channels, starting a reply, or signing out also unlocks — those keep your text as an ordinary draft instead of clearing it. A quick tap of Send still just sends once, and holding Send on an empty composer still re-sends your last message, exactly as before.

Built for every hand and every reader. The ⋯ insert menu (now “Message options”) carries an untimed “Lock message” row for anyone who can’t comfortably long-press, VoiceOver gets lock and unlock as custom actions on the Send button, and every state change speaks and reads its status — including for Voice Control, Switch Control, and keyboard-only use. If a repeat is refused (slow mode, for instance), a small note above the composer says why and clears itself.

Build 327 —

Pick your landscape chat layout. A new choice — Settings › Video › Chat layout, and the ⋯ menu right in the landscape top bar — sets how chat sits while you watch sideways. Chat beside video, the new default, gives chat its own column next to the player: nothing covers the picture, the divider drags to set the split, and the video always keeps its share of the screen. Chat over video floats chat over a full-width picture — and it is now genuinely transparent: each message carries its own small plate that hugs the text, and the space between lines is live video rather than the old edge-to-edge dark panel. One tap on the top bar’s chat control still hides chat entirely in either layout, and your choice, your width and the hidden state all stick across relaunches and rotations. Switching layouts is instant — the stream keeps playing, chat keeps its place, and a half-typed message survives the switch.

The suggestion strip above the keyboard behaves. Chip labels no longer wrap or hyphenate — every chip stays on one line and the row scrolls sideways; a very long emote code shows its start and end with “…” in the middle, and pressing and holding an elided chip shows the full name.

The composer grows while you type. The last build fixed growth on insertions; plain typing could still be missed. The box now grows line by line as you type, caps at a sane height, and scrolls past that.

Autocomplete leaves no typed tails behind. With autocorrect on, typing happ and tapping the happi emote could leave a stray py in the field. Picking a suggestion now clears the whole predicted run — and nothing the app inserts on its own ever touches text you typed.

Muted words get per-phrase precision. Each muted phrase now has its own “Whole word only” and “Match case” switches, so LIVE can mute exactly LIVE without taking alive with it.

Reply knows when a message is gone. Twitch drops the reply thread when the parent message was removed, so replies to timed-out or banned rows went out as plain messages. Reply is now withheld there — and if a message is removed while you have a reply armed, the banner clears and says why. A channel-wide clear does not withhold, since those messages are only cleared from view.

Smaller ones. Timeouts learned from chat history show their duration again; reading older messages in a busy chat flickers less — new arrivals settle in once you do; the emote-only notice can no longer be displaced by a replayed copy, even with a wrong device clock; signing out sweeps the web session only when a sign-in has not already arrived; badge width trims apply only in chat rows, so the user card draws full badge art again; and animated emotes cost a little less to decode.

Build 326 —

The quiet performance build, part two. Nothing you can see should change in this one; a handful of things you cannot see now cost less. Each change ships only because it measured faster with output identical to the character, and each is pinned by a test that compares the new code against a verbatim copy of the old.

Stacked emotes measure themselves in one pass. A zero-width emote layered on top of another used to build three throwaway lists to work out its width and height on every chat row that carried one. It now takes a single look. The frame is the same to the point, and the preview card that opens when you tap a stack lays out exactly as before.

Whisper unread counts add up without copying. The number on the inbox badge was found by copying every visible conversation into a fresh list and summing it; it now sums in place. Same number, same rules, no copy per refresh.

The mention-alerts channel list does less work each time it redraws. With hundreds of channels, the “Turn All Channels Off” title was worked out three times per pass and the “N off” counts each built a temporary copy of the whole list. The title is now derived once and both counts walk the list without copying it. Every label, count and confirmation sentence is unchanged — checked at three hundred channels with none, three and all of them off.

Smaller ones. “Your badges” settles a shared title in one scan instead of two; VOD chat replay and mention read-tracking skip a temporary list when they only need the newest item; a badge lookup that meets a version it does not recognise finds its fallback with a single minimum rather than sorting the table; the stable identity that stops emote-only and followers-only notices repeating on relaunch is formatted without the system format-string path, six allocations down to one, and reads character for character as it did — so history written by the last build still matches.

If anything looks, reads, or animates differently from build 325, that is a fault in this build rather than a change — please report it.

Build 325 —

The bug-report build. Every unresolved report you have sent — on Discord, on GitHub, and through TestFlight’s own feedback — was checked again against the current code. Several turned out to be something other than what they looked like.

The black bar after a long badge run is gone. It was never a badge. When someone has more badges than the row can show, we draw a small “+N” chip, and that chip was being laid out with no room for its own label. The same fault was hiding on a more common path — any badge whose image fails to load — and both are fixed.

The message box grows again when you insert an emote. Picking an emote from the suggestions replaced the field’s contents without re-measuring it, and the check meant to catch that compared the number of characters — an emote counts as one. So after a two-letter prefix nothing appeared to change and the box never grew. That is why lines vanished until you sent. The box could not be scrolled either, so the text was unreachable rather than merely hidden.

Animated emotes cost much less. Frames are now reduced to the rate chat actually draws at, and that happens before the images are built rather than after. One emote was an extreme case: 404 frames that took over eight seconds to prepare, long enough to trip our own stuck-decode limit — and the finished work was then thrown away, so it started over every single time the emote appeared and never got past the first frame. Emote and name-paint memory is also released when you leave the app, instead of being carried around in the background.

Emote-only mode no longer floods chat when you reopen the app. Those lines were coming back in the recent-history window we fetch on launch. Twitch attaches no identity or time to them, so we were stamping every copy as new — and every relaunch, reconnect and return to the app added another set. They now carry a stable identity and their real time, so repeats are recognised and dropped.

Capitalised emotes: this was a setting, not a fault. “Case-sensitive autocomplete” makes suggestions match the capitals you type. It is now labelled with what it actually does, shown in the settings summary, findable by searching the words you would really use (“emotes not showing”), and reported in diagnostics. That last gap is why this one took three builds to pin down: we could see whether your emotes had loaded, but never whether the matcher agreed with them.

Signing out is quicker, and now always clears your web session. It could hang waiting on an unresponsive part of the system, and that hang skipped the step that removes the Twitch web cookie — so an account could still be signed in underneath while the app said otherwise.

Also: third-party emote services changing their response shape used to cost a burst of retries and now costs one; the emote panel closes along with the other panels; and the whole row of the whisper message field is tappable rather than just the text.

Worth a look this build: a chatter with a lot of badges, a longer message with an emote picked from the suggestions, and a busy channel with animated emotes — then leave the app and come back, and check that names and emotes still animate. One thing to check first: this build went out without the on-device launch check, so please make sure the app opens and keeps running, and say so straight away if it does not.

Build 324 —

Landscape chat, rebuilt. This is the big one for anyone who watches in landscape with chat beside the video.

The grab bar for resizing chat now works where you can see it. Its invisible reach used to spill a little past the drawn edge into your chat rows, so a swipe meant for a message could start resizing the panel instead — and the far side of the bar had a dead strip that ignored you entirely. Both are gone: the area that responds is exactly the bar you can see.

Dragging up and down on that bar scrolls chat, the same as anywhere else in the panel. It used to be a dead spot.

VoiceOver can resize chat now. The bar is a single labelled control that reads out its width, adjusts with a swipe up or down, and stops at the narrowest width instead of hiding the panel out from under you. When the keyboard covers the space it belongs in, it steps out of the way rather than sitting there unreachable.

The mentions and overflow buttons moved into the top bar in landscape. They used to float on top of chat; now chat rows get that space back.

Chat stays readable at every transparency setting. Usernames, links, body text and the panel’s own edge were each checked against the hardest frame a stream can put behind them, on every theme and every step of the slider — including highlighted rows and the alternating row shading, which were the weakest spots before.

Two things you may notice without changing anything: the panel’s edge and shadow look a little different at the default transparency step, and on the dark theme at maximum transparency the dimmer text sits a bit closer in tone to what is around it. Both are deliberate — they are what keeps the text above the readability line.

Worth a careful look this build: put a finger on the chat resize bar and drag up and down, then sideways, and see whether both feel right — especially with the keyboard open. If you use VoiceOver, try resizing chat with it. And if you watch in landscape with the keyboard up, a screenshot with chat on the left and another with chat on the right would be genuinely useful.

Build 323 —

Your message appears the moment you send it. Until now the app waited for Twitch to answer before putting your message on screen. On a good connection that is a blink; on a bad one it could be seconds, and your message simply was not there yet. It now appears immediately and the wire catches up behind it.

The composer no longer freezes while a message is going out. You can type and send the next one straight away.

Every message you send now says where it actually got to. On its way, accepted, failed, or held for review each look different, and a failure tells you what went wrong in Twitch’s own words instead of the message quietly vanishing.

A message that fails keeps your words. Retry and Discard sit on the message itself — Retry sends that same message again, and Discard clears it and hands your text back to the composer, so nothing you typed is lost either way.

Sending pulls the list back to your own message. If you had scrolled up, your message no longer lands below the fold behind the new-messages pill, and VoiceOver announces it arriving.

Worth a careful look this build: send in a busy channel and watch how quickly your message shows up. Then turn on airplane mode, send, and turn it back off — the message should appear at once marked as not sent, keep your text, and go out when you tap Retry. Try Discard too, and check your words come back.

Build 322 —

The name-paint screen, rebuilt. Profile ▸ Name paint now opens a proper wardrobe: a hero card up top previewing the paint you are wearing, your paints in two columns with real counts on collapsible shelves, and a rule of swatches under each card drawing that paint’s true colours. Search sits docked at the bottom with an Animated filter beside it — and a search always outranks a folded shelf, so a paint you own can never hide from you.

Quicker to the paint you want. There is about a third less standing space before your first browsable paint, and two columns roughly halve the scrolling compared with the old one-per-row list.

Your paints are there the instant you open it. Your wardrobe is now kept on your device, so a cold launch shows it immediately while it quietly re-checks with 7TV in the background — no spinner first. Your Twitch name colour also renders correctly in the previews now, on both the hero and the cards.

The screen tells the truth when things go wrong. Offline with a saved wardrobe shows your saved paints behind a banner; a wardrobe still being confirmed after sign-in says so rather than silently swallowing the tap; failures and empty searches each get a screen of their own instead of a blank grid.

Worth a careful look this build: browse the grid, fold and unfold a shelf, then pick a paint and watch your name repaint in a live channel. Then force-quit and reopen — your wardrobe should be there at once. If you can, try it in airplane mode, and at the largest text sizes, where the grid drops to one column.

Build 321 —

Landscape gets a real chat overlay. Turn the phone sideways on a live stream and the video now fills the whole screen, with chat floating over it as a translucent panel. Drag the panel’s inner edge to make it wider or narrower, hide it from the player controls when you want the picture alone, and it remembers your width and whether it was hidden — across rotations, channel changes, and relaunches. Portrait is exactly as it was.

Message actions grew up. Long-pressing a message used to raise a screen-tall list that could push its own Cancel out of reach for moderators. It is now a compact platter: who said it and what they said up top, quick actions in a chip rail, then message and moderation groups — opening at about half the screen, everything reachable, everything readable.

Moderators: AutoMod held messages now show up. If you moderate a channel with AutoMod on, held messages appear right in chat with the flagged text quoted, Allow and Deny buttons, and honest captions when the connection degrades or another moderator gets there first. Worth a careful look this build: hold a message in a channel you moderate, act on it from chat, and tell us what you saw.

Build 320 —

Choose your 7TV name paint in the app. With a linked 7TV account, a new name-paint screen — reached from your profile and from the 7TV account row in Settings — lists every paint your account owns, each drawn the way chat draws it, with your own name in the preview. Tap one to wear it, tap None to take it off; the change lands on 7TV itself, so it follows your name everywhere 7TV paints are drawn. One paint per account, everywhere.

The screen tells the truth while it works: the row you tapped shows its progress, a refused or failed change puts the previous paint back and says why, and a paint you own but can’t currently wear explains itself instead of failing silently. Your name in chat repaints the moment the change is accepted.

Worth a careful look this build: one full change cycle — open the screen, pick a paint, watch your name repaint in a live channel, then clear it — and tell us if anything on that path hesitates or misleads.

Build 319 —

One tap from the Highlights inbox to its rules. The inbox’s Highlights tab now carries a “Custom highlights” button in the bottom bar. Tap it and the inbox closes and Settings opens directly on the Custom highlights screen — the rules that decide what lands in that tab. The old trip was four acts: Done, the header ⋯, Settings, then a hunt through a long form.

The landing screen gets a Close button of its own (top left), so leaving is one tap whether you came for a quick edit or a long one; Back instead returns to the Settings root with the Highlights group already open, holding the related alert and sound toggles. Opening Settings any other way is untouched — it starts at the top, as always.

At accessibility text sizes all three inbox tabs now keep their content clear of the floating bottom bar — previously the Highlights tab’s “Add a highlight rule” action could end up out of reach entirely. The new button reads properly under VoiceOver and Voice Control, shows its full name on a long press, and mirrors correctly in right-to-left languages.

Build 318 —

Settings you can navigate, and a guide that stays. The rules-and-lists tail of Settings is now three sections named for what they do — What you see, What you send, Moderation — with a one-line caption and a count on each row in place of five single-purpose sections. The Rules screen is renamed “Blocked users & muted phrases”, so the row, the title bar and search finally say the same thing, and the whisper on/off switch moved to Activity alerts beside the alert types it governs.

Settings, under About, now holds “How Limerino works”: what the app does, with rows that take you straight to the setting they describe; a gesture reference for chat, the header, the composer and lists; and every slash command grouped by who can run it. /help points at it. The mention-alerts offer stops competing with your first minutes in the app — it waits for a later launch and for a moment where it means something, a channel open or mentions already waiting, and never raises itself over a keyboard you are typing on.

Search got deeper, and more willing to start you off. Roughly 28 new aliases reach inside Mention alerts, Activity alerts, Image uploads and the profile screens; “teal” finds the accent swatches; a result for a dimmed control says what it needs instead of naming the wrong switch; and tapping the field before you type offers eight suggestions. The profile screens search reaches now load themselves on arrival, with a Try Again when a load fails. Two smaller things: typing a chatter’s name without the @ offers the setting that finishes names for you, and the emote picker’s Recently used header gains a rows control once your recents run past three rows.

Under the hood, a reliability round closed nine root-cause defects — including a crash on 7TV emotes arriving with a malformed image scale — alongside an accessibility polish pass and four measured performance fixes.

Build 317 —

7TV emote links come alive in chat. Paste or receive a 7tv.app emote page link and it now renders an inline card under the message — the emote, its name and its artist — instead of plain link text. Tapping the link or the card opens Limerino’s own emote view, with the add-to-your-set offer where your channel setup supports it, and different spellings of the same emote collapse to one card.

The details we sweated: if an emote can’t be shown — deleted, or marked mature on 7TV — the link stays an ordinary link and opens the web, never a dead tap. The 7TV emotes & name colors switch is honoured end-to-end: off means no card, no lookup, ordinary links, and rows already on screen update the moment you flip it. Flipping it off while a tapped emote is still loading now quietly drops the lookup instead of bouncing you to a browser. VoiceOver reads “Open 7TV emote” only when the in-app route is truly armed, and the card holds a stable height at the largest text sizes so chat doesn’t jump.

The privacy policy’s children’s-privacy section gained a matching paragraph describing exactly what these cards show and when — the same text on the site and in the app.

Worth a careful look this build: paste a few 7tv.app emote links in a busy chat — duplicates should collapse to one card, taps should stay in the app, and the toggle should flip the whole feature both ways without a restart.

Build 316 —

The “Checking…” fix. The stream info banner could stay on “Checking…” long after chat was flowing — most often right after a cold launch. We traced every path that could strand it and closed all of them in one build.

The root cause: on a cold launch the status checker could start before sign-in finished validating, fail quietly, and then sit out a 60-second retry pause with nothing to tell it sign-in had completed. Now, finishing sign-in immediately kicks the status check; while the channel you’re looking at is unresolved, retries run on a fast bounded ladder (2s–16s) instead of the standing cadence; the banner’s status listener lives for the whole session instead of being rebuilt on every channel switch, so a resolution can no longer land in a gap and be lost; switching to a tab whose status never resolved asks again instead of waiting for the next poll; and channels restored at launch whose first status check failed are detected and re-asked. Status updates also carry an ordering stamp now, so a slow older answer can never overwrite a newer one — banner, widget and Live Activity stay consistent.

One more thing: with VoiceOver, the moment a channel’s status first resolves is now announced, so the end of “Checking…” is heard, not just shown.

Worth a careful look this build: cold launches with several tabs open — the banner should resolve within a few seconds of chat appearing, and if “Checking…” ever outlives chat by more than ~20 seconds, the channel name in a report would help us confirm no variant survived.

Sending is more honest under a bad connection. A send that cannot go through now fails fast with a clear error instead of hanging the composer, the connection banner reports reconnecting truthfully, and a failed send no longer consumes a rate-limit slot.

Also riding along — what finished review after 315 shipped. Message actions are now driven by one shared catalog across the platter, thread sheet, replay column and VoiceOver rotor (moderators gain Timeout/Ban on the platter), the message swipe is more forgiving, and gesture hints teach from one place. Settings regroups its root screen into collapsible sections with live readouts, and gains a “Changed from default” review with per-row reset, chat look presets, and rule-entry search. And the Mention alerts screen folds its followed-channels list — hundreds of rows for some of you — into a collapsed, summarized, searchable group, with a read-only badges row beside it.

Build 315 —

The bug-sweep build. Every open bug report went through a fresh diagnosis, and this build carries the fixes — nine parallel tracks through chat, emotes, sign-in, accessibility and video, each reviewed adversarially before merging.

The ones you are most likely to notice. Combined (overlay) 7TV emotes no longer split into side-by-side emotes mid-session when a live set update reclassifies them — one real cause of the reported splits; if you still see one, the exact message and channel would help us close the rest. Whispers now render 7TV, BetterTTV and FrankerFaceZ emotes as artwork instead of codes. A failed history load now says “Couldn’t load recent messages” instead of the confident “No messages yet”, and a channel’s first-ever connection reads “Connecting…” instead of claiming a lost connection. An @mention that arrived while you were away no longer vanishes from the Mentions inbox. And in Shared Chat, the origin channel’s avatar chip now sits at the front of the badge lane, sized like a badge.

Quieter fixes: timing around account validation (a new account’s first message can no longer be decorated with the old account’s text, and the connection dot no longer contradicts a fresh sign-in), confirming a delete re-checks the message still exists in case a moderator got there first, the going-live cue fires correctly after iOS reclaims the player under memory pressure, and a batch of VoiceOver and large-text fixes — spoken FrankerFaceZ global badges, a chat timestamp that yields to the author’s name at accessibility sizes (the time is still spoken), a slash-command palette that scrolls when it cannot fit, and an empty whisper thread that finally scrolls too.

Worth a careful look this build: long sessions in emote-heavy channels — if a combined emote ever splits, the message and channel name help; and large text sizes with the keyboard up, especially the composer and the whisper screens.

Build 314 —

A quiet performance build. Every zero-downside finding from a whole-app performance audit, plus five rounds of review hardening. Cold launch reads settings once, hydrates whispers and inboxes in parallel, and restores your channel tabs in one batch; chat scrolling proves a repeated frame unchanged from a version stamp instead of rescanning the whole buffer; blocked-user filtering probes a precomputed index instead of scanning your whole list for every message.

Two changes you might actually notice. Emotes now appear per provider as each answers — a slow provider no longer holds back the rest, and a failed one keeps your previously loaded emotes and retries on its own when the network recovers. And a silently dead 7TV event socket is now detected and reconnected, so live emote updates can’t quietly stop for the rest of a long session. Link previews also stopped flashing a placeholder on cards you scroll back to.

Worth a careful look this build: busy channels while you are caught up at the bottom — chat cadence should feel the same or smoother; if arrivals ever seem to stall or skip, a report with the channel name helps a lot.

Build 313 —

Search all of 7TV without leaving your message. The composer’s emote menu now carries a “Search all of 7TV” door — at the bottom of the grid, and on the no-matches screen — that opens the full public 7TV directory with your typed search carried along. The directory shows exactly where an add will land before you commit: the strip under the search field names the set and the channel, counts the slots in use, and lets you switch targets when you edit more than one channel’s emotes. A landed add shows up in the emote menu the moment you pop back — and if your search there had matched nothing, the stale query is cleared so the new emote is immediately visible.

Without a connected 7TV account the directory is browse-only: search works, every cell explains itself, and a visible report control on each emote opens the report flow — no hidden long press required. Failures are kept honest too: a failed page of results keeps what you already scrolled and “Try again” re-runs exactly the request that failed.

Worth a careful look this build: the emote-menu sheet rises to full height when the directory opens and settles back when you return — if the sheet or the composer ever lands in a wrong or stuck position around that round trip, especially with the keyboard involved, screenshots of the sequence help a lot.

Build 312 —

A quiet performance build. Nothing here looks different, and that is the point: this build carries two internal refinements from a full-codebase performance audit, both verified to change no behavior and no pixels.

First, the readability check that keeps 7TV name paints legible against every row background now stops measuring the moment it has its answer instead of always scanning the whole texture — the same veils and the same colors, computed with less work, some of which used to happen mid-scroll in paint-heavy channels. Second, the app’s image caches and push-token plumbing now share one fast encoder for the internal names they write, replacing a slow formatting call that ran hundreds of times in the first seconds after a cold launch. Existing caches keep working as-is — nothing re-downloads.

If this build feels different from 311 in any way beyond the number, that is a bug — please report it.

Build 311 —

The “Checking…” card can no longer get stuck. Opening a channel that is offline could leave the status card at the top of chat saying “Checking…” forever — chat flowed underneath, but the card never resolved and could not be tapped away. The cause was a small timing window while the chat screen wires itself up: if the “this channel is offline” answer arrived in exactly that window, nobody was listening, and every later status check silently agreed. The window has existed since the very first beta build; whether you hit it was pure timing, and only offline channels were affected. The screen now double-checks the status right after it finishes wiring, so the answer cannot fall through the gap.

One intended side effect: the moment a stuck “Checking…” would have resolved to Offline, the video area now tears down properly and the normal offline card (with the last-played game, when known) takes over.

Build 310 —

Fixes the launch crash in builds 308 and 309. Both crashed instantly on launch for most devices: the main chat screen is built from a deeply nested UI description that iOS reconstructs the first time the screen draws, and build 308 added enough around the app’s root that the reconstruction ran out of room on most devices — before the first frame. Whether it hit depended on the exact device, iOS version, and restored state, which is why a few phones escaped while most did not. 310 restructures the chat screen so the reconstruction is roughly half as deep, with margin to spare on every device, and adds an automated check that measures the full depth so this class of regression is caught before a build ships.

Do not delete the app — just update. 310 fixes the crash in place; your channels and settings are untouched. If you already deleted the app to escape the crash loop, that was the only way out and we are sorry — your settings went with it; set things up once and they will stick. If TestFlight still offers 308 or 309, skip them and install 310.

Everything 308 and 309 added (first-run screen, theme packs, supporter badges, viewer counts, video-latency work, community links) is still here and unchanged — only the chat screen’s internal structure moved.

Build 309 —

An honest connection status, community links, and a better-behaved video player. Three workstreams landed together; the connection work is the deep one.

Fixed: “Connecting…” could outlive the connection. The status check was standing down on a stale reading and missing the moment the session actually dialed; sign-in, account refresh, and network changes now keep the label tracking what the session is really doing. If you see “Connecting…” over a chat that is clearly receiving messages, that is the bug this build claims to fix — report it with the timing. The video player also can no longer start behind a sheet: every path that used to start playback immediately now re-decides at the moment you can actually see the player.

New: a Discord invite now leads Settings (top of the list, above 7TV), and the 7TV link joins your Profile page right below Discord — two surfaces so nobody has to hunt. And when chat genuinely is not connecting, it now says so — with why, and a Try Again button that runs the same recovery reopening the app would.

Launch it once before relying on it. The pre-upload device check ran half-way for this build: it installed cleanly on a real iPhone, but the phone was locked, so the launch half could not run. If 309 fails to open, say so and go back to 308.

Build 308 —

Nine things at once. A batch of independent work landed together, so this build is broad rather than deep. Touch each area briefly rather than any one of them hard.

New: a one-time welcome screen on fresh installs, before signing in — you will not see it if you already have Limerino. A typeface choice in Settings › Appearance (System, Rounded, Serif, Mono), and named colour palettes beside it; every palette is contrast-checked when it loads, so one that would make text hard to read cannot be selected at all. Live viewer counts on channel switcher rows. A line above the message box telling you when a channel is followers-only, in slow mode, or emote-only — before you try to send. Chatterino supporter badges, with their own switch. And “Watch <channel>” via Siri and Spotlight.

Faster: channels you are not looking at no longer refresh over the network while the app starts, so cold launch should feel shorter. The video player also warms up behind the poster, so tapping Watch has less to do.

Fixed: a channel could read as live in Followed and not-live in Favorites — a stale local status was blocking the fresher answer instead of deferring to it. And the Chatterino badge switch did not stick: turning it off and relaunching brought the badges back.

Please launch it once before relying on it. This build added a check that installs the app on a real iPhone and confirms it starts before uploading — the check that build 306 needed and did not have. It was skipped for this build because no device was attached at ship time. The tests are green, but tests cannot see whether an app opens. If it fails to start, say so and go back to 307.

Build 307 —

Build 306 could not open. This build fixes it. If you installed 306 it closed instantly every time, before showing anything. Delete it and install this one. 306 has been withdrawn, so nobody else can install it.

The cause was the chat screen, not the 7TV work. That screen had built up one layer more than iOS could set up while starting, and the app was stopped before it drew its first frame. Build 305 sat one layer under that limit and was fine; 306 crossed it. This build takes the chat screen three layers below where 305 was, and an automated check now fails the build if it ever climbs back — so this particular way of breaking the app cannot reach you again.

Everything 306 was meant to deliver is here, and now reachable. The 7TV emote screens that showed a tall empty band for anyone editing someone else’s channel, 7TV moved to the top of Settings, the 7TV control in the chat header for channels you can edit, and the rebuilt set list, roster, set detail, inspector and directory. Off-screen channels also hydrate lazily at launch, so a cold start on many channels settles sooner.

Apologies for 306 — an app that will not open is the worst kind of bug to ship, and this one slipped through because it only happens in a release build on a real device, where none of our automated tests could see it.

Build 306 —

Withdrawn. This build could not open — it closed immediately on launch for everyone. It has been pulled from TestFlight. Its contents shipped in build 307 above.

Build 305 —

The navigation and accessibility close-out. The channel switcher, composer, emote picker, user card, video browser, theater player and 7TV management screens were audited as one connected flow. Emoji gain a category rail and jump menu; the user card gains a real custom-color picker; VODs name themselves in theater view; video filters show their current choice; and informational 7TV rows read as one useful VoiceOver stop instead of announcing the symbol first.

Several dead ends are gone. Signed-out channel search now explains why it did not run instead of showing a false empty result. The 7TV editor identity bar no longer stretches into a full-screen purple stripe that hides all four management screens. Wrapped lines stay inside their bullets in the in-app Privacy Policy and Terms, and their block spacing now grows with accessibility text sizes.

Video metadata no longer races itself. A clip or VOD now resolves its title, channel and chat-replay identity through one request path; replacing the playing item cancels the old result before it can write over the new one. Pagination failures also say what stopped and how Try Again continues. Profile retries cannot release a sibling request, activity-alert rules that cannot run no longer look active, and channel-log deletion reports what was actually removed.

Discord has one permanent address. Every in-app and web link now uses discord.gg/limerino, with the server’s updated invite artwork visible on Discord.

Build 304 —

The 7TV consent page no longer promises a one-tap approval it can't keep. Connecting 7TV opens a Twitch approval page, and the app implied that page would be a single tap whenever the video player showed you signed in — yet Twitch would sometimes demand a full sign-in anyway. Twitch's approval page honors a different sign-in than the player does, and the app was reading the wrong one. The consent sheet now checks the credential Twitch actually honors and says up front when a sign-in will be needed — on Twitch's own page, after which later approvals really are one tap. The approval page also names the site you are on in its title bar — following the page as the flow moves through Twitch's sign-in — and a consent sheet dismissed mid-load now stops its page load instead of finishing it unobserved.

Build 303 —

Manage your 7TV emote sets. Connect your 7TV account in Settings — a consent page explains exactly what is shared before anything happens — and the app lists every channel where you hold editor rights. Open a channel to work its emote sets: search the 7TV directory, add emotes, rename them, remove them, and undo a removal while the receipt is still showing. Every screen says plainly why a control is unavailable — an expired 7TV session points at reconnecting, a revoked editor role says so, and a full set says it is full.

Add an emote straight from chat. Tapping a 7TV emote opens the usual peek card — and when you hold editor rights for the channel you are watching, the card offers “Add to” with the exact set named. A small confirmation shows the emote, the set, the channel, and the name it will keep; nothing is written to your set without it. If the set already holds the emote — even under another name — the confirmation says so instead of sending a duplicate. For everyone else, chat is unchanged: the card simply never grows the extra row.

Build 301 —

Chat says whether it is still loading. Opening a channel showed one line — “Waiting for chat” — whether recent messages were still being fetched or the channel was genuinely quiet. There are two states now: a spinner over “Loading chat” while the fetch is running, and “No messages yet” once it has settled with nothing to show. Switching tabs, entering split view, and a launch that restores several channels at once never read as empty while they are still settling — a queued tab holds the loading line until its own fetch returns.

Two more chips stopped washing out. Holding a finger on the chip that brings back your last message, or on the “N new” pill that appears when chat has run ahead of you, lifted the capsule toward white and faded the very text you were reading to decide. Both now take the flat press treatment the emote, slash, and picker chips moved to in build 300.

Emotes fill in faster on a first join. The first time you open a channel — and on any channel whose Twitch emote list failed to load and then recovered — the app treated that channel’s own sub and follower emotes as unknown and sent them down the slow lane, during exactly the burst of messages a join brings. It now waits until it really has the channel’s emote list before calling it complete. Reply threads, split view, and chat replay on videos and clips carried the same gap.

Build 300 —

Chat stays above the suggestions. With the emote or mention suggestion strip open, the newest message used to sit behind it — you had to close the panel to read the line you were answering. Chat now rests above the strip while it is open and settles back when you stop typing.

Your last message, one tap away. Focus an empty message box and one chip appears above the keyboard, holding the last message this channel accepted from you. Tapping it loads that text back into the box for editing; it never posts on its own.

Saved messages leave the compose bar. Build 298 put your saved quick messages on that same band; they are off it now, and the last-message chip is all that remains there. Nothing else about them changed — + › Quick messages still opens the list, saving from chat still works, and Settings › Quick messages still manages them. Deleting got easier in the same pass: swipe a saved row, or touch and hold it, and choose Delete; VoiceOver and Switch Control get the same action.

Message separators. Settings › Chat display › Message separators draws a hairline rule between chat rows — the companion to alternating row backgrounds. Off by default.

Recent custom name colors. A custom hex Twitch accepts is now kept on its own, under Recent custom colors in Profile › Chat color: six of them, newest first, tap to wear one again, each removable. The fifteen named colors keep their permanent swatches above.

Favorites, and a shorter Recently Used. Touch and hold any emote in the picker to pin it — favorites get their own section above Recently Used, with their own rail chip. Settings › Emotes & badges gains Show recently used emotes and Recently used rows, one to five or All, which is what the section has always rendered.

Busy chat holds its place. On a fast channel the list could stop following new messages and then catch up in a lurch, with the “N new” pill counting up in between: a drag the system never reported the end of was holding the list in an interactive state. It is now read from what the scroll view actually reports, and animated name paints no longer rebuild themselves twenty times a second when nothing has changed.

Emotes that were only half there. Twitch emotes granted outside a channel’s sets — hype-train rewards among them — painted a single frozen frame; they animate now. Tapping a combined emote showed a card holding one of its layers, and it now draws the whole composite and names every layer. The Mentions feed and the Highlights inbox printed emote codes as plain text; both render the artwork now, at the size chat uses. And holding a finger on an emote suggestion or a picker category chip no longer washes it out while you are reading it.

Fixed. Opening a profile card from an @mention chip left the “Your overrides” color and note empty over a record that existed, and quietly dropped anything typed into them. Switching accounts carried the previous account’s send cooldown onto the new one, and that cooldown’s own 30-minute ceiling did not end the wait it announced. With the video pane open, a long draft could push the suggestion strip over the pane’s Close video button, which then inserted an emote instead of closing the stream. And a channel’s 7TV emote list now holds up across live changes: no ghosts from a set the channel has left, and a live removal or rename is no longer undone by the next reload.

Build 299 —

Live emote updates in chat. When a channel’s 7TV emotes change while you have it open, chat says so — a quiet system line naming the emote that was added, removed, or renamed (up to five names, then a count), or one line when the channel swaps its whole active set, with the emote list refreshing on its own. Only changes that actually took effect are shown; stale and out-of-order events are filtered before anything reaches the screen.

Your call whether to see them. Settings › Emote providers › Show emote changes in chat, on by default and living under the 7TV switch it depends on. Turning it off also clears any lines already in your open chats.

Profile card, rebuilt around the person. The chatter card now reads identity → relationship → history → actions. Copy username, Highlight, Mute notifications, and Videos & Clips move into a ••• menu; Report and Block stay as visible rows under Safety. Highlight and Mute are real toggles, and the hero gains an account-age caption — “On Twitch since Mar 2016.”

Both names for localized chatters. A chatter with a Korean, Japanese, Chinese, Arabic, or other localized display name now renders as 별빕은총 (star_alune) — Twitch’s own order — in chat, the reply strip, and VoiceOver alike. Settings › Chat display › Username style picks Username, Localized name, or Both (the default).

Fixed. System Reduce Motion no longer silently vetoes the in-app “Animate emotes and name colors” toggle — the toggle now means what it says, while interface motion still honors Reduce Motion everywhere. And every on-black glass control in the video overlays now sharpens its edge under Increase Contrast; seven of eleven previously did not.

Build 298 —

Quick messages. Save the lines you send often — up to 50 — and post them in two taps. Tap + in the compose bar and choose Quick messages: Insert drops the text into your draft at the cursor, Send posts it directly. Manage the list in Settings › Quick messages: search, reorder, edit, and a guarded Delete All.

Chips when the box is empty. Focus the message box with nothing typed and your saved messages appear as chips right above the keyboard — tap one to drop it in. Chips never send on their own, and they step aside the moment you start typing.

Save straight from chat. Long-press one of your own messages — in chat, a reply thread, or theater view — and choose “Save as quick message.” The editor tells you up front when something can’t be saved or sent: too long for Twitch, a duplicate, or something your own muted terms would hide.

The send button never lies. Rows show a checkmark dwell when a send lands, a live countdown when slow mode or send spacing is holding you, and the actual reason when followers-only, subs-only, or emote-only chat refuses — including refusals Twitch reports a few seconds after the send looked fine. VoiceOver hears the same truth: real countdowns, positions, and reasons.

Under the hood. Refusal detection now survives device–server clock skew; a send resolving while you close and reopen the sheet can no longer stamp its result on the wrong presentation; and every save path — chat, composer, Settings — enforces the same rules at the store.

Build 297 —

Muted terms now cover emotes. A muted term set to obscure used to catch only text — an emote spelling the same thing walked straight through. Emotes, emote stacks, and cheermotes matching an obscured term now render as the same discreet pill your muted text gets, and a masked emote is never fetched or animated. VoiceOver reads the mask instead of the hidden content.

Autocomplete stops leaving crumbs. Accepting an emote suggestion mid-word no longer leaves stray letters behind — including suggestions matched from the middle of an emote’s name. Typo fixes complete cleanly, and the mention list keeps up: blocking someone removes them from suggestions immediately, and people who spoke recently show up as they should.

Right-to-left names sit right. A Hebrew or Arabic display name drew its colon on the wrong side of the name. Author names are now isolated from the line around them, so the colon stays where it belongs — in chat rows, /me lines, and reply strips alike.

Less work in the background. When the app leaves the screen, the emote-animation clock and connection polling now stand down, and per-channel accounting landed so the next round of inactive-channel work is measured, not guessed. Highlights from channels you are not watching still arrive — that path is now pinned by a test.

Cold-launch visibility. No behavior change: launch now leaves a precise internal trace, so the intermittent slow start some of you reported can be pinned to its exact cause from a single diagnostics export.

Plus, from the same train: you can send the same message twice in a row again; the compose bar’s placeholder is contextual; user cards show follow and sub duration; and user-card badges are tappable with details.

1.1.1 Image uploads, inline previews, username paints, and the bug-report wave Builds 285 to 296

Build 296 —

Blocking now silences mention alerts too. Blocking a user also mutes them as a mention sender, so their mention push notifications stop; unblocking reverses it. That mute is part of your mention-alert settings, so it travels with them when you export and import settings.

“Hide deleted messages” actually hides. With the toggle on, a deleted message collapses to a compact placeholder row — live, as moderators act — instead of just being dimmed. Reply previews no longer resurrect a deleted parent’s text, and VoiceOver reads collapsed rows without exposing the hidden content. Default stays off.

One-time terms acknowledgement. First signed-in launch shows a single card with the zero-tolerance statement and links to the Terms of Use and Privacy Policy. The in-app Privacy Policy’s children’s-privacy section was also refreshed.

Build 295 —

Name paints move now. Names with an animated 7TV paint actually animate — in live chat, scrollback, reply strips, @mention chips and user cards — all driven by one shared clock so a busy screen full of moving names costs the same as one. Static paints are untouched, and scrolling should feel exactly as smooth as 294.

Painted names in older messages are back. Some channels recently showed plain-colored names in chat history while fresh messages painted fine — an upstream limit tightened under us. The lookup now stays under that limit and degrades one user at a time instead of dropping the whole batch. Mention chips also picked up a small typography correction.

Landscape chat clears the floating buttons. In fullscreen landscape the inbox and menu buttons sat on top of the chat text, and long lines ran right underneath them. Chat now stops short of that button column, so every word stays readable. The honest trade: landscape lines are about a fifth narrower, so text wraps a little more. If the narrower column reads wrong on your device, say so — widening the whole chat column is the ready follow-up.

Build 294 —

The busy-chat build. One change, squarely aimed at how the app feels when chat is flying: a message arriving now redraws only the message list itself. The header, the video, the composer and everything else around chat used to be redrawn on every arrival too — up to ten times a second in a big channel — purely as a side effect of how the screen was wired.

What that should feel like. In a busy channel, scrolling stays the same or gets smoother, and the rest of the screen — stream title, viewer count, video, the compose bar — keeps updating without competing with chat for the same work. On quieter channels there’s little to notice, which is the point.

Nothing else changed on purpose. Mention chips, the @ autocomplete, channel switching and the rest should behave exactly as they did in 293. If anything feels different — better or worse — that report is exactly what this build is for.

Build 293 —

The name-paint build. 7TV name paints were painting some names and missing others — most visibly when you @mentioned someone whose messages weren’t on screen. This build rebuilds how the app learns who a name belongs to, so paints land everywhere a name is drawn.

Mentioning someone paints their name. Tagging a chatter with a paint now shows it on the mention chip itself, even if they haven’t spoken recently — the app now recognizes the person behind the name instead of waiting for their next message.

Reply threads and quoted messages keep paints too. The reply strip, the thread view, and quoted names were quietly skipping paints in cases where chat itself showed them. All the name surfaces now draw from the same well.

Late paints heal instead of sticking. When the app learns who someone is after their name is already on screen — opening a profile card, a moderation notice naming them — the rows that already show that name repaint on the spot rather than staying plain until they scroll away.

Name colors stopped time-traveling. A quirk could let an older sighting of a chatter overwrite a newer color. Recency now wins per fact, so the color you see is the freshest one the app has actually observed.

Under the hood. The repaint machinery got more surgical — a paint arriving for one person redraws that person’s rows, not the whole list — and a batch of hardening landed around identity edge cases found while auditing this area. If a paint still doesn’t show somewhere, that report is exactly what this build is fishing for.

Build 292 —

The deep performance build. A second full speed, battery and responsiveness sweep — launch, chat rendering, images, storage, networking and idle cost. Where 290 took the obvious wins, this one goes after what was left. Most of it should be invisible except that things happen sooner and the phone stays cooler; the handful you can actually feel are below.

A flick no longer flashes the message it started on. Press feedback on a chat row now waits a beat: press and hold still lights the message well before the haptic, but scrolling with strokes that begin on a message leaves it alone.

Your own message shows up on your screen the instant you send it. It used to wait for chat’s next redraw tick, so you’d hit send and see a beat of nothing. Nothing about sending changed — this is only how fast your own copy draws.

Dragging chat down to dismiss the keyboard hands off to the system’s own scroll instead of repositioning the list every frame while you’re scrolled up in history. No simulator or CI can see this one — if you scroll up into history and drag the keyboard away, real-device impressions are especially welcome.

Switching channels paints chat first, with the stream banner arriving a beat later rather than an empty state holding until it resolves. Rotating in split view now keeps both panes where you left them; before, both sides reset.

Battery. The EventSub connection asks for a longer keepalive instead of taking the default, and the stream-info poll stands down while the app is backgrounded. Idle cost should be meaningfully lower — worth comparing Settings › Battery against 291 over a normal day.

Emotes recover from a bad patch. If an emote host rate-limited us, emotes fell back to text for the rest of the session and never came back. That’s now bounded and self-healing.

Faster where you wait. Cold launch, channel open and the emote picker all do less work — the picker opens immediately rather than pausing on first open, and both : autocomplete and the picker’s search keep up with fast typing. In Settings, flipping one toggle no longer rebuilds every other section.

Build 291 —

The 290 feedback build. Everything here came out of the feedback wave on build 290: the reply strip dims under your finger again, and a swipe no longer opens whatever it slides across.

The reply strip dims again — without breaking anything. Build 288’s touch-down dim on the reply strip broke chat taps app-wide, so 290 removed it. It’s back now without the side effect: the strip visibly dims while your finger is down (stronger with Increase Contrast on), a tap opens the thread, a long press opens Message actions — and scroll strokes starting on the strip, a link, an emote, or an @mention all scroll chat normally.

Swipes don’t fire buttons anymore. A swipe-to-reply that started on an author name, a whisper caption, or a link or clip card could open that thing when you lifted your finger. Now the swipe only arms a reply; taps still open things.

Mention colors stop flashing. @mentions of people whose messages had scrolled out of the buffer flashed to plain white for seconds at a time. Mentions now remember each chatter’s most recent color, so they hold their color in every channel even after that person’s messages age out.

7TV emotes load faster. Emotes needed by rows already on screen no longer wait behind background downloads, and tapping an emote shows its preview straight from the image already on screen instead of re-downloading a bigger copy. Painted names come back after the system clears memory, and replay chat under VODs and clips fills in painted names that were skipped while it was busy.

New: keep the screen awake. Settings › Behavior has a “Keep the screen awake” toggle, off by default. Turned on, your phone won’t auto-lock while Limerino is open; it locks on your normal timeout the moment you leave. It costs battery — that’s expected, and it’s why it ships off.

Quieter fixes. Cold launch no longer runs a duplicate credential check, and a launch-time failure in flaky-network recovery is fixed.

Build 290 —

Chat links and scrolling are back. On 288/289, tapping a link in chat did nothing, and scroll strokes starting on a link, @mention, or emote were swallowed — in an emote-heavy channel that made scrolling feel randomly stuck. Both were one defect and it is gone: links open the in-app browser again, @mention and emote taps work, and chat follows your finger wherever the stroke starts.

Also: the performance build. A full-app speed, memory, and battery pass — around a hundred verified fixes across chat, rendering, images, networking, launch, persistence, widgets, and video. Nothing new to look at; everything should simply feel faster and draw less power.

Chat stays glued to your finger. The busiest channels scroll smoother: rows do less work per message, messages held during a drag land in one clean batch when you let go, and returning from the background catches up instantly instead of hitching on the first frame.

Battery. Animated emotes stop consuming power when offscreen or backgrounded, idle timers stand down when there is nothing to poll, widget refreshes no longer double up, and closing the video player fully releases it instead of holding it for the rest of the session.

Launch and channel open. Saved tabs appear immediately on a cold launch, channel history shows up sooner when you open a channel, and a notification tap during launch opens its channel without waiting for the other tabs to load. Badges and emotes may pop in a beat after the text on a cold cache — that’s the new parallel loading.

Sharper avatars, steadier paints. Avatars now decode at exactly the size they are drawn — and stay crisp through text-size changes — and 7TV paints recover cleanly from memory pressure instead of staying flat until relaunch. Channel-switcher live times now show minute precision (“2h13m”) instead of ticking seconds — deliberate.

Build 289 —

The 7TV paints build. A full audit of every surface that draws username paints, fixed in one pass. If you don’t use 7TV cosmetics, nothing changes.

Gradient paints survive the light theme. On the light theme, a gradient paint could silently fall back to a flat color on tinted rows — most visibly when someone mentions you. The contrast math now lifts gradients the same way it already lifted flat colors, so painted names stay painted and readable.

Event rows finally paint. Subscribe, cheer, raid, ban, redemption, and AutoMod rows could show a name without its paint or badges depending on which of Twitch’s event channels delivered the row. They now always carry the person’s real identity — on a raid it’s the raider who gets their paint, not the channel you’re watching.

Paints in replay chat and whispers. Chat replay under VODs and clips now backfills paints and badges as rows scroll past, whisper senders get theirs, and your own name is painted in your own DM threads.

Paint changes no longer stick until relaunch. Acquiring, changing, or removing a paint shows up in the app within 30 minutes. Image paints retry after a failed fetch instead of staying flat all session, deleted messages gray out the whole row in both layouts, translucent paints blend over your name color the way the 7TV site does, and paint shadows scale with your text size.

Build 288 —

The bug-report build. Every open user report from the last week got a root-cause fix.

Muted words stay hidden everywhere. Obscure-phrase masking used to reach only the main chat rows. It now covers the mentions inbox, reply previews, the highlights inbox, channel logs, the user card’s recent messages, whisper previews and bubbles — and what VoiceOver speaks. Report and Copy deliberately keep the true text so moderation still works.

Messages full of new emotes no longer stall. A message carrying several not-yet-cached emotes could sit empty for seconds while the whole app’s emotes decoded a few at a time in the background. Decoding is now counted per screen tier, and the emotes you can see decode at interactive priority.

Moderators can pin their own messages. Your own message becomes pinnable a few seconds after sending, once Twitch confirms its copy — and Unpin now appears on the pinned row itself whenever that row is the channel’s current pin.

Swipe-to-reply no longer opens the thread. Replying to a threaded message could open the thread viewer mid-swipe. A reply swipe now only arms the composer; the thread opens on a deliberate tap of the reply strip — which also dims on touch so you can see it registered.

First round of battery and heat work. The app now notices Low Power Mode and thermal pressure: animated emotes halve their frame rate, new-message animations switch off, 7TV name-color effects simplify, and an internal poll stops running hot.

Build 287 —

Signing in stays signed in. A slow or flaky credential check no longer shows you signed out over a perfectly good login — the app keeps you signed in while it retries quietly — and a sign-in that fails now says so instead of doing nothing. Two rare races that could genuinely lose a stored login are closed.

7TV paints appear reliably. Chatter paints that never showed up (busy channels especially) now arrive with their messages, a paint someone removed no longer lingers, and your own paint survives backgrounding.

Inline pictures from upload hosts are now opt-in. A new switch under Settings › Chat display — off by default — controls whether kappa.lol-style image links show their picture in chat. Off means a link stays a plain link and the app never contacts those hosts for messages other people post. imgur, Discord, and Twitter previews are unchanged. Uploading itself is unchanged and still on by default.

And a full review sweep of 1.1.1: zero-width emotes now overlay on emoji, moderation captions can no longer name the wrong moderator, stream uptime no longer lags, the theater stops announcing video that isn’t playing and can’t restart audio under an in-app browser sheet, highlighted rows and custom name colors render truer, and animated emotes show their art sooner.

Build 286 —

Image uploads are on by default. The plus button’s photo option is now there out of the box — no toggle hunt — uploading to kappa.lol unless you point it at your own host. Nothing uploads on its own: an image leaves the device only when you attach or paste one yourself, with location and camera metadata stripped first. If you turned Upload images off — or ran build 285, which shipped it off — your saved choice stays exactly as it is; flip it on in Settings › Chat display › Image uploads. The privacy policy spells out the new default in plain words.

Build 285 —

Upload images from the composer. A new Image uploads section under Settings › Chat display — off by default — adds a plus button to the message box for photos and pasted images. Pictures upload to kappa.lol out of the box, or to a host you configure yourself, and the link lands in your draft ready to send. Location and camera metadata are stripped before anything leaves the device, and oversized images are refused rather than decoded.

Image links show the picture. Links from the upload hosts render inline in chat as image cards — loading, loaded, or a clear Image unavailable, never a silent gap. Muted-phrase rules hide the picture along with the words, deleted messages take their images with them, and at most three cards show per message.

Username paints show up reliably. 7TV paints used to depend on luck — the app only learned about them from live events while you watched. It now fetches them directly: your own paint appears right after launch, and everyone else’s as their messages arrive.

Emotes in the message box always resolve. Rapidly inserting several emotes stranded all but the last as a blank placeholder. Every insert now keeps its artwork, and an emote whose image cannot load becomes its readable name instead of a paper icon.

Tap a mention to go there. Tapping a mention in the Mention Vault opens that channel and scrolls to the message when it’s recent enough to still be in the buffer.

Timestamps drop the seconds. Message history and inbox rows now show 1 min ago rather than a ticking seconds counter, on every surface, spoken the same way it is shown.

Timed-out and banned messages say which and how long. Moderated messages carry their duration and kind — and if you moderate the channel, the acting moderator’s name, visible only to moderators.

Smoother video, faster chat reveal. The player work from this cycle lands: hiding chat in landscape idles chat work until you reveal it again, the theater dismisses with a downward flick, and a dead video frame recovers or offers Retry instead of staying black.

1.1.0 Profiles, Discord, moderation, and the feature-suggestion wave Builds 273 to 284

Build 284 —

Blocking someone now stops their whispers. Blocking hid a person's chat messages but their private messages still arrived: the thread appeared, the badge rose, and the notification showed their name and message. All of it now stops at the door. Conversations you already had with them are hidden rather than deleted — unblock in Settings › Rules and they return, unread state intact.

Report and Block live in the conversation. Every whisper thread now carries its own menu: report their newest message, or block them on the spot — the same confirmation and the same immediate effect as blocking from a user card in chat.

The inbox is honest about what it hides. When your rules hide every conversation, the whispers tab now says Whispers hidden with the count, instead of claiming the inbox was always empty — and Clear all stays available there, hidden conversations included, exactly as its dialog says. The @ button's badge no longer counts conversations you cannot see, so it can always be cleared by reading what it points at.

A muted word hides the conversation showing it. If the newest incoming message in a whisper conversation contains a word you muted, that conversation leaves the list until a newer clean message arrives. Your own sent messages never hide a conversation, whatever they contain.

Blocking from Settings now matches blocking from chat. Adding a blocked user under Settings › Rules also removes their messages already on screen and unsaves anything of theirs you bookmarked — previously only the user-card block did that, and the screen now says so.

Pick an accent, and find your way back. Appearance settings gain a row of curated accent colours beside your own custom pick, plus a one-tap Reset to default back to the original purple — the only route back used to be resetting every setting. Custom colours also store exactly now, so a picked shade never drifts on its way in.

Build 283 —

Chat starts flowing again almost immediately when you reopen the app. This one kept coming back because it was never a single bug. The delay that mattered most: every reconnect re-joined every open channel, and each re-join queued a full round of emote and badge downloads onto the same queue that delivers messages. Live chat waited behind that work, which is why it looked like nothing, nothing, then a wall of chat. The more channels you kept open, the worse it got. One narrower case survives, specific to very short backgrounds, and is deliberately left alone until it can be measured rather than guessed at.

Reconnects also re-download far less. A side effect of the same fix: a reconnect no longer re-fetches emotes and badges it already holds, so it is lighter on mobile data. They still have to be correct afterwards, so a channel whose emotes go missing or whose badges vanish after a reconnect is worth reporting.

Sending a whisper no longer freezes the app. Reported on 281: the first whisper to someone opened the composer and the app stopped responding. A first whisper does an identity lookup a reply does not, and that lookup could wait indefinitely on a token renewal nothing was able to interrupt. It now sends, or fails visibly — never hangs.

You can start a whisper from a message. Long-press any message for Send whisper to <name>. The row stays visible but inert when it cannot work, rather than disappearing, so the menu keeps a stable shape.

Switching theme no longer leaves text you cannot read. Reported on 282 from both directions. Changing the theme while Settings was open repainted the explicitly themed rows and left everything drawing in the system ink on the previous polarity, so labels turned white-on-white or black-on-black until you closed and reopened the sheet.

A reply you send appears once. Twitch echoes your reply back with an @-prefix that the app did not recognise as its own copy, so the message could show twice.

Crediting is on by default when you are signed in. Report a Bug and Suggest a Feature now start with Include my username switched on, so your post is credited to you. Turn it off before sending if you would rather not be named.

You should not be signed out unexpectedly. Renewing your Twitch session takes two steps, and Twitch retires the old key as soon as the first succeeds. If the second failed on a weak connection, the app could hold on to the retired key and present it later, and Twitch’s refusal read as a revoked session. This build keeps the new key on every path. If you are ever signed out without tapping Sign Out, that is worth reporting.

Build 282 —

“Include my name” is now “Include my username”. When you file a bug report or a suggestion while signed in, you can choose to have the post credited to you. The switch used to say “name”, which read as though the app held your real one and was about to publish it. It never did and never could: what gets credited is a handle — your Twitch display name, or your Discord username if you have linked one.

The sheet now tells you everything a credited post carries. Turning the switch on also publishes a link to your profile and, on the Discord side, your profile picture. That was always true and was never written down. Consenting to “my username” and then finding your picture on a public thread is more than you agreed to, so the sheet and the privacy policy both say it plainly now.

One privacy-policy sentence was wrong, and is fixed. The policy said no copy of your name is kept. Read as a flat statement that was untrue: if you attach diagnostics — on by default for a bug report — your Twitch username is kept for 180 days. The claim is now scoped to the thing it was always about: crediting keeps no copy of your username.

Nothing else changed in this build. If something outside the feedback sheets looks different, it is worth reporting.

Build 281 —

/me no longer forces a line break. An action message used to render on two lines whatever your settings said. It now follows “Break line after username” like every other message, so the setting you already have is the switch — and there is no colon after the name, which was never right punctuation for third-person narration. Asked for by a tester.

Whispers in chat, corrected. A mirrored whisper painted the sender’s name in a colour they never chose; it now uses their real one, resolved separately because a whisper carries no colour of its own. The whisper composer’s text sat low, out of line with the send button, and now sits straight at every text size. Five smaller things were closed at the same time: a channel you close as a whisper arrives no longer reappears holding it, tapping the caption always opens the conversation rather than the list, reporting a DM no longer says it was posted in whatever channel you were watching, a moderator’s /clear can no longer strike one through, and VoiceOver announces an arriving whisper once, as a whisper.

You can reply to your own messages. Twitch never echoes your message back to you, so until now the reply actions on it stayed dead until you left the app and came back. They arrive a few seconds after you send instead. Delete and Pin deliberately stay out of that route: identifying your own message this way is a good enough match to thread a reply, which you can undo, and not good enough to arm something you cannot.

Five badges instead of four, with the last slot held for a 7TV badge — it was appended last, so the old cap cut it first and the people paying for it saw it nowhere. Broadcaster, moderator and VIP always survive the cap.

Report is on the long-press menu in Mentions, where reaching it used to mean a swipe. Several VoiceOver rotors were reordered to match: on a chat message “Message actions” now comes first rather than behind Delete, Ban and Timeout, and in chat “Pause auto-scroll” comes before “Jump to newest”. And one unreadable value in the settings file no longer resets every other setting with it.

Build 280 —

Whispers now appear in chat. A whisper you receive — or send — also shows up as a row in the channel you are watching, so you notice a DM without leaving chat. The row is captioned above the message: an envelope and “Whisper from name” for one you received, a paper plane and “Whisper to name” for one you sent. Tap the caption to open that conversation directly.

It is a copy, not a move. The whisper still lives in the inbox behind the @ button, still counts once toward the unread badge, and still sends exactly one notification no matter how many channels you have open. It is never written to a channel log, and it will not come back in that channel’s history after a relaunch. A mirrored DM also stays outside the channel entirely: a moderator there cannot act on it, it will not put your DM partner into that channel’s name autocomplete, and a timeout in the channel cannot strike through a private message.

Two switches in Settings ▸ Behavior, both on by default. “Show whispers in chat” turns the whole thing off — and clears any already on screen. “Highlight whispers in chat” controls only the tint; with it off the row keeps its caption and its envelope, just quieter.

Build 279 —

The feature-suggestion wave: nine features testers asked for, shipping together — alongside the Profile and Inbox pass below. Every feature here began as a suggestion.

Suggest names without typing @. Opt in under Settings › Typing and the composer offers recent chatters from the first letters of their name — no @ needed — in a second row above the emote suggestions; tapping a chip inserts the real @mention. Matching follows display names too, so a chatter with a non-Latin name is findable by the name you actually see. The emote strip itself now scrolls through up to 24 matches instead of stopping at five.

Muted phrases can obscure instead of hide. Each muted phrase now has a mode: Block hides the whole message as before, while Obscure shows the message with the phrase masked out. Existing phrases stay Block after updating, and VoiceOver never reads the muted word aloud.

7TV badges. Chat rows now show 7TV user badges after the Twitch, BTTV, and FFZ ones — animated badges keep their calm static art in the row, and VoiceOver speaks the badge’s name.

Live dots in the channel switcher. Open and Favorites rows carry a subtle dot when the channel is live, and an optional “Sort live channels first” floats them to the top without touching your manual order when it’s off.

Recently used emotes open the emote menu, alternating row backgrounds (opt-in) make fast channels easier to track, and 7TV name paints can now be turned off if painted usernames feel noisy.

Credit where it’s due. Bug reports and suggestions can now carry your Twitch identity — opt-in at filing time, off by default — and fixed items credit their reporters. The privacy policy describes exactly what is shared.

The Profile page and the mentions Inbox got a full pass. Both surfaces are faster, and a long-standing creator bug is fixed at the root.

“Some creator stats couldn’t load” is gone. Twitch answers the ad-schedule read in a shape its own docs don’t describe; the stats section now reads it correctly, so affiliate and partner accounts see all five creator tiles — and an ad that isn’t scheduled says “Not scheduled” instead of failing the whole section.

Profile settles faster. The screen fires all of its reads at once instead of waiting on the first one, skeletons keep their final size, and sections no longer shuffle while loading.

Discord moved to the top of Profile — right under your identity, so linking is discoverable without scrolling. Same rows, same behavior, just where you can see it.

The mentions Inbox scrolls smoother through deep histories, rows open the channel from every route, “Clear filters” also clears the search text, and the empty states stay scrollable at the largest accessibility text sizes — the recovery button can always be reached.

Quieter pull-to-refresh everywhere on Profile. A pull that joins a refresh already in flight no longer announces someone else’s outcome — it reports only what it actually did.

Build 278 —

Linking Discord no longer takes a trip through the browser. Tap Authorize on Discord’s consent screen and you land straight back in Limerino — the in-between browser flash is gone. Without the Discord app installed, the browser route still works exactly as before.

The change lives on the server, so it reaches every build — this one exists so testers can verify the round trip on a real device. If the first tap ever drops you back on a “Didn’t finish?” row, that is a bug worth reporting, not a retry.

Build 277 —

A bug-fix wave: every open user report was investigated and fixed. Thank you for filing them — each one below started as one of your reports.

Long press works everywhere. The message menu now opens from a long press on a username, an emote, a link, or plain text — and near the stream-title card on an offline channel, which used to be a dead zone. Reply on your own just-sent message is held with a visible hint until the message syncs (before, such a reply silently failed to thread). Selecting text inside a message was removed — it raced the long press; the menu’s Copy text replaces it.

The mentions badge stopped snapping back to 99+. It now counts only what arrived since you last looked, and remembers that across launches.

Deleting a mention sticks. Every row offers Delete, deleted mentions stay deleted after backgrounding or relaunching, and the action is reachable with VoiceOver.

Animated emotes start on time and move in step. No more multi-second freezes, and every copy of the same emote animates in sync.

Launch got lighter. Two heavyweight pieces of launch work — a hidden web page load and an unbounded image-decode burst — are gone. If your phone ever felt slow right after opening the app, this build should fix it; please report either way.

Also fixed: blocked users can no longer appear through reply previews, thread highlighting survives message sync, and the pinned or saved message card menus say what they copy.

Build 276 —

A message you send with a line break in it no longer comes back twice. Build 275 fixed how such a message renders; this build fixes the copy underneath. The app kept your typed text while the chat service carried its own spaced form of the same message, so once history caught up — a reconnect, a return from the background, the recent messages on a user card — your message could appear again as a duplicate. The app now stores exactly what actually went out, and the two copies pair up the way they always should have.

Everything from build 275 is included unchanged.

Build 275 —

A Profile button in the chat header. The person glyph beside the gear opens your Profile straight from chat, without a trip through Settings.

One moderation button instead of two. For moderators, the AutoMod queue and the moderator log now share a single shield button that opens a short menu — the same two screens, one slot in the header. The space that frees goes to the channel name rather than to another glyph, so on narrow phones a moderator can finally read the channel they are in. Where the profile glyph gives way to that, a press and hold on the channel name offers it, and Settings has it as always.

Link your Discord account. Profile has a Discord section now. Linking connects your Discord account to Limerino and adds you to the Limerino Discord server; Limerino stores your Discord username so the server knows who you are, and you can unlink at any time. Feedback you send from inside the app also carries its status on the thread it opens there.

The approval happens in Discord itself. Tapping “Link Discord” opens the Discord app, so you approve on Discord’s own screen as the account already signed in on your phone — rather than signing in again in a small web window inside Limerino. With the Discord app not installed, the same button opens your default browser instead. Neither leg puts a web window inside Limerino.

Coming back part-way is not a dead end. Leave the approval screen without finishing and the row quietly offers to pick the link back up, or to cancel it — no alert, no banner. If a hand-off to the app went nowhere, picking it back up opens the browser rather than knocking on the same door twice. Nothing else about linking changed: the same permissions are asked for, the same server join follows, and unlinking behaves as before.

A line break no longer scatters a message you send. Sending a message with a hard line break in it — dictated, or pasted — could leave your own copy of it with half its words dropped below the line and the rest lifted above. It sits on one baseline now.

Everything from build 274 is included unchanged.

Build 274 —

Recent messages now reach back about an hour. Tap a chatter’s name and the “Recent messages” section no longer shows only what your device happened to catch — it reaches back up to an hour in that channel, including messages sent before you opened the app. The list starts collapsed, rows carry a relative timestamp, and history stays per-channel. When there is nothing to show, the wording tells you which it is: nothing said in the channel, or only what this device saw.

A Profile page. Settings now opens with a card carrying your avatar, display name and login; tapping it opens the full page — your name colour in chat, your bio, the channels you follow, the people you have blocked, and a summary of your own channel.

Your channel, editable from the app. Everyone on Twitch has a channel, so the editor is there whether or not you stream: title, category, tags, and the content labels Twitch shows viewers before a stream.

Sections that stay out of the way. Your emotes and the channels you moderate get their own sections, and they are simply absent when empty rather than telling you that you have none. Affiliates and partners also get a stats section; plain viewers never see it. Each section loads on its own, so one that fails offers its own retry instead of an alert over the whole page.

Honest about what Twitch will not let an app change. Bio edits write straight to your Twitch account, and anything over 300 characters is refused rather than quietly trimmed. Username, display name, profile picture and email stay managed on Twitch — the screen says so and links out instead of offering fields that could never work.

One more sign-in for the richer sections. Some of the new sections need Twitch permissions the app has never asked for. Until you grant them, those rows say so plainly and take you to Account, where the new capabilities are listed in plain words rather than raw permission names. Declining costs nothing — chat and mention alerts are untouched either way.

Two obsolete Twitch permissions were also dropped from what the app asks for at sign-in; whispers send and arrive exactly as before. Everything from build 273 is included unchanged.

Build 273 —

First build of 1.1.0.

Turn every mention-alert channel off (or on) in one press. The Channels list in Mention alerts now starts with a “Turn All Channels Off” row: press it and every followed channel’s toggle flips off together, then turn on just the channels you want alerts from. Once everything is off, the same row turns everything back on. If you’ve hand-picked a mix, the app asks before wiping your selection; channels you follow later start with alerts on.

Alerts moved to the top of Settings. Mention alerts and Activity alerts now sit first, in one Alerts section, with Support directly below.

Settings groups start closed. Appearance and Chat display no longer drop open every time Settings opens — every collapsible group starts closed, so the root reads as a short index.

Everything from 1.0.9 is included unchanged.

1.0.9 Reply threads and moderator tools Builds 270 to 272, shipped

Final 1.0.9 release notes

Build 272 —

Filter notices tell the truth. When the message that started a reply thread is hidden, the note above the thread now says your filters hid it. The old copy claimed you had blocked the person, which was wrong whenever a muted phrase — not a block — did the hiding.

Muted phrases say when they apply. The Muted phrases screen now notes that a new phrase applies to messages from now on; it does not reach back through chat you already have.

VoiceOver reads reply threads in one breath. Opening a thread whose starting message is hidden announces the loaded thread and the filter caveat together instead of interrupting itself, and the announcement no longer fires after the sheet is closed.

Also carries the final round of pre-release hardening for 1.0.9. Everything from build 271 is included unchanged.

Build 271 —

7TV channel emotes keep working past August 3. 7TV is changing how a channel’s emote set is delivered: the app used to receive it together with the channel’s profile, and from August 3 it has to ask for it separately. Without that change a channel’s 7TV emotes would simply stop appearing — and silently, with no error and no empty state, just the emote names rendered as plain text. Live emote updates would stop arriving too, so an emote added or renamed while you were watching would never show up.

Behaviour before August 3 is unchanged, so this build should look and feel exactly like build 270. Nothing to turn on.

Global 7TV emotes, personal 7TV emotes, and 7TV badges and paints were never affected. Neither were BTTV, FFZ or Twitch emotes. A channel with no 7TV emote set attached still shows none, which is correct rather than a failure.

If 7TV is unreachable or rate-limiting, the app now keeps the emotes it already had and retries, instead of blanking them.

Everything from build 270 is included unchanged.

Background audio and Picture-in-Picture withdrawn —

Background audio is off again. Leaving the app now always pauses the stream, and Picture-in-Picture is disabled. The build-254 “keep listening when you leave” behavior depended on a background-audio capability we have withdrawn after App Review’s Guideline 2.5.4 finding, so playback stops when you leave and resumes when you come back.

Build 270 —

Reply threads open where you are reading. Tap the reply line above a message, or choose View reply thread from message actions, and the conversation opens in place with live chat still visible behind it. It opens half height and pulls up to full; the message you came from stays on screen. The thread is a snapshot on purpose — it will not grow or reshuffle while you read it — and Follow reply thread keeps up with one that is still going. If the thread started further back than the app still holds, you get a short note saying so rather than a broken pane.

Moderators can delete a message from the app. In channels you moderate, message actions and the user card both offer Delete. Deleted messages appear struck through and dimmed, or disappear entirely if Hide deleted messages is on. The option only appears where you actually moderate.

Message history now means what it says. The slider used to govern only how much chat was kept in memory — how far back a channel loaded when you opened it was always about a hundred lines, whatever you set. One dial now does both, so raising it and reopening a busy channel lands you noticeably deeper. Backfill is deliberately capped at half the slider so a busy channel does not start discarding messages the moment you arrive.

Mentions from while you were away are no longer missed. Signing back in used to leave older mentions unexamined, so a mention further back than the newest hundred messages could never reach the inbox. History also appears on a cold launch without waiting for sign-in to finish.

Highlight rules can be regular expressions. Settings, Highlights, then mark a rule as a pattern. Existing plain-text rules keep working exactly as before, and an invalid pattern is explained in the editor instead of being quietly ignored.

Replies to your own messages can stop alerting you. Turn reply pings off and a reply sends no notification while ordinary mentions still arrive. The choice survives relaunching and signing out and back in.

Tapping a username shows their recent messages. The user card fills from chat the app already has, so nothing is fetched.

Tapping chat dismisses the keyboard. Tapping a message, username or emote still does its own thing.

One player capability was withdrawn in this build: playback now pauses whenever the app is not on screen, and the floating window is off. Rotating, the app switcher and a sheet over the player all still count as on screen, so playback should not stop for any of them.

iPad remains iPhone-scaled for now.

1.0.8 Clips, videos, and chat replay Builds 253 to 269, shipped

Final 1.0.8 release notes

Build 269 —

FrankerFaceZ channel emotes load for the first time. A decoding bug meant a channel’s own FFZ emotes had never rendered in any build — the response was quietly discarded on every fetch, in every channel, since 1.0. They now appear in chat and in the picker’s channel section. Global FFZ emotes and FFZ badge art were always fine and are untouched.

Scrolling your mentions is smooth. The stutter was mostly not the list’s fault: the live chat behind the sheet kept re-rendering at full rate while completely covered. It now updates in small batches while obscured, and the list itself does far less work per frame — older pages load mid-fling without hitching the scroll.

Badge and cheermote art is cached like emotes. Subscriber tiers, mod and VIP art, bits, and third-party user badges are on disk now, so they are there the moment chat appears instead of popping in a beat later. Clearing the emote cache in Settings clears these too.

The emote picker warms up before you open it. The first screenful of images in a big channel arrives pre-loaded instead of filling in square by square.

One bad emote can no longer cost the whole set. A malformed record from any provider now drops only itself — and a provider outage is no longer mistaken for “this channel has no emotes,” so a temporary failure can’t wipe art the app already had.

VoiceOver reads mention times. Each row in the mentions inbox now speaks the same relative time it shows.

Under a memory warning, animated emotes may briefly reload while scrolling; the cache recovers on its own within a couple of minutes of continued use.

Build 268 —

Reading your inbox actually clears it. Since build 261, closing the mentions inbox only marked the rows that had physically rendered on screen — a glance at the first screenful turned 66 into 62, and the remaining number could not be cleared by anything short of scrolling your entire history row by row. Closing the inbox after viewing the mentions tab now marks the device-held mentions read, the way every inbox behaves. Your Mention Vault on the server is untouched, and whisper read-state still belongs to the conversation view alone.

The regression is pinned the hard way: the test harness deliberately re-inflicts the old behavior and requires the suite to go red, and a second test proves a relaunch cannot resurrect rows you already dismissed.

Build 267 —

The badge fix from 266, hardened. Review found two ways the new “answered-for” marker could get the timing wrong, and both failed silently toward a badge that never shows. A mention arriving during the server round trip could be discarded — newer than your last read, older than the marker — so the marker is now stamped when the question is asked, which is the moment the answer actually describes. And a clock set backwards could strand the marker in the future, where it would outrank every genuine mention forever; a future marker is now ignored outright, which fails toward showing the badge — the recoverable direction.

The fix is also proven by breaking it: the build deliberately re-introduces four variants of the defect and requires the tests to go red each time. No new features in this build on purpose.

Build 266 —

The Home Screen badge that nothing could clear, fixed at its source. The number was not coming from the server — it came from old mention notifications still sitting in Notification Center. Each one carries the unread count it was sent with, none of them expire on their own, and the app read them back as if they were current, so the same stale number re-elected itself on every launch. The app now records the moment you last answered for your mentions — opening the inbox, or an exact unread reading from the server — and payloads older than that moment stop counting. The marker is written to disk, so it survives force-quit, relaunch, and reboot.

Build 265 —

The @ badge no longer shows “…” instead of a number. The count capsule was hung off the @ glyph, and SwiftUI offers an overlay only as much room as the thing it decorates — about one character. One unread looked right; anything from ten upward truncated. It sizes to its own text now, and it no longer drifts when chat moves underneath it.

A Home Screen badge that nothing could clear. The app carried the previous launch’s Home Screen number forward as a floor only the server could lower, so if that answer never arrived the number re-elected itself on every launch — with no unread anywhere in the app to match it. Opening the mentions inbox clears that carried-over number; a real unread count is untouched.

The inbox and the Home Screen agree about what you have read. A mention arriving while the inbox was refreshing could be dropped from the in-app badge while the Home Screen kept showing it. Both surfaces now move together.

One page per scroll in the mentions inbox. Reaching the bottom used to pull your entire history, page after page, each one rewriting the whole window to disk on the main thread while your finger was still moving. That is also why the list jumped under your thumb and why there was an invisible gap between older history and recent mentions.

Emotes are grouped by channel in the picker, with a rail to jump between sections, and search matches a streamer’s name as well as an emote code. Typing a name you could see as a header used to return no results.

The emote image cache sits outside your device backup and prunes itself to a ceiling that actually binds — the old one freed zero bytes when it ran. A failed image no longer refetches on every scroll past it.

AutoMod held-message notices name the channel again. They had been addressed to a numeric ID rather than a channel name for about six weeks, so they never rendered.

Two untrue claims in the bundled Terms are corrected: Report opens the reported user’s Twitch page and sends nothing itself, and turning an emote provider off removes its emotes without cutting every connection to that service.

Build 264 —

The @ badge shows your unread count. The number on the header @ button was assembled from counters kept only on this phone, but a mention that arrives while the app is closed is stored with your account and writes nothing locally — so on most phones the badge had nothing to count and showed no number at all. It now reads your real unread count on a cold launch, drops to zero when you open the inbox, and stays there through a relaunch or a refresh. Mentions you have already read elsewhere are not counted twice.

Deleting your mention history clears the list too. Confirming the delete under Settings → Mention Vault & data removed the stored copy but left every row on screen — and those rows offered no swipe-to-delete, so there was no way to be rid of them at all. They go with it now. The dialog is clearer as well: it names the Mention Vault, and states plainly that mentions saved on this device stay in the Mentions list.

Sorting by channel or by who mentioned you is real. Both options were sending the same request as Newest, so a channel could be listed with three mentions when it had forty. The grouping is genuine now, and paging further into the list keeps it instead of quietly reverting to newest-first.

A lighter cold launch in emote-heavy channels. Emote metadata was being written one provider at a time through the same queue the rest of the emote cache waits on, right on the launch path, at up to a couple of thousand records apiece. That work no longer sits in front of a cold start.

Two redundant glyphs left the player strip. The duplicate following heart and the session checkmark are gone. Nothing else on that row moved.

Build 263 —

Emotes are kept between launches. Every launch used to re-fetch every provider for every channel, and until those arrived your emotes rendered as plain text. They are stored now, so they appear immediately — with no connection at all, too. Turning a provider off still removes its emotes rather than resurrecting them from the cache, and Clear emote cache now clears the stored emote lists as well as the images, which it previously left behind.

The emote picker names the channel you’re in. Subscription emotes were filed under a single header reading “Channel”, so if you subscribe to thirty channels, thirty channels’ worth of sub emotes looked like they belonged to the one you were typing in. The sections now read the channel’s own name, then Your Emotes, then Global. A channel with no emotes of its own no longer shows an empty header, the pinned header stops at two lines at large text sizes, and VoiceOver names each emote’s provider.

Mentions scroll smoothly at the end of the list. Reaching the bottom of a fully-paged mention list rewrote the whole visible window to storage, one write per row on screen — set off by a paging attempt that had already worked out there was nothing left to fetch. That write is skipped when nothing has changed.

A new app icon. Same speech bubble, same purple, rebuilt to hold its shape when it is small. The old one sat so close in tone to its own background that at Spotlight and Settings sizes it collapsed into a purple square with two dots. Dark and tinted home-screen icons are drawn properly now, rather than improvised from the light one.

Build 262 —

Search and filters in the Mentions inbox. The sorting and filtering controls were unreachable: the app asked whether filtering was supported in a way that could only ever answer no, then hid the controls that would have answered yes. A search field and a Filters button now sit above the list — sort newest or oldest, narrow to today, the last 7 days or the last 30, or search by sender. Paging with a filter on no longer dead-ends, and it no longer reports a connection problem that isn’t there.

Replies stop showing the name twice. A reply arrives with “@name” already prepended to its text, and the app was drawing both that prefix and its own reply chip, so the body you read didn’t match the message as it was sent. The chip stays and the duplicated prefix goes — including in the break-line-after-username layout and in /me replies — and emotes still line up with the right words. Only that automatic prefix is removed: if someone typed your name themselves, it stays. VoiceOver names the person being replied to once.

Mention colors tell the truth. A name the app hadn’t actually seen post was given an invented color and shown confidently — so a broadcaster mentioned before they type, which is the common case, could come out red when their real color is green. A mention now uses the person’s real color when it is known, and plain body text when it is not. Still bold, still tappable.

Muting hides messages, it never deletes them. A muted phrase used to destroy matching messages before they were ever saved, so unmuting could not bring them back. They are simply hidden now: unmute the phrase and they are still there in that channel’s logs. Blocking a person still removes their messages outright, which is deliberate and different. Channel logs, the log export, and the recent-highlights inbox all respect your block and mute rules now, instead of showing content you’d asked not to see.

Build 261 —

One mentions list instead of two. The Mentions tab and the Mention Vault were two screens over two separate stores, so a mention could sit in one and be missing from the other. They are a single list now — what this device saw plus your account’s history, merged and deduplicated — and the header @ button and Settings → Mention Vault & data open the same list. Loading older walks to the end without repeating anything.

No banners while you’re in the app. Being @-mentioned with the app open no longer fires a banner or a sound over what you are reading. Nothing is dropped — the alert still lands in Notification Center, and a mention that arrives while the app is in the background still banners as before.

Deleting a mention asks first. Swipe to delete now confirms, because it is permanent and it reaches your stored history. The toolbar’s Clear says what it has always actually done: it removes mentions saved on this device, and points at Settings for the rest.

Settings say what they do. Custom highlights get an Edit button, so you can reorder or delete without the swipe, and reordering is reachable with VoiceOver and Switch Control. Controls that did nothing while their parent switch was off — the mention highlight color, sound on highlight, autoplay on Wi-Fi — are disabled now, and name the switch that governs them. The “+N” chip is no longer a third the height of its neighbors at 200% text. Signing out no longer resets your suppress-banners-while-watching-live preference.

Three privacy claims corrected. Settings → Privacy now describes what actually happens: opening a channel does send your token to Twitch, while the third-party emote and badge providers receive neither a token nor any identifier; uninstalling the app cannot remove your push token, though turning alerts off or signing out removes it immediately; and the video player’s Twitch cookies do go to Twitch, and never reach Limerino’s own server.

Build 260 —

The chat header floats over chat. The channel-name bar at the top of chat is now real glass: messages scroll underneath it and blur through it, instead of stopping dead at a hard line below it. The status-bar row above stays clear, and channels with video are unchanged — chat never paints over the player.

Any accent color stays readable. Pale and very dark accent picks used to render text that was effectively invisible. Text drawn in the accent, and text drawn on an accent fill, now both hold a readable contrast floor whatever you choose. On the light theme this flips outgoing whisper bubbles and the highlights badge to dark ink.

Deleted messages read as deleted. A moderated message now drains to grayscale as well as striking through its text. The strike never crossed an emote, so an emote-only deletion used to look like live chat. Deleted messages are no longer dimmed, which had pushed them below the readable contrast floor.

Composer fixes. The autocomplete strip now stacks above the reply and failed-send banners instead of covering them. An over-limit draft shows a warning glyph rather than looking identical to an empty composer. The character counter no longer clips into the pill’s corner or jitters as you type. At accessibility text sizes the composer can grow taller so a long draft is actually visible.

Buttons respond to touch on older iOS. Floating glass controls — the jump-to-latest chevron, the new-messages pill, the autocomplete chips — had no press feedback at all on iOS 18 through 25, or with Reduce Transparency turned on. They do now.

Live Activity dismissal sticks. Swiping the Live Activity away now keeps it away, and it returns when the stream goes offline and live again — instead of either never coming back or reappearing every minute.

Build 259 —

Cold-launch chat starts immediately. Opening the app after a few hours away showed your channel filled with older messages and then nothing live for 20–40 seconds. Access tokens last about four hours, so on the first launch of the day the saved token had already expired — and the app skipped the “connect to chat right away” path that exists for exactly that moment. It now refreshes an expired token before checking it, and opens the chat connection as soon as the fresh one lands. Live messages should start within about a second.

Build 258 —

7TV username paints. Supporters’ gradient username colors now render on chat names, updating live when someone’s paint changes. Every paint is contrast-checked against your theme so names stay readable — and with Increase Contrast on, paints step aside for plain colors entirely. Your own name-color override always wins over a paint.

Live 7TV emote updates actually work now. A protocol bug meant emote adds, removals, and renames never reached an open channel — the connection quietly reset on every update. Emote changes now appear within seconds, no rejoin needed.

One channel list instead of two. The switcher’s separate Live tab is gone: Followed already puts live channels first, with live counts on the group headers, and search now favors live matches. Signing in from the Followed prompt lands on a populated list instead of a blank one.

The mention vault respects your blocks and mutes. Mentions from users you have blocked — or that match your mute rules — are now hidden in the vault like everywhere else, with an honest “hidden by your filters” state instead of a false “no mentions”, and a Report action on every row.

Build 257 —

Replay chat works on real, busy videos now. On many past broadcasts and clips — especially busy ones — the previous builds could show no chat column at all. The loader was rebuilt around how the service actually pages video chat: busy videos load fully, a partly-failed load keeps what it already fetched instead of going blank, and signed-in sessions that get refused fall back and retry automatically.

Quiet stretches no longer end the replay. A raid-out, a “starting soon” screen, or any long chat lull used to freeze replay chat for the rest of the video. Replay now probes ahead through silence and picks right back up when chat resumes — including after you seek backward past a lull you already crossed.

The full mention vault is one tap away. The @ inbox now ends with a link to your complete mention history on the server — the inbox itself only ever held mentions from channels you had open, which could read as missing mentions. The vault also pages more reliably on long histories, refreshes honestly when a sync fails, and sorts newest-first.

Build 256 —

Replay chat now keeps up for the whole video. On long past broadcasts, replay chat previously stopped advancing after a while even though the video kept playing. It now pages continuously — chat stays in step however long you watch, holds its place while the video is paused, and picks the pace right back up when you resume or seek.

Replay rows can be reported. Long-press any message in a replay to open the same Report Message sheet as live chat — filed reports show up under Settings → Reports as usual.

Your filters follow you into replays. Blocking a user or muting a phrase now applies to replay chat immediately, without reopening the video.

Activity alerts are real — and opt-in. The notification rows for subs, raids, channel-point redemptions, and first-time chatters now genuinely alert; they default to off so updating stays quiet. Mention pushes also stack instead of replacing one another.

Under-the-hood hardening. The enlarged emote card pins precisely to the emote you tapped, a moderator banning a pinned author now keeps the pin gone for good, and a full-version audit closed a long tail of smaller correctness and accessibility findings.

Build 255 —

Past broadcasts and clips now replay their chat. Watching a past broadcast or a clip finally looks like watching live — the video sits on top with the stream’s own chat replaying underneath (a side column in landscape), paced to where you are in the video. It’s read-only, so there’s no composer in the way.

See who made an emote. Tapping an emote to enlarge it now shows “by <creator>” beneath the provider when there’s an uploader to credit; native and global emotes simply omit it.

Mentions and notifications got sturdier. Quiet-style alerts no longer flash a banner while you’re in the app, muting a mention from a fully closed app now sticks on next launch, and your block list is protected from a cross-write if you switch accounts mid-sync.

Accessibility polish. The enlarged emote card reads its name, provider, and creator as one phrase; the player’s “Live” state stays reachable at every text size; and mention and whisper timestamps are spoken to Switch Control and Voice Control too.

Build 254 —

Mentions don’t get lost anymore. A mention that arrives while the app is closed now shows up in the Mentions inbox on your next launch, and the message row in chat keeps its highlight tint too. Read and cleared state also survives a force-quit — what you’ve dealt with stays dealt with.

Smarter notification summaries. A burst of mentions now lands as one “You have N missed messages” alert naming the latest channel, and older per-message banners for that channel fold into it instead of stacking up.

Tap an emote to see it up close. Tapping an emote in chat pops a preview card anchored right to it — tap anywhere, scroll, or rotate and it’s instantly gone.

Slash commands that know who you are. Typing “/” in a channel where you moderate now suggests the commands you can actually use there; everywhere else you keep the everyday set.

No more bottom-of-chat teleport. Overscrolling at the newest message no longer jumps you back into older history.

A calmer player bar. The portrait player’s bottom bar is slimmer and drops its redundant live badge — the uptime label already tells you the stream is live.

Keep listening when you leave. With a live stream playing, leaving the app keeps the audio going, and Picture-in-Picture appears when the system offers it. Pausing first still means silence, as it should.

Sort your videos. The videos browser can now sort past broadcasts by newest, trending, or most viewed with a time period, and filter clips by date range.

Build 253 —

A Videos button in the top bar. A channel’s past broadcasts and clips are now two taps away: a play button sits in the chat header whenever there’s room for it. On narrow layouts — smaller phones, Display Zoom, busy moderator rows — the button steps aside before the channel name would get squeezed, and the channel pill’s long-press menu still opens Channel videos everywhere.

Tapping a video actually plays it now. An earlier beta broke the browse list’s row taps — tapping a past broadcast or clip silently did nothing. The player now opens right over the list, and closing it puts you back where you left off.

Open in browser, fixed the same way. The player’s Open-in-browser action now opens Safari over the player. Playback pauses while Safari is up and resumes when you close it — and if you’d paused the video yourself first, it stays paused.

One audio source, always. Leaving the app and coming back with the player open no longer restarts the live stream’s audio underneath it, and nothing plays behind Safari until you close it.

Chat knows when it’s covered. While you browse videos, animated emotes pause their render clock, and a mention that arrives alerts you like it does when you’re elsewhere — instead of firing invisibly behind the sheet.