Websites · from ~$900 · 3–4 weeks

A website that gets attacked before it gets launched.

Marketing sites and landing pages for funded startups: designed and built by me, with custom motion, delivered with the same pre-launch security review as every build — and the source is yours.

up to ~6 pages · CMS optional · custom motion included · fixed price

who this is for

You've raised, or you're about to, and the site has to hold up in front of customers, candidates and the next investor: one page or six, with a story, real motion, and a form that actually reaches you.

You'd rather pay one person to design it, build it and then try to break it than coordinate an agency, a developer and — usually never — a security check. This site is the example: it runs the same review, and its headers, speed and code are all public.

what a website includes

Designed, built, attacked, handed over.

Every website, at every price, goes through all of this. Larger sites — more pages, a shop, accounts — are quoted in writing.

  1. 001

    Design

    A visual system drawn for your company, not a theme: type, colour, layout and the motion that goes with them, at desktop and phone sizes. You see it in the browser, not in a slide deck.

    week one

  2. 002

    Build

    Up to about six pages on a fast, current stack, with custom motion, the forms you need, analytics that doesn't need a cookie banner, and search-engine basics done properly: titles, previews, sitemap, structured data.

    weeks two and three

  3. 003

    CMS, if you want one

    If you'll edit copy, posts or case studies yourself, I wire a content editor in. If you won't, I don't — the site stays simpler and faster.

    optional, decided on the call

  4. 004

    The attack

    Before launch I run the same pre-launch security review I sell on its own: headers and browser protections, forms, any login or admin surface, third-party scripts, exposed keys. Findings in writing, fixed before launch.

    the final days, never cut

  5. 005

    Launch and handover

    On your domain and hosting accounts, in your name. The source in an account you own, written notes on how to change things, and a call.

    you own everything on day one

security, on a website

“It's just a marketing site” is how it starts.

A website is the front door: the thing on your domain, in your email, in front of every prospect. It gets the same care as an application.

  1. 01

    Browser-level protections from the first deployment

    The set of response headers this site scores A+ on, so a hijacked script or an embedded frame can't turn your site against your visitors.

  2. 02

    Forms that reach you and nobody else

    Validated on the server, rate-limited, with a honeypot — and they never say “sent” unless the message arrived.

  3. 03

    Third-party scripts kept to what you actually use

    Every tag and widget is a way in. Each one is listed, justified and allowed explicitly.

  4. 04

    No keys or passwords in the code

    Checked across the whole history of the code, with a check that keeps it that way.

  5. 05

    Your domain, not just your site

    Email spoofing protection (SPF, DKIM, DMARC) checked and set, so nobody can send mail as you.

  6. 06

    Fast on a phone, measured

    Speed is checked with the same public tools anyone can run, before launch and after.

what you receive

A finding, as it arrives.

Every finding in a report says what the issue is, what an attacker gains, exactly how to reproduce it, and how to fix it — ranked by real-world impact, never a scanner result passed through. This one is from the public sample; the whole 12-page report is linked under it.

NW-02HIGHCVSS 3.1 7.7AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:NFixed · retested

IDOR on order endpoint exposes any customer's orders

Order API · CWE-639 · OWASP API1:2023

What the issue is
GET /v2/orders/{orderId} verifies that the caller is authenticated but never checks that the order belongs to them. Order IDs are sequential integers, so the entire order table can be walked by incrementing a number.
What an attacker gains
Any authenticated customer can read every order in the system: line items, totals, delivery addresses, phone numbers and email addresses. For a retailer this is a personal-data breach affecting the whole customer base, reachable from a free signup.
Reproduction
# authenticated as customer A (own order)
GET /v2/orders/10442  →  200 OK   // expected
# same session, another customer's order
GET /v2/orders/10441  →  200 OK
{"orderId":10441,"customer":{"name":"[REDACTED]", …

A short script walking IDs 10000–10500 returned 500 of 501 records. Enumeration was stopped at that point and no data was retained; the redactions above are applied at capture.

How to fix it
Enforce ownership server-side on every object access — the query itself should be scoped to the caller, not filtered afterwards. Replace sequential identifiers with UUIDs so that enumeration is not trivially possible even if a check is missed in future.
-- scope the query, do not check after fetching
SELECT * FROM orders WHERE id = $1 AND customer_id = $2;
Add an automated test asserting that customer A receives 404 for customer B's order. This class of bug returns whenever a new endpoint is added, so the guard needs to be a test, not a code review habit.

Sample report · fictional target · every finding, payload and identifier in it is synthetic. Real reports go to the client and nowhere else.

timeline and price — fixed, agreed in writing before work starts

  • 900

    USD, from · about · ₹75,000

  • 3

    to 4 weeks, from the first call to launch

  • 6

    pages, about — larger sites are quoted in writing

  • 30 days

    of in-scope fixes after launch

Payment is 50% to start, 50% at launch. Published in Indian rupees; the dollar figure is today's conversion.

the scope boundary

Up to about six pages. More is a quote, not a surprise.

The price covers a marketing site or landing page of up to about six pages, with custom motion, the forms you need and an optional content editor. A shop, customer accounts, a dashboard, a large content library or a site in several languages is a larger job — scoped and priced in writing, the same way as everything else here.

If what you're building has users who log in and data they trust you with, it's an application, not a website: see Build. If you already have a site and only want it checked, see Review.

before you start

Questions people actually ask.

  • What does a website cost?

    From ₹75,000 (about $900) for up to about six pages, fixed price, agreed in writing before work starts. Payment is 50% to start, 50% at launch. Larger sites are quoted in writing.

  • How long does it take?

    Three to four weeks from the first call to launch, depending on how quickly you can give feedback on the design and supply the content.

  • Do I get a CMS?

    If you want one. If you'll edit copy, posts or case studies yourself, I wire a content editor in. If you won't, the site stays simpler and faster without it.

  • Can you use my existing brand and content?

    Yes. Bring a logo, colours, copy or a deck, and the design starts from there. If there's nothing yet, that's fine too — the first week covers it.

  • Who owns it?

    You do. The site runs on your domain and hosting accounts, in your name, and the source lives in an account you own. If we part ways, everything stays with you.

  • Why is there a security review on a marketing site?

    Because it's the thing on your domain, in your email, in front of every prospect. Headers, forms, third-party scripts, exposed keys and email spoofing are where marketing sites get hurt, and they take days to check properly — so they're checked.

start a website

Tell me what the site has to do.

Who it's for, what it has to say, and when you need it live. I reply within one working day; the first call is a free 15 minutes.