Skip to content

Added container config export/import for all platforms#649

Merged
utkarshdalal merged 3 commits intoutkarshdalal:masterfrom
unbelievableflavour:config-export-for-all-platforms
Mar 10, 2026
Merged

Added container config export/import for all platforms#649
utkarshdalal merged 3 commits intoutkarshdalal:masterfrom
unbelievableflavour:config-export-for-all-platforms

Conversation

@unbelievableflavour
Copy link
Contributor

@unbelievableflavour unbelievableflavour commented Feb 25, 2026

No config import yet, export is already a useful feature to have even without import.

Summary by CodeRabbit

  • New Features

    • Config export now saves a pretty‑printed JSON file and shows success/failure feedback.
    • Config import remains available from the app's config menu.
  • Refactor

    • Config import/export consolidated into a unified, menu‑driven flow for a more consistent experience.
    • Steam screen now exposes config actions via the shared config menu (export integrated into the menu flow).

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 25, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a reusable ContainerConfigTransfer export utility, centralized per-app export-request orchestration and CreateDocument export flow in BaseAppScreen, and moves SteamAppScreen to expose config menu options via getConfigMenuOptions (removing its prior export-state and launcher).

Changes

Cohort / File(s) Summary
Export utility
app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt
New singleton ContainerConfigTransfer with suspend fun exportConfig(context, appId, uri) that fetches container JSON, pretty-prints it, writes to the supplied Uri on IO dispatcher, and shows localized success/failure Snackbars.
Base app screen: export orchestration & UI wiring
app/src/main/java/app/gamenative/ui/screen/library/appscreen/BaseAppScreen.kt
Adds companion-level exportConfigRequests map and helpers requestExportConfig, clearExportConfigRequest, shouldExportConfig; adds getExportConfigOption and getConfigMenuOptions extension points; wires snapshotFlow state and a CreateDocument launcher that calls ContainerConfigTransfer.exportConfig.
Steam app screen: API surface change
app/src/main/java/app/gamenative/ui/screen/library/appscreen/SteamAppScreen.kt
Removes in-class export-config state and launcher; adds override getConfigMenuOptions(context, libraryItem) to expose ImportConfig and optionally ExportConfig via BaseAppScreen hooks; replaces inline launcher logic with menu-based hook.

Sequence Diagram(s)

sequenceDiagram
    participant U as User
    participant UI as BaseAppScreen UI
    participant Picker as DocumentPicker (CreateDocument)
    participant Transfer as ContainerConfigTransfer
    participant Storage as SystemStorage

    U->>UI: Select "Export Config" from app menu
    UI->>UI: requestExportConfig(appId) (companion state)
    UI->>UI: snapshotFlow detects request -> launch Picker (suggested filename)
    Picker-->>UI: returns Uri or cancellation
    alt Uri returned
        UI->>Transfer: exportConfig(context, appId, uri)
        Transfer->>Storage: open OutputStream at Uri, write JSON
        Transfer-->>UI: return success/failure
        UI->>UI: clearExportConfigRequest(appId)
        UI-->>U: show Snackbar result
    else Cancelled
        UI->>UI: clearExportConfigRequest(appId)
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related issues

Possibly related PRs

  • PR #121 — Touches container configuration save/export flows and related UI/Intent launch changes that overlap with ContainerConfigTransfer usage.
  • PR #299 — Modifies app screen menu-option provider APIs; closely related to getConfigMenuOptions/menu wiring changes.
  • PR #272 — Alters export/config lifecycle and BaseAppScreen/SteamAppScreen behavior overlapping this refactor.

Poem

🐰 I hopped through code with nimble paws,

Collected JSON neat without a pause,
BaseScreen whispers, Steam shows the key,
Pick a file and send config free,
A tiny rabbit celebrates export glee.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 26.83% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately reflects the main change: introducing container config export functionality across all platforms, as demonstrated by the new ContainerConfigTransfer utility and integration into BaseAppScreen.

✏️ 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

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
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

2 issues found across 5 files

Prompt for AI agents (all issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt">

<violation number="1" location="app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt:27">
P2: `openOutputStream` can return null; the safe-call skips writing and still reports success, causing false-positive export completion.</violation>
</file>

<file name="app/src/main/java/app/gamenative/ui/screen/library/appscreen/GOGAppScreen.kt">

<violation number="1" location="app/src/main/java/app/gamenative/ui/screen/library/appscreen/GOGAppScreen.kt:669">
P2: exportConfigRequested remains true until the ActivityResult returns, so a configuration change can re-run LaunchedEffect and launch a second file picker. Clear the request before launching to prevent duplicate pickers on activity recreation.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Copy link
Contributor

@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: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt`:
- Around line 26-31: The write path currently ignores a null return from
context.contentResolver.openOutputStream(uri) and still reports success; update
the code in ContainerConfigTransfer (the suspend function using
withContext(Dispatchers.IO)) to treat openOutputStream(uri) == null as a
failure: check the result of openOutputStream before calling use (replace the
safe-call chain openOutputStream(uri)?.use { ... } with an explicit val out =
context.contentResolver.openOutputStream(uri) and if (out == null) return false
(or throw a handled exception), otherwise use out.use {
it.write(jsonText.toByteArray(Charsets.UTF_8)); it.flush() } so the function
only returns true when the stream was actually opened and written.
- Around line 39-59: The current catch ordering makes the IOException handler
unreachable and silently swallows coroutine cancellations; in the try/catch
around the export logic in ContainerConfigTransfer (the catch (e: Exception) and
catch (e: IOException) blocks), reorder and refine the handlers: first catch
CancellationException and rethrow it, then catch IOException to show the
IO-specific Toast, and finally catch Exception for other errors; ensure each
Toast uses the same string resource but with an appropriate fallback message
(e.g., "IO error" for IOException, "Unknown error" for Exception).

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 761d93b and f408c7f.

📒 Files selected for processing (5)
  • app/src/main/java/app/gamenative/ui/screen/library/appscreen/CustomGameAppScreen.kt
  • app/src/main/java/app/gamenative/ui/screen/library/appscreen/EpicAppScreen.kt
  • app/src/main/java/app/gamenative/ui/screen/library/appscreen/GOGAppScreen.kt
  • app/src/main/java/app/gamenative/ui/screen/library/appscreen/SteamAppScreen.kt
  • app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt

@unbelievableflavour unbelievableflavour force-pushed the config-export-for-all-platforms branch from f408c7f to 5047203 Compare February 25, 2026 11:41
Copy link
Contributor

@phobos665 phobos665 left a comment

Choose a reason for hiding this comment

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

LGTM.

Have you tested for all of the various ones?

Copy link
Contributor

@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

♻️ Duplicate comments (2)
app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt (2)

39-59: ⚠️ Potential issue | 🟠 Major

Reorder catches and rethrow coroutine cancellation.

Line 39 catches Exception before IOException (Line 49), so the IO-specific branch is dead. This also swallows coroutine cancellation unless CancellationException is rethrown.

🛠️ Proposed fix
 import java.io.IOException
+import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
@@
-        } catch (e: Exception) {
+        } catch (e: CancellationException) {
+            throw e
+        } catch (e: IOException) {
             Toast.makeText(
                 context,
                 context.getString(
                     R.string.base_app_export_failed,
-                    e.message ?: "Unknown error",
+                    e.message ?: "IO error",
                 ),
                 Toast.LENGTH_SHORT,
             ).show()
             false
-        } catch (e: IOException) {
+        } catch (e: Exception) {
             Toast.makeText(
                 context,
                 context.getString(
                     R.string.base_app_export_failed,
-                    e.message ?: "IO error",
+                    e.message ?: "Unknown error",
                 ),
                 Toast.LENGTH_SHORT,
             ).show()
             false
         }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt` around
lines 39 - 59, In ContainerConfigTransfer.kt fix the catch ordering and preserve
coroutine cancellation: move the catch (e: IOException) block so it comes before
the broader catch (e: Exception), and add an explicit catch for
kotlinx.coroutines.CancellationException that immediately rethrows (throw e)
before other catches; ensure any generic Exception catch does not swallow
CancellationException and that toast/error handling remains only in the more
specific Exception/IOException handlers.

26-31: ⚠️ Potential issue | 🟠 Major

Handle null openOutputStream as an export failure.

At Line 27, a null stream path currently falls through to success (true) even though no bytes were written.

🛠️ Proposed fix
             withContext(Dispatchers.IO) {
-                context.contentResolver.openOutputStream(uri)?.use { outputStream ->
-                    outputStream.write(jsonText.toByteArray(Charsets.UTF_8))
-                    outputStream.flush()
-                }
+                val outputStream = context.contentResolver.openOutputStream(uri)
+                    ?: throw IOException("Unable to open output stream for URI: $uri")
+                outputStream.use {
+                    it.write(jsonText.toByteArray(Charsets.UTF_8))
+                    it.flush()
+                }
             }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt` around
lines 26 - 31, The export currently assumes
context.contentResolver.openOutputStream(uri) returns non-null; if it returns
null the function still yields success. Update the withContext(Dispatchers.IO)
block in ContainerConfigTransfer (the code using
context.contentResolver.openOutputStream(uri), jsonText and
withContext(Dispatchers.IO)) to check the result of openOutputStream: if it is
null treat the export as failed (return false / propagate a failure) rather than
proceeding, and only write/flush when a non-null OutputStream is returned; make
sure to keep the existing use { ... } resource handling and return the correct
boolean result when the stream is null.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@app/src/main/java/app/gamenative/ui/screen/library/appscreen/BaseAppScreen.kt`:
- Around line 704-714: Replace the custom SupervisorJob usage in the export
config launcher so the coroutine inherits the existing job hierarchy: change the
uiScope.launch(SupervisorJob() + Dispatchers.Main) invocation to use
uiScope.launch { } or uiScope.launch(Dispatchers.Main) { } instead, keeping the
call to ContainerConfigTransfer.exportConfig(context, appId, uri) and the
finally block that calls clearExportConfigRequest(appId) unchanged; this ensures
the coroutine launched for exporting config follows the surrounding composition
scope rather than creating a new SupervisorJob.

---

Duplicate comments:
In `@app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt`:
- Around line 39-59: In ContainerConfigTransfer.kt fix the catch ordering and
preserve coroutine cancellation: move the catch (e: IOException) block so it
comes before the broader catch (e: Exception), and add an explicit catch for
kotlinx.coroutines.CancellationException that immediately rethrows (throw e)
before other catches; ensure any generic Exception catch does not swallow
CancellationException and that toast/error handling remains only in the more
specific Exception/IOException handlers.
- Around line 26-31: The export currently assumes
context.contentResolver.openOutputStream(uri) returns non-null; if it returns
null the function still yields success. Update the withContext(Dispatchers.IO)
block in ContainerConfigTransfer (the code using
context.contentResolver.openOutputStream(uri), jsonText and
withContext(Dispatchers.IO)) to check the result of openOutputStream: if it is
null treat the export as failed (return false / propagate a failure) rather than
proceeding, and only write/flush when a non-null OutputStream is returned; make
sure to keep the existing use { ... } resource handling and return the correct
boolean result when the stream is null.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f408c7f and 5047203.

📒 Files selected for processing (3)
  • app/src/main/java/app/gamenative/ui/screen/library/appscreen/BaseAppScreen.kt
  • app/src/main/java/app/gamenative/ui/screen/library/appscreen/SteamAppScreen.kt
  • app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt

@unbelievableflavour
Copy link
Contributor Author

unbelievableflavour commented Feb 25, 2026

LGTM.

Have you tested for all of the various ones?

Have tested for Steam, Epic, GOG. Pretty sure it just works for all though. Doesn't do anything platform specific. Just translated the container config to json and writes it to file. Importing is more complex, but that's not in this PR so it's fine.

@unbelievableflavour unbelievableflavour force-pushed the config-export-for-all-platforms branch from 5047203 to 71bf12b Compare February 25, 2026 13:15
Copy link
Contributor

@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.

♻️ Duplicate comments (1)
app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt (1)

27-32: ⚠️ Potential issue | 🟠 Major

openOutputStream returning null is still silently treated as success

The ?.use { ... } safe-call at line 28 skips the write when openOutputStream returns null, but execution continues to the success Toast and return true. The fix from the previous review cycle was not applied.

🛠️ Proposed fix
             withContext(Dispatchers.IO) {
-                context.contentResolver.openOutputStream(uri)?.use { outputStream ->
-                    outputStream.write(jsonText.toByteArray(Charsets.UTF_8))
-                    outputStream.flush()
-                }
+                context.contentResolver.openOutputStream(uri)?.use { outputStream ->
+                    outputStream.write(jsonText.toByteArray(Charsets.UTF_8))
+                    outputStream.flush()
+                } ?: throw IOException("Unable to open output stream for URI: $uri")
             }

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5047203 and 71bf12b.

📒 Files selected for processing (3)
  • app/src/main/java/app/gamenative/ui/screen/library/appscreen/BaseAppScreen.kt
  • app/src/main/java/app/gamenative/ui/screen/library/appscreen/SteamAppScreen.kt
  • app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt

Comment on lines -982 to -993
AppMenuOption(
AppOptionMenuType.ImportConfig,
onClick = {
requestImportConfig(gameId)
}
),
AppMenuOption(
AppOptionMenuType.ExportConfig,
onClick = {
requestExportConfig(gameId)
}
)
Copy link
Owner

Choose a reason for hiding this comment

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

didn't we just lose the import config functionality here?

Also if we're working on it, let's add import config to all the stores too, should be trivial.

Copy link
Contributor Author

@unbelievableflavour unbelievableflavour Mar 10, 2026

Choose a reason for hiding this comment

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

No it's just moved to BaseAppScreen + Added import feature as well now.

Comment on lines +34 to +59
Toast.makeText(
context,
context.getString(R.string.base_app_exported),
Toast.LENGTH_SHORT,
).show()
true
} catch (e: CancellationException) {
throw e
} catch (e: IOException) {
Toast.makeText(
context,
context.getString(
R.string.base_app_export_failed,
e.message ?: "IO error",
),
Toast.LENGTH_SHORT,
).show()
false
} catch (e: Exception) {
Toast.makeText(
context,
context.getString(
R.string.base_app_export_failed,
e.message ?: "Unknown error",
),
Toast.LENGTH_SHORT,
Copy link
Owner

Choose a reason for hiding this comment

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

will need to change this to snackbar to align with new style

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Changed it.

@unbelievableflavour unbelievableflavour force-pushed the config-export-for-all-platforms branch from 71bf12b to 8ad0a8a Compare March 10, 2026 08:52
Copy link
Contributor

@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: 2

♻️ Duplicate comments (1)
app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt (1)

27-32: ⚠️ Potential issue | 🟠 Major

Handle openOutputStream returning null as a failure

At Line 28, openOutputStream(uri) may return null. The current code still returns true and shows a success Snackbar even if no file was written.

🛠️ Proposed fix
             withContext(Dispatchers.IO) {
-                context.contentResolver.openOutputStream(uri)?.use { outputStream ->
+                val outputStream = context.contentResolver.openOutputStream(uri)
+                    ?: throw IOException("Unable to open output stream for URI: $uri")
+                outputStream.use {
                     outputStream.write(jsonText.toByteArray(Charsets.UTF_8))
                     outputStream.flush()
                 }
             }

,

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

In `@app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt` around
lines 27 - 32, The code calls context.contentResolver.openOutputStream(uri) but
doesn't handle the case it returns null, causing the function to report success
even if no file was written; modify the write block in ContainerConfigTransfer
(the coroutine using withContext(Dispatchers.IO) and jsonText) to capture the
result of openOutputStream(uri) into a variable, check for null before calling
use/write, and if null return/propagate a failure (and avoid showing the success
Snackbar), otherwise proceed to write/flush and return success; ensure any
logging or Snackbar for success is only executed after a successful non-null
write.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@app/src/main/java/app/gamenative/ui/screen/library/appscreen/BaseAppScreen.kt`:
- Around line 42-48: The import for Timber in BaseAppScreen.kt is unused; remove
the explicit import line for Timber (symbol: Timber) from the imports at the top
of BaseAppScreen.kt and run an auto-import/organize-imports or rebuild to ensure
no other references rely on it (or replace with a used logger if intended).

In `@app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt`:
- Around line 21-25: The exportConfig code uses
ContainerUtils.getOrCreateContainer which silently creates and persists a new
container via createNewContainer; change export flow to first call
ContainerUtils.getContainer (or equivalent existence-check) for the given appId,
and if it returns null return/fail with a clear error or user-facing message
instead of calling getOrCreateContainer; only use getOrCreateContainer when an
explicit create is intended. Update the logic in
ContainerConfigTransfer.exportConfig (or the block using getOrCreateContainer)
to avoid the side-effect by checking existence and handling null before
attempting to read container.containerJson.

---

Duplicate comments:
In `@app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt`:
- Around line 27-32: The code calls
context.contentResolver.openOutputStream(uri) but doesn't handle the case it
returns null, causing the function to report success even if no file was
written; modify the write block in ContainerConfigTransfer (the coroutine using
withContext(Dispatchers.IO) and jsonText) to capture the result of
openOutputStream(uri) into a variable, check for null before calling use/write,
and if null return/propagate a failure (and avoid showing the success Snackbar),
otherwise proceed to write/flush and return success; ensure any logging or
Snackbar for success is only executed after a successful non-null write.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ad54fcbc-9b4e-4226-92d0-284d90d5a0fa

📥 Commits

Reviewing files that changed from the base of the PR and between 71bf12b and 8ad0a8a.

📒 Files selected for processing (3)
  • app/src/main/java/app/gamenative/ui/screen/library/appscreen/BaseAppScreen.kt
  • app/src/main/java/app/gamenative/ui/screen/library/appscreen/SteamAppScreen.kt
  • app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/src/main/java/app/gamenative/ui/screen/library/appscreen/SteamAppScreen.kt

@unbelievableflavour unbelievableflavour force-pushed the config-export-for-all-platforms branch from 8ad0a8a to 8038d77 Compare March 10, 2026 09:20
@unbelievableflavour unbelievableflavour changed the title Added container config export for all platforms Added container config export/import for all platforms Mar 10, 2026
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

1 issue found across 3 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt">

<violation number="1" location="app/src/main/java/app/gamenative/ui/util/ContainerConfigTransfer.kt:92">
P2: Manifest component installations happen before config validity is confirmed, so malformed or incompatible imports can trigger downloads/installs even though the import later fails.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

@unbelievableflavour unbelievableflavour force-pushed the config-export-for-all-platforms branch from 7c30cf0 to 0b234d9 Compare March 10, 2026 13:27
@unbelievableflavour unbelievableflavour force-pushed the config-export-for-all-platforms branch from 5f68f5b to e5916f3 Compare March 10, 2026 14:22
@utkarshdalal utkarshdalal merged commit ddc4909 into utkarshdalal:master Mar 10, 2026
2 checks passed
@unbelievableflavour unbelievableflavour deleted the config-export-for-all-platforms branch March 10, 2026 20:37
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.

3 participants