
Three new GitHub esolang projects put hostile languages to serious work: a bootable Linux distro whose first userland is a Malbolge-derived glyph program, a ray tracer generated as 23 MB of Brainfuck, and an APL-derived array language that ships on PyPI.
8th-circle-linux boots a Linux userland whose PID 1, shell and core command set are glyph programs in a Malbolge-derived virtual machine. rayfuck renders a ray-traced scene out of 23 MB of Brainfuck. bAsedPL is an APL-derived array language in Rust that installs from PyPI. 123| Category | Project | Created (UTC-05) | What it does | Snapshot |
|---|---|---|---|---|
| Most absurd | bigdevboss/8th-circle-linux | Sep 19, 12:18 | Boots Linux with a Malbolge-derived VM as init, shell and command set | 5 commits; 1 star; 0 forks; GitHub lists Python, the VM runtime is C 1 |
| Most show-off | mTvare6/rayfuck | Sep 23, 11:27 | Ray-traces the Ray Tracing in One Weekend metal scene from 23 MB of Brainfuck | 13 commits; 14 stars; 0 forks; Brainfuck, MIT 2 |
| Most practical | AnswerDotAI/basedpl | Sep 16, 18:22 | An APL-derived array language in Rust, installable from PyPI | 68 commits; 10 stars; 1 fork; APL, Apache-2.0 3 |
crazy operation. 8th-circle-linux takes that machinery and boots a computer with it: the kernel is ordinary Linux, and PID 1, the shell and the core utilities are printable glyph programs for M8, a Malbolge-derived VM written for the job. 1a, c and d registers, the Malbolge-style decoding, the shared code and data memory, and the general bad idea energy. It then adds operations for syscalls, jumps, branches and small data moves. The README gives the trade in one line: M8 takes those extensions "because this thing has to boot Linux userland rather than win an esolang purity contest and die immediately." 1make check to build the runtime, the userland images, a filesystem image, the rootfs and the initramfs, and make qemu to start it. Linux unpacks the initramfs and runs /init, which is the M8 runtime. The runtime loads /sbin/init.mb, and that program claims /dev/console, calls setsid, switches to /, prints /etc/issue, mounts /proc, /sys and /dev where the kernel allows, then forks and execs /bin/m8 /bin/msh.mb. If the shell exits, PID 1 waits a second and respawns it. 14.mb file is printable source: whitespace is skipped, every loaded cell must fall in printable ASCII 33 to 126, and every loaded cell must decode at its own address to a known M8 operation. Remaining memory is filled with the Malbolge crazy operation, executed instruction cells self-cipher through xlat2, and old decimal memory images are rejected whatever header they carry. Inline frame words use five printable base-94 cells, and the assembler picks frame glyphs that also decode as valid source at their addresses, so a syscall number cannot be smuggled in as arbitrary printable junk. 1tools/m8asm.py assembles the glyph programs, tools/m8audit.py runs a strict glyph and source audit, tools/m8_loader_tests.py feeds the loader deliberately bad images, and a pure-Python builder packs the initramfs. make check runs the audit and the negative loader tests before QEMU ever boots, and make qemu-smoke boots the image through a PTY and inspects what came back. 56msh reads input through the ordinary Linux read bridge, parses the command in M8, splits up to eight whitespace-separated arguments, builds an execve argv vector in M8 memory, and launches /bin/NAME.mb. The shipped commands are pwd, issue, echo, cat, ls and four MFS tools, and ls does its job by calling getdents64 and parsing linux_dirent64 records in M8. 1The filesystem is not sane, and neither are we. 1make distro copies a kernel image from the build host instead of compiling Linux from source. The repository is five commits old and carries one star. 1rayfuck renders the metal scene from Ray Tracing in One Weekend as a 23 MB Brainfuck program, and the repository's README says exactly that much. The author's own write-up explains the motive: while relearning CMake, the author read a claim in the tutorial that even ray tracers had been written in the CMake language, and that this is not a recommended practice. He asked what would make a worse host language, picked Brainfuck, and reasoned that a simple language obviously gives a simple codebase. 27ray.c passes through an SSA-like form in ray_ssa.c, where recursive code is made iterative and variables are prefixed by function to avoid name collisions; from there it becomes a small IR the author calls a DSL, and dsl2bf.py lowers that IR into Brainfuck, with c2dsl.py handling the earlier stage. The author notes that the SSA conversion was the only job he gave to a language model. 789[->+<] and a copy is [->+>+<<]. Multiplication is repeated addition with the cells paired, so a four-cell by four-cell product adds each a_i*b_j into result[i+j]. Division is school long division that subtracts the divisor up to 255 times per cell. Square root began as a Taylor fit, which the author plotted and rejected below an encoded value of about 20,000, and ended as long division. Negation uses the two's-complement trick across cells; comparisons decrement two cells together with 128 added to the most significant cell so that negative bytes sort below positive ones; and the supersampling random number generator is the recurrence A = (5*A + 1) % 256. 7vangogh.png from the Brainfuck run, a.png from the C. 71011bAsedPL is an APL-derived array language that borrows from J and BQN, implemented in Rust with a native executable, a Jupyter kernel and a Python API. The AnswerDotAI repository appeared on September 16, has 68 commits, and published six versions to PyPI inside the window, from 0.1.6 on September 20 to 0.1.11 on September 26. It runs on Python 3.10 or later. 312[1 2 3] is a vector and spaces group, which makes a+b × c+d read as (a+b)×(c+d). A run ending in a function is a train, so avg←+/÷≢ defines the mean. Positions and axes count from zero. 3+/⍳10 is 45. The primes below 50 come out of one line, 1+⍸2=+⌿0=|⌝⍨1+⍳50. ⌊⌾(10×)1.25 2.78 returns 1.2 2.7, because ⌾ is Under: transform, apply, reverse the transform. 2×⍣(⍳5) 1 returns 1 2 4 8 16, one state for each count, where count 0 is the initial value. 3x marking exact integers and r exact rationals, so 1r3+1r6 is 1r2 and √¯4 returns 0j2 for the complex root. Axes carry names and string keys, which lets +/⍠"month" sales reduce a keyed array by axis name. System functions cover JSON through •json, charts through •plot, and SVG built from element functions, and regular expressions run on Rust's regex engine. 3from basedpl import fn turns the string '+/÷≢' into a Python callable, and arrays convert out through .py, .np and .df for Python values, NumPy and pandas. The documentation site carries notebook-generated guides for each of those areas. 313MrxSiN/YouTubeMalbolge hides YouTube ads and skips SponsorBlock segments with an Xposed module whose feature policy is written in Malbolge. Ad patterns, category behaviour and resolver weights come from .mal programs that the build compiles ahead of time into JVM bytecode, so the shipped APK carries no Malbolge interpreter and no feature-handler dispatch table. A purity script fails the build if conventional handlers appear or if any behaviour program fails to evaluate as executable MBP1. The validation record documents a Pixel 8 Pro on Android 17 installing the APK, every hook group reporting ready, a cold app launch in 909 ms, and an upgrade hot-reloading without restarting YouTube. The README still opens with a warning against using it and a promise to rewrite it in Brainfuck. 141516Norne9/Brainfuck.Jinx is a .NET 10 Brainfuck toolchain built to be read: a lexer, a peephole parser, a second parser whose idiom rules for [-] and [->+<] are pluggable, a reference interpreter, an IL-emitting JIT built on DynamicMethod, and a bf shell that can print the optimised op-code tree instead of running it. Its xUnit v3 suite asserts that both executors produce identical output on the same program. 17nstarke/js-to-malbolge compiles an integer-based JavaScript subset into Malbolge Unshackled through a bytecode VM with its own assembler, disassembler and versioned binary format, garbage collection included. Its README warns before you start that even small programs produce files tens of megabytes long. 18DannyBaanks, who published three Malbolge repositories in one day: a Malbolge Classic VM in Zig that runs Hello World in 48 steps, an episodic execution record built on SHA-256 chaining, and a Brainfuck-to-Malbolge compiler with separate Malbolge Free and Classic backends. 192021.bf files tripped GitHub's language detection.8th-circle-linux, which took Malbolge's hostile internals into a place where a boot has to succeed, and then wrote the assembler, the audit tool and the boot test that let it make the claim. The show-off crown goes to rayfuck, whose 23 MB program is the output of a compiler pipeline lowering C through two intermediate forms, with the author measuring his own render in pixels per minute and publishing the number. Practical value goes to bAsedPL, which a reader can install this afternoon and which keeps changing in public every few days.github.com
github.com
github.com
github.com
github.com
github.com
epestr.com
github.com
github.com
github.com
github.com
pypi.org
answerdotai.github.io
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.