Troubleshooting

Pyodide won't load (code-exec plugin)

The plugin loads https://cdn.jsdelivr.net/pyodide/v0.26.4/full/pyodide.js on first invocation. If you are offline, behind a corporate proxy, or in a region blocking jsdelivr, it will fail. Workarounds:

  1. Self-host the Pyodide bundle in public/pyodide/ and patch src/utils/code-exec-plugin.ts line ~12 to point to your copy.
  2. Disable the plugin: in src/utils/plugins.ts, remove codeExecPlugin.plugin from the plugins array in usePluginsStore.

MCP stdio plugin fails on mobile or web

Stdio transport requires the Tauri shell plugin (desktop only). If installMcpPlugin sees a stdio transport on a non-Tauri runtime, it throws "stdio requires desktop." Use http or sse transports for the same MCP server when running on mobile/web. Many MCP servers offer both stdio (for Claude Desktop) and HTTP (for browser clients).

IndexedDB quota exceeded

Symptom: dialogs won't save, messages disappear on reload. AIaW stores everything in browser IndexedDB; quotas are typically 60% of free disk space but browsers vary. To recover:

  1. Settings → Data → Export — save a full backup JSON.
  2. Delete old workspaces or use the workspace delete button (cascades to dialogs, messages, items, assistants, artifacts).
  3. Settings → Data → Import — restore if needed.

The export format is a single JSON file with each Dexie store as an array, plus a version and exportedAt header.

Provider Share Link does not import on another device

Share links are URL-encoded JSON with the provider config (apiKey included unless you strip it manually). If a recipient imports and the link does nothing:

  1. Confirm both run the same app version (older versions may not recognize newer provider types).
  2. If the link is from an openai-compatible provider, the recipient's provider list must support that type (it does).
  3. If the link contains a custom-provider reference, the recipient needs the same custom provider installed first.

Android build fails: JAVA_HOME / SDK mismatch

android/variables.gradle pins compileSdkVersion 35 and Java 17. If your system Java is older:

# macOS
brew install --cask temurin@17
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
# Linux
sudo apt install openjdk-17-jdk
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

Android Studio's SDK Manager will install compileSdkVersion 35 automatically when you sync the project.

Tauri build fails on Linux: missing webkit2gtk

sudo apt install libwebkit2gtk-4.1-dev build-essential curl wget file libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev

Then cargo tauri build from src-tauri/.

Provider API key not being read

Each provider has a backup in localStorage under key provider-backup-<some-id> (the code path in src/stores/providers.ts's createProvider reads it). If your settings page shows the key but the model request fails with "Unauthorized", open the browser console — the key may be undefined in memory after a refresh. Re-enter the key once; it should persist.

Code execution hangs

Pyodide runs Python in a Web Worker inside the WebView. On older Android devices (especially Go-Edition / lite WebView builds), SharedArrayBuffer may not be available, which can stall Pyodide startup. Workaround: use the file-ops plugin's code-exec tool only on desktop; on mobile, edit files manually with the file-ops plugin.

iOS builds require capacitor-stream-fetch fallback

From src/utils/platform-api.ts:

export const fetch = IsTauri
  ? tauriFetch
  : IsCapacitor
    ? (CapacitorPlatform === 'ios' ? window.fetch.bind(window) : capFetch)
    : window.fetch.bind(window)

The streaming plugin is not implemented on iOS; the app falls back to native fetch there. Streaming response chunks may arrive as separate fetch requests on iOS instead of a true stream; the Vercel AI SDK handles this transparently but extremely long completions may be slower.