Rich interactive JavaScript where no browser fits.

PocketJS is a compact JavaScript runtime for UI, games, 3D and AI-native apps on radically different devices: consoles, phones, e‑readers, microcontrollers, desktops.

Familiar code, native machinery

Write the app you already know how to write.

Write components, signals and Tailwind classes in Solid, Vue Vapor or Octane. Then pick the machine underneath.

Counter.tsx
import { Text, View } from "@pocketjs/framework/components";
import { createSignal } from "solid-js";

export default function Counter() {
  const [n, setN] = createSignal(0);
  return (
    <View class="flex-col items-center gap-4 p-6 bg-slate-950">
      <Text class="text-2xl text-slate-50 font-bold">Count: {n()}</Text>
      <View class="px-4 py-2 rounded-xl bg-slate-700 focus:bg-slate-500" focusable onPress={() => setN(n() + 1)}>
        <Text class="text-base text-slate-50 font-bold">Press Circle</Text>
      </View>
    </View>
  );
}
Execution
the same Rust core, compiled to WebAssembly
Display
any viewport, density-aware
Rendering
the same framebuffers as the devices, so the goldens run here
Input
mouse, keyboard, gamepad
Ships as
a URL, with no install and no toolchain
Run this counter in the playground →

Layout becomes native flexbox

taffy lays out in the Rust core, so a familiar flex-col gap-4 lands on identical pixels on every target, provable in goldens.

Tailwind becomes style data

Class literals compile to compact numeric records. No CSS parser, no cascade, no utility runtime ships to the device.

Reactivity becomes what fits

Write Solid signals, Vue refs or Octane hooks. They run in a tiny QuickJS guest where there’s room for one, and become compiled dirty-bit machinery where there isn’t.

Shipped on real hardware

The proof is what it can carry.

Complete open-source apps, each shipped to stress a different part of the platform.

The Pocket Launcher Cover Flow deck on a Nokia E7's landscape AMOLED screen.

Pocket Launcher

Proves: multi-app lifecycle & system UI

A Cover Flow deck that boots, freezes and switches whole apps. SELECT summons the switcher; a frozen shot stands in while the next app cold-boots. Verified on the PSP, the Vita and a 2011 Nokia.

OpenStrike on de_dust2: sunlit BSP geometry with the Solid HUD showing 100 HP and 30/90 ammo.

OpenStrike

Proves: 3D worlds & the JS/native split

A Counter-Strike-shaped FPS that runs the classic GoldSrc-era maps, with BSP, lightmaps, bots and recoil, at a locked 60 FPS on a 333 MHz PSP. The HUD is a Solid app.

Pocket Voxel on a PSP: Pallet Town as a voxel diorama, gabled roofs and carved bushes in per-tile color with the player on the path.

Pocket Voxel

Proves: the Guest can own a whole game

A Game Boy creature-RPG standing up as a walking voxel diorama, fed by your own cartridge. World, battles, scripts and saves all live in the TypeScript Guest; a Rust core carries the scene at a locked 30 FPS.

Pocket Figma on a PSP: the Components page fit to screen at 3% zoom, a long row of wireframe artboards crossing the canvas.

Pocket Figma

Proves: big documents & streamed assets

A real Figma Community file, 14,430 nodes on a canvas 26,000 pixels wide, baked into streaming tiles the device pans and zooms without ever parsing the file.

Pocket YouTube on a PSP: a paused video under the player HUD's title bar and red progress bar.

Pocket YouTube

Proves: host services, video, audio & OSK

YouTube on a PSP where the network is a USB cable: a Mac companion runs yt-dlp and ffmpeg while the handheld plays the stream, with search, seek and CJK titles intact.

Pocket Character's VRM digital human in a transparent macOS widget window, next to Activity Monitor showing a single light process.

Pocket Character

Proves: it also replaces heavy desktop runtimes

A VRM digital human in a transparent always-on-top window, running as one native process at 118 MB and ~4% of a core, where the Electron stage needs 2.2 GB and 44%.

The same Vue todo app running side by side on Game Boy Advance, Game Boy and NES.

Pocket Vapor Todo

Proves: it reaches machines with no interpreter

One Vue module with ref, computed and list rendering, compiled into GBA, Game Boy and NES carts, verified frame-by-frame against real Vue on the same inputs.

Your turn

The browser was never the limit.

Whether it’s an interface, a game, a world or an agent, take the software you already know how to write to the device everyone else gave up on.