home → pages →

This website works on Internet Explorer 6

Published Saturday, February 28, 2026.

For some godforsaken reason I decided I really wanted my website to work on Internet Explorer 6.

cue meme about how blog owners only post about making their blog.

I had already done a bit of work to get my website working fine on old browsers1, mainly by only enforcing HTTPS redirects on modern User-Agents with a Caddy snippet I wrote.

Plain HTML does a good job of conveying structure. I’ve been using HTML rather semantically, so the website is already recognizable but it’s lacking nearly all the CSS work I’ve put in to make my site pretty on modern browsers.

Screenshot of Internet Explorer 6 navigated to my website. An aproximation of what my site looked like before making any compatibility oriented changes. It looks almost like unstyled HTML with links being blue and list elements having deep padding and bullets.

The first big thing to tackle was both CSS variables and REM units not being supported in Internet Explorer. I solved this problem by rewriting my site to use scss variables.

The development experience of this sucks compared to modern CSS variables since it stops me from redefining variables at runtime for dark themes and large displays. I made myself a good set of mixins to aleviate some of that annoyance.

@use "@/lib" as *;
.footer {
  padding: rem(1.5) rem(0.5);
  background-color: $color-stone-100;
  @include theme-color("text");
  // ...
  @include large() {
    font-size: $text-sm;
  }
  @include dark() {
    background-color: $color-gray-800;
  }
}
Screenshot of IE6 on my site. The signature fancy-links on my website look as they should as well as some font size changes

Next I wanted to clean up some of Internet Explorer’s default styles, and center the page content.

Internet Explorer has this nice, but proprietary feature that lets you have HTML be parsed only on certain versions of it

<!--[if lt IE 8]>
<link rel="stylesheet" href="/static/compat/ie.css" />
<![endif]-->

I use max-width to center the page contents without making horizontal displays scroll horizontally. IE6 doesn’t have max-width. I stumbled across this solution on StackOverflow.

.container {
  width: expression(document.documentElement.clientWidth > 960 ? "960px": "auto");
}

I’m sorry What?? Is that JavaScript in my CSS? That’s so incredibly cursed.

When I was porting oneko.js to IE6 I also discovered this polyfill for position: fixed;

.fixed {
  position: absolute;
  bottom: expression(document.body.scrollTop);
}

Apparently the performance on this was terrible and support for CSS expressions was dropped in Internet Explorer 8. There were more ways of using JS in CSS but I dont think any were as widely used.2

Anyway, with the max-width polyfill aside, I now had something close to perfect

Screenshot of my website on IE6. It looks almost how it does on a modern browser with the page contents centered and in a 800 ish pixel wide column. The bullets from the link list are gone, fonts are bigger, and the "ari" in "hi, i'm ari!" is colored blue

Custom Font

Close to perfect wasn’t enough though, so I set off to fix these awful arrows

A screenshot of internet explorer zoomed into one of the arrows. The arrow is rendered aliased and is just a line with a blob of 5 randomly placed pixels at the end. It looks like someone spilled coffee on the pixel grid and called it an arrow.

I don’t want to just make IE load an entire modern font. Window’s XP’s font rendering really struggles without Hinting or bitmap variants. Example below.

Screenshot of my website on MyPal, The font in this screenshot look blury and has some weird artifacts at the top of round letters

Pretendard, the font I use on this website, doesn’t have hinting or pre-rendered bitmap fonts for Windows.

I imported Pretendard into FontForge and removed all the characters I don’t plan on using; leaving behind only arrows.

A screenshot of FontForge showing 14 arrow symbols from Pretendard

This is the first time I’ve used FontForge. Its UI is intimidating, but I pretty quickly figured it out.

I then added very basic hinting, and hand-made a set of bitmaps for 16px fonts.

Screenshot of the right pointing arrow in the FontForge editor. A green box fills the space of the horizontal stem, and the chevron is filled with red rectangles. These are hints Screenshot of the right pointing arrow in the FontForge editor. A pixel grid appears behind the vector of the arrow. The grid is filled in with pixelated version of the arrow with clean lines

I then exported and converted the font to EOT (Embedded OpenType)3 and added it to my main style sheet.

A screenshot of internet explorer with my new font loaded, but all the text that isnt the arrow looks like a barcode...

Oh dear, That’s not what thats supposed to look like.

It turns out Internet Explorer 6 doesn’t like to fallback to alternate fonts. To solve that I made a common component <ArrowRight/> that applies the custom font and replaced all instances of using that arrow. 4

A screenshot of internet explorer, the fonts aren't broken anymore and the arrows look clean and sharp. A zoomed in shot of the pixelated arrow I edited in FontForge. This time rendered by Internet Explorer on my website

Finally. My site looks how I want it to.

There were countless other weird quirks I ran into while porting this site to IE6.

Images with width: 100%; were not preserving aspect ratio that I fixed with this JavaScript I wrote.

And PNGs don’t have transparency either which can be fixed with unitpngfix

Some cool things I found on my adventures

  • IETester - Test your site on all versions of IE →
  • DebugBar - Inspect element for Internet Explorer →
  • IECollection - Install all the versions of IE simeltaneously → Mirror ↓
  • LegacyUpdate - Fix Windows Update on Windows XP →
  • MyPal Browser - A fork of Firefox68 maintained for Windows XP → Mirror ↓
  • cute ttf to eot converter →
  • unitpngfix - PNG transparency fix →
  • Cool blog post about IE behaviors →

Footnotes

  1. This was primarily so that I could transfer files easily to my Windows XP VMs by hosting them on adryd.co/public. The reason I keep the HTTPS redirect was because at the time I cared about arbitrary SEO scoring or something. The kind of scoring that Lighthouse does. ↩

  2. I wonder what kinds of crazy things like https://lyra.horse/x86css/ would be possible if this was still a widespread feature. It’d probably ruin the fun the a challenge though ↩

  3. The only font format that IE6 likes. ↩

  4. IE also panics if any of the fonts on the page fail to load. It manifests in a weird way where if one of the WOFF fonts on the page manages to load before the EOT, it won’t use the EOT, but if the EOT loads first its fine! The way I fixed this was just by putting the @font-face declaration in the ie compat css file ↩

adryd logo
copyright © 2026 Ariana "adryd" redacted. this website is dual licensed under the MIT license and CC BY 4.0 license. some images, vector graphics, scripts and other assets are made by other artists. visit licenses for detailed copyright information. this footer is mostly here because it looks cool. appreciate my work? consider donating.
🐈‍⬛ 💫 ⭐ 🌙