Repository navigation
Releases
RexPocket 0.0.12
- Key row: hold an arrow to repeat; long-press ctrl for a chord panel (C-c, C-d, C-z, C-r, C-l, C-a, C-e, C-w, C-j); new shift and alt modifiers (tap once for the next key, double-tap to lock); C-c is always labelled C-c.
- Links: tap a URL in the terminal to open, copy or share it.
- Background alerts (optional, in Settings): a notification when a program in a pane blocks on a permission prompt or hits an error, and tapping it jumps to that pane.
- Faster recovery: a pane resumes right after the app returns to the foreground; reconnects no longer fail with "protocol error"; a tailnet host waits for its peer before dialing, which avoids the first-connect SOCKS error.
- Smoother typing and scrolling: consecutive terminal writes are coalesced.
- New icon: 袖里乾坤, the sleeve from Journey to the West that holds a whole world, with a themed monochrome layer.
简体中文
- 快捷键栏:长按方向键可连发;长按 ctrl 弹出组合键面板(C-c、C-d、C-z、C-r、C-l、C-a、C-e、C-w、C-j);新增 shift 和 alt 修饰键(单击作用于下一个键,双击锁定);C-c 始终显示为 C-c。
- 链接:点击终端里的 URL,可以打开、复制或分享。
- 后台提醒(可选,在设置中开启):pane 里的程序卡在权限确认或出错时发出通知,点击直接跳到该 pane。
- 恢复更快:应用回到前台后 pane 立即恢复;重连不再报 "protocol error";tailnet 主机会等对端就绪后再连接,避免首次进入时出现 SOCKS 报错。
- 输入和滚动更流畅:连续的终端写入会合并发送。
- 新图标:袖里乾坤,取自《西游记》中能装下一方天地的袖子,并带有主题单色图层。
ARM64 only. Signed with the Android debug key; installs over 0.0.11.
RexPocket 0.0.11
One key row, ordered for the thumb.
- The keys a phone needs most come first. The row now starts with
esc,C-c(Stop while the program works or waits) and the four arrows, then Tab, paste and/;ctrl,C-d,C-z,C-land copy follow when you scroll. - No second arrow pad. The separate arrow pad and the key that opened it are gone: the arrows were already in the row, and Return is on the dock.
ARM64 only. Signed with the Android debug key; installs over 0.0.10.
简体中文
只留一排快捷键,按手指最顺手的顺序排。
- 最常用的键放在最前面。 按键行现在以
esc、C-c(程序运行或等待时显示为“停”)和四个方向键开头,接着是 Tab、粘贴和/;ctrl、C-d、C-z、C-l和复制在滑动后可见。 - 去掉了重复的方向键盘。 单独的方向键盘和打开它的按键已移除:方向键本来就在按键行里,回车也在底部 dock 上。
仅 arm64。使用 Android 调试密钥签名,可覆盖安装 0.0.10。
RexPocket 0.0.10
See what runs in every tab, open it fast, and leave the desktop where it is.
- Program tiles. Every tab, the top bar and the pane bar show what runs in the pane: pi, Claude, Codex, Gemini, Cursor, opencode, Copilot, Vim, Emacs, Docker, Node, Python, Git, ssh or top each get their own mark; a shell keeps the terminal tile; anything else shows its initial. An agent started through node is still recognised by the name it was started as. The marks are the app's own drawings.
- Program titles. A tab you never named takes the title its program set, such as
π - rexpocket, then the program's name. Titles a shell writes - its next command,user@host:dir- are left out. - The phone keeps its own tab. Switching tabs or panes, and making a tab or a split, happen on the phone only; the desktop stays on its tab, and the phone does not follow it either. The phone on one tab and the desktop on another each keep their own pane instead of taking it from each other and resizing it back and forth.
- Faster to open. Calls on the connection no longer wait behind each other, the pane's stream is asked for at once, and a tab opens in one call. Program status, titles and directories arrive as Rex's events instead of being polled, so an idle connection stays quiet. On a tailnet relay close by, a tab opens in well under a second.
- A new README, describing the app as it is: features, setup on the computer and the phone, how it works, and how to get a faster tailnet path.
ARM64 only. Signed with the Android debug key; installs over 0.0.9.
简体中文
每个标签里跑的是什么一眼可见,打开更快,也不会再把桌面拖走。
- 程序图标。 主页的标签行、终端顶栏和窗格切换条都会显示窗格里跑的程序:pi、Claude、Codex、Gemini、Cursor、opencode、Copilot、Vim、Emacs、Docker、Node、Python、Git、ssh、top 各有自己的图标;shell 仍是终端图标;其他程序显示首字母。通过 node 启动的 agent 也能按启动名认出来。图标都是 App 自己画的。
- 程序标题。 没起过名字的标签,会用程序设置的标题,比如
π - rexpocket,没有标题时用程序名。shell 写进标题的内容(它正在执行的命令、user@host:目录)不会拿来当标签名。 - 手机有自己的标签。 切标签、切窗格、新建标签或分屏都只发生在手机上,桌面停在它自己的标签,手机也不会跟着桌面走。手机和桌面各在一个标签时,各自守着自己的窗格,不会再互相抢、来回改尺寸。
- 打开更快。 连接上的请求不再互相排队,画面流立刻申请,打开一个标签只要一次调用。程序状态、标题和目录改成由 Rex 推送事件,不再轮询,连接空闲时没有多余流量。走就近的 tailnet 中转时,打开一个标签远不到一秒。
- 重写了 README,按 App 现在的样子介绍:功能、电脑和手机端的设置、工作原理,以及怎么让 tailnet 更快。
仅 arm64。使用 Android 调试密钥签名,可覆盖安装 0.0.9。
RexPocket 0.0.9
One list down to the tab, and a terminal screen that looks like it belongs on Android.
- The home lists hosts, the sessions under them, and each session's tabs. A session line has its tab count, a plus that makes a tab in it, and a fold. Tapping a tab attaches the session and focuses that tab; on a host that is not connected, it connects first.
- The eye is an activity filter: it keeps only the sessions and tabs with a pane that is working or waiting for you. A blue dot on a tab's tile means the same thing.
- Search filters hosts, sessions and tabs. It is the platform's search bar, with back and clear, and the system Back closes it first.
- The terminal screen is on the terminal's own paper. The top bar floats over it: back, the tile, the tab with its directory, and the session. Tap the title block for the session's tabs and panes, with the session list at the top.
- On a split, a pane bar floats under the pane with one segment per pane. Tap a segment, or swipe the pane left and right.
- The dock is one pill and one circle: keyboard (keyboard-hide while it is up), Return, the keys, and a new tab. The key pad opens on demand and uses symbols for arrows, Tab, paste and copy, with chords such as
C-cin monospace. - The menu puts Release / Take over first and says who holds the pane now (this phone or the desktop). The pane, tab and session actions each have an icon.
- Every icon is now Material Symbols Rounded, and everything tappable is at least 48 dp. Rows, sheets and the page margin follow the platform's sizes and keylines.
- The app follows the phone's light and dark appearance. At night, floating controls use a lighter fill and a thin edge instead of a shadow.
- The README's acknowledgements now list Rex (Superlogical), libghostty-android and sing-box/libbox (SagerNet), Ghostty, and Material Symbols (Google, Apache 2.0).
Breaking: the separate session picker is gone. Sessions and tabs are opened from the home.
ARM64 only. Signed with the Android debug key; installs over 0.0.8.
简体中文
主页一直列到标签页,终端页改成了符合 Android 规范的样子。
- 主页按主机、会话、标签页三层列出。会话那一行带标签页数量、新建标签的加号和折叠箭头。点标签页会挂上会话并聚焦到这个标签;主机还没连接时会先连接。
- 眼睛按钮是活动过滤:只保留有窗格正在运行或在等你回应的会话和标签。标签图标上的蓝点也是这个意思。
- 搜索可以过滤主机、会话和标签页。用的是系统风格的搜索栏,带返回和清除,按系统返回键会先关掉搜索。
- 终端页整页用终端自己的底色,顶栏浮在上面:返回、终端图标、标签名和目录、会话。点标题那一块打开当前会话的标签与窗格,会话列表在最上面。
- 分屏时,窗格下面浮着一条窗格切换条,每个窗格一段。点某一段,或在窗格上左右滑动来切换。
- 底部 dock 是一个胶囊加一个圆形按钮:键盘(弹出时变成收起键盘)、回车、按键,以及新建标签。按键面板按需打开,方向键、Tab、粘贴、复制用图标,
C-c这类组合键用等宽字体。 - 更多菜单把交还 / 接管放在第一项,并写明窗格现在在谁手上(这台手机或桌面端)。窗格、标签、会话的操作都配了图标。
- 图标全部换成 Material Symbols Rounded,所有能点的地方都不小于 48 dp。行高、面板和页边距按平台规范统一。
- 跟随手机的浅色 / 深色模式。夜间浮动控件不靠阴影,改用更亮的底色加细边来区分。
- README 的致谢现在列出 Rex(Superlogical)、libghostty-android 和 sing-box/libbox(SagerNet)、Ghostty,以及 Material Symbols(Google,Apache 2.0)。
破坏性变更:独立的会话选择页已移除,会话和标签页都从主页打开。
仅 arm64。使用 Android 调试密钥签名,可覆盖安装 0.0.8。
RexPocket 0.0.8
A new interface, and a Release that means what it says.
- The UI is rebuilt after the phone terminal design it follows: light paper, a dark terminal tile, a header that names the tab and its directory, and a white dock under the pane holding the session's tabs, the layout button and the plus.
- The key row sits at the foot - 44 dp keys above the keyboard, with the keyboard key pinned outside the scroll. The shown tab is a rule under its name, and a split becomes a pager: dots under the terminal, and a horizontal swipe on the pane moves between them.
- Typing goes straight into the pane. The composer is gone: tapping the terminal raises the IME,
⏎presses Enter,/opens pi's command menu.Ctrlnow applies to the next key in the row; the per-pane drafts and the sent-line history went with the box. ReleaseandTake overare per pane. Release hands the pane to the desk, stops applying the phone's size and disables the take-back loop; it survives switching tabs and sessions, and onlyTake overends it.own_blockanddisown_blockare serialized, so a take in flight cannot undo a release.- Home, the session list, the sheets and the dialogs are on the same light material, and the system bars follow.
- The README credits the design and the libraries: shulhi's original phone terminal UI; Rex by Superlogical; libghostty-android and sing-box/libbox by SagerNet; Ghostty by Mitchell Hashimoto and its contributors.
Breaking: the composer, its drafts and the header's back chevron are gone (the system back gesture and the menu's Hosts entry remain).
ARM64 only. Signed with the Android debug key; installs over 0.0.7.
简体中文
新界面,以及一个说到做到的“交还”。
- 按参考的手机终端设计重做了界面:浅色纸面、深色终端图标,顶部写标签名和目录,窗格下面是白色 dock,装着会话的标签、布局按钮和加号。
- 按键行在底部,44 dp 的键紧贴键盘上方,键盘键固定在滚动区右侧。当前标签用名字下的一条蓝线标出;分屏变成一个分页器——终端下面的圆点,以及在窗格上左右滑切换。
- 输入直接进窗格。输入框已移除:点终端拉起输入法,
⏎回车,/打开 pi 的命令菜单。Ctrl现在作用于按键行里下一个按下的键;每个窗格的草稿和发送历史随输入框一起移除。 交还和接管是按窗格的。交还后窗格归桌面,手机不再改它的尺寸,取回循环停止;切标签、切会话再回来仍然保持,只有接管会结束它。own_block/disown_block串行化,正在进行的接管不会撤销一次交还。- 主机、会话列表、弹层和对话框都换成同一套浅色材质,系统栏跟随。
- README 增加了致谢:shulhi 的原始手机终端 UI;Superlogical 的 Rex;SagerNet 的 libghostty-android 与 sing-box/libbox;Mitchell Hashimoto 及贡献者的 Ghostty。
破坏性变更:输入框、草稿和顶部的返回箭头已移除(系统返回手势和菜单里的 主机 仍可用)。
仅 arm64。使用 Android 调试密钥签名,可覆盖安装 0.0.7。
RexPocket 0.0.7
The screen is streamed now, and the app tells you what it is doing.
- The terminal no longer polls. Rex streams the pane (
/api/data), starting with a snapshot of the whole terminal - scrollback, colours, cursor - and then its output as it comes, so an idle pane costs nothing: 2 CPU ticks and 0.3 KB per 20 seconds on the phone, against 107 ticks and 500 KB before. A pane with 7 MB of history is read once, on open. - A dropped stream resumes where it stopped, and when Rex cannot resume it the pane starts over from a fresh snapshot.
- Keystrokes, pastes and typed lines keep the order they were typed in; before, text typed in the terminal view could overtake a toolbar key (a live run sent
4567and the shell got4657). - Nothing is polled while the app is in the background, and the storage no longer writes on every screen frame (25 writes while 40 lines printed became none).
- Failures say what happened in the app's words - unreachable, timed out, dropped, refused by Rex, tailnet not joined - with Retry now on both screens, and a default-network change redials at once. A host that accepted the connection but never answered now keeps retrying instead of giving up for good.
- New session waits for Rex to create it before switching; a tap on the list while the connection is still coming up waits for it and says Opening; the cached list is drawn; creating a session no longer crashes the list.
Ctrlapplies to the next character typed in the composer; each pane keeps its own draft, and sent lines can be recalled with a hardware keyboard's arrows.- The Tailscale row no longer says Stopped while the node is starting or after a start failed; a start stuck on libbox's cache file now recovers by itself, and the reason is one tap away.
- A pane with no picture yet says Reading the screen… instead of showing a black rectangle, and offers Retry after a while.
- A pane the desktop takes back is taken back by the phone, so it is no longer drawn at the desktop's width with its right side cut off (#2).
RexApp.kt(2083 lines) is split by screen; the app's colours, sizes and radii are used directly fromTheme.kt.
New application id: me.leaver.rexpocket. This is a separate app, not an upgrade: the old app.rexpocket stays installed with its own hosts, and this one starts empty. Hosts, remembered panes and the tailnet login carry over only if they are copied into the new package (the tailnet login lives in files/tailscale, hosts in shared_prefs/rexpocket.xml).
ARM64 only. Signed with the Android debug key.
简体中文
屏幕改成推流了,App 也会把状态说清楚。
- 终端不再轮询。Rex 通过
/api/data推流:先给一份整个终端的快照(回滚、颜色、光标),之后按到达顺序推输出,静止的窗格不花任何代价 —— 手机上每 20 秒 2 个 CPU tick、0.3 KB 流量,之前是 107 tick 和 500 KB。7 MB 历史的窗格只在打开时读一次。 - 断流会从断点续传;Rex 无法续传时,窗格用一份新快照重新开始。
- 按键、粘贴、输入的行严格按输入顺序发出;之前终端里直接打的字会超过工具栏按键(实测发出
4567,shell 收到4657)。 - App 在后台时不再轮询,存储也不再每帧写一次(打印 40 行写 25 次变成 0 次)。
- 失败用 App 自己的话说明 —— 连不上、无响应、连接断开、Rex 拒绝、未加入 tailnet —— 两个页面都有 立即重试,网络切换会立刻重连。之前"接受了连接但不响应"的主机会让重试彻底停止,现在会继续重试。
- 新会话等 Rex 建好再跳转;连接还没就绪时点列表会等待并显示 正在打开;缓存的会话列表真的会画出来;新建会话不再让列表崩溃。
Ctrl对 Composer 里输入的下一个字符生效;每个窗格保存自己的草稿,发过的行可以用外接键盘的上下键翻出来。- Tailscale 行在节点启动中或启动失败时不再显示 已停止;libbox 缓存文件卡住导致的启动失败现在能自愈,具体原因点进去就能看到。
- 还没收到画面的窗格会显示 正在读取画面…,不再是一片纯黑,等久了给出重试。
- 桌面端把窗格抢回去后,手机会重新取回,不再按桌面宽度显示、右侧被裁掉(#2)。
RexApp.kt(2083 行)按页面拆分;颜色、字号、圆角直接用Theme.kt。
应用 ID 改为 me.leaver.rexpocket。 这是另一个应用,不是升级:旧的 app.rexpocket 会保留并带着它自己的主机,新包是空的。主机、记住的窗格和 tailnet 登录只有拷贝到新包之后才会带过去(tailnet 登录在 files/tailscale,主机在 shared_prefs/rexpocket.xml)。
仅 arm64。使用 Android 调试密钥签名。
RexPocket 0.0.6
A design pass, and two things that made it feel slow.
- One design system for the three screens: a single paper and signal colour, four type sizes, one spacing scale, locked in design.md. The tracked-caps eyebrow is gone, middle-dot meta strings became separate runs of text, the tailnet is a line of state instead of a card with a dot, chips lost their decorative dots, and the mono face is kept for addresses and figures.
- Leaving the session list no longer blocks: the teardown used to wait up to four seconds on the main thread for a disown round trip. Back is instant now (250 ms after the tap the host list is drawn; before, it was still the session list).
- The session list is cached per host and drawn immediately, then replaced by the live one: under 350 ms to a full list instead of about 1.2 s.
- A failing retry no longer flashes an error for a second and a half; errors are shown once they settle, or immediately when the connection gives up.
- Connection timings are logged (
RexPocketConn: first live after N ms, N sessions after N ms) so tailnet latency stays measurable.
ARM64 only. Signed with the Android debug key; installs over 0.0.5.
RexPocket 0.0.5
Cleaner home screen, and one way for a row to open.
- The home screen says what the app can do now: your network or the built-in Tailscale node. The tailnet row is a slim outlined strip with the node name and its state, so the phone's own node no longer looks like one of the hosts, and the host list has its own caption.
- Hosts and sessions are drawn by the same card: the whole row opens the thing. The label on the right ("Enter" for a session, "Edit" for a host) is only its own target where it does something else.
- The tailnet node stays joined while you are in a host on the local network, so the home screen no longer shows it stuck on "starting".
- A session that Rex lists twice no longer crashes the list, and a failure while stopping the tailnet node can no longer take the app down.
- Tab and pane rows keep the chip in use in the middle, fade the edge that continues, and keep the + fixed on the right.
ARM64 only. Signed with the Android debug key; installs over 0.0.4.
RexPocket 0.0.4
Built-in Tailscale, and a simpler way to add a host.
- The
Tailscalerow on the home screen joins the tailnet: fill in this phone's node name and save. The app starts its own node and opens the authorization page in a browser when the node still needs a login; the login stays in the app. No auth key to paste. - A host is now a name and an address. The port, plaintext or TLS and whether it goes through Tailscale are worked out from the address: a
.ts.netname, a100.xaddress or a Tailscale IPv6 address goes through the node over TLS on 443, anything else is plaintext on 7297, and an explicit scheme or port wins. The line under the field shows the result. - Adding a tailnet address before joining shows a note in the dialog; tap it to join, and the host is saved either way.
- Dialog text fields take focus on a tap, and a field that opens focused has its text selected.
ARM64 only: the Tailscale library ships for arm64-v8a. Signed with the Android debug key, installs over 0.0.3.
RexPocket 0.0.3
Send now always presses Enter.
Sendwith an empty composer presses Enter alone, so a full-screen program such as pi confirms the item its menu has selected- The keyboard send key runs the same path; the composer is single line, so the IME offers send instead of a newline
- Committed newlines are dropped instead of riding along with the text
The toolbar Esc, Tab, arrows and / still go to the program in the pane, so / opens pi's command menu; typing /model in the composer and sending it works too.
Signed with the Android debug key; installs over 0.0.2.