PantryPOS ← Back to site

Security overview

Last reviewed 22 August 2026

A pantry’s client list is a list of people who needed help. Leaking it does real harm to people who are already having a hard year. This page describes what we actually do about that — and, at the end, what we do not yet claim.

Contents

  1. Isolation between organizations
  2. Authentication
  3. Access control inside your pantry
  4. Encryption and transport
  5. Logging without leaking
  6. Backups and recovery
  7. Application security
  8. Operational practice
  9. Reporting a vulnerability
  10. What we do not claim

1. Isolation between organizations

PantryPOS is multi-tenant: many pantries share one system. The usual way to keep them apart is to remember to add WHERE org_id = ? to every query. That works right up until the one query where somebody forgets.

We do it in the database instead. Every table holding tenant data has PostgreSQL row-level security switched on, with FORCE ROW LEVEL SECURITY, and a policy that compares each row’s organization against the organization pinned to the current connection. Each API request pins exactly one connection to the signed-in user’s organization for the life of that request, and releases it when the response finishes.

The practical effect: a query that forgets its filter returns nothing, rather than returning another pantry’s clients. The database refuses, not the application.

Isolation is verified by an explicit test suite that attempts cross-tenant reads and writes and requires every one of them to fail.

2. Authentication

Why a PIN and not a password? Because a check-in desk with a queue of people will write a password on a sticky note, and share it. A short PIN that each volunteer can actually type between guests, backed by lockout and rate limiting, produces a more honest audit trail than a strong password nobody uses individually. With a 5-attempt lockout and a 15-minute cooldown, guessing a 6-digit PIN takes on the order of weeks per account — before the per-IP limit is counted.

3. Access control inside your pantry

Staff hold one of two roles. Administrative surfaces — user management, settings, API keys, bulk client export, network export, custom reports — are gated server-side on the administrator role, not merely hidden in the interface. A volunteer at the check-in desk cannot bulk-export your client list by guessing a URL.

In a multi-site organization, staff can be scoped to their own location while directors see the whole network.

4. Encryption and transport

5. Logging without leaking

An audit log is only worth having if it does not become a second, less protected copy of the data it is supposed to protect.

6. Backups and recovery

Why the drill checks isolation, not just row counts. A restore that brings all the records back but loses the row-level security policies would look like a complete success and would be a breach: every organization would be able to read every other one. Counting rows would not catch it. The drill fails if the policies do not come back, and it has been tested against a deliberately corrupted backup to confirm it actually fails rather than only ever passing.

Recovery position, in plain numbers. Backups run nightly, so the most we would lose is up to 24 hours of changes. Restoring the database takes minutes. Rebuilding a whole server from an off-site image would take an hour or more, and we will say plainly that the image path has never been rehearsed — the database path, which is the one that holds your records, is the one we test.

7. Application security

8. Operational practice

9. Reporting a vulnerability

Email dale.weaver@0xpi.com with enough detail to reproduce the issue. We will acknowledge within two business days.

We will not pursue legal action for good-faith research that stops at demonstrating the problem, does not access or modify other organizations’ data, does not degrade the service for pantries, and gives us a reasonable chance to fix it before publication. Please do not test against a live pantry account that is not yours — ask us and we will provide one.

10. What we do not claim

Security pages are usually a list of everything that sounds reassuring. Here is the other half.

If any of these is a blocker for your organization, say so — several are on our roadmap, and knowing which one you need moves it up.