
Walk.
It stays level.
A camera on a three-axis gimbal, small enough for a jacket pocket. Hold it in one hand and walk. The footage stays steady.
From US$449

Move your pointer to steerDrag across the frame to steer
Your hand shakes. The horizon doesn't.
You're holding the camera: the frame follows your hand, wobble and all. Switch the stabilizer on and three motors take the shake out while you keep aiming.


The hour after sunset still counts.
A 1-inch sensor collects about four times the light of a phone sensor. Drag across the frame to compare.

Shoot wide. Find the close-up later.
4K leaves room to crop a sharp 1080p close-up after the fact, so one take gives you two shots. Move across the frame to punch in.

Captions as you talk. On the camera.
On-device speech to text puts subtitles in the preview and saves them as a separate file. No app and no upload.
okay we made it up here, the light is unreal
everybody look at the camera for a second
and it's writing down everything we say

Everything in 118 grams.
- Sensor
- 1-inch CMOS
- Video
- 4K 120 fps · 10-bit
- Stabilization
- 3-axis mechanical gimbal
- Display
- 2.0" OLED, rotates
- Battery
- 150 min at 4K 30
- Audio
- Stereo mics + wireless pairing
- Storage
- microSD up to 1 TB
- Weight
- 118 g

Configure yours.
Metering · local price
How this page is built
GX1 is fictional; the Next.js is real. Turn on Commentary at the top to see each technique where it's used.
- Server Components by default
- Every section is server-rendered. Client code is limited to six small islands: timecode, stabilizer, compare, lens, captions and the reserve field.src/app/page.tsx
- Native fetch, cached
- Exchange rates come from Next's fetch inside 'use cache' with cacheLife('hours') and a revalidation tag. No SWR, no React Query.src/lib/region.ts
- Forms as backend code
- Reserving runs a Server Action that validates with zod on the server. useActionState carries the result back.src/app/actions.ts
- State in the URL
- Finish and kit are search params, and every option is a prefetched <Link>. It's shareable, and it works with JavaScript off.src/components/configurator.tsx
- Suspense, not spinners
- The configurator streams behind a Suspense fallback, and the route has loading.tsx. There's no isLoading state anywhere.src/app/loading.tsx
- proxy.ts at the request edge
- The visitor's country is read before rendering and forwarded as a header, so the price is local with no client geolocation.src/proxy.ts
- Tailwind, no CSS-in-JS
- Tailwind v4 with theme tokens in CSS. Nothing is injected at runtime and nothing extra is needed for SSR.src/app/globals.css