Security whitepaper

How Beacon protects your data

Version 1.1 · October 2026 · Applies to the hosted service at app.beaconhelpdesk.com

Short version

Summary

1. Scope

Beacon is a help desk, asset management, and knowledge base platform operated by SYV Technologies LLC. This document describes the hosted service: the web app at app.beaconhelpdesk.com, the API at api.beaconhelpdesk.com, the iOS app, and email-to-ticket at tickets.beaconhelpdesk.com. The on-premises edition runs the same software on a customer's own servers; its hosting controls are the customer's, and sections 3, 4, 6, 8, and 9 apply unchanged.

Everything here describes what is implemented today. Planned work is confined to section 16. If you find a statement that does not match the product, tell us at security@beaconhelpdesk.com and we will correct the document.

2. Architecture

Web app (Next.js)      iOS app (Expo)       Integrations (REST, webhooks)
        \                    |                    /
         \                   |                   /
                 API (Fastify, TypeScript, stateless)
                 auth · roles · row-level security
                 tickets · assets · automations · AI
                /                |                 \
   PostgreSQL              Private encrypted       Anthropic API
   one database,           volume for              triage, replies,
   RLS per organization    attachments             article drafts

The API is stateless; production runs one instance today (section 16). All state lives in a single PostgreSQL database with an organization id on every tenant table, and attachments are private objects in an encrypted object-storage bucket (Tigris Data, written from the same United States region). The web app is a client of the same API that customers use; it holds no customer data of its own. Email is sent and received through Resend. AI features call Anthropic's API.

Hosting: the API and database run on Fly.io in the United States (Virginia). The web app and this website run on Vercel in the United States. The whole system is TypeScript end to end, with one shared schema from the database row to the mobile screen, which keeps validation consistent across every surface.

3. Tenant isolation

Beacon is a single-database, multi-tenant system. Isolation is enforced by PostgreSQL row-level security (RLS), not by application code remembering to add a WHERE clause. The mechanism, exactly:

  1. Every tenant table has a non-null org_id column referencing the organizations table.
  2. A dedicated database role, beacon_app, cannot log in directly and cannot bypass RLS. Row-level security is enabled and forced on every tenant table, with a policy that allows a row to be read or written only when its org_id equals the organization id set for the current transaction:
    CREATE POLICY tenant_isolation ON <table> TO beacon_app
      USING      (org_id = NULLIF(current_setting('app.org_id', true), '')::uuid)
      WITH CHECK (org_id = NULLIF(current_setting('app.org_id', true), '')::uuid);
  3. Every request that touches tenant data runs inside a transaction that first sets the organization id as a transaction-local setting and then switches to beacon_app with SET LOCAL ROLE. Both are scoped to the transaction, so a pooled connection carries nothing over to the next request.
  4. If the organization id is unset, the policy expression compares against NULL, which is never true. A request that somehow skipped the tenant context sees zero rows rather than every row.
  5. The organizations table itself allows the restricted role to read and update only its own row, and never to insert or delete. Platform-level tables are not readable by the restricted role.
  6. The role the API signs in with is not a superuser and cannot bypass row-level security. The schema owner's connection is used only for migrations and the nightly backup. Platform operations (creating organizations, cross-tenant sign-in lookup by email, the platform console) are reviewed, audited code paths that run under a role allowed to read across organizations for the length of their transaction; reading or writing a district's records never runs as that role. The two device-token paths a signed-in person triggers, registering a push token and removing one at sign-out, run under it so a shared device's token can move between organizations.
  7. Attachments are private objects in an encrypted object-storage bucket with no public access. The only path to a file is an authenticated download endpoint that resolves the attachment record under RLS and then issues a link that expires within ten minutes.

Automated tests assert that every tenant table has a forced RLS policy and that a cross-tenant read through the tenant context returns nothing.

4. Authentication and authorization

Passwords and sessions

Single sign-on

API keys and webhooks

Roles

Four roles: owner, admin, agent, requester, plus team membership for assignment visibility. Requesters are limited to their own tickets, published public articles, and their own devices. Authorization is checked in every route handler on the server; row-level security is the backstop beneath it. Requesters never receive internal notes or internal events, and API responses never include password hashes, token hashes, key hashes, or secrets.

Platform access

Beacon staff use a separate platform login and credential that has no tenant session of its own. Support impersonation issues an ordinary tenant session and writes an audit entry (platform.impersonate) visible to the organization's administrators.

Abuse protection

5. Data flows

FlowPathWho can see it
Sign-inBrowser or app → API over TLS → password verification against the hash, or OIDC redirect to your identity provider and backBeacon (credential hash only); your identity provider
Ticket created in the portal, app, or by an agentClient → API → PostgreSQL under RLS; optional AI triage (section 6); notifications to assigneesYour organization's authorized users; Beacon's infrastructure providers (encrypted)
Ticket created by emailSender → your forwarding address → tickets.beaconhelpdesk.com (Resend) → signed webhook → API → PostgreSQLResend sees the message in transit; then as above
Ticket created by APIIntegration → API with an API key → PostgreSQLAs above
AttachmentClient → API (validated, section 8) → private storage under a random key; download via a link that expires within ten minutesUsers with access to the ticket
Email notificationAPI → Resend → recipient; a signed per-ticket reply address threads replies backResend sees recipient, subject, and message text
Push notificationAPI → Expo push service → Apple → devicePush token and notification text
AI suggestionAPI → Anthropic API → result stored with the ticketAnthropic sees the ticket text and your category, team, and article names
ExportAdministrator → API → streamed JSON or CSV; not stored; audit entry writtenThe administrator who requested it

The marketing website sets no cookies and uses no analytics trackers. The product uses no advertising or analytics trackers.

6. AI usage and data handling

Beacon uses AI for: triage on creation (suggested category, priority, team, duplicates, related articles, with confidence), suggested agent replies, ticket summaries for handoff, knowledge article drafts from resolved tickets, and natural-language reporting questions that are translated into a constrained query language, never raw SQL.

Crisis screening

Every ticket creation and every public comment is screened, whether AI is on or off. A conservative keyword screen runs inside the same transaction; when AI triage is on, the model is also asked for a safety assessment with explicit guidance to err toward flagging and to ignore IT vocabulary such as "dead battery". A flagged ticket is forced to urgent priority, tagged, and recorded with an internal event hidden from requesters. Every active administrator and owner is notified in-app and by email with a link to the ticket; the notification never includes the message text. The person who submitted it is shown crisis resources, by default the 911 and 988 Suicide & Crisis Lifeline text, which administrators can customize. Automations, AI, and system jobs cannot lower the priority of a flagged ticket; a person can, after review. Beacon is not a crisis service or a substitute for one.

7. Encryption and secrets

8. Input, uploads, and output

9. Logging and audit

Audit log

Each organization has its own audit log, protected by row-level security like every other tenant table, recording the actor, action, entity, a diff of the change, the source address, and the time. Recorded actions include: SSO configuration changes, role changes, user creation and disabling, API key creation and revocation, webhook and automation changes, organization settings, bulk ticket updates, data exports, deletions, and platform impersonation. Administrators see it in Admin → Audit and through the API. It is retained for the life of the organization. Ticket and asset histories are separate, user-visible timelines.

Application logs

Structured JSON logs carry a request id, user id, organization id, route, status, and latency. Request and response bodies are never logged. Authorization headers, cookies, platform keys, passwords, refresh and access tokens, client secrets, and challenge tokens are redacted at any depth, and download tokens are stripped from logged URLs. Technical logs are retained by the hosting provider for about seven days, never longer than 30.

10. Backups and recovery

11. Vulnerability management

12. Incident response

13. Student data: FERPA, COPPA, and state law

Beacon processes directory-type information (names, emails, sites, device assignments) and help desk content that may incidentally contain education records. Beacon is a data processor acting on the school's instructions; the school remains the controller of its data.

14. Subprocessors

ProviderPurposeLocationWhat it can see
Fly.io, Inc.Hosting for the API and the databaseUnited States (Virginia)All service data at rest and in transit, encrypted
Vercel, Inc.Hosting for the web app and the websiteUnited StatesRequest logs (IP address, pages requested); the web app stores no customer data on Vercel
Anthropic, PBCAI features (section 6)United StatesTicket text and organization category and article names when an AI feature runs
Resend, Inc. (on Amazon SES)Sending email notifications; receiving email-to-ticket messagesUnited StatesAddresses, subjects, and message text of email sent and received
Cloudflare, Inc.Domain registration and DNSUnited StatesDNS queries only
Apple Inc. and Google LLCMobile app distribution and push notificationsUnited StatesPush tokens and notification text
Expo (650 Industries, Inc.)Mobile app builds, updates, and push deliveryUnited StatesPush tokens and app diagnostic data

Each provider is bound by contract to use data only to provide its service to Beacon. The list is updated before a new subprocessor is added; District and Enterprise customers receive 30 days' notice by email with the right to object. Beacon does not share data with data brokers.

15. Retention and deletion

DataRetainedDeleted by
Tickets, comments, devices, articles, usersUntil your organization deletes them or closes its accountCascade on delete; an administrator's action
AttachmentsWith the ticket or comment they belong toThe file is deleted after the ticket deletion commits, then the record
UsersUntil disabled or deletedDisable immediately; hard delete on request, with tickets re-attributed to an anonymized placeholder to preserve the organization's records
Session refresh tokens30 days, or until rotation, sign-out, password change, or disableExpired tokens purged hourly
Audit logLife of the organizationWith the organization
Technical and security logsAbout seven days (the hosting provider's log retention), never more than 30Automatic
BackupsRolling, encrypted, 14 daysAutomatic; a deleted organization is gone from backups within 30 days
AI provider copiesUp to 30 days at the providerThe provider
Export bundlesNot storedStreamed to the requesting administrator
Organizations whose deletion is requestedMarked immediately; erased within 30 daysAn hourly retention job deletes attachment files, then every row; a deletion certificate is issued on request

Self-serve deletion: an owner deletes the organization from Settings → Danger Zone by typing its slug. Attachment files are deleted first, then the organization row, and every tenant table cascades, which also revokes every session and API key. After a paid plan is cancelled the organization stays on the free plan with its data intact, and data export remains available for 90 days; deletion happens only on an administrator's request.

16. What is not in place yet

17. Contact

Security questions and reports: security@beaconhelpdesk.com. Privacy requests: privacy@beaconhelpdesk.com. Anything else: hello@beaconhelpdesk.com.

SYV Technologies LLC
Saint Charles, Illinois, United States

Related documents: Privacy Policy · Terms of Service · Security overview.