App launcher
A Cover Flow deck that cold-boots, freezes and switches whole apps — running live in the PSP at the top of this page.
Components, signals and Tailwind — on consoles, e-readers and microcontrollers. A tiny JS guest where it fits; the framework compiled away where it doesn’t.
Components, signals, Tailwind classes. Then pick the machine underneath.
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>
);
}
import { Text, View } from "@pocketjs/framework/vue-vapor/components";
import { ref } from "vue";
export default function Counter() {
const n = ref(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.value}</Text>
<View class="px-4 py-2 rounded-xl bg-slate-700 focus:bg-slate-500" focusable onPress={() => n.value++}>
<Text class="text-base text-slate-50 font-bold">Press Circle</Text>
</View>
</View>
);
}
import { Text, View } from "@pocketjs/framework/octane/components";
import { useState } from "octane";
export default function Counter() {
const [n, setN] = useState(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>
);
}
taffy lays out in the Rust core — a familiar flex-col gap-4 lands on identical pixels on every target, provable in goldens.
Class literals compile to compact numeric records. No CSS parser, no cascade, no utility runtime ships to the device.
A tiny QuickJS guest where there’s room for one; compiled dirty-bit state machinery where there isn’t.
A .pocket file describes what the app is and what it needs — identity, capabilities, build plan, payloads. Each device decides how it should run: which viewport, which presentation, which execution class. If a target can’t honor the contract, it says so before launch, not after.
my-app.pocket
├─ identity app id, version, entry
├─ capabilities input.touch · display.viewport.live · …
├─ build plan how every target gets produced
├─ payloads guest bundle · AOT program
└─ assets style packs · fonts · tiles
One deterministic file. Every target re-verifies the plan before launch.
Not just rectangles on unusual screens — the pieces apps need to become an ecosystem.
A Cover Flow deck that cold-boots, freezes and switches whole apps — running live in the PSP at the top of this page.
A registry of real, tested hosts. Apps declare needs; targets admit or refuse them at build time.
D-pad focus, touch, analog, a virtual cursor — and a system keyboard any app summons with one call.
USB companions bring what the device lacks: yt-dlp on a Mac becomes YouTube on a PSP.
Every session records itself. Step to any frame, inspect the native tree — over USB to real hardware.
A virtual clock makes every frame a pure function of the input tape. Goldens compare framebuffers byte for byte. The UI runtime that can’t flake →
Impossible doesn’t mean old. It means no browser, no modern OS, no JS engine, no continuous refresh — or no vendor left to care.
No OS to lean on, and 333 MHz is the fast one.
The vendor moved on. The hardware didn’t.
A screen that fights every frame — so the runtime picks partial, dynamic or full refresh per update.
Kilobytes, not gigabytes. Sometimes no allocator at all.
Built on Pocket Vapor, the experimental compile-away pipeline.
Modern machines that deserve better than a bundled browser per app.
Every “shipping” chip is a real, tested host in the registry — not a roadmap slide. See the target profiles →
Complete open-source apps, each shipped to stress a different part of the platform.
Proves: multi-app lifecycle & system UI
A Cover Flow deck that boots, freezes and switches whole apps — on PSP and on a 2011 Nokia. It’s running live in the 3D PSP at the top of this page.
Proves: 3D worlds & the JS/native split
A Counter-Strike-shaped FPS on the classic GoldSrc-era maps — BSP, lightmaps, bots, recoil — at a locked 60 FPS on a 333 MHz PSP. The HUD is a Solid app.
Proves: big documents & streamed assets
A real Figma Community file — 14,430 nodes, a canvas 26,000 pixels wide — baked into streaming tiles the device pans and zooms without ever parsing the file.
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, the handheld plays the stream — search, seek, CJK titles and all.
Proves: it also replaces heavy desktop runtimes
A VRM digital human in a transparent always-on-top window — one native process, 118 MB and ~4% of a core, where the Electron stage needs 2.2 GB and 44%.
Proves: it reaches machines with no interpreter
One Vue module — ref, computed, list rendering — compiled into GBA, Game Boy and NES carts, verified frame-by-frame against real Vue on the same inputs.
Take the app model you already know to the device everyone else gave up on.