The wall, and where it ends.
Three pages on this site have pointed at a perimeter posture that never existed on its own. This is that page: what is already in the way, what it does not stop, and the honest boundary where a code change takes over.
"Attack" means four different things
Each one is stopped, or not stopped, differently — treating them as one thing hides that.
A volumetric flood
- Looks like
- A sudden spike of requests aimed at knocking the site offline, not at reading it.
- Stopped here
- Absorbed at the edge network, before it reaches a static site's storage or a dedicated instance.
- Costs you
- Nothing — this is included on every plan, not an upsell.
Bots and scrapers
- Looks like
- Something pulling every page on the site as fast as it can, over and over.
- Stopped here
- Nowhere, by default. The edge network serves the requests; nothing here tells a script from a browser.
- Costs you
- Possibly your fair-use transfer allowance — see what junk traffic does to the bill below. Pattern-based filtering is real work we can build; see the honest limits below.
Form and comment spam
- Looks like
- Automated submissions through a public form, aimed at a mailbox or a database rather than the network.
- Stopped here
- Depends on the form. This site's own quote form is the worked example below — see the honest limits for what a form without the same defences is exposed to.
- Costs you
- Nothing to the invoice, but time reading junk if the form has no defences of its own.
Password guessing
- Looks like
- Repeated login attempts against an account, aimed at getting in rather than knocking anything down.
- Stopped here
- Nowhere at the edge — a static site has no login to try. On a dedicated instance, this is your application's own job.
- Costs you
- Nothing on the invoice. We cannot stop someone who already has valid credentials — see Access for that half of the picture.
What is already in the way
Every request meets these layers in order, before your own code ever sees it. What each one does not stop matters as much as what it does.
| Layer | Stops | Does not stop | Who |
|---|---|---|---|
| The edge network | A volumetric flood aimed at the network itself — always on, for every site, included in every plan. | A request that looks legitimate at the network level, however it behaves once it lands on a page. | CustomHosted |
| TLS-only | Plain, unencrypted traffic — a request over plain http:// is redirected to https:// and never served in the clear. | Anything about what the encrypted request actually asks for. | CustomHosted |
| The private origin | A request that tries to reach a static site's storage directly — it isn't reachable at all except through the edge network. | A request that goes through the edge network the normal way, the same as any real visitor. | CustomHosted |
| The instance firewall | A connection to any port a dedicated instance's app doesn't actually use. | A request to the port the app does use — that traffic is exactly what the firewall lets through. | CustomHosted |
| The app itself | Whatever your own code checks for — a login limit, an input check, a rule you've built. | Anything the app doesn't check for. This is the one layer nobody here can read or write for you without a briefed change. | You |
A static site has almost nothing to attack
No server-side code, no database, no admin login, no plugin — the surface only grows as real code and a real database enter the picture.
| Can try to | Static site | Dedicated | Dedicated + database |
|---|---|---|---|
| Exploit server-side code | Nothing to exploit — there is no server-side code. | Your application's own code is the surface. | Your application's own code is the surface. |
| Reach a database | No database exists. | No database exists. | Only through your application — the database itself is not reachable directly. |
| Log in as an admin | No login exists. | Only if your app has one — its guessing defences are your app's job. | Only if your app has one — its guessing defences are your app's job. |
| Exploit a plugin or module | Nothing installed to exploit. | Only what your own dependency list actually includes. | Only what your own dependency list actually includes. |
Junk traffic and your bill
A flat rate and a published fair-use allowance leave one question unanswered everywhere else on this site. Here it is, answered.
A traffic spike
The rate is flat, up to the fair-use allowance set out below.
Junk traffic counts the same as real traffic
A bot or scraper pulling every page repeatedly uses the same transfer allowance a real visitor would. Nothing on the platform tells the two apart before they hit the allowance.
Nobody is billed without a conversation first
If usage sits near or above the allowance, we reach out through the quote channel before anything on the account changes — the same sequence for a viral post or a scraper, whichever it turns out to be.
See Billing for the allowances in full and the invoice they sit on.
This site's own quote form, as the example
Every row below is backed by a real file in this repository, not a claim without a receipt.
POST only
Any other request method is refused outright.
A browser on another site can't post to it
A form on someone else's page cannot submit through this endpoint from a visitor's browser. A script that is not a browser is not stopped by this one — the checks below are what handle that.
A hidden field a human never sees
A field real visitors never fill in. A submission that fills it gets a cheerful "sent" response while nothing is actually sent.
Every field capped in length
A name, an email address, and a message all have a hard length limit, so a multi-megabyte message is not a thing.
A real address, checked
The email address has to look like an address or the request is refused.
Request logs kept 90 days
Every request to the form is logged for 90 days, not kept forever and not thrown away immediately.
When it is actually happening
The watch list on Monitoring carries no attack signal of its own — the sequence below starts at reachability and error rate, the same ladder, not a second one invented for this page.
- 1
Auto-handled
A known, safe failure with an established fix — a crashed process, a failed health check, a stuck deploy. Restart, retry, or redeploy the last known-good version, done automatically
No one, unless it recurs — it goes in the log, not a message to you
- 2
You hear from us
Something that touched the app and needs a person to pick the right response, not just a retry. A human looks at it and decides what to do — revert, restore, or a fix in code
You, in writing, on the same quote channel as everything else — business hours for anything that isn’t urgent
- 3
Outage handling
The site or a core function is down, or badly degraded, for real users. Worked ahead of the routine queue
You, as soon as there is something to say, with priority handling; out-of-hours response is best effort, not a staffed round-the-clock desk
The honest limits
Not buried in a footnote — the same discipline as every other honesty band on this site.
No web-application firewall or rate limiting as standard
A standard plan checks the rules on this page and nothing more. Filtering traffic by pattern or capping request rates is a real thing we can build — just not something included by default. See Delivery for the full rule set this page's standard plan checks.
Not a 24/7 operations centre
The automated watching above runs continuously. The humans behind an escalation work business hours, with priority handling on a real outage — see Monitoring for the full ladder.
We don't fix your app's own security holes for free
A real vulnerability in your own code is a briefed change, or a piece of CustomLabs work for something too big for one pull request — not something patched silently on your behalf.
No certification to hand you
No SOC 2 report, no ISO 27001 certificate, no PCI scope. If your work needs one of these, you need to know that now.
We cannot stop someone who already has your credentials
A perimeter is a wall around the outside. A leaked password or key gets in the front door — see Access for who holds a key and how one is revoked.
Pattern-based filtering, geo-blocking, and rate limits are real work, not a default
Blocking traffic by pattern, by country, or by request rate is something we can build — quoted flat, the same as any other custom infrastructure request, not something switched on by asking.
Where the perimeter ends, and the loop starts
The perimeter is a wall around code it cannot read. Anything that needs the code itself to change is a briefed change, not a perimeter problem.
A scraped endpoint needs a cap
A specific page or API is getting pulled too fast — the fix is a rate limit or a check written into that endpoint.
A form needs a stricter check
Spam is getting through — the fix is a stronger check written into that form, the same shape as the one on this site's own quote form above.
A dependency has a published vulnerability
One of your application's own dependencies is flagged — see Patching for how a routine scan finds this and triages it as application-level.
A key or credential has leaked
A secret is out — the fix is rotating it and changing how it's handled, both application-level changes.
Every one of those four ships the same way — Agentic iteration — CodeHerder ($25/mo):
- 1
A routine scan flags a dependency
The same kind of check that watches the infrastructure layers above, run against your application’s own dependency list.
- 2
It's triaged as application-level, not infrastructure
A library your own code imports isn't ours to patch silently — it can change how the app behaves.
- 3
Briefed as a change
Written up the same way any other change request is — this is what the Agentic iteration — CodeHerder add-on covers.
- 4
An agent opens the pull request
The upgrade lands as a real pull request against the repository, with the test suite run against it.
- 5
A human reviews and merges
Someone reads the diff before it goes anywhere near production — nothing here is auto-applied blind.
- 6
It ships through the same pipeline
The same pipeline that deploys everything else on your stack ships this too — no separate process to babysit.
- 7
You're told it's done
A note confirming what changed and that it merged, in the same shape as every other note on this site.
A hole too big for one pull request is scoped as its own piece of work by CustomLabs — see The Loop for the full build-iterate-run picture.
Reporting a hole
The same channel, whether you're a customer or someone who just found something.
One channel in
The quote form is the only channel in for a security report, for a customer or an outside researcher alike.
What happens with a report
A human reads it, triages it the same way any other incident is triaged, and tells you what happens next.
What we will not do
No bounty is paid, and a good-faith report is never met with a legal threat.
A machine-readable pointer
This policy is also published at /.well-known/security.txt, the standard address a researcher or a scanner checks first.
Full binding text: Acceptable Use.
Attack questions
The questions that come up once "is my site safe" stops being a hypothetical.
01If a bot floods my site, does it cost me money?
A volumetric flood, no — the edge network absorbs it at no charge. A bot or scraper that pulls every page repeatedly can add up against your fair-use transfer allowance, the same as any other traffic. See what junk traffic does to the bill above.
02Can you block visitors from a specific country?
Not as a standard-plan default. Geo-blocking is real work we can build, quoted flat, the same as a pattern-based filtering rule.
03Do you have a web-application firewall?
A standard plan checks the rules on this page and nothing more. Filtering traffic by pattern or capping request rates is a real thing we can build — just not something included by default. See Delivery for what a standard plan checks by default.
04Someone is scraping my prices. What now?
Brief it as a change to the affected page or API — a rate limit or a stricter check written into that one endpoint. It ships through the same pipeline as any other change: an agent opens the pull request, a human merges it.
05Do you have SOC 2, ISO 27001, or PCI certification?
No. This page describes real, current operating practice, in writing — it is not a substitute for a formal certification if your situation specifically requires one.
06I found a security bug on your site. Where do I send it?
Through the quote form — it's the only channel in. See the disclosure section above for what happens next, and /.well-known/security.txt for the machine-readable pointer.
What the perimeter connects to
- Security
Backups, patching, TLS & DNS, and portability — the rest of the security posture, in writing.
- Access
The other axis: who holds a key, not what can reach the box from outside.
- Delivery
The standard-plan rule set this page's "no WAF, no rate limiting" limit is drawn from, plus the response headers every request gets.
- Monitoring
The full watch list and escalation ladder this page's "when it is actually happening" section reuses.
- Logs
This page's own 90-day request-log row, reused there for the retention table in full.
- Billing
The invoice this page's "junk traffic and your bill" section only asks a question of, never owns.
- Patching
The dependency-scan path this page's tie-in section reuses for a published vulnerability.
- The Loop
How any of the tie-in triggers above actually ships once it's briefed.
- Static
Why a static site's attack surface is close to nothing in the first place.
Found a hole, or need a stricter check on one endpoint?
Brief it through the same quote channel as any other request — an agent opens the pull request, a human merges it, and the same pipeline ships it.