Security and trust

We hold other people’s insurance paperwork. Here is how we protect it.

The documents a premium audit asks for carry tax IDs, Social Security numbers and bank details — and so can loss runs Flora retrieves under written authorization. This page says, in plain language, what Flora does with them today. Nothing here is a plan, a badge we have not earned, or a sentence copied from a bigger company’s website.

For security researchers
Our published contact file
Last checked
Every claim on this page was re-checked against the live service on September 19, 2026.

Security and trust

Trust

Premium-audit files and loss runs retrieved under written authorization can carry tax IDs, Social Security numbers, and bank details. This expand is the plain promise -- not a badge Flora has not earned.

  • You own the documents you put in Flora; Flora processes them to run the service.
  • Agent and carrier contacts see only the files attached to them.
  • Card payments go through Stripe; Flora does not store card numbers.
  • Flora is a data vendor -- reports and evidence, not underwriting decisions.

LOA access data boundary

Authorization

Loss-run pulls start with a letter of authorization or a written agency access agreement. Flora acts as an authorized requester -- not the insurer, not appointed as the agency.

  • No invented carrier partnerships or appointment claims on this page.
  • Portal credentials, when used for a pull, are not kept as Floras standing passwords.
  • Security packet and security.txt are available for reviewers who need the long form.
  • Flora is a data vendor, not an insurer, agent, or underwriter. Flora reports evidence-backed observations; the carrier makes every coverage decision. Flora does not price, issue, place, or end insurance coverage and does not recommend coverage decisions. Nothing on this site is an offer of insurance, an insurance application, or a coverage recommendation.

Flora is a data vendor, not an insurer, agent, or underwriter. Flora reports evidence-backed observations; the carrier makes every coverage decision. Flora does not price, issue, place, or end insurance coverage and does not recommend coverage decisions. Nothing on this site is an offer of insurance, an insurance application, or a coverage recommendation.

At a glance

The five things people ask first, answered in one line each.

Every page is encrypted in transit

Everything between your browser and Flora travels encrypted, using the current standard.

Older, weaker connection types are refused outright, and a plain unencrypted address is redirected to the encrypted one.

Encrypted where it is stored

The storage under Flora’s database, documents included, is encrypted by our hosting provider.

The provider manages the keys. Flora does not add a second layer of its own today, and says so rather than implying otherwise.

Your documents are never sent to the AI

The files you upload are not sent to any AI provider.

The setting that would allow it is switched off in production. When the AI would need the text of a document, Flora answers from its own built-in checks instead.

One copy, one database, one country

Your documents live as a single copy in one database in the United States.

There is no separate file store, no file-sharing service and no copy on a content network. The database has no public address and is reachable only by Flora itself.

A record that cannot be changed

Every change to a file is recorded, and the record cannot be edited or deleted.

The database itself refuses to alter or remove those records, and Flora refuses to save a change if that protection is ever missing.

The promise

What never leaves Flora

A short list, because the short list is the promise. Each line is enforced in code or in a contract, not in a policy document nobody reads.

What does reach the AI provider: the facts on your checklist and the questions people type, after the removal above. The provider is Groq. Its contract forbids using anything we send to train its models, and it does not keep what we send by default. Flora does not train models on customer data either.

  1. Your documents

    Uploaded files are never sent to an AI provider, a search service, or any other company. They are stored as one copy in Flora’s database. Flora shows you the checklist result, not the file itself; a copy of your file is provided by the Flora team on request.

  2. Your file, to anyone not attached to it

    Every read and write passes through one gate that checks who you are and which company you belong to. An agent sees their own book, a carrier sees its own accounts, a business owner sees one policy. Every page and every connection checks this for itself.

  3. Card numbers

    Payments happen on Stripe’s own checkout pages. Flora never receives, stores or sees a card number.

  4. Personal identifiers, in the little that does reach the AI

    When Flora asks its AI provider a question about a checklist, Social Security numbers, tax IDs, account numbers, email addresses, phone numbers and card numbers are removed before the question leaves Flora. Flora keeps a fingerprint of what was sent, never a copy.

  5. Your data, once you ask for it to go

    Ask through the contact page or your account page. A person confirms the request by email, then the Flora team erases your company, its file and every document in one step, and writes one final line in the record to prove it happened. That record itself is kept; it is the proof the file was handled properly.

The details

Each claim, what makes it true, and how to check

Written for the person filling in a vendor questionnaire. Each section is one claim, what makes it true, and where possible a way to check it without asking us. Open “Technical details” for the specifics.

Effective September 18, 2026.

Encrypted on the way and where it is stored

Every connection to Flora is encrypted with the current standard, and the disks under the database are encrypted by our hosting provider.

When you open Flora, your browser and Flora agree on an encrypted connection before a single word is exchanged. Older, weaker connection types are refused. If someone types the plain unencrypted address, they are sent to the encrypted one, and browsers are told to remember that for two years.

Our hosting provider, Railway, encrypts the storage under everything it runs for us, including the database that holds your documents, and manages the keys. Flora does not add a second encryption layer of its own today. Between Flora and its database, traffic stays on the provider’s private network, which is encrypted between services; the database has no public address at all.

Check it yourself: Look at the padlock in your browser on any Flora page, or read the connection details it shows.

Technical details
  • TLS 1.3 is negotiated by default with TLS 1.2 as the floor; TLS 1.0 and 1.1 are refused. The certificate is issued by Let’s Encrypt and terminated at Railway’s edge.
  • Plain HTTP redirects to HTTPS. HSTS is sent with a two-year max-age, covering subdomains, with preload.
  • Railway states that all volume data, Postgres included, is encrypted at rest at the storage layer with keys it manages. Railway does not encrypt individual volumes at the software level and does not publish the algorithm, so Flora does not name one.
  • App-to-database traffic stays on Railway’s private network, encrypted between services with WireGuard. The database has no public endpoint.

Where Flora runs

Flora runs on Railway in the United States, a hosting provider that holds its own SOC 2 Type II and SOC 3 reports.

Flora and its database run as two services in one Railway project, in Railway’s US West region in California. Your uploaded documents are stored inside that database; there is no separate file store.

Railway’s certifications belong to Railway, not to Flora. Railway publishes its SOC 2 Type II report, its SOC 3 report and an independent penetration test report through its trust center, and offers a data processing agreement.

Check it yourself: Railway’s trust center is public; the link is in the table of companies below.

Technical details
  • Railway project region: US West (California). Region list at docs.railway.com/reference/regions.
  • Railway does not hold ISO 27001. Its SOC 2 Type II, SOC 3 and pentest reports are available through trust.railway.com on request.

Signing in and staying signed in

Passwords are scrambled so that not even Flora can read them, and a sign-in expires on its own.

Flora never stores your password, only a one-way scrambled version of it, so Flora cannot read a password back and neither could anyone who copied the database.

When you sign in, Flora gives your browser a token that points to a record on our side. The record holds only a fingerprint of that token, so a copy of the database cannot be used to sign in as you. A sign-in ends after seven days without activity and after thirty days no matter what, and you can sign out of any device from your account page.

Repeated failed sign-ins lock that email address, from that location, for fifteen minutes, and every failure is written to the record. The Flora team signs in through a separate staff door.

Since September 19, 2026, Flora staff accounts, the ones that can see customer files, can turn on two-step verification: a code from an authenticator app plus a set of recovery codes. Once a staff account has turned it on, the password alone is no longer enough to get in.

Where we are honest: Two-step verification is switched on account by account, not required across the board, and customer accounts do not have a second factor yet. If your company needs it for its own users, say so; the code is already written and extending it is a short job.

Technical details
  • Passwords are stored as salted scrypt hashes (N = 2^15, r = 8, p = 1, a 16-byte per-user salt, parameters stored with the hash).
  • A session is a database row referenced by an HttpOnly, Secure, SameSite=Lax cookie; only a SHA-256 of the session secret is stored. Idle timeout 7 days, absolute timeout 30 days; any session can be revoked from the account page.
  • Repeated failed sign-ins lock the email-and-address pair for 15 minutes; failures and locks are audited.
  • Second factor for staff (ops) accounts: time-based one-time codes (RFC 6238) plus single-use recovery codes, shipped September 19, 2026. Enrolment is per account and optional until completed; once enrolled, sign-in demands the code after the password. There is no organisation-wide require switch, and customer roles have no second factor.

Who can see your file

Every company file belongs to one company, and one gate decides who can open it.

Every read and write passes through one gate that checks who you are and which company you belong to. An agent sees their own book, a carrier sees its own accounts, a business owner sees one policy, and the Flora team can see every file in order to run the service. That staff access is a separate sign-in, and every action is recorded.

Every page and every connection checks this for itself. The menu only hides what you cannot open; it is never the thing that protects it.

Technical details
  • All reads and writes go through one tenant-scoping layer that filters by the signed-in user’s tenant and role. Every page and every API route enforces its own gate.

A record that cannot be changed

Every change to a file is recorded, and the record cannot be edited or deleted.

Every change writes one line to a permanent record: who did it, what changed, when, and what it looked like before and after.

The database itself refuses to alter or remove those lines, and Flora checks that protection is in place every time it starts and every time it saves a change. If the protection were ever missing, Flora would refuse to save anything until it was back.

Check it yourself: The technical description of that protection is included in the security packet.

Technical details
  • The audit table is append-only: database triggers refuse UPDATE, DELETE and TRUNCATE. The application verifies the triggers on boot and on every data path and refuses to serve a write if they are missing.

Loss-run retrieval

Loss runs for clients and agents — 95+ carriers and growing — under written authorization, with an audit trail, and without storing portal passwords in the application database in this phase.

Loss runs are official carrier PDFs a business needs for bids, contracts, certificates, renewals, and coverage changes. With the insured’s (or agent’s) written authorization, Flora requests or retrieves that PDF and stores it in the company file. Flora is an authorized requester — not an insurer or appointed agent.

In this phase, Flora staff perform the retrieval under that authorization for 95+ carriers and growing. Access is limited to the pull. Who authorized, who executed, and whether it succeeded are written to the audit trail. Portal passwords are not stored in Flora’s application database.

Check it yourself: Ask for the authorization text on a loss-run request and the security packet for the wider program.

Where we are honest: Automated carrier login is not live. Flora has not completed its own SOC 2 audit, does not require a second sign-in factor for every account, and has not published a penetration test.

Protection built into every page

Every page tells your browser exactly what it may run and load, and every form is protected against being submitted from another site.

Each page ships with a strict set of rules for the browser: only Flora’s own code may run, nothing from other companies loads, and the page cannot be embedded inside another website. No third-party scripts run on Flora.

Anything that changes data must come from Flora itself and carry a one-time token issued for your visit. Uploads are limited to PDF, JPG and PNG files, checked both by their name and by their actual contents, and capped at 15 MB. Card details are entered on Stripe’s pages, never on Flora’s.

Check it yourself: Open any Flora page and read the response headers in your browser’s developer tools.

Technical details
  • Every page is served with a strict Content Security Policy: a per-request nonce with strict-dynamic, object-src none, frame-ancestors none. Also sent: X-Frame-Options DENY, Cross-Origin-Opener-Policy and Cross-Origin-Resource-Policy same-origin, Referrer-Policy strict-origin-when-cross-origin, a Permissions-Policy that turns off camera, microphone and geolocation, and X-Content-Type-Options nosniff.
  • State-changing requests must pass an origin check and carry a per-visit synchronizer token. Uploads are checked by extension and by leading bytes (magic numbers) and capped at 15 MB.

Your documents and the AI

The text of your documents is never sent to an AI provider.

Flora’s AI features run with the document-text setting switched off in production. That setting is checked by the very last step before anything leaves Flora. When the AI would need the text of a document, Flora answers from its own built-in checks instead; it does not send a trimmed version.

What can be sent is the facts on your checklist and the questions people type, after Social Security numbers, tax IDs, account numbers, email addresses, phone numbers and card numbers are removed. Each request is logged with the provider, the model, and a fingerprint of exactly what was sent, never the content itself.

The provider is Groq. Its contract with us says it may not use anything we send to train its models, and it does not keep what we send by default. Flora does not train models on customer data either.

Check it yourself: Groq’s services agreement and its “Your data” page are public; both links are in the table of companies below. Flora’s own request log is in the packet.

Technical details
  • The production setting that would allow document text to leave the process is off. It is read by the last function before a provider call; when off, a call that needs document text degrades to the deterministic answer rather than sending a redacted version.
  • Redaction before any provider call replaces SSNs, EINs, account numbers, emails, phone numbers and card numbers. Each call is logged with provider, model and a SHA-256 of the exact prompt, never the bytes.
  • Groq services agreement section 4.2: not permitted to use inputs or outputs for training or fine-tuning. Groq does not retain inference data by default.

How long we keep things, and deleting them

Files are kept for as long as the audit they support can be reopened, and erased within thirty days of a confirmed request.

Company files and documents are kept while the file is open and afterwards for as long as the audit it supports can still be reopened, which for most workers’ compensation policies is three years after the policy term ends. A carrier’s contract may set a different period for that carrier’s files.

Anyone can ask for a copy of their company file, or for it to be removed, through the contact page or the account page. A person confirms the request by email, and the Flora team then erases the company, its file and every document in one step, within thirty days. What is kept, deliberately: the permanent record described above, plus anything the law or a carrier contract requires us to keep. Sign-ins expire on their own and are cleaned up afterwards.

Check it yourself: The full item-by-item table is on our data page, linked at the end of this page.

Where we are honest: Erasure is a request handled by a person, not a self-serve button. There is no self-serve download of a stored document today either; a copy of your file is provided by the Flora team on request.

Technical details
  • Erasure is an ops-only command that deletes the tenant, its company file and every document in one database transaction and writes one final row to the append-only audit log. The audit log and legally required records are retained.

Backups

The database is backed up continuously by our hosting provider, and we have practiced restoring from that backup.

Railway keeps a continuous backup of the database that can be wound back to any moment in roughly the last four weeks, plus daily and weekly snapshots.

On September 19, 2026 we practiced restoring twice. First we brought a full copy of the database back into a throwaway database: every table came back, every row count matched the live service, and every stored document was checked byte for byte against the fingerprint recorded when it was uploaded. Then we used the provider’s own wind-back tool to restore the live database to a chosen moment in a second throwaway copy: it was accepting connections in about six minutes, every table count matched the live service, and the copy was deleted afterwards.

Where we are honest: Two steps have not been practiced yet: restoring from the daily and weekly snapshots, and switching the live service over to a restored database, which we estimate would take ten to fifteen minutes in total. The backups also live with the same provider as the database. We do not hold a copy anywhere else today, so loss of the Railway account is a risk we have accepted knowingly while we are small.

Technical details
  • Railway point-in-time recovery archives the write-ahead log continuously, with a weekly full and a daily differential base backup, giving roughly a four-week restore window.
  • Logical restore tested September 19, 2026: 36 of 36 tables, row counts matching production, every document’s bytes matching the SHA-256 recorded on its row.
  • PITR restore drill September 19, 2026: a restore to a chosen timestamp into a sibling Postgres service in the same project. Container online in about 1.5 minutes, accepting connections after about 6 minutes of write-ahead-log replay; every table count and the latest migration matched production; the sibling service and its volume were deleted afterwards; compute cost under $0.05. Volume-snapshot restore and the connection-string cutover to a restored database have not been exercised. No off-platform copy exists.

Companies we work with

Five companies can receive customer data, and each receives only what its job needs.

The table below is complete as of the date on this page. If we add a company, it appears here first.

Companies that can receive customer data
CompanyWhat it does for FloraWhat it receivesWhereTheir own assurances
RailwayHosting: Flora itself and the database, documents included.Everything Flora stores, encrypted where it is stored.United States (US West, California)SOC 2 Type II, SOC 3 and a penetration test report through its trust center.
StripeCard payments, on Stripe’s own checkout pages.Billing name, email address and card details typed on Stripe’s pages. Flora never receives a card number.United StatesPCI DSS Level 1 service provider.
GroqAI answers for checklist explanations and the Flora AI chat.Checklist facts and typed questions with personal identifiers removed. Never document text or files.United StatesContract forbids training on our data; does not keep what we send by default.
PolsiaBackup billing route and the host of our marketing site.Only on a backup checkout: a company identifier, the buyer’s email address, the plan chosen and campaign tags.United StatesWe have not obtained written data-handling terms from Polsia yet, and we say so.
ResendSending email: password resets, invitations, verification and application alerts.Recipient email addresses, names and the message text.United StatesPublishes its own SOC 2 Type II report; our sending domain is verified with it.

Keeping the software up to date

Every piece of software Flora depends on is pinned to an exact version, the build refuses to ship with type errors, and an automated test suite covers the protections on this page.

Flora’s dependencies are pinned to exact versions and updated deliberately, never silently. The build is strict and stops on type errors. An automated test suite covers sign-in, sessions, who can see what, the browser rules, the form protection and the pages on this site, and runs before each deploy.

Security reports go to the founder personally and are read first.

Where we are honest: Automated weekly dependency scanning is configured and switches on with our next push. A customer contract that requires it will move it to the top.

Technical details
  • Every dependency is pinned to an exact version (no ranges). The TypeScript build is strict and fails on type errors. The test suite covers sign-in, sessions, tenancy scoping, the Content Security Policy, the CSRF check, the vendor boundary and the public pages.

Where we stand on audits

Flora hasn’t done a SOC 2 audit yet. We share our written security packet and our host’s SOC 2 reports instead.

Flora is a small company with one engineer. A SOC 2 audit costs more than a year of Flora’s hosting, so it will happen when a customer’s contract needs it, not before. Until then this page, and the packet behind it, are the audit: each claim names its evidence, and you can check most of them yourself.

What we can send today: this page’s claims with the evidence behind each, our written security policies, a description of how Flora is built, the list of companies we work with, the incident response plan, a completed security questionnaire, and Railway’s own SOC 2 Type II and SOC 3 reports through its trust center.

Reporting a security problem

Security reports go straight to the founder and are read first. We aim to acknowledge within two business days.

Write to florawc.support@gmail.com, or use the contact page with the topic “Security report”. Include what you saw and how to reproduce it; do not include another person’s data. We also publish a standard contact file that security researchers’ tools look for.

Please give us a reasonable time to fix an issue before describing it publicly, and do not test against accounts that are not yours. We will not pursue anyone who reports in good faith and stays within those lines.

Technical details
  • A machine-readable contact is published at /.well-known/security.txt (RFC 9116).