Security

Our security model in one sentence: there's nothing on a server to attack. Everything below is falsifiable from your DevTools.

Architecture

Abundera QR is a static single-page application served from Cloudflare Pages. There is no application server, no database, no user accounts, no authentication, no API endpoints, and no backend code path that processes user data. Every QR generation, encoding, scanning, and rendering operation runs entirely inside your browser.

Threat model

Because we collect, store, and transmit no user data, the most common web-app threats, credential theft, database breach, session hijacking, server-side injection, do not apply. The remaining attack surface is the static asset bundle (HTML, CSS, JavaScript) served from our origin. We design assuming:

Content Security Policy, by directive

The current policy (verify in Response headers for any request):

Content-Security-Policy:
  default-src 'self';
  script-src 'self' 'wasm-unsafe-eval';
  worker-src 'self' blob:;
  style-src 'self' 'unsafe-inline';
  font-src 'self';
  img-src 'self' data: blob: https:;
  connect-src 'self' https:;
  frame-ancestors 'none';
  base-uri 'self';
  form-action 'self'

What each directive lets us do and where it compromises:

Different CSP policies apply to /bio/* (relaxed img-src for user-supplied avatars) and /embed/* (relaxed frame-ancestors for intentional embedding). Both are documented in site/_headers.

Transport + framing headers

Service worker

Our service worker (site/sw.js) caches only same-origin assets. The fetch handler explicitly rejects cross-origin requests and non-GET methods, you can read the logic on GitHub. Cache writes are wrapped in event.waitUntil() so they can't be dropped mid-navigation.

Input sanitization

Every rendering path that accepts user input treats it as untrusted text:

Cross-origin image fetching

When a user pastes a https: URL as a vCard photo or logo, the browser fetches it subject to CORS and our CSP's img-src allowlist. The image renders into a canvas. It never becomes live DOM, never runs as code, and never reaches our origin, the fetch is browser → remote image, and the result is painted client-side. An attacker controlling a remote image URL can track that the URL was loaded (a log line on their own server) but cannot exfiltrate anything from our page.

Subresource Integrity (SRI)

All JavaScript and CSS we ship is same-origin. We do not load third-party scripts or stylesheets, so SRI hashes are not applicable. If we ever load a third-party asset, we'll ship an SRI integrity attribute on it and document the hash-update process in this page.

Reporting a vulnerability

If you discover a security issue affecting Abundera QR, whether in our code, our deployment, or in a dependency we ship, please report it privately to security@abundera.ai. We aim to triage within 72 hours. You can also reach us via the contact details in our /.well-known/security.txt file.

No bug bounty (yet)

We do not currently offer paid bounties, but every confirmed valid report receives credit in the changelog and our public thanks.

Verify any of the above

Every claim on this page is falsifiable from your browser's DevTools without trusting us:

Contact

Security disclosures: security@abundera.ai

Last updated: 2026-04-19. Next review: 2026-07-19.