WME Sync

Sync your WME userscripts across browsers

WME Sync is a small storage service for Waze Map Editor userscripts. Script authors get a simple key/value API; editors get their script settings on every machine they edit from.

Same settings everywhere

Scripts save their settings and data to WME Sync, so they follow you between browsers and computers.

Waze username + PIN

Link your Waze username here and pick a PIN. Scripts ask for it once, then use a long-lived token.

You stay in control

See every script’s data, download it, delete it, and revoke a browser’s access at any time.

For editors

  1. Create an account (email, Discord, or a passkey after signing up).
  2. On Waze usernames, link your Waze username and choose a 6–12 digit PIN.
  3. The first time a sync-enabled script runs, it asks for that PIN. That's it.

For script authors

Add wme-sync-lib with @require and call WMESync.init(). It reads the editor's Waze username from the WME SDK, prompts for their PIN once, stores the tokens with GM_setValue and refreshes them automatically.

// ==UserScript==
// @name         My WME Script
// @match        https://www.waze.com/*editor*
// @match        https://beta.waze.com/*editor*
// @require      https://sync.wazetools.com/wme-sync-lib.js
// @grant        GM_xmlhttpRequest
// @grant        GM_getValue
// @grant        GM_setValue
// @connect      sync.wazetools.com
// ==/UserScript==

window.SDK_INITIALIZED.then(async () => {
  const sdk = getWmeSdk({ scriptId: 'my-wme-script', scriptName: 'My WME Script' })
  await sdk.Events.once({ eventName: 'wme-ready' })

  // Asks the editor for their PIN the first time, then remembers the tokens.
  const sync = await WMESync.init({ scriptId: 'my-wme-script', sdk })

  const settings = (await sync.get('settings')) ?? { highlight: true }
  settings.lastOpened = Date.now()
  await sync.set('settings', settings)
})

Other methods: sync.getAll(), sync.remove(key), sync.setMany(entries). Prefer raw HTTP? See the API docs.