Show HN: Resurrecting the Dillo browser (dillo-browser.github.io)

599 points by rodarima ↗ HN
Hi, in mid 2022 the host dillo.org expired [0], taking down the website, mercurial repo, the mailing list and the email server used to reach the core developers of Dillo. Someone bought it and now serves a weird clone of the original page with missing content.

[0]: https://news.ycombinator.com/item?id=32448104

I felt sad as I didn't want it to die, so I got a copy of the repo from my hard disk, uploaded it to GitHub and decided to do some maintenance on the code to at least keep the build working. After some time, the folks at Atari Forum decided to use my repo to port it to the Atari platform and they managed to do it [1].

[1]: https://github.com/dillo-browser/dillo/issues/34

That gave me some motivation to work a bit more on the project to prevent it from dying. So I created an organization under the name of "dillo-browser" and made a new webpage [2] with a backup of the old one.

[2]: https://dillo-browser.github.io/

With the help of Andreas Kemnade which had access to the original server, we managed to backup most of the stuff from the original website (including non-reachable pages) which I uploaded to the Archive.

In the meanwhile, I combined the support for both OpenSSL (1.1 and 3) and mbedTLS (2 and 3) as well as proper CI with rendering tests. We now build Dillo for Ubuntu, FreeBSD and macOS!

I also became familiar with the plugin mechanism in Dillo, which allows any program that uses the standard input and output to become a plugin registered to a given protocol (like file://...). I did a simple one (which is just a bash script) to read local manual pages which is handy to follow links to other pages [3], but check also the ones Charles E. Lehner did which are more advanced [4].

[3]: https://github.com/dillo-browser/dillo-plugin-man [4]: https://groups.google.com/g/dillo/c/WGEMg7AXN4o/

As of today, I'm unable to contact the main developer, Jorge Arellano Cid, which has not interacted with the mailing list for some years now. Jorge, if you read this, please contact with me (you can find my email in the git commits).

Regarding the future of Dillo, I'm planning to (finally) do the 3.1 release after some testing, and for that it would be convenient to have the help of some users to get some feedback ;-)

If you want to contribute, feel free to open a PR or send a patch (via GitHub or by email, I don't care). Check also the current issues and pull requests to see what is pending or already being working on. I will probably setup a mailing list at some point too.

Thanks! Rodrigo.

178 comments

[ 3.6 ms ] story [ 232 ms ] thread
(comment deleted)
Thank you for doing this! Loved Dillo, back in the day
huge huge thanks, I still use Dillo!
Very nice!

Dillo is handy to have on lower specced machines. I've used it on m68k. I really should see why it doesn't compile on VAX, though...

Thanks!

How does this do at rendering modern websites?
Generally not great, as Dillo doesn't support Javascript and most modern sites are using it to create content. But if the site degrades well without JS it should render reasonably well.
I often use it to read Wikipedia articles. The layout is all jambled up, but the article content itself is fine. If a web site is low on layout, heavy on text, it usually works okay-ish. A lot of web sites these days, however, are an empty skeleton with a bit of Javascript code to load the content - these do not work in dillo, it has no Javascript engine; to a degree, I consider this a feature, but it makes large parts of the world wide web inaccessible.
Change the user agent to this one at ~/.dillo/dillorc:

      http_user_agent="Mozilla/5.0 (PSP (PlayStation Portable); 2.00)"
Then a lot of sites will load a compatible version.
Thank you! I'll give that a try.
Also, not web, but if you try a Gopher browser such as lynx, you can try gopher://magical.fish as a nice entry portal, it has tons of services. Also, gopher://gopherddit.com and gopher://hngopher.com

On Gemini, there's the Lagrange browser, and gemini://gemi.dev with a nice set of services too.

The modern web won't stop surprising me :-D
Basically an approximation of reader mode. Text and images will be fine, anything more advanced with CSS etc. will be ignored.
Does dillo support javascript?
nah all scripting is ignored
Glad to see people are still stepping forward to take care of this project. Would love to see Gemini/Gopher support, though this is just a crazy idea from the comments section. I have no idea how feasible it is.
Fantastic work. I remember using Dillo in Puppy Linux from Live CDs back in the day.

What's the minimum compiler you target? Any big long term plans? Fuzzing? Moving to 'modern' build system like CMake?

Thanks!

> What's the minimum compiler you target?

I didn't defined any (yet), but shouldn't be too hard to add to the CI.

> Any big long term plans?

First preventing it from dying and getting removed from distros. Then it depends of how much free time I can dedicate to it, but at least maintaining it.

> Fuzzing?

I would say first adding some of the other browser tests suites. That should catch a lot of rendering issues. But yeah, fuzzing would be interesting, specially for the custom HTML and CSS parsers.

> Moving to 'modern' build system like CMake?

Yes, I had to modify the configure.ac and that was very painful, specially targeting a lot of platforms. It is also broken for cross compilation. I have to check also how is the support for cmake in other systems, so we can safely remove Automake and friends. But I didn't want to introduce any big changes before 3.1 is released.

I would suggest switching to Meson instead of CMake.
How well does Meson handle complex cross-platform projects nowadays with multiple compilers? My team tried Meson about ~3yrs ago for an embedded system. We ended up moving to CMake instead after struggling to use it for armclang.
It’s better, but I believe link options still is controlled a little too much by meson magic.
I would suggest neither of those, nor ninja nor anything but make. Whatever sucks about a simple/shallow stack, what sucks about tall fat stacks is worse.
Speculation: I wonder if it's relatively easy to fuzz because the extension system already has things adapted to communicate over std in/out.
> targeting a lot of platforms

Wouldn't a project such as this one be a perfect candidate for Cosmopolitan?

> Cosmopolitan Libc makes C a build-anywhere run-anywhere language, like Java, except it doesn't need an interpreter or virtual machine. Instead, it reconfigures stock GCC and Clang to output a POSIX-approved polyglot format that runs natively on Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS on AMD64 and ARM64 with the best possible performance.

https://justine.lol/cosmopolitan/

AFAIK, Cosmopolitan only works well if your program only depends on the libc. Even if you statically compile Dillo and the FLTK, you still would need a graphic Xorg server. For Linux and BSDs may work, but in macOS I think it won't, as for that platform you need the FLTK to link against macOS graphic libraries.
Will have to give this a shot on m68k Atari, it's been a long time!
Given the circumstances, I am happy to read this. I own two ~2009 netbooks with Intel Atom N270 CPUs and 1GB of RAM each - running Firefox on those is ridiculous, whereas dillo will run very well on these.

I used to use dillo on my main desktop too, for browsing documentation that wasn't too heavy on CSS - having 20 to 40 tabs open would gobble up a lot of RAM in Firefox, whereas dillo happily stayed around 100MB no matter what I threw at it. My current desktop has enough RAM this not a concern any more, but I have fond memories of using dillo on memory-deficient machines and am a current user still.

Also, the lack of a Javascript engine makes it a very secure browser. Whenever I try to open a link that I am suspicious of, I do so in dillo.

So thanks to everyone who continues to work on this, I really appreciate the work you do! Dillo is a fine piece of software that I have enjoyed using for at least 15 years now, and I hope it will be around for many years to come! <3

> I used to use dillo on my main desktop too, for browsing documentation that wasn't too heavy on CSS - having 20 to 40 tabs open would gobble up a lot of RAM in Firefox, whereas dillo happily stayed around 100MB no matter what I threw at it. My current desktop has enough RAM this not a concern any more, but I have fond memories of using dillo on memory-deficient machines and am a current user still.

This is precisely the objective Jorge had in mind, so people on other parts of the world with less capable machines where still able to access the web.

While I was in university, I was using an old Pentium 4 at home (which I still use) which couldn't open a single tab unless you wait around 30 seconds for it to load. So I was mostly using Dillo and failing back to Google cache and then Firefox to read something that required Javascript.

I used it for years and it always was super fast. Also, my network connection was not very fast, so loading only the HTML helped a lot.

> So thanks to everyone who continues to work on this, I really appreciate the work you do! Dillo is a fine piece of software that I have enjoyed using for at least 15 years now, and I hope it will be around for many years to come! <3

Thanks :-)

>> I used to use dillo on my main desktop too, for browsing documentation that wasn't too heavy on CSS

Hah! I used an old Dell laptop that had a 1400x1050 (?) screen for this exact purpose with Dillo.

I was so mad that software stopped using Windows help files...they were so much more efficient!

> I was so mad that software stopped using Windows help files

Are you referring to HTML Help? I believe they rendered those with Internet Explorer; I'm willing to bet they still do for backwards compatibility.

I also like dillo, but just as an option - have you tried netsurf as well? Likewise very lightweight.
dillo is more lightweight, although it doesn't support html5, while netsurf does support some html5. The website itself of dillo does not render the same in dillo.
Sure; I personally view it as a continuum of lynx..elinks..dillo..netsurf..........firefox is so. Just pointing out that netsurf is close to dillo.
I have. I only discovered it about two weeks ago, though. But so far, I do like it. Thank you!
> Also, the lack of a Javascript engine makes it a very secure browser. Whenever I try to open a link that I am suspicious of, I do so in dillo.

I would suggest using a Chromium or Firefox profile with JavaScript and webfonts disabled for this instead of questionably maintained C software that doesn’t have a sandbox for any of the complex and commonly exploited things it does (image decoding, HTML/CSS parsing, network protocols, local file access).

I would say there is a chance that there are fewer vulnerabilities in the 60k~ lines of code contained within dillo than the in the however many million lines of code it takes to do anything with firefox or chromium.

running dillo in a bubblewrap container would probably be fine and not eat all of your available resources.

[i got my 60k loc number from running tokei in the dillo repo, doing the same in the gecko repo took multiple minutes and pegged 8 cores at 100%, might be a bug in tokei or maybe 21 million lines of code is just enormous]

I would recommend not opening suspicious pages in any browser at all. If you don't have the choice, then maybe download it with curl(1) and then inspect it with hexdump(1) or more(1), so you can see the content before sending it to an HTML parser.
Hey, nice to see you here Mr Stallman, thank you for all the hard work all these years :)
Mr Stallman would probably be using wget which is a GNU project, if not downloading directly from Emacs.
Or just use eww from Emacs.
For some reason I started using w3m with emacs integration years ago and am very comfortable with it. I know eww exists, but I think I only tried it once or twice.
> I generally do not connect to web sites from my own machine, aside from a few sites I have some special relationship with. I usually fetch web pages from other sites by sending mail to a program (see https://git.savannah.gnu.org/git/womb/hacks.git) that fetches them, much like wget, and then mails them back to me. Then I look at them using a web browser, unless it is easy to see the text in the HTML page directly. I usually try lynx first, then a graphical browser if the page needs it.

Source: https://stallman.org/stallman-computing.html

Sure, Dillo in a sandbox is a big improvement over Dillo not in a sandbox (don’t forget an isolated X instance when you’re doing bubblewrap, ’cause FLTK 1.3 doesn’t support Wayland). I’d still feel more comfortable with mainstream browsers (and yes, they can handle many tabs on a still-small amount of memory).
Try Pale Moon, Basilisk or K-Meleon (on Goanna), which are more lightweight than Firefox. Other alternatives: Otter Browser (on Qt WebKit) or Ladybird (on LibWeb).
Which OS are you running on your netbooks? I recently acquired an old netbook with an Intel Atom processor and have been trying to find decent lightweight yet usable OS for it. I'd tried Debian but Firefox was too slow on it, maybe I should try again with Dillo now?
firefox with umatrix probably will be better for that hardware.
Zramup script:

    #!/bin/sh
    doas /sbin/modprobe zram
    doas /sbin/zramctl --find --size 1024M
    doas /sbin/mkswap /dev/zram0
    doas /sbin/swapon /dev/zram0 --priority -1
Not Firefox, but Luakit might do it fine on single pages where JS is mandatory, such as, sadly, my country's goverment pages to do personal life related tasks.
Hypothetically, could JavaScript support be added by using a lightweight engine, such as QuickJS?
Yes and it has been discussed in the mailing list before [1].

[1]: https://groups.google.com/g/dillo/search?q=javascript

However, I don't think the machines that Dillo is targeting would benefit from adding support for it and it would increase a lot the surface for security problems. Maybe my advise would be to use another browser if you have the computing power to run JS.

> I don't think the machines that Dillo is targeting would benefit from adding support for it

People tend to overestimate the resources required to run JS and have a miscalibrated sense of how slow they can/should expect it to be.

Firefox 1.x and 2.0 worked on machines with substantially worse specs than many of the ones that people are mentioning here (think: sub-GHz PIIIs with 128–256 MB of RAM), and substantial parts of Firefox itself are written in JS.

I haven't checked, but I'd bet that 2024-era QuickJS is also faster than 2004-era SpiderMonkey at executing the same script.

I was running FF (and netscape before that) on such machines, and they were about the worst possible program to run. My memory of browsers of the era was slow, buggy, and bloated. It was barely usable because the connection speed was by far the biggest bottleneck.

I was using dillo heavily at the time, when we didn't mind differences in rendering. After that I switched to konqueror. As the dhtml/js craze exploded, I caved in to ff when more often than not the websites didn't load or work as expected.

Probably but my guess based on the state of the web is that this a rabbit hole without end
If my (somewhat distant) understanding is correct, Dillo doesn't employ sandboxing like the other browsers. If this is the case, then adding support for JavaScript would be disastrous -- there are reasons why modern browsers use things like setuid, seccomp bpf, etc. etc.
Yes! Dillo enthuthiast here to say thanks and good luck.

What’s your approach to browser dev? Do you prefer to go wide or deep, for example the Ladybird project goes “deep” in that they choose an endpoint and try to get everything on the page working and whatnot. Maybe I’m rambling, but very cool!

Nice to know Dillo still gets some love! I've got a lot of dillo plugins stored up that I managed to get from scuttlebutt a while ago(dillo-adb, dillo-dat, dillo-finger, dillo-git, dillo-gopher, dillo-gemini, dillo-ipfs, dillo-ssb and dillo-ytdl), and if you're interested I can zip them up and send it to you to be forked and worked on the project
I think most of them are from Charles, and he maintains a scuttlebutt-web interface, so you can download them from the homepage:

https://celehner.com/projects.html#dillo-plugins

I already talked with him about keeping a copy of them in GitHub under the dillo-browser organization.

> and if you're interested I can zip them up and send it to you to be forked and worked on the project

Feel free to open an issue and upload it there, so we can keep a copy of the zip. Thanks!

Done! I actually had forgotten where I had got them, but it's great that their original repos are still up!
>> Dillo requires FLTK-1.3

Nice, lean & mean! I'm interested.

What's the benefit of Dillo versus, say, NetSurf?
A lot more lighterweight, and nowadays it's good to have less (it has less CSS compatibility, less html compatibility and no JS).
I'll have to do an in depth analysis first, I have very little experience with NetSurf.

I would say that the plugin system is one of the things makes Dillo a bit different.

I had some ideas to do performance tests and also check how well the rendering engine works with choppy connections (while content is still slowly downloading), but I didn't do any tests yet.

There were some very old results against firefox comparing memory usage in the old page [1].

[1]: https://dillo-browser.github.io/old/memory.html

The extension system[0] seems interesting; it reminds me of w3m's local CGI scripts. (From what I can tell, w3m's local CGI came first, but I don't know if it influenced DPI and/or if w3m's system had a predecessor too...)

For a short description of what w3m local CGI scripts can do:

* They can be used for implementing a man page viewer, as in w3mman. It seems Dillo has a similar plugin[1].

* w3m's bookmark system is implemented using local CGI; it seems Dillo's bookmarks are implemented as a dpi plugin too.

* w3m can use urimethodmap + local CGI to implement additional protocols. I guess DPI can do that too? (At least the custom man: scheme in dillo-plugin-man seems to indicate it can.)

I had no idea any browser supported this besides w3m. I mostly imitated w3m's design in my own project (which includes the twist that support for every protocol, including HTTP, is implemented on top of a similar plugin system); I guess I have a second reference point now :)

[0]: https://dillo-browser.github.io/old/dpi1.html

[1]: https://github.com/dillo-browser/dillo-plugin-man

> * w3m's bookmark system is implemented using local CGI; it seems Dillo's bookmarks are implemented as a dpi plugin too.

Yeah, a lot of things [1] are implemented as DPI in Dillo. Some of the plugins implement "websites" like file:, vsource: and ftp: but others implement other features like the handling of cookies, downloads or bookmarks. As they are a different process, if you close the browser, the downloads continue.

[1]: https://github.com/dillo-browser/dillo/tree/master/dpi

> * w3m can use urimethodmap + local CGI to implement additional protocols. I guess DPI can do that too? (At least the custom man: scheme in dillo-plugin-man seems to indicate it can.)

Yes, there is a file (~/.dillo/dpidrc) that associates the protocol to the plugin binary (like this "proto.man=man/man.filter.dpi"). There is also gemini: gopher: and even git: available as external plugins.

> I had no idea any browser supported this besides w3m. I mostly imitated w3m's design in my own project (which includes the twist that support for every protocol, including HTTP, is implemented on top of a similar plugin system); I guess I have a second reference point now :)

In fact, not so long ago, the HTTPS protocol was implemented as a DPI plugin, but it was changed to be part of the browser.

(comment deleted)
As far as I remember, Arachne also did something similar.
I can confirm that the extension system is simple and nice to work with. I implemented a thin Go library for writing Dillo plugins (https://github.com/boomlinde/dpi) and made a plugin for the Gemini protocol (https://github.com/boomlinde/gemini.filter.dpi). I believe that in recent versions of Dillo, even https is implemented as a DPI plugin.
Thanks for your DPI work. I tested the gemini plugin and works very well.

My only complain is that it keeps asking to confirm new keys every time a new server is visited which causes a lot of friction to explore several gemini servers. I understand that is a tradeoff between usability and security, but I wish there was a better solution than that.

For now I uploaded Charles plugin written in shell script[1], which always trusts the certificate.

[1]: https://github.com/dillo-browser/dillo-plugin-gemini/

But I'm considering switching to the Go version if I can find a way to improve the UX.

Also, I kindly ask you to add the tag "dillo-plugin" so you can make Dillo plugins easily discoverable by searching for the tag in GitHub[2].

[2]: https://github.com/topics/dillo-plugin

> I believe that in recent versions of Dillo, even https is implemented as a DPI plugin.

This was done initially[3] (before 2007) but it was moved to the browser itself[4] in 2016.

[3]: https://github.com/dillo-browser/dillo/commits/afd2763caa56d...

[4]: https://github.com/dillo-browser/dillo/commit/bf5a7783f4a192...

> My only complain is that it keeps asking to confirm new keys every time a new server is visited which causes a lot of friction to explore several gemini servers.

Hmm, yeah, it's a trade off. It never annoyed me personally so I haven't given it much thought, but I could add some means to configure this behavior. There should be a commit shortly.

I've been meaning to change how it behaves when the certificate differs from the pinned one as well, because as it is now you manually have to remove the old pinned certificate from the file system when a certificate is replaced, which isn't great but at least should happen much less often.

> Also, I kindly ask you to add the tag "dillo-plugin" so you can make Dillo plugins easily discoverable by searching for the tag in GitHub[2].

Thanks for the heads up! Done.

> This was done initially[3] (before 2007) but it was moved to the browser itself[4] in 2016.

I see, so I had the chronology mixed up :).

I've updated the plugin so that you can switch between auto pinning and confirmation now, via a configuration file!
Very nice to hear!

Anybody knows what happened to Jorge A. Cid?

I have no news, but I hope HN could reach him :-)
I hope he's doing well, wherever he is. An active community around Dillo sparkles my wanting of hacking on it, Dpi (especially filters) is the best plugin system a browser could have imho.
Well done! Dillo is a great little browser.
Would be cool if it could give some kind of indication of what current percentage of HTML5, CSS3, and now-evergreen JS is, to set realistic expectations.
Dillo targets HTML4.1 and CSS2.1, although it incorporates some little features from HTML5 too. For CSS there is a list of "tests" [1] that more of less give you an idea of what works.

[1]: https://dillo-browser.github.io/old/css_compat/index.html

Here [2] is the original development plan, which was focused on making the floating elements work well, but the main developer of that area, Sebastian, sadly passed away.

[2]: https://dillo-browser.github.io/old/Plans.html

I'm planning to add better support for the most common attributes that break the layout the most (margin: auto) and also keep a proper table of the support status.

> Project objectives :

> Lower the barrier of entry to the web.

> Support old or small machines and slow connections.

Ram is cheap today, unfortunately the industry isn’t very humanitarian so they took advantage of that.

Now as the world expects fluent animation and eye candy, it’s virtually impossible to have a browser support as many sites as chrome and support older machines.

> Now as the world expects fluent animation and eye candy

How so? A lot of websites rely upon animations (I'm guessing you're referring to more advanced CSS support here), yet people still use browsers like w3m, elinks, lynx, etc.

If anything, I'd imagine the information density would be much greater with something like Dillo: you'd have much less distracting (as you put it, "eye candy") to draw attention away from the text on the page, which is most certainly welcome IMO.

Sending much love. It's gratifying to see work on this continue, from seeds planted so long ago.
Thanks, raphlinus as in Raph Levien! I was just reading your bytesink document [1] from around 1997 and checking the history of gzilla, the precursor of Dillo.

[1]: https://sources.debian.org/src/gzilla/0.1.5-3/bytesink.doc/

PS: Maybe you could give us a hand contacting Jorge :-)

I haven't been in touch with him in over 20 years, so have no idea where even to start. Best of luck with that!