For developers who love localStorage (but wish it was better).
localStorage is great—until you need persistence (like testing on a different machine!). NLS is the same simple API, backed by the cloud, with localStorage as automatic fallback.
# Set a value
curl -X POST https://preprod001.notlocalstorage.io/api/v1/storage/items \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-App-Key: YOUR_APP_KEY" \
-H "Content-Type: application/json" \
-d '{"key": "prefs", "value": {"theme": "dark"}}'
# Get a value
curl https://preprod001.notlocalstorage.io/api/v1/storage/items/prefs \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-App-Key: YOUR_APP_KEY"
import requests
# Set a value
requests.post( 'https://preprod001.notlocalstorage.io/api/v1/storage/items',
headers={'X-API-Key': 'YOUR_API_KEY', 'X-App-Key': 'YOUR_APP_KEY'},
json={'key': 'prefs', 'value': {'theme': 'dark'}}
)
# Get a value
resp = requests.get( 'https://preprod001.notlocalstorage.io/api/v1/storage/items/prefs',
headers={'X-API-Key': 'YOUR_API_KEY', 'X-App-Key': 'YOUR_APP_KEY'}
)
require'httparty'
# Set a value
HTTParty.post( 'https://preprod001.notlocalstorage.io/api/v1/storage/items',
headers: { 'X-API-Key' => 'YOUR_API_KEY', 'X-App-Key' => 'YOUR_APP_KEY' },
body: { key: 'prefs', value: { theme: 'dark' } }.to_json
)
# Get a value
response = HTTParty.get( 'https://preprod001.notlocalstorage.io/api/v1/storage/items/prefs',
headers: { 'X-API-Key' => 'YOUR_API_KEY', 'X-App-Key' => 'YOUR_APP_KEY' }
)
import"net/http"
// Set a value
req, _ := http.NewRequest("POST", "https://preprod001.notlocalstorage.io/api/v1/storage/items",
bytes.NewBuffer(jsonData))
req.Header.Set("X-API-Key", "YOUR_API_KEY")
req.Header.Set("X-App-Key", "YOUR_APP_KEY")
client.Do(req)
// Get a value
req, _ := http.NewRequest("GET", "https://preprod001.notlocalstorage.io/api/v1/storage/items/prefs", nil)
req.Header.Set("X-API-Key", "YOUR_API_KEY")
req.Header.Set("X-App-Key", "YOUR_APP_KEY")
// Using Guzzle $client = newGuzzleHttp\Client();
// Set a value $client->post('https://preprod001.notlocalstorage.io/api/v1/storage/items', [ 'headers' => ['X-API-Key' => 'YOUR_API_KEY', 'X-App-Key' => 'YOUR_APP_KEY'], 'json' => ['key' => 'prefs', 'value' => ['theme' => 'dark']]
]);
// Get a value $response = $client->get( 'https://preprod001.notlocalstorage.io/api/v1/storage/items/prefs',
['headers' => ['X-API-Key' => 'YOUR_API_KEY', 'X-App-Key' => 'YOUR_APP_KEY']]
);
using HttpClient client = new();
// Set a value
client.DefaultRequestHeaders.Add("X-API-Key", "YOUR_API_KEY");
client.DefaultRequestHeaders.Add("X-App-Key", "YOUR_APP_KEY"); await client.PostAsJsonAsync( "https://preprod001.notlocalstorage.io/api/v1/storage/items", new { key = "prefs", value = new { theme = "dark" } }
);
// Get a value var response = await client.GetAsync( "https://preprod001.notlocalstorage.io/api/v1/storage/items/prefs");
localStorage is great. Here's when you need more.
Honest comparison - use what fits your needs
localStorage
Firebase
Redis + API
NLS
Setup time
0 min
~30 min
~2 hours
~2 min
Cross-device sync
Survives browser clear
Backend required
No
Optional
Yes
No
SDK complexity
None
High
DIY
Minimal
Vendor lock-in
None
High
Low
Low (export anytime)
Free tier
Varies by browser
1GB
Varies
100MB
TL;DR: localStorage is perfect for ephemeral client-side data. Add NLS when you need it to survive browser clears, sync across devices, or exceed 5MB.
Try it now
No signup required. This is a real API call.
// Response will appear here
Demo uses a shared sandbox. Data expires after 1 hour.
Everything you love about localStorage, plus:
Same simplicity. None of the headaches.
Cloud Synced
Data persists across sessions and devices. Users pick up exactly where they left off.
Secure by Default
All data encrypted in transit. App-level isolation ensures data stays private.
Simple API
get, set, delete. That's it. Works with any language that can make HTTP requests.
Cross-Platform
Works on web, mobile, desktop, server-side. Anywhere HTTP requests work.
Dashboard & Analytics
View, edit, and manage your stored data through an intuitive web dashboard.
Team Collaboration
Invite team members, manage permissions, and collaborate on projects.
* Credit card required for overage charges on Free plan
FAQ
All data is encrypted in transit (TLS 1.3). Data at rest is stored in isolated application namespaces.
We're committed to GDPR and Australian Privacy Act compliance. We provide data export, deletion rights, specific retention periods, and clear legal bases for processing. Data is stored in secure, isolated environments. See our Privacy Policy for full details.
You'll get a 402 response on write operations. Reads still work. You can either delete data, upgrade, or pay for overage. We won't delete your data without warning.
Yes. Full JSON export available anytime from the dashboard. No lock-in, no export fees. Your data is yours.
Typically under 50ms for reads, under 100ms for writes. Our SDK writes to both NLS and localStorage simultaneously - if NLS is ever unavailable, your app falls back to localStorage automatically.
Yes. 60 reads/min and 30 writes/min per app key on free tier. Higher limits on paid plans. Headers tell you your current usage.
The SDK writes to both NLS and localStorage simultaneously. If our servers are unreachable, your app continues working with localStorage as the fallback - no data loss, no downtime. When we're back, it syncs automatically.
Just like localStorage, but WAY better.
Same API you know and love. Now with persistence, sync, and no size limits.