<?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>Forem: Hironobu Sano</title>
    <description>The latest articles on Forem by Hironobu Sano (@owxy_orz).</description>
    <link>https://forem.com/owxy_orz</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3853569%2Fd5ad8b68-3ea6-40b6-b7b6-2e785a806025.jpg</url>
      <title>Forem: Hironobu Sano</title>
      <link>https://forem.com/owxy_orz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/owxy_orz"/>
    <language>en</language>
    <item>
      <title>Living on the Linux Console — Part 2: casty, a Full Browser for TTY</title>
      <dc:creator>Hironobu Sano</dc:creator>
      <pubDate>Sun, 05 Apr 2026 06:28:28 +0000</pubDate>
      <link>https://forem.com/owxy_orz/living-on-the-linux-console-part-2-casty-a-full-browser-for-tty-1fm1</link>
      <guid>https://forem.com/owxy_orz/living-on-the-linux-console-part-2-casty-a-full-browser-for-tty-1fm1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"GUI isn't an option."&lt;/em&gt; — Anonymous&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In Part 1, I built &lt;strong&gt;bcon&lt;/strong&gt; — a GPU-accelerated terminal emulator for the Linux console. But there's one thing you can't escape as a developer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A web browser.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI coding agents can handle research just fine. But what about checking your own web app renders correctly? Or GitHub Actions, PR reviews, and other things &lt;code&gt;gh&lt;/code&gt; can't cover? For those, you need a real browser.&lt;/p&gt;

&lt;p&gt;I looked for existing options. Here's what I found:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;eww&lt;/th&gt;
&lt;th&gt;browsh&lt;/th&gt;
&lt;th&gt;Carbonyl&lt;/th&gt;
&lt;th&gt;awrit&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;casty ⭐&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Engine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Emacs shr&lt;/td&gt;
&lt;td&gt;headless Firefox&lt;/td&gt;
&lt;td&gt;Chromium fork&lt;/td&gt;
&lt;td&gt;Electron&lt;/td&gt;
&lt;td&gt;Chrome headless-shell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rendering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Text + limited images&lt;/td&gt;
&lt;td&gt;ANSI block chars&lt;/td&gt;
&lt;td&gt;Unicode blocks (▄ + 24bit)&lt;/td&gt;
&lt;td&gt;Kitty Graphics&lt;/td&gt;
&lt;td&gt;Kitty Graphics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (WebGL/WebGPU)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Site fidelity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🔴 Low&lt;/td&gt;
&lt;td&gt;🟡 Low&lt;/td&gt;
&lt;td&gt;🟡 Medium&lt;/td&gt;
&lt;td&gt;🟢 High&lt;/td&gt;
&lt;td&gt;🟢 &lt;strong&gt;High&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No GUI env&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Linux ✅ / Mac ❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ (display server required)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✅ (no X11, SSH-friendly)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Text copy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (Alt+C)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mouse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;🔺&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;M-x package-install&lt;/td&gt;
&lt;td&gt;go install&lt;/td&gt;
&lt;td&gt;npm i -g carbonyl&lt;/td&gt;
&lt;td&gt;curl | bash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm i -g @sanohiro/casty&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nothing checked all the boxes: &lt;strong&gt;JavaScript + CSS + high fidelity + text copy + no GUI required.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I built it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://github.com/sanohiro/casty" rel="noopener noreferrer"&gt;github.com/sanohiro/casty&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @sanohiro/casty
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F77ycch7i5a5g3mcqscmy.png" 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%2F77ycch7i5a5g3mcqscmy.png" alt="casty running on bcon" width="800" height="630"&gt;&lt;/a&gt; &lt;em&gt;casty running on the Linux console inside bcon&lt;/em&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%2Fypmvun70l1femaq80uo1.png" 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%2Fypmvun70l1femaq80uo1.png" alt="YouTube playing in casty" width="800" height="626"&gt;&lt;/a&gt; &lt;em&gt;YouTube video playback inside casty on bcon&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;casty works with any Kitty Graphics-compatible terminal — not just bcon. Ghostty and Kitty both work too.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The concept is simple: connect to Chrome headless-shell via CDP (Chrome DevTools Protocol), stream frames to the terminal using Kitty Graphics Protocol, and forward keyboard/mouse events back to Chrome.&lt;/p&gt;

&lt;p&gt;Chrome downloads itself automatically on first run to &lt;code&gt;~/.casty/&lt;/code&gt; — no manual setup needed. Cookies and storage are preserved, so you can log in to Google and other services normally.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;casty launches Chrome headless-shell (auto-downloaded to &lt;code&gt;~/.casty/&lt;/code&gt; on first run)&lt;/li&gt;
&lt;li&gt;Connects via CDP WebSocket&lt;/li&gt;
&lt;li&gt;Captures screenshots and streams them to the terminal using Kitty Graphics Protocol&lt;/li&gt;
&lt;li&gt;Forwards your keyboard and mouse events back to Chrome via CDP&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Real-world use: Claude Code + casty
&lt;/h2&gt;

&lt;p&gt;The moment I actually wanted this: editing a React app with Claude Code while watching changes live in casty.&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%2Fb3dgkwu6j2t3duqu5via.png" 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%2Fb3dgkwu6j2t3duqu5via.png" alt="Claude Code editing React+Vite" width="800" height="630"&gt;&lt;/a&gt; &lt;em&gt;Claude Code rewriting a React+Vite app — UI is in Japanese, but you get the idea 😄&lt;/em&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%2Fql2t0btmjmzro7hgul5n.png" 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%2Fql2t0btmjmzro7hgul5n.png" alt="Live reload in casty" width="800" height="629"&gt;&lt;/a&gt; &lt;em&gt;Changes reflected instantly in casty&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It just works. 😎&lt;/p&gt;

&lt;p&gt;Starting to think you might be able to &lt;strong&gt;live on the Linux console&lt;/strong&gt; after all?&lt;/p&gt;

&lt;p&gt;More to come.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>terminal</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Living on the Linux Console — Part 1: bcon, a Modern Terminal for TTY</title>
      <dc:creator>Hironobu Sano</dc:creator>
      <pubDate>Tue, 31 Mar 2026 13:54:38 +0000</pubDate>
      <link>https://forem.com/owxy_orz/living-on-the-linux-console-part-1-bcon-a-modern-terminal-for-tty-3caj</link>
      <guid>https://forem.com/owxy_orz/living-on-the-linux-console-part-1-bcon-a-modern-terminal-for-tty-3caj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"GUI isn't an option."&lt;/em&gt; — Anonymous&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lately, I've been developing almost entirely with AI coding agents — Claude Code, Codex, Gemini CLI. Writing code, generating docs, running tests, managing GitHub and AWS, even searching the web — all from the terminal.&lt;/p&gt;

&lt;p&gt;Then it hit me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wait... am I ever actually touching a GUI anymore? 🤪&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That led to another thought:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I even need a window system (X11/Wayland) to live as a developer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I know, I know — sounds crazy. But hear me out.&lt;/p&gt;

&lt;p&gt;If tools like Claude Code and Ghostty exist... why can't I have that experience directly on the Linux console?&lt;/p&gt;

&lt;p&gt;The problem is, the standard Linux TTY is pretty rough:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text rendering is ugly&lt;/li&gt;
&lt;li&gt;No true color or text decorations&lt;/li&gt;
&lt;li&gt;No emoji, Nerd Fonts, or ligatures&lt;/li&gt;
&lt;li&gt;No Kitty/Sixel graphics protocol&lt;/li&gt;
&lt;li&gt;No clipboard support&lt;/li&gt;
&lt;li&gt;No CJK input (IME)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Old tools like fbterm and kon existed, but nothing modern. Nothing that felt like Ghostty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So I built it.&lt;/strong&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%2Fuspa7f26de81ghdxx15u.png" 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%2Fuspa7f26de81ghdxx15u.png" alt="bcon running on Ubuntu Server" width="800" height="630"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;bcon running on Ubuntu Server — Claude Code on the left, yazi top-right, Neovim bottom-right&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;bcon&lt;/strong&gt; — a GPU-accelerated terminal emulator that runs directly on the Linux console. No X11. No Wayland. Just TTY.&lt;/p&gt;

&lt;p&gt;It supports tiling and tabs, so it feels like a tiling window manager — but running entirely in TTY.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Screenshot is from Ubuntu Server (no X/Wayland) running inside Parallels Desktop&lt;/p&gt;
&lt;/blockquote&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%2Fzl4woqjc0hc4dgjy8ma0.png" 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%2Fzl4woqjc0hc4dgjy8ma0.png" alt="Japanese input on bcon" width="800" height="629"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Japanese IME input working on bcon via fcitx5&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Japanese input works too 🐤&lt;/p&gt;

&lt;p&gt;For setup details, check the repository. One practical tip: rather than replacing your main TTY, I recommend running bcon on &lt;code&gt;tty2&lt;/code&gt; only. Switch to it with &lt;code&gt;Ctrl+Alt+F2&lt;/code&gt;, and return to your normal console with &lt;code&gt;Ctrl+Alt+F1&lt;/code&gt;. Safe and easy to recover from.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Linux traditionally has 6 virtual consoles (tty1–tty6). X Window historically used tty7; modern Ubuntu+GDM typically uses tty1/2.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://github.com/sanohiro/bcon" rel="noopener noreferrer"&gt;github.com/sanohiro/bcon&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;This is Part 1 of my series &lt;strong&gt;"Living on the Linux Console"&lt;/strong&gt; — next up: a full headless browser for TTY.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>rust</category>
      <category>terminal</category>
      <category>tty</category>
    </item>
  </channel>
</rss>
