SchOS/docs/Website/README.md
Nexoniarz 953f9c5c3c branding: one mark, and PSOGM draws it
Guru and SchCotie are gone. Shift is the only mark, and the crash screen draws
it where the face used to be.

Guru was an icon -- a pictogram with a face, denoting one state -- that lived
on the crash screen and nowhere else. Its argument was identity: `:(` is
recognisably Microsoft's, and a crash screen is the single screenshot most
likely to leave the machine, so it is the worst place to be wearing somebody
else's face. That part holds, and it is kept in the branding README because it
is the argument against any second mark. What does not follow is that the
answer is a *new* mark. Shift already signs the system, it is already what the
machine drew on the splash it started with, and a reader who has seen it twice
before the crash recognises it faster than a face they have never seen.

SchCotie was a mascot, and never existed: the file said so itself under "what
this does not cover". A brief for a character nobody is about to draw is not
worth carrying.

So `draw_guru()` and its SVG-space geometry leave panic.c, the two `guru.svg`
files are deleted, and PSOGM calls gfx_draw_logo() -- the same include/logo.h
mask the loader splash and the boot console composite. At its native 128 px:
there is no resampler in the crash path, and the face was scalable in a place
that only ever drew it at one size.

The name stays. "Purple Screen of Guru Meditation" is the Amiga nod, which
panic.c's own header already called out as a separate thing from the mark.

**And taking the screenshot to check it caught a regression from the TTF
console work.** `gfx_draw_char()` -- the pixel-positioned path, which only
PSOGM uses -- still walked `font_data[c][row]` for `row < CHAR_HEIGHT`.
font_data has exactly 16 rows per glyph; CHAR_HEIGHT is the *TrueType* cell
height now, about 21. So every line of the crash report drew five rows of the
next character's bitmap underneath itself, and it looked like each line had
been printed twice. The grid path had been updated when the cell size stopped
being a constant; this one had not, because nothing routine draws text in pixel
coordinates. Both go through one draw_glyph_px() now, and the bitmap's own
geometry is spelled BITMAP_W/BITMAP_H so it cannot be mistaken for a cell size
again.

Two stale claims corrected while in there, in panic.c's header and in
graphics.md: PSOGM has not dimmed-and-floated over the old screen for a while
-- it clears to full purple, and the file's own code comment says why -- and
there is no longer "a face that is obviously a cartoon".

The website's crash section shows the mark in flat white rather than its own
violets, which is what the kernel actually draws: PSOGM composites a coverage
mask in one colour, and those violets sit close enough to #4B1D9A to
half-disappear against it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 21:35:58 +02:00

123 lines
5.3 KiB
Markdown

<!-- SPDX-License-Identifier: Apache-2.0 -->
# The website
Six files and a folder of marks. No build step, no dependencies, no
framework — open `index.html` and it works, including from a `file://` URL.
```
index.html the front page
download.html get it, write it to a stick, or build it
docs.html the documentation reader
style.css the palette, transcribed from include/theme.h
app.js the front page: the boot log types, sections fade in
docs.js the Markdown renderer and the doc index
Assets/ shift.svg (logo), uberblock.svg (SchFS),
usb.svg (downloads), pride.svg
```
## The download page
`download.html` links to `releases/schos.iso`, a path relative to this
directory. **Nothing puts a file there** — the ISO is 62 MB and does not belong
in the repository — so the link is dead until a build is dropped next to the
site:
```sh
make iso
mkdir -p docs/Website/releases && cp schos.iso docs/Website/releases/
```
The page is written so that this is the only thing that needs doing, and so that
nothing on it is a promise the tree cannot keep. In particular the support table
says **one real machine, under test** rather than listing hardware, because one
Chromebox is the entire bare-metal record and a compatibility list would be
fiction. When that changes, change the table; do not soften the wording.
The `dd` command is split across two lines on purpose. It was one long line
first, and the card clipped it at `conv=` — a destructive command that can
scroll half of itself out of view is a good way to take somebody's disk.
## The docs reader
`docs.html` renders the Markdown in `docs/` in the site's own theme, with the
index down the left and a table of contents down the right. Links between
documents are rewritten to stay inside the reader, so `../history/schfs.md`
in an architecture page navigates rather than downloads.
The parser is about 150 lines in `docs.js` and handles what `docs/` actually
uses: headings, fenced code, tables, lists, quotes, rules and inline marks.
A Markdown library would be larger than everything else here put together.
Every document is escaped before a single tag is emitted — the only HTML that
reaches the page is HTML `docs.js` wrote.
**This one page needs a server.** Browsers refuse `fetch()` on `file://` for
the same reason they refuse it cross-origin, so opening `docs.html` from a
file gives a panel explaining that instead of the docs. Everything else works
from a file. To read them locally:
```sh
cd /home/nexoniarz/Dokumenty/Projects/SchOS
python3 -m http.server 8000
# then http://localhost:8000/docs/Website/docs.html
```
Adding a document means adding one line to the `DOCS` array in `docs.js`. The
reader will only load a path that appears there.
## The two footer notes
Both pages carry two statements below the licence line, and both are meant to
be read rather than skimmed past.
The first is the flag, below. The second is about AI, and it says the thing
worth saying: the tool is not the measure. A project is good when the people
building it understand what was built. That claim is deliberately made next to
a link to `history/`, because that directory is where it can be checked — the
bugs are written up in full, including the wrong turns and the measurements
that disproved them. An explanation you can follow is the evidence; the byline
is not.
## The flag
`Assets/pride.svg` is in the top bar and in the footer, on both pages, and it
is not seasonal. Support with an end date is marketing; this is a project that
belongs to whoever writes it. It is also deliberately small — the site is
about an operating system, and the flag is a statement, not a subject.
## The rules it follows
**The palette is not a design decision.** It is `include/theme.h`, copied. A
site describing an operating system should look like the operating system, and
copying the header means the two cannot drift apart by accident.
**PSOGM purple appears exactly once.** `#4B1D9A` is on the crash-screen section
and nowhere else, because [../branding/README.md](../branding/README.md) says
it means *the machine stopped* and that a colour used everywhere means nothing.
If it shows up in a second place, that is a bug in the page.
**The typefaces are the ones the OS ships.** Roboto for text and JetBrains Mono
for the system voice — both already in `ports/`, both already in `NOTICE`. They
are requested from the system rather than downloaded: a font file would be
larger than the entire rest of the site.
**The script is optional.** If `app.js` fails to load the page is still
complete and still readable. Everything it does is decoration, and it honours
`prefers-reduced-motion` by doing none of it.
**The boot log is real.** The lines in `app.js` are from an actual boot, not
invented. The timer calibration line is there deliberately; see section 13 of
[../history/kernel.md](../history/kernel.md) for what it cost.
## Editing it
The numbers in the *Numbers* section are measured, not estimated, and they go
stale. To refresh them:
```sh
find kernel include -name '*.c' -o -name '*.h' | xargs wc -l | tail -1
grep -c '^SYSCALL' kernel/sys/table.inc
```
The feature cards carry a tag — `runs`, `in progress`, or `designed` — and the
tag is a promise. Anything marked `runs` is in the tree and works today. When
that stops being true, change the tag rather than the wording.