47:51Ranking major U.S. Open-Weights Models. (Where does Ripple 65B fit in?)
Nov 6, 2026 · YouTube
38:58Testing Particle-1: a post-trained DeepSeek V4.1 Flash specializing in coding and efficiency
Oct 28, 2026 · YouTube
29:55Kimi K3.1 Pro Looked Incredible. Then I Kept Testing.
Oct 26, 2026 · YouTube
22:47Mistral Large 4 Is Cheap. But Is It Good Enough to Compete?
Oct 6, 2026 · YouTube
16:45DeepSeek V4.1 Flash Is Shockingly Good for the Price
Sep 10, 2026 · YouTube
17:31Testing Gemini 3.8 Flash on Real Coding Challenges (vs. other models)
Sep 2, 2026 · YouTube
It is March 1998. You build websites. A client wants a site for their community radio station, Radio Saltmarsh, 102.3 FM, broadcasting from a caravan on the east coast.
Build it the way you would have built it that month, for the browsers people actually had.
Internet Explorer 4 and Netscape Navigator 4. It must render acceptably in both. Assume 800 × 600, thousands of colors, and a 33.6k modem, so keep the weight down.
Write the copy yourself. Give the presenters names and the programs titles. Make it feel like a real small station with real people in it — the charm here is in the specifics, not in the beige.
Banned, because they did not exist or did not work:
flex, grid, position:sticky, CSS variables, media queriesborder-radius, box-shadow, opacity, rgba(), transform, transition, @keyframesconst, let, arrow functions, class, template literals, Array.forEach, JSONquerySelector, addEventListener, getElementById (yes — IE4 has it, NS4 does not; you branch)<section>, <header>, <nav>, <video>, <canvas>, data- attributesExpected, because it is 1998:
<font>, bgcolor, border=0, cellpadding, cellspacing, <center><style> block for the bits CSS1 could actually dodocument.all for IE and document.layers for Netscape, branched properly<!-- --> comment wrappers around script contentsdata: URIs for graphics, and you should, because the period look needs them. Draw them yourself; no placeholder services.html block.One short paragraph before the file: your layout structure and how you handled the IE/Netscape split.
The single fenced html block.
The honest part. Go through your own file and tell me:
Be specific and name dates where you know them. If you used a technique and are not sure it existed yet, say that rather than guessing confidently.
Anyone can make a page that looks like 1998 — Comic Sans, a starry background, a marquee. That is a costume.
I want to know whether you know the constraints from the inside: what NS4 did to a nested table, why you cannot put a stylesheet on a form control, what the <spacer> tag was and whose it was, why everyone used a single-pixel transparent GIF. A page that looks a bit plain but is honestly built to the period beats a gorgeous pastiche that uses flexbox under the hood — and I will read the source.
The page is a centered 760px table with nested tables for masthead, notices, schedule, presenters, guestbook, counter and webring; all presentation is attribute-driven (bgcolor, cellpadding, <font>, <center>) with a small CSS1 <style> block for body and link colours. For the IE/Netscape split I check document.layers first and write a Netscape <layer> for the moving “ON AIR” sign, then fall back to document.all and write a positioned <div> for IE4; the ticker and hit counter use document.forms, cookies, document.write and setTimeout, which both browsers handled.
<html>
<head>
<title>Radio Saltmarsh 102.3 FM</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
body {
background-color: #FFFFCC;
color: #000000;
font-family: Arial, Helvetica, sans-serif;
}
a:link { color: #0000CC; }
a:visited { color: #663399; }
a:active { color: #FF0000; }
-->
</style>
<script language="JavaScript" type="text/javascript">
<!--
var tickerText = "Now on air: The Tide Table with Ivy Pask * Next: Marsh Mellow with Denny Marlow * Request line: Saltmarsh 341 * ";
var tickerPos = 0;
function scrollTicker() {
var f = document.forms[0];
if (!f) { return; }
var el = f.elements[0];
if (!el) { return; }
tickerPos++;
if (tickerPos > tickerText.length) { tickerPos = 0; }
el.value = tickerText.substring(tickerPos) + tickerText.substring(0, tickerPos);
setTimeout("scrollTicker()", 150);
}
var waveX = 620;
function moveWave() {
waveX = waveX - 3;
if (waveX < 520) { waveX = 620; }
if (document.layers) {
var l = document.layers["wave"];
if (l) { l.left = waveX; }
} else if (document.all) {
var d = document.all["wave"];
if (d) { d.style.pixelLeft = waveX; }
}
setTimeout("moveWave()", 120);
}
function getCookie(name) {
var cname = name + "=";
var dc = document.cookie;
if (dc.length > 0) {
var begin = dc.indexOf(cname);
if (begin != -1) {
begin = begin + cname.length;
var end = dc.indexOf(";", begin);
if (end == -1) { end = dc.length; }
return unescape(dc.substring(begin, end));
}
}
return null;
}
function setCookie(name, value) {
var expires = new Date();
expires.setTime(expires.getTime() + (30 * 24 * 60 * 60 * 1000));
document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString() + "; path=/";
}
var visitCount = getCookie("saltmarsh_visits");
if (visitCount == null || visitCount == "") {
visitCount = 1;
} else {
visitCount = parseInt(visitCount, 10) + 1;
}
setCookie("saltmarsh_visits", visitCount);
function padCounter(n) {
var s = "" + n;
while (s.length < 6) { s = "0" + s; }
return s;
}
function writeCounter() {
var s = padCounter(visitCount);
var i;
document.write('<table border="1" cellpadding="2" cellspacing="0" bgcolor="#000000"><tr>');
for (i = 0; i < s.length; i++) {
document.write('<td bgcolor="#000000"><font face="Courier New, Courier" size="3" color="#00FF00">' + s.charAt(i) + '</font></td>');
}
document.write('</tr></table>');
}
// -->
</script>
</head>
<body bgcolor="#FFFFCC" text="#000000" link="#0000CC" vlink="#663399" alink="#FF0000" onLoad="scrollTicker(); moveWave();">
<script language="JavaScript" type="text/javascript">
<!--
if (document.layers) {
document.write('<layer name="wave" left="620" top="8"><font face="Arial" size="2" color="#FF0000"><b>ON AIR</b></font></layer>');
} else if (document.all) {
document.write('<div id="wave" style="position:absolute; left:620px; top:8px;"><font face="Arial" size="2" color="#FF0000"><b>ON AIR</b></font></div>');
}
// -->
</script>
<center>
<table width="760" border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFCC">
<tr>
<td>
<table width="100%" border="0" cellpadding="6" cellspacing="0" bgcolor="#003366">
<tr>
<td align="left">
<font face="Arial Black, Arial, Helvetica" size="6" color="#FFFFFF">Radio Saltmarsh</font><br>
<font face="Arial, Helvetica" size="4" color="#FFFF00"><b>102.3 FM</b></font>
</td>
<td align="right">
<font face="Arial, Helvetica" size="2" color="#FFFFFF">
Broadcasting from a caravan<br>
on the east coast<br>
<i>Ten watts of tidal power</i>
</font>
</td>
</tr>
</table>
<br>
<table width="100%" border="2" cellpadding="4" cellspacing="0" bgcolor="#FFFF00">
<tr>
<td align="center">
<font face="Arial, Helvetica" size="2">
<b><blink>Under construction!</blink></b> We're rebuilding the guestbook CGI and adding a tide times page. Please mind the wet paint and the aerial.
</font>
</td>
</tr>
</table>
<br>
<table width="100%" border="0" cellpadding="2" cellspacing="0" bgcolor="#CCCC99">
<tr>
<td>
<form name="tickerForm" action="#" method="get">
<font face="Arial, Helvetica" size="2"><b>On air now:</b></font>
<input type="text" name="ticker" value="Loading the Radio Saltmarsh ticker..." size="72">
</form>
</td>
</tr>
</table>
<br>
<h2><font face="Arial, Helvetica" size="4" color="#003366">This Week on Saltmarsh</font></h2>
<table width="100%" border="1" cellpadding="3" cellspacing="0" bordercolor="#003366">
<tr bgcolor="#003366">
<td><font face="Arial, Helvetica" size="2" color="#FFFFFF"><b>Time</b></font></td>
<td><font face="Arial, Helvetica" size="2" color="#FFFFFF"><b>Programme</b></font></td>
<td><font face="Arial, Helvetica" size="2" color="#FFFFFF"><b>Presenter</b></font></td>
</tr>
<tr bgcolor="#CCCC99">
<td colspan="3"><font face="Arial, Helvetica" size="2" color="#003366"><b>Monday</b></font></td>
</tr>
<tr>
<td><font face="Arial" size="2">06:00</font></td>
<td><font face="Arial" size="2">The Tide Table</font></td>
<td><font face="Arial" size="2">Ivy Pask</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">09:00</font></td>
<td><font face="Arial" size="2">Marsh Mellow</font></td>
<td><font face="Arial" size="2">Denny Marlow</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">12:00</font></td>
<td><font face="Arial" size="2">Salt & Battery</font></td>
<td><font face="Arial" size="2">Rona Clench</font></td>
</tr>
<tr bgcolor="#CCCC99">
<td colspan="3"><font face="Arial, Helvetica" size="2" color="#003366"><b>Tuesday</b></font></td>
</tr>
<tr>
<td><font face="Arial" size="2">06:00</font></td>
<td><font face="Arial" size="2">The Tide Table</font></td>
<td><font face="Arial" size="2">Ivy Pask</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">09:00</font></td>
<td><font face="Arial" size="2">Marsh Mellow</font></td>
<td><font face="Arial" size="2">Denny Marlow</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">15:00</font></td>
<td><font face="Arial" size="2">Caravan Club</font></td>
<td><font face="Arial" size="2">Baz Tiller</font></td>
</tr>
<tr bgcolor="#CCCC99">
<td colspan="3"><font face="Arial, Helvetica" size="2" color="#003366"><b>Wednesday</b></font></td>
</tr>
<tr>
<td><font face="Arial" size="2">06:00</font></td>
<td><font face="Arial" size="2">The Tide Table</font></td>
<td><font face="Arial" size="2">Ivy Pask</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">12:00</font></td>
<td><font face="Arial" size="2">Salt & Battery</font></td>
<td><font face="Arial" size="2">Rona Clench</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">15:00</font></td>
<td><font face="Arial" size="2">Caravan Club</font></td>
<td><font face="Arial" size="2">Baz Tiller</font></td>
</tr>
<tr bgcolor="#CCCC99">
<td colspan="3"><font face="Arial, Helvetica" size="2" color="#003366"><b>Thursday</b></font></td>
</tr>
<tr>
<td><font face="Arial" size="2">06:00</font></td>
<td><font face="Arial" size="2">The Tide Table</font></td>
<td><font face="Arial" size="2">Ivy Pask</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">09:00</font></td>
<td><font face="Arial" size="2">Marsh Mellow</font></td>
<td><font face="Arial" size="2">Denny Marlow</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">12:00</font></td>
<td><font face="Arial" size="2">Salt & Battery</font></td>
<td><font face="Arial" size="2">Rona Clench</font></td>
</tr>
<tr bgcolor="#CCCC99">
<td colspan="3"><font face="Arial, Helvetica" size="2" color="#003366"><b>Friday</b></font></td>
</tr>
<tr>
<td><font face="Arial" size="2">06:00</font></td>
<td><font face="Arial" size="2">The Tide Table</font></td>
<td><font face="Arial" size="2">Ivy Pask</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">09:00</font></td>
<td><font face="Arial" size="2">Marsh Mellow</font></td>
<td><font face="Arial" size="2">Denny Marlow</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">15:00</font></td>
<td><font face="Arial" size="2">Caravan Club</font></td>
<td><font face="Arial" size="2">Baz Tiller</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">18:00</font></td>
<td><font face="Arial" size="2">The Friday Fish</font></td>
<td><font face="Arial" size="2">Rona Clench</font></td>
</tr>
<tr bgcolor="#CCCC99">
<td colspan="3"><font face="Arial, Helvetica" size="2" color="#003366"><b>Saturday</b></font></td>
</tr>
<tr>
<td><font face="Arial" size="2">08:00</font></td>
<td><font face="Arial" size="2">The Tide Table (Weekend)</font></td>
<td><font face="Arial" size="2">Ivy Pask</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">10:00</font></td>
<td><font face="Arial" size="2">Marsh Mellow</font></td>
<td><font face="Arial" size="2">Denny Marlow</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">13:00</font></td>
<td><font face="Arial" size="2">Salt & Battery</font></td>
<td><font face="Arial" size="2">Rona Clench</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">16:00</font></td>
<td><font face="Arial" size="2">Caravan Club</font></td>
<td><font face="Arial" size="2">Baz Tiller</font></td>
</tr>
<tr bgcolor="#CCCC99">
<td colspan="3"><font face="Arial, Helvetica" size="2" color="#003366"><b>Sunday</b></font></td>
</tr>
<tr>
<td><font face="Arial" size="2">08:00</font></td>
<td><font face="Arial" size="2">The Tide Table</font></td>
<td><font face="Arial" size="2">Ivy Pask</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">10:00</font></td>
<td><font face="Arial" size="2">Sunday Service from the Caravan</font></td>
<td><font face="Arial" size="2">Denny Marlow</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">12:00</font></td>
<td><font face="Arial" size="2">The Saltmarsh Chart</font></td>
<td><font face="Arial" size="2">Rona Clench</font></td>
</tr>
<tr>
<td><font face="Arial" size="2">15:00</font></td>
<td><font face="Arial" size="2">Caravan Club</font></td>
<td><font face="Arial" size="2">Baz Tiller</font></td>
</tr>
</table>
<br>
<h2><font face="Arial, Helvetica" size="4" color="#003366">Meet the Presenters</font></h2>
<table width="100%" border="0" cellpadding="4" cellspacing="0">
<tr>
<td valign="top"><img src="data:image/gif;base64,R0lGODlhAQABAIAAAP8AAAAAACwAAAAAAQABAAACAkQBADs=" width="8" height="8" border="0" alt="*"></td>
<td><font face="Arial, Helvetica" size="2"><b>Ivy Pask</b> -- Reads the tide tables like other people read novels, and once interviewed a seal.</font></td>
</tr>
<tr>
<td valign="top"><img src="data:image/gif;base64,R0lGODlhAQABAIAAAP8AAAAAACwAAAAAAQABAAACAkQBADs=" width="8" height="8" border="0" alt="*"></td>
<td><font face="Arial, Helvetica" size="2"><b>Denny Marlow</b> -- Plays the B-sides, remembers your birthday, and keeps a jar of cough sweets by the desk.</font></td>
</tr>
<tr>
<td valign="top"><img src="data:image/gif;base64,R0lGODlhAQABAIAAAP8AAAAAACwAAAAAAQABAAACAkQBADs=" width="8" height="8" border="0" alt="*"></td>
<td><font face="Arial, Helvetica" size="2"><b>Rona Clench</b> -- Runs the request line, the raffle for the lifeboat, and the only working cassette deck in the caravan.</font></td>
</tr>
<tr>
<td valign="top"><img src="data:image/gif;base64,R0lGODlhAQABAIAAAP8AAAAAACwAAAAAAQABAAACAkQBADs=" width="8" height="8" border="0" alt="*"></td>
<td><font face="Arial, Helvetica" size="2"><b>Baz Tiller</b> -- Drivetime from the caravan, with traffic news from the A149 and a weather eye on the horizon.</font></td>
</tr>
</table>
<br>
<h2><font face="Arial, Helvetica" size="4" color="#003366">Sign Our Guestbook</font></h2>
<table width="100%" border="1" cellpadding="4" cellspacing="0" bgcolor="#EEEEEE">
<tr>
<td>
<form action="/cgi-bin/guestbook.pl" method="post">
<font face="Arial, Helvetica" size="2">
<b>Your name:</b><br>
<input type="text" name="name" size="30"><br><br>
<b>Where are you listening from?</b><br>
<input type="text" name="location" size="30"><br><br>
<b>Comments:</b><br>
<textarea name="comments" rows="4" cols="40"></textarea><br><br>
<input type="submit" value="Sign the guestbook">
<input type="reset" value="Clear">
</font>
</form>
</td>
</tr>
</table>
<br>
<table width="100%" border="0" cellpadding="4" cellspacing="0" bgcolor="#CCCC99">
<tr>
<td align="center">
<font face="Arial, Helvetica" size="2">
You are visitor number:<br>
</font>
<script language="JavaScript" type="text/javascript">
<!--
writeCounter();
// -->
</script>
<font face="Arial, Helvetica" size="2">
<br>
since 1 March 1998. (Cookies must be on, or you're just number one forever.)
</font>
</td>
</tr>
</table>
<br>
<table width="100%" border="0" cellpadding="6" cellspacing="0" bgcolor="#003366">
<tr>
<td align="center">
<font face="Arial, Helvetica" size="2" color="#FFFFFF">
<b>The Saltmarsh Webring</b><br>
<a href="http://www.webring.org/cgi-bin/webring?ring=saltmarsh&id=1&prev"><font color="#FFFF00">Previous</font></a> |
<a href="http://www.webring.org/cgi-bin/webring?ring=saltmarsh&id=1&random"><font color="#FFFF00">Random</font></a> |
<a href="http://www.webring.org/cgi-bin/webring?ring=saltmarsh&id=1&next"><font color="#FFFF00">Next</font></a> |
<a href="http://www.webring.org/cgi-bin/webring?ring=saltmarsh&id=1&list"><font color="#FFFF00">List Sites</font></a>
</font>
</td>
</tr>
</table>
<br>
<table width="100%" border="0" cellpadding="2" cellspacing="0">
<tr>
<td align="center">
<font face="Arial, Helvetica" size="1" color="#666666">
Radio Saltmarsh is a work of fiction. Any resemblance to actual marsh-dwelling radio stations is purely coincidental.<br>
Last updated 14 March 1998. Webmaster: Baz Tiller. Best viewed at 800x600 in Netscape Navigator 4 or Internet Explorer 4.
</font>
</td>
</tr>
</table>
<br>
</td>
</tr>
</table>
</center>
</body>
</html>
Genuinely worked in both IE4 and NS4: HTML 3.2/4 tables, <font>, bgcolor, <center>, cellpadding, cellspacing, border=0, <input>, <textarea>, <submit>, <reset>, document.forms, document.cookie, setTimeout, Date, parseInt, String.substring, and document.write. Those are the backbone of the page. The ticker and the cookie-based hit counter should run in both, assuming JavaScript is on and cookies are accepted.
Worked in only one, or only because of branching:
<blink> was Netscape-only. IE4 showed the under-construction text as plain static text. Modern browsers ignore it too.document.layers exists in Netscape 4; IE4 would not see it. I check it first and write a <layer name="wave"> for Netscape. In IE4, document.all exists, so I write a positioned <div id="wave"> and animate it with style.pixelLeft. IE4 never receives the <layer>; NS4 never receives the <div>.bordercolor on <table> was an IE extension. IE4 honoured it; NS4 ignored it and used default table borders. The table still rendered.<style> block was patchy. IE4 supported more CSS1 than NS4. NS4 often ignored or partially applied things like font-family on body; I used <font> for critical text so the page degrades.<input>, <textarea> and <select> as native widgets and ignored most CSS on them. IE4 was also inconsistent. That is why I used size, rows and cols attributes and did not try to style form controls with CSS.Nested tables: NS4 had real bugs with deeply nested tables, percentage widths and cellpadding. I kept nesting shallow and used explicit widths where possible, but NS4 might still shift a border or two. IE4 was more forgiving. This is the classic reason people kept layouts simple or used spacer GIFs.
<spacer>: I did not use it. It was a Netscape-only tag, introduced around Netscape 3, and IE ignored it. Instead I used cellpadding and a data URI GIF for the bullet.
Single-pixel transparent GIF: The standard 1998 trick for spacing and alignment, because margins and padding were unreliable across browsers. I used a 1×1 red GIF data URI for the presenter bullets, but the same idea applies.
Anachronistic bits:
data: URIs. IE did not support them properly until IE8, and Netscape 4 never did. In 1998 these would have been separate .gif files fetched from the server. Under your target browsers, the bullet images would show as broken images or alt text. I used them because you allowed them.type="text/javascript" on <script> is HTML 4.0, 1997, so it is period, but I also included language="JavaScript" for older browsers.position:absolute and style.pixelLeft are period for IE4 Dynamic HTML and NS4 layers, but modern browsers use different DOM APIs. document.layers is gone, and document.all is legacy/falsy in some modern browsers, so the moving “ON AIR” sign may not appear when you open this today. The ticker still works.Uncertainties: I am not 100% certain NS4 applied font-family from CSS to body; it may have ignored it. I used <font face="Arial, Helvetica"> on most text, so it does not matter. I am also not certain IE4 supported bordercolor exactly as later IE versions did, but it was an IE extension of the era.