
Full-Stack Software Engineer @Microsoft · Self-Motivated Code Artist
Suzhou, China
Joined April 2022
- Tweets9.3K
- Following202
- Followers6.2K
- Likes24.3K
Menci 💖 retweeted
We have Omarchy running natively on my AYN Odin 2 Portal, and all the work is public! Nothing held back, PRs welcome, or take it and make it your own. 🎮🐧
Booting from internal UFS storage. Android userspace removed. No VM, no Android dual boot, and no microSD card involved in the installation.
The project is omarchy-mobile-odin2 (github.com/TechLuddite/omarc…).
Before the details: huge credit to @dhh (xitter.cf/dhh) and the Omarchy contributors, @simonschubert (xitter.cf/simonschubert) for omarchy-mobile/moarchy and the mobile keyboard, and the ROCKNIX and Pocknix communities for the handheld Linux work this builds on. Their work made this possible. Credits are right near the top of the README because they belong there.
The goal is a usable Omarchy handheld: a native desktop, touch controls, configurable gamepad shortcuts, a game library, and eventually the wider Odin hardware working properly.
This has been a hands-on, AI-assisted bring-up. I’m working with Codex, applying the evidence-and-verification approach from my SeeFix project: inspect the actual device, save the logs, check the hashes, use the camera when software access disappears, and distinguish a device that enumerates from hardware that actually works.
We started with USB, the hardware buttons, and recovery/bootloader access. No SD card to take the usual removable-media route.
Before replacing anything, we used Qualcomm EDL to capture the original base system, boot firmware and platform/calibration data. This is a base backup, rather than a clone of personal userdata. Seven image extents totaling 11.57 GiB, compressed to about 2.7 GiB; SHA256 checks, both GPT copies across all six UFS LUNs, 115 partition entries, and independent rereads of both ABL partitions and persist all passed. Restoration itself is still untested.
Then came a Portal-specific Linux RAM bootstrap, USB networking and SSH, followed by the native Arch Linux ARM/Omarchy filesystem. We replaced Android userdata with a 512 MiB FAT32 boot volume and an ext4 root, preserving the preceding firmware/calibration partition entries.
The former Android super partition became a read-only recovery filesystem with a second verified base-backup copy and native recovery images. The off-device backup remains the primary copy.
The installed stack uses pinned Omarchy 4.0.3, Simon’s mobile adaptations, the ROCKNIX Portal kernel/device tree/modules/firmware, and ROCKNIX ABL 1.1.8. Host-side build tooling uses Docker/QEMU; the handheld itself boots its own Linux kernel and runs the ARM userspace directly.
Getting a desktop on screen was only the beginning.
The bootloader menu offered USB, SD and Auto, rather than the “Internal” option described elsewhere. Auto worked, but we also had to explicitly select AYN Odin 2 Portal in the loader’s device-model menu. Otherwise: “device model not set.”
The screen initially came up upside down. Correcting display rotation still left touchscreen gestures rotated: a sideways swipe opened a panel that should respond to a vertical swipe. Matching the touchscreen transform to the display fixed that. The on-screen keyboard opens and dismisses, and I joined Wi-Fi directly from the handheld.
A Qt 6.12 Color-name collision also made the pinned mobile shell’s bar disappear. A compatibility adjustment restored its colors, clock, network and battery indicators.
Graphics are native too: EGL reports Freedreno FD740 and Vulkan reports Turnip Adreno 740. The panel is running at 120 Hz, rotated to landscape. Actual hardware rendering on the Portal.
One of the biggest usability lessons was the gamepad mapper.
A “press the keyboard shortcut you want” workflow is awkward when the device has no physical keyboard. So we adapted @pinku1 (xitter.cf/pinku1)’s Controller Control into a touch-focused Omarchy Gamepad Mapping fork: record a button or combo, pick an action from the live Omarchy shortcut catalog, then save. With more than 200 actions, that picker quickly needed search too.
The mapper passes 52 tests on the ARM handheld, including 44 upstream tests. Home is assigned to Terminal. Rear paddles and the broader physical-controller checklist still need verification.
The fork is public and linked from the main repo: omarchy-gamepad-mapping (github.com/TechLuddite/omarc…)
@btsouth (xitter.cf/btsouth)’s Omakade 1.16.1 is also installed from the signed ARM64 repository and opens in the native Wayland desktop. Its optional guide overlay needs compatibility work with our pinned shell, so that part is disabled. Launching games is still a separate acceptance step.
We also hit a serious boot-recovery hurdle after changes to the redundant boot chain. A microphone experiment’s reboot exposed it, but the loader rejected the unchanged, previously working boot image too. That mattered: the failure couldn’t simply be attributed to the new microphone routes.
Stock slot-A AVB metadata still described the Android system we had removed. Replacing it with reviewed native metadata for the unlocked loader restored image acceptance.
Then we hit a bug in our own recovery-image builder: FAT formatting on a host file defaulted to 512-byte sectors, while the Portal’s UFS exposes 4096-byte logical sectors. Linux refused to mount /boot.
We recovered through the saved RAM bootstrap, read the installed journal, rebuilt the FAT image with 4096-byte sectors, and verified the full device readback after repair.
Normal internal boot now reaches the desktop again. /boot mounts, Hyprland and the mobile shell run, USB SSH works, and systemd reports no failed services.
Upstream qbootctl marked the verified slot A boot successful; both GPT copies across all six LUNs passed the follow-up checks, with only the expected success flags and checksums changed.
We’ve also configured persistent, key-only user and root SSH over Wi-Fi, with local hostname discovery. Both logins passed while USB networking was disconnected in software, and root file-transfer round trips passed. Development and maintenance no longer depend on keeping the USB cable attached.
The microphone is the main unresolved hardware problem.
@peteonrails (xitter.cf/peteonrails)’ native ARM64 Voxtype build is installed, its release signature was verified, and a known speech file transcribes correctly in both the CLI and our touch-operated Microphone Check app. Live internal-microphone tests still produce no usable words.
The strongest lead is the WCD codec’s digital-microphone routing over SoundWire. We have experimental device-tree/UCM work to investigate, but it is rolled back from the current working configuration.
Back → dictation waits until actual voice capture passes. Noise processing can come afterward; first we need a working input signal.
Cold power-cycle acceptance, alternate-slot recovery, audible speaker/headphone tests, Bluetooth pairing, USB peripherals, paddles, haptics, fan/LED behavior and real suspend/wake still need work. This is a documented bring-up checkpoint. The installation tooling is specific to the captured Portal layout.
More shout-outs to the people and projects behind the README:
@viperbjk (xitter.cf/viperbjk) for EDL tooling; @armbian (xitter.cf/armbian), Armada and the Renegade Project for related native Odin installation work; Caleb Connolly, linux-msm, @linuxfoundation (xitter.cf/linuxfoundation), @linaroorg (xitter.cf/linaroorg) and @collabora (xitter.cf/collabora) for Qualcomm boot/recovery work and guidance; AOSP for AVB tooling; @lcMenci (xitter.cf/lcMenci), @docker (xitter.cf/docker) and QEMU for the ARM build foundations.
@Ayn_Loki (xitter.cf/Ayn_Loki) and the AYN UCM contributors, Teguh Sobirin, Philippe Simons and Luke Johnson for board, input and audio work. ROCKNIX and Shuuri Labs/Pocknix deserve another mention here too.
And the foundations underneath all of it: Arch Linux ARM, Linux/V4L2, Mesa/Freedreno/Turnip, ALSA, @PipeWireP (xitter.cf/PipeWireP) and WirePlumber, @hyprwm (xitter.cf/hyprwm), @outfoxxedd (xitter.cf/outfoxxedd) and Quickshell, @qtproject (xitter.cf/qtproject), @GTKtoolkit (xitter.cf/GTKtoolkit)/PyGObject, @FFmpeg (xitter.cf/FFmpeg), BusyBox, OpenSSH, NetworkManager, Avahi, dosfstools and mtools.
The main repo keeps the source revisions, original notices, installation/recovery tools, hardware checklist, failures and remaining gaps together. The mapper has its own fork and credits. Device images, credentials and raw captures stay private.
I wanted Omarchy on the handheld I already own. Now it boots natively, the desktop is usable by touch, and we have a recovery record to build from. Next: work through the hardware, one verified result at a time.
#Omarchy #Linux #AYNOdin2 #OpenSource
MCP 是个客户端到服务端的协议,客户端运行在用户电脑上,也就是说你想声明自己是什么客户端就可以声明自己是什么客户端,老一辈工程师个个都会 Mozilla/5.0,现在的人连抄客户端都不会抄了吗…
Replying to @dsp_
Hey David, Gayani here from Figma. You're right that our remote MCP server only accepts clients on our supported list, and Pi isn't on it yet. You can see the current list in our MCP catalog at figma.com/mcp-catalog. If you'd like Pi considered for a future addition, please fill out this form: forms.gle/qSvUawwznWyoj8Go7.
因为 Telegram 的 GitHubBot 不能忽略非主线分支的 push 事件,所以我写了一个通用的 webhook filter 服务部署到 Workers 上来解决这个问题。它可以接受来自白名单 repo 的 webhook 事件,使用任意 JSONata 表达式过滤后,原样转发到原本的目标地址。
Made By Human
github.com/Menci/webhook-fil…
Menci 💖 retweeted
经常听到有人说,
“我们人太少了,所以来不及 xxx,赶紧上吧”
“太 rush 了,别 xxx 了,直接上”
“我们是小公司,没必要那么讲究,直接上”
但我的理解恰恰相反,分享一个小故事
大一的时候,高级程序设计的老师推荐我们买显示器,然后说“如果你比较有钱,那就买二手的;如果你没钱,你就买全新的”,这与大家常规理解有点相反
老师说:“显示器坏掉的话,维修成本非常高。
如果你有钱,你买二手的,坏了就再买一个,你可以用自己的钱去承担这个风险;
如果你没钱,那你是承担不起这个维修风险的,那就买全新的,多花钱,用官方保修来替你承担这个风险”
我觉得这是那节课我学到最有意思的东西。
所以我在读书的时候,没啥钱,所有 apple 设备都会买 ac+,因为我承担不起我主力设备坏掉的风险。🤣而且学生党时间多,稍微有点问题都能去骚扰天才吧去修。(而且遇到过,屏幕连续三次出了问题,直接给我从 2016mbp,换新成 2019mbp。可惜当时 mbp 性能太差了,三年没啥提升)
现在自己有工资了,所有设备就不买 ac+ 了,自己能承担坏掉的风险,并且也没多少时间去大老远跑去维修
扯远了,回到最初的问题。
如果时间宽裕,或者团队大/资源多,是完全可以不验证上一些事情的,因为输得起。就像很多公司会内部赛马,或者上很多实验性项目。
但如果时间急迫,团队小/资源少,反而应该挤出一点时间去做验证,至少跑通 happy path。因为输不起,对很多小公司来说,一次重金投入的实验失败,基本等于倒闭
类似的 meta idea 在生活中用到的地方很多
- 我 出国/租车 基本都会买保险。同样是因为我不算有钱,我需要用保险替我承担风险
- 有钱人的豪车反而不会买保险。因为豪车太多且豪车保险贵,有钱人完全可以用自己的资金去承担风险。




















