SchOS/docs/branding
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Nexoniarz cb3d28e3d6 docs: README, plan, guides and the site describe what is built now
README: rewritten around what runs (Linux software, Xorg, apk, Linux's drivers), the honest gaps, measured numbers.
plan/: 1.0.md is the finish line, where each clause of the acceptance test stands, and the register (one failing
clause: a root that survives a reboot); built plans (foundations, hybrid, alpine, xorg) and the decided-against one
(wayland) are gone, their content lives in architecture/; roadmap.md is only what is still open.
guides: building/layout/testing/adding-a-driver (Linux code may be used). history: four entries (ls -lR, TLB
shootdowns, MDIO 0x02460246, netlink MSG_TRUNC). Website: cards, stack, download page, docs index.
Code comments that pointed at deleted plan docs point at the architecture docs.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EVRhxi9zpdW2uDUN4FVcao
2026-10-26 08:08:05 +01:00
..
Ascii net: the DHCP lease goes to the log, not over the user's shell 2026-09-12 19:59:05 +02:00
wallpapers branding: four skeuomorphic wallpapers; the old art goes 2026-10-23 15:51:29 +02:00
README.md docs: README, plan, guides and the site describe what is built now 2026-10-26 08:08:05 +01:00
shift-mask.png docs: a branding folder, and the three marks are not interchangeable 2026-09-12 18:19:09 +02:00
shift-mask.svg include: one folder per subsystem, and includes that name it 2026-10-23 15:05:12 +02:00
shift.png site, branding: skeuomorphic marks, and the new Niveus components 2026-10-23 15:17:34 +02:00
shift.svg site, branding: skeuomorphic marks, and the new Niveus components 2026-10-23 15:17:34 +02:00
uberblock.svg site, branding: skeuomorphic marks, and the new Niveus components 2026-10-23 15:17:34 +02:00

Branding

One mark.

Shift the logo An abstract mark. Non-human, non-animal. Signs the system.

There were three. Guru, an icon — a pictogram with a face, denoting one state — lived on the crash screen and nowhere else. SchCotie, a mascot — a character with a body, poses and expressions — was a brief and was never drawn. Both are gone for now, and may come back.

The reasoning that retired Guru is worth keeping, because it is the argument against any second mark. Guru existed to give the crash screen an 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. 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 went for a simpler reason: a mascot has to be able to do things. An icon works once, at one size, in one state. A character has to work confused, pleased, asleep and from behind — which is why it costs more, and why a brief for one is not worth carrying until somebody is going to draw it.


The one constraint everything answers to

The kernel draws its mark as a 128×128 single-channel coverage mask. include/gfx/logo.h holds no colour at all — two pixels per byte, sixteen levels of ink — and the kernel composites it in whatever include/gfx/theme.h says.

So any mark that will end up there has to survive as a solid shape in one colour at 128 px, and be recognisable at 24. That rules out hairlines, thin rings and anything that depends on a gradient to read. The mark this replaced failed on all three counts.

Colour is therefore the last decision, never the first. Design the silhouette, then colour it.


shift.svg

Three slabs, displaced: the layer diagram in ../architecture/README.md as a solid object, and the kernel's name (SchIFT) as a shape.

  • Any colour. This is a fact about the pipeline, not a preference — the coverage mask carries none, so the loader draws it in metal and the kernel in the theme accent, from the same bytes.
  • With or without a wordmark. Set "SchOS" beside it in Roboto Bold, which is already in the tree (ports/Roboto), Apache-2.0, and already in NOTICE.
  • Rendered as an object, drawn as a shape. The colour shift.svg is lit the way Niveus lights a key -- one light from the upper left, a gloss across each top face, a specular line on the edges that face it, and a soft shadow from each slab onto the next. None of that is in the silhouette: shift-mask.svg is the same geometry with no shading, and it is still what include/gfx/logo.h is built from, so the kernel's mark is unchanged.
  • Non-human and non-animal, permanently. If a character is ever drawn it gets its own mark; a logo that starts growing a face has taken that job.

Colour

From include/gfx/theme.h, which is the source of truth. Nothing here restates a value it does not already define.

SCH_BG #0C0E13 Ground. Near-black with a blue cast, because pure black reads as "switched off".
SCH_FG #E6E8EC Primary text
SCH_DIM #707784 Secondary
SCH_ACCENT #7C5CFF The one accent. Shift, and anything calm.
PSOGM_BG #4B1D9A Failure only. The crash screen's ground and nothing else's.

PSOGM_BG is deliberately not the accent. theme.h states the rule it enforces:

normal states are calm and dark; only failure is loud. PSOGM keeps the full-bleed purple entirely to itself, which is what makes it mean something.

If that purple ever appears on a splash, a sticker or a README header, it stops meaning the machine stopped — and it is the only colour in the system that means anything at all.

File formats

SVG, or PNG at high resolution with no lossy compression. Nothing else.

No JPEG anywhere — a mark is flat colour with hard edges, which is the exact case JPEG is worst at, and the ringing it leaves around an edge is permanent. No screenshots of marks. No re-exports of re-exports: go back to the SVG.

Wallpapers are the one exception, and the reason is the same rule read the other way round. They are soft gradients under a film of grain: no hard edge for JPEG to ring around, and nothing a PNG can compress -- the grain made each one nine megabytes as PNG and about a hundred kilobytes as JPEG, with no difference anyone can see. The SVG is still the source; the JPEG is a render.

SVG is the source of truth for every mark. A raster is something generated from it, never edited.

The mark as characters

Ascii/ascii_{50,68,100,150}.txt — Shift rendered in text at four widths, named for the column count they fit in.

make installs the 50-column one as /usr/share/schos/logo.txt, because 50 is what leaves room for an info block beside it on an 80-column console:

fastfetch --file-raw /usr/share/schos/logo.txt

Installed from here rather than copied into sysroot/ by hand, so there is one source and the build keeps them in step.

These are a rendering of the mark, not a second mark. If Shift changes they are regenerated from it; they are not edited to taste, or the two drift and the text one wins by being the one people see in a terminal.

What is in here, and why a raster is committed

shift.svg               the logo, in colour
shift-mask.svg          the same geometry in greys -- see below
shift-mask.png          rasterised from it, committed on purpose
uberblock.svg           SchFS
wallpapers/             3840x2160, SVG and a JPEG render of each

Wallpapers

Generated by tools/wallpapers.py from the Shift geometry in shift.svg, so a change to the mark is one command away from every wallpaper rather than four hand edits. Rendered to JPEG with a browser, because a browser is the renderer that gets the SVG lighting filters right:

python3 tools/wallpapers.py
chromium --headless=new --window-size=3840,2160 --screenshot=graphite.jpg page.html

where page.html is an <img> of the SVG at 3840x2160.

graphite Shift on warm graphite, throwing a violet pool of light on the surface. The default.
strata The slabs repeated into a cascade receding into indigo, near ones sharp, far ones soft.
porcelain The light one: Shift as glazed porcelain on paper, the top slab in the accent.
dial The uberblock ring as hardware -- a turned metal face, slots as keys, the newest one and the root lit.

The wallpaper they replace used Guru, which is retired (see the top of this file), and was drawn flat.

The pipeline is three stages:

shift-mask.svg  --(inkscape)-->  shift-mask.png  --(make logo)-->  include/gfx/logo.h

Both intermediates are committed, and that is deliberate. inkscape is not a build prerequisite — see ../guides/building.md — so a build that required a vector rasteriser would stop working on most hosts for the sake of a file that changes about once a year. The PNG is regenerated by hand when the SVG changes, and make logo turns it into the header.

tools/python/mklogo.py reads ink as (255 - luminance) * alpha, so tones survive as coverage rather than being flattened — and the relationship inverts: darkest here is brightest on screen. Copying the violet fills from shift.svg would light the object from below.

So shift-mask.svg is the same geometry in greys chosen for how the mask reads. Two files sharing one geometry is a drift hazard; the <desc> in both says so. If either is edited, edit both.


Where each mark is actually drawn

Loader splash Shift, from include/gfx/logo.h, shaded per row by metal() in boot/common/ui.c — silver, not accent.
Kernel console / early boot Shift, same mask, composited flat in a theme colour by gfx_draw_logo.
A display with no compositor Shift again, drawn by vgpud on SCH_BG. It replaced a test card — colour bands, gradients, a checkerboard and the driver's pid in binary — which was scaffolding for ../architecture/devices.md's driver work and outlived them. The mark answers the same question a black screen cannot, something is driving this device, and answers it as the system rather than as a test rig.
PSOGM Shift, the same mask again, by gfx_draw_logo() from kernel/core/panic.c. At its native 128 px — there is no resampler in the crash path, and the mark was only ever drawn at one size there anyway.
Serial crash report :(, as text. The mark cannot be drawn in ASCII, and a mood marker in a log is not a mark.
SchFS Nowhere yet. uberblock.svg has no consumer; it is waiting for projects/schfs-linux/ to have a README worth heading.

One trap, since it has already been stepped in: boot/common/ui.c includes logo.h, theme.h and font.h, and the Makefile rule for the loader did not list them. A new logo therefore did not rebuild the loader — make reported nothing to do and the splash kept drawing a mask compiled months earlier. The kernel half never showed the problem because those objects are built with -MD -MP and track their own headers. Changing anything in here means the loader must actually relink, and that needs clang and lld-link.

What this does not cover

  • No trademark position. These are marks the project uses, not marks anyone has registered or defended.
  • No usage rules for third parties — nothing says what someone else may do with them. Worth writing before anything is published.
  • There is no icon and no mascot. Both were removed rather than left half-specified. If either comes back it starts from the argument at the top of this file, not from what used to be here.
  • No wordmark lockup is specified. "Roboto Bold beside it" is not a spacing rule, a size ratio or a clear-space margin, and it will want to be.