A native PocketJS tiling desktop for BlackBerry Classic / Q20.
BB10 / QNX · BerryCore shell · DeepSeek agents · Omarchy-inspired keyboard controls
OmaBerry runs directly as a native BB10 application. PocketJS renders the desktop and connects it to QNX input, PTYs, files and processes through native bindings. The desktop uses PocketJS native controls, with no HTML shell, localhost web server or Node.js service. The Browser application embeds the system WebKit engine into a native desktop tile.
OmaBerry 现已完全转向 PocketJS 原生桌面:在黑莓 Q20 上直接运行终端、文件管理、中文聊天和本地 agent 工具。左上角 OmaBerry logo 打开居中菜单;新窗口递归平铺,实体 Menu 键作为 Super 使用。
Actual 720 × 720 Q20 framebuffer captures. The default wallpaper is Liftoff Sunset, the first artwork from Tokyo Liftoff.
| Feature | Available in the native app |
|---|---|
| Tiling desktop | Ten workspaces, up to sixteen windows, recursive half splits, focus/swap, resize, fullscreen and collapse on close |
| Terminal | Independent BerryCore PTY shells; working directories and running processes survive workspace switches |
| Files | Browse directories, filter names and read paginated text previews directly from the device |
| herdr | Project directory above the agent list; session tabs at right, real agent status, CJK candidates and offline Pinyin |
| Local agent tools | Execute local shell commands, read/write files, see actual phone pixels and operate the desktop and browser |
| Browser | Native WebKit pages composited inside desktop tiles; URLs, history, JavaScript, forms, touch, trackpad and agent controls |
| Live native UI | Agents edit ui.js, apply native View/Text/Button trees, inspect real screenshots, click native controls and undo changes |
| Notes | A scratchpad for each Notes window |
| Theme | Tokyo Night colors, thin focus borders, translucent panes and four Tokyo Liftoff wallpapers; wallpaper and style settings persist |
Each new window splits the focused pane in half along its longer dimension. Closing a pane lets its neighbor fill the freed area. The desktop has no window-manager titlebars or close buttons; click the top-left logo for the centered menu, or use the keyboard.
herdr is a desktop application. Its projects and agent sessions are independent of the numbered system workspaces. New shells and UI previews are separate desktop windows and use the same recursive tiling as other applications.
The agent edits actual ui.js source on the phone. PocketJS displays the resulting native controls, confirms frame presentation and keeps the last good version if a change fails. See the live UI workflow.
Press Super + B, then Super + L to enter an address. Webpages stay in their desktop tile. Tap a page to focus it; the trackpad moves the page pointer, its click activates, and Alt + trackpad scrolls. The native logo menu overlays the page.
On the Q20, hold the physical BlackBerry Menu key to use it as Super. Tap and release Menu to open or dismiss the menu.
| Shortcut | Action |
|---|---|
| Super + Enter | Open a new terminal |
| Super + W / Q | Close the focused window |
| Super + Space | Open the centered OmaBerry menu |
| Super + Alt + Space | Applications |
| Super + arrows / Menu + trackpad | Focus a neighboring pane |
| Super + Shift + arrows | Swap panes |
| Super + J | Toggle the split direction |
| Super + F | Fullscreen / restore |
| Super + 1…9, 0 | Switch to workspace 1…10 |
| Super + Shift + number | Move the focused window to a workspace |
| Super + Shift + F / N / A | Files / Notes / herdr |
| Super + Ctrl + Enter | Open or focus herdr |
| Super + T / Shift + T | New desktop shell / herdr agent session |
| Super + [ / ] | Previous / next herdr agent session |
| Super + U | Native UI preview |
| Super + B / L | Open Browser / edit its address |
| Alt + trackpad | Scroll the focused terminal, chat, file preview or webpage |
| Super + K | Show shortcut help |
See the full native shortcut map for workspace cycling, resizing and theme controls. Ctrl chords require a suitable external keyboard; menu actions are also available.
Q20 keyboard / trackpad / touchscreen
│
BB10 / QNX native host
input · lifecycle · rendering
│
PocketJS / QuickJS + native renderer
TypeScript / Solid JSX desktop
│
Native C bindings
┌────────────┼─────────────┐
PTYs files/processes HTTPS child transport
│ │ │
BerryCore local tools DeepSeek API
The UI is written in TypeScript and Solid JSX and compiled for PocketJS's native renderer. The desktop and live UI do not use a DOM. Web content is rendered separately by BB10 WebKit into textures clipped to Browser tiles. Terminal and file operations use native APIs; DeepSeek requests use BerryCore's curl with certificate verification.
In 0.11, the agent reads the actual 720×720 framebuffer, including native controls and web textures. Every visual action returns a new observation; coordinate actions require a current screenshot ID. Up to two image observations are retained in volatile request context; image bytes are not saved in chat history. Verification and local control API.
The built-in agent can use run_shell, read_file, write_file, desktop, herdr, browser, screen and native_ui. Commands run with the app's permissions and return their actual output and exit status. The desktop tool can open/focus/close panes, change workspaces and splits, and adjust supported theme settings. Stop cancels an active request and its command process.
In herdr, ask “把原生预览标题改成你好,强调色改成绿色,保留计数按钮并应用”. The agent reads the device workspace’s ui.js, edits the source, and opens its live PocketJS preview. native_ui apply waits for native frame presentation before reporting success. Invalid source retains the last accepted view; Undo restores the previous source. See the live native UI guide.
API credentials are provisioned separately in private application data. They are not included in the source, UI assets or BAR. Chat, tool results and foreground OmaBerry screenshots needed for a task are sent to the configured DeepSeek service; the desktop, terminal and file browser work without an AI connection.
This is a development build for a BB10 device with BerryCore installed. The build has been exercised on macOS with Bun, Python 3, Git, Rust and Docker. PocketJS and the BBNDK container are pinned.
git clone https://github.com/EazyLee30/omaberry.git
cd omaberry
python3 scripts/native.py prepareFollow the toolchain setup and device installation guide before the first build, then run:
python3 scripts/native.py buildOutputs:
out/native/pocketjs-blackberry-classic-hero.bar— native BB10 application.out/native/build-receipt.json— build identity and artifact hashes.
The filename and package ID retain the PocketJS development identity so existing app data survives updates. The installed application is named OmaBerry and uses the green OmaBerry icon. Install the BAR with a working BB10 deployment path, allow Shared Files when prompted, and launch it from its phone icon.
See native development for private DeepSeek configuration, source layout, build prerequisites and checks. No browser installation step is involved.
The embedded browser uses BB10’s system WebKit, not BerryBrowser’s Chromium engine. Modern JavaScript, CSS, TLS or certificate requirements can exceed its capabilities. Four browser pages can be open at once; they share the desktop’s sixteen-window limit.
Basic webpage text fields use an isolated DOM text-commit bridge. Cross-origin frame editing, custom keyboard-driven editors, downloads, popups and system form dialogs are not covered. Fixed-width sites may still need wider tiles.
This is an independently implemented native adaptation of Omarchy and herdr, with further parity work ahead.
- Desktop layouts, herdr projects/sessions, browser URLs, live UI source/state, wallpaper and style persist across launches. Webpage DOM state is retained during workspace switches, but pages reload after a full app restart. Each chat saves up to 24 recent message excerpts (500 characters each). Shell processes and Notes remain tied to the app process; reopening a saved shell starts a new PTY.
- The terminal handles a basic monochrome VT subset. Alt + trackpad browses up to 600 retained lines. Full terminal emulation and arbitrary full-screen terminal programs are not yet covered.
- The built-in Pinyin composer is available in herdr. It does not switch the BB10 system input method.
- Current DSH, OpenCode and Pi are not yet full native QNX ports. The built-in DeepSeek agent is not DSH. See the runtime compatibility audit.
- One built-in agent task runs at a time. Upstream herdr's daemon, detached CLI/socket protocol, SSH host orchestration and external-agent detection are not implemented.
- Live
ui.jsmodules can change native component trees, button state and herdr theme colors. Recompiling the main TSX desktop, native C host or baked resource pack on the phone is not implemented. The agent also receives actual PNG framebuffer images after successful presentation and can visually check controls. Captures cover OmaBerry, including its embedded webpages; other phone applications are outside this interface. - The app runs within BB10; it does not install Hyprland or replace the phone OS.
The older web/, server/, sim/ and browser packaging scripts are retained as historical source. They are outside the active native runtime and build path. Development now targets native/ and scripts/native.py.
- PocketJS — native runtime and compiler, pinned to
3d0983769f62ac75bacd62b723c15202425b2dd1. - Omarchy and Omarchy Mobile — keyboard, menu, tiling and visual references.
- herdr — workspace and agent interface reference.
- Tokyo Liftoff — theme and wallpaper artwork. See the retained artwork credits and theme license.
- Noto Sans SC — common Chinese glyphs, under the included SIL Open Font License.
- BerryCore — the device's shell tools and HTTPS transport.
The OmaBerry logo is the project owner's supplied artwork, used consistently in the native top bar, menu, application icon and this README. Brand asset details.
OmaBerry code is MIT licensed. Third-party assets retain their own licenses and source attributions. Implementation and device verification history is recorded in NATIVE-MIGRATION.md.





