feat: the mews.page site

This commit is contained in:
randogoth 2026-10-11 15:05:42 +03:00
parent 5fa14bdf1b
commit 003bb0b4b1
4 changed files with 274 additions and 0 deletions

30
Makefile Normal file
View file

@ -0,0 +1,30 @@
# Local build and checks. The real gate is `nix build .#site`, which runs the
# same steps in the sandbox and refuses to produce a non-conforming page.
SPEC_DESCRIPTION = The Mews Profile specification, version 0.1.
.PHONY: site test lint clean
site:
rm -rf build
mkdir -p build/spec build/dtd
cp site/index.html site/about.html site/check.html build/
cp mews-0.1.css build/mews-0.1.css
cp mews-0.1.css build/spec/mews-0.1.css
cp dtd/mews-0.1.dtd dtd/xhtml-mobile12.dtd build/dtd/
uv run --script md2mews.py doc/SPEC.md -o build/spec/0.1.html --lang en \
--variant mews-cool --description "$(SPEC_DESCRIPTION)"
uv run mewslint.py --quiet build/index.html build/about.html build/check.html \
build/spec/0.1.html
@echo "site built in build/"
test:
uv run --script dtd/check_dtd.py
uv run pytest -q
lint:
uv run ruff check .
uv run ruff format --check .
clean:
rm -rf build

76
site/about.html Normal file
View file

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN"
"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>About Mews</title>
<meta name="mews-profile" content="0.1" />
<meta name="viewport" content="width=device-width" />
<meta name="description" content="How the Mews directory works, what this site keeps, and how to get in touch." />
<link rel="stylesheet" type="text/css" href="mews-0.1.css" />
</head>
<body class="mews-cool">
<h1>About Mews</h1>
<p>Mews Profile is a working draft. The format, the stylesheet and this
site are all version 0.1, which is to say I am still changing my mind
about parts of it, and the spec admits as much in its first paragraph.
What a given version promises is written down at
<a href="/spec/0.1" accesskey="1">mews.page/spec/0.1</a>, and it stays
there once published.</p>
<h2>How the directory works</h2>
<p>Anyone can submit an address. The page is fetched and put through both
of the checks in section 9.1: it has to validate against the Mews DTD, and
it has to follow the handful of rules a DTD can't express, like keeping
your images on your own site and the markup under 256 KB (and preferably
under 64). Pass both and
your site is listed at once, by nobody's leave but the checker's.</p>
<p>Listed sites are looked at again every week, and one whose page stops
conforming is dropped; since I hold no contact details there is nobody to
warn beforehand, so submit the fixed page and it is listed again
immediately. A site the checker simply can't reach gets a few days of
retries before it goes, because being down over a weekend isn't the same
as being wrong.</p>
<p>The checks say nothing whatsoever about what a site publishes, and they
can't: a page about anything at all can be flawless XHTML. So if a listing
here points at something abusive, write to me and it comes out.</p>
<h2>What this site keeps</h2>
<p>A submission stores the address you gave, the domain it belongs to,
what the checks found, and a salted hash of your IP address so that the
rate limits work. The salt is replaced every month, so last month's hashes
stop matching this month's, and raw addresses are never written down at
all.</p>
<p>Submissions and results are deleted after ninety days. No cookies,
nothing loaded from anywhere else, and no analytics, which given the
subject matter would have been embarrassing.</p>
<h2>Thanks</h2>
<p>The format rests on <em>XHTML Mobile Profile 1.2</em>, which the
<a href="/dtd/xhtml-mobile12.dtd">Open Mobile Alliance</a> finished in
March 2008 and which is still perfectly good. The stylesheet asks first
for <a href="https://www.brailleinstitute.org/freefont/"><em>Atkinson
Hyperlegible</em></a>, made free for anyone to use by the Braille
Institute of America, and then for
<a href="https://github.com/adobe-fonts/source-code-pro"><em>Source Code
Pro</em></a> by Paul D. Hunt. Neither is loaded from anywhere: if you have
them you see them, and if you don't, Verdana is waiting.</p>
<h2>Get in touch</h2>
<p>Bug reports, arguments about the spec, and sites that ought to be
listed and aren't:</p>
<address>hello@mews.page</address>
<hr />
<p>I would rather this stayed small: a format one person can implement in
a weekend, a directory you can read in a single sitting, and pages that
still open in 2046. If it grows much past that, something has gone
wrong.</p>
<p><a href="/" accesskey="0">Mews</a>
· <a href="/check" accesskey="2">Check a page</a>
· <a href="/directory" accesskey="3">The directory</a></p>
</body>
</html>

61
site/check.html Normal file
View file

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN"
"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Check a page</title>
<meta name="mews-profile" content="0.1" />
<meta name="viewport" content="width=device-width" />
<meta name="description" content="Check a page against Mews Profile 0.1, and add your site to the directory." />
<link rel="stylesheet" type="text/css" href="mews-0.1.css" />
</head>
<body class="mews-cool">
<h1>Check a page</h1>
<p>Paste an address below. The checker fetches that page, validates it
against the <a href="/dtd/mews-0.1.dtd">Mews DTD</a>, reads your copy of
the stylesheet and up to twenty of your images, and then lists every rule
the page breaks together with the section of the spec that explains it.</p>
<form action="/result" method="post">
<fieldset>
<p><label for="url">Page address</label><br />
<input type="text" name="url" id="url" size="30" maxlength="200" accesskey="1" /></p>
<p><input type="submit" name="check" value="Check page" accesskey="2" />
<input type="submit" name="list" value="Check and list" accesskey="3" /></p>
</fieldset>
</form>
<p><strong>Check page</strong> tells you what it found and keeps nothing.
<strong>Check and list</strong> does the same and then, if the page passes,
puts your site in the <a href="/directory" accesskey="4">directory</a>.
Either way it can take up to a minute, and there is no progress bar,
because a progress bar wants JavaScript and that is the one thing a Mews
page can't have. Leave this page open and go and put the kettle on.</p>
<h2>Doing it yourself</h2>
<p>The same checks run on the command line, which is far less tedious
while you are still fixing things:</p>
<pre>uv run mewslint.py https://example.com/</pre>
<p>It reads local files too, so you can check a page before anyone else
sees it, and I run it on this site as well: the build refuses to produce
mews.page at all if one of its own pages stops conforming. That seemed
only fair.</p>
<h2>What gets listed</h2>
<p>One page per site, the one you hand me, and nobody reviews it: if the
page passes it goes in, and that is the whole of the trust model. A listed
site is checked again every week, and one whose page stops conforming
comes out of the directory without being asked twice.</p>
<p>Fix it, submit it again, and it is back in straight away. I keep no
address to warn you at, which is the trade (no account, no password to
forget, and no warning either).</p>
<hr />
<p>If the checker turns your page down over something the spec doesn't
actually say, that is a bug in my validator rather than a fault in your
page, and I would like to hear about it.</p>
<p><a href="/spec/0.1" accesskey="5">The spec</a>
· <a href="/about" accesskey="0">About this site</a></p>
</body>
</html>

107
site/index.html Normal file
View file

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN"
"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Mews</title>
<meta name="mews-profile" content="0.1" />
<meta name="viewport" content="width=device-width" />
<meta name="description" content="A quiet corner of the web, built on a standard that was already cut back: XHTML Mobile Profile 1.2." />
<link rel="stylesheet" type="text/css" href="mews-0.1.css" />
</head>
<body class="mews-cool">
<h1>Mews</h1>
<p>A <em>mews</em> is the lane round the back where the stables used to be:
narrow, quiet, and not on the way to anywhere. The web could do with one of
those. Small sites, plain words, nothing watching you read.</p>
<p>This obviously isn't the first attempt to do so. The
<a href="https://indieweb.org/">IndieWeb</a> and small web crowd have made this case for way longer than I have. The usual answer is to go and build somewhere else, and the people doing it are right about the problem.
<a href="https://geminiprotocol.net/">Gemini</a> has been at it since 2019, <a href="https://portal.mozz.us/spartan/spartan.mozz.us/">Spartan</a> trimmed even the TLS out of it, and I keep capsules on all of them.</p>
<p>Where I disagree is that it takes a new protocol, which means a new client, a new server, and a page hardly anybody can open from a link you send them.
We already had a Web standard that was cut back on purpose, and cut back
properly: a published spec, a DTD, and a few hundred million handsets to
test it against. <em>XHTML Mobile Profile 1.2</em> is strict XML built
from a fixed list of modules, with the desktop machinery left out of the
build: no frames, no iframes, no image maps, and basic tables instead of
the full set. It kept scripts and author stylesheets, because a phone in
2008 was expected to want them.</p>
<p>Mews goes further, for different reasons, and keeps the <em>MP</em>
while it is at it. Out go the scripting, style and object modules and the
event attributes; what is left is a choice rather than a hardware budget:
headings, paragraphs, lists, links, a few images, one stylesheet that
nobody gets to write, and nothing at all loaded from a server you don't
control. The phones were the excuse. The quiet is the point.</p>
<p><strong>Authors provide structure. Readers control
presentation.</strong> Every rule in the spec follows from that one line,
which in practice means I don't get to pick your typeface, your line width
or your colours, and you don't have to put up with mine.</p>
<h2>Have a look round</h2>
<ul>
<li><a href="/spec/0.1" accesskey="1">The spec</a>. Nine short sections.
You can read the whole thing before your tea goes cold.</li>
<li><a href="/check" accesskey="2">Check a page</a>. Paste an address and
find out what it breaks, with the section number that explains why.</li>
<li><a href="/directory" accesskey="3">The directory</a>. Every site
whose page passes.</li>
</ul>
<h2>The whole page</h2>
<p>Here is a conforming Mews page, and not an excerpt either. The
lot:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN"
"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;
&lt;head&gt;
&lt;title&gt;Signal Bars&lt;/title&gt;
&lt;meta name="mews-profile" content="0.1" /&gt;
&lt;link rel="stylesheet" type="text/css" href="mews-0.1.css" /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Signal Bars&lt;/h1&gt;
&lt;p&gt;Notes on old phones and small screens.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>If that looks like 1999 to you, good.</p>
<h2>One stylesheet, thirty-two colours</h2>
<p>There is exactly one stylesheet, and you don't write it. Copy
<a href="/mews-0.1.css" accesskey="4">mews-0.1.css</a> onto your own site,
link it, and then leave it alone. It sets a readable column width, a light
theme and a dark one, and four palettes (warm, cool, green, and a
monochrome one that looks like an early phone screen) which you choose
between with a single class on the body. Every text colour in it clears
7:1 contrast against its background, which is a higher bar than most of
the web bothers with.</p>
<p>Host your own copy rather than linking mine. If every Mews site pointed
at one central file, that file's server would see a request for every page
anybody reads anywhere, and the whole business of loading nothing from
other sites would have been for nothing.</p>
<h2>The bits and pieces</h2>
<ul>
<li><a href="/mews-0.1.css">mews-0.1.css</a>, the stylesheet above.</li>
<li><a href="/dtd/mews-0.1.dtd">mews-0.1.dtd</a>, which is what the
checker validates against. Your browser should never fetch it, and
neither should a client.</li>
<li><a href="/dtd/xhtml-mobile12.dtd">xhtml-mobile12.dtd</a>, the
original from 2008, kept here so nobody has to go hunting for it.</li>
</ul>
<hr />
<p>This is a draft, version 0.1, and I am still changing my mind about
parts of it. The directory is new and nearly empty. But a page written to
these rules opens on a handset from 2006, in your browser today, and in
whatever is reading pages in twenty years, because there is almost nothing
left in it to break.</p>
<p>So: write something. Link to a neighbour. Leave the light on.</p>
<p><a href="/about" accesskey="0">About this site</a></p>
</body>
</html>