Security

Version 1.0 · Effective 2026-08-20 · Last updated 2026-08-20

This page states how LobiSolutions protects the data you put into LobiPlan, what we do not do, and how you can check each claim for yourself. It applies to both Organization and Household workspaces.


1. Read this first: what we do not have

LobiPlan is built and operated by a small Canadian team. Publishing a security page invites you to assess us, so we start with the gaps rather than bury them.

We do not haveDetail
Multi-factor authenticationNot available for customer accounts. Passwords only.
SOC 2 or ISO 27001No report, no certificate, no third-party audit. See §12.
An external penetration testNo outside party has ever tested LobiPlan. Our own adversarial assessment is described in §4 and is not a penetration test.
A full content security policy on the application hostapp.lobiplan.com sets frame-ancestors only. It does not yet restrict what the application may load or connect to. The marketing host runs a full policy.
Operational monitoringNo uptime probe, no error tracking, no alerting, no security event monitoring.
A status page or uptime commitmentWe publish no availability figure, because we do not measure one. See §11.
A documented incident response runbookThe notification commitment in §10 is real. The internal runbook behind it is not yet written.
Automated dependency scanning in the buildAdvisories are reviewed and triaged by hand. Nothing scans on every change.
SSO (SAML/OIDC) or SCIM provisioningNot built, and not planned at our current size.

If any of these is a hard requirement of your procurement policy, tell us now. We would rather say so plainly than consume your review cycle.

How to read the rest of this page. Every claim below is marked:


2. Tenant isolation and architecture [A]

3. Access control inside the product [A]

ControlWhat it does
Organization rolesAdministrator or member, per workspace.
Per-function tiersOwner or contributor, set per area of work.
Three visibility modesopen, function or own, enforced in the can_see_* predicates the policies name.
Task-assignee scopingA member whose only role is doing assigned tasks gets own visibility whatever the organization-wide setting says.
Absent, never zeroA money figure a caller may not see renders as "not valued", not as 0. A plausible wrong number is worse than a gap.

4. Independent adversarial assessment [O, dated]

On 26 July 2026 we ran a structured adversarial security assessment across seven domains — Postgres authorization, unauthenticated attack surface, providers and supply chain, authentication lifecycle, browser-side, AI and agentic, and data protection — with a second reviewer whose instruction was to refute each finding. Two findings were refuted and are recorded as refuted.

Tenant isolation held. No path was found by which one customer's data is readable or writable by another, and none by which an unauthenticated visitor reads anything. The findings clustered in a different class — the platform trusting its own callers — and were remediated in schema changes 0243–0249 and 0266–0272.

This was an internal exercise, not a third-party audit and not a penetration test. The full report is a map of our system, so we do not publish it; it is available to customers and prospects under NDA.

5. Staff access to your data [A]

This is the question we are asked most often, and it is the one we can answer structurally rather than with a policy you would have to take on trust.

LobiSolutions staff hold no standing access to any customer workspace. The two database functions that decide membership and administrator rights do not recognise platform staff. That exemption was removed in schema change 0126, and its absence is re-verified in each assessment.

Our platform console shows operational metadata only: which tenant, what kind of action, when. It does not carry item names, note text, message content or chat content.

Yes, an operator can obtain access — and here is exactly what happens when they do. A support engineer who could never reach a customer's workspace could not support the product. So access is available, and it has three properties:

  1. Deliberate. An operator must join your workspace, which inserts a real membership row under their own identity. There is no ambient access and no impersonation mode.
  2. Visible. They appear in your member list, under their own name, and the join is written to your administrator audit log — which you read yourself at Admin → Activity.
  3. Reversible. Leaving removes the membership.

Check it yourself. Open your administrator audit log. If we have ever joined your workspace, there is a row. An invitation to check is the only part of a security answer that is not itself a claim.

Two limits we would rather state than have you find:

6. Where your data is [A] for residency, [O] for the vendors

Application data is stored in Canada, in Supabase's ca-central-1 region.

The LobiPlan web application is a static client-side application with no server-side rendering, so page requests served from Vercel's global edge carry no customer database content — your browser talks to the Canadian database directly. Vercel sees request metadata: IP address, headers, paths.

Some processing necessarily happens outside Canada. Our AI provider, email provider, payments provider and bank-connection provider each run their own infrastructure. We will not tell you "your data stays in Canada", because it is not true and you would catch it. Subprocessors names every company, what it receives and where it runs.

⚠ [TO CONFIRM: the execution region of Supabase Edge Functions, several of which handle financial documents. If they are not region-pinned this section needs a further clause.]

7. Encryption [A] in transit, [O] at rest

In transit: TLS everywhere. HSTS is set to max-age=63072000; includeSubDomains; preload — two years, with preload. One curl -I confirms it.

At rest: encryption is provided by the underlying platforms, Supabase and AWS, and the keys are held by them, not by us. We deliberately name no cipher and no key length: if we do not manage the key, we should not describe the algorithm as though we chose it.

8. Retention and deletion [A]

Deletion runs on a schedule, per class of data.

DataRetained
Meeting recordings90 days
Meeting transcripts365 days
AI chat history180 days
Notifications90 days
Communication log365 days
AI action trail365 days
AI usage aggregates730 days
Meeting minutes730 days
Household bank statement PDFs~30 days

Four classes are deliberately unbounded, and the reason matters:

ClassWhy it is not auto-deleted
The work-event audit trailIt is the record of who did what. Deleting it would destroy the thing customers rely on it for.
Approvals and approval historyThe organization's own governance record.
The general ledgerCanadian record-keeping duties under the Income Tax Act and Excise Tax Act run to six years and bind you, the taxpayer — not us, your software vendor. Auto-deleting your books would be a compliance failure, not a control. You control the deletion of your own ledger.
Person-to-person messagesCorrespondence between two named people; neither one alone can decide it is gone.

The deletion mechanism, because it is a real control: a stored record and a stored file are two different things. Our sweeper deletes the object first and clears the pointer second. Reversed, a failure would leave an orphaned file — still present, still billable, no longer findable. This way a failure leaves a findable file.

Exporting. Every account holder can export their own data, self-serve, once per 24 hours, in 21 sections. Credentials — push subscription keys, calendar feed tokens, verification tokens — are excluded by design, and the export says so in a _meta.excluded block: it records the fact of a device or a feed, never the secret. Every field is named explicitly; there is no wildcard serialization.

Erasure of an account holder is by anonymisation, not deletion. Deletion was never available: 51 foreign keys point into the profile table and those pointers are the audit trail and the approval record. The profile is scrubbed, the sign-in disabled and private data deleted; approvals, history and the ledger survive with the name replaced by "Former member". A re-runnable check asserts that the anonymisation routine performs no deletion against approvals, approval history, work events, work items, messages or either ledger. This is performed by us on request today — there is no self-serve delete button. See the Privacy Policy.

Leaving entirely. Complete tenant deletion removes the organization and its data. It requires re-authentication with the administrator's email and password.

9. Your data and AI [A] on the perimeter, [O] on the vendor terms

On training: we do not train models on your data, and we never sell it. Our AI provider is Anthropic, and under their API terms your content is not used to train their models. What every other company we use receives, and what they may do with it, is on Subprocessors. We will not make an unscoped promise on nine other companies' behalf.

See How LobiPlan uses AI for the full description.

10. Reporting a vulnerability [O]

Email bsimba6@gmail.com. Please include enough detail to reproduce the issue. We will acknowledge within 3 business days and give you an assessment and a remediation plan within 10 business days. We will keep you informed until it is resolved and, with your permission, credit you.

Safe harbour. If you make a good-faith effort to comply with this policy, we will consider your research authorized, we will work with you to understand and resolve the issue quickly, and we will not pursue or support legal action against you. If a third party brings action against you for activity conducted under this policy, we will make it known that it was authorized.

In scope: lobiplan.com, app.lobiplan.com, and the LobiPlan application.

Out of scope: denial of service, social engineering of our staff or customers, physical attacks, spam or automated scanning volume, and any testing against a live customer's workspace or data. If you need an account to test with, ask and we will create one.

Please do not access, modify or retain data belonging to anyone other than yourself. Stop as soon as you have confirmed an issue, and give us a reasonable opportunity to fix it before disclosing publicly.

We do not run a paid bug bounty.

11. Incident and breach notification [O]

If we become aware of a breach of security safeguards affecting your personal information, we will record it, assess it, and — where there is a real risk of significant harm — notify you and the Office of the Privacy Commissioner of Canada as soon as feasible.

If you are an Organization customer, we will notify you without undue delay and in any event within 48 hours of confirming a breach affecting your workspace. Notice goes to your designated contact by email and to your administrators in the application. It will say what happened and when, the categories of data involved, who is affected as far as we can determine, what we have done, what we recommend you do, and who to contact.

Three things we want to be precise about:

We keep a record of every breach of security safeguards for at least 24 months, whether or not it meets a reporting threshold, and we will produce it to the Privacy Commissioner on request.

We need somewhere to send this. Organization customers should give us a designated security and privacy contact.

12. Past security findings

We would rather tell you than have you discover we did not. We have had no breach of customer personal data. We have self-identified and remediated two findings we consider material enough to disclose:

  1. A storage bucket holding profile photographs was publicly readable at a predictable path. It was made private, paths were randomized, and access moved to time-limited signed URLs. We measured the residual exposure window in the content delivery cache and it was bounded.
  2. A legacy database trigger, created outside our version-controlled schema, carried a shared secret in cleartext in the database catalogue — and therefore in backups. The trigger was removed and the secret rotated. This is a credential exposure, not a personal-data exposure.

Neither is known to have been exploited. Both are described in the assessment we share under NDA.

13. Availability [O]

We do not currently offer a contractual uptime commitment, and we publish no uptime figure. There is no monitoring in place, so any number we published would be unverifiable. Business plans are sold by agreement and availability terms can be discussed.

14. Application and platform hardening [A], gap included

Both hosts send, and you can check with one request:

HeaderValue
Strict-Transport-Securitymax-age=63072000; includeSubDomains; preload
X-Frame-OptionsDENY
Content-Security-Policyframe-ancestors 'none'
X-Content-Type-Optionsnosniff
Referrer-Policystrict-origin-when-cross-origin
Permissions-PolicyRestrictive

The marketing hosts run a full content security policy with inline scripts pinned by SHA-256 hash rather than unsafe-inline, and the site loads no third-party resources at all — fonts are self-hosted, and there are no analytics, no tag manager and no tracking pixels.

The gap, in the same section rather than omitted: the application host at app.lobiplan.com currently sets frame-ancestors only. It does not yet restrict what the application may load or connect to. We are rolling that out in report-only mode first. (Last updated: 2026-08-20.)

Sessions. Authentication is JSON Web Token, approximately one hour, with refresh-token rotation. Tokens are held in browser localStorage, which is the standard Supabase browser configuration — they are not httpOnly cookies, and we would rather say so than have you ask. The compensating controls are the short token lifetime, the rotation, frame-ancestors 'none' plus X-Frame-Options: DENY against framing, and no third-party scripts on the application origin. Sign-out is scoped to the local device deliberately.

Passwords. We never hold them; they are managed and hashed by Supabase Auth. A password change requires the current password. The application enforces a minimum of 8 characters. ⚠ [TO CONFIRM: the authoritative Supabase Auth password policy — length, complexity, breached-password rejection and rate limiting — which is configured in the dashboard rather than in the repository.]

Storage. Buckets are private and accessed through time-limited signed URLs.

15. Development practice [O], and the separation-of-duties answer

We would rather state the constraint than have you derive it. LobiPlan is developed by a small team without a separate reviewer for every change. We compensate structurally:

⚠ [TO CONFIRM: whether the operator accounts on the production consoles — Supabase, Vercel, Stripe, AWS, Anthropic, Resend, GitHub and the domain registrar — have multi-factor authentication enabled, and the date each was confirmed.]

⚠ [TO CONFIRM: the Supabase backup tier in force, whether point-in-time recovery is enabled, and the date of the last documented restore test. We have not yet performed one.]

16. Frequently asked

Are you SOC 2 audited? LobiSolutions holds no SOC 2 Type II report and no ISO 27001 certificate, and we will not imply otherwise. We are a small Canadian company; a Type II report needs a continuous observation window we have not yet run and an auditor we have not yet engaged. What we offer instead is evidence you can check rather than an attestation you have to trust:

  1. A dated adversarial security assessment (26 July 2026, seven domains, with a second reviewer whose job was to refute each finding). It records what was found, what was refuted, and twelve accepted risks with the reason each was accepted. Available under NDA. It is an internal exercise, not a third-party audit.
  2. An append-only change history. Every schema change is a new numbered file and applied files are never edited, so our posture has a timestamped timeline you can read. That is a stronger claim about continuity than a point-in-time sample.
  3. Automated gates that assert against what actually ships — 2,460 tests across 85 files, several of which parse the built stylesheet or the migration files themselves.
  4. Third-party static analysis on every schema change — our database vendor's security advisor, currently zero ERROR-level findings.
  5. A live verification session. We will screen-share and run the checks you nominate against our production database — that every table has row-level security, that our platform-administrator functions grant no tenant access — and you can watch the query and the result.

If a SOC 2 report is a hard requirement of your procurement policy, please tell us now.

Do you support multi-factor authentication? No. Not for customer accounts, and there is no date we are willing to commit to here. Compensating: we never hold your password, sessions are short-lived with refresh-token rotation, and a password change requires the current password.

Do you support SSO or SCIM? No, and not planned at our current size. Compensating: administrator-managed membership with a seat cap; a single removal action that unassigns work, clears role tiers and offboards the HR record in one transaction; and an audit log of every membership change that you read yourself.

Do you have a formal joiner/mover/leaver process for staff? No. LobiPlan is operated by a single person, so there is no staff access to provision or revoke. When we hire, this becomes a control and we will publish it.

Can we get a DPA? Yes. See the Data Processing Addendum, offered to Organization customers.

17. Contact

Security questions, vulnerability reports and questionnaire requests all go to the same place: bsimba6@gmail.com. It is one address, monitored by a person, and it is the only one we publish.

Related: Privacy Policy · Subprocessors · Data Processing Addendum · How LobiPlan uses AI · Terms of Service

Changes to this document

We notify material changes in advance, by email and in the application. Non-material corrections are noted below. Previous versions are available on request from bsimba6@gmail.com.

VersionDateChange
1.02026-08-20First publication.