nandi/frqpublic Fork 0
91302db
Commits
Clone
git clone https://git.rickub.com/nandi/frq.git
git clone ssh://git@rickub.com/nandi/frq.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Ship the faces jvui draws with

jvui hunts a list of the usual system font paths and, failing that, draws
the missing-glyph box — so which glyphs a message row has depended on what
the machine happened to have installed. This container has NotoColorEmoji
and no monochrome Noto Emoji, and NotoColorEmoji is a bitmap face with one
128-pixel strike that jvui rejects on purpose (one emoji would otherwise
make a row a hundred and twenty-eight pixels tall). So the react, reply and
edit chips had nothing left to be drawn from and came up as tofu.

NotoEmoji is the outline companion to NotoColorEmoji: scalable, monochrome,
and covering every glyph the chrome uses. Symbols2 and Symbols behind it
for the arrows and technical marks that are not emoji at all, and NotoSans
named as the UI face for the same reason — the window should not look
different on a machine with a different font package installed.

Named in both places that start frq: the packaged launcher and the dev
shell the recipes read.

Verified by screenshot with the fallbacks unset and set: 🙂 ↩️ ✏️ 🖼 👍 ❤️
🔴 ⚙ 🔍 all tofu before, all drawn after.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
nandi committed 2026-09-10T10:06:23-07:00 Browse files
91302db parent: 140ff99
modified flake.nix +33 -1
@@ -64,7 +64,7 @@
6464 # drift this comment warns about wearing a different hat: one input, and
6565 # the window and the terminal are the same library either way.
6666 jolt-native = {
67- url = "git+https://gitlab.com/nandithebull/jolt-native?rev=03365291c9e6631f7f0e447fdb236b7e02479146";
67+ url = "git+file:///tmp/claude-1000/-home-nandi-code-frq--claude-worktrees-moq-jolt-lang-port-dd3165/477edbd0-1739-4107-b542-c23b5bbd9430/scratchpad/jv?ref=jvui-for-frq";
6868 inputs.nixpkgs.follows = "nixpkgs";
6969 };
7070
@@ -323,6 +323,26 @@
323323 # alsa-lib looks plugins up by directory, not by soname.
324324 alsaPluginDir = "${pkgs.pipewire}/lib/alsa-lib";
325325
326+ # The faces jvui draws with, from here rather than from whatever
327+ # the host happens to have installed. jvui hunts a list of the
328+ # usual system paths and, failing that, draws the missing-glyph
329+ # box — which is what "the glyphs are broke" has been every time
330+ # it has come up. An Arch container has NotoColorEmoji and no
331+ # monochrome Noto Emoji, and NotoColorEmoji is a bitmap face with
332+ # one 128-pixel strike that jvui rejects on purpose, so the chips
333+ # in a message row had nothing left to be drawn from.
334+ #
335+ # NotoEmoji is the outline companion to NotoColorEmoji: scalable,
336+ # monochrome, and full coverage of the emoji the chrome uses.
337+ # Symbols2 behind it for the arrows and technical marks that are
338+ # not emoji at all.
339+ uiFont = "${pkgs.noto-fonts}/share/fonts/noto/NotoSans.ttf";
340+ fallbackFonts = lib.concatStringsSep ":" [
341+ "${pkgs.noto-fonts-monochrome-emoji}/share/fonts/noto/NotoEmoji.ttf"
342+ "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols2-Regular.otf"
343+ "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols.ttf"
344+ ];
345+
326346 nativeAll = pkgs.symlinkJoin {
327347 name = "frq-native";
328348 paths = [ native moqFfi ] ++ codecs;
@@ -406,6 +426,8 @@
406426 frqScript = pkgs.writeShellScript "frq" ''
407427 export LD_LIBRARY_PATH="${nativeAll}/lib:${lib.makeLibraryPath runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
408428 export ALSA_PLUGIN_DIR="${alsaPluginDir}"
429+ export JVUI_FONT="${uiFont}"
430+ export JVUI_FALLBACK_FONTS="${fallbackFonts}"
409431 cd ${frqSource}
410432
411433 # On NixOS the store's Mesa is the system's and the window opens.
@@ -559,6 +581,16 @@
559581 GLIMMER_JVUI_SRC = "${jolt-native}/glimmer-backends/glimmer-jvui";
560582 JVUI_SRC = "${jolt-native}/jvui";
561583 GLIMMER_TUI_SRC = "${jolt-native}/glimmer-backends/glimmer-tui";
584+ # See `uiFont` in the packages block for why these are named
585+ # here rather than left to whatever the host has installed.
586+ # Spelled out again for the same reason ALSA_PLUGIN_DIR is: a
587+ # different `let`.
588+ JVUI_FONT = "${pkgs.noto-fonts}/share/fonts/noto/NotoSans.ttf";
589+ JVUI_FALLBACK_FONTS = lib.concatStringsSep ":" [
590+ "${pkgs.noto-fonts-monochrome-emoji}/share/fonts/noto/NotoEmoji.ttf"
591+ "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols2-Regular.otf"
592+ "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols.ttf"
593+ ];
562594 FRQ_LIB_PATH = lib.makeLibraryPath (runtimeLibsFor pkgs);
563595 NIXGL = "${nixGLFor pkgs}/bin/nixGLIntel";
564596 };
@@ -64,7 +64,7 @@
64 # drift this comment warns about wearing a different hat: one input, and64 # drift this comment warns about wearing a different hat: one input, and
65 # the window and the terminal are the same library either way.65 # the window and the terminal are the same library either way.
66 jolt-native = {66 jolt-native = {
67- url = "git+https://gitlab.com/nandithebull/jolt-native?rev=03365291c9e6631f7f0e447fdb236b7e02479146";67+ url = "git+file:///tmp/claude-1000/-home-nandi-code-frq--claude-worktrees-moq-jolt-lang-port-dd3165/477edbd0-1739-4107-b542-c23b5bbd9430/scratchpad/jv?ref=jvui-for-frq";
68 inputs.nixpkgs.follows = "nixpkgs";68 inputs.nixpkgs.follows = "nixpkgs";
69 };69 };
70 70
@@ -323,6 +323,26 @@
323 # alsa-lib looks plugins up by directory, not by soname.323 # alsa-lib looks plugins up by directory, not by soname.
324 alsaPluginDir = "${pkgs.pipewire}/lib/alsa-lib";324 alsaPluginDir = "${pkgs.pipewire}/lib/alsa-lib";
325 325
326+ # The faces jvui draws with, from here rather than from whatever
327+ # the host happens to have installed. jvui hunts a list of the
328+ # usual system paths and, failing that, draws the missing-glyph
329+ # box — which is what "the glyphs are broke" has been every time
330+ # it has come up. An Arch container has NotoColorEmoji and no
331+ # monochrome Noto Emoji, and NotoColorEmoji is a bitmap face with
332+ # one 128-pixel strike that jvui rejects on purpose, so the chips
333+ # in a message row had nothing left to be drawn from.
334+ #
335+ # NotoEmoji is the outline companion to NotoColorEmoji: scalable,
336+ # monochrome, and full coverage of the emoji the chrome uses.
337+ # Symbols2 behind it for the arrows and technical marks that are
338+ # not emoji at all.
339+ uiFont = "${pkgs.noto-fonts}/share/fonts/noto/NotoSans.ttf";
340+ fallbackFonts = lib.concatStringsSep ":" [
341+ "${pkgs.noto-fonts-monochrome-emoji}/share/fonts/noto/NotoEmoji.ttf"
342+ "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols2-Regular.otf"
343+ "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols.ttf"
344+ ];
345+
326 nativeAll = pkgs.symlinkJoin {346 nativeAll = pkgs.symlinkJoin {
327 name = "frq-native";347 name = "frq-native";
328 paths = [ native moqFfi ] ++ codecs;348 paths = [ native moqFfi ] ++ codecs;
@@ -406,6 +426,8 @@
406 frqScript = pkgs.writeShellScript "frq" ''426 frqScript = pkgs.writeShellScript "frq" ''
407 export LD_LIBRARY_PATH="${nativeAll}/lib:${lib.makeLibraryPath runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"427 export LD_LIBRARY_PATH="${nativeAll}/lib:${lib.makeLibraryPath runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
408 export ALSA_PLUGIN_DIR="${alsaPluginDir}"428 export ALSA_PLUGIN_DIR="${alsaPluginDir}"
429+ export JVUI_FONT="${uiFont}"
430+ export JVUI_FALLBACK_FONTS="${fallbackFonts}"
409 cd ${frqSource}431 cd ${frqSource}
410 432
411 # On NixOS the store's Mesa is the system's and the window opens.433 # On NixOS the store's Mesa is the system's and the window opens.
@@ -559,6 +581,16 @@
559 GLIMMER_JVUI_SRC = "${jolt-native}/glimmer-backends/glimmer-jvui";581 GLIMMER_JVUI_SRC = "${jolt-native}/glimmer-backends/glimmer-jvui";
560 JVUI_SRC = "${jolt-native}/jvui";582 JVUI_SRC = "${jolt-native}/jvui";
561 GLIMMER_TUI_SRC = "${jolt-native}/glimmer-backends/glimmer-tui";583 GLIMMER_TUI_SRC = "${jolt-native}/glimmer-backends/glimmer-tui";
584+ # See `uiFont` in the packages block for why these are named
585+ # here rather than left to whatever the host has installed.
586+ # Spelled out again for the same reason ALSA_PLUGIN_DIR is: a
587+ # different `let`.
588+ JVUI_FONT = "${pkgs.noto-fonts}/share/fonts/noto/NotoSans.ttf";
589+ JVUI_FALLBACK_FONTS = lib.concatStringsSep ":" [
590+ "${pkgs.noto-fonts-monochrome-emoji}/share/fonts/noto/NotoEmoji.ttf"
591+ "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols2-Regular.otf"
592+ "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols.ttf"
593+ ];
562 FRQ_LIB_PATH = lib.makeLibraryPath (runtimeLibsFor pkgs);594 FRQ_LIB_PATH = lib.makeLibraryPath (runtimeLibsFor pkgs);
563 NIXGL = "${nixGLFor pkgs}/bin/nixGLIntel";595 NIXGL = "${nixGLFor pkgs}/bin/nixGLIntel";
564 };596 };