Security
How FloorGen protects your account, your plans and the AI apps you connect, and how to report a vulnerability.
Last updated
FloorGen holds your floor plans and lets AI apps edit them, so we design for a small attack surface and narrow access. This page describes the controls in place today. It is not a certification, and we do not hold SOC 2, ISO 27001 or similar attestations.
Infrastructure
- The app and API run on Cloudflare Workers. Live updates to your open tabs go through a per-account hub on Cloudflare Durable Objects.
- Data is stored in MongoDB Atlas, reached from the Worker over TLS. Atlas encrypts stored data at rest by default.
- Database credentials are kept as encrypted Cloudflare secrets, never in source code.
Transport and browser protections
- HTTPS only, with HTTP Strict Transport Security (two years, including subdomains).
- A strict Content Security Policy: scripts load only from our own origin, Cloudflare's analytics beacon and Google's sign-in library, network requests go only to our own origin, Cloudflare's analytics endpoint and Google sign-in, the only frame allowed is Google's sign-in button, and plugins and framing by other sites are blocked. Our own analytics (self-hosted Rybbit) loads and reports through our origin too.
X-Content-Type-Options: nosniff,Referrer-Policy: strict-origin-when-cross-origin(other sites see at most our domain, never a page address), aPermissions-Policythat turns off camera, microphone, location, payment and USB access, andCross-Origin-Opener-Policy: same-origin-allow-popups(so Google's sign-in window can answer the page).- State-changing API requests from the browser are refused unless they come from our own origin.
Accounts and sign-in
- You sign in with your Google account. Google tells us your verified email address and name in a signed token, which our server checks against Google's published keys; we keep your Google account id with your account and never see your Google password. An account made earlier with a password signs in with Google using the same email.
- Email and password sign-in is turned off for now. Where an account has a password, it is hashed with PBKDF2-SHA256 (100,000 iterations, a random 16-byte salt per password). We never store or log plain passwords.
- When password sign-in is on, a new account confirms a six-digit, randomly generated code that expires after 10 minutes and allows at most 5 wrong guesses, and after 10 failed sign-ins an account is locked for 15 minutes. Unknown emails take the same time to reject as wrong passwords, so sign-in does not reveal who has an account.
- Sign-in (Google included), sign-up and code checks are rate-limited to 20 attempts per minute per IP address.
- Sessions use a random 256-bit token in a
__Host-cookie that isSecure,HttpOnlyandSameSite=Lax, and last 30 days. We store only a SHA-256 hash of the token, and signing out deletes the session on the server.
Data isolation
Every project, key, connection and activity record is stored against the account that owns it, and every lookup of your data is scoped to the signed-in account, or to the account behind the API key or OAuth token in use. In the browser, each account signed in on a device gets its own local database, so switching accounts never shows or uploads another person's projects.
AI agent access
AI apps reach your projects through our MCP server, with an API key you create or through OAuth sign-in you approve. Either way:
- Scoped access. You choose read only, edit, or full access (which adds deleting projects). API keys can also be limited to specific projects.
- Expiry. API keys expire after 30, 90 or 365 days, or never, as you choose. OAuth access tokens last 1 hour and refresh tokens 30 days.
- Revocation. You can revoke any key or disconnect any app at any time in the Agents & MCP dialog, and access stops immediately.
- Hashed secrets. API keys (
fg_live_…, 256 random bits) are shown once and stored only as a SHA-256 hash. OAuth codes and tokens are stored only as hashes too. - OAuth 2.1 with PKCE (S256) and a consent screen that shows the app and the access requested. Authorization codes expire after 60 seconds.
- Rate limits of 300 tool calls and 60 edits per minute for each key or connected app.
- Guardrails on edits. Agents can preview changes with a dry run and pass the revision they last read, so a stale edit that overlaps newer changes is refused. Permanent or large deletes first return a single-use confirmation token, valid for 5 minutes and tied to that exact request, and agents are instructed to ask you before using it.
- Review and undo. Every agent change is logged with which key or app made it, shown in the Activity panel, and can be undone. Restore points are taken before risky edits and deletes and kept for 30 days.
Monitoring and data handling
- Requests and errors are logged through Cloudflare's Workers logging so we can detect and fix problems.
- The contact form is rate-limited to 5 messages per minute per IP address and filters automated submissions. IP addresses used for rate limiting are not stored in our database.
- Request bodies are size-limited and validated against schemas before they are processed.
What you can do
- Use a strong password that you do not use anywhere else.
- Give AI apps the least access they need, limit keys to the projects they need, and choose an expiry.
- Treat API keys like passwords. Never paste them into shared documents or public repositories, and revoke any key you think has leaked.
- Export or back up projects you cannot afford to lose.
Reporting a vulnerability
If you find a security issue, please tell us through the contact page with the topic Security. Include what you found, the steps to reproduce it, and its likely impact. Please do not include passwords, keys or other people's data in the message.
We will acknowledge your report, keep you updated as we investigate, and credit you when we publish a fix if you would like. We will not pursue legal action against good-faith research that follows this policy.
In scope
- The FloorGen web app, its API and the MCP and OAuth endpoints on our own domain.
- Issues that let someone read or change another account's data, take over an account, bypass agent scopes or project limits, or get around authentication or rate limits.
Out of scope
- Denial-of-service or load testing, spam, and social engineering of anyone.
- Physical attacks, and attacks that require a compromised device or browser.
- Third-party AI apps and their own handling of data, and Cloudflare or MongoDB platform issues (please report those to them).
- Findings from automated scanners without a demonstrated impact, missing best-practice headers with no exploit, and self-XSS.
Rules for testing
- Test only against accounts you own, and never access, change or delete other people's data.
- Stay within the rate limits and stop as soon as you have shown the issue.
- Give us reasonable time to fix the issue before you disclose it publicly.