Skip to content

Safe-mode#251

Merged
omeritzics merged 5 commits intomainfrom
safe-mode
Mar 15, 2026
Merged

Safe-mode#251
omeritzics merged 5 commits intomainfrom
safe-mode

Conversation

@omeritzics
Copy link
Owner

@omeritzics omeritzics commented Mar 15, 2026

Summary by CodeRabbit

  • New Features

    • Added a persisted Safe Mode toggle in Settings that changes navigation: the Add App page is replaced by Import/Export and attempts to add an app show a disabled/error message.
  • Localization

    • Added Safe Mode label and descriptive translations across multiple locales.

@gemini-code-assist
Copy link

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a new "Safe Mode" feature, providing users with an option to simplify the application interface by replacing the "Add App" functionality with "Import/Export" in the main navigation. This mode is configurable via a new setting. Additionally, the pull request refactors the export directory handling by removing the DocMan library, streamlining file system interactions.

Highlights

  • New Feature: Safe Mode: Introduced a new "Safe Mode" feature that alters the application's navigation and functionality.
  • Conditional Navigation: Modified the main navigation to conditionally display the "Import/Export" page instead of the "Add App" page when Safe Mode is active.
  • Settings Integration: Added a new toggle switch in the application settings to enable or disable Safe Mode.
  • DocMan Library Removal: Removed the DocMan library and its associated file system access logic, streamlining export directory handling.
Changelog
  • assets/translations/en.json
    • Added new translation keys for "Safe Mode", "safeModeDescription", and "safeModeAddAppDisabled".
  • lib/pages/home.dart
    • Imported ImportExportPage.
    • Refactored the page list into a getPages function to dynamically switch between "Add App" and "Import/Export" based on Safe Mode status.
    • Updated initState to initialize animation controllers after the dynamic page list is available.
    • Implemented a check in goToAddApp to prevent adding apps when Safe Mode is enabled, displaying an error message.
    • Adjusted goToExistingApp, switchToPage, build, and WillPopScope methods to use the dynamic getPages function.
    • Updated the bottomNavigationBar hint text to reflect the conditional page name.
  • lib/pages/settings.dart
    • Added a new UI switch for toggling "Safe Mode" in the settings interface.
  • lib/providers/settings_provider.dart
    • Removed the docman package import.
    • Eliminated DocMan related logic from getExportDir and pickExportDir functions.
    • Implemented safeMode getter and setter to manage the Safe Mode state using shared_preferences.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@coderabbitai
Copy link

coderabbitai bot commented Mar 15, 2026

📝 Walkthrough

Walkthrough

Adds a Safe Mode setting (persisted), new localized strings across locales, and changes Home navigation to dynamically replace the Add App page with Import/Export when Safe Mode is enabled.

Changes

Cohort / File(s) Summary
Core UI
lib/pages/home.dart, lib/pages/settings.dart
Home: replaced static page list with getPages(SettingsProvider) and updated navigation, icon init, and guards to consult settingsProvider.safeMode. Settings: added Safe Mode row with description and Switch bound to settingsProvider.safeMode.
State / Provider
lib/providers/settings_provider.dart
Added bool get safeMode and set safeMode(bool) persisted to SharedPreferences; removed DocMan SAF/export-dir validation and related imports/logic.
Translations (multiple locales)
assets/translations/*.json, e.g. assets/translations/en.json, assets/translations/ar.json, assets/translations/de.json, assets/translations/…
Added three translation keys in many locale files: safeMode, safeModeDescription, safeModeAddAppDisabled. Some locale files also include minor single-string updates or added .bak files.
Large added translation backups
assets/translations/*/*.bak, e.g. assets/translations/hu.json.bak, assets/translations/id.json.bak, ...
New/backup locale files added containing large full-language JSON payloads (pure data additions).

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant SettingsPage as Settings Page
    participant SettingsProv as SettingsProvider
    participant HomePage as Home Page
    participant PageResolver as Page Resolver

    User->>SettingsPage: toggle Safe Mode
    SettingsPage->>SettingsProv: set safeMode(val)
    SettingsProv->>SettingsProv: persist to SharedPreferences
    SettingsProv->>HomePage: notifyListeners

    HomePage->>PageResolver: getPages(settingsProvider)
    alt safeMode == true
        PageResolver->>HomePage: pages with ImportExportPage
    else safeMode == false
        PageResolver->>HomePage: pages with AddAppPage
    end
    HomePage->>HomePage: rebuild UI / update navigation
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Ux-ui #246 — overlaps modifications in lib/pages/settings.dart and translation entries; likely related to Safe Mode UI/translation changes.

Poem

🐰🌿 A switch, a gentle, quiet nod,
Safe Mode hums beneath the sod.
Add App naps while imports gleam,
I hop and polish up the dream.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The PR title 'Safe-mode' is vague and generic. While it references a real feature being added, it lacks specificity about what the change accomplishes and doesn't clearly summarize the main purpose. Consider a more descriptive title like 'Add safe mode feature to hide Add App page' or 'Implement safe mode UI toggle with app management restrictions' to better convey the scope and intent.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch safe-mode
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a new "Safe Mode" feature, allowing users to hide the "Add App" page and display an "Import/Export" page instead, with a toggle available in the settings. The navigation pages are now dynamically generated based on the safeMode setting, and adding new apps is prevented when safe mode is active. However, the current implementation has two critical issues: a LateInitializationError in home.dart due to _iconControllers and _iconAnimations being initialized too late, and the pickExportDir functionality in settings_provider.dart was removed without a replacement, breaking the ability to select an export directory.

Comment on lines 432 to 439
Future<void> pickExportDir({bool remove = false}) async {
var existingSAFPerms = await DocMan.perms.list();
// DocMan functionality removed
var currentOneWayDataSyncDir = await getExportDir();
Uri? newOneWayDataSyncDir;
if (!remove) {
final pickedDir = await DocMan.pick.directory();
newOneWayDataSyncDir = pickedDir != null
? Uri.parse(pickedDir.uri)
: null;
}
if (currentOneWayDataSyncDir?.path != newOneWayDataSyncDir?.path) {
if (newOneWayDataSyncDir == null) {
prefs?.remove('exportDir');
} else {
prefs?.setString('exportDir', newOneWayDataSyncDir.toString());
}
notifyListeners();
}
for (var e in existingSAFPerms) {
await DocMan.perms.release(e.uri);
// SAF picker functionality removed
}
// DocMan permission release functionality removed
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

The pickExportDir function has been emptied, with comments indicating that DocMan functionality was removed. This breaks the ability for users to select an export directory, which is a critical part of the export feature. If an export directory is not already set, the export functionality will not work.

Please restore this functionality, perhaps using another file picker library if docman is being deprecated.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
lib/pages/home.dart (1)

162-177: ⚠️ Potential issue | 🟡 Minor

Type safety issue when accessing page key in safe mode.

When safeMode is false, the code correctly returns early. However, if safeMode state changes during the goToAddApp execution (e.g., via a race condition), line 170's cast pages[1].widget.key as GlobalKey<AddAppPageState>? would fail because ImportExportPage doesn't use that key type.

Consider storing a direct reference to the AddAppPage key (as suggested above) rather than extracting it from the dynamically-built pages list.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/home.dart` around lines 162 - 177, The goToAddApp method currently
casts pages[1].widget.key to GlobalKey<AddAppPageState>, which can fail if the
pages list changes mid-execution; instead, keep a dedicated
GlobalKey<AddAppPageState> (e.g., addAppKey) as a member and use it directly (or
expose a typed getter) rather than extracting from getPages(), and update
goToAddApp to reference addAppKey, await its currentState safely, and guard
against null before calling linkFn; this eliminates the unsafe cast and the race
that occurs when the pages list or page type changes during execution.
lib/providers/settings_provider.dart (1)

421-439: ⚠️ Potential issue | 🔴 Critical

Critical: Export functionality is broken—pickExportDir() is non-functional and getExportDir() lacks accessibility validation.

The changes to these methods break the export flow:

  1. getExportDir() now returns any stored URI without verifying accessibility. Callers expect null to signal that the picker should be invoked or to show appropriate UI hints (e.g., import_export.dart:305-328 FutureBuilder and conditional hint text).

  2. pickExportDir() is a complete no-op. It retrieves but discards the current directory and has no picker or storage logic. The flow in apps_provider.dart:2334–2335 calls pickExportDir() then immediately calls getExportDir() expecting the newly picked value—this will return the stale/old value or null.

  3. The UI in import_export.dart:328 exposes a "pickExportDir" button to users, but it will be non-functional.

If DocMan is being removed, you must implement an alternative directory picker (e.g., SAF picker) or storage mechanism, otherwise exports will silently fail or proceed with invalid paths.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/providers/settings_provider.dart` around lines 421 - 439, getExportDir
currently returns any stored URI without checking accessibility and
pickExportDir is a no-op, breaking the export flow; update getExportDir to
validate that the stored Uri (from prefs 'exportDir') is accessible/readable and
return null if not (so callers like import_export.dart FutureBuilder trigger the
picker/UI hint), and implement pickExportDir to actually invoke the platform
directory picker or fallback mechanism, persist the chosen Uri into prefs under
'exportDir', and return or set the new value so callers (e.g.,
apps_provider.dart flow) receive the updated directory; ensure pickExportDir
also handles removal when remove=true by clearing prefs and releasing any
platform permissions.
🧹 Nitpick comments (1)
lib/pages/home.dart (1)

428-431: Inconsistent indentation.

Lines 429-431 have inconsistent indentation compared to the surrounding code block.

🔧 Proposed fix
         final settingsProvider = context.read<SettingsProvider>();
-      final pages = getPages(settingsProvider);
-      return !(pages[0].widget.key as GlobalKey<AppsPageState>).currentState!
-          .clearSelected();
+        final pages = getPages(settingsProvider);
+        return !(pages[0].widget.key as GlobalKey<AppsPageState>).currentState!
+            .clearSelected();
       },
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/home.dart` around lines 428 - 431, The three-line block using
SettingsProvider/getPages and accessing (pages[0].widget.key as
GlobalKey<AppsPageState>).currentState!.clearSelected() is mis-indented;
reformat those lines to match the surrounding block indentation (align with the
enclosing return/statement level), preserving the exact expressions and casts
(SettingsProvider, getPages, AppsPageState, clearSelected) and ensure the
chained call remains on one logical statement with consistent leading spaces.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@assets/translations/en.json`:
- Around line 264-266: The three new translation keys safeMode,
safeModeDescription, and safeModeAddAppDisabled were added to en.json but are
missing from the other locale files causing the integrity check to fail; open
each locale JSON (ar, bs, ca, cs, da, de, en-EO, es, et, fa, fr, gl, he, hu, id,
it, ja, ko, ml, nl, pl, pt-BR, pt, ru, sv, tr, uk, vi, zh-Hant-TW, zh) and add
these three keys with appropriate localized strings (matching the meaning in
en.json) ensuring correct JSON syntax and preserving ordering/formatting
consistent with existing files so the translation integrity script passes.

In `@lib/pages/home.dart`:
- Around line 48-64: The getPages() function is recreating
GlobalKey<AppsPageState>() and GlobalKey<AddAppPageState>() on every call which
breaks state access; instead, add stable instance fields (e.g. final
GlobalKey<AppsPageState> _appsKey and final GlobalKey<AddAppPageState>
_addAppKey) initialized once (at declaration or in initState()) and use those
keys in getPages() when constructing AppsPage and AddAppPage; update any access
sites that cast pages[0].widget.key or similar to use these stable keys to
ensure .currentState is reachable and deep-link handlers can find the state.
- Around line 71-90: The post-frame initialization currently in
WidgetsBinding.instance.addPostFrameCallback causes LateInitializationError
because _iconControllers and _iconAnimations are accessed in build before that
callback runs; move the initialization into didChangeDependencies (or initState
pattern that accesses context safely) and run it once: in didChangeDependencies
check a bool like _iconsInitialized, fetch the SettingsProvider via
context.read<SettingsProvider>(), call getPages(settingsProvider) to get
pagesList, create the AnimationController list (_iconControllers) and
corresponding Tween/CurvedAnimation list (_iconAnimations), set
_iconsInitialized = true and call setState(); ensure disposal logic still
disposes every controller in dispose().

---

Outside diff comments:
In `@lib/pages/home.dart`:
- Around line 162-177: The goToAddApp method currently casts pages[1].widget.key
to GlobalKey<AddAppPageState>, which can fail if the pages list changes
mid-execution; instead, keep a dedicated GlobalKey<AddAppPageState> (e.g.,
addAppKey) as a member and use it directly (or expose a typed getter) rather
than extracting from getPages(), and update goToAddApp to reference addAppKey,
await its currentState safely, and guard against null before calling linkFn;
this eliminates the unsafe cast and the race that occurs when the pages list or
page type changes during execution.

In `@lib/providers/settings_provider.dart`:
- Around line 421-439: getExportDir currently returns any stored URI without
checking accessibility and pickExportDir is a no-op, breaking the export flow;
update getExportDir to validate that the stored Uri (from prefs 'exportDir') is
accessible/readable and return null if not (so callers like import_export.dart
FutureBuilder trigger the picker/UI hint), and implement pickExportDir to
actually invoke the platform directory picker or fallback mechanism, persist the
chosen Uri into prefs under 'exportDir', and return or set the new value so
callers (e.g., apps_provider.dart flow) receive the updated directory; ensure
pickExportDir also handles removal when remove=true by clearing prefs and
releasing any platform permissions.

---

Nitpick comments:
In `@lib/pages/home.dart`:
- Around line 428-431: The three-line block using SettingsProvider/getPages and
accessing (pages[0].widget.key as
GlobalKey<AppsPageState>).currentState!.clearSelected() is mis-indented;
reformat those lines to match the surrounding block indentation (align with the
enclosing return/statement level), preserving the exact expressions and casts
(SettingsProvider, getPages, AppsPageState, clearSelected) and ensure the
chained call remains on one logical statement with consistent leading spaces.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8351b047-18c1-4f5a-9f96-1b2f70fd7c1b

📥 Commits

Reviewing files that changed from the base of the PR and between e86adb6 and 2506ce8.

📒 Files selected for processing (4)
  • assets/translations/en.json
  • lib/pages/home.dart
  • lib/pages/settings.dart
  • lib/providers/settings_provider.dart

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
lib/pages/home.dart (1)

300-309: ⚠️ Potential issue | 🟠 Major

switchToPage(0) can wait forever when already on Apps.

At Line 305, looping while currentState != null never exits if the current page is already Apps, causing an unbounded async loop and breaking subsequent navigation flows.

🐛 Proposed fix
   Future<void> switchToPage(int index) async {
     setIsReversing(index);
-    final settingsProvider = context.read<SettingsProvider>();
-    final pages = getPages(settingsProvider);
     if (index == 0) {
-      while ((pages[0].widget.key as GlobalKey<AppsPageState>).currentState !=
-          null) {
-        // Avoid duplicate GlobalKey error
-        await Future.delayed(const Duration(microseconds: 1));
-      }
+      if (selectedIndexHistory.isEmpty) return; // already on Apps
       setState(() {
         selectedIndexHistory.clear();
       });
+      return;
     } else if (selectedIndexHistory.isEmpty ||
         (selectedIndexHistory.isNotEmpty &&
             selectedIndexHistory.last != index)) {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/home.dart` around lines 300 - 309, The loop in switchToPage uses
the wrong condition and can hang when the Apps page is already active; invert
the check so we wait until the Apps page key becomes non-null instead of waiting
while it's non-null. Specifically, in switchToPage change the while condition
that inspects (pages[0].widget.key as GlobalKey<AppsPageState>).currentState
from "while (currentState != null)" to "while (currentState == null)" so the
code awaits the widget being mounted instead of looping forever when Apps is
already present.
♻️ Duplicate comments (2)
lib/pages/home.dart (2)

71-90: ⚠️ Potential issue | 🔴 Critical

late animation fields can crash on first frame.

build() reads _iconControllers / _iconAnimations (Line 386, Line 397) before the post-frame callback runs, so first render can throw LateInitializationError.

🐛 Proposed fix
   `@override`
   void initState() {
     super.initState();
 
-    // Initialize animation controllers for each nav item
-    WidgetsBinding.instance.addPostFrameCallback((_) {
-      final settingsProvider = context.read<SettingsProvider>();
-      final pagesList = getPages(settingsProvider);
-      _iconControllers = List.generate(
-        pagesList.length,
-        (index) => AnimationController(
-          duration: const Duration(milliseconds: 600),
-          vsync: this,
-        ),
-      );
-
-      _iconAnimations = _iconControllers
-          .map(
-            (controller) => Tween<double>(begin: 0, end: 1).animate(
-              CurvedAnimation(parent: controller, curve: Curves.easeInOut),
-            ),
-          )
-          .toList();
-      setState(() {}); // Rebuild after initialization
-    });
+    _iconControllers = List.generate(
+      3,
+      (index) => AnimationController(
+        duration: const Duration(milliseconds: 600),
+        vsync: this,
+      ),
+    );
+    _iconAnimations = _iconControllers
+        .map(
+          (controller) => Tween<double>(begin: 0, end: 1).animate(
+            CurvedAnimation(parent: controller, curve: Curves.easeInOut),
+          ),
+        )
+        .toList();
 
     initDeepLinks();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/home.dart` around lines 71 - 90, The crash occurs because
_iconControllers and _iconAnimations are declared late but build() may access
them before the post-frame callback populates them; initialize them to empty
lists synchronously (e.g., set _iconControllers = <AnimationController>[] and
_iconAnimations = <Animation<double>>[] in the field declaration or at the start
of initState) and then in the existing
WidgetsBinding.instance.addPostFrameCallback populate/replace those lists using
getPages and the generated controllers, calling setState afterwards; this
ensures build() can safely read _iconControllers/_iconAnimations before the
post-frame callback runs.

48-60: ⚠️ Potential issue | 🔴 Critical

Undefined page keys will fail compilation.

_appsPageKey (Line 53) and _addAppPageKey (Line 60) are used but not declared in _HomePageState, which is a compile-time error.

🐛 Proposed fix
 class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
   List<int> selectedIndexHistory = [];
   bool isReversing = false;
   int prevAppCount = -1;
   bool prevIsLoading = true;
   late AppLinks _appLinks;
   StreamSubscription<Uri>? _linkSubscription;
   bool isLinkActivity = false;
   late List<AnimationController> _iconControllers;
   late List<Animation<double>> _iconAnimations;
+  final GlobalKey<AppsPageState> _appsPageKey = GlobalKey<AppsPageState>();
+  final GlobalKey<AddAppPageState> _addAppPageKey = GlobalKey<AddAppPageState>();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/home.dart` around lines 48 - 60, The build uses undeclared page
keys _appsPageKey and _addAppPageKey in _HomePageState causing a compile error;
fix it by declaring them as fields on _HomePageState (e.g. final GlobalKey or
GlobalKey<State> typed keys) and initialize them before use so AppsPage(key:
_appsPageKey) and AddAppPage(key: _addAppPageKey) receive valid keys; locate the
_HomePageState class and add the _appsPageKey and _addAppPageKey declarations
(typed appropriately for AppsPage and AddAppPage) and initialize them in-place
or in initState.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@lib/pages/home.dart`:
- Around line 428-431: The back handler force-unwraps currentState on the
AppsPage GlobalKey, which can throw if the page is unmounted; update the
expression in home.dart to use a null-aware access on (pages[0].widget.key as
GlobalKey<AppsPageState>).currentState?.clearSelected() and provide a safe
boolean fallback (e.g. use ?? true or ?? false depending on desired behavior) so
the handler doesn't crash when currentState is null; keep references to
SettingsProvider, getPages, AppsPageState, clearSelected and pages when applying
the change.

---

Outside diff comments:
In `@lib/pages/home.dart`:
- Around line 300-309: The loop in switchToPage uses the wrong condition and can
hang when the Apps page is already active; invert the check so we wait until the
Apps page key becomes non-null instead of waiting while it's non-null.
Specifically, in switchToPage change the while condition that inspects
(pages[0].widget.key as GlobalKey<AppsPageState>).currentState from "while
(currentState != null)" to "while (currentState == null)" so the code awaits the
widget being mounted instead of looping forever when Apps is already present.

---

Duplicate comments:
In `@lib/pages/home.dart`:
- Around line 71-90: The crash occurs because _iconControllers and
_iconAnimations are declared late but build() may access them before the
post-frame callback populates them; initialize them to empty lists synchronously
(e.g., set _iconControllers = <AnimationController>[] and _iconAnimations =
<Animation<double>>[] in the field declaration or at the start of initState) and
then in the existing WidgetsBinding.instance.addPostFrameCallback
populate/replace those lists using getPages and the generated controllers,
calling setState afterwards; this ensures build() can safely read
_iconControllers/_iconAnimations before the post-frame callback runs.
- Around line 48-60: The build uses undeclared page keys _appsPageKey and
_addAppPageKey in _HomePageState causing a compile error; fix it by declaring
them as fields on _HomePageState (e.g. final GlobalKey or GlobalKey<State> typed
keys) and initialize them before use so AppsPage(key: _appsPageKey) and
AddAppPage(key: _addAppPageKey) receive valid keys; locate the _HomePageState
class and add the _appsPageKey and _addAppPageKey declarations (typed
appropriately for AppsPage and AddAppPage) and initialize them in-place or in
initState.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: edf5e64f-17ea-4d0f-9dcd-1145ffe1d812

📥 Commits

Reviewing files that changed from the base of the PR and between 2506ce8 and 69b108b.

📒 Files selected for processing (1)
  • lib/pages/home.dart

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 CI Build Failed

The automated build process failed. Please review the build logs and fix the issues before requesting another review.

Next steps:

  1. Check the build logs for specific errors
  2. Fix the identified issues
  3. Push your fixes to this branch
  4. The CI will automatically re-run

Once the build passes, this review will be dismissed automatically.

omeritzics and others added 3 commits March 15, 2026 13:11
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@github-actions github-actions bot dismissed their stale review March 15, 2026 11:49

CI Build Passed - Automatically dismissing previous rejection as the build now succeeds.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

Note

Due to the large number of review comments, Critical severity comments were prioritized as inline comments.

♻️ Duplicate comments (1)
lib/pages/home.dart (1)

49-65: ⚠️ Potential issue | 🔴 Critical

Keep the page GlobalKeys stable.

getPages() still creates fresh GlobalKeys and page instances on every call, so the currentState lookups used by the deep-link handlers and onWillPop never point at the mounted AppsPage / AddAppPage. In practice this can hang goToAddApp() / goToExistingApp(), skip clearSelected(), and reset page state on rebuild.

🛠️ Proposed fix
 class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
+  final GlobalKey<AppsPageState> _appsPageKey = GlobalKey<AppsPageState>();
+  final GlobalKey<AddAppPageState> _addAppPageKey =
+      GlobalKey<AddAppPageState>();
+
   List<NavigationPageItem> getPages(SettingsProvider settingsProvider) {
     return [
       NavigationPageItem(
         tr('appsString'),
         Icons.apps,
-        AppsPage(key: GlobalKey<AppsPageState>()),
+        AppsPage(key: _appsPageKey),
       ),
       NavigationPageItem(
         settingsProvider.safeMode ? tr('importExport') : tr('addApp'),
         settingsProvider.safeMode ? Icons.import_export : Icons.add_circle,
         settingsProvider.safeMode
             ? const ImportExportPage()
-            : AddAppPage(key: GlobalKey<AddAppPageState>()),
+            : AddAppPage(key: _addAppPageKey),
       ),
       NavigationPageItem(tr('settings'), Icons.settings, const SettingsPage()),
     ];
   }

Then use _appsPageKey / _addAppPageKey directly at the currentState call sites instead of recasting pages[i].widget.key.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/home.dart` around lines 49 - 65, getPages currently constructs new
GlobalKey instances and page widgets on each call causing stale currentState
lookups; make two persistent fields (e.g. _appsPageKey and _addAppPageKey of
types GlobalKey<AppsPageState> and GlobalKey<AddAppPageState>) and use them when
building the NavigationPageItem widgets inside getPages so the same keys are
reused across rebuilds, and update any deep-link/onWillPop call sites that
extract currentState from pages[i].widget.key to instead reference
_appsPageKey.currentState and _addAppPageKey.currentState directly.
🟠 Major comments (16)
assets/translations/gl.json-247-249 (1)

247-249: ⚠️ Potential issue | 🟠 Major

Sync gl.json with source locale—18 keys missing.

The Safe Mode additions here are syntactically correct. However, CI is failing because gl.json is missing 18 translation keys that exist in en.json:

apkcombo, apkmirror, apkpure, appLogsHint, appSourceHint, aptoide, codeberg, gitlab, html, huaweiappgallery, izzyondroid, jenkins, neutroncode, rustore, sourcehut, telegramapp, uptodown, wikiHint

Please add these missing translations before merge.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/gl.json` around lines 247 - 249, Add the 18 missing
translation keys to gl.json so it matches en.json: apkcombo, apkmirror, apkpure,
appLogsHint, appSourceHint, aptoide, codeberg, gitlab, html, huaweiappgallery,
izzyondroid, jenkins, neutroncode, rustore, sourcehut, telegramapp, uptodown,
wikiHint; insert each key into the JSON object in the same style as the existing
Safe Mode entries (use proper Galician translations where available, otherwise
add the English string or a short placeholder), ensuring valid JSON syntax and
no duplicate keys so CI will pass.
assets/translations/ko.json.bak-1-429 (1)

1-429: ⚠️ Potential issue | 🟠 Major

Remove the .bak backup file from this commit.

The ko.json.bak file is a backup artifact that should not be committed to the repository. The actual ko.json file already contains the Safe Mode translations (verified), so this backup is unnecessary. Additionally, .bak patterns should be added to .gitignore to prevent accidental inclusion of editor backups in future commits.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/ko.json.bak` around lines 1 - 429, This commit
accidentally includes a backup artifact (ko.json.bak); remove that file from the
commit/branch and from future commits, and add a .bak pattern to .gitignore so
editor backups aren't tracked; specifically, delete/unstage the file named
ko.json.bak (or remove it from the index if already committed), ensure the real
ko.json remains, update .gitignore to include *.bak (or .bak) and create a
follow-up commit that removes the backup and updates .gitignore.
assets/translations/id.json-247-250 (1)

247-250: ⚠️ Potential issue | 🟠 Major

id.json still has missing translation keys.

The Safe Mode additions and phrasing update at Line 247-250 look fine, but the file still fails key-parity checks in CI.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/id.json` around lines 247 - 250, The Indonesian
translation file is missing keys required for key-parity CI checks; compare the
master English keys (e.g., "safeMode", "safeModeDescription",
"safeModeAddAppDisabled", "tryInferAppIdFromCode") against
assets/translations/id.json and add any missing keys with appropriate Indonesian
translations (or placeholder values) so all keys present in the source locale
are present here; ensure the JSON remains valid (no trailing commas) and run the
parity script/CI locally to confirm the file passes before pushing.
assets/translations/et.json-247-250 (1)

247-250: ⚠️ Potential issue | 🟠 Major

et.json still fails translation key parity.

Despite the new entries at Line 247-250, CI reports missing keys in assets/translations/et.json, so this file still blocks the translation pipeline.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/et.json` around lines 247 - 250, The Estonian
translations file assets/translations/et.json is missing keys required by the
source locale; ensure key parity by adding all missing translation keys found in
the source (e.g., check against keys like "safeMode", "safeModeDescription",
"safeModeAddAppDisabled", "tryInferAppIdFromCode" and any others present in the
source locale but absent here), update et.json with those keys and appropriate
Estonian values, then re-run the translation/CI check (or the i18n parity
script) to confirm no keys are missing.
assets/translations/fa.json-247-249 (1)

247-249: ⚠️ Potential issue | 🟠 Major

fa.json still fails the translation-key completeness check.

Line 247-249 adds the Safe Mode entries, but CI still reports missing keys for assets/translations/fa.json.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/fa.json` around lines 247 - 249, The Persian translation
file is still failing completeness — add any missing translation keys present in
the canonical source (e.g., ensure all keys analogous to the English file are
present) and fix JSON syntax (remove the trailing comma after
"safeModeAddAppDisabled") so the file parses; specifically confirm the keys
"safeMode", "safeModeDescription", and "safeModeAddAppDisabled" are present and
translated, add any other missing keys reported by CI, and validate the file
with a JSON linter before pushing.
assets/translations/tr.json-247-249 (1)

247-249: ⚠️ Potential issue | 🟠 Major

tr.json remains out-of-sync with en.json keys.

The new Safe Mode strings are valid, but CI still flags missing keys in this locale file.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/tr.json` around lines 247 - 249, The Turkish locale file
is missing keys compared to en.json causing CI failures; open
assets/translations/tr.json and ensure it contains the same keys as en.json for
the Safe Mode section (e.g., "safeMode", "safeModeDescription",
"safeModeAddAppDisabled" and any other new Safe Mode-related keys present in
en.json), add the missing keys with appropriate Turkish translations, and re-run
the i18n/CI check to verify synchronization.
assets/translations/en-EO.json-247-249 (1)

247-249: ⚠️ Potential issue | 🟠 Major

en-EO.json still has missing keys relative to en.json.

The Safe Mode additions are correct, but CI still flags missing keys in this locale, so translation parity is not complete yet.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/en-EO.json` around lines 247 - 249, The en-EO locale is
missing keys compared to en.json causing CI failures; update
assets/translations/en-EO.json to include all keys present in en.json (not just
"safeMode", "safeModeDescription", "safeModeAddAppDisabled"), adding any missing
top-level and nested keys with proper Esperanto translations or temporary
English fallbacks, then run the locale key parity check to confirm all keys
match; focus your updates around the safeMode-related keys and ensure the full
key set is synchronized.
assets/translations/nl.json.bak-1-429 (1)

1-429: ⚠️ Potential issue | 🟠 Major

Changes were made to nl.json.bak, but CI validates nl.json.

The pipeline failure is for nl.json; updating assets/translations/nl.json.bak will not fix runtime/test key parity.

Suggested fix direction
- assets/translations/nl.json.bak
+ assets/translations/nl.json

Apply these translation updates to assets/translations/nl.json (or sync both, with nl.json as the source used by the app/tests).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/nl.json.bak` around lines 1 - 429, The CI failure is due
to translations being updated only in assets/translations/nl.json.bak while the
app/tests validate assets/translations/nl.json; sync the real translation file.
Copy or apply the changes from nl.json.bak into assets/translations/nl.json
(ensure keys like "invalidURLForSource", "noReleaseFound",
"googleVerificationWarningP1", etc., match exactly) or make nl.json the
authoritative source and update the backup accordingly, then run the translation
validation to confirm parity.
assets/translations/ja.json-247-250 (1)

247-250: ⚠️ Potential issue | 🟠 Major

Translation key parity is still failing for ja.json.

The additions at lines 247–250 are fine, but CI still reports 18 missing keys in assets/translations/ja.json: apkcombo, apkmirror, apkpure, appLogsHint, appSourceHint, aptoide, codeberg, gitlab, html, huaweiappgallery, izzyondroid, jenkins, neutroncode, rustore, sourcehut, telegramapp, uptodown, wikiHint. This remains a merge blocker.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/ja.json` around lines 247 - 250, The ja.json is missing
18 translation keys required by CI; open assets/translations/ja.json and add the
missing keys (apkcombo, apkmirror, apkpure, appLogsHint, appSourceHint, aptoide,
codeberg, gitlab, html, huaweiappgallery, izzyondroid, jenkins, neutroncode,
rustore, sourcehut, telegramapp, uptodown, wikiHint) alongside the existing keys
such as "safeMode", "safeModeDescription", "safeModeAddAppDisabled", and
"tryInferAppIdFromCode"; provide appropriate Japanese strings for each key so
the file has parity with the other locales and CI will stop reporting missing
keys.
assets/translations/ml.json-253-256 (1)

253-256: ⚠️ Potential issue | 🟠 Major

minStarCount appears to have been dropped in this edit block.

After Line 255, the file jumps to addInfoBelow (Line 256) and minStarCount is missing, which breaks translation parity and affects the GitHub source settings label.

Suggested fix
     "safeMode": "സുരക്ഷിത മോഡ്",
     "safeModeDescription": "അപ്പ് ചേർക്കൽ പേജ് മറയ്ക്കുകയും പകരം ഇറക്കുമതി/കയറ്റുമതി കാണിക്കുക",
     "safeModeAddAppDisabled": "അപ്പ് ചേർക്കൽ സുരക്ഷിത മോഡിൽ പ്രവർത്തനരഹിതമാണ്",
+    "minStarCount": "Minimum star count",
     "addInfoBelow": "ഈ വിവരങ്ങൾ താഴെ ചേർക്കുക.",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/ml.json` around lines 253 - 256, The translation key
minStarCount was accidentally removed between safeModeAddAppDisabled and
addInfoBelow, breaking parity; restore the missing "minStarCount" entry with the
correct Malayalam translation (matching the original key name minStarCount)
inserted after safeModeAddAppDisabled and before addInfoBelow so the JSON keys
order/parity and the GitHub source settings label are preserved—look for the
surrounding keys safeMode, safeModeDescription, safeModeAddAppDisabled, and
addInfoBelow to locate where to re-add minStarCount.
assets/translations/vi.json-247-250 (1)

247-250: ⚠️ Potential issue | 🟠 Major

vi.json still needs to be fully synced.

Translation Management is still failing on vi.json, so the real Vietnamese locale is incomplete after this change. The backup file in this PR will not satisfy that check.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/vi.json` around lines 247 - 250, The Vietnamese
translations file (vi.json) is incomplete and failing translation management;
ensure the full locale is synchronized by adding all missing keys and correct
translations instead of the backup entries shown — update the entries around
"safeMode", "safeModeDescription", "safeModeAddAppDisabled", and
"tryInferAppIdFromCode" and any other untranslated or placeholder keys to match
the canonical translation source (e.g., from en.json or the translation master),
run the translation validation/tooling to confirm no missing keys or format
errors, and commit the fully synced vi.json so the translation check passes.
assets/translations/ru.json-247-250 (1)

247-250: ⚠️ Potential issue | 🟠 Major

Sync ru.json with the source locale before merging.

CI is still reporting missing translation keys in ru.json, so adding the Safe Mode entries here was not sufficient to make the locale valid again.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/ru.json` around lines 247 - 250, The ru.json file is
missing other translation keys from the source locale; update/sync ru.json with
the full set of keys from the source locale (not just add safeMode,
safeModeDescription, safeModeAddAppDisabled, tryInferAppIdFromCode) so the
locale passes CI. Locate the canonical source locale file (e.g., en.json) and
merge any missing keys into ru.json, provide Russian translations (or
placeholders) for all new keys, and then run the project's
translation/validation script or CI checks locally to confirm no keys are
missing before pushing the change.
assets/translations/pt.json-247-250 (1)

247-250: ⚠️ Potential issue | 🟠 Major

Sync pt.json with the source locale before merging.

The Translation Management job is still reporting missing keys in pt.json, so this locale update is incomplete and the PR will stay red until the file is brought back in sync with en.json.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/pt.json` around lines 247 - 250, pt.json is out of sync
with the source locale (en.json); update the Portuguese translations to include
all missing keys present in en.json and remove any stale differences—compare
en.json against the current keys (e.g., "safeMode", "safeModeDescription",
"safeModeAddAppDisabled", "tryInferAppIdFromCode"), add the absent keys with
Portuguese values or placeholders, keep key ordering consistent with en.json,
ensure valid JSON (no trailing commas) and run the translation/CI validation
script so the Translation Management job passes before merging.
assets/translations/vi.json.bak-1-429 (1)

1-429: ⚠️ Potential issue | 🟠 Major

Move .bak locale files outside the translations asset directory.

The localization loader ignores .bak files and only loads .json files matching supported locales. While CI validates only .json files, keeping backup files in the bundled asset directory adds unnecessary clutter, creates confusion about which file is used, and keeps them tracked in version control. Store backups outside assets/translations/ instead.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/vi.json.bak` around lines 1 - 429, Remove the backup
locale file (e.g. vi.json.bak) from the translations asset bundle and place it
outside the translations assets directory (or into a dedicated backups folder)
so the localization loader only sees supported .json files; update project
assets configuration (and .gitignore or packaging rules if needed) to stop
including *.bak files in builds and remove vi.json.bak from version control so
CI and runtime only load the canonical vi.json.
assets/translations/hu.json.bak-1-429 (1)

1-429: ⚠️ Potential issue | 🟠 Major

Add 17 missing translation keys to hu.json.

The Hungarian translation file is missing keys that exist in the English template: aptoide, neutroncode, rustore, sourcehut, apkpure, apkcombo, appSourceHint, gitlab, huaweiappgallery, apkmirror, izzyondroid, jenkins, appLogsHint, uptodown, codeberg, html, wikiHint, telegramapp. These will cause runtime failures when the app tries to display these strings. The .bak file is a documented backup created by the translation management system and can be ignored.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/hu.json.bak` around lines 1 - 429, The Hungarian
translation is missing 17 keys (aptoide, neutroncode, rustore, sourcehut,
apkpure, apkcombo, appSourceHint, gitlab, huaweiappgallery, apkmirror,
izzyondroid, jenkins, appLogsHint, uptodown, codeberg, html, wikiHint,
telegramapp); add these keys to the Hungarian JSON (assets/translations/hu.json)
with appropriate Hungarian strings (or temporary English fallbacks) matching the
same key names so runtime lookups succeed, ensuring the keys exactly match the
missing identifiers listed and that the file remains valid JSON.
assets/translations/zh-Hant-TW.json.bak-1-429 (1)

1-429: ⚠️ Potential issue | 🟠 Major

Remove all backup files (*.bak) from version control and add to .gitignore.

All 17 translation backup files in assets/translations/ were committed in a single update but are now out of sync with their corresponding main .json files. For example, zh-Hant-TW.json.bak is missing the 3 Safe Mode keys that exist in zh-Hant-TW.json.

Backup files should not be tracked in version control—they create maintenance overhead and are prone to becoming stale. Add *.bak to .gitignore and remove the backup files from the repository.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/zh-Hant-TW.json.bak` around lines 1 - 429, The repo
contains committed translation backup files like
assets/translations/zh-Hant-TW.json.bak that are stale—remove all *.bak
translation backups (all 17) from version control while leaving the main .json
translation files intact, and add the *.bak pattern to .gitignore so future
backups are not tracked; ensure you remove the files from the index (not just
locally) and commit the .gitignore change.
🟡 Minor comments (2)
lib/pages/home.dart-379-381 (1)

379-381: ⚠️ Potential issue | 🟡 Minor

Localize the Semantics label and hint to match the rest of the codebase.

The hard-coded English strings at lines 379-381 are inconsistent with how all other Semantics widgets in the app use tr(). This causes screen reader users on non-English locales to hear untranslated navigation copy. Wrap both the label and the conditional hint text in tr() calls—the translation keys for 'importExport' and 'addApp' already exist in the translation files. You'll also need to add a translation key for 'Main navigation'.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/home.dart` around lines 379 - 381, Localize the Semantics strings
in the bottomNavigationBar: wrap the Semantics `label` and the conditional
`hint` in tr() calls instead of hard-coded English, using the existing
translation keys 'importExport' and 'addApp' for the conditional branch tied to
`settingsProvider.safeMode`, and add a new translation key (e.g.
'mainNavigation') to your i18n files to replace "Main navigation" so screen
readers get localized text; update the `Semantics` invocation in home.dart
accordingly.
assets/translations/pl.json.bak-1-459 (1)

1-459: ⚠️ Potential issue | 🟡 Minor

Remove pl.json.bak from assets/translations/ since it is unused at runtime.

The .bak file is never loaded by easy_localization and adds unnecessary bloat to the asset bundle. The new translation keys (safeMode, safeModeDescription, safeModeAddAppDisabled) are already present in the active pl.json file. If version history is needed, use Git instead of committing backup files.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/pl.json.bak` around lines 1 - 459, Remove the unused
backup translation file pl.json.bak from the repository and assets so it is not
bundled at runtime; confirm that the active pl.json already contains the new
keys (safeMode, safeModeDescription, safeModeAddAppDisabled) and that
easy_localization only loads the canonical pl.json, then commit the deletion
(use Git history if you need the backup instead of keeping a .bak file in
assets).
🧹 Nitpick comments (1)
assets/translations/gl.json (1)

248-249: Consider consistent terminology for “app” labels.

These new strings use “aplicación”, while existing UI keys (for example, addApp) use “app”. Consider aligning terms for consistency.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/gl.json` around lines 248 - 249, The new translation keys
safeModeDescription and safeModeAddAppDisabled use the term “aplicación” which
is inconsistent with existing keys like addApp that use “app”; update the
Galician strings to use the same term (“app”) or match whichever canonical term
the UI uses, e.g., replace “aplicación” with “app” in safeModeDescription and
safeModeAddAppDisabled so terminology is consistent across keys.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@assets/translations/bs.json`:
- Around line 247-249: The bs.json file is missing many keys compared to the
base locale; add all missing keys so the file has full parity (including
placeholder patterns and plural forms) with the source locale; update or copy
the corresponding entries from the base locale into bs.json for every missing
key (e.g., ensure keys such as "safeMode", "safeModeDescription",
"safeModeAddAppDisabled" remain and add the other ~469 missing keys), preserve
placeholder tokens and ICU/plural syntax exactly, and validate the JSON after
syncing to unblock CI.

In `@assets/translations/cs.json`:
- Around line 247-249: cs.json is missing translation keys required for parity
with the base locale; update the file to include all keys present in the base
translation (ensure you add any missing keys beyond the existing "safeMode",
"safeModeDescription", and "safeModeAddAppDisabled"), using the same key names
as in the base file so CI's key parity check passes; after adding the keys, run
the translation parity/CI check locally (or re-run the pipeline) to confirm no
keys are missing.

In `@assets/translations/da.json`:
- Around line 247-249: da.json is missing required translation keys causing the
completeness check to fail; open the source locale (e.g., en.json) and sync all
missing keys into assets/translations/da.json, ensuring you include every
top-level and nested key (including "safeMode", "safeModeDescription",
"safeModeAddAppDisabled" and any keys present in en.json but absent here),
preserve the exact key names and JSON structure, provide Danish translations for
each missing entry, and validate the JSON before committing.

In `@assets/translations/it.json`:
- Around line 247-249: The it.json locale is missing translation keys beyond the
three Safe Mode entries ("safeMode", "safeModeDescription",
"safeModeAddAppDisabled"); update it by syncing the full keyset from the source
locale (e.g., compare with the canonical en.json) and add all missing keys with
Italian translations or placeholders, ensuring you cover nested keys and
metadata; after updating, run the translation validation script/CI check used in
the repo to confirm no keys are missing and commit the synchronized it.json.

In `@assets/translations/ko.json`:
- Around line 247-250: The Korean translation file ko.json is missing required
keys beyond the newly added Safe Mode entries; synchronize ko.json with the
source keyset (e.g., en.json) by merging all missing keys into ko.json and
providing Korean strings or placeholders for them. Locate the translation keys
(such as safeMode, safeModeDescription, safeModeAddAppDisabled,
tryInferAppIdFromCode) in the diff as anchors, run or re-run the project’s i18n
extraction/sync script (or copy missing keys from the canonical locale) to
ensure the full keyset is present, then validate the file with the localization
lint/CI check so the missing-key errors are resolved.

In `@assets/translations/pt-BR.json`:
- Around line 247-250: The pt-BR translation file is missing keys compared to
the base locale; update assets/translations/pt-BR.json by synchronizing all keys
from the base locale (e.g., add any keys missing beyond "safeMode",
"safeModeDescription", "safeModeAddAppDisabled", "tryInferAppIdFromCode") and
provide Portuguese translations for each new key so the file matches the base
locale structure exactly; ensure no leftover keys are removed and run the
translation validation script to confirm the file is in sync.

In `@assets/translations/sv.json`:
- Around line 247-249: The Swedish locale is missing translation keys compared
to the source set; update the sv.json to full key parity by adding any missing
entries (not just "safeMode", "safeModeDescription", and
"safeModeAddAppDisabled") that exist in the source translations, using the same
key names and providing Swedish translations (pull the full key list from the
source locale, e.g., en.json) and then re-run the i18n/CI check to confirm no
keys are missing.

In `@assets/translations/uk.json`:
- Around line 247-249: uk.json is missing keys compared to the base locale so
the translation check fails; synchronize this file with the base locale (e.g.,
en.json) by adding any missing keys and removing/adjusting any extras while
preserving the existing translations for "safeMode", "safeModeDescription", and
"safeModeAddAppDisabled". To fix: run the project's i18n sync script or diff
uk.json against the base locale and copy over all missing keys (providing
Ukrainian strings or placeholders), ensure the keyset and ordering match the
base, and re-run the translation/CI check to confirm the file is fully in sync.

---

Major comments:
In `@assets/translations/en-EO.json`:
- Around line 247-249: The en-EO locale is missing keys compared to en.json
causing CI failures; update assets/translations/en-EO.json to include all keys
present in en.json (not just "safeMode", "safeModeDescription",
"safeModeAddAppDisabled"), adding any missing top-level and nested keys with
proper Esperanto translations or temporary English fallbacks, then run the
locale key parity check to confirm all keys match; focus your updates around the
safeMode-related keys and ensure the full key set is synchronized.

In `@assets/translations/et.json`:
- Around line 247-250: The Estonian translations file
assets/translations/et.json is missing keys required by the source locale;
ensure key parity by adding all missing translation keys found in the source
(e.g., check against keys like "safeMode", "safeModeDescription",
"safeModeAddAppDisabled", "tryInferAppIdFromCode" and any others present in the
source locale but absent here), update et.json with those keys and appropriate
Estonian values, then re-run the translation/CI check (or the i18n parity
script) to confirm no keys are missing.

In `@assets/translations/fa.json`:
- Around line 247-249: The Persian translation file is still failing
completeness — add any missing translation keys present in the canonical source
(e.g., ensure all keys analogous to the English file are present) and fix JSON
syntax (remove the trailing comma after "safeModeAddAppDisabled") so the file
parses; specifically confirm the keys "safeMode", "safeModeDescription", and
"safeModeAddAppDisabled" are present and translated, add any other missing keys
reported by CI, and validate the file with a JSON linter before pushing.

In `@assets/translations/gl.json`:
- Around line 247-249: Add the 18 missing translation keys to gl.json so it
matches en.json: apkcombo, apkmirror, apkpure, appLogsHint, appSourceHint,
aptoide, codeberg, gitlab, html, huaweiappgallery, izzyondroid, jenkins,
neutroncode, rustore, sourcehut, telegramapp, uptodown, wikiHint; insert each
key into the JSON object in the same style as the existing Safe Mode entries
(use proper Galician translations where available, otherwise add the English
string or a short placeholder), ensuring valid JSON syntax and no duplicate keys
so CI will pass.

In `@assets/translations/hu.json.bak`:
- Around line 1-429: The Hungarian translation is missing 17 keys (aptoide,
neutroncode, rustore, sourcehut, apkpure, apkcombo, appSourceHint, gitlab,
huaweiappgallery, apkmirror, izzyondroid, jenkins, appLogsHint, uptodown,
codeberg, html, wikiHint, telegramapp); add these keys to the Hungarian JSON
(assets/translations/hu.json) with appropriate Hungarian strings (or temporary
English fallbacks) matching the same key names so runtime lookups succeed,
ensuring the keys exactly match the missing identifiers listed and that the file
remains valid JSON.

In `@assets/translations/id.json`:
- Around line 247-250: The Indonesian translation file is missing keys required
for key-parity CI checks; compare the master English keys (e.g., "safeMode",
"safeModeDescription", "safeModeAddAppDisabled", "tryInferAppIdFromCode")
against assets/translations/id.json and add any missing keys with appropriate
Indonesian translations (or placeholder values) so all keys present in the
source locale are present here; ensure the JSON remains valid (no trailing
commas) and run the parity script/CI locally to confirm the file passes before
pushing.

In `@assets/translations/ja.json`:
- Around line 247-250: The ja.json is missing 18 translation keys required by
CI; open assets/translations/ja.json and add the missing keys (apkcombo,
apkmirror, apkpure, appLogsHint, appSourceHint, aptoide, codeberg, gitlab, html,
huaweiappgallery, izzyondroid, jenkins, neutroncode, rustore, sourcehut,
telegramapp, uptodown, wikiHint) alongside the existing keys such as "safeMode",
"safeModeDescription", "safeModeAddAppDisabled", and "tryInferAppIdFromCode";
provide appropriate Japanese strings for each key so the file has parity with
the other locales and CI will stop reporting missing keys.

In `@assets/translations/ko.json.bak`:
- Around line 1-429: This commit accidentally includes a backup artifact
(ko.json.bak); remove that file from the commit/branch and from future commits,
and add a .bak pattern to .gitignore so editor backups aren't tracked;
specifically, delete/unstage the file named ko.json.bak (or remove it from the
index if already committed), ensure the real ko.json remains, update .gitignore
to include *.bak (or .bak) and create a follow-up commit that removes the backup
and updates .gitignore.

In `@assets/translations/ml.json`:
- Around line 253-256: The translation key minStarCount was accidentally removed
between safeModeAddAppDisabled and addInfoBelow, breaking parity; restore the
missing "minStarCount" entry with the correct Malayalam translation (matching
the original key name minStarCount) inserted after safeModeAddAppDisabled and
before addInfoBelow so the JSON keys order/parity and the GitHub source settings
label are preserved—look for the surrounding keys safeMode, safeModeDescription,
safeModeAddAppDisabled, and addInfoBelow to locate where to re-add minStarCount.

In `@assets/translations/nl.json.bak`:
- Around line 1-429: The CI failure is due to translations being updated only in
assets/translations/nl.json.bak while the app/tests validate
assets/translations/nl.json; sync the real translation file. Copy or apply the
changes from nl.json.bak into assets/translations/nl.json (ensure keys like
"invalidURLForSource", "noReleaseFound", "googleVerificationWarningP1", etc.,
match exactly) or make nl.json the authoritative source and update the backup
accordingly, then run the translation validation to confirm parity.

In `@assets/translations/pt.json`:
- Around line 247-250: pt.json is out of sync with the source locale (en.json);
update the Portuguese translations to include all missing keys present in
en.json and remove any stale differences—compare en.json against the current
keys (e.g., "safeMode", "safeModeDescription", "safeModeAddAppDisabled",
"tryInferAppIdFromCode"), add the absent keys with Portuguese values or
placeholders, keep key ordering consistent with en.json, ensure valid JSON (no
trailing commas) and run the translation/CI validation script so the Translation
Management job passes before merging.

In `@assets/translations/ru.json`:
- Around line 247-250: The ru.json file is missing other translation keys from
the source locale; update/sync ru.json with the full set of keys from the source
locale (not just add safeMode, safeModeDescription, safeModeAddAppDisabled,
tryInferAppIdFromCode) so the locale passes CI. Locate the canonical source
locale file (e.g., en.json) and merge any missing keys into ru.json, provide
Russian translations (or placeholders) for all new keys, and then run the
project's translation/validation script or CI checks locally to confirm no keys
are missing before pushing the change.

In `@assets/translations/tr.json`:
- Around line 247-249: The Turkish locale file is missing keys compared to
en.json causing CI failures; open assets/translations/tr.json and ensure it
contains the same keys as en.json for the Safe Mode section (e.g., "safeMode",
"safeModeDescription", "safeModeAddAppDisabled" and any other new Safe
Mode-related keys present in en.json), add the missing keys with appropriate
Turkish translations, and re-run the i18n/CI check to verify synchronization.

In `@assets/translations/vi.json`:
- Around line 247-250: The Vietnamese translations file (vi.json) is incomplete
and failing translation management; ensure the full locale is synchronized by
adding all missing keys and correct translations instead of the backup entries
shown — update the entries around "safeMode", "safeModeDescription",
"safeModeAddAppDisabled", and "tryInferAppIdFromCode" and any other untranslated
or placeholder keys to match the canonical translation source (e.g., from
en.json or the translation master), run the translation validation/tooling to
confirm no missing keys or format errors, and commit the fully synced vi.json so
the translation check passes.

In `@assets/translations/vi.json.bak`:
- Around line 1-429: Remove the backup locale file (e.g. vi.json.bak) from the
translations asset bundle and place it outside the translations assets directory
(or into a dedicated backups folder) so the localization loader only sees
supported .json files; update project assets configuration (and .gitignore or
packaging rules if needed) to stop including *.bak files in builds and remove
vi.json.bak from version control so CI and runtime only load the canonical
vi.json.

In `@assets/translations/zh-Hant-TW.json.bak`:
- Around line 1-429: The repo contains committed translation backup files like
assets/translations/zh-Hant-TW.json.bak that are stale—remove all *.bak
translation backups (all 17) from version control while leaving the main .json
translation files intact, and add the *.bak pattern to .gitignore so future
backups are not tracked; ensure you remove the files from the index (not just
locally) and commit the .gitignore change.

---

Minor comments:
In `@assets/translations/pl.json.bak`:
- Around line 1-459: Remove the unused backup translation file pl.json.bak from
the repository and assets so it is not bundled at runtime; confirm that the
active pl.json already contains the new keys (safeMode, safeModeDescription,
safeModeAddAppDisabled) and that easy_localization only loads the canonical
pl.json, then commit the deletion (use Git history if you need the backup
instead of keeping a .bak file in assets).

In `@lib/pages/home.dart`:
- Around line 379-381: Localize the Semantics strings in the
bottomNavigationBar: wrap the Semantics `label` and the conditional `hint` in
tr() calls instead of hard-coded English, using the existing translation keys
'importExport' and 'addApp' for the conditional branch tied to
`settingsProvider.safeMode`, and add a new translation key (e.g.
'mainNavigation') to your i18n files to replace "Main navigation" so screen
readers get localized text; update the `Semantics` invocation in home.dart
accordingly.

---

Duplicate comments:
In `@lib/pages/home.dart`:
- Around line 49-65: getPages currently constructs new GlobalKey instances and
page widgets on each call causing stale currentState lookups; make two
persistent fields (e.g. _appsPageKey and _addAppPageKey of types
GlobalKey<AppsPageState> and GlobalKey<AddAppPageState>) and use them when
building the NavigationPageItem widgets inside getPages so the same keys are
reused across rebuilds, and update any deep-link/onWillPop call sites that
extract currentState from pages[i].widget.key to instead reference
_appsPageKey.currentState and _addAppPageKey.currentState directly.

---

Nitpick comments:
In `@assets/translations/gl.json`:
- Around line 248-249: The new translation keys safeModeDescription and
safeModeAddAppDisabled use the term “aplicación” which is inconsistent with
existing keys like addApp that use “app”; update the Galician strings to use the
same term (“app”) or match whichever canonical term the UI uses, e.g., replace
“aplicación” with “app” in safeModeDescription and safeModeAddAppDisabled so
terminology is consistent across keys.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ba7e9ef9-5738-4426-bf9c-cac9ff2dfd88

📥 Commits

Reviewing files that changed from the base of the PR and between 69b108b and 980f816.

📒 Files selected for processing (48)
  • assets/translations/ar.json
  • assets/translations/bs.json
  • assets/translations/ca.json
  • assets/translations/cs.json
  • assets/translations/da.json
  • assets/translations/de.json
  • assets/translations/en-EO.json
  • assets/translations/es.json
  • assets/translations/et.json
  • assets/translations/fa.json
  • assets/translations/fr.json
  • assets/translations/gl.json
  • assets/translations/he.json
  • assets/translations/hu.json
  • assets/translations/hu.json.bak
  • assets/translations/id.json
  • assets/translations/id.json.bak
  • assets/translations/it.json
  • assets/translations/it.json.bak
  • assets/translations/ja.json
  • assets/translations/ja.json.bak
  • assets/translations/ko.json
  • assets/translations/ko.json.bak
  • assets/translations/ml.json
  • assets/translations/ml.json.bak
  • assets/translations/nl.json
  • assets/translations/nl.json.bak
  • assets/translations/pl.json
  • assets/translations/pl.json.bak
  • assets/translations/pt-BR.json
  • assets/translations/pt-BR.json.bak
  • assets/translations/pt.json
  • assets/translations/pt.json.bak
  • assets/translations/ru.json
  • assets/translations/ru.json.bak
  • assets/translations/sv.json
  • assets/translations/sv.json.bak
  • assets/translations/tr.json
  • assets/translations/tr.json.bak
  • assets/translations/uk.json
  • assets/translations/uk.json.bak
  • assets/translations/vi.json
  • assets/translations/vi.json.bak
  • assets/translations/zh-Hant-TW.json
  • assets/translations/zh-Hant-TW.json.bak
  • assets/translations/zh.json
  • assets/translations/zh.json.bak
  • lib/pages/home.dart
✅ Files skipped from review due to trivial changes (12)
  • assets/translations/it.json.bak
  • assets/translations/zh.json.bak
  • assets/translations/ja.json.bak
  • assets/translations/tr.json.bak
  • assets/translations/hu.json
  • assets/translations/id.json.bak
  • assets/translations/uk.json.bak
  • assets/translations/sv.json.bak
  • assets/translations/pt.json.bak
  • assets/translations/ru.json.bak
  • assets/translations/pt-BR.json.bak
  • assets/translations/ml.json.bak

Comment on lines +247 to +249
"safeMode": "Sigurnosni režim",
"safeModeDescription": "Sakrij stranicu za dodavanje aplikacija i prikaži uvoz/izvoz umjesto toga",
"safeModeAddAppDisabled": "Dodavanje aplikacija je onemogućeno u sigurnosnom režimu",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Unblock CI by fully syncing bs.json keys with the base locale.

The added Safe Mode strings look fine, but the pipeline is still failing due to missing keys in this file (469 missing keys and explicit Missing keys in bs.json). Please complete key parity with the source locale (including placeholders/plurals) before merge.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/bs.json` around lines 247 - 249, The bs.json file is
missing many keys compared to the base locale; add all missing keys so the file
has full parity (including placeholder patterns and plural forms) with the
source locale; update or copy the corresponding entries from the base locale
into bs.json for every missing key (e.g., ensure keys such as "safeMode",
"safeModeDescription", "safeModeAddAppDisabled" remain and add the other ~469
missing keys), preserve placeholder tokens and ICU/plural syntax exactly, and
validate the JSON after syncing to unblock CI.

Comment on lines +247 to +249
"safeMode": "Bezpečný režim",
"safeModeDescription": "Skrýt stránku přidání aplikace a místo toho zobrazit Import/Export",
"safeModeAddAppDisabled": "Přidání aplikace je v bezpečném režimu zakázáno",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Translation check is still failing for this locale.

cs.json is still reported with missing keys by CI. Please complete key parity with the base translation file so the translation pipeline passes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/cs.json` around lines 247 - 249, cs.json is missing
translation keys required for parity with the base locale; update the file to
include all keys present in the base translation (ensure you add any missing
keys beyond the existing "safeMode", "safeModeDescription", and
"safeModeAddAppDisabled"), using the same key names as in the base file so CI's
key parity check passes; after adding the keys, run the translation parity/CI
check locally (or re-run the pipeline) to confirm no keys are missing.

Comment on lines +247 to +249
"safeMode": "Sikker tilstand",
"safeModeDescription": "Skjul Tilføj app-side og vis Import/Eksport i stedet",
"safeModeAddAppDisabled": "Tilføj app er deaktiveret i sikker tilstand",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

da.json still fails key completeness checks.

The Translation Management job reports missing keys for this locale. Please sync all required keys to fix the CI failure.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/da.json` around lines 247 - 249, da.json is missing
required translation keys causing the completeness check to fail; open the
source locale (e.g., en.json) and sync all missing keys into
assets/translations/da.json, ensuring you include every top-level and nested key
(including "safeMode", "safeModeDescription", "safeModeAddAppDisabled" and any
keys present in en.json but absent here), preserve the exact key names and JSON
structure, provide Danish translations for each missing entry, and validate the
JSON before committing.

Comment on lines +247 to +249
"safeMode": "Modalità sicura",
"safeModeDescription": "Nascondi pagina Aggiungi app e mostra Importa/Esporta invece",
"safeModeAddAppDisabled": "Aggiungi app è disabilitato in modalità sicura",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

CI blocker: it.json still has missing translation keys.

The Translation Management job explicitly flags missing keys in this locale. Adding the three Safe Mode strings is not sufficient yet; please sync the full keyset with the source locale.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/it.json` around lines 247 - 249, The it.json locale is
missing translation keys beyond the three Safe Mode entries ("safeMode",
"safeModeDescription", "safeModeAddAppDisabled"); update it by syncing the full
keyset from the source locale (e.g., compare with the canonical en.json) and add
all missing keys with Italian translations or placeholders, ensuring you cover
nested keys and metadata; after updating, run the translation validation
script/CI check used in the repo to confirm no keys are missing and commit the
synchronized it.json.

Comment on lines +247 to +250
"safeMode": "안전 모드",
"safeModeDescription": "앱 추가 페이지를 숨기고 대신 가져오기/내보내기 표시",
"safeModeAddAppDisabled": "앱 추가는 안전 모드에서 비활성화됩니다",
"tryInferAppIdFromCode": "소스 코드에서 앱 ID를 추론해보세요",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

CI blocker: ko.json is still missing required keys.

The translation workflow still reports missing keys for this file. Please synchronize this locale with the source keyset (not only the newly added Safe Mode entries).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/ko.json` around lines 247 - 250, The Korean translation
file ko.json is missing required keys beyond the newly added Safe Mode entries;
synchronize ko.json with the source keyset (e.g., en.json) by merging all
missing keys into ko.json and providing Korean strings or placeholders for them.
Locate the translation keys (such as safeMode, safeModeDescription,
safeModeAddAppDisabled, tryInferAppIdFromCode) in the diff as anchors, run or
re-run the project’s i18n extraction/sync script (or copy missing keys from the
canonical locale) to ensure the full keyset is present, then validate the file
with the localization lint/CI check so the missing-key errors are resolved.

Comment on lines +247 to +250
"safeMode": "Modo seguro",
"safeModeDescription": "Ocultar página Adicionar app e mostrar Importar/Exportar em vez disso",
"safeModeAddAppDisabled": "Adicionar app está desabilitado no modo seguro",
"tryInferAppIdFromCode": "Tentar inferir o ID do aplicativo a partir do código-fonte",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

CI blocker: pt-BR.json is still out of sync with required keys.

The translation workflow explicitly flags missing keys in this file. Please complete full key synchronization with the base locale to unblock the PR.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/pt-BR.json` around lines 247 - 250, The pt-BR translation
file is missing keys compared to the base locale; update
assets/translations/pt-BR.json by synchronizing all keys from the base locale
(e.g., add any keys missing beyond "safeMode", "safeModeDescription",
"safeModeAddAppDisabled", "tryInferAppIdFromCode") and provide Portuguese
translations for each new key so the file matches the base locale structure
exactly; ensure no leftover keys are removed and run the translation validation
script to confirm the file is in sync.

Comment on lines +247 to +249
"safeMode": "Säkert läge",
"safeModeDescription": "Dölj Lägg till app-sida och visa Importera/Exportera istället",
"safeModeAddAppDisabled": "Lägg till app är inaktiverat i säkert läge",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Translation pipeline blocker remains for sv.json.

CI still reports missing keys in this file. Please bring this locale to full key parity with the source translation set.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/sv.json` around lines 247 - 249, The Swedish locale is
missing translation keys compared to the source set; update the sv.json to full
key parity by adding any missing entries (not just "safeMode",
"safeModeDescription", and "safeModeAddAppDisabled") that exist in the source
translations, using the same key names and providing Swedish translations (pull
the full key list from the source locale, e.g., en.json) and then re-run the
i18n/CI check to confirm no keys are missing.

Comment on lines +247 to +249
"safeMode": "Безпечний режим",
"safeModeDescription": "Приховати сторінку Додати додаток і показати Імпорт/Експорт натомість",
"safeModeAddAppDisabled": "Додавання додатка вимкнено в безпечному режимі",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

CI blocker: locale keyset is still incomplete.

The translation pipeline reports missing keys in uk.json, so this file is still out of sync with the base locale despite adding the Safe Mode entries. Please fully sync keys to unblock the Translation Management check.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/uk.json` around lines 247 - 249, uk.json is missing keys
compared to the base locale so the translation check fails; synchronize this
file with the base locale (e.g., en.json) by adding any missing keys and
removing/adjusting any extras while preserving the existing translations for
"safeMode", "safeModeDescription", and "safeModeAddAppDisabled". To fix: run the
project's i18n sync script or diff uk.json against the base locale and copy over
all missing keys (providing Ukrainian strings or placeholders), ensure the
keyset and ordering match the base, and re-run the translation/CI check to
confirm the file is fully in sync.

@omeritzics omeritzics merged commit 1146d06 into main Mar 15, 2026
10 of 11 checks passed
@omeritzics omeritzics deleted the safe-mode branch March 15, 2026 12:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant