Terminal-Based Linux as a Practical Platform for Blind Programmers

By onetrickpony, 16 January, 2026

Forum
App Development and Programming

Having read many posts by blind programmers across different communities, including AppleVis, I would like to draw attention to something that many of you may already know, but that still seems to be underestimated.
1. Integrated Development Environments based on graphical user interfaces have become extremely complex. Even many sighted developers struggle with them, and some of the most experienced developers still prefer programming in an ANSI terminal environment.
2. Graphical user interface applications are often difficult or impossible to test thoroughly as a blind developer, which makes them a less attractive development target.
3. Terminal-based computing is purely symbolic and text-driven, with a predictable and linear screen layout. This makes it a natural fit for blind users—not only for programming, but also for everyday tasks such as email, communication, and system administration.

Linux is probably the strongest platform for this style of work. It can run on a Raspberry Pi (which I personally recommend), or be used on macOS or Windows via containers or hosted systems.

Terminal-based computing and programming certainly involve a learning curve, but many users find the effort worthwhile and empowering in the long run.

In this spirit, I have prepared a Braille-first, terminal-only Linux environment that may serve as a starting point. It is open source and free. Being based on Debian Linux, it allows users to easily install additional software for programming or other purposes as needed.

Project page:
https://github.com/stwelebny/beaver

Beaver is not an operating system itself, but can be installed after you already have setup Debian Linux.

Options

Comments

By João Santos on Friday, January 16, 2026 - 12:11

I have a very strong Linux background dating all the way back to early 1998 when I had the crazy idea of downloading the RedHat Linux 5.1 CD image (currently known as Fedora) over a dial-up connection, got involved in kernel development in the early and mid-2000s during the days of Linux 2.4 and 2.6, and with the exception of gaming, which I had a dedicated PC with Windows for, all my computer use was on Linux. I was one of the first people to join the compositor craze in 2006 with Compiz, used Gentoo for most of my sighted days, and only switched to macOS in 2011 when my vision began to deteriorate. Since then I kept using Linux on VPS hosts, containers, Raspberry Pis, you name it, but never again on the desktop, because the days in which I had fun recompiling the kernel to add support for a Wi-Fi driver, or patching power management code to make some buggy drivers wake back up from suspension, are long gone. Also and since I'm not congenitally blind and lost my sight well into my adulthood, I never felt much need to use Braille, which I did learn in rehabilitation but never actually practiced, and I don't think Braille is particularly useful for coding.

As a speech synthesizer screen-reader user, while I agree that command-line interfaces are vastly superior to graphical interfaces, my opinion flips completely when it comes to other kinds of text user interfaces with graphical user interfaces, so I run from console editors like the devil, and whenever I want to edit something on a remote machine, I just install rmate on it, which is a Ruby script that makes it possible to use TextMate over an ssh tunnel to edit remote files from the command-line as if they were local, and always try to learn about available command-line invocations that can help me avoid all kinds of ncurses interfaces.

By Devin Prater on Friday, January 16, 2026 - 12:50

Try some of those fancy TUI's, with animated spinners, or those Python Terminal prettifyer libs, and you'll see why the Terminal still isn't safe from the sighted's need to visualize, verb, everything. That being said, it is still, at it's core, the most accessible input output system. And that's also why AI's work so well too.

By Doll Eye on Friday, January 16, 2026 - 13:08

This is really interesting.

Please forgive my foolishness. I'm assuming I can use something like parallels to set this up? What you've created is like an overlay for the linux OS, is that right?

By TheBlindGuy07 on Friday, January 16, 2026 - 16:39

Seems that virtually all code editors from cot editor, text mate , vscode, getbrains... when we do command left / right arrow on an indented line (which would be the case most of the time :) ) vo unreliably speaks either half the line above or below it. I think this does not happen in xcode. This drives me insane and isthe reason why I am trying so hard to learn emacspeak . How have you overcome that? Habbit (like all macos accessibility issues? :) )? You hinted many times that all these are due to nstextview... From a user side it seems that no work around is possible? I tend to actually use my braille display for coding on mac only for this, or I just switch on my windows laptop or vm inside parallels.
VIM doesn't work at all on most macs I have tried but for this one guy who is lucky, there is an old thread of mine on this topic here about a year or two ago.
Stormux and arch linux is the only low friction way I've found on my raspberry pi to use vim, and the sad thing is that I loove vim so much. I guess this thing can work on all arm chips so maybe could try to virtualize it on mac? But a linux vm on top of an almost linux ish os just for accessibility is disgusting for me.
As much as I dislike it, my computer science program is completely into microsoft and code/text editing is uncomfortable in guis on mac, at least as a daily driver for me despite three years of experience with the mac.
Terminal itself is great though and I am happy each time I use it!!!
And to @onetrickpony
I haven't tried this yet, but 11/10 on the idea! I was hard of hearing before so can completely relate to this more than most probably.

By onetrickpony on Friday, January 16, 2026 - 16:39

Not foolish at all — that’s a very reasonable question.

Yes, you can use Parallels (or Docker) to run Linux on a Mac. In that case also BEAVER runs inside a standard Debian Linux system. You’re still dependent on macOS + VoiceOver. Braille is then mediated by macOS, not native Linux.

BEAVER is not an overlay in the graphical sense. It’s a set of packages and conventions that configure a Linux system terminal-only and Braille-first, and to include a small, curated set of tools for everyday tasks (mail, web, social, AI, etc.).

So depending on the setup, you can use BEAVER in a few ways:
• On a Raspberry Pi, as a dedicated physical Linux system
• In a virtual machine (for example via Parallels)
• In a container or hosted Linux system, accessed over SSH

BEAVER doesn’t replace Linux; it builds on it and keeps everything text-based and predictable.

Some words on editors: do not look for integrated development environments (read also the comment of @Devin Prater). Linux is an integrated development environment. You can start with nano. And then I recommend to learn vi, even if it's hard in the beginning.

Mail, Mastodon and ChatGPT need some configuration.

BEAVER - "Builders Engineering Accessible Versatile Efficient Realms".

Experienced Linux users probably won't need to install BEAVER. They will already have things in place.

By João Santos on Friday, January 16, 2026 - 18:00

Seems that virtually all code editors from cot editor, text mate , vscode, getbrains... when we do command left / right arrow on an indented line (which would be the case most of the time :) ) vo unreliably speaks either half the line above or below it. I think this does not happen in xcode. This drives me insane and isthe reason why I am trying so hard to learn emacspeak . How have you overcome that? Habbit (like all macos accessibility issues? :) )? You hinted many times that all these are due to nstextview... From a user side it seems that no work around is possible? I tend to actually use my braille display for coding on mac only for this, or I just switch on my windows laptop or vm inside parallels.

I've read your complaints about that specific quirk quite a few times, yes, but while I know what you're talking about, it's not something that interferes even mildly in my workflow, so honestly I never found it to be an issue, not even a minor one. Usually whenever I want to move to the first non-whitespace character in TextMate, I just press Home or Command+Left followed by Option+Right, with the latter not being required in Xcode since it already assumes that you want to move to the first non-whitespace character by default.

I don't even think that the problem is NSTextView in this case, even if I said something different at any point in the past, my current opinion is that it's related to TextMate snapping the character to tab stops matching your indentation preferences on the left most side of every line, and that ends up confusing VoiceOver as it tries to figure out what kind of caret movement you triggered. The reason why it doesn't happen in Xcode is likely because Xcode doesn't do this snapping.

By TheBlindGuy07 on Friday, January 16, 2026 - 18:49

Thanks you :) as always.

By OldBear on Friday, January 16, 2026 - 22:12

Is this a little like the Adriane Knoppix setup, a text desktop?
I'm not a programmer, but I just wondered, because it used some sort of voodoo of calling up part of Gnome when launching Firefox and other graphical programs that also launched Orca, all without having to start a full GUI. LXDE back when I was using it.

By emassey on Saturday, January 17, 2026 - 00:57

I agree about Curses programs and other TUI programs often being hard to use. For my editor I use Edbrowse, which is not a TUI but rather an interface similar to a shell like Bash. Just pressing enter outputs the next line in the file, a period outputs the current line, dash outputs the previous line, etc. Every command that moves to a new line of the file outputs that line, and there are commands for outputing a range of lines, but the entire file is not displayed on the screen and it only displays what you tell it to display. There are commands for marking the current line and going back to marks, searching for regular expressions, search and replace, etc, and this is only the beginning because you can combine line ranges with commands, and have it, for example, replace a string of text from mark a to mark b. You can also have multiple buffers open for different files and copy text between them, read shell command output into buffers and pipe buffers into shell commands, etc.

It even has a web browser, with the same interface as the editor but with commands for activating links, filling form fields, etc. It does not support advanced Javascript, so things like Google search, Google Docs, etc do not work, but it is a good browser for reading documentation and things like that. It also has an email client for both sending and receiving emails, and an IRC client. This kind of interface seems better for speech than Braille but I use it a lot with Braille as well, and I use it for almost all the programming I do.

By emassey on Saturday, January 17, 2026 - 01:18

I agree Raspberry Pi's are good devices for terminal Linux and for Beaver. I think two devices in particular to look at are the Raspberry Pi 500+ and the BT Speak. The Pi 500+ is a QWERTY keyboard with a computer inside it, and it has 16 GB of RAM and a 256 GB SSD. It does not have a battery or speakers, but you can power it off a portable power bank and connect headphones with USB or Bluetooth, and a Braille display as well. The Pi 500+ itself is $200. There is also the BT Speak, which is based on the Raspberry Pi 4, so the CPU is less powerful, and has 8 GB of RAM and 32 GB of internal storage, but it is significantly smaller than the Pi 500+ and has a Braille keyboard, a battery, and built-in speakers. It has its own custom applications and user interface, but it is based on Raspberry Pi OS and you can easily access the terminal, so you should be able to install Beaver on it. It is significantly more expensive though.

By João Santos on Saturday, January 17, 2026 - 05:15

I'm not going to create an issue on GitHub about this since I do not consider myself the target audience, but I did install this in a Debian container and found the process to be rather convoluted for new users, especially the character set and font selection steps, which are both presented as lists with tab-separated columns that don't work very well with screen-readers.

For starters I'm on macOS, and although I do have a bunch of Raspberry Pis that I could use to run this, I decided to just go ahead and try it on my own Mac, using the Docker container front-end on CoLiMa, which is itself a container back-end on top of LiMa which is an implementation similar to the Windows Subsystem for Linux on macOS. The Docker front-end, CoLiMa, and all the required dependencies were already installed and updated on my system through MacPorts so that part of the setup is omitted, but the rest were the steps I took to get this installed. I did not run anything after the installation since that was not the point, plus things would need to be configured adding extra complexity to the process.

So first I just started CoLiMa, which is usually always running on my system as its 128GB of RAM are plenty for pretty much everything, but for illustration purposes, I did stop the service and then started it again to get the terminal output:

jps@alpha ~ % colima start
INFO[0000] starting colima                              
INFO[0000] runtime: docker                              
INFO[0001] starting ...                                  context=vm
INFO[0016] provisioning ...                              context=docker
INFO[0017] starting ...                                  context=docker
INFO[0018] done                                         

Then I spun up the official Debian container image using the Docker front-end and got the root shell inside the new container:

jps@alpha ~ % docker run -ti --label=beaver debian
Unable to find image 'debian:latest' locally
latest: Pulling from library/debian
5582010cab7f: Pull complete 
Digest: sha256:5cf544fad978371b3df255b61e209b373583cb88b733475c86e49faa15ac2104
Status: Downloaded newer image for debian:latest
root@90327b105b18:/# 

Inside the container, I upgraded the package metadata:

root@90327b105b18:/# apt-get update
Get:1 http://deb.debian.org/debian trixie InRelease [140 kB]
Get:2 http://deb.debian.org/debian trixie-updates InRelease [47.3 kB]
Get:3 http://deb.debian.org/debian-security trixie-security InRelease [43.4 kB]
Get:4 http://deb.debian.org/debian trixie/main arm64 Packages [9607 kB]
Get:5 http://deb.debian.org/debian trixie-updates/main arm64 Packages [5404 B]
Get:6 http://deb.debian.org/debian-security trixie-security/main arm64 Packages [96.2 kB]
Fetched 9940 kB in 1s (6913 kB/s)                     
Reading package lists... Done
root@90327b105b18:/# 

Then I installed curl so that I could actually download a Beaver release with all its assets:

root@90327b105b18:/# apt-get install curl
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  bash-completion ca-certificates krb5-locales libbrotli1 libcom-err2 libcurl4t64 libffi8 libgnutls30t64 libgssapi-krb5-2 libidn2-0 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libldap-common libldap2 libnghttp2-14 libnghttp3-9 libp11-kit0 libpsl5t64 librtmp1
  libsasl2-2 libsasl2-modules libsasl2-modules-db libssh2-1t64 libtasn1-6 libunistring5 openssl publicsuffix
Suggested packages:
  gnutls-bin krb5-doc krb5-user libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql
The following NEW packages will be installed:
  bash-completion ca-certificates curl krb5-locales libbrotli1 libcom-err2 libcurl4t64 libffi8 libgnutls30t64 libgssapi-krb5-2 libidn2-0 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libldap-common libldap2 libnghttp2-14 libnghttp3-9 libp11-kit0 libpsl5t64
  librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libssh2-1t64 libtasn1-6 libunistring5 openssl publicsuffix
0 upgraded, 30 newly installed, 0 to remove and 0 not upgraded.
Need to get 7099 kB of archives.
After this operation, 22.5 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://deb.debian.org/debian trixie/main arm64 bash-completion all 1:2.16.0-7 [319 kB]
Get:2 http://deb.debian.org/debian trixie/main arm64 openssl arm64 3.5.4-1~deb13u1 [1459 kB]
Get:3 http://deb.debian.org/debian trixie/main arm64 ca-certificates all 20250419 [162 kB]
Get:4 http://deb.debian.org/debian trixie/main arm64 krb5-locales all 1.21.3-5 [101 kB]
Get:5 http://deb.debian.org/debian trixie/main arm64 libbrotli1 arm64 1.1.0-2+b7 [308 kB]
Get:6 http://deb.debian.org/debian trixie/main arm64 libkrb5support0 arm64 1.21.3-5 [32.4 kB]
Get:7 http://deb.debian.org/debian trixie/main arm64 libcom-err2 arm64 1.47.2-3+b7 [24.9 kB]
Get:8 http://deb.debian.org/debian trixie/main arm64 libk5crypto3 arm64 1.21.3-5 [81.2 kB]
Get:9 http://deb.debian.org/debian trixie/main arm64 libkeyutils1 arm64 1.6.3-6 [9716 B]
Get:10 http://deb.debian.org/debian trixie/main arm64 libkrb5-3 arm64 1.21.3-5 [308 kB]
Get:11 http://deb.debian.org/debian trixie/main arm64 libgssapi-krb5-2 arm64 1.21.3-5 [127 kB]
Get:12 http://deb.debian.org/debian trixie/main arm64 libunistring5 arm64 1.3-2 [453 kB]
Get:13 http://deb.debian.org/debian trixie/main arm64 libidn2-0 arm64 2.3.8-2 [107 kB]
Get:14 http://deb.debian.org/debian trixie/main arm64 libsasl2-modules-db arm64 2.1.28+dfsg1-9 [20.1 kB]
Get:15 http://deb.debian.org/debian trixie/main arm64 libsasl2-2 arm64 2.1.28+dfsg1-9 [55.6 kB]
Get:16 http://deb.debian.org/debian trixie/main arm64 libldap2 arm64 2.6.10+dfsg-1 [179 kB]
Get:17 http://deb.debian.org/debian trixie/main arm64 libnghttp2-14 arm64 1.64.0-1.1 [71.4 kB]
Get:18 http://deb.debian.org/debian trixie/main arm64 libnghttp3-9 arm64 1.8.0-1 [63.2 kB]
Get:19 http://deb.debian.org/debian trixie/main arm64 libpsl5t64 arm64 0.21.2-1.1+b1 [57.1 kB]
Get:20 http://deb.debian.org/debian trixie/main arm64 libffi8 arm64 3.4.8-2 [21.3 kB]
Get:21 http://deb.debian.org/debian trixie/main arm64 libp11-kit0 arm64 0.25.5-3 [409 kB]
Get:22 http://deb.debian.org/debian trixie/main arm64 libtasn1-6 arm64 4.20.0-2 [47.3 kB]
Get:23 http://deb.debian.org/debian trixie/main arm64 libgnutls30t64 arm64 3.8.9-3+deb13u1 [1375 kB]
Get:24 http://deb.debian.org/debian trixie/main arm64 librtmp1 arm64 2.4+20151223.gitfa8646d.1-2+b5 [56.8 kB]
Get:25 http://deb.debian.org/debian trixie/main arm64 libssh2-1t64 arm64 1.11.1-1 [235 kB]
Get:26 http://deb.debian.org/debian trixie/main arm64 libcurl4t64 arm64 8.14.1-2+deb13u2 [359 kB]
Get:27 http://deb.debian.org/debian trixie/main arm64 curl arm64 8.14.1-2+deb13u2 [262 kB]
Get:28 http://deb.debian.org/debian trixie/main arm64 libldap-common all 2.6.10+dfsg-1 [35.1 kB]
Get:29 http://deb.debian.org/debian trixie/main arm64 libsasl2-modules arm64 2.1.28+dfsg1-9 [62.9 kB]
Get:30 http://deb.debian.org/debian trixie/main arm64 publicsuffix all 20250328.1952-0.1 [296 kB]
Fetched 7099 kB in 2s (4418 kB/s)     
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 79, <STDIN> line 30.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC entries checked: /etc/perl /usr/local/lib/aarch64-linux-gnu/perl/5.40.1 /usr/local/share/perl/5.40.1 /usr/lib/aarch64-linux-gnu/perl5/5.40 /usr/share/perl5 /usr/lib/aarch64-linux-gnu/perl-base /usr/lib/aarch64-linux-gnu/perl/5.40 /usr/share/perl/5.40 /usr/local/lib/site_perl) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 8, <STDIN> line 30.)
debconf: falling back to frontend: Teletype
Preconfiguring packages ...
Selecting previously unselected package bash-completion.
(Reading database ... 4934 files and directories currently installed.)
Preparing to unpack .../00-bash-completion_1%3a2.16.0-7_all.deb ...
Unpacking bash-completion (1:2.16.0-7) ...
Selecting previously unselected package openssl.
Preparing to unpack .../01-openssl_3.5.4-1~deb13u1_arm64.deb ...
Unpacking openssl (3.5.4-1~deb13u1) ...
Selecting previously unselected package ca-certificates.
Preparing to unpack .../02-ca-certificates_20250419_all.deb ...
Unpacking ca-certificates (20250419) ...
Selecting previously unselected package krb5-locales.
Preparing to unpack .../03-krb5-locales_1.21.3-5_all.deb ...
Unpacking krb5-locales (1.21.3-5) ...
Selecting previously unselected package libbrotli1:arm64.
Preparing to unpack .../04-libbrotli1_1.1.0-2+b7_arm64.deb ...
Unpacking libbrotli1:arm64 (1.1.0-2+b7) ...
Selecting previously unselected package libkrb5support0:arm64.
Preparing to unpack .../05-libkrb5support0_1.21.3-5_arm64.deb ...
Unpacking libkrb5support0:arm64 (1.21.3-5) ...
Selecting previously unselected package libcom-err2:arm64.
Preparing to unpack .../06-libcom-err2_1.47.2-3+b7_arm64.deb ...
Unpacking libcom-err2:arm64 (1.47.2-3+b7) ...
Selecting previously unselected package libk5crypto3:arm64.
Preparing to unpack .../07-libk5crypto3_1.21.3-5_arm64.deb ...
Unpacking libk5crypto3:arm64 (1.21.3-5) ...
Selecting previously unselected package libkeyutils1:arm64.
Preparing to unpack .../08-libkeyutils1_1.6.3-6_arm64.deb ...
Unpacking libkeyutils1:arm64 (1.6.3-6) ...
Selecting previously unselected package libkrb5-3:arm64.
Preparing to unpack .../09-libkrb5-3_1.21.3-5_arm64.deb ...
Unpacking libkrb5-3:arm64 (1.21.3-5) ...
Selecting previously unselected package libgssapi-krb5-2:arm64.
Preparing to unpack .../10-libgssapi-krb5-2_1.21.3-5_arm64.deb ...
Unpacking libgssapi-krb5-2:arm64 (1.21.3-5) ...
Selecting previously unselected package libunistring5:arm64.
Preparing to unpack .../11-libunistring5_1.3-2_arm64.deb ...
Unpacking libunistring5:arm64 (1.3-2) ...
Selecting previously unselected package libidn2-0:arm64.
Preparing to unpack .../12-libidn2-0_2.3.8-2_arm64.deb ...
Unpacking libidn2-0:arm64 (2.3.8-2) ...
Selecting previously unselected package libsasl2-modules-db:arm64.
Preparing to unpack .../13-libsasl2-modules-db_2.1.28+dfsg1-9_arm64.deb ...
Unpacking libsasl2-modules-db:arm64 (2.1.28+dfsg1-9) ...
Selecting previously unselected package libsasl2-2:arm64.
Preparing to unpack .../14-libsasl2-2_2.1.28+dfsg1-9_arm64.deb ...
Unpacking libsasl2-2:arm64 (2.1.28+dfsg1-9) ...
Selecting previously unselected package libldap2:arm64.
Preparing to unpack .../15-libldap2_2.6.10+dfsg-1_arm64.deb ...
Unpacking libldap2:arm64 (2.6.10+dfsg-1) ...
Selecting previously unselected package libnghttp2-14:arm64.
Preparing to unpack .../16-libnghttp2-14_1.64.0-1.1_arm64.deb ...
Unpacking libnghttp2-14:arm64 (1.64.0-1.1) ...
Selecting previously unselected package libnghttp3-9:arm64.
Preparing to unpack .../17-libnghttp3-9_1.8.0-1_arm64.deb ...
Unpacking libnghttp3-9:arm64 (1.8.0-1) ...
Selecting previously unselected package libpsl5t64:arm64.
Preparing to unpack .../18-libpsl5t64_0.21.2-1.1+b1_arm64.deb ...
Unpacking libpsl5t64:arm64 (0.21.2-1.1+b1) ...
Selecting previously unselected package libffi8:arm64.
Preparing to unpack .../19-libffi8_3.4.8-2_arm64.deb ...
Unpacking libffi8:arm64 (3.4.8-2) ...
Selecting previously unselected package libp11-kit0:arm64.
Preparing to unpack .../20-libp11-kit0_0.25.5-3_arm64.deb ...
Unpacking libp11-kit0:arm64 (0.25.5-3) ...
Selecting previously unselected package libtasn1-6:arm64.
Preparing to unpack .../21-libtasn1-6_4.20.0-2_arm64.deb ...
Unpacking libtasn1-6:arm64 (4.20.0-2) ...
Selecting previously unselected package libgnutls30t64:arm64.
Preparing to unpack .../22-libgnutls30t64_3.8.9-3+deb13u1_arm64.deb ...
Unpacking libgnutls30t64:arm64 (3.8.9-3+deb13u1) ...
Selecting previously unselected package librtmp1:arm64.
Preparing to unpack .../23-librtmp1_2.4+20151223.gitfa8646d.1-2+b5_arm64.deb ...
Unpacking librtmp1:arm64 (2.4+20151223.gitfa8646d.1-2+b5) ...
Selecting previously unselected package libssh2-1t64:arm64.
Preparing to unpack .../24-libssh2-1t64_1.11.1-1_arm64.deb ...
Unpacking libssh2-1t64:arm64 (1.11.1-1) ...
Selecting previously unselected package libcurl4t64:arm64.
Preparing to unpack .../25-libcurl4t64_8.14.1-2+deb13u2_arm64.deb ...
Unpacking libcurl4t64:arm64 (8.14.1-2+deb13u2) ...
Selecting previously unselected package curl.
Preparing to unpack .../26-curl_8.14.1-2+deb13u2_arm64.deb ...
Unpacking curl (8.14.1-2+deb13u2) ...
Selecting previously unselected package libldap-common.
Preparing to unpack .../27-libldap-common_2.6.10+dfsg-1_all.deb ...
Unpacking libldap-common (2.6.10+dfsg-1) ...
Selecting previously unselected package libsasl2-modules:arm64.
Preparing to unpack .../28-libsasl2-modules_2.1.28+dfsg1-9_arm64.deb ...
Unpacking libsasl2-modules:arm64 (2.1.28+dfsg1-9) ...
Selecting previously unselected package publicsuffix.
Preparing to unpack .../29-publicsuffix_20250328.1952-0.1_all.deb ...
Unpacking publicsuffix (20250328.1952-0.1) ...
Setting up libkeyutils1:arm64 (1.6.3-6) ...
Setting up libbrotli1:arm64 (1.1.0-2+b7) ...
Setting up libsasl2-modules:arm64 (2.1.28+dfsg1-9) ...
Setting up libnghttp2-14:arm64 (1.64.0-1.1) ...
Setting up krb5-locales (1.21.3-5) ...
Setting up libcom-err2:arm64 (1.47.2-3+b7) ...
Setting up libldap-common (2.6.10+dfsg-1) ...
Setting up libkrb5support0:arm64 (1.21.3-5) ...
Setting up libsasl2-modules-db:arm64 (2.1.28+dfsg1-9) ...
Setting up bash-completion (1:2.16.0-7) ...
Setting up libunistring5:arm64 (1.3-2) ...
Setting up libk5crypto3:arm64 (1.21.3-5) ...
Setting up libsasl2-2:arm64 (2.1.28+dfsg1-9) ...
Setting up libnghttp3-9:arm64 (1.8.0-1) ...
Setting up libffi8:arm64 (3.4.8-2) ...
Setting up libtasn1-6:arm64 (4.20.0-2) ...
Setting up libkrb5-3:arm64 (1.21.3-5) ...
Setting up libssh2-1t64:arm64 (1.11.1-1) ...
Setting up openssl (3.5.4-1~deb13u1) ...
Setting up publicsuffix (20250328.1952-0.1) ...
Setting up libldap2:arm64 (2.6.10+dfsg-1) ...
Setting up libidn2-0:arm64 (2.3.8-2) ...
Setting up ca-certificates (20250419) ...
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 79.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC entries checked: /etc/perl /usr/local/lib/aarch64-linux-gnu/perl/5.40.1 /usr/local/share/perl/5.40.1 /usr/lib/aarch64-linux-gnu/perl5/5.40 /usr/share/perl5 /usr/lib/aarch64-linux-gnu/perl-base /usr/lib/aarch64-linux-gnu/perl/5.40 /usr/share/perl/5.40 /usr/local/lib/site_perl) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 8.)
debconf: falling back to frontend: Teletype
Updating certificates in /etc/ssl/certs...
150 added, 0 removed; done.
Setting up libp11-kit0:arm64 (0.25.5-3) ...
Setting up libgssapi-krb5-2:arm64 (1.21.3-5) ...
Setting up libgnutls30t64:arm64 (3.8.9-3+deb13u1) ...
Setting up libpsl5t64:arm64 (0.21.2-1.1+b1) ...
Setting up librtmp1:arm64 (2.4+20151223.gitfa8646d.1-2+b5) ...
Setting up libcurl4t64:arm64 (8.14.1-2+deb13u2) ...
Setting up curl (8.14.1-2+deb13u2) ...
Processing triggers for libc-bin (2.41-12+deb13u1) ...
Processing triggers for ca-certificates (20250419) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
root@90327b105b18:/# 

Then I downloaded Beaver and its assets:

root@90327b105b18:/# cd
root@90327b105b18:~# for i in -ai -core -core-config -internet -mail -social ''; do curl -sLO 'https://github.com/stwelebny/beaver/releases/download/v0.1.0/beaver'$i'_0.1.0_all.deb'; done
root@90327b105b18:~# ls -l
total 32
-rw-r--r-- 1 root root 3112 Jan 17 04:25 beaver-ai_0.1.0_all.deb
-rw-r--r-- 1 root root 4320 Jan 17 04:25 beaver-core-config_0.1.0_all.deb
-rw-r--r-- 1 root root 1512 Jan 17 04:25 beaver-core_0.1.0_all.deb
-rw-r--r-- 1 root root 1156 Jan 17 04:25 beaver-internet_0.1.0_all.deb
-rw-r--r-- 1 root root 1156 Jan 17 04:25 beaver-mail_0.1.0_all.deb
-rw-r--r-- 1 root root 1104 Jan 17 04:25 beaver-social_0.1.0_all.deb
-rw-r--r-- 1 root root 1164 Jan 17 04:25 beaver_0.1.0_all.deb
root@90327b105b18:~# 

Only at this point was I finally able to begin installing the downloaded packages, whose output I cannot paste here because it didn't even fit my terminal buffer, so I'll just leave the command prompt:

root@90327b105b18:~# apt install ./*.deb

My suggestion to the original poster is to post a shell script to GitHub in the project repository or as a gist, and provide a one-liner command to download and run that script much in the same way Rust is normally installed, as well as a Dockerfile to automate the generation of a container image with everything ready to go for those like me who'd rather just use a container, with instructions on how to set up the system using CoLiMa or any other back-end, with a front-end that doesn't even have to be Docker itself, to generate the container.


Editing to mention errata and add another suggestion.

First let me correct myself, since in the Docker command prompt above, I used the --label switch when my intention was to use the --name switch to name the new container. The command worked because the --label switch does exist, which is why I did not notice that mistake, but its function is to actually define key-value pairs of metadata, not name containers.

Secondly, I suggest creating a git tag named stable, which as its name implies, should always refer whatever commit is currently the latest stable version, as that allows installation scripts and instructions to use that tag instead of specific version tags and thus be less version-dependent. At the time of this comment, the stable tag should probably refer the same commit as the v0.1.0 tag, or if that's not considered stable due to being a pre-1.0 version, then maybe the tag should instead be named experimental or something of that kind.

By Daniil Gusev on Saturday, January 17, 2026 - 08:01

Have you ever used orbstack for virtual machines and containerization? If not, I assure you that you'll be pleasantly surprised by this solution :)