Commit graph

1272 commits

Author SHA1 Message Date
kaoru
93bbc3e9c3 fix(cast): keep relay alive during casting 2026-06-14 19:12:57 -04:00
namecallfilter
55c6646684
Merge pull request #3 from namecallfilter/feature/google-cast-local-relay
feat(android): add Google Cast with local HLS relay
2026-06-11 14:02:52 -04:00
kaoru
63bee797dc feat(cast): stream HLS through the local relay
- Forward relay query params to upstream playlist requests
- Stream media responses instead of buffering entire bodies
- Tune Cast receiver latency handling and require cast app id
2026-06-11 14:02:22 -04:00
kaoru
8bd74705aa feat(cast): add local relay live sync controls
- Lower cast target latency to 1s and move catch-up logic to the receiver
- Rewrite low-latency playlist parts through the relay with no-cache headers
- Improve LAN address selection and expand cast status reporting
2026-06-10 22:48:44 -04:00
kaoru
7c0facb8f2 feat(cast): add local Cast route picker
- Replace the hidden Android route button with an in-app route sheet
- Wire route discovery and selection through the stream proxy bridge
- Add cast picker state handling and widget coverage
2026-06-10 15:22:00 -04:00
kaoru
dbf606c1da Add Google Cast support with local HLS relay
- Add Cast receiver configuration and Android glue
- Proxy and rewrite HLS playback for Chromecast
- Surface cast state and controls in the Flutter UI
2026-06-10 12:55:48 -04:00
namecallfilter
9b7decab98
Merge pull request #1 from namecallfilter/sync/upstream-frosty
fix chat parsing and Flutter 3.44 release checks
2026-06-09 13:06:15 -04:00
kaoru
0b164e456b chore(sync): merge upstream frosty 2026-06-09 12:50:27 -04:00
Tommy Chow
8883af90f0 fix(ios): resolve Crashlytics upload-symbols for SPM builds
The Crashlytics 'Upload Symbols' build phase was hardcoded to the CocoaPods
path ($PODS_ROOT/FirebaseCrashlytics/upload-symbols), but Flutter 3.44 +
firebase_crashlytics 5.x resolve Firebase via Swift Package Manager, so that
path no longer exists and every release build (including fastlane build_app)
failed with 'No such file or directory'. Fall back to the SPM checkout path
when the pod isn't present so the upload works under either integration.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 23:39:51 -07:00
Tommy Chow
7f4abdefea ci: add release dry-run workflow and release-mode compile checks
Add a weekly + manual release-dryrun workflow that exercises the full store
pipeline without publishing: Android validates the AAB against Google Play
(validate_only), iOS builds a fully signed archive via match (readonly) and
skips the App Store upload. Both Fastlane lanes gain a dry_run option that
reuses the real release path so the dry-run stays faithful to it.

Also add release-mode compile checks (flutter build apk/ios --release) to CI
and PR checks to catch release-only breakage, pinning the JDK to match the
release toolchain. Trim ci.yml from a redundant 3-OS matrix to two
purpose-built jobs (analyze/test once on Linux, iOS build on macOS).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 23:15:38 -07:00
Tommy Chow
17bbb20b94 build(android): guard release signing to allow keyless compile checks
Release builds now use the real upload key when key.properties is present,
fall back to debug signing only when ALLOW_DEBUG_SIGNED_RELEASE is set (CI
compile-only checks), and otherwise fail loudly. Lets CI compile a release
APK without production secrets while ensuring a real release can never be
silently debug-signed if the keystore step goes missing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 23:15:38 -07:00
Tommy Chow
f5718e3656 fix(chat): restore channel assets when leaving shared chat
When a shared chat session ended, the participants' merged emotes and badges
stayed in the channel asset maps, so the other streamer's emote set and badges
kept showing (#522). Only the enter transition was handled.

Detect the leave transition (was shared, no longer shared) and reset: clear the
loaded-participant tracking and re-run getAssets(), which replaces the channel
emote/badge maps with this channel's own assets. Guarded on having actually
loaded shared assets so a flapping source-room-id tag can't cause redundant
refetches.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 22:42:37 -07:00
Tommy Chow
29c4f74ef5 ci: pin flutter to 3.44.1 in all workflows
Workflows used subosito/flutter-action with no version, silently tracking
GitHub's latest stable. When stable rolled to 3.44.1 it broke the build with
no code change. Pin explicitly so builds are reproducible and Flutter upgrades
are a deliberate bump rather than a surprise.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 22:33:24 -07:00
Tommy Chow
a3c9ca88f8 chore(deps): support flutter 3.44 stable (simple_icons, extended_text_field)
The CI/release toolchain uses the latest stable Flutter, now 3.44.1, which
broke two dependencies:

- simple_icons 14.6.1 extends IconData, now a final class -> bump to 16.23.0.
- extended_text_field 16.0.2 (latest pub release) vendors an EditableText copy
  referencing ExtendSelectionByPageIntent, removed in 3.44 -> point at a fork
  (tommyxchow/extended_text_field@76305e9) that drops the unused handler, pinned
  by commit SHA.

Restores flutter analyze (no issues) and flutter test (all pass) on 3.44.1.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 22:29:20 -07:00
Tommy Chow
d2b4f0f39e chore(chat): migrate reorderable tab list to onReorderItem for flutter 3.44
ReorderableListView's onReorder was deprecated after Flutter 3.41 and
fails flutter analyze on the CI's pinned 3.44.1 toolchain. Switch to
onReorderItem, which adjusts newIndex for the removed item itself, and
drop the now-redundant manual off-by-one correction in reorderTab.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 22:01:47 -07:00
Tommy Chow
e24491639d docs: adopt conventional commit format in AGENTS.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 22:01:47 -07:00
Tommy Chow
c27a37d52f fix recent messages by handling valueless and escaped irc tags
The recent-messages API now serializes empty IRCv3 tags as bare keys
(e.g. `emotes`) instead of `emotes=`, which threw a RangeError in the
tag parser and silently dropped every recent message. Parse tags per the
IRCv3 spec: treat bare and empty values as equivalent, split on the first
`=` so values may contain `=`, and unescape values in a single pass
(\: \s \ \r \n). Also guard user extraction against prefixes without
`!`, and isolate per-message parse failures in _handleIRCData so one bad
message can no longer abort an entire batch.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 21:53:53 -07:00
kaoru
44620d732d update naming 2026-06-08 22:40:32 -04:00
kaoru
3db999fd5e Clean up release asset naming 2026-06-08 22:10:18 -04:00
kaoru
5be5defbfc update CI and release workflows for Glacier 2026-06-08 21:48:51 -04:00
kaoru
0dc863f5c6 android-only cleanup and release setup 2026-06-08 21:35:26 -04:00
kaoru
b45080dcc8 add ad proxying 2026-06-08 20:40:37 -04:00
Tommy Chow
2b81f2cb31
Add Claude Code GitHub Workflow (#534)
* "Claude PR Assistant workflow"

* "Claude Code Review workflow"
2026-03-15 01:54:26 -04:00
Tommy Chow
7772c4d9f5 disable image optimization until free transformation quota resets
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:49:57 -07:00
Tommy Chow
092cbc3cbb add sizes prop to carousel images to reduce Cloudflare transformations
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:40:32 -07:00
Tommy Chow
11d4b30a09 enable sandbox with weaker network isolation for Go tool TLS support
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:16:12 -07:00
Tommy Chow
c58c9a9a25 guard crashlytics call in error handler for test environments
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 20:55:59 -07:00
Tommy Chow
5be231da73 fix landscape safe area padding across settings and list screens
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 20:04:00 -07:00
Tommy Chow
1dab572280 remove redundant edge borders where blur effect provides separation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:48:14 -07:00
Tommy Chow
872362d5a6 fix recent searches not saving from type-to-search
History was only saved via handleQuery (keyboard submit), but
type-to-search calls _performSearch directly through the debounce
timer, bypassing history. Move the save into _performSearch so all
search paths record history.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 22:33:17 -07:00
Tommy Chow
6ede000c66 improve Firebase integration across Crashlytics, Analytics, and Performance
- Fix cold-start privacy bug: apply persisted collection preference on launch
- Disable Firebase collection in debug builds to avoid polluting prod data
- Add Crashlytics custom keys (is_logged_in, channel), user identifier, and
  WebSocket reconnection breadcrumbs for actionable crash reports
- Record non-fatal errors for server failures, WebSocket errors, and global
  asset fetch failures (skip timeouts/network errors to avoid noise)
- Update is_logged_in key and user identifier on login/logout transitions
- Log auth reconnection exhaustion before forced logout
- Add FirebaseAnalyticsObserver with named routes for automatic screen tracking
- Add static routeName constants to avoid duplicated string literals
- Add Firebase Performance Dio interceptor for automatic HTTP request tracing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:18:21 -08:00
Tommy Chow
f07fe621bc fix stale fullscreen button icon and system UI mode not reacting to settings
Wrap fullScreenButton in Observer so icon/tooltip update immediately
when toggling fullscreen. Move system UI immersive mode sync into the
videoChat Observer so it reacts to landscapeForceVerticalChat changes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:46:41 -08:00
Tommy Chow
820e563516 upgrade dependencies and regenerate codegen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:42:51 -08:00
Tommy Chow
eb91146f63 fix auto sync chat delay not applying when toggled on mid-session
When showLatency was already tracking, toggling autoSyncChatDelay on
would wait up to 60s for the next tracker cycle instead of using the
cached latency value immediately.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:34:01 -08:00
Tommy Chow
9cec89a67c fix video refresh race condition causing black screen with play button
Replace JS-side `window._injected` guard with a Dart-controlled `_needsInit`
flag so `initVideo()` reliably runs after every refresh. The previous approach
loaded `about:blank` then `videoUrl` back-to-back, but `loadRequest` resolves
on navigation start (not page load), so the JS context often survived and
`onPageFinished` skipped re-initialization. Also adds an explicit `play()`
call to handle cases where the Twitch player loads in a paused state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:22:44 -08:00
Tommy Chow
929d525c13 add error handling to getRecentMessage and getAssets in chat store
getRecentMessage had no try/catch, so a failure from the third-party
API would silently prevent connectToChat from ever being called.
getAssets was fire-and-forget without a catchError, risking uncaught
Future errors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 20:46:40 -08:00
Tommy Chow
7a9af238b6 switch token script to implicit flow and fix interceptor hanging Future
The script used authorization code flow (response_type=code) which produces
tokens expiring in ~4 hours, while the app uses implicit flow (~60 days).
Switched the script to implicit flow to match, removing the client_secret
requirement and token exchange step.

Also fixed UnauthorizedInterceptor swallowing 401 errors without calling
handler.reject(), which left Dio request Futures hanging forever.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 20:37:23 -08:00
Tommy Chow
779572a864 replace redundant confirmation dialogs with inline actions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:58:34 -08:00
Tommy Chow
02f4cd417b audit and optimize haptic feedback across the app
Add selectionClick to settings switches, discrete slider steps, bottom
nav tabs, and expandable section headers. Fix intensity levels for cache
clear and random color (medium → light). Add lightImpact to thumbnail
long-press. Fix inconsistent search result long-press level. Replace
blanket lightImpact in updateNotification with targeted haptics at
error/warning call sites to eliminate double-firing and match severity.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:46:24 -08:00
Tommy Chow
21cb79d2c2 move menu styling to theme for app-wide consistency
Add menuTheme and menuButtonTheme to ThemeData matching the existing
overlay surface style (12px radius, outline border, compact density).
Remove per-use styling from chat_tabs.dart.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:30:02 -08:00
Tommy Chow
4c696745b0 add tab disconnect option via context menu
X button on secondary tabs now opens a MenuAnchor popup with
Disconnect (deactivates without removing) and Remove options.
Menu styled to match app overlay surfaces (12px radius, outline border).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:25:56 -08:00
Tommy Chow
89f8859ba3 add merged chat mode for multi-tab view
Merge only already-activated tabs; lazy tabs join when tapped. Dedup
messages by IRC id for Twitch shared chat overlap. Preserve draft and
reply state when switching tabs in merged mode. Merge button appears
only when 2+ tabs are loaded.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:00:03 -08:00
Tommy Chow
fd4da6a393 replace get-twitch-token bash script with cross-platform Dart script
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 16:59:31 -08:00
Tommy Chow
26d26a9554 update plugin settings and add testing section to AGENTS.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 00:32:04 -08:00
Tommy Chow
ed59896c5f deduplicate SystemChrome calls and optimize PiP animation rebuilds
- extract _scheduleSystemUiModeSync to avoid redundant platform calls on
  every build, deferred via addPostFrameCallback with state tracking
- use AnimatedBuilder.child so the video subtree is not rebuilt on every
  animation tick during PiP spring-back
- move orientation reset from build() to initState() in home screen
- reformat landscape LayoutBuilder for consistency

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 00:13:08 -08:00
Tommy Chow
d28a3279e4 replace per-message Future.delayed with lightweight callback queue
drains delayed chat/7TV callbacks via the existing 200ms message buffer
timer instead of creating one Future.delayed per incoming event, removing
the biggest memory-pressure risk on busy channels with chat delay active

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 00:11:42 -08:00
Tommy Chow
9e81b2d80a make auto-synced chat delay session-only and improve video store
- split chatDelay into persisted (manual) and session-only (synced) fields
  so auto-synced latency values don't carry over between channels
- make latency tracker singleton/idempotent to prevent overlapping JS pollers
- add isCycling guard to prevent re-entrant latency cycles
- deduplicate concurrent stream info API requests
- tie JS cleanup timer to video mode only (skip in chat-only)
- update UI to reflect effective delay instead of persisted value

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 00:11:21 -08:00
Tommy Chow
04e5479acd add keep screen awake setting
adds a user-controlled toggle (default on) under video settings that
controls whether wakelock is enabled during channel sessions. previously
wakelock was unconditional with no way to turn it off.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 23:58:32 -08:00
Tommy Chow
aad6b50d81 make token script cross-platform (macOS, Linux, Windows)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 22:19:40 -08:00
Tommy Chow
3b3cd92026 show buy me a coffee icon on iOS
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 23:45:24 -08:00