Cue Animations
Milad-Akarie/cue
Flutter animation using the Cue package. An agent skill from Milad-Akarie/cue.
Debug and fix infinite widget rebuild loops in Flutter apps using Riverpod state management.
$ npx skills add divinevideo/divine-mobile --skill riverpod-infinite-rebuild-loop -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install divinevideo/divine-mobile riverpod-infinite-rebuild-loop --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/riverpod-infinite-rebuild-loop .claude/skills/riverpod-infinite-rebuild-loop && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "riverpod-infinite-rebuild-loop" agent skill from https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/riverpod-infinite-rebuild-loop into .claude/skills/riverpod-infinite-rebuild-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "riverpod-infinite-rebuild-loop", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/riverpod-infinite-rebuild-loopType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add divinevideo/divine-mobile --skill riverpod-infinite-rebuild-loop -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install divinevideo/divine-mobile riverpod-infinite-rebuild-loop --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/riverpod-infinite-rebuild-loop .agents/skills/riverpod-infinite-rebuild-loop && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "riverpod-infinite-rebuild-loop" agent skill from https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/riverpod-infinite-rebuild-loop into .agents/skills/riverpod-infinite-rebuild-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "riverpod-infinite-rebuild-loop", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add divinevideo/divine-mobile --skill riverpod-infinite-rebuild-loop -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install divinevideo/divine-mobile riverpod-infinite-rebuild-loop --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/riverpod-infinite-rebuild-loop .cursor/skills/riverpod-infinite-rebuild-loop && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "riverpod-infinite-rebuild-loop" agent skill from https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/riverpod-infinite-rebuild-loop into .cursor/skills/riverpod-infinite-rebuild-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "riverpod-infinite-rebuild-loop", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/divinevideo/divine-mobile.git --path .agents/skills/riverpod-infinite-rebuild-loop--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add divinevideo/divine-mobile --skill riverpod-infinite-rebuild-loop -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install divinevideo/divine-mobile riverpod-infinite-rebuild-loop --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/riverpod-infinite-rebuild-loop .gemini/skills/riverpod-infinite-rebuild-loop && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "riverpod-infinite-rebuild-loop" agent skill from https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/riverpod-infinite-rebuild-loop into .gemini/skills/riverpod-infinite-rebuild-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "riverpod-infinite-rebuild-loop", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install divinevideo/divine-mobile riverpod-infinite-rebuild-loopInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add divinevideo/divine-mobile --skill riverpod-infinite-rebuild-loop -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/riverpod-infinite-rebuild-loop .github/skills/riverpod-infinite-rebuild-loop && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "riverpod-infinite-rebuild-loop" agent skill from https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/riverpod-infinite-rebuild-loop into .github/skills/riverpod-infinite-rebuild-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "riverpod-infinite-rebuild-loop", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add divinevideo/divine-mobile --skill riverpod-infinite-rebuild-loop -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install divinevideo/divine-mobile riverpod-infinite-rebuild-loop --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/riverpod-infinite-rebuild-loop .opencode/skills/riverpod-infinite-rebuild-loop && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "riverpod-infinite-rebuild-loop" agent skill from https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/riverpod-infinite-rebuild-loop into .opencode/skills/riverpod-infinite-rebuild-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "riverpod-infinite-rebuild-loop", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
riverpod-infinite-rebuild-loopDebug and fix infinite widget rebuild loops in Flutter apps using Riverpod state management.
Riverpod Infinite Rebuild Loop is an agent skill from divinevideo/divine-mobile. Debug and fix infinite widget rebuild loops in Flutter apps using Riverpod state management. Use when: (1) Logs show "RAPID REBUILD" warnings or 50+ rebuilds in seconds, (2) UI becomes unresponsive or shows same content repeatedly, (3) Bug only affects slower devices or poor network conditions, (4) Provider watching creates circular dependencies with router/URL state. Covers ref.watch() overuse, watch+listener redundancy, and transitive dependency chains.
Its SKILL.md is about 1.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Mobile, covering Cross-platform mobile apps and State management. It works with Flutter. The licence is MPL-2.0.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c3d6f7e. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are dart).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
riverpod.devdocs.flutter.devFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Riverpod Infinite Rebuild Loop loads about 1.8k tokens when it runs. Until then it costs about 123 tokens; SKILL.md has 313 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from divinevideo/divine-mobile at commit c3d6f7e, republished under its MPL-2.0 licence (© divinevideo). 313 words, ~1,823 tokens.
.claude/skills/riverpod-infinite-rebuild-loop/SKILL.md (or your agent's skills folder).Flutter widgets using Riverpod enter an infinite rebuild loop, causing:
Symptoms in logs:
⚠️ RAPID REBUILD #54! Only 15ms since last build
⚠️ RAPID REBUILD DETECTED! Only 6ms since last buildUser-reported symptoms:
Trigger scenarios:
ref.watch() AND adding manual listeners to same provider// BAD: Creates infinite loop
Widget build(BuildContext context) {
final pageContext = ref.watch(pageContextProvider); // Watches URL
final videos = ref.watch(videosProvider);
// Detect video moved position and "silently" update URL
if (currentVideoIndex != urlIndex) {
context.go('/home/$currentVideoIndex'); // URL change triggers rebuild!
}
}Loop: Videos reorder → URL updated → pageContextProvider emits → rebuild → videos may reorder again → repeat
// BAD: Double-subscribing causes double rebuilds
final cache = ref.watch(cacheProvider); // Watch triggers rebuild
cache.addListener(onCacheChanged); // Listener ALSO triggers action// BAD: Double-watching same source
Widget build() {
ref.watch(pageContextProvider); // Watch #1
ref.watch(derivedProvider); // derivedProvider ALSO watches pageContextProvider!
}// PROBLEMATIC on slow devices: Each watch triggers rebuild when provider completes
final a = ref.watch(asyncProviderA); // Completes at T=100ms → rebuild
final b = ref.watch(asyncProviderB); // Completes at T=200ms → rebuild
final c = ref.watch(asyncProviderC); // Completes at T=350ms → rebuild
final d = ref.watch(asyncProviderD); // Completes at T=500ms → rebuild
// On fast devices: all complete ~simultaneously, 1-2 rebuilds
// On slow devices: staggered completion, 4+ rebuildsref.watch() UsageFor each ref.watch() in build methods, ask:
Riverpod Methods:
| Method | Behavior |
|---|---|
ref.watch() | Subscribe + REBUILD on change |
ref.read() | Read once, NO rebuild |
ref.listen() | Subscribe + callback, NO rebuild |
// BEFORE: Rebuilds on every change
final videoService = ref.watch(videoServiceProvider);
// AFTER: Read once, use listener for reactions
final videoService = ref.read(videoServiceProvider);
ref.listen(videoServiceProvider, (prev, next) {
// React to changes without rebuilding
if (next.hasNewVideos) refreshUI();
});// BEFORE: Double-subscription
final cache = ref.watch(cacheProvider);
cache.addListener(onCacheChanged);
// AFTER: Choose one approach
// Option A: Just watch (if rebuild is needed)
final cache = ref.watch(cacheProvider);
// Option B: Read + listen (if rebuild not needed)
final cache = ref.read(cacheProvider);
ref.listen(cacheProvider, (_, __) => onCacheChanged());// BEFORE: URL update in build causes loop
if (currentVideoIndex != urlIndex) {
context.go('/home/$currentVideoIndex');
}
// AFTER: Don't update URL on content reorder
// Just track position with PageController, not URL
// OR use content ID in URL instead of index: /home/video/abc123// BEFORE: Watch each async provider (N rebuilds on slow devices)
final a = ref.watch(asyncA);
final b = ref.watch(asyncB);
// AFTER: Create combined provider that waits for all
@riverpod
Future<CombinedState> combinedState(Ref ref) async {
final a = await ref.watch(asyncA.future);
final b = await ref.watch(asyncB.future);
return CombinedState(a, b);
}
// Widget watches only the combined provider (1 rebuild)After fixes:
Before (problematic):
class _HomeScreenState extends ConsumerState<HomeScreen> {
@override
Widget build(BuildContext context) {
final pageContext = ref.watch(pageContextProvider);
final videos = ref.watch(videosProvider); // Also watches pageContextProvider internally!
// URL update loop
if (videos.currentIndex != pageContext.index) {
WidgetsBinding.instance.addPostFrameCallback((_) {
context.go('/home/${videos.currentIndex}');
});
}
return PageView(...);
}
}After (fixed):
class _HomeScreenState extends ConsumerState<HomeScreen> {
@override
Widget build(BuildContext context) {
// Only watch videos, read page context
final pageContext = ref.read(pageContextProvider).requireValue;
final videos = ref.watch(videosProvider);
// Don't update URL on reorder - track with PageController only
// URL only changes on explicit user navigation
return PageView(...);
}
}static int _buildCount = 0;
static DateTime? _lastBuild;
@override
Widget build(BuildContext context) {
final now = DateTime.now();
if (_lastBuild != null && now.difference(_lastBuild!).inMilliseconds < 100) {
Log.warning('RAPID REBUILD #${++_buildCount}!');
}
_lastBuild = now;
// ...
}© divinevideo, MPL-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/riverpod-infinite-rebuild-loop of divinevideo/divine-mobile.
Open the folder on GitHubat commit c3d6f7e
Riverpod Infinite Rebuild Loop next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Riverpod Infinite Rebuild Loop this skilldivinevideo/divine-mobile | 266 | — | ~1.8k | Automated safety check: Pass | MPL-2.0 | |
| Cue AnimationsMilad-Akarie/cue | 119 | 1 repos | ~6.6k | Automated safety check: Pass | MIT | |
| Flutter Riverpod State Managementandrewyng/context-hub | 14k | — | ~1.1k | Automated safety check: Pass | MIT | |
| BlocVeryGoodOpenSource/vgv-ai-flutter-plugin | 170 | — | ~2k | Automated safety check: Pass | MIT | |
| Flutter Dart Code Reviewaffaan-m/ECC | 276k | 2 repos | ~5.8k | Automated safety check: Notes | MIT | |
| Signals for Flutterrodydavis/signals.dart | 819 | — | ~1.9k | Automated safety check: Pass | Apache-2.0 |
Milad-Akarie/cue
Flutter animation using the Cue package. An agent skill from Milad-Akarie/cue.
andrewyng/context-hub
Guides Flutter state management with Riverpod: choosing provider types, wiring ConsumerWidgets, handling async state and lifecycle, and overriding providers in tests.
VeryGoodOpenSource/vgv-ai-flutter-plugin
Best practices for Bloc state management in Flutter/Dart, covering Cubit versus Bloc, event and state naming, sealed classes with Equatable, the Page/View split with BlocProvider, BlocBuilder…
affaan-m/ECC
Library-agnostic Flutter/Dart code review checklist covering widget best practices, state management patterns (BLoC, Riverpod, Provider, GetX, MobX, Signals), Dart idioms, performance…
rodydavis/signals.dart
Reference for the signals_flutter package: reactive signals, computed values, effects, async signals and collection signals bound to Flutter widgets.
rohitg00/awesome-claude-code-toolkit
Mobile development patterns for React Native and Flutter including navigation, state management, and responsive design
divinevideo/divine-mobile
Fix ArgoCD ExternalSecret deployment failing with "namespace X is not permitted in project Y".
divinevideo/divine-mobile
Art direction for any content — reads text, PDF, Word, HTML, PPT, then proposes 2-3 creative directions with photography style, mood, and visual language.
divinevideo/divine-mobile
Fix "Null check operator used on a null value" errors when an object is set to null during an async await.
divinevideo/divine-mobile
Add custom metadata headers (x-amz-meta-) to AWS v4 signed requests for GCS S3-compatible API.
divinevideo/divine-mobile
Fix password/secret authentication failures caused by trailing newlines when creating Google Cloud secrets (or similar) with bash here-strings.
divinevideo/divine-mobile
Fix silent video/media processing failures caused by URL extraction code that filters on file extensions (.mp4, .webm, .webp).
Works with
Categories
Debug and fix infinite widget rebuild loops in Flutter apps using Riverpod state management. Riverpod Infinite Rebuild Loop is an agent skill from divinevideo/divine-mobile. Debug and fix infinite widget rebuild loops in Flutter apps using Riverpod state management.
Riverpod Infinite Rebuild Loop fits situations like: logs show RAPID REBUILD warnings; 50+ rebuilds in seconds; UI becomes unresponsive; shows same content repeatedly.
Run `npx skills add divinevideo/divine-mobile --skill riverpod-infinite-rebuild-loop -a claude-code`. Or copy the skill folder (.agents/skills/riverpod-infinite-rebuild-loop in divinevideo/divine-mobile) into .claude/skills/riverpod-infinite-rebuild-loop in your project. Claude Code loads it when a task matches its description.
Run `npx skills add divinevideo/divine-mobile --skill riverpod-infinite-rebuild-loop -a codex`. Or copy the skill folder (.agents/skills/riverpod-infinite-rebuild-loop in divinevideo/divine-mobile) into .agents/skills/riverpod-infinite-rebuild-loop in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add divinevideo/divine-mobile --skill riverpod-infinite-rebuild-loop -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/riverpod-infinite-rebuild-loop, .gemini/skills/riverpod-infinite-rebuild-loop, .github/skills/riverpod-infinite-rebuild-loop and .opencode/skills/riverpod-infinite-rebuild-loop in your project.
SKILL.md names no scripts, command-line tools or credentials: Riverpod Infinite Rebuild Loop is instructions for the agent only.
SKILL.md names 2 domains. As links in the text: riverpod.dev and docs.flutter.dev. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Riverpod Infinite Rebuild Loop is published under the MPL-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.8k tokens (SKILL.md is roughly 7.3k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Riverpod Infinite Rebuild Loop: Cue Animations (Milad-Akarie/cue, 119 stars), Flutter Riverpod State Management (andrewyng/context-hub, 14k stars), Bloc (VeryGoodOpenSource/vgv-ai-flutter-plugin, 170 stars) and Flutter Dart Code Review (affaan-m/ECC, 276k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
divinevideo (a GitHub organization) maintains it in divinevideo/divine-mobile, which has 266 GitHub stars. The repository holds 103 skills in this directory. The repository was last updated on October 10, 2026.
Source: divinevideo/divine-mobile on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.