Security & data residency
Plain-language statement of what NotesSecured keeps in the cloud, what stays in your browser, how a fresh sign-in reaches the same vault, and the security measures that protect this encrypted notes app. Last reviewed July 2026.
New to this? Start with what makes a notes app truly encrypted for the plain-language version, or see how we compare with other encrypted notes apps.
The short version
Your notes are encrypted in your browser and stored as ciphertext in your vault in the cloud. They are not stored on the computer or phone you happen to be using — that browser only holds a session key while you are unlocked. We can read none of your content, because the key never leaves your browser.
Stored in the cloud (your vault)
Managed cloud storage on Lovable Cloud infrastructure: a Postgres database with per-account access rules, plus private object storage for attachments. Every field listed as encrypted arrives already encrypted.
| What | How it is stored |
|---|---|
| Everything you create: note bodies, to-do lists, titles, tags, folder names | Encrypted (AES-256-GCM) — ciphertext only |
| Attachments and drawings | Encrypted before upload, stored as encrypted objects |
| Your wrapped master key | Encrypted with a key derived from your passphrase (PBKDF2) |
| Optional recovery copy of the master key | Encrypted with your recovery key, only if you created one |
| Account email and sign-in identity | Plain — required to authenticate you |
| Timestamps, sizes, note and share record IDs | Plain metadata — needed to sync and show quotas |
| Notification preferences and delivery log | Plain metadata; message text comes from fixed templates |
Kept in the browser you are using
| What | Where and for how long |
|---|---|
| Master key, wrapped under a session key | sessionStorage — unreadable ciphertext, this tab only, gone when it closes |
| Session key that unwraps it | IndexedDB — a non-extractable key handle; its bytes cannot be read by any script, extension or DevTools panel |
| Screen-lock state (PIN curtain on/off) | sessionStorage |
| Sign-in token | localStorage, until you sign out |
| UI preferences (filters, sort, units, tool history) | localStorage |
| App shell (HTML, JS, icons) | Cache storage — never contains note data |
| Decrypted note text of open notes | Memory only — never written to disk |
- • Closing the tab clears the session key immediately — the vault relocks.
- • Signing out clears the session key and the sign-in token.
- • With “Wipe local data on sign out” on, preferences and app caches are erased too, leaving nothing behind in this browser.
Settings → Security has a “Wipe local data on sign out” switch and a “Wipe local data now” button that clear all of the above, including app caches.
How encryption and unlock work
- At sign-up a random 256-bit master key is generated in your browser.
- Your passphrase is stretched with PBKDF2 into a wrapping key; only the wrapped master key, its salt and a verification check are uploaded.
- Everything you create — notes, to-do lists, titles, tags, folder names and attachments — is encrypted with AES-256-GCM under the master key before any network request.
- On unlock the passphrase re-derives the wrapping key locally and unwraps the master key. It is then re-wrapped under a non-extractable session key so nothing readable is left in browser storage; the usable key exists only in page memory for that session.
- A wrong passphrase fails the verification check locally — nothing about the passphrase is sent anywhere, and there is no server-side reset.
- Every password and passphrase field has a reveal (eye) toggle so you can check what you typed before committing to it. It is always off by default, never remembered, and re-hides itself automatically about ten seconds after you stop typing — it changes nothing about the encryption, only how much of the value is on screen.
Your passphrase is always required when the browser restarts after a crash or is closed without signing out. This cannot be switched off.
Restoring tabs restores the page, never your unlocked vault: the app keeps a liveness heartbeat while it runs, and a session that was not alive moments ago has both halves of its key purged before anything renders. Idle auto-lock also keeps counting while your machine is asleep.
Signing in somewhere new
Nothing needs to be transferred. Sign in to your account, enter the same passphrase, and the wrapped master key downloads and unwraps locally — the vault opens with all of your notes. Edits sync in real time between every open session, and you can revoke access simply by signing out or changing your account password (your passphrase is unchanged).
On-device AI
Meaning-based search is optional, off by default, and enabled per device. When you turn it on, a small language model is downloaded once and run inside a background worker in your own browser. It reads only text that is already decrypted for this session; no note, no title and no search phrase is sent to us or to any AI provider.
The numbers the model produces (embeddings) describe what a note is about, so we treat them as note content: each one is encrypted with your vault key before it is stored, and the server holds only ciphertext plus a model version. The in-memory index is wiped when the vault locks or you sign out, locked items are never indexed, and Settings › Security lets you delete the whole index at any time.
Security measures we apply
- Everything you create — notes, to-do lists, titles, tags, folder names and attachments — is encrypted with AES-256-GCM in your browser before any network request.
- Your passphrase is stretched with PBKDF2 to create a wrapping key; only the wrapped master key, salt and verification check are stored.
- The master key is never written to browser storage in the clear: sessionStorage holds it wrapped under a non-extractable session key kept in IndexedDB, and both halves are discarded when the tab closes or you sign out.
- Two lock levels: a 6-digit PIN screen lock hides the workspace during short breaks, and the vault lock erases the master key from memory, sessionStorage and IndexedDB after a longer idle period, on manual lock, on tab hide, and on sign-out.
- The passphrase is always required when the browser restarts after a crash or is closed without signing out — this cannot be switched off. A liveness heartbeat means a restored tab can never resurrect an unlocked vault, and idle time keeps counting while the machine sleeps.
- Returning from a vault lock requires biometrics (WebAuthn PRF, a device-bound secret that never leaves the authenticator) or your passphrase — a six-digit PIN is never used to protect key material.
- Optional two-factor authentication (TOTP) protects the account sign-in layer.
- Sign-in is rate-limited against guessing: after 5 failed attempts the account is locked for 10 minutes with an on-screen message, and if 5 further attempts fail after that lockout a password reset becomes mandatory before sign-in is allowed again.
- Optional recovery key gives you a way back into your vault if you forget your passphrase.
- Optional anti-phishing phrase and tint appear on sign-in and unlock screens so you can confirm you are on the real app before entering credentials.
- Database rows are protected by per-user access rules; the cloud only ever sees ciphertext.
- Attachments and exports live in private object storage, uploaded as encrypted blobs.
Anti-phishing verification
Phishing sites copy the look of a real app to trick you into entering your password or passphrase. Because your notes are end-to-end encrypted, we cannot see your passphrase — so the safest check is one you perform yourself. NotesSecured lets you set a secret phrase and a tint colour that appear on every sign-in and unlock screen.
- Choose a phrase and colour in Settings → Security → Anti-phishing verification.
- Look for the phrase and colour before you type your password, passphrase or PIN.
- If either is missing, or you see a warning banner, close the tab and navigate to the real address manually.
- Biometric-first unlock keeps the passphrase field hidden until you explicitly ask for it.
What anti-phishing cannot cover
- Malware or a compromised device that can read your screen or keystrokes.
- A fake site that already has your secret phrase and colour through a separate leak.
- Social engineering over email, phone, or messaging apps.
- Browser extensions or password managers that have been tampered with.
This is a light-weight, user-visible signal. It does not replace good browser habits — checking the address bar, using a password manager, and keeping your device up to date.
Platform infrastructure security
NotesSecured runs on Lovable Cloud, which provides the underlying database, authentication, storage, secrets management, and edge-function infrastructure. These are platform capabilities, not independent certifications or audit guarantees.
- Managed database, authentication, storage, edge functions, and secrets management provided by Lovable Cloud.
- All data in transit is protected with TLS/HTTPS.
- Authentication is handled by the managed identity provider with support for email/password, Google, Microsoft, and Apple sign-in.
- Storage buckets are private by default and accessed through per-user rules.
- Secrets such as VAPID keys are stored in the managed secrets store and injected only into server-side code.
Backups, outages and recovery
The database is operated by our hosting platform, which takes automated backups and keeps point-in-time recovery. If a database fails, the platform's engineers perform the restore — there is no restore control inside the app, and nothing is required from you.
- A restore does not weaken your encryption: notes come back as exactly the same ciphertext, and passphrases, keys and recovery keys never left your browser, so nothing has to be re-keyed.
- Nothing notifies you automatically. During an incident or a restore we switch on a service status banner shown at the top of every page — including the sign-in screen, so the reason is visible even when you cannot get in.
- The banner has six stages: a dismissable notice, degraded service, outage, planned maintenance, restore in progress, and service restored. Each carries the same standardised wording every time, so the message never changes shape between incidents.
- While a restore or a maintenance window is running, sign-in is paused. Instead of failing with a confusing error, the sign-in screen shows what is happening and when to come back. Attempts made during a pause do not count towards the 5-attempt lockout, so nobody comes back to a locked account.
- The pause does not depend on someone remembering to switch it on: if the backend stops answering, the app detects that by itself and pauses sign-in until it responds again.
- Email notices to every account are not yet switched on — that requires a verified sender domain, and the list of accounts sits in the same database an outage takes down, so a broadcast can only be sent once service is back. Until then the in-app banner is the live channel.
- For your own off-platform copy, use the encrypted export in Settings › Data and open it again with the built-in reader.
How long analytics data is kept
| Data | Retention |
|---|---|
| Your analytics choice (on/off) and the date you set it | Kept in this browser's localStorage until you reset it, sign out with local wipe, or clear site data |
| Audit trail of your analytics choice changes | Last 10 changes, kept in this browser only; deleted when you reset your choice |
| In-memory debug buffer of events (used when analytics is off) | Last 200 events, held in the tab's memory only — discarded when the tab closes or analytics is switched off |
| Events sent to an analytics provider while analytics is on | Retained by the configured provider for a maximum of 14 months, then deleted automatically |
| Server-side logs of page requests (IP, user agent) held by the hosting platform | Kept by the platform for operational security and deleted on the platform's rolling schedule; not linked to your vault |
What happens the moment you turn analytics off
- • No further events are pushed to window.dataLayer from this browser — the send path is disabled, not just filtered.
- • The in-memory debug buffer for the current tab is cleared immediately.
- • The window.dataLayer queue itself is emptied, so events already queued but not yet read by a tag manager are destroyed rather than delivered later.
- • Campaign parameters (utm_*) captured for this session are removed from sessionStorage.
- • Your preference is rewritten to 'denied' with a new timestamp, and the change is added to the local audit trail.
- • The denial is written to your account so every other browser you sign in from turns analytics off too.
Events that were already sent to an analytics provider while analytics was on are outside this browser. They are anonymous (no account identifier) and age out on the provider's retention schedule above; we cannot single them out to delete on request because there is nothing tying them to you.
| Action | What is left afterwards |
|---|---|
| Turning analytics off | Only two values remain: the value 'denied' and the timestamp of that change, plus your local audit trail. Nothing else about analytics is kept anywhere. |
| Reset my analytics choice | Removes the stored value, the timestamp and the audit trail in this browser, and clears the account copy so no browser inherits an old choice. |
My analytics choice — audit trail
Every time you change the analytics setting above, the change is recorded in this browser only (never sent anywhere). Resetting your choice clears this list and returns you to the default, which is analytics off.
Your analytics choice is saved with your account, so signing in from another browser, phone or operating system applies the same setting. If the same account is changed in two places, the most recent change wins.
Current setting: Not set — never changed
Account sync: not checked yet.
No changes recorded in this browser yet.
Account audit trail (server-side)
No account-side changes recorded yet. Sign in and change the setting to start the trail — these records are stored with your account and cannot be edited or deleted from the app.
Reporting a vulnerability
We welcome reports from security researchers and users. If you believe you have found a security issue in NotesSecured, please report it privately to security@notessecured.app rather than posting it publicly, so we can fix it before it can be misused.
What to expect and when
| Step | Our target |
|---|---|
| Acknowledge your report | Within 3 business days |
| Initial assessment and severity triage | Within 10 business days |
| Status update cadence while we investigate | At least every 14 days |
| Fix or mitigation for critical issues | Target 30 days from triage |
| Fix or mitigation for lower-severity issues | Target 90 days from triage |
These are the response times we aim for; complex issues may take longer, and we will keep you updated if they do.
Please include
- • A clear description of the issue and its potential impact
- • Step-by-step instructions to reproduce it, including the affected URL or screen
- • Any proof-of-concept code, requests or screenshots that help us confirm it
- • The browser, operating system and app version you used
- • How you would like to be credited, if you want credit
Testing rules (safe reporting)
- • Test only against accounts and vaults you own or have explicit permission to use.
- • Do not access, modify, download or delete other people's data — stop as soon as you can demonstrate the issue.
- • Do not run denial-of-service, spam, brute-force or high-volume automated scanning against the service.
- • Do not use social engineering, phishing or physical attacks against our team, users or providers.
- • Give us a reasonable chance to fix the issue before disclosing it publicly.
Usually out of scope
- • Reports produced only by automated scanners with no demonstrated impact
- • Missing security headers or best-practice suggestions with no exploitable impact
- • Vulnerabilities in third-party platforms — report those to the provider directly
- • Self-inflicted issues that require an already-compromised browser or device
- • Social engineering, spam, or rate-limiting reports without a concrete exploit
Safe harbour
If you follow this policy in good faith, we will treat your research as authorised, will not pursue legal action, and will work with you to understand and resolve the issue quickly. If a third party brings action against you for research that followed this policy, we will make that good faith clear.
We do not currently run a paid bug bounty programme. We do acknowledge reporters who ask for credit once a fix has shipped.
Encrypted reports (PGP)
- • Download the key file and import it: gpg --import pgp-key.txt
- • Check the imported fingerprint matches the one shown here character for character (gpg --fingerprint security@notessecured.app).
- • Encrypt your report to that key before emailing it to the security contact.
- • Include your own public key in the encrypted message if you want an encrypted reply.
- Key owner
- NotesSecured Security (Infinitum Solutions, Inc.) <security@notessecured.app>
- Algorithm
- EdDSA / Curve25519 (ed25519 signing, cv25519 encryption)
- Fingerprint
- C065 1C9A 5DD6 7BB3 F3AC 9DD2 BA41 4161 2058 DE20
The check below downloads the published key file in your browser, parses it with OpenPGP, and compares the fingerprint it computes against the fingerprint printed on this page. A mismatch means the file was tampered with or is stale — do not use it, and tell us.
Contact us
If you have a security or privacy question about NotesSecured, please email security@notessecured.app.
Security questions in brief
- Where exactly are my notes encrypted?
- In your browser, before any network request. Encryption and decryption run in WebCrypto on the page you have open; plaintext never crosses the network and never reaches our servers.
- Where are they stored?
- In your vault — managed cloud storage (Postgres plus object storage for attachments) hosted on Lovable Cloud infrastructure. Rows are protected by per-user access rules, and every sensitive field is already ciphertext when it arrives.
- How does unlocking work?
- Your passphrase is stretched with PBKDF2 into a wrapping key. That key unwraps your stored master key inside the browser. The usable key then lives only in page memory; to survive a reload it is re-wrapped under a non-extractable session key held in IndexedDB, with the resulting ciphertext in sessionStorage. Closing the tab throws that away. Your passphrase is always required when the browser restarts after a crash or is closed without signing out — this cannot be switched off. Restoring tabs restores the page, never an unlocked vault.
- What is kept on the client?
- A wrapped (unreadable) copy of your master key and the lock state in sessionStorage; the non-extractable session key that unwraps it in IndexedDB; your sign-in token and UI preferences in localStorage; the app shell in cache storage. Nothing in browser storage exposes readable key material — even in DevTools. Decrypted note text exists in memory while a note is open and is never written to disk.
- What can you see if you are compelled to hand over data?
- Ciphertext, timestamps, sizes and your account email. Without your passphrase the contents cannot be recovered by us, by a court order, or by anyone who copies the database.
- What if I forget my passphrase?
- There is no reset. The optional recovery key you can generate in Settings holds a second wrapped copy of your master key — it is the only way back in. Without either, the ciphertext stays unreadable forever.
This page is maintained by Infinitum Solutions, Inc. to answer common security and privacy questions about NotesSecured. This page describes implemented product behaviour; it is not an independent audit, certification, or legal agreement.
