Our position

Nothing on this page is an upgrade.

Every control described below applies to every account on every plan, including the $79 Solo tier. A practice holding a hundred SSNs needs the same protection as one holding ten thousand, and charging for that would be an odd way to run a company that wants to be trusted with either.

Authentication

Two-factor authentication is mandatory and cannot be switched off.

Not "recommended", not "available in Enterprise". Every account with a password — staff and client alike — requires an authenticator app.

TOTP, and only TOTP

RFC 6238 authenticator apps — Google Authenticator, Authy, Microsoft Authenticator, any compliant app. SMS-based 2FA is deliberately not offered: authenticator apps are phishing-resistant and immune to SIM-swap attacks.

  • The page that disabled 2FA has been deleted from the application, not hidden — the route returns 404 for every role including Super Administrator
  • Enrollment is enforced by middleware; an unenrolled account is redirected on every request
  • Recovery codes can be regenerated at any time
  • "Remember this device" lasts 30 days, per browser and device

Passwords that have to earn it

A 10-character minimum with upper case, digit and non-alphanumeric — then several more gates before a password is accepted.

  • Breached-password screening against Have I Been Pwned by k-anonymity (NIST 800-63B)
  • Weak, dictionary and context-specific passwords rejected — including the product name and the user's own email
  • Password history prevents recycling a recent password
  • Stored as PBKDF2-HMACSHA512 with 100,000 iterations
  • Account lockout after 5 failed attempts, for 15 minutes

Sessions and single sign-on

Authentication cookies are HttpOnly, Secure and SameSite-pinned with an 8-hour sliding expiration. The two-factor challenge runs on a separate 10-minute non-sliding cookie.

  • Optional Google and Microsoft sign-in, configured per deployment
  • Invite-only — the external email must match an existing confirmed account, with no auto-provisioning
  • Accounts with 2FA are routed back to the password flow, so an identity provider can never bypass MFA
  • Suspended accounts are refused; every outcome is recorded as a security event

Anti-enumeration

Sign-in and password-reset responses are deliberately generic, so neither can be used to discover which email addresses have accounts.

  • A confirmed email address is required to sign in, with a self-service resend flow
  • Password-reset and invitation links are built from the tenant's configured URL, never the inbound Host header — a forged host cannot redirect a valid token to an attacker's server
  • If no usable URL is configured, no link is sent at all
Data protection

Encrypted at rest, encrypted in transit, isolated by architecture.

PII encryption

  • SSN, FEIN, driver's license and bank details encrypted at rest with per-purpose keys
  • Integration credentials encrypted with a distinct purpose per integration, never echoed back to screen
  • The data-protection key ring is persisted and can be wrapped by a managed key vault

File security

  • Magic-byte validation — files are checked against their actual binary signature, not the extension or declared MIME type
  • Archive-bomb detection on compressed formats
  • Filename sanitization; 5 MB per file, enforced per file and at the form
  • CSV exports neutralize spreadsheet formula injection

Tenant isolation

  • Database-level global query filters on every tenant-scoped table, resolved live and failing closed
  • Stored file paths lead with the firm id, and reaching a file requires a firm-scoped lookup of that path
  • Auth cookies are host-scoped, never wildcard-domain
  • Background workers get a fresh scope per tenant; no worker crosses a boundary

Client data isolation

  • Portal sessions are bound to a single client; URL manipulation returns Access Denied
  • Staff-only pages refuse any portal session regardless of URL
  • File and attachment access validated against the requesting client's identity
  • JSON API endpoints carry a same-origin guard

Bot defense & rate limiting

  • Cloudflare Turnstile with server-side verification on sign-in, reset and invitation acceptance
  • 300 requests/minute per IP globally; 20 per 15 minutes on authentication
  • IP reputation tracking with blocking enforced by middleware before the app sees the request
  • Proxy headers are trusted only when the socket peer is in an explicitly configured set — an unconfigured set trusts nobody

Audit logging

  • Every significant action recorded immutably: auth events, data access and change, admin actions, file operations, printed client sheets, every conversion step
  • Each entry carries user, IP, timestamp and affected record
  • Audit, activity, security-event, login-history and email logs each get their own filterable, exportable screen
AI data handling

What actually leaves your tenant when the AI runs.

This is the question every firm asks second, right after "is it encrypted". The honest answer is a short list, and we would rather publish it than be vague about it.

  • Account numbers in bank statements are masked before transmission to any AI service.
  • Only extracted transaction text and account names are sent — not full client PII.
  • AI responses are suggestions requiring staff review. They are never source-of-truth data.
  • Every AI call is logged with surface, operation, model, token counts and estimated cost, for billing and compliance audit.

AI content moderation

Every AI-powered feature passes through a moderation layer before the primary call, applied by middleware as well as at the service. It blocks prompt injection, system-prompt and API-key extraction attempts, database schema probing, and inappropriate content.

Legitimate questions are never blocked. Custom validation patterns run under a 250-millisecond timeout, so a crafted pattern cannot be turned into a denial-of-service.

The help assistant answers only from Kveldo's own documentation via keyword retrieval — staff and client corpora are separate, so a client cannot ask about staff features and get a useful answer.

Software supply chain

The code that ships is gated before it ships.

Pinned dependencies

The full transitive graph is pinned by a lock file, and CI restores in locked mode. Dependabot keeps it current.

Vulnerability gate

CI fails the build on any known-vulnerable package. Not a warning — a failure.

Static analysis

SAST runs on every build across the whole repository, failing on error-severity findings — single-threaded with an extended timeout, because a scanner that silently drops findings under load is worse than none.

Secret scanning

A pre-commit hook scans staged changes with four independent detectors, including provider key-shape detection that fires regardless of the variable name a key was pasted into.

FTC Safeguards Rule

Where Kveldo fits in your WISP.

Tax preparers are "financial institutions" under the Gramm-Leach-Bliley Act, which means the FTC Safeguards Rule applies and a written information security plan is required. Kveldo is not your WISP — but it is the system most of your WISP will describe.

What Kveldo provides

Access controls and role-based permissions, multi-factor authentication on every account, encryption of customer information at rest and in transit, a change-management and audit trail, monitoring of authorized user activity, and secure disposal — deleting a file removes the blob and the database row, with the deletion audited to the client timeline.

What remains yours

Designating a qualified individual, running your own risk assessment, training your staff, vetting your other service providers, and keeping the written plan current. Kveldo supplies the controls your plan has to describe, documented so you can reference them directly.

Need our security documentation for your own assessment? Ask us — we will send what we have rather than hide behind an NDA wall.

Bring us your security questionnaire.

We would rather answer it before you sign up than after. Start a trial, or talk to us first — either order works.