Home Page of Bert Bos

I studied Mathematics in Groningen (1982-1987), wrote a thesis about Graphic User Interfaces (1987-1993), worked on an Internet browser and the surrounding infrastructure for the Faculty of Arts in Groningen (among other things), and am now working for The World Wide Web Consortium on style sheets, math and privacy, among other things.


Cascading Style Sheets – designing for the Web (3rd ed.)
Hakon Wium Lie & Bert Bos
ISBN 0321193121
(See errata)

Book cover

Photos of Provence

Provence (which includes the Côte-d'Azur) is the region in Southern France that lies roughly between the Rhone river in the west, the Italian border in the east, the Mediterranean Sea in the south, and halfway into the Alps in the north.

I have a few thousand photos of Provence: page 1, page 2 and page 3 (slow link). (The thumbnail page is generated with a script.)

A short list of things to do if you visit the “Alpes-Maritimes.”

Some HTML and other utilities

R2sync is a program to efficiently synchronize two (local or remote) directories. (Efficient in the sense that it tends to reduce network traffic if files differ only little, thanks to the rsync algorithm, but at the cost of more local computations.) It is similar to unison.

B6+ is a framework for slides. It consists of a JavaScript script that runs in a browser to display slides written in HTML.

I've thrown together a few simple C programs that can number headings in HTML, make a table of contents, extract elements, pretty-print, etc. Binaries are available through Debian.

gb (a.k.a. GHURLBot) and AgendaBot are two IRC bots that help with (W3C) meetings that take minutes on IRC. The former manages issues and action items on GitHub via commands in IRC, the latter find the agenda for a meeting in the W3C calendar or the mail archives.

gf-markdown-awk is a library of functions for parsing GitHub-flavored markdown with Awk.

recut is like the standard Unix “cut”, but can also re-order and duplicate fields of a line.

If you often translate XHTML files, you may want to convert the XHTML to PO, translate that, and convert back. I wasn't completely satisfied with the converters I found, so I made a perl script, poxhtml. (XHTML only; to work with HTML, combine it with Tidy or my HTML utilities.)

hcalproxy runs as a proxy and converts hCalendar microformat into icalendar: if http://example.org/ex.html is an HTML document, then http://localhost:8000/http://example.org/ex.html is an icalendar document with all events from that HTML document.

ical2html creates a calendar in an HTML table from an icalendar file. Included are also icalfilter and icalmerge, to extract events of a certain category/class and to merge multiple icalendar files. (Sorry, they still lack manual pages.)

Nothing to do with HTML, but useful anyway: a little program that shuffles the lines of a file. Sort of the opposite of sort… To compile, just type make shuffle. The manual is in the form of a Unix man page.

A litle tool for users of the Unix shell: progress copies its input to its output while displaying a progress meter. Different styles are provided. Useful in pipelines that take a long time.

A tiny C program that prints the artist, title, etc. tags from MP3 files, mp3tag.c (Version 1 tags only.)

Another C program, that decodes the images taken with a Mitsubishi DJ1000 digital camera to PPM format: dj1000toppm.c

I used to use this shell script to generate thumbnail pages for my photos, but after I started using rdfpic, I switched to another shell script that gets the description from the RDF metadata. The latest incarnation uses XMP (a subset of RDF).

I used to use plan to keep my appointments, but I switched to korganizer other tools that use vCalendar. I wrote a Perl program plan2vcs to convert from plan format to vCalendar (used by korganizer). (This is version 2.1. Version 1.0 had some bugs, which were fixed by Marcus Gottwald.)

XML Schemas are rather hard to write and read, so I started writing a little utility "mnbftosch.pl" that allows you to define an XML-based format using a traditional context-free (EBNF) grammar. It is a Perl script that takes a grammar and generates the equivalent XML Schema. It is by no means ready yet, but it does occasionally write correct Schemas. Two related essays ("Context-free schemas" & "Meta-grammar") give some more background. (Example input & output.)

rdjpgxmp, wrjpgxmp, xmp-scan and xmptool: the former two are little C programs to extract and insert XMP data in JPEG (JFIF) files. xmp-scan finds XMP data in arbitrary files by scanning for the special text at the start and end of an XMP packet. And xmptool can query an XMP file for the value of a particular property or can insert a property/value pair into an XMP file. (Inserting works for string-valued or URI-valued properties only for now.)

addxmp is a Bash script that takes a text file with descriptions and other metadata of photos and adds that metadata into the photos in the form of XMP. (Requires xmptool and one or more programs to read and write metadata from JPEG, e.g., the programs mentioned above, or exiv2, exiftool or others.)

jpegxmp: another Bash script that combines the above to do a few common operations. E.g., jpegxmp --language=en --title="Foo" myphoto.jpg adds the Dublin Core title property to myphoto.jpg and sets its language to English; and jpegxmp --from-exif myphoto.jpg sets the Dublin Core date property from the EXIF date. Try jpegxmp --help.

htmldiff is an HTML diff program: it compares two files and marks up the differences. (It is a quick hack, based on wdiff. Don't expect perfect results.)

I've also made two font families, Gladiator and Gladiator Sans (alternative link).

Two little programs in Gnu AWK (gawk), unsign.awk and sign.awk, can remove a digital signature from an e-mail message or add one (requires gpg). They could be used, e.g., as filters when sending e-mail.


HTTP provides redirects when URLs change. But it cannot be used when fragment IDs change. Here is a proposal for redirecting URLs with fragment IDs. If, e.g., a link to #foo should be changed to #bar, you can express that inside HTML. And you can even redirect http://example.org/one#foo to http://example.org/two#bar.

Symbolic constants in CSS are a bad idea, see my essay “Why ‘variables’ in CSS are harmful.”

An (unfinished) essay on possible future technology for “Web applications,” simple programs that are downloaded on demand and execute inside a client program, for problems where Java applets would be overkill. Another essay focuses on requirements.

An essay on the principles of good specification design, as I'm trying to apply them in my own work: “What is a good standard?”

I've created some software for a simpler variant of XML, to see how it works.

Example of data re-use

One of the promises of the Web, and of the "semantic Web" in particular, is that data can be machine-readable and can thus be re-used. As an experiment, I've written a robot that collects the daytime temperatures in Nice, France, once per day, and creates a graph.

Wbuild and other software used to be available from the (Groningen University) Faculty of Arts's FTP server. Here is a local copy of Wbuild.

The Free Widget Foundation

I contributed a number of X widgets to the FWF (Alert, Animator, Arrow, Board, Button, Canvas, Common, Frame, Group, HScrollb, Icon, IconBox, Label, MenuBar, OptButton, Pager, PieMenu, Prompt, PullDown, RadioGroup, RowCol, ScrollWin, ScrollWin3, Scrollbar, Slider2, Slider4, Tabs, TextMenu, ThumbWheel, Toggle, VScrollb). Together with Joe English, I wrote the Scrolling Widgets Interface Policy (SWIP) See the ASCII or the DVI versions.)

The FWF is no longer active. I've put the most recent sources that I have in a tar-file (fwf-4.0.tar.gz, 1.5Mb). This is basically version 4.0 with some very minor edits.

A Java applet

Your browser is not configured to show Java 1.1 applets. This would show a clock with the time in France. This is the current time in France (unless you have no Java implementation in your browser, or your computer's clock isn't set correctly…). See more examples and some documentation or get the source.

The color of the dial varies from yellowish (noon) to dark purple (midnight).


Sign to the
   "Bert Bos walking path" Bert Bos
2004, Route des Lucioles, B.P. 93
06902 Sophia Antipolis Cedex, France

E-mail: bert@w3.org
Tel. +33 (0) 4 92 38 76 92
GPG key (fingerprint F04D EF9D 2D96 0CAF A944 9F84 97CD 50E2 E2E6 247C), (old GPG key), business card (HTML), business card (SVG)
LinkedIn: bert-bos-6589125
Mastodon: @bert@w3c.social (work)
Mastodon: @bert@mamot.fr (private)

PS. My favorite radio channel is FIP (→ live stream). A shame it is no longer in the ether at the Côte d'Azur ☹ (And they are better at making radio than Web pages. These links change every few years…)