Live · Website

Johan Evert Wildlife

A portfolio site built to sell, not just to show.

Most portfolio sites stop at a gallery. This one had to take orders, route them by country, qualify licensing enquiries properly, protect the assets it displays and get itself indexed — on hosting that costs almost nothing to run. Designed, built and photographed by me.

The Johan Evert Wildlife homepage: a leopard resting along a branch in golden light, with the photographer's name over it and a View Gallery button.
64images in one filterable, lightboxed gallery
1HTML file — no CMS, framework or database
5questions the enquiry form asks before quoting
2fulfilment routes, decided by where the buyer is

The work

Six decisions that shaped it.

The brief

A gallery would have solved nothing

The starting point was the usual one: a lot of work to show, and no way for anyone to actually buy or commission any of it. That's a website problem, not a design problem — a beautiful gallery with no path to a transaction is a brochure.

So the site was scoped backwards from the two things it had to produce: a completed order, and a licensing enquiry good enough to quote against. Every section earns its place against one of those two, and the ideas that served neither were cut before a line was written.

The build

One file, by hand, on purpose

The whole site is a single hand-coded HTML file plus one PHP form handler. No CMS, no framework, no build step, no database.

That isn't nostalgia. A site with no CMS has nothing to keep patched, no plugin to break on update, and almost no attack surface. It loads fast on a bad connection and runs on the cheapest shared hosting there is. For a portfolio that needs to be up and quick rather than constantly edited, it's the correct answer — and the same reasoning I'd apply to anyone else's site before reaching for something heavier.

The gallery is 64 images driven by a small JavaScript array with category filters and a lightbox over the top — no gallery plugin, which means no plugin to update and nothing that stops working when it's abandoned in two years.

Enquiry design

A form that refuses to guess

Almost every "get a quote" form on the web is a name, an email and a message box. It feels friendly and it's useless: what arrives can't be priced, so the reply is a question, and half the people never answer it.

This form asks the five things the price actually depends on — what it's for, which territory, how long, how prominent, and whether it's exclusive — and updates an indicative price band live as the answers come in, so nobody reaches the end and gets a shock. What lands in the inbox is a structured enquiry with every field laid out, ready to quote, rather than a paragraph to decode.

The same shape applies to any business that quotes rather than sells off a shelf. The interface is where the qualifying questions belong.

The rule it encodes Never quote before you have all five answers — and when the budget is too small, cut the licence rather than the price. The form exists so that rule can't be skipped in a hurry.

Order routing

Two routes, decided by geography

The obvious build was one fulfilment service wired to a checkout, the same for everyone. Checking the suppliers properly killed it: no automated service covered South Africa, so a single global route would have meant every local order crossing a border twice.

So the site splits the path by where the buyer is. International orders go through a hosted shop that produces in the buyer's own country; local orders come direct, fulfilled locally. Two flows, one decision point, and no customer left waiting a month for something made forty minutes away.

This is the part of a commerce build that never shows up in a design mockup, and it's usually where the money is won or lost.

Print order from the site Where is the buyer? Inside South Africa printed locally, couriered — large formats too Outside South Africa printed in the buyer's own country
Shipping a large print from a European lab to South Africa can cost more than the print. Routing by geography isn't a preference — it's the difference between a sale and a refund.

Asset protection

Hotlinking, and the rule that breaks search

When your assets are served straight off the page, other sites can embed them and bill your bandwidth for the privilege. The host offered no hotlink protection tool at all, so the rules were written by hand into .htaccess: an embed from somewhere else gets a refusal.

The interesting part is the exception. Requests carrying no referrer are allowed through on purpose — because Google Images, Googlebot and the link-preview fetchers behind WhatsApp and Facebook all send none. The copy-pasted version of that rule blocks them too, and quietly drops the site out of image search and kills every link preview, while looking like it's working.

Tested, not assumed Each case was checked from an outside domain: foreign referrer blocked, no referrer allowed, favicon always reachable, and all 66 images on the homepage still rendering.

The unglamorous half

Being findable, and an em dash

A site nobody can find is a hard drive with extra steps. So: title and description, Open Graph tags, alt text throughout, a canonical URL, structured data, a robots file, and a sitemap carrying the homepage plus 128 individual image entries — verified in Search Console rather than submitted and hoped for. There's a custom 404 page in the site's own styling, marked noindex, with four ways back in.

And a small one that says more than the rest of it: enquiry emails were arriving with em dashes mangled into â€". The fix was proper MIME headers and RFC 2047 subject encoding — then a second end-to-end test to confirm it, because a form that silently corrupts a client's message is worse than no form at all.

How it's built

Old tools, used carefully.

Nothing here would impress a framework enthusiast. It loads fast, it costs almost nothing to run, and there is no part of it that can break while nobody is looking.

  • Front endOne hand-coded HTML file with inline CSS and JavaScript. Gallery filters and lightbox written from scratch; images lazy-loaded.
  • FormsA single PHP handler serving both the contact and licensing enquiries, with input validated and stripped, and UTF-8 MIME headers so nothing arrives mangled.
  • VideoThe showreel is a click-to-play facade — nothing loads from YouTube until someone presses play, so the page stays fast and cookie-free for everyone who doesn't.
  • HostingShared cPanel, static files, SSL. Custom 404 and hand-written hotlink rules in .htaccess.
  • FindabilityOpen Graph, alt text, canonical, structured data, robots.txt, and a sitemap of the homepage plus 128 images, verified in Search Console.

Get in touch

Need a site that does a job?

If your site has to sell something, route an enquiry properly, or simply load on a connection that isn't fibre — that's the kind of work this was. Tell me what yours needs to do.