Overview
Wethr is built on a fully managed, serverless infrastructure stack. There are no servers for us to patch, no operating systems to maintain, and no hardware to secure. Every component is a managed service from a provider with its own security certifications and SLAs.
This document explains how each layer of the stack is secured, how church data is isolated from other churches, how access is controlled, and what happens when something goes wrong. We publish this so your church's leadership can make an informed decision about trusting Wethr with your congregation's data.
Wethr secures the platform and the infrastructure beneath it. Your church is responsible for managing who has access to your Wethr account, keeping credentials secure, and using the permission system appropriately. Both sides of that contract matter.
Infrastructure
Wethr runs on a fully serverless stack, distributed across industry-leading managed providers. Each provider is responsible for the physical and network security of the underlying hardware. Wethr is responsible for how we configure and use those services.
| Provider | Role | Security posture |
|---|---|---|
| Vercel App | Hosts the Next.js application, API routes, and edge middleware | SOC 2 Type II certified. DDoS protection at the edge. Automatic HTTPS enforcement. Isolated deployment environments per branch. |
| Supabase DB + Auth | PostgreSQL database, authentication service, and realtime layer | SOC 2 Type II certified. Data hosted on AWS us-east-1. Encryption at rest (AES-256). Row Level Security enforced at the Postgres level. MFA on all Supabase dashboard access. |
| Cloudflare R2 Files | Stores all user-uploaded files — PDFs, images, documents, audio | Cloudflare's global network with DDoS mitigation. Files are never publicly accessible — all access is via time-limited presigned URLs generated by the Wethr API. Zero direct public bucket access. |
| Inngest Jobs | Background job processing for notifications, reminders, and scheduled tasks | Event payloads are encrypted in transit. Job execution is scoped per church. Failure states are logged and alertable. |
All infrastructure is hosted in US-based data centers. Data does not leave US jurisdiction under normal operation.
Data Isolation
Every church in Wethr is a completely isolated tenant. One church can never access another church's data — not through the application, and not through the database. This isolation is enforced at two independent layers.
Layer 1 — Application (tRPC middleware)
Every authenticated request resolves the caller's church_id from their verified session JWT — never from user input. All API procedures receive this church_id from the request context and inject it as an explicit filter into every database query. It is architecturally impossible for a user with a valid session for Church A to query Church B's data — the wrong church_id would return no results.
Layer 2 — Database (Row Level Security)
Supabase Row Level Security (RLS) policies are enabled on every table in the Wethr database. RLS enforces church_id scoping at the PostgreSQL level. Even if a bug in the application layer were to omit a church_id filter, the database would return only records matching the authenticated user's church. The application layer is the primary enforcement point; RLS is the backstop.
The application layer and RLS enforce isolation independently. Both would need to fail simultaneously for a cross-church data leak to occur. This defense-in-depth approach means a single bug cannot breach tenant isolation.
Subdomain isolation
Every church accesses Wethr via their own subdomain — for example, gracechurch.wethr.co. Vercel Edge Middleware intercepts every request before it reaches the application and resolves the subdomain to a specific church context. A valid session for Church A cannot be used to authenticate at Church B's subdomain — the session is rejected and the user is shown Church B's login screen.
Encryption
All data in Wethr is protected by encryption at every stage — in transit between the browser and our servers, and at rest in our database and file storage.
| Context | Standard | Details |
|---|---|---|
| Data in transit | TLS 1.2+ | All traffic between the browser and Wethr is encrypted via HTTPS. TLS 1.0 and 1.1 are disabled. HTTP requests are redirected to HTTPS automatically. Valid SSL certificates are managed and auto-renewed by Vercel and Cloudflare. |
| Database at rest | AES-256 | The PostgreSQL database hosted on Supabase (AWS us-east-1) encrypts all data at rest using AES-256. This includes all church, member, schedule, and communication data. |
| File storage at rest | AES-256 | Files stored in Cloudflare R2 are encrypted at rest. Uploaded files are stored in a private bucket and are only accessible via time-limited presigned URLs — not through any public URL. |
| Authentication tokens | JWT + RS256 | Session tokens are signed JWTs using RS256 (asymmetric signing). Tokens are short-lived and scoped to a specific church. Token verification does not require a database lookup on every request. |
| Passwords | N/A — passwordless | Wethr uses a passwordless OTP authentication model. There are no stored passwords to compromise. Authentication codes are single-use and expire after 24 hours. |
Authentication
Wethr uses a passwordless, email-based OTP (one-time passcode) authentication model. There are no passwords stored anywhere in our system — which eliminates an entire category of credential-based attacks.
Wethr's authentication layer is built on Supabase Auth, which is purpose-built for secure, production-grade authentication. It handles OTP generation, token signing, and session management — we don't implement these primitives ourselves.
Access Control
Wethr uses a five-tier role-based access control (RBAC) model. Every user is assigned one or more roles, and every API endpoint enforces the minimum role required to access it. Role resolution happens fresh on every request — there is no stale permission state cached in a JWT.
Enforcement
Role enforcement is implemented at the tRPC API layer using procedure middleware. Every API endpoint is annotated with its minimum required role. If a user's resolved role does not meet the requirement, the endpoint returns an UNAUTHORIZED error before any business logic executes. Role changes take effect immediately on the user's next request — no re-login required.
Ministry Leaders are not just role-restricted — they are team-scoped. A leader can only manage the specific teams they have been assigned to. If they attempt to access another team via the API, a secondary check returns a FORBIDDEN error regardless of their role level.
File Storage
User-uploaded files — PDFs, images, documents, chord charts, and audio — are stored in Cloudflare R2. The bucket is fully private. No file is ever accessible via a direct public URL.
Access pattern
All file access (both upload and download) uses short-lived presigned URLs generated by the Wethr API:
| Step | Who | What happens |
|---|---|---|
| 1. Request URL | Browser → Wethr API | The client requests an upload or download URL. The API validates the user's role and church membership before proceeding. |
| 2. Generate presigned URL | Wethr API → Cloudflare R2 | A time-limited (15-minute) presigned URL is generated server-side and returned to the client. The URL is scoped to a specific file key. |
| 3. Transfer directly | Browser → Cloudflare R2 | The client uploads or downloads directly to/from R2. File data never passes through Wethr's application servers, reducing exposure. |
Files are organized in a per-church bucket structure. The Wethr API validates church membership and role before generating any presigned URL — ensuring that users can only access files belonging to their own church and within their permission scope.
Backups & Recovery
Wethr's database is backed up automatically on a continuous basis. Our recovery capabilities ensure that data loss from any incident can be minimized and resolved quickly.
| Capability | Specification |
|---|---|
| Daily automated backups | The production Supabase database is backed up daily with a 7-day retention window. Backups are stored in a separate AWS region from the primary database. |
| Point-in-time recovery (PITR) | PITR is enabled on the production database, allowing restoration to any second within the retention window. This protects against accidental data deletion or corruption. |
| Staging environment | A fully separate staging environment mirrors the production configuration. Migrations and changes are validated in staging before reaching production. |
| Migration process | Database schema changes are versioned via Prisma Migrate. Production migrations are applied manually by an engineer before deploying the corresponding application code, ensuring schema and application are always in sync. |
| File storage durability | Cloudflare R2 provides 99.999999999% (11 nines) object durability through redundant storage across multiple locations. |
Backup infrastructure protects against infrastructure-level failures. For your own peace of mind, church admins can export a full copy of their directory, service history, and team data from Wethr's admin settings at any time — no request required.
Wethr Team Access
We take a strict minimum-access approach to our own team's access to customer data.
| Policy | Details |
|---|---|
| Need-to-know only | Wethr engineers and support staff can access customer data only when explicitly required to resolve a support issue, and only when that access has been requested or approved by the church's account administrator. |
| MFA required | All Wethr team members with access to production systems are required to use multi-factor authentication on all accounts (Supabase dashboard, Vercel, Cloudflare, and internal tools). |
| No production access for non-engineers | Access to production infrastructure is limited to engineers. Support and customer-facing staff interact with a separate admin tooling layer that does not have direct database access. |
| Access logging | All access to production systems is logged. Logs are retained for 90 days and reviewed periodically for anomalous activity. |
| No third-party data sharing | Wethr does not share church or member data with any third party except as required to operate the service (email delivery, SMS delivery, payment processing) — all of which are governed by data processing agreements. |
Incident Response
We maintain a documented incident response process. When a security incident is detected — whether by our monitoring systems, a third-party report, or internal discovery — we follow a structured response protocol.
For incidents originating from our infrastructure providers (Supabase, Vercel, Cloudflare), we will communicate the provider's status and our own impact assessment to affected churches. Provider status pages are publicly accessible and we will reference them directly in communications.
Responsible Disclosure
We welcome security researchers and community members who identify potential vulnerabilities in Wethr. If you believe you've found a security issue, please report it to us before disclosing it publicly — we will work with you to investigate and resolve it promptly.
We do not take legal action against researchers who act in good faith, follow responsible disclosure practices, and do not access, modify, or exfiltrate customer data in the course of their research.
Your Role in Security
Platform security is a partnership. Wethr secures the infrastructure — but your church's administrators play an essential role in protecting your account from the inside.
| Your responsibility | Why it matters |
|---|---|
| Keep OTP codes private | Login codes are single-use and sent to individual email addresses. Never share a code with another person — treat it like a password. |
| Use a secure email account | Since Wethr sends login codes by email, the security of your Wethr account depends on the security of the email address it's linked to. Use strong passwords and MFA on your email provider. |
| Assign roles carefully | Grant the minimum role necessary. Not every staff member needs Super Admin access — use Staff/Admin, Leader, or Volunteer roles where appropriate. |
| Deactivate departing users promptly | When a volunteer, leader, or staff member leaves your church, deactivate their Wethr account immediately from Settings > Users. Deactivation takes effect on the next request — there is no delay. |
| Review active users periodically | Review your user list at least once a year to ensure that everyone with access still needs it. Remove accounts that are no longer in use. |
| Report suspicious activity | If you notice unexpected logins, unusual data changes, or anything that looks wrong, contact us immediately at security@wethr.co. |
If your church has specific security requirements, compliance questions, or needs a security review before adopting Wethr, reach out to security@wethr.co. We are happy to answer detailed questions and work with your leadership team directly.