<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>bhāṣikā</title><link href="https://bhashika.org.in/feed.xml"/><id>https://bhashika.org.in</id><updated>2026-09-11T00:37:19Z</updated><author><name>bhāṣikā</name></author><entry><title>DeepSeek V4.1 Flash</title><link href="https://bhashika.org.in/logs/2026/deepseek-v4-1-flash"/><id>https://bhashika.org.in/logs/2026/deepseek-v4-1-flash</id><published>2026-09-11T00:37:19Z</published><updated>2026-09-11T00:37:19Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/deepseek-v4-1-flash">&lt;p&gt;DeepSeek V4.1 Flash was launched yesterday and is already available on OpenCode Go. It now has Vision support. The price change from August 16 has been partially reversed. For now:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Type&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Off-peak&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Peak&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cached Read&lt;/td&gt;&lt;td&gt;$0.003/M&lt;/td&gt;&lt;td&gt;$0.006/M&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Input&lt;/td&gt;&lt;td&gt;$0.15/M&lt;/td&gt;&lt;td&gt;$0.30/M&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Output&lt;/td&gt;&lt;td&gt;$0.60/M&lt;/td&gt;&lt;td&gt;$1.20/M&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;It seems that the &lt;strong&gt;DeepSeek V4 Flash Vision&lt;/strong&gt; experiment was a success. One of the most important changes compared to DeepSeek V4 Flash, for those running quantized models at home, is the model size:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Metric&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;DeepSeek V4 Flash&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;DeepSeek V4.1 Flash&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Architecture&lt;/td&gt;&lt;td&gt;MoE&lt;/td&gt;&lt;td&gt;MoE&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Backbone Params&lt;/td&gt;&lt;td&gt;284B&lt;/td&gt;&lt;td&gt;&lt;strong&gt;552B&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Activated Params&lt;/td&gt;&lt;td&gt;13B&lt;/td&gt;&lt;td&gt;&lt;strong&gt;8B/16B&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Context Length&lt;/td&gt;&lt;td&gt;1M&lt;/td&gt;&lt;td&gt;1M&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Precision&lt;/td&gt;&lt;td&gt;FP8 Mixed&lt;/td&gt;&lt;td&gt;FP8 Mixed&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;With V4, you could run Q3 quants on a 128GB RAM machine. With V4.1, you cannot.&lt;/p&gt;</content></entry><entry><title>Mēdhā Devlog 2</title><link href="https://bhashika.org.in/logs/2026/medha-devlog-2"/><id>https://bhashika.org.in/logs/2026/medha-devlog-2</id><published>2026-09-10T20:36:30Z</published><updated>2026-09-10T20:36:30Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/medha-devlog-2">&lt;p&gt;The application was ready in a few hours. My decisions regarding the UX:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;A standard header + two-panel design. No footer.&lt;/li&gt;&lt;li&gt;All copyright and intro stuff goes in the colophon.&lt;/li&gt;&lt;li&gt;The contextual &lt;em&gt;In this series&lt;/em&gt; panel floats on the right.&lt;/li&gt;&lt;li&gt;The &lt;em&gt;Table of Contents&lt;/em&gt; panel in projects floats on the right.&lt;/li&gt;&lt;li&gt;The contextual &lt;em&gt;Further reading&lt;/em&gt; panel floats below these two.&lt;/li&gt;&lt;li&gt;The side panel flows below the main one on narrow screens.&lt;/li&gt;&lt;li&gt;Prev/next links and tags occupy the bottom part of a log.&lt;/li&gt;&lt;li&gt;Global navigation sits just below the page header.&lt;/li&gt;&lt;li&gt;&lt;code&gt;/logs&lt;/code&gt; is a synonym for the latest year: &lt;code&gt;/logs/2026&lt;/code&gt;. The annual page uses reverse chronology to list the logs.&lt;/li&gt;&lt;li&gt;Site pages already support templates such as &lt;code&gt;{{logs:10}}&lt;/code&gt; and &lt;code&gt;{{projects:active}}&lt;/code&gt;. But the rendering was needlessly dense &lt;em&gt;and&lt;/em&gt; ugly. I cleaned that up.&lt;/li&gt;&lt;/ul&gt;</content></entry><entry><title>Adamant Devlog 2</title><link href="https://bhashika.org.in/logs/2026/adamant-devlog-2"/><id>https://bhashika.org.in/logs/2026/adamant-devlog-2</id><published>2026-09-09T05:47:28Z</published><updated>2026-09-09T05:47:28Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/adamant-devlog-2">&lt;p&gt;The experiments to get sandboxing working with PonderCode suggested a direction, and I borrowed it almost wholesale for Adamant.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;prepare&lt;/code&gt; command produces or updates a profile in &lt;code&gt;~/.config/adamant/profiles/&lt;/code&gt;. A profile can be extended by another profile. And &lt;code&gt;run&lt;/code&gt; executes the command.&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;c-var&gt;BASE&lt;/c-var&gt;=&lt;c-str&gt;&amp;quot;sh ls cat head tail wc grep sed awk rg pwd whoami id uname find stat readlink ps kill mkdir rmdir rm cp mv env printenv which file du df mount findmnt man tee touch echo&amp;quot;&lt;/c-str&gt;
&lt;c-cmd&gt;adamant&lt;/c-cmd&gt; &lt;c-flag&gt;--profile&lt;/c-flag&gt; base prepare &lt;c-var&gt;$BASE&lt;/c-var&gt;
&lt;c-cmd&gt;adamant&lt;/c-cmd&gt; &lt;c-flag&gt;--profile&lt;/c-flag&gt; net prepare &lt;c-flag&gt;--extend&lt;/c-flag&gt; base &lt;c-flag&gt;--&lt;/c-flag&gt; curl
&lt;c-cmd&gt;adamant&lt;/c-cmd&gt; &lt;c-flag&gt;--profile&lt;/c-flag&gt; base run &lt;c-flag&gt;--&lt;/c-flag&gt; sh
&lt;c-cmd&gt;adamant&lt;/c-cmd&gt; &lt;c-flag&gt;--profile&lt;/c-flag&gt; base run &lt;c-flag&gt;--&lt;/c-flag&gt; ls &lt;c-flag&gt;-la&lt;/c-flag&gt; /home&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As Adamant presently uses &lt;code&gt;readelf&lt;/code&gt; instead of &lt;code&gt;ldd&lt;/code&gt;, it loses out on the discovery of all the &lt;code&gt;dlopen&lt;/code&gt; stuff. And as it does not use &lt;code&gt;strace&lt;/code&gt;, it cannot detect all the &lt;em&gt;data&lt;/em&gt; dependencies of a program. So I must manually do stuff like this:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;c-com&gt;# ~/.config/adamant/profiles/base.toml&lt;/c-com&gt;
&lt;c-com&gt;# AUTOMATIC: resolved_ro is written by `adamant prepare`; do not hand-edit.&lt;/c-com&gt;
&lt;c-com&gt;# Hand-edited keys (extends, extra_ro, extra_rw, hosts, env) are preserved.&lt;/c-com&gt;
&lt;c-var&gt;resolved_ro &lt;/c-var&gt;= [
    &lt;c-str&gt;&amp;quot;/usr/lib/ld-linux-x86-64.so.2&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libc.so.6&amp;quot;&lt;/c-str&gt;,
    ...
    &lt;c-str&gt;&amp;quot;/usr/bin/clear&amp;quot;&lt;/c-str&gt;,
]

&lt;c-var&gt;extra_ro &lt;/c-var&gt;= [
	&lt;c-str&gt;&amp;quot;/usr/share/terminfo&amp;quot;&lt;/c-str&gt;,      &lt;c-com&gt;# ncurses/fish terminal db&lt;/c-com&gt;
	&lt;c-str&gt;&amp;quot;/etc/passwd&amp;quot;&lt;/c-str&gt;,              &lt;c-com&gt;# username/home lookup&lt;/c-com&gt;
	&lt;c-str&gt;&amp;quot;/etc/group&amp;quot;&lt;/c-str&gt;,
	&lt;c-str&gt;&amp;quot;/etc/hostname&amp;quot;&lt;/c-str&gt;,
	&lt;c-str&gt;&amp;quot;/etc/localtime&amp;quot;&lt;/c-str&gt;,
	&lt;c-str&gt;&amp;quot;/usr/lib/kitty/terminfo&amp;quot;&lt;/c-str&gt;,
]

&lt;c-var&gt;env &lt;/c-var&gt;= [
&lt;c-var&gt;    {name &lt;/c-var&gt;= &lt;c-str&gt;&amp;quot;TERM&amp;quot;&lt;/c-str&gt;, value = &lt;c-str&gt;&amp;quot;xterm-kitty&amp;quot;&lt;/c-str&gt; },
&lt;c-var&gt;    {name &lt;/c-var&gt;= &lt;c-str&gt;&amp;quot;COLORTERM&amp;quot;&lt;/c-str&gt;, value = &lt;c-str&gt;&amp;quot;truecolor&amp;quot;&lt;/c-str&gt; },
&lt;c-var&gt;    { name &lt;/c-var&gt;= &lt;c-str&gt;&amp;quot;LANG&amp;quot;&lt;/c-str&gt;, value = &lt;c-str&gt;&amp;quot;C.UTF-8&amp;quot;&lt;/c-str&gt; },
]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and this:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;c-com&gt;# ~/.config/adamant/profiles/net.toml&lt;/c-com&gt;
&lt;c-com&gt;# AUTOMATIC: resolved_ro is written by `adamant prepare`; do not hand-edit.&lt;/c-com&gt;
&lt;c-com&gt;# Hand-edited keys (extends, extra_ro, extra_rw, hosts, env) are preserved.&lt;/c-com&gt;
&lt;c-var&gt;extends &lt;/c-var&gt;= &lt;c-str&gt;&amp;quot;base&amp;quot;&lt;/c-str&gt;

&lt;c-var&gt;resolved_ro &lt;/c-var&gt;= [
    &lt;c-str&gt;&amp;quot;/usr/lib/libcom_err.so.2&amp;quot;&lt;/c-str&gt;,
    ...
    &lt;c-str&gt;&amp;quot;/usr/bin/curl&amp;quot;&lt;/c-str&gt;,
]

&lt;c-var&gt;extra_ro &lt;/c-var&gt;= [
    &lt;c-str&gt;&amp;quot;/etc/ssl&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/etc/ca-certificates&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/etc/nsswitch.conf&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libnss_files.so.2&amp;quot;&lt;/c-str&gt;,  &lt;c-com&gt;# dlopen&amp;#x27;d, prepare can&amp;#x27;t see it&lt;/c-com&gt;
    &lt;c-str&gt;&amp;quot;/etc/hosts&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/etc/resolv.conf&amp;quot;&lt;/c-str&gt;,
]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and this:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;c-com&gt;# ~/.config/adamant/profiles/coding.toml&lt;/c-com&gt;
&lt;c-com&gt;# AUTOMATIC: resolved_ro is written by `adamant prepare`; do not hand-edit.&lt;/c-com&gt;
&lt;c-com&gt;# Hand-edited keys (extends, extra_ro, extra_rw, hosts, env) are preserved.&lt;/c-com&gt;
&lt;c-var&gt;extends &lt;/c-var&gt;= &lt;c-str&gt;&amp;quot;net&amp;quot;&lt;/c-str&gt;

&lt;c-var&gt;resolved_ro &lt;/c-var&gt;= [
    &lt;c-str&gt;&amp;quot;/usr/bin/node&amp;quot;&lt;/c-str&gt;,
    ...
    &lt;c-str&gt;&amp;quot;/usr/lib/libjemalloc.so.2&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/bin/jj&amp;quot;&lt;/c-str&gt;,
]

&lt;c-var&gt;hosts &lt;/c-var&gt;= [&lt;c-str&gt;&amp;quot;npmjs.com&amp;quot;&lt;/c-str&gt;, &lt;c-str&gt;&amp;quot;pypi.org&amp;quot;&lt;/c-str&gt;, &lt;c-str&gt;&amp;quot;opencode.ai&amp;quot;&lt;/c-str&gt;, &lt;c-str&gt;&amp;quot;github.com&amp;quot;&lt;/c-str&gt;, &lt;c-str&gt;&amp;quot;*.astral.sh&amp;quot;&lt;/c-str&gt;, &lt;c-str&gt;&amp;quot;pi.dev&amp;quot;&lt;/c-str&gt;, &lt;c-str&gt;&amp;quot;127.0.0.1:5001&amp;quot;&lt;/c-str&gt;, &lt;c-str&gt;&amp;quot;files.pythonhosted.org&amp;quot;&lt;/c-str&gt;]

&lt;c-var&gt;home &lt;/c-var&gt;= &lt;c-str&gt;&amp;quot;~/my/homes/coding&amp;quot;&lt;/c-str&gt;
&lt;c-var&gt;user &lt;/c-var&gt;= &lt;c-str&gt;&amp;quot;&amp;lt;user&amp;gt;&amp;quot;&lt;/c-str&gt;

&lt;c-var&gt;extra_ro &lt;/c-var&gt;= [
    &lt;c-str&gt;&amp;quot;/usr/lib/python3.14&amp;quot;&lt;/c-str&gt;,
]

&lt;c-var&gt;extra_rw &lt;/c-var&gt;= [
    &lt;c-str&gt;&amp;quot;~/.config/uv&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;~/.pi&amp;quot;&lt;/c-str&gt;,
]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is fine for most CLI tools, but is a massive PITA if you want to get headless Firefox working inside the sandbox.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;socat&lt;/code&gt; socket + proxy machinery was borrowed from PonderCode as-is. It has its pros and cons. The biggest con is that applications that do not respect &lt;code&gt;HTTP_PROXY&lt;/code&gt; + &lt;code&gt;HTTPS_PROXY&lt;/code&gt; envars do not work.&lt;/p&gt;
&lt;p&gt;So, Adamant is mostly done. But I plan to explore &lt;strong&gt;veth&lt;/strong&gt; as well as machinery to get something like Firefox working inside the sandbox.&lt;/p&gt;
&lt;p&gt;I could perhaps get Adamant to use &lt;code&gt;ldd&lt;/code&gt; + &lt;code&gt;strace&lt;/code&gt; behind an &lt;code&gt;--unsafe&lt;/code&gt; flag so that this becomes simpler. After all, my goal is to run known binaries and LLM harnesses inside the sandbox, not malware research. So executing the actual binary to figure out what it needs is not a dealbreaker.&lt;/p&gt;</content></entry><entry><title>Mēdhā</title><link href="https://bhashika.org.in/logs/2026/medha"/><id>https://bhashika.org.in/logs/2026/medha</id><published>2026-09-08T07:04:58Z</published><updated>2026-09-08T07:04:58Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/medha">&lt;p&gt;Mēdhā is the static site generator that produces this website. Once I decided to build this website, I started writing down my logs as Markdown for Mēdhā. The website has not been deployed as of this writing. But it has been running locally on my machine for a day now.&lt;/p&gt;
&lt;p&gt;My feature list for the application is pretty simple:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;no-JS&lt;/li&gt;&lt;li&gt;content in plain Markdown&lt;/li&gt;&lt;li&gt;a basic metadata block&lt;/li&gt;&lt;li&gt;the ability to link logs together into a &lt;strong&gt;series&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;the ability to mark logs as &lt;strong&gt;related&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;tags&lt;/li&gt;&lt;li&gt;dated vs evergreen content (logs vs projects/essays)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Getting the UX right will be the biggest issue. After all, the placement of:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Prev/next links&lt;/li&gt;&lt;li&gt;Tags&lt;/li&gt;&lt;li&gt;Series/Related reading lists&lt;/li&gt;&lt;li&gt;Global navigation&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;matters a lot.&lt;/p&gt;</content></entry><entry><title>Xteink X4</title><link href="https://bhashika.org.in/logs/2026/xteink-x4"/><id>https://bhashika.org.in/logs/2026/xteink-x4</id><published>2026-09-07T19:34:26Z</published><updated>2026-09-07T19:34:26Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/xteink-x4">&lt;p&gt;Someone occasionally posts about the &lt;a href=&quot;https://www.xteink.com/&quot;&gt;Xteink&lt;/a&gt; X3/X4 on Hacker News, and I try to join the conversation because I like my X4 quite a bit:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=48663311&quot;&gt;Got the X4. Put CrossPoint on it. Works like a charm...&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=49392885&quot;&gt;I am using the Xteink X4 as my primary e-reader nowadays...&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;It is a tiny device similar in size to the original iPhone and has a screen the size of a credit card. The body is plastic and glass. The screen is a 219 ppi e-ink module. The device runs on a low-powered ESP32 microcontroller and uses an SD card to store books. I switched to the &lt;a href=&quot;https://crosspointreader.com/&quot;&gt;CrossPoint&lt;/a&gt; firmware on day one. The battery lasts forever, and transferring books is simple because of the HTTP server CrossPoint runs on the device.&lt;/p&gt;
&lt;p&gt;You do not need multicore processors, Android, or large batteries to read e-books.&lt;/p&gt;
&lt;p&gt;Fair warning: the screen is delicate and might need protection depending on how you use it.&lt;/p&gt;</content></entry><entry><title>PonderCode Devlog 5</title><link href="https://bhashika.org.in/logs/2026/pondercode-devlog-5"/><id>https://bhashika.org.in/logs/2026/pondercode-devlog-5</id><published>2026-09-07T02:34:41Z</published><updated>2026-09-07T02:34:41Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/pondercode-devlog-5">&lt;p&gt;The experiment worked! And it has implications for Adamant.&lt;/p&gt;
&lt;h2&gt;Part A: Dependency Resolution&lt;/h2&gt;
&lt;p&gt;As part of the brainstorming, I created a simple Python script where I hardcoded a set of binaries as part of a list and then used &lt;code&gt;ldd&lt;/code&gt; to resolve their dependency graph. This graph was then used to build a shell script that executed Bubblewrap. This is the heart of the script:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;c-kw&gt;def&lt;/c-kw&gt; generate_sand_script(apps):
    &lt;c-str&gt;&amp;quot;&amp;quot;&amp;quot;Constructs the bwrap shell script string.&amp;quot;&amp;quot;&amp;quot;&lt;/c-str&gt;
    bind_mounts = []
    libraries = set()

    &lt;c-com&gt;# 1. Process the requested apps&lt;/c-com&gt;
    &lt;c-kw&gt;for&lt;/c-kw&gt; app &lt;c-kw&gt;in&lt;/c-kw&gt; apps:
        app_path = get_app_path(app)
        &lt;c-kw&gt;if&lt;/c-kw&gt; app_path:
            bind_mounts.append(&lt;c-str&gt;f&amp;quot;  --ro-bind {app_path} {app_path}&amp;quot;&lt;/c-str&gt;)
            &lt;c-com&gt;# Get dependencies for this app&lt;/c-com&gt;
            deps = get_dependencies(app_path)
            &lt;c-kw&gt;for&lt;/c-kw&gt; dep &lt;c-kw&gt;in&lt;/c-kw&gt; deps:
                libraries.add(dep)
        &lt;c-kw&gt;else&lt;/c-kw&gt;:
            print(&lt;c-str&gt;f&amp;quot;Warning: Command &amp;#x27;{app}&amp;#x27; not found in PATH.&amp;quot;&lt;/c-str&gt;)

    &lt;c-com&gt;# 2. Sort libraries for a clean, deterministic output&lt;/c-com&gt;
    sorted_libs = sorted(list(libraries))

    &lt;c-com&gt;# 3. Build the script template&lt;/c-com&gt;
    script = [
        &lt;c-str&gt;&amp;quot;#!/bin/sh&amp;quot;&lt;/c-str&gt;,
        &lt;c-str&gt;&amp;quot;set -euo pipefail&amp;quot;&lt;/c-str&gt;,
        &lt;c-str&gt;&amp;#x27;REAL_HOME=&amp;quot;$HOME&amp;quot;&amp;#x27;&lt;/c-str&gt;,
        &lt;c-str&gt;&amp;#x27;REAL_PROJECT_DIR=&amp;quot;$(pwd)&amp;quot;&amp;#x27;&lt;/c-str&gt;,
        &lt;c-str&gt;&amp;#x27;FAKE_HOME=&amp;quot;/home/user&amp;quot;&amp;#x27;&lt;/c-str&gt;,
        &lt;c-str&gt;&amp;#x27;FAKE_PATH=&amp;quot;/usr/bin&amp;quot;&amp;#x27;&lt;/c-str&gt;,
        &lt;c-str&gt;&amp;quot;&amp;quot;&lt;/c-str&gt;,
        &lt;c-str&gt;&amp;quot;&amp;quot;&lt;/c-str&gt;,
    ]

    exec = [
        &lt;c-str&gt;&amp;quot;exec bwrap --clearenv --unshare-all --die-with-parent&amp;quot;&lt;/c-str&gt;,
        &lt;c-str&gt;&amp;quot;  --tmpfs /&amp;quot;&lt;/c-str&gt;,
        &lt;c-str&gt;&amp;quot;  --tmpfs /tmp&amp;quot;&lt;/c-str&gt;,
    ]

    &lt;c-com&gt;# Add app bind mounts&lt;/c-com&gt;
    &lt;c-kw&gt;for&lt;/c-kw&gt; bm &lt;c-kw&gt;in&lt;/c-kw&gt; bind_mounts:
        exec.append(bm)

    &lt;c-com&gt;# Add library bind mounts&lt;/c-com&gt;
    &lt;c-kw&gt;for&lt;/c-kw&gt; lib &lt;c-kw&gt;in&lt;/c-kw&gt; sorted_libs:
        exec.append(&lt;c-str&gt;f&amp;quot;  --ro-bind {lib} {lib}&amp;quot;&lt;/c-str&gt;)

    &lt;c-com&gt;# Add symlinks and environment setup&lt;/c-com&gt;
    exec.extend(
        [
            &lt;c-str&gt;&amp;quot;  --proc /proc&amp;quot;&lt;/c-str&gt;,
            &lt;c-str&gt;&amp;quot;  --dev /dev&amp;quot;&lt;/c-str&gt;,
            &lt;c-str&gt;&amp;quot;  --symlink /usr/lib /lib&amp;quot;&lt;/c-str&gt;,
            &lt;c-str&gt;&amp;quot;  --symlink /usr/lib64 /lib64&amp;quot;&lt;/c-str&gt;,
            &lt;c-str&gt;&amp;quot;  --symlink /usr/bin /bin&amp;quot;&lt;/c-str&gt;,
            &lt;c-str&gt;&amp;#x27;  --dir &amp;quot;$FAKE_HOME&amp;quot;&amp;#x27;&lt;/c-str&gt;,
            &lt;c-str&gt;&amp;#x27;  --setenv HOME &amp;quot;$FAKE_HOME&amp;quot;&amp;#x27;&lt;/c-str&gt;,
            &lt;c-str&gt;&amp;#x27;  --setenv PATH &amp;quot;$FAKE_PATH&amp;quot;&amp;#x27;&lt;/c-str&gt;,
            &lt;c-str&gt;&amp;#x27;  --chdir &amp;quot;$FAKE_HOME&amp;quot;&amp;#x27;&lt;/c-str&gt;,
            &lt;c-str&gt;&amp;#x27;  &amp;quot;$@&amp;quot;&amp;#x27;&lt;/c-str&gt;,
        ]
    )

    &lt;c-kw&gt;return&lt;/c-kw&gt; &lt;c-str&gt;&amp;quot;\n&amp;quot;&lt;/c-str&gt;.join(script) + &lt;c-str&gt;&amp;quot; \\\n&amp;quot;&lt;/c-str&gt;.join(exec)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I took this and incorporated it into the app. Now, the user does not have to manually map paths into the sandbox. They can provide a list of binaries and the system will resolve them at runtime and prepare the sandbox accordingly.&lt;/p&gt;
&lt;h2&gt;Part B: Sockets + Proxy&lt;/h2&gt;
&lt;p&gt;The app initializes the sandbox with &lt;code&gt;socat&lt;/code&gt; running a proxy on &lt;code&gt;127.0.0.1:8080&lt;/code&gt; inside the sandbox. It also maps a socket path into the sandbox. &lt;code&gt;socat&lt;/code&gt; intercepts the requests from curl and other applications and the app uses the whitelist in the &lt;code&gt;&amp;lt;profile&amp;gt;.hosts&lt;/code&gt; key to decide if the connection can be permitted or not. An important limitation: client applications must support &lt;code&gt;HTTP_PROXY&lt;/code&gt; + &lt;code&gt;HTTPS_PROXY&lt;/code&gt; envars.&lt;/p&gt;
&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;
&lt;p&gt;This exact mechanism, A + B, can be used for Adamant!&lt;/p&gt;
&lt;p&gt;PonderCode is mostly done. I will continue this series in the future when I take a couple of days to iron out various bugs and streamline the codebase.&lt;/p&gt;</content></entry><entry><title>PonderCode Devlog 4</title><link href="https://bhashika.org.in/logs/2026/pondercode-devlog-4"/><id>https://bhashika.org.in/logs/2026/pondercode-devlog-4</id><published>2026-09-06T03:09:45Z</published><updated>2026-09-06T03:09:45Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/pondercode-devlog-4">&lt;p&gt;The list of nice-to-have features is endless. I added a few of them today.&lt;/p&gt;
&lt;p&gt;The first is price list support. The &lt;code&gt;cost&lt;/code&gt; field of the OpenAI API is not reliable based on an analysis of the sessions I have captured. The token information is. So PonderCode now supports price lists with a DSL to compute pricing based on TOD&lt;sup id=&quot;fnref-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; aria-label=&quot;See footnote 1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; and prompt size. A dashboard shows history across providers, models and time.&lt;/p&gt;
&lt;p&gt;The second is an improvement to the UX by allowing edits and deletions of prompts and events so that the context can be surgically pruned. I rejected branching as an option because it is too complex without also building some kind of graph-like UI so that you can see the flow of the conversation. Also, all sessions are persisted. You can load and read them at any time, or continue working on them using other models.&lt;/p&gt;
&lt;p&gt;I had resigned myself to not supporting networking inside the sandbox except via &lt;code&gt;fetch&lt;/code&gt;, but there might be a way out. It involves &lt;code&gt;socat&lt;/code&gt;, sockets and proxy servers. I will have to do some experimentation.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot;&gt;&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;Time-of-day &lt;a href=&quot;#fnref-1-1&quot; class=&quot;fnback&quot; aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;</content></entry><entry><title>PonderCode Devlog 3</title><link href="https://bhashika.org.in/logs/2026/pondercode-devlog-3"/><id>https://bhashika.org.in/logs/2026/pondercode-devlog-3</id><published>2026-09-05T04:48:17Z</published><updated>2026-09-05T04:48:17Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/pondercode-devlog-3">&lt;p&gt;So PonderCode is &lt;em&gt;almost&lt;/em&gt; feature-complete, and secure within reason. The profile system and UI were revamped. Profiles are now locked on start to avoid switching, unwittingly, to profiles with expansive permissions.&lt;/p&gt;
&lt;p&gt;I added a feature that is probably useless but fun: jobs. I can now start multiple sessions with multiple models and switch between them. The jobs run on the server and the client only pulls the information and updates itself. The entire application is built with &lt;code&gt;node&lt;/code&gt; and has but one dependency: &lt;code&gt;smol-toml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I had a &lt;strong&gt;lot&lt;/strong&gt; of issues getting the client and server to play well. The app would persist sessions in a certain way and the client would show something else because each had a rigid way of looking at a turn as a set of prompts and responses. I had to invent a basic unidirectional tape mechanism where events are captured in one direction only and that tape then becomes the single source of truth for both the server and the client.&lt;/p&gt;
&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;
&lt;p&gt;Here are some images from today&amp;#x27;s testing. This is MiMo testing the boundaries of the sandbox.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/logs/2026/pondercode-devlog-3a.jpg&quot; alt=&quot;MiMo exploring the boundaries of the sandbox&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;And this is a conversation with MiMo about the dispatch mechanism of my VM.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/logs/2026/pondercode-devlog-3b.jpg&quot; alt=&quot;MiMo discussing VM dispatch&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</content></entry><entry><title>MuseSpark 1.3 Contributor</title><link href="https://bhashika.org.in/logs/2026/musespark-1-3-contributor"/><id>https://bhashika.org.in/logs/2026/musespark-1-3-contributor</id><published>2026-09-04T14:19:57Z</published><updated>2026-09-04T14:19:57Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/musespark-1-3-contributor">&lt;p&gt;MuseSpark Contributor 1.3 was released the day before yesterday. Even Gemini Flash 3.8 was released the exact same day. So many releases occur nowadays that it is hard to keep track of them all.&lt;/p&gt;
&lt;p&gt;I tried the new MuseSpark on OpenCode Go and it is a substantial improvement over its sibling: the 1.2 release. It is noticeably sharper in its reasoning. It is disappointing that the model continues to hide the CoT reasoning traces and returns summaries instead.&lt;sup id=&quot;fnref-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; aria-label=&quot;See footnote 1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; I still think DeepSeek V4 Flash is the smarter of the two, but the gap seems to have narrowed significantly. The pricing is the same as before:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Type&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Price&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cached Read&lt;/td&gt;&lt;td&gt;$0.002/M&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Input&lt;/td&gt;&lt;td&gt;$0.10/M&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Output&lt;/td&gt;&lt;td&gt;$0.20/M&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;And OpenCode Go provides the same 6x factor, turning a $10 subscription into $60 of usage.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot;&gt;&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;Chain-of-thought. Both DeepSeek and Qwen are far more open about this. &lt;a href=&quot;#fnref-1-1&quot; class=&quot;fnback&quot; aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;</content></entry><entry><title>PonderCode Devlog 2</title><link href="https://bhashika.org.in/logs/2026/pondercode-devlog-2"/><id>https://bhashika.org.in/logs/2026/pondercode-devlog-2</id><published>2026-09-04T03:25:23Z</published><updated>2026-09-04T03:25:23Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/pondercode-devlog-2">&lt;p&gt;I spent a lot of time today polishing the UI/UX. Vertical space is a luxury even on large monitors. You do not want the chat box blocking the bottom 10% of the screen when you are not using it. The page header must go as well.&lt;/p&gt;
&lt;p&gt;Network access is currently only available via the fetch tool call. So, no &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;npm&lt;/code&gt; or &lt;code&gt;uv&lt;/code&gt;. Next on the list is a review of the sandboxing subsystem. Right now, it uses the dumb strategy of locking everything down and mapping paths from the profile. It does not offer much control beyond that.&lt;/p&gt;
&lt;p&gt;I also need to revisit the tool and profile subsystems as I am considering adding a proper &lt;code&gt;tool&lt;/code&gt; tool which makes the top level &lt;code&gt;vcs&lt;/code&gt; tool an aberration. It should preferably be part of the &lt;code&gt;tool&lt;/code&gt; interface:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;code&gt;tool uv&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;tool npm&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;tool vcs&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;The following is under consideration:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;code&gt;tool uv add &amp;lt;package&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;tool uv remove &amp;lt;package&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;tool npm add &amp;lt;package&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;tool npm remove &amp;lt;package&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;tool vcs ...&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Which means &lt;code&gt;vcs&lt;/code&gt; can be dropped from the top level.&lt;/p&gt;
&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;
&lt;p&gt;As of this moment, PonderCode is a &lt;em&gt;fantastic&lt;/em&gt; brainstorming tool. It can talk to any model over the OpenAI API. The following is a conversation with Ling 3.0 from OpenRouter:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/logs/2026/pondercode-devlog-2a.jpg&quot; alt=&quot;PonderCode brainstorming session with Ling 3.0&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;And here, I am building Sudoku using MiniMax M3 from OpenRouter:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/logs/2026/pondercode-devlog-2b.jpg&quot; alt=&quot;PonderCode brainstorming session with MiniMax M3&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</content></entry><entry><title>PonderCode</title><link href="https://bhashika.org.in/logs/2026/pondercode"/><id>https://bhashika.org.in/logs/2026/pondercode</id><published>2026-09-03T13:08:53Z</published><updated>2026-09-03T13:08:53Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/pondercode">&lt;p&gt;I have talked about sandboxing, Bubblewrap, OpenCode Go and &lt;code&gt;pi&lt;/code&gt; in previous logs. I finally decided to take the plunge and develop my own coding harness. My normal workflow revolves around spec-based development and a lot of pondering before I get the LLM to make changes. So I have decided to call the harness &lt;strong&gt;PonderCode&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The initial feature set:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Sandboxing is nonnegotiable and must be enabled by default&lt;/li&gt;&lt;li&gt;Tools: read/write/replace/list/move/search/fetch/exec/vcs&lt;/li&gt;&lt;li&gt;A profile system where a profile specifies the tools available, the whitelist of hosts for fetch, and the folders and files that must be mapped into the sandbox in ro/rw mode&lt;/li&gt;&lt;li&gt;KV caching for llama.cpp&lt;/li&gt;&lt;li&gt;Session continuations: start a session with one model and continue it with another&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I store provider and model information, as well as profiles in a TOML file. The harness executes the profile against the current directory.&lt;/p&gt;
&lt;p&gt;I got an initial version working today.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/logs/2026/pondercode.jpg&quot; alt=&quot;PonderCode initial version running in sandbox&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;Here, you can see the KV prefix caching mechanism working with llama.cpp. pp is 29K t/s with a Q4 quant of Gemma 4 12B running on my 9070 XT!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/logs/2026/pondercode-kv.jpg&quot; alt=&quot;KV prefix caching in llama.cpp showing high prompt-processing throughput&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;I also hit some other important milestones today:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;code&gt;fetch&lt;/code&gt; can only connect to domain name and ip:port combinations in the profile whitelist.&lt;/li&gt;&lt;li&gt;&lt;code&gt;exec&lt;/code&gt; is only allowed inside a Bubblewrap sandbox where no network is available.&lt;/li&gt;&lt;/ul&gt;
&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;
&lt;p&gt;While there is some overlap between Adamant and PonderCode, they are two completely different projects:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Adamant is planned as a general wrapper around Bubblewrap.&lt;/li&gt;&lt;li&gt;PonderCode is a harness that produces LLM-specific sandboxing.&lt;/li&gt;&lt;/ul&gt;</content></entry><entry><title>OpenCode Go Stats</title><link href="https://bhashika.org.in/logs/2026/opencode-go-stats"/><id>https://bhashika.org.in/logs/2026/opencode-go-stats</id><published>2026-09-01T03:41:17Z</published><updated>2026-09-01T03:41:17Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/opencode-go-stats">&lt;p&gt;After two weeks of 12-14h of coding every day on average, I have used only 18% of the monthly limit. DeepSeek, MiMo and MuseSpark are doing a &lt;strong&gt;lot&lt;/strong&gt; of work for pennies on the dollar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/logs/2026/opencode-go-stats.jpg&quot; alt=&quot;OpenCode Go usage showing 18% of monthly limit used&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</content></entry><entry><title>Adamant</title><link href="https://bhashika.org.in/logs/2026/adamant"/><id>https://bhashika.org.in/logs/2026/adamant</id><published>2026-08-31T01:37:19Z</published><updated>2026-08-31T01:37:19Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/adamant">&lt;p&gt;Bubblewrap is great if verbose. Some automation is called for. Enter &lt;strong&gt;Adamant&lt;/strong&gt;: &lt;em&gt;A profile-based sandbox runner&lt;/em&gt; built on top of Bubblewrap.&lt;/p&gt;
&lt;p&gt;The idea is ridiculously simple: use &lt;code&gt;ldd&lt;/code&gt; (or even &lt;code&gt;readelf&lt;/code&gt; or &lt;code&gt;strace&lt;/code&gt;) to determine which libraries and files an executable requires and store the list somewhere. A profile system makes sense. Something like&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;c-com&gt;# ~/.config/adamant/profiles/shell.toml&lt;/c-com&gt;
&lt;c-var&gt;network &lt;/c-var&gt;= &lt;c-str&gt;&amp;quot;none&amp;quot;&lt;/c-str&gt;

&lt;c-var&gt;ro &lt;/c-var&gt;= [
    &lt;c-str&gt;&amp;quot;/usr/lib/ld-linux-x86-64.so.2&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libc.so.6&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libgcc_s.so.1&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libm.so.6&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libpcre2-32.so.0&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libpcre2-32.so.0.15.0&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libpcre2-8.so.0&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libpcre2-8.so.0.15.0&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/lib64/ld-linux-x86-64.so.2&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libncursesw.so.6&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libncursesw.so.6.6&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libreadline.so.8&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libreadline.so.8.3&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/bin/bash&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/bin/ls&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libcap.so.2&amp;quot;&lt;/c-str&gt;,
    &lt;c-str&gt;&amp;quot;/usr/lib/libcap.so.2.78&amp;quot;&lt;/c-str&gt;,
]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which can be produced using&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;c-cmd&gt;adamant&lt;/c-cmd&gt; prepare &lt;c-flag&gt;--profile&lt;/c-flag&gt; shell bash
&lt;c-cmd&gt;adamant&lt;/c-cmd&gt; prepare &lt;c-flag&gt;--profile&lt;/c-flag&gt; shell ls&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and run like so:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;c-cmd&gt;adamant&lt;/c-cmd&gt; run &lt;c-flag&gt;--profile&lt;/c-flag&gt; shell bash&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This command uses the list to produce the &lt;code&gt;bwrap --clearenv ...&lt;/code&gt; machinery we saw earlier.&lt;/p&gt;
&lt;p&gt;Problems:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Network is all or nothing&lt;/li&gt;&lt;li&gt;&lt;code&gt;node&lt;/code&gt; works. &lt;code&gt;npm&lt;/code&gt; doesn&amp;#x27;t, as it is a shell script and not an ELF executable&lt;/li&gt;&lt;li&gt;&lt;code&gt;ldd&lt;/code&gt; and &lt;code&gt;readelf&lt;/code&gt; results do not tally. Is &lt;code&gt;readelf&lt;/code&gt; even necessary?&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Investigation is required.&lt;/p&gt;</content></entry><entry><title>Bubblewrap</title><link href="https://bhashika.org.in/logs/2026/bubblewrap"/><id>https://bhashika.org.in/logs/2026/bubblewrap</id><published>2026-08-30T04:01:42Z</published><updated>2026-08-30T04:01:42Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/bubblewrap">&lt;p&gt;So, Bubblewrap.&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;c-cmd&gt;bwrap&lt;/c-cmd&gt; &lt;c-flag&gt;--clearenv&lt;/c-flag&gt; &lt;c-flag&gt;--unshare-all&lt;/c-flag&gt; &lt;c-flag&gt;--die-with-parent&lt;/c-flag&gt; \
      &lt;c-flag&gt;--tmpfs&lt;/c-flag&gt; / \
      &lt;c-flag&gt;--ro-bind&lt;/c-flag&gt; /usr /usr \
      &lt;c-flag&gt;--ro-bind&lt;/c-flag&gt; /lib64 /lib64 \
      sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;drops you into a shell where you can run some utilities but not much else because the entire root partition has been mounted on tmpfs and then only two specific trees, &lt;code&gt;/usr&lt;/code&gt; and &lt;code&gt;/lib64&lt;/code&gt;, have been mapped into the sandbox.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--clearenv&lt;/code&gt; clears all environment variables.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--unshare-all&lt;/code&gt; unmaps 6 namespaces: &lt;code&gt;user ipc pid net uts cgroup&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Bubblewrap creates the mount namespace from scratch. &lt;code&gt;--tmpfs&lt;/code&gt; and &lt;code&gt;--ro-bind&lt;/code&gt; create or map parts of the file system into the sandbox.&lt;/p&gt;
&lt;p&gt;If you want to see the minimal mapping required to get &lt;code&gt;sh&lt;/code&gt; working, you do this: &lt;code&gt;ldd /usr/bin/sh&lt;/code&gt;, and map all the libraries it outputs. To cut a long story short, this is the minimal sandbox needed to execute &lt;code&gt;sh&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;c-cmd&gt;bwrap&lt;/c-cmd&gt; &lt;c-flag&gt;--clearenv&lt;/c-flag&gt; &lt;c-flag&gt;--unshare-all&lt;/c-flag&gt; &lt;c-flag&gt;--die-with-parent&lt;/c-flag&gt; \
      &lt;c-flag&gt;--tmpfs&lt;/c-flag&gt; / \
      &lt;c-flag&gt;--ro-bind&lt;/c-flag&gt; /usr/lib/libreadline.so.8 /usr/lib/libreadline.so.8 \
      &lt;c-flag&gt;--ro-bind&lt;/c-flag&gt; /usr/lib/libc.so.6 /usr/lib/libc.so.6 \
      &lt;c-flag&gt;--ro-bind&lt;/c-flag&gt; /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2 \
      &lt;c-flag&gt;--ro-bind&lt;/c-flag&gt; /usr/lib/libncursesw.so.6 /usr/lib/libncursesw.so.6 \
      &lt;c-flag&gt;--ro-bind&lt;/c-flag&gt; /usr/bin/sh /usr/bin/sh \
      sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add these flags if you want to poke around:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;c-flag&gt;--ro-bind&lt;/c-flag&gt; /usr/lib/libcap.so.2 /usr/lib/libcap.so.2 \
&lt;c-flag&gt;--ro-bind&lt;/c-flag&gt; /usr/bin/ls /usr/bin/ls \&lt;/code&gt;&lt;/pre&gt;</content></entry><entry><title>Sandbox</title><link href="https://bhashika.org.in/logs/2026/sandbox"/><id>https://bhashika.org.in/logs/2026/sandbox</id><published>2026-08-29T13:10:44Z</published><updated>2026-08-29T13:10:44Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/sandbox">&lt;p&gt;Running software on your machine has always carried with it some risk: viruses, trojans, malware, ransomware and whatnot coming along for the ride. Recently, there have been supply chain attacks across the spectrum: popular projects on GitHub, name- and typo-squatting or account takeovers on npm, the Arch Linux AUR etc. Though problematic, there are mitigations that you can employ against each of these risks.&lt;/p&gt;
&lt;p&gt;I have been using coding harnesses for a while now, and doing so directly on the dev machine. And I am not alone. This sounds insane, given the risks cited above, in this age of VMs and containers. But convenience outweighs the risk of catastrophe every single time.&lt;/p&gt;
&lt;p&gt;Earlier this year, when OpenClaw was everywhere, I briefly considered agents and even built my own runtime called &lt;strong&gt;Sēvaka&lt;/strong&gt;: &lt;em&gt;a secure execution runtime for autonomous AI workers.&lt;/em&gt; It had a lot of features including &lt;em&gt;taints&lt;/em&gt;: the ability to tag the source of data and prevent it from crossing specified boundaries. But I lost interest in it after the proof of concept was done.&lt;/p&gt;
&lt;p&gt;More recently, though, I decided I wanted something far more mundane: the ability to run &lt;a href=&quot;https://pi.dev&quot;&gt;pi&lt;/a&gt; in a sandboxed environment. I didn&amp;#x27;t want the complexity of Docker or Podman. So I went searching. And discovered &lt;a href=&quot;https://github.com/containers/bubblewrap&quot;&gt;Bubblewrap&lt;/a&gt;.&lt;/p&gt;</content></entry><entry><title>AMD ROCm 10</title><link href="https://bhashika.org.in/logs/2026/amd-rocm-10"/><id>https://bhashika.org.in/logs/2026/amd-rocm-10</id><published>2026-08-28T18:14:31Z</published><updated>2026-08-28T18:14:31Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/amd-rocm-10">&lt;p&gt;AMD has bumped the version of its ROCm SDK from 7.2.4 to &lt;a href=&quot;https://newsroom.amd.com/news/rocm-10-software-ai-native-developer-experiences/&quot;&gt;10.0&lt;/a&gt;. I have a 9070 XT. I previously had a 6700 XT. The Vulkan and ROCm interfaces behave differently enough to be a constant irritant.&lt;/p&gt;
&lt;p&gt;Vulkan is easy to use with llama.cpp. Other LLM tooling often requires ROCm.&lt;/p&gt;
&lt;p&gt;pp is higher in ROCm than Vulkan. The reverse is the case with tg.&lt;sup id=&quot;fnref-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; aria-label=&quot;See footnote 1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;section class=&quot;footnotes&quot;&gt;&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;&lt;a href=&quot;https://github.com/ggml-org/llama.cpp/discussions/10879&quot;&gt;Performance of llama.cpp with Vulkan #10879&lt;/a&gt; &lt;a href=&quot;#fnref-1-1&quot; class=&quot;fnback&quot; aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;</content></entry><entry><title>Mogra OCR</title><link href="https://bhashika.org.in/logs/2026/mogra-ocr"/><id>https://bhashika.org.in/logs/2026/mogra-ocr</id><published>2026-08-27T22:28:23Z</published><updated>2026-08-27T22:28:23Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/mogra-ocr">&lt;p&gt;I spent the last couple of weeks trying to build an OCR engine for Devanagari and Latin texts. I call it &lt;strong&gt;Mogra&lt;/strong&gt;. LLMs are fine, and Google Cloud Vision works reasonably well on old Sanskrit books. But we need something like Tesseract: OSS that runs easily on a toaster.&lt;/p&gt;
&lt;p&gt;After several false starts with C(R)NN+CTC+BiLSTM, I scrapped the design in favor of a template-matching system. It works as follows:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;You add a book to the project and extract the images&lt;/li&gt;&lt;li&gt;The app provides a UI that lets you tag character boxes with the actual character. The mapping is stored&lt;/li&gt;&lt;li&gt;The app uses this mapping to rapidly perform a sliding-window match across the entire book&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I ran a test with Stephen Leacock&amp;#x27;s &lt;em&gt;Sunshine Sketches of a Little Town&lt;/em&gt;. The best Tesseract timing was 39s for those 296 pages using:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;c-cmd&gt;export&lt;/c-cmd&gt; &lt;c-var&gt;OMP_NUM_THREADS&lt;/c-var&gt;=8
&lt;c-cmd&gt;mkdir&lt;/c-cmd&gt; &lt;c-flag&gt;-p&lt;/c-flag&gt; ./output
&lt;c-cmd&gt;parallel&lt;/c-cmd&gt; &lt;c-flag&gt;-j&lt;/c-flag&gt; 8 tesseract &lt;c-flag&gt;-l&lt;/c-flag&gt; eng {} ./output/{/.} ::: ./input/*.png&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mogra&amp;#x27;s mogra-mt&lt;sup id=&quot;fnref-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; aria-label=&quot;See footnote 1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; backend does it in 6s. And the output is comparable to Tesseract.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/logs/2026/mogra-ocr.jpg&quot; alt=&quot;Mogra output comparison for Sunshine Sketches&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;With more work, beating Tesseract is feasible. The drawback is that you need to spend 15-30 min doing the mapping manually for each book.&lt;/p&gt;
&lt;p&gt;The project is presently on the back burner as I am busy with Bhāṣikā and some other stuff. But I will revisit it soon enough.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot;&gt;&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;mt = metal-type &lt;a href=&quot;#fnref-1-1&quot; class=&quot;fnback&quot; aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;</content></entry><entry><title>Coding Style</title><link href="https://bhashika.org.in/logs/2026/coding-style"/><id>https://bhashika.org.in/logs/2026/coding-style</id><published>2026-08-24T15:19:33Z</published><updated>2026-08-24T15:19:33Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/coding-style">&lt;p&gt;I have developed a very specific way of writing code over time. While extending an application causes a collapse in discipline in order to get things done, I do try to stick to it where feasible. With the rise of coding LLMs, this task has become a lot easier. I can write what I want and then have it review the codebase and fix it according to my guidelines.&lt;/p&gt;
&lt;p&gt;While my guidelines are often project-specific, the following is a good baseline to follow and gives me maintainable code.&lt;/p&gt;
&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;
&lt;h2&gt;Basic Code Guidelines&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Use SRP/DRY&lt;/li&gt;&lt;li&gt;Functions + immutable data structures &amp;gt; objects with methods&lt;/li&gt;&lt;li&gt;Fail fast: no defensive programming, no backward compatibility, no provisions for migrations&lt;/li&gt;&lt;li&gt;Loose coupling: touching one part of the system should not have a cascading effect across the entire system&lt;/li&gt;&lt;li&gt;No global mutable state. Thread a &lt;code&gt;State&lt;/code&gt;/&lt;code&gt;Environment&lt;/code&gt; object through as the first parameter of every function that needs it.&lt;/li&gt;&lt;li&gt;No stringly-typed code. When used doing hydration/serialization, verify that the strings do not leak beyond function boundaries.&lt;/li&gt;&lt;li&gt;In client/server architecture, both client and server must share a single contract. JSON/XML payload must be lifted into typed data structures before they can be used.&lt;/li&gt;&lt;li&gt;No magic numbers or strings. Lift into constants that are defined in one place and used everywhere.&lt;/li&gt;&lt;li&gt;Unless a branch exits early (&lt;code&gt;if not x then return y&lt;/code&gt;), every &lt;code&gt;if&lt;/code&gt; must have an &lt;code&gt;else&lt;/code&gt;. Every &lt;code&gt;switch&lt;/code&gt; must have a &lt;code&gt;default&lt;/code&gt;. Impossible paths must throw a &lt;code&gt;NotPossible&lt;/code&gt; Assertion, thereby crashing the program.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Error&lt;/code&gt; should only be caught if the function knows what to do with it.&lt;/li&gt;&lt;/ul&gt;
&lt;h2&gt;Naming&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Kind&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Convention&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Example&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Functions&lt;/td&gt;&lt;td&gt;&lt;code&gt;snake_case&lt;/code&gt;, noun-first&lt;/td&gt;&lt;td&gt;&lt;code&gt;user_create()&lt;/code&gt;, &lt;code&gt;mail_send()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dataclasses&lt;/td&gt;&lt;td&gt;&lt;code&gt;PascalCase&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;User&lt;/code&gt;, &lt;code&gt;VerificationCode&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Modules&lt;/td&gt;&lt;td&gt;&lt;code&gt;snake_case&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;email_service.py&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Constants / enums&lt;/td&gt;&lt;td&gt;&lt;code&gt;UPPER_SNAKE_CASE&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;MAX_RETRY_COUNT&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Exception Taxonomy&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Kind&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Meaning&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Handling&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Fault&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Unrecoverable (connection loss, HTTP 500)&lt;/td&gt;&lt;td&gt;Expose via banner/terminal in the UI. Never retried silently.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Error&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Expected in normal business operation (&lt;code&gt;FileNotFound&lt;/code&gt;, &lt;code&gt;InvalidCoupon&lt;/code&gt;, &lt;code&gt;PasswordTooShort&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;Handle explicitly, and report to the user in the normal execution flow.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Assertion&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;API/Function contract breached&lt;/td&gt;&lt;td&gt;Expose via banner/terminal in the UI. Application crashes hard. Never swallowed.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;code&gt;Error&lt;/code&gt; vs &lt;code&gt;Assertion&lt;/code&gt; is a judgment call. A &lt;code&gt;403/404&lt;/code&gt; can mean a genuine dev mistake (stale URL) or hostile interference (tampered payload/route). This must be resolved depending on the application environment: dev vs production.&lt;/p&gt;
&lt;p&gt;Exceptions must never be swallowed silently in any of the three cases.&lt;/p&gt;
&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;
&lt;p&gt;I wrap the above guidelines in a simple prompt:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;language-md&quot;&gt;Do a comprehensive code review of `@src/` and write it to `@docs/&amp;lt;YYYYMMDD[A-Z]&amp;gt;_CODE_REVIEW.md`.

Extract the architecture of the application from the code and write it to `@docs/&amp;lt;YYYYMMDD[A-Z]&amp;gt;_ARCHITECTURE.md`. The elements I am interested in include:

- An intro: what the application does
- Application layout
- The expected shape of the input data, and the output
- Etc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is more than enough to guide most LLMs to do the right thing.&lt;/p&gt;</content></entry><entry><title>MuseSpark 1.2 Contributor</title><link href="https://bhashika.org.in/logs/2026/musespark-1-2-contributor"/><id>https://bhashika.org.in/logs/2026/musespark-1-2-contributor</id><published>2026-08-22T13:29:03Z</published><updated>2026-08-22T13:29:03Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/musespark-1-2-contributor">&lt;p&gt;With DeepSeek now billing separately for peak and off-peak usage, and MiMo being somewhat dumb, I need something that can fill the gap. And MuseSpark 1.2 seems to be it.&lt;/p&gt;
&lt;p&gt;A surprise launch from Meta after the Llama 4 debacle.&lt;sup id=&quot;fnref-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; aria-label=&quot;See footnote 1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; MuseSpark is pretty smart. Not as smart as DeepSeek V4 Flash, but smart nevertheless.&lt;/p&gt;
&lt;p&gt;It has Vision capabilities like MiMo does, though it will try to use Tesseract or some such locally if you provide too many files.&lt;/p&gt;
&lt;p&gt;I registered on the Meta AI website last week in order to try it. But it wanted my selfie before it would let me in. So I declined the offer. Thankfully, it is available via OpenCode with no such restrictions.&lt;/p&gt;
&lt;p&gt;The Contributor version has incredible pricing because Meta, by its own admission, wants to train on your data:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Type&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Price&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cached Read&lt;/td&gt;&lt;td&gt;$0.002/M&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Input&lt;/td&gt;&lt;td&gt;$0.10/M&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Output&lt;/td&gt;&lt;td&gt;$0.20/M&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;It could be a great translation tool, I feel. I tried translating a Sanskrit story. Here are the original, the MuseSpark version, and the Gemini Pro 3.1 version side-by-side:&lt;/p&gt;
&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;
&lt;p&gt;O: &lt;strong&gt;चीनांशुकम्&lt;/strong&gt;&lt;br/&gt;MS: China Silk&lt;br/&gt;MS lit: China-cloth&lt;br/&gt;GP: Chinese Silk&lt;br/&gt;GP lit: Chinese silk&lt;/p&gt;
&lt;p&gt;O: &lt;strong&gt;द्वित्रसहस्रवर्षेभ्यः पूर्वं चीनादेशे कश्चन राजा आसीत्।&lt;/strong&gt;&lt;br/&gt;MS: Two to three thousand years ago, there was a king in China.&lt;br/&gt;MS lit: Two-three-thousand-years before in China a certain king was.&lt;br/&gt;GP: Two to three thousand years ago, there was a king in China.&lt;br/&gt;GP lit: Before two-three thousand years, in China country some king was.&lt;/p&gt;
&lt;p&gt;O: &lt;strong&gt;तस्य पत्न्याः नाम चीलिंग्षी इति।&lt;/strong&gt;&lt;br/&gt;MS: His wife was named Xi Ling Shi.&lt;br/&gt;MS lit: Of him wife&amp;#x27;s name Xi Ling Shi thus.&lt;br/&gt;GP: His wife&amp;#x27;s name was Chilingshi.&lt;br/&gt;GP lit: Of his wife the name &amp;#x27;Chilingshi&amp;#x27; thus.&lt;/p&gt;
&lt;p&gt;O: &lt;strong&gt;सा परमसुन्दरी।&lt;/strong&gt;&lt;br/&gt;MS: She was exceedingly beautiful.&lt;br/&gt;MS lit: She very-beautiful.&lt;br/&gt;GP: She was exceptionally beautiful.&lt;br/&gt;GP lit: She supremely beautiful.&lt;/p&gt;
&lt;p&gt;O: &lt;strong&gt;विवाहसमये तस्याः वयः चतुर्दश वर्षाणि।&lt;/strong&gt;&lt;br/&gt;MS: At the time of their marriage she was fourteen years old.&lt;br/&gt;MS lit: At marriage-time of her age fourteen years.&lt;br/&gt;GP: At the time of their marriage, she was fourteen years old.&lt;br/&gt;GP lit: At marriage time her age fourteen years.&lt;/p&gt;
&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;
&lt;p&gt;Pretty close in my opinion. And Gemini Pro has been my &lt;em&gt;go-to&lt;/em&gt; for Sanskrit translations for the past couple of years.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot;&gt;&lt;p class=&quot;dinkus&quot; aria-hidden=&quot;true&quot;&gt;• • •&lt;/p&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;Rumors of &lt;a href=&quot;https://www.zdnet.com/article/metas-llama-4-herd-controversy-and-ai-contamination-explained/&quot;&gt;benchmaxxing&lt;/a&gt; &lt;a href=&quot;#fnref-1-1&quot; class=&quot;fnback&quot; aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;</content></entry><entry><title>MiMo 2.5</title><link href="https://bhashika.org.in/logs/2026/mimo-2-5"/><id>https://bhashika.org.in/logs/2026/mimo-2-5</id><published>2026-08-19T19:38:17Z</published><updated>2026-08-19T19:38:17Z</updated><summary></summary><content type="html" xml:base="https://bhashika.org.in/logs/2026/mimo-2-5">&lt;p&gt;With the massive price bump by DeepSeek, you now have to plan your work around its off-peak hours if you want your OpenCode Go subscription to last. So I have been looking for alternatives and MiMo 2.5 is a good one. It is not very smart, but you can get it to follow your instructions, mostly. Every few hours, you can get DeepSeek V4 Flash to jump in, do a code review and then clean up the codebase for you.&lt;/p&gt;
&lt;p&gt;MiMo&amp;#x27;s vision capabilities surprised me with the &lt;strong&gt;Mogra&lt;/strong&gt; OCR project. It was able to load images, detect features and work based on such detection. DeepSeek is missing this feature.&lt;/p&gt;
&lt;p&gt;I estimate cache expiry is nearly an hour. So you get a lot of time to think as you code.&lt;/p&gt;</content></entry></feed>