Skip to content

signal-cli link QR code renders as ?? in terminal (native binary 0.14.5) #2073

Open

Description

@klemens-u

HI, thanks for the great library. Sadly in the last few releases (during ~last month) the following grefression was introduced:

On the Linux native binary (0.14.5), signal-cli link -n "Name" outputs box-drawing Unicode characters (▄▀█, U+2580/U+2584/U+2588) for the QR code, but
they render as ?? in the terminal. This makes the QR unscannable.

The URI line is output correctly and can be used as a workaround.

Environment:

  • signal-cli 0.14.5 (Linux native GraalVM binary)
  • Ubuntu 22.04
  • TERM=xterm-256color
  • stdout encoding: UTF-8

Steps to reproduce:

  1. signal-cli link -n "Test" on Linux native binary
  2. QR block characters render as ?? instead of ▄▀█
  3. Terminal shows sgnl://linkdevice?... URI correctly above the broken QR

Expected: QR code renders as scannable block characters.

Actual: ?? characters instead of box-drawing blocks.

Workaround: The URI is output correctly — extract it and generate a QR elsewhere:

  # Option A: suppress QR, URI only                                                                                                                    
  env TERM=dumb signal-cli link -n "Name"                                                                                                              
                                                                                                                                                       
  # Option B: pipe to file, extract URI, generate PNG QR                                                                                               
  signal-cli link -n "Name" 2>&1 | tee ~/signal-link.txt                                                                                               
  grep -o 'sgnl://linkdevice[^[:space:]]*' ~/signal-link.txt | qrencode -o ~/signal-link.png -s 12 -m 4                                                

Notes:

  • Same behavior reported in earlier versions (known GraalVM native image stdout encoding issue with box-drawing chars U+2580–U+2588)
  • env _JAVA_OPTIONS="-Dfile.encoding=UTF-8" does not fix it (native binary, not JVM)

Activity

  1. m-ueberall commented on Jun 19, 2026

    @m-ueberall

    @klemens-u : This seems to be a problem specific to the upstream GraalVM build; you could try to use one of the third-party binaries (which use a different toolchain) or rebuild it locally:

    root@vserver35<kvm>:~# schroot -c development-ubuntu2404-amd64 -u root -d /build
    root@vserver35<kvm>(chroot:development-ubuntu2404-amd64):/build# wget https://github.com/AsamK/signal-cli/releases/download/v0.14.5/signal-cli-0.14.5-Linux-native.tar.gz
    […]
    root@vserver35<kvm>(chroot:development-ubuntu2404-amd64):/build# tar -xf signal-cli-0.14.5-Linux-native.tar.gz
    […]
    root@vserver35<kvm>(chroot:development-ubuntu2404-amd64):/build# wget https://media.projektzentrisch.de/temp/signal-cli/signal-cli0145_ubuntu2004_amd64.gz
    […]
    root@vserver35<kvm>(chroot:development-ubuntu2404-amd64):/build# gzip -d signal-cli0145_ubuntu2004_amd64.gz; chmod a+rx ./signal-cli*; rm -vf *.tar.gz
    […]
    root@vserver35<kvm>(chroot:development-ubuntu2404-amd64):/build# ls -l
    total 224062
    -rwxr-xr-x 1 root root 354813880 Apr 22 20:23 signal-cli
    -rwxr-xr-x 1 root root 126372008 Jun 11 12:13 signal-cli0145_ubuntu2004_amd64
    root@vserver35<kvm>(chroot:development-ubuntu2404-amd64):/build# ./signal-cli link -n "Test"
    
    ?????????????????????????????????????????????
    ?????????????????????????????????????????????
    ???? ????? ????? ?   ? ?? ???????? ????? ????
    […]
    sgnl://linkdevice?uuid=[…]
    ^C
    root@vserver35<kvm>(chroot:development-ubuntu2404-amd64):/build# ./signal-cli0145_ubuntu2004_amd64 link -n "Test"
    
    █████████████████████████████████████████████
    █████████████████████████████████████████████
    ████ ▄▄▄▄▄ █▄▀ ▄ ▄█▄▀█  █▄ ▄██ ███ ▄▄▄▄▄ ████
    […]
    sgnl://linkdevice?uuid=[…]
    ^C
    root@vserver35<kvm>(chroot:development-ubuntu2404-amd64):/build# env|grep TERM
    TERM=screen-256color
    root@vserver35<kvm>(chroot:development-ubuntu2404-amd64):/build#
    
  2. brad2014 commented on Aug 5, 2026

    @brad2014

    FWIW I reverted to this as a workaround:

    bash# signal-cli $flags link -n $(hostname) | tee >(xargs -L 1 qrencode -t ANSI)
  3. zylzyz commented on Oct 21, 2026

    @zylzyz

    due to privacy, i don't post outputs.

    this bug continues and it is wider. unicode characters do not show correctly, only ascii characters show correctly. best way is to test signal-cli receive and watch unicode quotation marks, should be “something” not ?something?. of course link command is affected.

    however, this affects signal native only. if you use separate java, this bug doesn't happen. if you pipe output into file, then it is proper utf-8 encoding, like signal-cli command >output.txt.

    i used signal-cli-native and signal-cli 0.14.9 to test, on debian unstable (2026-10-21).

    my guess is, java engine which is bundled inside signal-cli-native has something weird.

  4. vrosu commented on Nov 4, 2026

    @vrosu

    Same issue on 0.14.9 with the native linux build.

  5. kikoreis commented on Nov 6, 2026

    @kikoreis

    Same on signal-cli-native package 0.14.9+morph027+2 (Ubuntu 26.04 LTS host, glibc 2.43, x86_64).

    • signal-cli link -n foo on a UTF-8 PTY prints the QR as '?'.
    • The shell is fine: LC_ALL=C.UTF-8 printf '█\n' draws a block in the same session, and locale charmap reports UTF-8.
    • Tried LC_ALL=C.UTF-8, LC_ALL=en_US.UTF-8, TERM=xterm-256color: no change.

    So this looks like the native image's stdout charset, not the terminal. Ended up using qrencode as workaround.

  6. m-ueberall commented on Nov 6, 2026

    @m-ueberall

    FYI: I don't see the explicit (recommended) command-line build option "-Dfile.encoding=UTF-8" for native-image in the respective build logs (e.g. this one or this one). The builds mentioned above do use it; maybe that's all what makes a difference.
    (EDIT1: Looks like you can't directly link to the raw logs on GitHub)
    (EDIT2: Maybe lines 35ff in build.gradle.kts are somehow ignored?)

    Strike that, the "-Dfile.encoding=UTF-8 -J-Dfile.encoding=UTF-8 -march=compatibility --enable-native-access=ALL-UNNAMED" options can be seen in our own logs, so these are passed to native-image and they stem from the above configuration file.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions