# Limits

The actual numbers, so nobody has to guess.

## Money and time

| | |
|---|---|
| Website | Free, no time limit, no card |
| App with a database | $29 a month |
| Free trial on an app | 14 days, no card needed |
| A paused project is held for | 21 days, then permanently deleted |
| Reminders while paused | Email on day 7, 14 and 20 |
| Switching an app down to a free website | 7 days, live site stays up throughout |

## Space

| | |
|---|---|
| App files | 10 GB |
| App records (its database) | 5 GB |
| Website files | 2 GB |
| Memory and processing, app | 1.5 GB and 1.5 cores, plus 512 MB and 1 core for its database |
| Memory and processing, website | 512 MB and half a core |

**Nothing here needs asking for.** Those amounts are what a project has from the
day it is made — not a starting point somebody grows into by requesting more.
There is no form, no approval and no waiting.

You are told before it matters: Hatchik measures every project once a night and
emails the owner when one is around three-quarters full, and again when it is
nearly full. A project growing fast enough to fill within a week is told sooner
than that. Each of those is sent once, not nightly, and is sent again if the
project fills up a second time.

If a project does fill up, it carries on showing everything it already has but
can save nothing new, and `hatchik_diagnose` says so in as many words, with how
much room it is using — it does not leave you to work it out from a save that
failed. The first thing worth checking is what filled it: old uploads, or
something the app writes and never clears, are the usual answers.

Past those amounts there is more room available, and that part will be paid
for: a fixed monthly amount for a fixed amount of extra room, never metered and
never applied to anyone automatically. You would see the price and agree to it
on a Hatchik page first. Buying it is not switched on yet, and no price for it
is published anywhere until it is. Until then, a project that genuinely outgrows
its allowance has the room added for it, at no charge.

Being clear about how that happens, because it is the one place on Hatchik where
something is not automatic: the nightly measurement notices and reports it — it
emails you, and it tells Hatchik the same night — but it does not raise the
amount by itself. Somebody puts the extra room on the machine. There is nothing
for you to send and nowhere to send it; the alarm goes off on its own and you
will already have been told your project is filling up.

If an app exceeds its memory it is stopped and restarted, and `hatchik_diagnose`
names that as the cause.

## Publishing and importing

| | |
|---|---|
| One packaged publish | 100 MB |
| A publish written through the chat | 50 MB total, in pieces of up to 1 MB |
| Importing an existing website | 60 pages, 600 files, 250 MB, 80 MB per file, 45 seconds |

An import that runs out of pages, files, bytes or time still publishes what it
reached and names what it did not.

## Versions and downloads

| | |
|---|---|
| Saved versions you can go back to | The last 10 published versions |
| Stored files included in a version | While they total 250 MB or less |
| Download link validity | 24 hours, and you can ask for a fresh one any time |
| Logs you can read at once | The last 200 lines |

Once an app's stored files pass 250 MB, new versions hold its code and its
database only. Nothing announces that at the time; it is said when someone
restores such a version, which reports that the files uploaded since were left
as they are.

A download built while a project is paused contains the files but not the
database, because the database is switched off with the rest of the project.
The download says so in its own list of problems.

## Contact forms

| | |
|---|---|
| Submissions per visitor per project | 10 an hour, then turned away |
| Messages one site can be sent | 60 an hour, 200 a day |
| One submission | 20,000 characters across up to 40 fields, 5,000 per field |
| Submissions readable back at once | The most recent 200 |

The per-visitor limit counts every attempt, because a sender who is refused ten
times is still one sender making a nuisance of themselves. The whole-site
ceiling counts only the messages that actually reached you: junk Hatchik already
turned away — a robot tripping the hidden field, a post from somebody else's
page — never uses up your day. It is there to protect your own email allowance,
and only a delivered message spends any of that.

## Email your app sends

| | |
|---|---|
| How many you can send | Whatever your own email company's plan allows |
| What Hatchik charges for it | Nothing |
| The same message to the same person | 20 an hour, then held back |

The email goes out on your own account with your own email company, so the
allowance is theirs, not Hatchik's — Resend's free tier is 3,000 a month and
Brevo's is 300 a day. The one number Hatchik sets is the last row, and it is
there to catch an app stuck in a loop before it burns your whole free allowance
in ten minutes. Anything else to that person still goes out normally.

## Not limited at all

Visitors, page views, bandwidth, how often you publish, how many free websites
an account keeps, and how many custom domains a project has. None of these is
counted or billed anywhere.

Apps with a database are the one exception, and it is not a per-account limit:
Hatchik adds them a few at a time while apps are free. If it cannot take another
one at the moment it says so plainly, says a website is free and available now,
and says when to try again.

## Addresses

An app gets `dev.<name>.hatchik.com` for its draft and `<name>.hatchik.com` for
its live site. A free website has no permanent draft address: publishing to the
draft builds a locked preview on its own link, one at a time, which expires
after 24 hours. Like an app's draft, it opens from your project page and
shows a "this draft is private" page to anybody else. You can add as many of your own web addresses as you like, at no
extra cost, on either. HTTPS is included and renewed for you.

## Recovery

A recovery link works once and expires after an hour. You can request at most
five in an hour.

## What runs an app

One web container and one Postgres database per draft, and one of each per live
site. The database is reachable only from inside your own app — not from the
public internet, and not from your computer. Anything that touches the database
has to run inside the app, which is why migrations and seeding happen when the
app starts.
