<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: RYO ITABASHI</title>
    <description>The latest articles on DEV Community by RYO ITABASHI (@ryoitabashi).</description>
    <link>https://dev.to/ryoitabashi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3861198%2F30a637f3-e537-4353-8c4f-6421e249bf22.jpg</url>
      <title>DEV Community: RYO ITABASHI</title>
      <link>https://dev.to/ryoitabashi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ryoitabashi"/>
    <language>en</language>
    <item>
      <title>I Still Can't Write Code. But My Phone Now Wakes Itself Up at 8am to Run an Agent I Registered From a Home Screen Widget.</title>
      <dc:creator>RYO ITABASHI</dc:creator>
      <pubDate>Fri, 31 Jul 2026 09:09:16 +0000</pubDate>
      <link>https://dev.to/ryoitabashi/i-still-cant-write-code-but-my-phone-now-wakes-itself-up-at-8am-to-run-an-agent-i-registered-from-2bk4</link>
      <guid>https://dev.to/ryoitabashi/i-still-cant-write-code-but-my-phone-now-wakes-itself-up-at-8am-to-run-an-agent-i-registered-from-2bk4</guid>
      <description>&lt;h2&gt;
  
  
  Since the last post, the agent stopped waiting for me
&lt;/h2&gt;

&lt;p&gt;Last time, the AI moved into the OS: an Agent Chat pane that reads Codex events live, a Scouter widget on the home screen with quota bars and a compose box, per-category notification channels, and a Z Fold that finally survives being folded.&lt;/p&gt;

&lt;p&gt;All of that shared one assumption I didn't notice until later. Every one of those features only did something while I was looking at the phone. The widget showed me state. The chat pane showed me state. The notification told me something had already happened. Shelly had become a very good window onto a process that still needed me to start it.&lt;/p&gt;

&lt;p&gt;So the next question was obvious and I'd been avoiding it: what does it take for the agent to run when I'm asleep?&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a class="mentioned-user" href="https://dev.to/agent"&gt;@agent&lt;/a&gt;, AlarmManager, and Doze
&lt;/h2&gt;

&lt;p&gt;You write this into the Ask box, in ordinary English:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@agent every day at 8am summarize the news and notify me
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What happens next is the part I care about. Shelly does not spin up a cron daemon. It does not keep a foreground service alive to poll a clock. It registers a real Android alarm through AlarmManager, using &lt;code&gt;setExactAndAllowWhileIdle&lt;/code&gt;. AlarmManager is the OS's own scheduler — the same one your alarm clock app uses — and it fires through Doze. Screen off, app swiped away, phone face down on the nightstand. At 8am the agent wakes up, runs with your API keys and your tools, and posts the result to your notification shade.&lt;/p&gt;

&lt;p&gt;The parser argues back. If the request is vague, it doesn't ask for a time first, which is what every scheduling UI I've ever used does. It asks what. "Summarize the news" is not a task; "summarize the Hacker News front page and my starred RSS feeds" is. Getting the noun right before the clock turned out to matter far more than I expected, because a scheduled agent that fires perfectly on time and produces mush is worse than no agent at all — it produces mush every morning forever.&lt;/p&gt;

&lt;p&gt;The honest caveat. Exact alarms through Doze are an OS contract, and Android OEMs have a long, ugly history of quietly breaking that contract with their own battery optimizers. On my Fold it fires. On a device from a manufacturer that aggressively kills background work, your mileage may genuinely vary, and there is nothing an app can do about that beyond asking to be exempted. There's a smaller version of the same problem inside the app: if the exact-alarm permission isn't granted, or you're on a pre-Android-12 device, it falls back to an inexact alarm — it still fires, just not necessarily at 8:00:00. I'd rather say that plainly than pretend the schedule is bulletproof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the results go
&lt;/h2&gt;

&lt;p&gt;A notification is fine when you're holding the phone. It's useless when the point was that you weren't.&lt;/p&gt;

&lt;p&gt;So the run result can be delivered somewhere that outlives the notification shade. An Obsidian draft, if you want it to land in your notes. Or straight out to Bluesky, Discord, Slack, Telegram, Mastodon, Misskey, or WordPress. Or to a generic webhook if you want to route it yourself.&lt;/p&gt;

&lt;p&gt;What's actually proven. Bluesky is verified end to end — a scheduled agent fired, composed, and posted to a real account, no human in the loop. The other six social and publishing connectors ride the same dispatch code path and are wired the same way, but I have not individually fired each one against a live account yet. I'm telling you which one I watched work rather than listing seven and letting you assume.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agents learned to remember
&lt;/h2&gt;

&lt;p&gt;A scheduled agent that starts from zero every morning is a very expensive cron job. So there are three layers of memory now, and they're deliberately separate.&lt;/p&gt;

&lt;p&gt;Execution memory is per-agent. The agent remembers what it produced last time and can recall it on the next run, so "summarize the news" can become "summarize what's new since yesterday" without you restating yesterday.&lt;/p&gt;

&lt;p&gt;Skills are the layer I didn't expect to like as much as I do. When a multi-step run succeeds, the sequence gets saved as a recipe. The next time a similar task comes along, that recipe is reused automatically instead of the agent rediscovering the same five steps from scratch. It's the difference between an assistant who's been here a week and one who started this morning.&lt;/p&gt;

&lt;p&gt;Shared memory is context visible to every agent, and it's the one I put a fence around. Writing to it requires an explicit trigger, and the write doesn't land until you confirm it. Cross-agent state that any agent can silently mutate is a great way to poison every agent at once, and you don't find out until every agent is already wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unattended mode is deliberately underpowered
&lt;/h2&gt;

&lt;p&gt;This is the design decision I expect to get the most pushback on, so let me state it directly.&lt;/p&gt;

&lt;p&gt;By default, an agent running unattended can only use Codex and local tools. It cannot reach for your Gemini key or your Perplexity key while you're asleep. If you want that, there's a setting called Autonomous Cloud; it's off by default, and you have to go turn it on yourself.&lt;/p&gt;

&lt;p&gt;Outbound network calls can be routed through a capability broker with an egress allowlist — not a warning dialog, not a log line after the fact, but an allowlist the call has to pass before it leaves the device. Being straight about its status: the broker is a strangler seam that's live and enforced automatically whenever a run has touched untrusted, web-derived content, and available behind a flag otherwise. It is not yet the unconditional path for every outbound call. That's the next thing I want to close, not something I'm going to describe as finished.&lt;/p&gt;

&lt;p&gt;The whole point of an autonomous agent is that it acts without asking, and every restriction I just described makes it feel less autonomous. I made the trade anyway. An unattended process holding your cloud credentials, running on a schedule you set three weeks ago and forgot about, with unrestricted network egress, is not a feature — it's a machine for turning one bad prompt into a bill and a data leak. I'd rather ship something that feels slightly reluctant and is safe to leave running.&lt;/p&gt;

&lt;h2&gt;
  
  
  The widget became a registration terminal
&lt;/h2&gt;

&lt;p&gt;The Scouter widget from the last post was a monitor with a compose box. It showed you Codex state and let you send a prompt.&lt;/p&gt;

&lt;p&gt;Then it grew a launchpad: one-tap RUN buttons for agents you'd already registered, right on the home screen, no app launch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffw4m8k71s1xl84epz8nq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffw4m8k71s1xl84epz8nq.jpg" alt="Home-screen Scouter widget showing a registered agent, its next run time, and RUN and ASK buttons" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And then, most recently, it stopped being only a launchpad and became a registration point. You can type &lt;code&gt;@agent ...&lt;/code&gt; directly into the widget's ASK box — or just talk to it — and register a brand-new agent from the home screen. It joins the exact same confirmation flow you'd get typing into the AI pane, same card, same wording, no separate half-implemented widget path to drift out of sync.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn1ln70vqybcs4d9woq6y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn1ln70vqybcs4d9woq6y.jpg" alt="Agent registration confirmation card in the AI pane, shown over the on-screen keyboard" width="800" height="876"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's an opt-in setting called Widget No-Confirm Register, off by default, which skips the confirmation and registers immediately with a notification after the fact. It's scoped to commands that came from the widget — typing &lt;code&gt;@agent&lt;/code&gt; in the AI pane still gets the card either way, so the escape hatch can't quietly widen into a global one. That one is for when you've done it fifty times and the card has become friction rather than a safeguard.&lt;/p&gt;

&lt;p&gt;This is verified on-device, both states, including the behavioral difference between the setting on and off. Registering an agent that will wake the phone up tomorrow morning, from a widget, without opening the app, is my favorite thing in this release.&lt;/p&gt;

&lt;h2&gt;
  
  
  One CLI, many chats
&lt;/h2&gt;

&lt;p&gt;Time for a correction that cuts against something I've said before.&lt;/p&gt;

&lt;p&gt;The only first-class CLI integration now is Codex. A real CLI binary, running natively in the terminal. The Claude Code CLI and Gemini CLI integrations were removed. Claude Code is being brought back on a branch that hasn't merged, and I'm not going to be coy about why: &lt;code&gt;claude -p&lt;/code&gt; still SIGSEGVs in its deep path, and I'm not shipping a CLI that segfaults so I can keep a longer feature list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwqknth34pftnn682u5ge.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwqknth34pftnn682u5ge.jpg" alt="OpenAI Codex CLI running natively in the Shelly terminal on Android" width="800" height="876"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meanwhile the AI pane went the other direction. Chat-style AI now reaches Gemini, Cerebras, Groq, Perplexity, OpenRouter (new), and local models through llama.cpp — Qwen3.5-2B Q4_K_M is what I actually use day to day on-device. You pick between them with an &lt;code&gt;@mention&lt;/code&gt; mid-conversation.&lt;/p&gt;

&lt;p&gt;The reorganization comes down to this: one CLI, made robust. Chat AI, given more options rather than fewer. Those two surfaces have completely different failure modes. A CLI that breaks takes your terminal with it. A chat backend that breaks means you &lt;code&gt;@mention&lt;/code&gt; a different one and keep going.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabs are gone
&lt;/h2&gt;

&lt;p&gt;The old UI was tabs. It isn't anymore.&lt;/p&gt;

&lt;p&gt;Everything now lives in one ShellLayout: an AgentBar across the top, a Sidebar on the left, the pane container in the middle, and a ContextBar along the bottom showing cwd, git branch, and connection state. There are seven pane types — Terminal, Agent Chat, AI, Browser, Markdown, Preview, and Ask — and they split and resize freely, up to four at once on the unfolded display.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhizhnwj2h05fdjfty37m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhizhnwj2h05fdjfty37m.jpg" alt="Four-pane unfolded layout on a Galaxy Z Fold6: Terminal, AI pane, Browser, and Preview side by side" width="800" height="872"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tabs made sense when the terminal was the app and everything else was a detour. Once the agent, the chat, and the output preview all needed to be visible at the same time, tabs were just a way of hiding two-thirds of the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I still can't do
&lt;/h2&gt;

&lt;p&gt;Write production-grade Kotlin. Reason about AlarmManager's exact-alarm permission model without reading the docs three times and still getting it wrong once. Predict which OEM will decide my alarm is a battery threat.&lt;/p&gt;

&lt;p&gt;What I can do is describe the shape of an autonomous system in plain English, insist on the safety fence before the feature, and refuse to ship the segfaulting one.&lt;/p&gt;

&lt;p&gt;The agent used to be something I opened. Now it's something that opens by itself, at 8am, and tells me what it found.&lt;/p&gt;

&lt;p&gt;GitHub: github.com/RYOITABASHI/Shelly — GPLv3. Issues, corrections, and "your alarm doesn't fire on my phone" reports are all genuinely welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>android</category>
      <category>opensource</category>
      <category>agents</category>
    </item>
    <item>
      <title>I Still Can't Write Code. But Now Codex Lives on My Home Screen and in a Split Pane — Same APK, No Termux.</title>
      <dc:creator>RYO ITABASHI</dc:creator>
      <pubDate>Mon, 15 Jun 2026 13:25:31 +0000</pubDate>
      <link>https://dev.to/ryoitabashi/i-still-cant-write-code-but-now-codex-lives-on-my-home-screen-and-in-a-split-pane-same-apk-no-248c</link>
      <guid>https://dev.to/ryoitabashi/i-still-cant-write-code-but-now-codex-lives-on-my-home-screen-and-in-a-split-pane-same-apk-no-248c</guid>
      <description>&lt;p&gt;&lt;em&gt;Since the last post, the app grew into the OS.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem I Kept Running Into
&lt;/h2&gt;

&lt;p&gt;The last post solved the terminal problem: native PTY, zero IPC, tools in the APK.&lt;/p&gt;

&lt;p&gt;But the AI was still a separate window. Switch apps to check Codex status. Copy errors, paste into ChatGPT. Unfold my Z Fold — layout broken.&lt;/p&gt;

&lt;p&gt;Seven steps. Every single time.&lt;/p&gt;

&lt;p&gt;So I told the agents: &lt;em&gt;make the AI a first-class Android citizen.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before (v5.3):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI runs in a terminal pane — works, but invisible when the app is closed&lt;/li&gt;
&lt;li&gt;No widget, no home screen integration&lt;/li&gt;
&lt;li&gt;Copy error → switch app → paste → read → switch back → paste fix → run&lt;/li&gt;
&lt;li&gt;Z Fold cover → main display = layout glitch&lt;/li&gt;
&lt;li&gt;Codex updates require full APK reinstall&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After (v6.0):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent Chat pane reads Codex events live — approval cards, tool calls, session history — and runs fixes with one tap&lt;/li&gt;
&lt;li&gt;Scouter widget on the home screen: quota bars, rate limits, cost, conversation preview — and send prompts directly from the widget&lt;/li&gt;
&lt;li&gt;Codex Pets — avatars that cycle on the widget because why not&lt;/li&gt;
&lt;li&gt;Per-category notification channels: approvals = Heads-up HIGH, errors = buzz, status = silent&lt;/li&gt;
&lt;li&gt;Z Fold cover ↔ main display transitions = flawless&lt;/li&gt;
&lt;li&gt;Codex runtime hot-swaps without touching the APK&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Agent Chat — Zero Copy-Paste
&lt;/h2&gt;

&lt;p&gt;The terminal AI now reads the terminal output automatically.&lt;/p&gt;

&lt;p&gt;Codex throws an error. The Agent Chat pane shows it. You tap &lt;strong&gt;[Fix this]&lt;/strong&gt;. Codex generates a command. You tap &lt;strong&gt;[Run]&lt;/strong&gt;. The command lands in the terminal.&lt;/p&gt;

&lt;p&gt;Seven steps → two taps.&lt;/p&gt;

&lt;p&gt;Session history survives app restarts. Resume a previous Codex session from the sidebar. Rename it. See approval cards with accept/reject. All read-only, all live.&lt;/p&gt;

&lt;p&gt;The copy-paste bridge is gone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zbkdto1r284hzt2s5sx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zbkdto1r284hzt2s5sx.jpg" alt="Shelly's Agent Chat pane reading live Codex output, with one-tap Fix and Run buttons on Android" width="800" height="882"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Scouter Widget — Codex on the Home Screen
&lt;/h2&gt;

&lt;p&gt;The most requested feature: a real-time Codex dashboard on the Android home screen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5-cell quota bar: green → yellow → critical red&lt;/li&gt;
&lt;li&gt;Live rate-limit remaining, cost display, 60s heartbeat&lt;/li&gt;
&lt;li&gt;Last user + Codex exchange shown in two lines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send a prompt directly from the widget&lt;/strong&gt; — tap the compose button, type, Codex executes in the background&lt;/li&gt;
&lt;li&gt;Per-category notification channels — approvals get Heads-up priority, errors interrupt immediately, status updates stay quiet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don't need to open Shelly to check if Codex is blocked on an approval anymore. It's on my home screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbdx86c7jaw7ftq4ag22.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbdx86c7jaw7ftq4ag22.jpg" alt="Scouter home-screen widget showing Codex quota bar, rate limit, cost and a Codex Pet avatar" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Codex Pets — Delight
&lt;/h2&gt;

&lt;p&gt;If you're going to share your terminal with an AI all day, it should have a face.&lt;/p&gt;

&lt;p&gt;Codex Pets are small overlay avatars on the widget. A dog. A cat. A robot. They cycle automatically. They do nothing functional. They make me smile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Z Fold — The Hardest Bug
&lt;/h2&gt;

&lt;p&gt;Foldables are two devices glued together. The cover display (904px portrait) and the main display (1812px landscape unfolded) trigger a full Android configuration change — and React Native does not handle that gracefully.&lt;/p&gt;

&lt;p&gt;Three root-cause bugs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The fold transition guard was silently blocking legitimate unfolds within 500ms of mount&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;onConfigurationChanged&lt;/code&gt; relayout was async-only — the pane container measured stale dimensions&lt;/li&gt;
&lt;li&gt;A stale keyboard height persisted across the fold, pushing the layout offscreen&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One &lt;code&gt;with-saved-instance-state.js&lt;/code&gt; plugin patch, 15 AI-led debugging sessions, three TypeScript fixes.&lt;/p&gt;

&lt;p&gt;Cover → main. Main → cover. No glitch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3x7d3zkeoa93demotn6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3x7d3zkeoa93demotn6.jpg" alt="Shelly running a split-pane layout with terminal and Agent Chat side by side on an unfolded Z Fold" width="800" height="931"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  By the Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CI build time&lt;/td&gt;
&lt;td&gt;13m 53s&lt;/td&gt;
&lt;td&gt;11m 45s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APK features&lt;/td&gt;
&lt;td&gt;Terminal + AI panes&lt;/td&gt;
&lt;td&gt;+ Agent Chat, Scouter Widget, Notification channels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex updates&lt;/td&gt;
&lt;td&gt;Full APK reinstall&lt;/td&gt;
&lt;td&gt;Hot-swap runtime updater&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Z Fold&lt;/td&gt;
&lt;td&gt;Broken&lt;/td&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidden panes&lt;/td&gt;
&lt;td&gt;Buried in layout&lt;/td&gt;
&lt;td&gt;Visible in Add sheet, promotion fixed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What I Still Can't Do
&lt;/h2&gt;

&lt;p&gt;Write production-grade Kotlin. Ship a Jetpack Compose widget without an agent holding my hand. Understand Android's &lt;code&gt;onConfigurationChanged&lt;/code&gt; lifecycle without 15 debugging sessions.&lt;/p&gt;

&lt;p&gt;What I can do: describe a problem to Codex in plain English, watch it investigate, review its patch, and ship it.&lt;/p&gt;

&lt;p&gt;The agent didn't just build the terminal anymore.&lt;/p&gt;

&lt;p&gt;It became part of the OS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/RYOITABASHI/Shelly" rel="noopener noreferrer"&gt;https://github.com/RYOITABASHI/Shelly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;APK: GitHub Releases (&lt;code&gt;android-latest&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;License: GPLv3&lt;/p&gt;

&lt;p&gt;Rough edges exist. That's why it's open source.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>terminal</category>
      <category>android</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Can't Write Code. But I Shipped a Native Android Terminal IDE with Claude Code + Codex Running Natively — No Termux Required.</title>
      <dc:creator>RYO ITABASHI</dc:creator>
      <pubDate>Tue, 28 Apr 2026 14:07:07 +0000</pubDate>
      <link>https://dev.to/ryoitabashi/i-cant-write-code-but-i-shipped-a-native-android-terminal-ide-with-claude-code-codex-running-21ja</link>
      <guid>https://dev.to/ryoitabashi/i-cant-write-code-but-i-shipped-a-native-android-terminal-ide-with-claude-code-codex-running-21ja</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0o8oxvc85mf7513e6ta.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0o8oxvc85mf7513e6ta.jpg" alt=" " width="800" height="931"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Update: v0.1.0 Released
&lt;/h2&gt;

&lt;p&gt;Since my last post, everything changed.&lt;/p&gt;

&lt;p&gt;The WebView terminal is gone. Termux is no longer required. &lt;br&gt;
Claude Code and Codex now run natively on Android — &lt;br&gt;
in the same process as your shell, with zero TCP, zero IPC.&lt;/p&gt;

&lt;p&gt;This is what shipped.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem I Kept Running Into
&lt;/h2&gt;

&lt;p&gt;Claude Code broke in Termux. Codex broke in Termux. &lt;br&gt;
Every update was a gamble.&lt;/p&gt;

&lt;p&gt;So I directed the AI to throw away the entire architecture &lt;br&gt;
and rebuild it from scratch.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Changed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before (Plan A):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebView terminal via ttyd&lt;/li&gt;
&lt;li&gt;Termux required&lt;/li&gt;
&lt;li&gt;TCP socket between terminal and app&lt;/li&gt;
&lt;li&gt;Died every time I switched apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After (Plan B):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native PTY via JNI forkpty — same process, zero IPC, zero TCP&lt;/li&gt;
&lt;li&gt;Termux not required&lt;/li&gt;
&lt;li&gt;bash, Node.js, Python 3, git, curl, ripgrep, jq, tmux, vim, 
sqlite3 bundled inside the APK as .so files&lt;/li&gt;
&lt;li&gt;Executed via /system/bin/linker64 to bypass SELinux's 
execve restrictions on app_data_file context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As far as I know, this is the only React Native app in the &lt;br&gt;
world with an embedded native terminal emulator running &lt;br&gt;
in-process via JNI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Claude Code + Codex on Android
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhc5hure6r9n49r2j366n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhc5hure6r9n49r2j366n.jpg" alt=" " width="799" height="882"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both now run natively through Shelly's managed runtime:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code 2.1.125 (Opus 4.7, 1M context) ✅&lt;/li&gt;
&lt;li&gt;Codex v0.124.0-termux (GPT-5.5) ✅&lt;/li&gt;
&lt;li&gt;Gemini CLI 0.39.1 ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The runtime hot-swaps updates without an APK rebuild. &lt;br&gt;
Broken versions are logged and cooled down automatically.&lt;/p&gt;

&lt;p&gt;If Claude Code or Codex broke in your Termux setup — &lt;br&gt;
this is the maintained path.&lt;/p&gt;




&lt;p&gt;4 live panes simultaneously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Top left: Claude Code terminal&lt;/li&gt;
&lt;li&gt;Top right: Codex (GPT-5.5)&lt;/li&gt;
&lt;li&gt;Bottom left: Cerebras AI pane with READING TERMINAL&lt;/li&gt;
&lt;li&gt;Bottom right: Browser pane with YouTube&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Works Today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Native terminal with inline command blocks&lt;/li&gt;
&lt;li&gt;Multi-pane layout (up to 4 live panes)&lt;/li&gt;
&lt;li&gt;Cross-pane intelligence — AI reads terminal output automatically&lt;/li&gt;
&lt;li&gt;Multi-agent routing: Claude, Gemini, Cerebras, Groq, 
Perplexity, Codex, Local LLM via llama.cpp&lt;/li&gt;
&lt;li&gt;File editing with per-hunk InlineDiff accept/reject&lt;/li&gt;
&lt;li&gt;
&lt;a class="mentioned-user" href="https://dev.to/team"&gt;@team&lt;/a&gt; multi-model consensus&lt;/li&gt;
&lt;li&gt;SSH profiles&lt;/li&gt;
&lt;li&gt;CRT mode (scanlines + phosphor green + vignette)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Known Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code first-run OAuth requires credential transplant&lt;/li&gt;
&lt;li&gt;Ports monitor blocked by Android 10+ SELinux (bug #99)&lt;/li&gt;
&lt;li&gt;Test coverage is thin&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/RYOITABASHI/Shelly" rel="noopener noreferrer"&gt;https://github.com/RYOITABASHI/Shelly&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;APK:&lt;/strong&gt; GitHub Releases&lt;br&gt;&lt;br&gt;
&lt;strong&gt;License:&lt;/strong&gt; GPLv3&lt;/p&gt;

&lt;p&gt;Rough edges exist. That's why it's open source.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>android</category>
      <category>vibecoding</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Can't Write Code. But I Built a 100,000-Line Terminal IDE on My Phone.</title>
      <dc:creator>RYO ITABASHI</dc:creator>
      <pubDate>Sat, 04 Apr 2026 16:35:18 +0000</pubDate>
      <link>https://dev.to/ryoitabashi/i-cant-write-code-but-i-built-a-100000-line-terminal-ide-on-my-phone-2mcj</link>
      <guid>https://dev.to/ryoitabashi/i-cant-write-code-but-i-built-a-100000-line-terminal-ide-on-my-phone-2mcj</guid>
      <description>&lt;h2&gt;
  
  
  I can't write code.
&lt;/h2&gt;

&lt;p&gt;I'm not an engineer. I've never written a line of TypeScript. I have no formal training in computer science.&lt;/p&gt;

&lt;p&gt;But I built a 100,000-line terminal IDE — by talking to AI.&lt;/p&gt;

&lt;p&gt;Every architectural decision is mine. The code is not. It was created through conversation with Claude Code, running inside Termux on a Samsung Galaxy Z Fold6. No desktop. No laptop. Just a foldable phone and an AI that can execute commands.&lt;/p&gt;

&lt;p&gt;Today I'm releasing it as open source.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/RYOITABASHI/Shelly" rel="noopener noreferrer"&gt;github.com/RYOITABASHI/Shelly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxwq7wvsc7ak34le5huu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxwq7wvsc7ak34le5huu.jpg" alt="Shelly hero image" width="800" height="881"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You're running Claude Code in the terminal. It throws an error. You copy it. You switch to ChatGPT. You paste. You ask "what went wrong?" You copy the fix. You switch back. You paste. You run it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seven steps. Every single time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The terminal and the chat live in different worlds. You are the copy-paste bridge between them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;Shelly puts Chat and Terminal side by side — and connects them with AI.&lt;/p&gt;

&lt;p&gt;Say &lt;strong&gt;"fix the error on the right"&lt;/strong&gt;. Shelly reads the terminal output, understands the error, and generates an executable command. Tap &lt;strong&gt;▶ Run&lt;/strong&gt; and the fix lands directly in the Terminal.&lt;/p&gt;

&lt;p&gt;No copy. No paste. No tab switching.&lt;/p&gt;




&lt;h2&gt;
  
  
  What makes it different
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Native terminal emulator.&lt;/strong&gt; Not a WebView. Kotlin code derived from Termux's terminal-emulator library, rendering on an Android Canvas. Connected via a C helper (&lt;code&gt;forkpty()&lt;/code&gt;) over TCP localhost. As far as I know, this is the only React Native app with an embedded native terminal emulator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12 AI agents.&lt;/strong&gt; &lt;code&gt;@claude&lt;/code&gt;, &lt;code&gt;@gemini&lt;/code&gt;, &lt;code&gt;@codex&lt;/code&gt;, &lt;code&gt;@cerebras&lt;/code&gt;, &lt;code&gt;@local&lt;/code&gt;, &lt;code&gt;@perplexity&lt;/code&gt;, &lt;code&gt;@team&lt;/code&gt;, &lt;code&gt;@plan&lt;/code&gt;, &lt;code&gt;@arena&lt;/code&gt;, &lt;code&gt;@actions&lt;/code&gt;. The input router automatically selects the best AI for the task, or you choose with @mentions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It runs on your phone.&lt;/strong&gt; Not in the cloud. Not on a desktop. Shelly + Termux gives you a full development environment in your pocket.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cross-pane intelligence&lt;/strong&gt; — AI reads terminal output, suggests fixes, one-tap execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ActionBlock&lt;/strong&gt; — Code blocks in AI responses have [▶ Run] buttons&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval Proxy&lt;/strong&gt; — Terminal [Y/n] prompts become native chat buttons&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-savepoint&lt;/strong&gt; — Game-like save system. Every change auto-committed. Revert with one tap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan Mode&lt;/strong&gt; — AI generates step cards. Execute or skip each step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arena Mode&lt;/strong&gt; — Same prompt, two AIs, blind comparison. Vote for the better one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click-to-Edit&lt;/strong&gt; — Tap any element in the preview panel, tell the AI what to change&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VoiceChain&lt;/strong&gt; — Speak → execute → TTS response. Hands-free development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub integration&lt;/strong&gt; — AI suggests when to push. &lt;code&gt;@actions&lt;/code&gt; sets up CI/CD without YAML.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5-level command safety&lt;/strong&gt; — Every command is risk-assessed before execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local LLM support&lt;/strong&gt; — Run models on-device via llama.cpp. Fully offline capable.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The keyboard too
&lt;/h2&gt;

&lt;p&gt;The keyboard you see in the screenshots is &lt;strong&gt;Nacre&lt;/strong&gt; — an 11,000-line Android IME I built (also through AI) to solve the input problem on mobile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RYOITABASHI/Nacre" rel="noopener noreferrer"&gt;github.com/RYOITABASHI/Nacre&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Built with
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;Expo 54 / React Native 0.81&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;TypeScript + Kotlin + C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;Native emulator (Termux-derived) + Direct PTY (C, forkpty)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;Zustand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i18n&lt;/td&gt;
&lt;td&gt;900+ keys, English/Japanese&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;I'm a creative director. I wanted to use Claude Code on my phone, but Termux was too intimidating. So I made a chat interface that hides the complexity while keeping the full power.&lt;/p&gt;

&lt;p&gt;Then I realized the real problem wasn't the terminal — it was the gap between the terminal and the AI. So I connected them.&lt;/p&gt;

&lt;p&gt;Then the WebView kept dying every time I switched apps. So I directed the AI to replace the entire rendering layer with a native terminal emulator written in Kotlin and C.&lt;/p&gt;

&lt;p&gt;100,000 lines later, I still can't write code. But I can describe what I need, and the AI builds it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/RYOITABASHI/Shelly" rel="noopener noreferrer"&gt;github.com/RYOITABASHI/Shelly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APK:&lt;/strong&gt; &lt;a href="https://github.com/RYOITABASHI/Shelly/releases" rel="noopener noreferrer"&gt;GitHub Releases&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GPL v3. Built entirely on a Samsung Galaxy Z Fold6, in Termux, without ever touching a desktop computer.&lt;/p&gt;

&lt;p&gt;Feedback, issues, and PRs welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>android</category>
      <category>vibecoding</category>
    </item>
  </channel>
</rss>
