Jef Poskanzer (jef@acme.com) invented the PBM format in the 1980s to provide the computer graphics world with a common, trouble-free format, a lingua-franca, for bitmaps. The format was designed to be simple enough that it could transmitted within an email message without any special encapsulating and survive any translations and recoding that an email message might go through and be easily extractable on the other end. This was in a time when an email message was just text; attachments did not exist.

In 1988, Jef distributed the forerunner of Netpbm, Pbmplus, which gathered together the various tools he had developed to work with PBM files. These were mainly tools to convert between PBM and other existing graphics formats, making it possible to deal with the Tower Of Babel situation that had arisen with the proliferation of graphics formats.

By the end of 1988, Jef had added the PGM and PPM formats and lots more tools to Pbmplus.

In 1991, Jef added a variety of programs and code contributed by the user community, and then stopped maintaining Pbmplus. Jef never formally renounced support for it, but simply didn't get around to distributing any updates for over a year following his final December 10, 1991 release.

At least in 1990, Pbmplus was distributed via the Usenet group comp.sources.misc, under the coordination of Brandon Allbery.

From 1988 to 1991, Pbmplus was distributed a number of ways. Much of it was distributed via comp.sources.misc. There were also distributions on alt.sources as well as via X Window System contributed code FTP servers.

In 1993, Netpbm was developed to replace Pbmplus. Netpbm was nothing more than a new release of Pbmplus, and named for the fact that people all over the world would maintain the package by submitting fixes and enhancements over the Net. This was a time when such worldwide collaboration was still novel.

Then Netpbm apparently fell into neglect with the last release by its regular maintainer in March 1994. In September of 1995 Anthony Thyssen released an unofficial update of it called Netpbm-1mar1994.p1, while disclaiming any responsibity for ongoing upkeep.

The documentation in that 1995 release mentioned two different official mailing lists concerning the package, but by April 1999, neither existed anymore.

In September 1999, Bryan Henderson needed a minor bug in Xbmtopbm fixed, and wanted to clean up the mess of unsupported versions and outdated documentation of these tools. After checking around to see if anyone had any claims of ownership of the package, and finding none, Bryan assumed control and responsibility for Netpbm.

In November 1999, Thorbjoern Ravn Anderson did the same thing, for the same reason (apparently unaware of Bryan's work) and made available an updated version (based on the 1994 release) as described by http://sunsite.auc.dk/netpbm. Shortly thereafter, he discontinued his effort in deference to the new Pbmplus effort mentioned below. Bryan did not know about Anderson's work until March 2000.

In parallel, and unknown to Bryan, Jef was working on a new release under the original name Pbmplus and claiming again (or maybe still) to be maintaining Pbmplus. He did a limited release of a beta version of it in November 1999. A mailing list pbmplus@acme.com was active. Bryan learned of this effort's existence in March 2000. No widespread distribution ever resulted from this.

Pbmplus and Netpbm were once part of the body of the X Window System contributed software, distributed on ftp.x.org (directory contrib/utilities). Bryan didn't receive a response to an inquiry to the ftp.x.org owner as to the prospect of cleaning up the Netpbm related files there. So Bryan instead made Metalab the new home of the source code. But Metalab had pretty low quality too, and in April 2000 Bryan moved the package's home to Sourceforge.

In April 2000, Bryan extended the Netpbm formats to allow an image to have 2 bytes per sample, for a maximum maxval of 65535, as opposed to the original formats that could have only one byte and maximum maxval 255. This same extension had been made previously by others, but some of them defined the two bytes to be in the reverse order. The Sourceforge version of Netpbm documented the byte order, ending that ambiguity.

In August 2000, the PAM format appeared. But it took a long time after that for there to be enough programs and library routines to make it useful. It still is barely known and used; PAM is more of a direction or philosophy than a practical tool. Along with PAM came a whole new suite of library routines for processing both classic PNM and PAM format images. The new "pam" routines are easier to use.

In June 2002, Bryan reorganized the package. Before, it was organized to reflect the evolution of the package: first PBM only, then PGM was added, then PPM, and then the multi-format PNM programs. There were four separate subroutine libraries and each of the PBM, PGM, PPM, and PNM components was independent of the components invented later. Documentation was in the form of traditional man pages. In Release 10, the package was integrated into a single monolithic package. There was one subroutine library and the source tree was divided according to program function rather than what generation of Netpbm it related to. All documentation was converted to HTML.

In January 2004, Netpbm started to get the linear/gamma-adjusted sample value thing right. Many programs had always used the gamma adjusted values from Netpbm images as if they were linear, which produced incorrect and rather terrible results. Netpbm 10.20 brought the pm_[un]gamma709() library routines and pnm_readpamrown() etc. for manipulating Netpbm images in floating point 0..1 sample values, both linear and gamma-adjusted.

In August 2006, Bryan revised the release strategy so as to have three stabilizing branches (super stable, stable, and advanced) instead of one (stable) in addition to a much more current non-stabilizing branch (development), and distributed all of them via Sourceforge's new Subversion source code control system. He discontinued release via tarball except for the super stable version. The point of this unconventional release mechanism was to reduce the number of bugs in the current releases while minimizing work for the maintainer. The last "advanced" release to have a tarball was 10.34.

The person who contributed the most to Netpbm since its rebirth besides Bryan is Akira F Urushibata. Akira's first contribution was a fix to fax format converter pbmtog3 in 2004. His most notable subsequent contributions were major speedups in the PBM processing code, using byte and word processing where code previously worked on individual bits. He made many PBM processors exploit special bit array manipulation instructions (MMX/SSE).

At the end of 2012, Akira created the test facilities (found in the test directory of the source tree, invoked by make check). He has maintained them ever since and performed regular regression testing of new code.

Programming language

Netpbm has always been written primarily in C. Netpbm code dates to a time when ANSI C was brand new and consequently, the original code is written in older C. Bryan made a point of converting it all to ANSI early on. Bryan also steadily replaced signed integers with unsigned integers and used constants instead of variables wherever possible. About 2019, Netpbm officially loosened its requirement from original ANSI C to C99, but there was probably lost of code already that used C99 features, since nobody was trying to use a pre-C99 compiler. Multiple Unix command shells, including C Shell were used in early Netpbm for programs that invoke other programs. Bryan considered those obsolete when he took over and did new programs like that in Perl and has converted most of the original Bourne shell programs to Perl. The non-Bourne shells were eliminated by about 2015. Bryan was new enough to Unix that he had not invested time (and never really did) in learning Bourne Shell programming, learning Perl instead.
By Bryan Henderson, San Jose, CA; bryanh@giraffe-data.com last checked 2023.09.16.