obOB STUDIO
← All works
app★ flagship

Right Now, Somewhere

Teleport to a real moment happening on Earth right now.

Loading Right Now, Somewhere

Tip: click Fullscreen for the best experience.

One button, 83 places

You press "Take me somewhere" and the dotted globe turns until a glowing pin lands on somewhere real. Then the screen becomes that place: its photo, its local time ticking by the second, its current weather, and a line about what people there are probably doing at this hour.

Read the build notes ↓

About this project

A cinematic teleport machine that flings you to one of 83 real places across 73 time zones. Showing the live local time, weather, and what people are probably doing there now. The whole UI re-skins to the destination's time of day via client-side sun math, with a flying globe and collectible postcards.

Built with

Vanilla JSCanvasOpen-MeteoIntl / time zones

How to use it

"Take me somewhere" button
Starts a teleport. The globe flies a glowing pin to the destination, then the postcard opens.
Space
Does the same thing, but only from the home screen. The handler ignores it while a postcard is open or a trip is already running (click inside the embed first so it has focus).
"Take me somewhere else" button
Cross-fades straight to a new place without going back to the globe.
"Save postcard" button
Renders the current destination as a 1080x1350 PNG and downloads it.
"Home" button
Closes the postcard, stops the live clock and returns you to the spinning globe.
"Passport" button (top right)
Slides open the drawer of stamps for every place you have visited.
Esc
Closes the passport drawer.
Tap or click the dimmed backdrop
Also closes the passport drawer.
"Follow the sunrise" toggle
Limits the next pick to places within 40 minutes of their sunrise.
Scroll / swipe up
Scrolls the postcard, which is how you reach the weather and fact cards on a phone.

Build notes.

One button, 83 places

You press "Take me somewhere" and the dotted globe turns until a glowing pin lands on somewhere real. Then the screen becomes that place: its photo, its local time ticking by the second, its current weather, and a line about what people there are probably doing at this hour.

The list is 83 places across 73 IANA time zones, and the footer counts both from the array at load. The gap is because some entries share a zone. Tokyo, Kyoto and Sapporo all sit on Asia/Tokyo. The northernmost is Longyearbyen at 78.22°N, the southernmost McMurdo Station at 77.84°S. Every entry also carries a one-line hook that I wrote by hand, which shows up in the "a little something about this place" card. Eighty-three of those was the least technical part of the build and the part that took longest.

The clock is doing more work than it looks like

Local time comes from Intl.DateTimeFormat with the place's IANA zone. That is the only reason Kathmandu at UTC+5:45 and the Chatham Islands at UTC+12:45 come out right. I never store an offset anywhere, only the zone name. Zone strings that Intl rejects get filtered out at load with a console warning, so one typo in the place list can't break a teleport.

The colour scheme comes from sun position rather than the clock. I inlined the SunCalc algorithm. Julian day, solar mean anomaly, ecliptic longitude, declination. To get sunrise and sunset at the destination, then bucket the current moment. Dawn is 35 minutes before sunrise to 55 minutes after. Dusk is 55 before sunset to 35 after. Day is the stretch between, night is everything else. Four palettes, and the page only re-skins when the bucket changes, not on every tick. Sit on one place through its local sunrise and the whole thing turns from indigo to rose while you watch.

Where the sun refuses to cooperate

That sunrise calculation ends in an acos, and at high latitude the value you hand it can fall outside -1 to 1. That isn't a bug, it's the maths saying the sun doesn't cross the horizon that day. Left alone, Math.acos returns NaN and the time of day comes out as garbage. So the function returns early instead: above 1 is polar night, below -1 is a sun that never sets, and each gets its own label borrowing the night and day palettes. Whether you actually land on one depends on the date, but McMurdo and Longyearbyen are the two most likely to trigger it.

Two things that broke the postcard export

"Save postcard" paints a 1080x1350 canvas and downloads it as a PNG. The first version threw every single time there was a photo behind it. The lead image comes from Wikipedia's REST page/summary endpoint on another origin, so drawing it tainted the canvas. The fix is one line and it is order-sensitive: set img.crossOrigin to "anonymous" before assigning img.src. After is too late.

The second one was dumber. When a photo fails I paint a themed gradient instead, using the background shorthand. On the next teleport, setting backgroundImage did nothing. The shorthand left over from the previous fallback was still winning. Now I clear background to an empty string first. Both loaders also bail out with a check that the place they were fetching for is still the current one, so a fast double-teleport can't paint the old city's weather over the new one.

What to look for

The globe is 900 points on a Fibonacci sphere with the back hemisphere culled and dot brightness taken from a fixed light vector, so it reads as lit from one side. The flight takes 1250ms and always turns the short way round; with reduced motion switched on it drops to 350ms.

Turn on "follow the sunrise" and the next pick is limited to places within 40 minutes of sunrise. It's not a promise. If nothing on Earth qualifies that minute it says so and sends you to the closest one instead, and polar places are skipped entirely because they have no sunrise to be near.

The passport lives in localStorage, deduped by place name with a count badge for repeat visits, and stamps are tilted using a rotating list of six angles so no two neighbours lean the same way. Weather is Open-Meteo with no key, a 7-second timeout and 28 WMO codes mapped to an emoji and a description. When it can't reach the API it says so rather than showing a blank.