ShepherdUX

Cookies and storage

Your choices.

Two things this site keeps in your browser so it works, and one it asks you about.

Needed to run

Your day or night setting, the last few things you searched for, and the answer you give here. They stay in this browser and are never sent anywhere.

Always on

Analytics

PostHog counts visits: which pages and cards get read, how far along a world people travel, and where they leave. No account, no name, no adverts, and no tracking across other sites. One first-party cookie and a matching browser store mark a return visit as the same visitor. The count is held by PostHog Inc. on servers in the United States, under their own privacy terms.

Back to the library

How this site is made

Five worlds, one camera

A walk through the drawn routes of this site - what each one is, why it scrolls sideways, and the small rule that keeps every one of them moving.

The homepage rainforest, mid-walk: tall trunks, canopy, a shaft of light through the ferns

There is no scroll bar on this site's front page. There is a scroll, and it goes sideways, and what it moves is a rainforest. Four more routes do the same thing with four other places. This is a walk through all five - what each one is for, what it is made of, and the one rule they all live by - written mostly so I stop explaining it in messages.

The rule the worlds live by

The rule is short and it decides everything downstream: nothing moves for decoration. A candle burns down because you have been reading beside it. Fireflies drift because a forest floor at night has fireflies. The one thing that moves because you moved is the camera, and the camera is the whole trick - a few kilobytes of plain JavaScript that reads how far you have scrolled and slides a handful of layered planes by different amounts, the near ones faster than the far ones, so a flat picture gets depth for free.

Parallax is the boring word for it. What makes it feel like a place rather than a slideshow is that the planes are drawn to be seen at different speeds - the fore plane is sparse and large, the far plane is dense and small - and that the camera never snaps. It eases toward where you are, at a rate corrected for your frame rate, so a fast wheel and a slow trackpad arrive at the same picture.

Everything else follows from that. The worlds are drawn as flat shapes rather than photographed or generated, because flat shapes stay crisp at any width and cost the browser almost nothing to move. There is no GSAP, no Lottie, no scroll library - the whole camera is a few kilobytes of the site's own code, which means every line of it is a line I can read. One requestAnimationFrame loop drives every world's camera and the cursor together, and when nothing is moving it stops asking for frames at all.

A page is a room you carry with you.

That sentence is on the wall of the reading room you are in now, and it is the reason the reading pages - this one - do not scroll sideways. A room you read in should hold still.

The rainforest

The homepage rainforest a third of the way in: trunks in three depths, canopy overhead, undergrowth and mushrooms along the floor

The front page, a third of the way along. Three depths of trunk, and a floor that is busier than it looks.

The home route is the rainforest, and it is the loudest of the five by design: it is the first thing anyone sees, so it carries the whole argument at once. Big trunks in the fore plane, a canopy that closes over you, a floor of ferns and fungi, and - if you wait - the fireflies. The stations along the walk are the site's own pitch: what I build, who for, how to reach me. The dock at the far end holds the contact form.

It is also the world that taught me the most about cost. Every plane in it is a stack of SVG paths, and every path with a curve in it costs the rasteriser more than a polygon does. The rainforest is nearly all curves. Two full passes of measuring later, its fast planes came back down toward the floor of what a laptop can redraw between two frames - not by drawing less, but by letting the camera decide what is off-screen and hiding it before the browser has to think about it.

If you want to see the machine work, hold a fast wheel-scroll and watch the far trunks. They move, but they move less than the near ones - that ratio is the only 3D there is.

Or don't take my word for it. Twenty frames of the walk, played back:

Twenty frames of the rainforest walk: the near trunks sweep past while the far ones barely shift, and the canopy holds almost still

Eight seconds of scroll, sampled twenty times. Watch any single trunk and you can pick which plane it is on by how fast it leaves.

That is the whole trick, and it is worth saying plainly how little is in it: no library, no 3D, no compositing. Every plane is one translate3d written by one loop, and the depth is nothing but the ratio between the numbers.

What the drawing is arguing with

The worlds are drawn, and drawn is not the same as invented. Before the rainforest was flat shapes it was a place someone stood in, and the parts of it worth keeping had to be found there first.

The reference, not the site. Trunks at three distances, a floor that is busier than the eye first reports, and the fog doing the work that the far plane's low contrast does in the drawing. Video by Juan Camilo Trujillo Botero on Pexels.

Put that beside the world above and the choices stop looking arbitrary. The near trunks are dark and high-contrast because the near trunks in the footage are; the far ones wash out toward the canopy colour because fog does exactly that, and a flat plane at low contrast is the cheapest possible way to say "far away" to a rasteriser. The undergrowth is dense at the bottom of the frame and thins upward for the same reason it does on a real trail.

None of that is a photograph on the site, and none of it will be. But the drawing is an argument about which parts of a place matter, and an argument needs something to be about.

The library

The journal world's reading room: Gothic arches, candlelit shelves, a lantern, and one book standing proud of the row

The reading room, mid-walk. The book standing proud of the row is a post.

The journal lives in a castle library - Gothic shell, Persian furnishing, candles that never quite go out. The shelves are generated: every spine is a small rectangle in one of a few dye colours, and the whole field is merged into a handful of paths so the browser can carry it. Published entries map into fixed slots the art thins itself around, which is why the room looks the same whether the journal holds one post or twelve - the count never changes, only which books stand forward. Click one and you are here, on a page that is that book taken down and opened.

The room's own list of what is on the shelves is a small JSON file the panel serves; the site pulls it into the build, so the world learns about a new entry on the next pull and never has to fetch anything at runtime.

The street

The portfolio street at night: awnings, a lantern shop, stalls under a lit arcade

The portfolio: a covered street of stalls, one per piece of work.

The portfolio is a street - a covered arcade of stalls under strings of lamps, one stall per piece of work, each with its own awning and its own light. It is the most literal of the five, and on purpose: a portfolio is a shop window, so it is drawn as one. The stations here are the case studies, and the street is long enough that walking it is a small commitment, which is also on purpose.

What is drawn. Every awning, lamp, wall tile and stacked crate is a shape placed by hand in a scene file. Nothing here is a photograph and nothing is generated on the fly.

What is generated. The repeating textures - the tiled walls, the runs of lamps - are written once as a rule and unrolled at build time, so the source stays readable and the output stays fast.

The desert

The about desert at night: a full moon over pyramids and mesas, a scatter of stars, palms along the far horizon

The about page. Two pyramids, not four - it took three passes to get the count right.

The about page is a desert at night, and it is the world that has changed the most since it was drawn: a pyramid field at the mouth of the walk, then two pyramids instead of four, then those two moved right and given three times the surface, because most of a far plane is unreachable and things placed there are invisible forever. There is a lesson in that which deserves its own entry.

The desert is also where the next drawings are going. Three sketches - a saucer, a stand of cacti, two mesas - are sitting in a folder waiting for a place in it:

The sketches came out of the drawing tool as one 2.4 MB SVG. That is a fine file to draw in and a poor one to ship - the whole desert page, drawings and all, weighs less. Each will be traced into flat shapes and placed on a plane it can actually be seen from before it goes anywhere near a page.

The garden

The garden prototype: autumn maples in orange and red over a pond, a small footbridge, a wooden lantern

The garden, late in the walk: a footbridge, a lantern, and maples the colour of a struck match.

The fifth route is a prototype - a garden in autumn, maples over a pond, a footbridge and a lantern - and it is where new ideas get tried before they are allowed near the other four. It is the newest of the five and the least settled, which is exactly what makes it useful as a bench: when a change makes the garden slower, the change is wrong, and there is nothing precious in the way of finding out.

Here is roughly what happens when I add a beat to any of them:

  1. Draw it flat

    Every element is a shape in a scene file, placed by hand at a known depth. Curves are spent carefully; polygons are nearly free.

  2. Put it on a plane

    Each plane moves at its own speed. Anything that has to be read goes on a slow plane; anything that has to feel near goes on a fast one, and it goes big.

  3. Give it a reason to move

    If it moves, the movement has to mean something - a night passing, a reader reading. If there is no reason, it does not move.

  4. Measure it

    Not with a stopwatch: wall-clock numbers on this laptop swing by a third between identical runs. The tools read CPU time per frame from the browser's own trace, and a change is real only when the pair inside one run says so.

What it costs

5worlds
1animation loop
0animation libraries
3tools that can see a frame

The honest number is the last one. For most of the site's life the worlds felt fine and I could not have said why, or said what would break them. The scroll passes changed that: three small scripts now measure what a frame actually costs the machine, what the tail of the worst frames looks like under a real gesture, and how many compositor layers a page is asking for. Every world got faster after that, and - more usefully - every proposed change since has had to prove it did not make one slower.

Route World Light What it is for
/ Rainforest daylight under canopy The pitch
/journal/ Library candlelight Entries like this one
/portfolio/ Street lamplight The work
/about/ Desert a full moon The person
/prototype-1/ Garden autumn afternoon The bench

Four of them, at their edges - the frames a walk ends or begins on:

before after

That last drawing is a raw block - the one place in an entry where markup goes in as typed, unescaped and unwrapped. It exists so a post can carry a diagram the editor has no button for; it is logged every time it is used, and it is used exactly here.

Drawn, not generated. Built in Astro with no animation library - the camera that moves this landscape is five kilobytes of plain JavaScript.

The site's own colophon, at the end of every world

Questions people actually ask

Does it work without JavaScript?

Yes. Without the script every route is an ordinary vertical page: the same drawings, stacked, and every station readable in order. The camera is an enhancement, not the page.

What about phones?

On a touch screen you swipe and the world walks. If your device asks for reduced motion, you get the vertical version - the choice is structural, not a media query fighting the layout.

Why sideways at all?

Because a place has a horizon and a page does not. Walking along a landscape is a different feeling from scrolling down a document, and I wanted the site to feel like the first thing.

Can I have one of these?

That is what the street is for. Walk it, find the stall that looks like your problem, and write to me from the dock - or from the form below.

Have a question about how one of these is built - or want one of your own? Ask here. It lands in the same inbox as the dock at the end of every world.

Leave a quick note.

A question, a correction, or a hello. Two lines and it is done.

And the note itself.

One or two sentences. If it turns out to be a project rather than a note, write the brief instead.

Or send a message on WhatsApp.

Walk the rainforest

Let's write the brief.

My name is , and I am with .

I am here because

I would like to start , with a budget around .

You can reach me at .

Here is the shape of it: (optional)

What matters most

Before you write

Asked and answered.

What does ShepherdUX actually do?

Design, build and growth, the whole stack: brand identity, interfaces, full websites and apps, editorial blogs, full-stack SEO, Google and Meta ads, and custom CRMs with whatever integrations the work needs. You can hire one layer on its own. The practice exists because the layers work better when one pair of hands holds all of them.

Does the SEO cover AI search as well as Google?

Yes, and it has for a while. Everything is written answer-first, with entities spelled out and facts a machine can lift whole, so it ranks in Google and gets quoted by AI assistants. On one client, AI assistants now deliver roughly one booking in twelve.

What does a project cost?

It depends on what the work is, which is why the brief above asks for a budget instead of quoting one blind. Small fixed pieces exist, and so do monthly programmes. Either way you get a written plan with a price on it before anyone commits to anything.

Can you take over a site somebody else built?

Yes - it is one of the most common ways in. The first step is an audit rather than a rebuild: on one recent client, the audit found Google had never crawled twenty-five of the site’s most important pages. What happens next follows from what the audit finds, not from a package.

Where is the studio based?

The work is remote and always has been. Current and recent clients run from Orlando and Tampa Bay to Karachi, and every one of them is measured the same way, in their own Google Search Console. Distance has never once been the problem.

How will I know the work is working?

You watch it move in numbers you own: Google Search Console, your analytics, your inbox. The portfolio on this site draws its graphs from clients’ real Search Console exports - that is the standard of evidence the work is held to, here and everywhere.

Or write to hello@shepherdux.com, or send a message on WhatsApp. One person reads these, and answers most of them the same day.