Limerino Beta — TestFlight build notes
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.3, the current beta · 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.3 Groundwork for the video player, and GIFs sent in chat Builds 330 to 334
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
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
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.