feat: the mews.page site
This commit is contained in:
parent
5fa14bdf1b
commit
003bb0b4b1
4 changed files with 274 additions and 0 deletions
30
Makefile
Normal file
30
Makefile
Normal 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
76
site/about.html
Normal 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
61
site/check.html
Normal 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
107
site/index.html
Normal 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><?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>Signal Bars</title>
|
||||||
|
<meta name="mews-profile" content="0.1" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="mews-0.1.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Signal Bars</h1>
|
||||||
|
<p>Notes on old phones and small screens.</p>
|
||||||
|
</body>
|
||||||
|
</html></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>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue