画像，JavaScript/CSSなどに対応するターミナルウェブブラウザのChawanを試す

Chawanというターミナルウェブブラウザを知りました．
メモリセーフなNimで実装されていてライセンスはパブリックドメインです．

同じようにターミナル上で動作するw3mやLynx系との大きな違いはJavaScriptやCSSに対応している辺りでしょうか．SixelやKittyのターミナル画像形式にも対応しています．
少し試してみました．

Chawan: TUI web browser

chawan: TUI Web Browser

chawan – A TUI web browser.

Note

少し用途が違いますが，v8エンジンを使ったスクレイピング向けのヘッドレスブラウザのLightpandaなんてものもあります．

Lightpanda | The headless browser

Chawanのインストール

現在のChawan: 0.2.0はLinux amd64の静的バイナリtarballやDebian amd64の.debがあります．
不安定のパッケージとしてAUR/NixOS/AppImageがあるようです．(こちらは今回未確認)

他の環境ではセルフビルドが必要そうです．

Debianパッケージ利用(amd64のみ)

Debian sid amd64環境に.debパッケージで導入してみました．

$ wget -c https://chawan.net/dl/chawan-0-2-0-amd64.deb (1)
$ sha256sum ./chawan-0-2-0-amd64.deb
ba3ff4e24a5bf09919caba1cdc4f50b0cbf862f8433f5ea43d5391c1e04eceda ./chawan-0-2-0-amd64.deb
$ sha512sum ./chawan-0-2-0-amd64.deb
e941b880c179df8da7eb4cf7a8050c75ef8a1cdfe629aff8287893f4308071454bf7fb54b4054a5ab99330610b17eca12e7f23a71ffc956d613329365d3c7e17 ./chawan-0-2-0-amd64.deb
$ sudo apt install ./chawan-0-2-0-amd64.deb (2)
$ chawan (3)
bash: chawan: command not found
$ dpkg -L chawan | grep /bin/ (4)
/usr/bin/cha
/usr/bin/mancha
$ cha
Chawan browser v0.2.0 (release, sandboxed)
Usage: cha [options] [URL(s) or file(s)...]
Options:
-- Interpret all following arguments as URLs
-c, --css <stylesheet> Pass stylesheet (e.g. -c 'a{color: blue}')
-d, --dump Print page to stdout
-h, --help Print this usage message
-o, --opt <config> Pass config options (e.g. -o 'page.q="quit()"')
-r, --run <script/file> Run passed script or file
-v, --version Print version information
-C, --config <file> Override config path
-I, --input-charset <enc> Specify document charset
-M, --monochrome Set color-mode to 'monochrome'
-O, --display-charset <enc> Specify display charset
-T, --type <type> Specify content mime type
-V, --visual Visual startup mode
$ cha --version
Chawan browser v0.2.0 (release, sandboxed by seccomp-bpf)
$ mancha
Usage:
mancha [-M path] [[-s] section] -k keyword
mancha [-M path] [[-s] section] name
mancha -l file
$ mancha cha
:

.debを入手

インストール

chwanコマンドはなかった

バイナリを探すと cha と mancha が見つかった

Debian sid amd64でsourceからbuild

sourceからのbuildも試してみます．

パッケージで導入したNimはちょっと古そうです．

$ /usr/bin/nim -V
Nim Compiler Version 1.6.14 [Linux: amd64]
Compiled at 2024-04-25
Copyright (c) 2006-2023 by Andreas Rumpf

active boot switches: -d:release

Nim 2.2.4を貰ってきてPATHを通しておきます．

Unix installation – Nim Programming Language

$ wget -c https://nim-lang.org/download/nim-2.2.4-linux_x64.tar.xz https://nim-lang.org/download/nim-2.2.4-linux_x64.tar.xz.sha256
$ sha256sum -c nim-2.2.4-linux_x64.tar.xz.sha256
nim-2.2.4-linux_x64.tar.xz: OK
$ fuse-archive nim-2.2.4-linux_x64.tar.xz
fuse-archive: Created mount point 'nim-2.2.4-linux_x64'
$ export PATH=`pwd`/nim-2.2.4-linux_x64/nim-2.2.4/bin:$PATH
$ which nim
/home/matoken/Downloads/nim-2.2.4-linux_x64/nim-2.2.4/bin/nim
$ nim -V
Nim Compiler Version 2.2.4 [Linux: amd64]
Compiled at 2025-04-22
Copyright (c) 2006-2025 by Andreas Rumpf

git hash: f7145dd26efeeeb6eeae6fff649db244d81b212d
active boot switches: -d:release

適当なディレクトリに移動してChawanのsourceを貰ってきてbuildします．

$ cd ~/src
$ git clone https://git.sr.ht/~bptato/chawan && cd chawan
$ sudo apt install libssh2-1-dev libssl-dev libbrotli-dev pkg-config make
$ make
$ ./cha
Chawan browser v0.3 (release, sandboxed)
Usage: cha [options] [URL(s) or file(s)...]
Options:
-- Interpret all following arguments as URLs
-c, --css <stylesheet> Pass stylesheet (e.g. -c 'a{color: blue}')
-d, --dump Print page to stdout
-h, --help Print this usage message
-o, --opt <config> Pass config options (e.g. -o 'page.q="quit()"')
-r, --run <script/file> Run passed script or file
-v, --version Print version information
-C, --config <file> Override config path
-I, --input-charset <enc> Specify document charset
-M, --monochrome Set color-mode to 'monochrome'
-O, --display-charset <enc> Specify display charset
-T, --type <type> Specify content mime type
-V, --visual Visual startup mode
$ ./cha -v
Chawan browser v0.3 (release, sandboxed by seccomp-bpf)

Raspberry Pi OS bookworm armhf

Single-Board ComputerのRaspberry Piでも試したいのでこちらでもbuildを試します．

Linux armhfのNimバイナリは公式に見当たらないのでこちらのNightlyのものを使いました．

Release Nightly build on 2025-04-22 for branch version-2-2 · nim-lang/nightlies

$ wget -c https://github.com/nim-lang/nightlies/releases/download/2025-04-22-version-2-2-f7145dd26efeeeb6eeae6fff649db244d81b212d/nim-2.2.4-linux_armv7l.tar.xz
$ tar tvf nim-2.2.4-linux_armv7l.tar.xz
$ tar xvf nim-2.2.4-linux_armv7l.tar.xz
$ export PATH=$PATH:`pwd`/nim-2.2.4/bin
$ which nim
/home/matoken/Downloads/nim-2.2.4/bin/nim
$ cd ~/src
$ git clone https://git.sr.ht/~bptato/chawan && cd chawan
$ sudo apt install libssh2-1-dev libssl-dev libbrotli-dev pkg-config make
$ make
$ ./cha --version
Chawan browser v0.3 (release, sandboxed by seccomp-bpf)

Note

手元の環境ではパッケージ導入時に以下のような依存関係のエラーとなりました．

The following packages have unmet dependencies:
zlib1g-dev : Depends: zlib1g (= 1:1.2.13.dfsg-1) but 1:1.2.13.dfsg-1+rpt1 is to be installed
E: Unable to correct problems, you have held broken packages.

とりあえずバージョンを指定して入れ直して回避できました．

$ sudo apt install zlib1g=1:1.2.13.dfsg-1

Chawanを試す

$ cha
Chawan browser v0.2.0 (release, sandboxed)
Usage: cha [options] [URL(s) or file(s)...]
Options:
-- Interpret all following arguments as URLs
-c, --css <stylesheet> Pass stylesheet (e.g. -c 'a{color: blue}')
-d, --dump Print page to stdout
-h, --help Print this usage message
-o, --opt <config> Pass config options (e.g. -o 'page.q="quit()"')
-r, --run <script/file> Run passed script or file
-v, --version Print version information
-C, --config <file> Override config path
-I, --input-charset <enc> Specify document charset
-M, --monochrome Set color-mode to 'monochrome'
-O, --display-charset <enc> Specify display charset
-T, --type <type> Specify content mime type
-V, --visual Visual startup mode

とりあえず cha $URL という感じでurlを指定して起動するとウェブページが表示できます．
既定値ではCSSは認識しますが，JavaScriptや画像は使えません．

右クリックからのメーニューやショートカットで有効にすることも出来ますが面倒なので設定ファイルで設定します．

右クリックのメニュー

┌──────────────────────────────┐
│ Select text (v) │
│ Copy selection (y) │
│ Previous buffer (,) │
│ Next buffer (.) │
│ Discard buffer (D) │
│ ──────────────────────────── │
│ View image (I) │
│ Peek (u) │
│ Copy link (yu) │
│ Copy image link (yI) │
│ Paste link (M-p) │
│ Reload (U) │
│ ──────────────────────────── │
│ Save link (sC-m) │
│ View source (\) │
│ Edit source (sE) │
│ Save source (sS) │
│ ──────────────────────────── │
│ Linkify URLs (:) │
│ Toggle images (M-i) │
│ Toggle JS & reload (M-j) │
│ Toggle cookie & reload (M-k) │
│ ──────────────────────────── │
│ Bookmark page (M-a) │
│ Open bookmarks (M-b) │
│ Open history (C-h) │
└──────────────────────────────┘

設定ファイルは
~/.chawan/config.toml 若しくは ~/.config/chawan/config.toml が使えるようです．
cha-config(5) を見ながら設定すると良さそうです．

とりあえず画像とJavaScriptを有効にする最低限の設定はこんな感じのようです．

[buffer]
images = true
scripting = true

ただ，JavaScriptの設定の scripting はここではなくsiteごとの設定の [siteconf] 内で有効にするのを強く勧めますとのことなのでちゃんと必要なsiteだけ有効にしたほうが良さそうです．

この状態でSixelやKittyに対応したXTermなどの端末でアクセスするとこんな感じで表示されます．

about:chawan キーバインドなども確認できます

https://chawan.net/

https://teni.jp/

https://tenki.jp/forecast/9/49/8820/46490/10days.html JavaScriptをOnにした状態で2週間天気を見ようとするとコケます．JavaScript offだと表示できました．

https://ja.wikipedia.org/wiki/%E8%8C%B6%E7%A2%97

https://matoken.org/blog/

MastodonやMisskeyはJavaScriptを有効にしてもダメそうです．この辺りはサードパーティのアプリケーションを使ったほうが良さそうです．と思ったけど fedibird.com は大丈夫そう．インスタンスの設定が違うのでしょうか?

GithubのReleasesのAssetsも今はJavaScriptが必須になってしまっているのでこれはどうだろうと思いましたが駄目でした．

という感じで少し試した感じではCSSを認識するので見た目がw3mなどと比べて大分いい感じです．カーソルが背景と同じになり場所がわからなくなってしまったりしますが，ポインティングデバイスが使える場合はクリックでカーソルがその場所に移動するのでアンカ部分をクリック&Enterでリンク先に移動できます．画像が一部しか表示されないとき key:[M-i] で画像をoff → 再度 key:[M-i] で画像を再度on とすると読み込まれることがあります．

回線が細い場合リモートのVPSでChawanを動かして結果だけをもらうようにするとダウンロード時間が短縮されていい感じです．ただし加増が多いサイトでスクロールを多用する場合はもたつきます．

Sixelで画像が利用できる時にSixel対応tmux経由でChawanを起動するとChawanのSixel画像が表示されないようです．同じ端末でimg2sixelなどは問題ないのでChawan側の問題でしょうか?

JavaScriptは思ったより動かないなという感じですがCSSが思ったより助かります．JavaScriptについてはQuickJS-NGを使っているのでこちらに期待です．ECMAScriptの機能準拠の進捗状況はこちら

ただ，現時点ではChawanはLinux amd64環境でJavaScript/画像有効でもメモリ利用量10MB前後．色々と動くようになるとこの辺も増えていってしまうでしょうね……．

という感じで軽量で見た目もいいのでこれからにも期待しつつw3mなどと併用していこうと思います．