Privacy Policy

How HAMANI MAIL handles your mail and your personal information.

HAMANI PTY LTD · ACN 696 864 981 · ABN 48 696 864 981 · Sydney, New South Wales, Australia. Effective 1 August 2026 · Version 1.0.

Every factual statement below about what the software does was checked against the source code; if the code changes, this policy changes with it. It describes what we do, and it is not a compliance certification.

In one paragraph

HAMANI MAIL hosts business email on your own domain. To do that we receive, store and serve your mail. Your mail is yours. We store it in Sydney, Australia. We do not read it, sell it, mine it, or use it to train anything. We do not hold you hostage: there is no lock-in, and you are never locked out of your own mailbox — not for a late invoice, not ever.


1. Who this covers

This policy covers the HAMANI MAIL hosting service: mailboxes on your domain that send and receive mail, and the webmail you read them in.

Two different sets of people appear in the data:

Sending mail through the HAMANI Email API (bulk, transactional and marketing sends) is governed by the same principles; the specific Australian Spam Act obligations that attach to *sending* are set out in docs/AU-LEGAL.md.

2. What we store, exactly

Nothing in this list is aspirational — each item is a thing the software actually writes.

Your mail

WhatWhereNotes
Raw message (MIME) of every email receivedAmazon S3, Sydney (hamani-email-mailboxes-730558614323, prefix inbound/)Written directly by Amazon SES when the mail arrives. This is the complete original message, headers and all.
Message bodies (plain text and/or HTML)Amazon S3, SydneyExtracted from the raw message when we parse it, so webmail can show it to you.
AttachmentsAmazon S3, SydneyStored as separate objects; filenames are sanitised.
Message index — mailbox address, message id, conversation (thread) id, folder, read/unread, sender address and display name, recipient addresses, subject line, a 200-character preview of the body, the time received, the spam score and Amazon SES's spam/virus/SPF/DKIM/DMARC verdicts, the storage keys for the bodies, and attachment names/types/sizesAmazon DynamoDB, Sydney (hamani-email-engine)This is what makes the message list load fast. Note that the subject and the preview are content, and we say so rather than calling this "metadata only".
Copies of mail you send from webmailS3 (body) + DynamoDB (index), SydneyWhen you compose or reply in webmail we keep a copy in your Sent folder, exactly as any mail client does.

Mail you send through the sending API

Mail sent through the API (not from webmail) is not stored. The message body exists only in memory for the moment it takes to hand it to Amazon SES, and is never written to durable storage. What we keep is a log record of the send: message id, event type (accepted, delivered, bounced, complained…), a timestamp, and a short detail string. No body, no subject, no template data.

Everything else

WhatWhereNotes
Mailbox accountsDynamoDB, SydneyThe mailbox address, its domain, the account that owns it, a display name, aliases, mailbox status, quota and bytes used, an optional signature, and optional auto-reply settings (subject, message and dates).
Mailbox passwordsDynamoDB, SydneyStored as a scrypt hash with a random 16-byte salt unique to each mailbox, compared in constant time. scrypt is deliberately memory-hard, so a stolen hash is expensive to attack. We never store, log or return your password itself — the plaintext exists only for the instant it takes to check or set it. If you forget it, we cannot tell you what it was; it is reset.
API keysDynamoDB, SydneyWe store a SHA-256 hash of the key's secret, never the secret itself. The key is shown to you once, at creation. If you lose it, we cannot recover it — you issue a new one.
Suppression list (addresses that bounced, complained or unsubscribed)DynamoDB, SydneyStored as a one-way SHA-256 hash of the address plus the reason and the date. We match against the hash; the address itself is not recoverable from it.
Usage countersDynamoDB, SydneyA per-account, per-calendar-month count of accepted sends. A number — no recipients, no content.
Billing linkDynamoDB, SydneyYour account id and your Stripe customer id. Card details never reach HAMANI — Stripe holds them. We report usage counts to Stripe; we do not see or store a card number.
Your domainsDynamoDB, SydneyDomain name, owner, the DKIM tokens SES issued, verification status, and the result of the last DNS check we ran.
Operational logsAmazon CloudWatch, SydneyIds, counters, states and timings only. A recipient address appears only as a truncated one-way SHA-256 tag, never in the clear. No message body, subject or template data is ever written to a log — this is an absolute rule in our codebase (CONSTITUTION.md §3) and it is enforced by tests.

Sign-in security data (two-factor, recovery, sessions)

These are live: signing in creates a session, and you can enrol two-factor authentication and set a recovery address from your security settings. Here is exactly what each one stores.

WhatWhereNotes
Two-factor (TOTP) secretDynamoDB, SydneyThe shared secret your authenticator app holds. It is stored as-is, because verifying a six-digit code requires re-computing it — a one-way hash is mathematically not an option here, and we would rather say that than imply a protection we do not have. It leaves storage exactly once, when you enrol, so you can scan or type it. It is never logged, never returned by a status check, and never included in any other response.
Two-factor backup codesDynamoDB, SydneyStored as scrypt hashes, through the identical code path as mailbox passwords. The codes themselves are shown to you once, at activation, and are then unrecoverable by us. Each is single-use.
Recovery addressDynamoDB, SydneyThe other mailbox you nominate for account recovery. Stored in full, because we have to be able to send to it. When you read it back we show it masked (h••••@example.com) — enough to recognise which address you chose, never enough to learn one you did not already know. In logs it appears only as a one-way hash tag, never in the clear.
Recovery codesDynamoDB, SydneyA 256-bit random code, stored as a scrypt hash, single-use, and time-limited. The code itself exists only on its way to your recovery address; it is never logged.
Login sessionsDynamoDB, SydneyA session id, a SHA-256 hash of the session secret (never the secret), the times the session was created and last used, its expiry, and two device fingerprints described below.

Device fingerprints — what they are and, more importantly, what they are not. When you sign in we want to be able to tell you "this is a device we have not seen on this mailbox before". To do that without keeping the things that identify you:

What we do not collect

We do not run trackers, advertising pixels or analytics on the contents of your mail. We do not build a profile of you. Beyond the mailbox account above — an address, a display name and a password hash — we hold no personal profile of you: no date of birth, no address, no marketing attributes. At the account level we know an opaque owner id and the domains you verified.

3. Where it lives

Everything above is in AWS's Sydney region (ap-southeast-2): the mail storage, the message index, the send queue, the logs, and Amazon SES itself. Australian mail, hosted in Australia.

Two qualifications:

If we ever configure a service outside Australia (for example a second sending region for failover), we will update this policy before doing it.

4. How it is protected

Exactly what is configured today — no more:

Attachment scanning — what it does, and what leaves

The local layer below runs on your inbound mail today, in addition to Amazon SES's own spam and virus scan. The optional third-party engine is a slot that is not configured — see the second bullet.

There are two layers, and they are deliberately told apart:

The verdict rule. A result is one of three things: clean, infected, or unscanned. unscanned exists because the failure that actually infects someone is a system reporting "clean" when nothing looked. With no engine configured, an attachment the local checks did not refuse comes back unscanned, never clean — and the same is true if a configured engine is slow, unreachable, or returns something we cannot read, or if the file is over the size ceiling (10 MB by default), in which case it is not sent to the engine at all. Local checks are not antivirus and this document will never call them that.

Automated spam and phishing classification, and the AI tier

The offline classifier below runs on your inbound mail today and sends nothing anywhere. The AI tier is off unless an Anthropic API key is configured — and by default no key is set, so nothing about your mail leaves our systems. This section describes exactly what the AI tier *would* send if it were ever switched on, so the cost is on the record before that decision.

Again two layers:

Exactly what is sent to the Anthropic API when that tier is on. This is the complete list; there is nothing else in the payload:

FieldWhat it is
subjectYour message's subject line, verbatim, up to 300 characters.
fromThe sender's display name (to 200 characters) and email address (to 200).
replyToThe Reply-To address, if the message had one.
linkHostsHostnames only — up to 25 — from the links in the message. Never full URLs. The path and query of a link are where a per-recipient tracking token lives, and a tracking token identifies the reader, so it never leaves.
localFindingsUp to 12 of the offline classifier's own findings, in words. These quote evidence from the message — the matched phrase, a link's visible text, the sender's display name — so they are message content too, and we are not going to pretend they are only "rule names".
bodyExcerptA bounded plain-text excerpt of the message body, 2,000 characters by default, with every URL inside it reduced to [link:hostname]. Setting the limit to 0 sends no body at all.

Say the cost out loud. That excerpt *is* your correspondent's message content, sent to a third party outside Australia. Reducing URLs to hostnames does not change that: whatever else was written in the first 2,000 characters — names, figures, addresses — goes with it. That is why the tier is off unless a key is deliberately set, why the limit is settable to zero, and why a private mailbox (§4A) is never classified at all. If HAMANI ever enables this tier, this policy and docs/AU-LEGAL-HOSTING.md §4 must be updated first, because sending message content to a US-based API is a cross-border disclosure question, not a configuration change.

No message is ever failed by a classifier. If the AI call times out, errors, is refused, is cut off, or returns something that does not match the required shape, the offline verdict is used instead and it says so in its own reasons. The model is also never allowed to invent a suspicious link: only links genuinely present in the message survive into the result.

And what is not true, stated plainly:

4A. The zero-knowledge private mailbox — optional, and irreversible

Numbered 4A rather than 5 so that every existing cross-reference in this document and in docs/TERMS.md still points where it did.

A mailbox can be put on a private tier. This is off by default, it is opted into per mailbox, and you must acknowledge the consequences below before it can be turned on — the software refuses the request otherwise.

What it does

What it costs you — read this before opting in

These are consequences, not caveats. They are the price of the guarantee, and they are shown to you by the software itself before you can turn it on:

The limitation we will not soften

Mail arrives from the internet in plaintext. That is how email works: the sending server hands the message to Amazon SES, SES hands it to our engine, and our engine must hold the message in memory in order to encrypt it. So for the instant between arrival and encryption, your message exists unencrypted on our infrastructure.

What the private tier buys is everything after that instant: nothing readable is written to disk, nothing is searchable, nothing is readable by an operator, a backup, a database breach, or a subpoena served on us. That is a real and large difference from a provider that stores mail it can read. But it is not "your message never touches our servers unencrypted", we will never say that, and any provider that offers zero-knowledge mail over ordinary email has this same property whether or not they mention it.

5. How long we keep it

DataRetention
Your mail (raw message, bodies, attachments, index)Kept indefinitely, until deleted. There is no automatic expiry. Your inbox is not a product that silently throws mail away. See the warning below.
Suppression listKept indefinitely — it is what stops us mailing someone who bounced or unsubscribed.
Usage countersKept indefinitely as billing history.
API keysUntil you revoke them. Keys do not expire on their own.
Send idempotency and rate-limit records24 hours (DURABLE_RECORD_TTL_SECONDS, default 86,400 seconds).
Monthly fair-use counter35 days.
Failed sends parked in the dead-letter queue14 days.
Operational logsNo retention limit is configured today, so logs are kept until we set one. They contain metadata only (see §2).

Read this before you rely on "Trash". Moving a message to Trash moves it, it does not delete it — the message stays in our storage until the mailbox is deleted. Deleting a mailbox (from your admin console) is a real, permanent erasure: it walks every message in that mailbox, deletes its stored bodies and attachments from S3, and then removes the mailbox account — so recreating the same address later starts empty and inherits nothing. That erasure cannot be undone. What is still outstanding is a per-message permanent-delete and an automatic erase-on-account-closure sweep; both are tracked in docs/AU-LEGAL-HOSTING.md §5. Retaining rather than auto-deleting is the deliberate safe default (an accidental delete must never destroy your correspondence), and deleting the mailbox is the deliberate way to erase.

6. Who can access your mail, and when

If we are compelled by a valid Australian legal process to disclose data, we will comply with the law, and we will tell you unless we are legally prohibited from doing so.

On the last two points: the technical guarantee here is that access requires production credentials and a signed request. The rest is a policy commitment by a small Australian business — a promise backed by our word and our contract, not by a control that makes it impossible. Treat it as what it is.

The one place that is different. For a mailbox on the zero-knowledge private tier (§4A), the third bullet above does not apply to the stored contents of that mailbox: we hold ciphertext and no key, so "HAMANI personnel, technically" is not true of it. We can still see that the mailbox exists, who sent to it and when, and how large the messages are — that routing information is what the internet used to deliver the mail and we cannot encrypt it away. If we are compelled to disclose data from a private-tier mailbox, we can hand over what we hold, and what we hold is unreadable to us and to whoever receives it.

7. Your data is yours

8. Access, correction and complaints

This policy is deliberately written to describe what we do and to offer access, correction and a complaint pathway as commitments, so it holds regardless of how any small-business threshold under the Privacy Act 1988 (Cth) applies to us.

9. Data breaches

If personal information we hold is accessed, disclosed or lost without authorisation, we will assess what happened promptly, contain it, and tell the people affected where the breach is likely to cause them serious harm. Where the Notifiable Data Breaches scheme in Part IIIC of the Privacy Act 1988 (Cth) applies to us, we will also notify the Australian Information Commissioner as that scheme requires.

10. Changes to this policy

We will keep this current. If we change something that materially affects your data — where it is stored, how long we keep it, who can see it — we will tell customers before the change takes effect, not after. If we ever configure an overseas attachment-scanning engine, or switch on the AI classification tier (which would send bounded message content to an API outside Australia), we will update §4 to name it before the first message is sent, because that is a cross-border disclosure decision, not a configuration change.


_HAMANI PTY LTD · ACN 696 864 981 · ABN 48 696 864 981 · Sydney, New South Wales, Australia. © 2026 HAMANI PTY LTD. HAMANI MAIL Privacy Policy, version 1.0, effective 1 August 2026. Privacy contact: [email protected]._