Most of the programs listed in this page were written to
address my own concerns and for my own amusement.
Nonetheless, I wish others find them of service or interesting.
The most popular of these programs are probably
RECENT CHANGES AND COMMENTS
- Aug 2017: Added tsvm,
a simple virtual machine for TSLANG IR for an undergraduate
- Aug 2017: Added -mgr macro package to neatroff_make for creating
- Aug 2017: The roff source of Neatroff documentation is
included in the demo directory of neatroff_make.
- Aug 2017: Neatroff_make now uses urw-core35 fonts by default.
- Aug 2017: Neatmkfn reads the CFF table of OpenType fonts.
- Jun 2017: Virtual terminals should never change the position
of characters on the screen for reasons like rendering
bidirectional text (sadly done in terminals like Konsole).
- Jun 2017: Uploaded dblp
to convert dblp.org search results to refer records.
- May 2017: Neatroff supports blank line macro request (.blm).
- Mar 2017: Added -c option to Neateqn to specify at which characters equations
should be split, which may greatly improve eqn's syntax. The
option is explained in the "Adjusting the Syntax" section of
- Mar 2017: Uploaded a large Neateqn sample.
- Jan 2017: Added the .ffsc request to Neatroff, to specify the active
script for each font (an OpenType font may support several scripts).
- Dec 2016: I am writing a Neatroff package for Farsi theses
- Dec 2016: The standalone branch of neatroff_make is merged into the master.
- Dec 2016: Neatroff and neatmkfn now support OpenType mark-to-base positioning rules.
- Dec 2016: Uploaded a neatroff macro package (pt.tmac)
to create simple two-dimensional figures
(used for the figures in this).
- Nov 2016: Added a few helper macros to neatroff_make;
-mtbl for drawing simple tables (without the tbl preprocessor),
-mkeep for managing floating objects, -mfa for Farsi manuscript.
- Oct 2016: Uploaded a small programming contest judge named chth.
- Sep 2016: Stretchable no-break space (\~) is supported in neatroff.
- Aug 2016: Neatcc's global register allocation is enhanced
to allow allocating multiple registers to a local and
allocating a register to multiple locals.
- Jul 2016: Neatroff now supports Groff-like .tkf request for tracking
- Jun 2016: In Neatroff, the edges of polygons (\D'p ..') can
now be lines, arcs, or splines.
- May 2016: Uploaded a patch to rotate the output
of fbpad 180 degrees.
- Apr 2016: Neatcc is
updated to include intermediate code optimisations
and cleaner intermediate and final code generation.
Neatcc Introduction is updated accordingly.
The old two-pass compilation is available in noic branch.
- Apr 2016: Neatcc_make
includes a makefile to obtain and build Neatcc,
Neatld, and Neatlibc.
- Mar 2016: A new section in Getting Started with Neatroff
describes how to use Neatroff without installing it.
- Feb 2016: Neatvi now highlights neatmail listings.
- Feb 2016: I use this wrapper script for neatmail.
- Jan 2016: I have uploaded fbpad_mkfn,
a replacement for ft2tf, for generating fbpad font files. It
can use either stb truetype header or freetype library.
- Jan 2016: Neatrefer now
supports "\*[cite label]" citations and replaces them
with "\*[cite refno]", in which refno is the reference number
of the entry with the given label.
- Jan 2016: pop3 and
smtp can now use
either mbedtls (polarssl) or openssl.
- Dec 2015: I am writing Neatmail,
my new mail client.
- Dec 2015: Neatcc may be changed to adopt a new intermediate code.
- Nov 2015: Note that Neatvi can use terminal 256-colour
palette if available, as specified in this conf.h.
- Sep 2015: Uploaded a new version of pdftxt
to work with mupdf-1.7a (patch contributed by Laura Michaels).
- Jul 2015: Uploaded dnsred to redirect DNS
queries to other UDP/TCP DNS servers; it is very simple but
could be easily extended to support simultaneous queries and
- Jun 2015: Added breakcost command to Neateqn to specify line-break
cost after top-level operators; Neateqn Introduction
includes more details.
- May 2015: I am writing Neatvi,
a vi/ex editor for editing bidirectional utf-8 files.
- Mar 2015: After more than two years I have updated fbff: now it
features more accurate seeking commands and vi-like marks, as
- Mar 2015: Neateqn can now break long equations after binary and
- Jan 2015: Neatroff_make now
includes manual pages for neatroff and its helper programs (contributed
by Larry Kollar).
- Jan 2015: Uploaded Getting Started with Neatroff.
- Dec 2014: Uploaded a Neateqn Introduction.
- Oct 2014: To make setting up Neatroff easier, I have
which contains a top-level makefile to obtain, build, and install
Neatroff and its pre- and post-processors. Carsten Kunze
suggested it originally and helped to port it to common Unix environments.
- Sep 2014: Many of the incompatibilities of Neatroff are
fixed; most of the credit goes to
Carsten Kunze and Dirk-Wilhelm Peters for finding them.
- Apr 2014: Now Neateqn uses Computer Modern glyphs for brackets
and radicals if they are available (see Neateqn's README).
- Feb 2014: Uploaded version 0.9 of ft2tf, which allows specifying
distinct horizontal and vertical DPIs.
- Nov 2013: A new program has been added to tdq to import Arpabet
pronunciations after converting them to IPA.
- Sep 2013: After about two years, I have merged fbpad's 256 colour
palette. Now the bold
branch is almost identical to the master branch and is removed.
- Aug 2013: When a program is specified via command line
arguments, fbpad starts the given program, disables terminal
switching commands, and exits when the program finishes.
I have also merged the scrolling history patch from the bold
branch and uploaded version 0.8 of ft2tf, which supports
full-width characters and emboldening fonts.
- Apr 2013: A command was added to fbpdf to override
page numbers; useful especially for documents that start with
- Mar 2013: I included Jörg Reinhard's patch to support mousewheel
in fbvnc. I also included a patch to move the viewing
screen for large VNC framebuffers.
- Feb 2013: I added fbvis to view images on the framebuffer.
- Feb 2013: When paused, minmad and fbff now close the OSS device
to permit other programs to open it.
- Feb 2013: Fullwidth characters are now handled correctly in
fbpad; Felix Janda tested the changes and prepared a preliminary patch.
- Jan 2013: Many of my framebuffer programs define a FB_VAL() macro
as an alias for fb_val() function.
The macro can be redefined for speed (should help especially
fbpdf, fbvis and cnoor). On 32-bit RGB framebuffers, for instance,
it can be redefined as "(((r) << 16) | ((g) << 8) | (b))".
For a guide to set up neatroff read getting started with neatroff.
- A new troff implementation neatroff
and its postscript postprocessor neatpost;
neatroff supports utf-8 encoding, named environments,
long register and macro names,
advanced font features present in OpenType fonts,
paragraph-at-once line formatting, and bidirectional text rendering;
consult neatroff introduction for more information.
- The dir branch of neatroff supports right-to-left text rendering as
described here; here's a short
introduction and here's a brief
guide for getting started, both in Farsi.
- neateqn is
an eqn preprocessor for neatroff, which addresses some of
the shortcomings and problems of the original eqn. It implements
most of the extensions introduced by Groff's eqn.
Here is a brief neateqn introduction.
- neatrefer is a small and slightly
incompatible refer clone. Also bib2ref converts
bibtex files to refer databases and ref2bib does the reverse.
- Here's the port of Plan 9 troff (troff, tr2ps,
eqn, tbl, pic, and grap) to linux.
The preprocessors and the macro packages can be used with neatroff also.
- neatmkfn can create neatroff
font descriptions from AFM and TTF files (OTF files can be converted
to TTF first). It extracts information about advanced font features
present in OpenType fonts to use inside neatroff.
- To make setting up neatroff easier,
obtains, builds, and installs
neatroff and its pre- and post-processors. It also contains
a set of standard troff macros from Plan 9.
- neatvi is
a vi/ex editor for editing bidirectional utf-8 files.
- ctxt to write formatted documents (including
- nref manages document references; it can be used as
a troff preprocessor.
I no longer use X11.
- fbpdf, a linux framebuffer PDF,
XPS, EPUB, and CBZ viewer using mupdf
library. It can also use libpoppler for PDF and can view DJVU files via
- fbvis is a framebuffer image viewer;
includes stbi and
and does not depend on external image libraries.
- fbff, an ffmpeg-based linux
framebuffer media player. The libmpeg3 branch uses libmpeg3 instead
- fbpad, a small linux framebuffer
virtual terminal. It manages many terminals through single-letter tags.
The fbpad_mkfn program (or
its predecessor ft2tf) can generate
fbpad font files (for testing, you can try courier regular,
italic and bold tinyfonts).
Here are a few screen shots with Ubuntu monospaced,
Ubuntu monospaced, and Monofur.
Archwiki has a nice but out of date introduction.
- fbvnc, a small framebuffer vnc viewer;
Jörg Reinhard added German keyboard support, available
SliTaz uses this
- cnoor to read the holy Quran on
Many of the programs in this page can be compiled with neatcc.
- neatcc is a small ARM/X86(_64) C compiler;
here's a brief introduction, which also describes how
to set up neatcc, and here's its small testsuite.
- neatld is a simple ARM/X86(_64) static linker.
- neatas is an ARM assembler; note
that neatcc does not need an assembler, as it generates machine code directly.
- neatlibc is a very small ARM/X86(_64) libc
written mainly to bootstrap neat*; I wish to find the time to clean it up
and implement its missing functions.
- A simple ELF core file backtrace viewer (my gdb replacement).
- To find ELF symbols around a virtual address, I use elfloc.
- neatmail is my new mail client.
- dnsred redirects DNS queries to other UDP/TCP DNS servers.
- tdq, a fast dictionary lookup program (xdxf and stardict
files can be imported).
- pdftxt uses mupdf to extract text from pdf files;
prefixes each line with its page number for searching.
to convert dblp.org search results to refer records.
- rangi to detect coloured graph motifs;
more information available here.
- minmad to play mp3 files using OSS/libmad
(the alsa branch uses alsa).
- minmix is a small OSS mixer;
here's an older version for ALSA.
- llx reads commands from standard input and executes
them in parallel with an optional maximum concurrent processes limit.
- The repeat after me typing exercise.
is a small programming contest judge for "Challenging Thursdays".
- My old mailx clone and
mailpg, a mail pager.
- A pop3 client; appends mails to
different mbox files based on the specified rules.
- A smtp client.
- A small utf-8 unix fmt(1) clone (not completely compatible though).
- ethcat is my tcpdump/tcpreplay replacement
- A simple socks v5 server (no tcp bind).
- I started rope (a python refactoring library)
in 2006; it is now maintained by Matěj Cepl and Nick Smith.
- dc16, a trivial stack-based calculator supporting
0x1f style hex numbers; handy when doing hex calculations.
- A simple hex file viewer.
For questions or feedback,
write to Ali Gholami Rudi (ali at rudi dot ir);
I would be delighted to receive them.
Hosted by tuxfamily.org.