Nuvaka › Developer docs › FAQ
Frequently asked questions
Why doesn't localStorage or IndexedDB work?
The UI frame runs sandboxed without same-origin access; browser storage is disabled. Use nuvaka.storage: it lives on the server, syncs across devices and is shared with the background. See MVCC.
Why does fetch fail with a CSP error?
Frames have connect-src 'none' and the background has no fetch. Add the host to the net permission in the manifest and use nuvaka.net.fetch. Only https and only the listed full host names work.
alert() or confirm() shows nothing.
The sandbox does not allow modal dialogs. Ask inside the page (examples: local editor, clipboard history).
Can I load a library from a CDN?
No. Remote <script src> and remote import() are rejected by the package scan and blocked by the CSP. Put the library in the package; for large minified files include the .map file too.
Can I use import in the background?
No; the background is a single-file ES module. Bundle multiple files into one. You can share code by loading the same file in the UI with <script src="background.js"> and registering event listeners only inside if (nuvaka.background).
Does the background run while the app is closed?
No. The background only runs while the app is open. A schedule missed while the app was closed fires once at the next start.
My schedule ran twice.
Every device with the app open runs its own schedules. Claim work that must happen once with storage.update: have your function return undefined when the condition does not hold, and let the device whose write succeeds do the work (example).
I get version_conflict.
The version you read is no longer current: another device, the background or another frame wrote in between. Use storage.update for read-modify-write; it reads the current value and retries. If you use set, merge with e.data.current and e.data.value from the error and write again.
Why isn't onChanged called for a value I wrote?
A context does not receive its own writes; you already know the value. The background's writes reach the UI (and vice versa), and other devices' writes reach both.
Why is the user asked again when they granted the permission at install?
Reading/sending mail, reading connection passwords and writing to Nuvaka files are critical: they are confirmed on every use and there is no permanent approval. The user can approve for 15 minutes or 1 hour. If they deny, you get permission_denied.
My notifications don't show up.
By default an extension can send at most 3 notifications in the last 60 seconds (local + push together). When the limit is exceeded the user is asked; if they do not raise it, the call fails with notify_limit. Batch notifications, catch the error and retry later.
Storage doesn't work in my extension loaded from a folder.
Storage, notes, cloud, the clipboard pool, mail, push and me() are server endpoints; an extension token is only issued for an extension installed on your account. Publish a version and install it from the Store. A development copy with the same ID as the installed extension then uses the server endpoints with the permissions the user granted to the installed version; a newly added server permission only works once a version containing it is published and approved.
Can I change my extension ID or publisher name?
No. The ID (<your-username>.<name>) never changes once published. You can change the display name (name) any time.
Why is my first version in "review"?
A publisher's first extension and every new version asking for critical permissions wait for an administrator's approval. Every new version of a verified extension is reviewed too. See Publishing and review.
I lost my signing key.
In the app, remove the old key under Profile › Developer › Publisher signing keys, then create a new one with nuvaka-ext keys create and add it. As long as a key is registered, every upload must be signed.
Which language should my extension use?
Manifest texts require tr (Turkish); en is optional. In the UI, locale in the nuvaka.ready context (or nuvaka.ui.locale()) is the app's language; a locale event fires when it changes.
Does it work on Android?
For now extensions run only in the desktop app (Windows, Linux, macOS).
Can I use WebAssembly?
In the UI, yes: the CSP includes 'wasm-unsafe-eval' and .wasm files are allowed in packages.
Nuvaka Apps API v1 · last updated 2026-09-27