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:
- Self-host the Pyodide bundle in
public/pyodide/and patchsrc/utils/code-exec-plugin.tsline ~12 to point to your copy. - Disable the plugin: in
src/utils/plugins.ts, removecodeExecPlugin.pluginfrom thepluginsarray inusePluginsStore.
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:
- Settings → Data → Export — save a full backup JSON.
- Delete old workspaces or use the workspace delete button (cascades to dialogs, messages, items, assistants, artifacts).
- 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:
- Confirm both run the same app version (older versions may not recognize newer provider types).
- If the link is from an
openai-compatibleprovider, the recipient's provider list must support that type (it does). - 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.