Security

Your customer list is yours.

You are about to hand a piece of software your entire customer list, your job photos and your invoices. There is no salesperson here to reassure you, so here is exactly how that data is kept apart from every other business's — and how you can check rather than take our word for it.

Isolation is enforced by the database, not by our code

Most software keeps businesses apart in application code: every query is supposed to include "…and only this customer's rows". It works right up until one query forgets, and then one business sees another's data.

ToolHut does it a layer lower. Every table has row-level security switched on inside PostgreSQL itself, with a policy tying each row to the business that owns it. If our application code forgets the filter, the database still refuses. The check does not depend on us getting every query right.

87tables in the database
87with row-level security on
0without it

And a new table cannot ship without it

That has to stay true for the next table someone adds, too. So the database enforces the rule itself: whenever a table is created, row-level security is switched on automatically. Nobody has to remember.

What the 87 are

We test it, rather than assume it

A rule like this can look right and still not do anything, and that kind of mistake stays invisible until the day it matters. So we test it: the test creates two real businesses with two real signed-in users, puts data in each, and checks that

The last two matter as much as the first three — being able to read someone else's records and being able to write into them are different holes, and both are closed. The test runs against the real database as ordinary signed-in users rather than as an administrator, and it clears up after itself.

One honest limit, because it is the kind of thing this page should say out loud: that test covers the database tables your records live in. A database view — a saved query that reads from those tables — does not inherit that protection automatically in PostgreSQL; each one has to be restricted deliberately when it is created.

How you sign in

Two ways, and you pick: a password you set, or a one-time link we email you. The link works once and expires in an hour, so if you would rather not keep a password at all, you do not have to.

Either way, ToolHut never holds your password. Supabase, our sign-in provider, keeps it as a salted hash — never in plain text, and never anywhere we can read it. We cannot tell you what your password is, because we do not know it.

Crew logins work the same way. A crew member you invite sets their own password, because a shared jobsite phone can't always receive email. A crew login can see the day's jobs and the crew's own messages; it can never reach your money, your customers, or your records.

What we do not do

What we do store in your browser

Three things, and this is the complete list:

That is the whole list. Clearing your browser storage clears all three.

The one thing we count on our side

If ToolHut wrote to your business and you got here by clicking the link in that email, we record on our own server that the link was opened: an internal reference number for your business, which page opened, and when. That is the whole row — no name, no email address, no IP address, and nothing out of the browser storage above, which still never leaves your browser. It is how we tell whether our own letters are worth sending, and nothing else on this site is counted anywhere. The full description is in the Privacy Policy.

Who else sees anything

A page cannot load without the browser contacting whoever serves its pieces, and those companies see the request. Here is every one of them and what they get. There are no others.

WhoWhat they receiveWhy
SupabaseYour account data and your business's recordsThey host the database and sign-in. This is where your data lives.
Google FontsYour IP address and browser, when a page loadsServes the typefaces. No account data reaches them.
jsDelivrYour IP address and browser, when a page loadsServes the database client library. No account data reaches them.
CloudflareYour IP address and browser, on the pages where you sign in, sign up, or set a passwordRuns the check that tells a person apart from a bot, so nobody can hammer your account with guessed passwords. No account data reaches them, and it runs nowhere else on the site.
StripeYour card details, if and when you subscribeHandles payment. ToolHut never sees or stores your card number.
TwilioYour business's registration details (legal name, EIN, address, phone) and the text messages your customers send and receive — only if you use a texting packageCarries text messages. US carriers require a business to register before it can text, and that registration is filed with Twilio.
Google MapsA job's address — only if you tap itJob addresses on the crew and project pages are links that open in Maps. Nothing is sent unless you tap one.

We plan to serve the fonts and that library from our own servers, which would take two names off this list. Until that is done, the list stands as written.

Getting your data out, and getting it deleted

Both are built into the database and we run them on request. Here is what each one does.

The five things we keep, and why

Five records stay behind. Each one is there for a reason that protects you as much as us, and they hold your business identifier and little else about you:

Everything else goes: contacts, jobs, quotes, invoices, photos, calls and their transcripts, crew records, compliance documents, bookings, your settings, and the account you sign in with.

Both of those are functions in the database that we run on request, not a promise somebody has to remember to keep. See the Privacy Policy for retention periods and the legal detail, and the Terms of Service for the contractual side.

What we cannot claim yet

So that nothing above reads as more than it is:

Found a problem?

Email office@toolhutworks.com with what you found and how to reproduce it. A person will read it, usually the one who wrote the code. We will confirm what you found, fix it, and let you know when it is done.

The numbers on this page were measured against the live database on August 10, 2026. When they change, this page changes.