Skip to content
WebViewGold Vibe Coding to App Store
English
Get WebViewGold

Bolt + device storage

Native storage and a device ID for your Bolt app

Users expect an app to remember them. Cookies and localStorage usually keep your Bolt app signed in, but they are web storage and go away with the cache. WebViewGold adds two small native helpers: a persistent value store (writevalue:// and readvalue://) for settings and session restore, and a device UUID (get-uuid://) for device-bound licenses, trusted devices and per-device settings on your server.

From $109 one-time per platform, or let our team do it all from $698.

  • Approval guarantee – or money back within 14 days
  • No coding needed
  • One-time payment, free updates
  • 24/7 human support
  • Made in Germany since 2014 · ISO 27001

Two native helpers

Read/Write Value API

writevalue:// stores everything after the scheme as one string in the app's private storage; readvalue:// injects it back into the page, as window.storedValues on iOS and window.appSettings on Android. Values survive restarts and cache clears and disappear when the app is uninstalled (on Android also when its app data is wiped).

UUID API

get-uuid:// sets the JavaScript variable uuid, a non-personal unique device ID. Alternatively append it once to the first request as ?uuid=XYZ (enhanceUrlUUID / UUID_ENHANCE_WEBVIEW_URL) or inject it on every page (autoInjectVariable / AUTO_INJECT_VARIABLES).

What it is not

Not synced across devices, not a database, not a password vault. Keep values small (settings, flags, a revocable token), keep user data in Supabase, Firebase or your own API, and never treat the UUID as proof of identity.

Prompt for Bolt

Paste this into Bolt to implement the web-app side. Review the result, publish, then test inside the WebViewGold app.

Prompt to paste into Bolt
Add device-level persistence and a device limit for the WebViewGold app wrapper. Create src/lib/device.ts with isNativeApp() (navigator.userAgent contains my WebViewGold token), saveLocal(values) that navigates to a writevalue:// string such as writevalue://theme=dark;lang=en;onboarded=1, loadLocal() that navigates to readvalue:// and parses window.storedValues or window.appSettings after 250 ms, and getDeviceId() that returns the global uuid (navigating to get-uuid:// first if needed). Outside the app, fall back to localStorage and return null for the device ID. On startup, apply the saved theme and language before showing the dashboard. After login, POST { uuid, platform } to a Netlify Function register-device that uses the Supabase service role key to upsert into a devices table and returns 403 with a clear message if a Pro user already has two other active devices. Add a Manage devices screen to free a slot. Never chain two native schemes in the same tick.

I am very happy I bought this app! Extremely easy and great documentation. Was in contact with the customer service, they replied very quickly and very friendly. They solved my question within a day. 10/10 would recommend.

Nelis Geiger · CodeCanyon

Where it makes a difference

Staying signed in

Write a revocable refresh token after login. If the web session is gone after a cache clear, read it back on launch and restore the session silently instead of showing the login screen.

Settings that load instantly

Theme, language, units, "onboarding done", the last opened workspace: read locally on launch, before your backend answers, and even offline.

Device-bound licenses

"Pro works on two devices": register the UUID on activation, count active devices on the server and offer a Manage devices screen to free a slot.

Trusted devices

Skip the second factor or the email code on a device the user already confirmed, and show "Signed in on: iPhone, Pixel" with a sign-out per device.

Kiosks and shared tablets

A front-desk iPad or a warehouse scanner phone that should always open the same location or station: store the station ID per device.

Wire it into a Bolt app

About an hour, plus a devices table in your backend.

  1. Detect the app

    Set a custom user agent in Config.swift (useragent_iphone, useragent_ipad) and Config.java (USER_AGENT) and only call the schemes when it matches. In the browser, fall back to localStorage.

  2. Choose a safe format

    Everything after writevalue:// is stored verbatim as one string, so use a simple key=value;key=value format with URL-safe values (letters, digits, dot, dash, underscore). Each write replaces the whole string, so always write all keys.

  3. Read on launch

    Navigate to readvalue://, wait a moment (the docs use 200 ms) and parse window.storedValues (iOS) or window.appSettings (Android). Apply theme and language first, then restore the login session if needed.

  4. Register the device

    After login, read uuid (after get-uuid://, or automatically with the auto-inject option) and store it with the user in Supabase, Firebase or your own API: user ID, UUID, platform, last seen. Enforce seat limits on the server, never in the client.

  5. Clean up

    On logout, rewrite the value without the token and revoke it on the server. On account deletion, delete the device rows too (the account deletion guide).

  6. Mind the iOS one-call rule

    iOS processes only one scheme navigation per script run, so chain calls with short delays (or use multiapicall://, which supports get-uuid) instead of firing them in the same tick.

A small wrapper for both platforms

Same API in the app and in the browser. Replace YourAppToken with your custom user agent.

javascript
var inApp = navigator.userAgent.indexOf("YourAppToken") !== -1;

function nativeWrite(values) {                 // { rt: "abc123", theme: "dark", lang: "en" }
  var str = Object.keys(values).map(function (k) { return k + "=" + (values[k] || ""); }).join(";");
  if (!inApp) { try { localStorage.setItem("appValues", str); } catch (e) {} return; }
  window.location.href = "writevalue://" + str;
}

function parseValues(str) {
  var out = {};
  String(str || "").split(";").forEach(function (pair) {
    var i = pair.indexOf("=");
    if (i > 0) out[pair.slice(0, i)] = pair.slice(i + 1);
  });
  return out;
}

function nativeRead(callback) {
  if (!inApp) { callback(parseValues(localStorage.getItem("appValues"))); return; }
  window.location.href = "readvalue://";
  setTimeout(function () {
    callback(parseValues(window.storedValues || window.appSettings));  // iOS || Android
  }, 250);
}

function nativeDeviceId(callback) {
  if (!inApp) { callback(null); return; }
  if (typeof uuid !== "undefined") { callback(uuid); return; }        // auto-injected
  window.location.href = "get-uuid://";
  setTimeout(function () { callback(typeof uuid !== "undefined" ? uuid : null); }, 250);
}

Privacy and review

  • If you store the UUID on your server, declare "Device ID" in App Privacy (linked to the user when you store it with the account) and "Device or other IDs" in the Google Play Data safety form.
  • Use it for your own features only. Sharing it with ad networks or data brokers, or linking it with other companies' data, is tracking under Guideline 5.1.2 and needs the App Tracking Transparency prompt.
  • Do not combine the UUID with other device signals to fingerprint users; Apple does not allow fingerprinting, with or without the prompt.
  • Say it in your privacy policy and terms: "This license can be used on up to two devices; we store a device identifier to enforce this."
  • Treat the value store like an app preference file: fine for settings and revocable tokens, wrong for passwords or payment data.

Frequently asked questions

Why not just use cookies and localStorage?

Use them first; inside the app they persist the way they do in a browser. The native value store is the backup for what must survive a cache clear, such as a revocable device token, onboarding state or a language choice, and it is available on launch, even offline.

Is the WebViewGold UUID the same as the advertising ID?

No. It is a non-personal device identifier for your own app logic, not the IDFA or the Android advertising ID, and reading it does not show the App Tracking Transparency prompt. If you used it to track users across other companies' apps or shared it with ad networks, it would become tracking and the ATT rules would apply.

Do stored values sync to the user's other devices?

No. Values are per install and per device. Anything that should follow the user (profile, preferences, purchases) belongs in your backend; the device store only speeds up launch and keeps one device signed in.

What happens after a reinstall or on a new phone?

Stored values are gone after an uninstall, and you should not assume the UUID stays the same either. Let users sign in again, register the device anew, and free old devices in Supabase, Firebase or your own API after a period of inactivity or from a Manage devices screen.

Can I test this in a browser or a preview?

Only the fallback. The schemes work inside the WebViewGold app, not in a desktop browser or a Bolt preview. Detect the custom user agent, use the localStorage fallback in the browser and test the real flow on a phone with a build of the app.

Three ways to get your app into the stores

Same result, different amount of work on your side. All three come with the approval guarantee and 24/7 human support.

Do it yourself

$109 per platform, one-time

The WebViewGold license: a finished Xcode or Android Studio project. Paste your URL, set name and icon, switch on features, build and submit. Free updates forever.

See plans on the main page

Cloud Builder

$349 per license, one-time add-on

No Mac, no Xcode, no Android Studio: configure in the browser, we build both apps in the cloud and hand them to App Store Connect and the Play Console.

How the Cloud Builder works Try the free demo

Full Service

$698 per platform $798

Send us your URL and icon. Our team configures, builds and delivers your app within 72 hours, white-label, with source projects. Both platforms for $1,158.

Full Service details Powered by WeSetupYourWebViewApp

Winter Sale prices valid until December 31, 2026.

Ready to ship your Bolt app?

App Store & Google Play approval guarantee – or your money back within 14 days

Rather hand it over? Full Service: we configure, build and deliver within 72 hours, from $698 per platform. Questions? Chat with us 24/7.

Refunds are granted under the conditions listed in our FAQ: a non-content rejection by Apple and/or Google, claimed within 14 days after purchase.