site(com): Downloads and Documents, built from a release; the nav links; the release's SHA256SUMS covers every file (#126, #157) [skip ci]
The design canvas (v17) gains the Documents artboard -- the Book of Fabric and the Dictionary of v4 first, then the book, the three volumes and the API reference, each with its SHA-256, and the SSRN paper -- and Downloads and Documents in every .com nav; Downloads' reading list becomes a pointer to Documents. site/com/canvas/ copied from it. site/com/build.py --release TAG --sums SHA256SUMS builds Downloads and Documents from the release ([TAG], [RELEASE]/<file>, [SHA:<file>]; a file the release's SHA256SUMS lacks fails the build). Without a release it builds Home, Try it and Inquiries exactly as before -- byte for byte -- with no link to the two pages, so they go live only with alpha.4. install.sh installs them when built. scripts/nightly.sh gitea-release: the release's SHA256SUMS now covers every file it attaches -- the images' sums, then the PDFs and the Root CA's certificate -- so `sha256sum -c SHA256SUMS` checks all of it and Documents finds each sum. The Nexus artifacts keep their own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
This commit is contained in:
@@ -18,9 +18,15 @@ Captain Bob, 2026-11-10: "Do it" -- the rest of alpha.4 that lives in the tree,
|
||||
- [x] the table in the tree, `docs/reference/v4-dictionary.tsv`: all 318 entries, written in three alphabetical batches against v4's own definitions (the source gave 54 stacks and 105 descriptions to start from); `check` passes
|
||||
- [x] the check: `mkdictionary.py check` -- every live word has a finished entry, every entry a live word; run by `make dictionary`, so a stale table fails the build and the nightly
|
||||
- [x] the PDF, alphabetical: `make dictionary` -> `build/docs/Dictionary.pdf` (20 pages; `docs/book/dictionary.tex`); the nightly's docs stage builds it, `publish` sends classifier `dictionary`, the release attaches it
|
||||
- [ ] the Documents page: canvas artboard, then `site/com`
|
||||
- [x] the Documents page: the canvas artboard (`project/Documents.dc.html`, canvas v17: the Book of Fabric and the Dictionary first, then the book, the volumes, the API; each with its SHA-256; the SSRN paper), then `site/com/canvas/Documents.dc.html`
|
||||
|
||||
## #126 -- the Downloads page live
|
||||
- [ ] `site/com` builds Downloads (and Documents) from the release: its tag, `SHA256SUMS`, the
|
||||
Root CA's fingerprint
|
||||
- [ ] the nav links on Home, Try it, Inquiries
|
||||
- [x] `site/com/build.py --release TAG --sums SHA256SUMS` builds Downloads and Documents: `[TAG]`, `[RELEASE]/<file>` (the
|
||||
Gitea release's file), `[SHA:<file>]`; a file not in SHA256SUMS fails the build. Without a release it builds the three
|
||||
pages as before, byte for byte, with no link to the two. `install.sh` installs them when they are built. The release's
|
||||
SHA256SUMS now covers every file it attaches (the images, the PDFs, the Root CA's certificate): `nightly.sh gitea-release`
|
||||
- [x] the nav links on Home, Try it, Inquiries (canvas v17; shown only when the two pages are built)
|
||||
|
||||
**At the alpha.4 release** (after `gitea-release`): download the release's `SHA256SUMS`, then
|
||||
`python3 site/com/build.py --release v4.0.0-alpha.4 --sums SHA256SUMS` and
|
||||
`XWIKI_USER=rajames XWIKI_PASSWORD=... site/com/install.sh` (Captain Bob's; the .com's login).
|
||||
|
||||
+12
-3
@@ -195,15 +195,23 @@ gitea-release)
|
||||
: "${RELEASE_TOKEN:?RELEASE_TOKEN: a token that may write the repository}"
|
||||
api=${GITEA_API:-${GITHUB_SERVER_URL:-https://gitea.starshipos-f18.org}/api/v1/repos/${GITHUB_REPOSITORY:-rajames/LithosAnanke}}
|
||||
need "$OUT/StarshipOS.iso" "$OUT/pc-stick.img.xz" "$OUT/raspi5.img.xz" "$OUT/MilkV.img.xz" "$OUT/SHA256SUMS"
|
||||
files=("$OUT/StarshipOS.iso" "$OUT/pc-stick.img.xz" "$OUT/raspi5.img.xz" "$OUT/MilkV.img.xz" "$OUT/SHA256SUMS")
|
||||
for f in "$DOCS"/*.pdf ci/pki/starshipos-root-ca.pem; do [ -f "$f" ] && files+=("$f"); done
|
||||
# The release's SHA256SUMS covers every file it attaches -- the images' sums as the images
|
||||
# stage wrote them, then the documents and the Root CA's certificate -- so that
|
||||
# `sha256sum -c SHA256SUMS` checks all of it, and the .com's Documents page (site/com/build.py,
|
||||
# #157) finds each document's sum. The Nexus artifacts keep their own SHA256SUMS.
|
||||
rel=$(mktemp -d)
|
||||
cp "$OUT/SHA256SUMS" "$rel/SHA256SUMS"
|
||||
extra=("$DOCS"/*.pdf ci/pki/starshipos-root-ca.pem)
|
||||
for f in "${extra[@]}"; do [ -f "$f" ] && (cd "$(dirname "$f")" && sha256sum "$(basename "$f")") >> "$rel/SHA256SUMS"; done
|
||||
files=("$OUT/StarshipOS.iso" "$OUT/pc-stick.img.xz" "$OUT/raspi5.img.xz" "$OUT/MilkV.img.xz" "$rel/SHA256SUMS")
|
||||
for f in "${extra[@]}"; do [ -f "$f" ] && files+=("$f"); done
|
||||
gitea() { curl -fsS -H "Authorization: token $RELEASE_TOKEN" "$@"; }
|
||||
body=$(python3 -c '
|
||||
import json, sys
|
||||
notes, sums, version = sys.argv[1], open(sys.argv[2]).read(), sys.argv[3]
|
||||
print(json.dumps(notes.strip() + "\n\n## Checksums (SHA-256)\n\n```\n" + sums.strip() + "\n```\n\n"
|
||||
"Also in Nexus: `org.starship:kernelImage:" + version + "` and `org.starship:documentation:" + version + "`.\n"))' \
|
||||
"$(git tag -l --format='%(contents)' "$tag")" "$OUT/SHA256SUMS" "$VERSION")
|
||||
"$(git tag -l --format='%(contents)' "$tag")" "$rel/SHA256SUMS" "$VERSION")
|
||||
id=$(gitea "$api/releases/tags/$tag" 2>/dev/null | python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])' 2>/dev/null || true)
|
||||
if [ -z "$id" ]; then
|
||||
pre=false; case "$tag" in *-*) pre=true;; esac
|
||||
@@ -220,6 +228,7 @@ print(json.dumps(notes.strip() + "\n\n## Checksums (SHA-256)\n\n```\n" + sums.st
|
||||
case " $have " in *" $n "*) echo " $n: there"; continue;; esac
|
||||
gitea -o /dev/null -X POST -F "attachment=@$f" "$api/releases/$id/assets?name=$n" && echo " $n: attached"
|
||||
done
|
||||
rm -f "$rel/SHA256SUMS" && rmdir "$rel"
|
||||
;;
|
||||
publish-docs)
|
||||
url=${2:-}; [ -n "$url" ] || usage
|
||||
|
||||
+47
-6
@@ -3,7 +3,9 @@
|
||||
# Copyright (c) 2023-2026 Robert A. James
|
||||
"""build.py -- the starshipos-f18.com XWiki pages, made from the "StarshipOS.com" design canvas.
|
||||
|
||||
site/com/build.py canvas/{Main,Inquiries,TryIt}.dc.html -> {Main,Inquiries,TryIt}.WebHome.xwiki
|
||||
site/com/build.py [--release TAG --sums SHA256SUMS]
|
||||
canvas/{Main,Inquiries,TryIt}.dc.html -> {Main,Inquiries,TryIt}.WebHome.xwiki,
|
||||
and with a release, canvas/{Downloads,Documents}.dc.html too
|
||||
|
||||
The canvas is the source: its artboards are copied into canvas/ as they are, and this turns each into
|
||||
one {{html}} block (which needs a page author with script rights). What changes on the way:
|
||||
@@ -15,6 +17,10 @@ one {{html}} block (which needs a page author with script rights). What changes
|
||||
- Try it: the drawn console becomes the real one, an iframe of try.starshipos-f18.com;
|
||||
- the inquiry form posts to the .org's PublicInquiry, which files it under Inquiries there
|
||||
(admin-only, site/org/inquiries); the announcements form, which has no server, sends by e-mail;
|
||||
- Downloads and Documents (#126, #157) are built from a release: --release TAG and the release's
|
||||
SHA256SUMS fill in [TAG], [RELEASE]/<file> (the file on the Gitea release) and [SHA:<file>].
|
||||
Without a release they are not built, and the other pages' links to them are taken out, so
|
||||
nothing on the site points at a page that is not there (they go live with alpha.4);
|
||||
|
||||
install.sh puts the pages and the images on the wiki.
|
||||
"""
|
||||
@@ -31,6 +37,8 @@ FONTS = ('<link rel="preconnect" href="https://fonts.googleapis.com">\n'
|
||||
'&family=Exo+2:wght@600;700&display=swap" rel="stylesheet">')
|
||||
ORG = "https://starshipos-f18.org/"
|
||||
PAGES = ["Main", "Inquiries", "TryIt"]
|
||||
RELEASE_PAGES = ["Downloads", "Documents"]
|
||||
RELEASES = "https://gitea.starshipos-f18.org/rajames/LithosAnanke/releases/download/"
|
||||
IMAGES = {"/_blob/5b564d54d98e02ad600c913a9a1888f2": "badge.jpg",
|
||||
"/_blob/5483451f292782a8b366e437181c4bcf": "captain-bob.jpg"}
|
||||
|
||||
@@ -44,11 +52,15 @@ CONSOLE = '''<div style="background: #050A14; border: 1px solid #34486A; border-
|
||||
<p style="margin: 12px 0 0; font-size: 13px; color: #A3AEC2">If the console does not connect, every machine is in use: try again in a few minutes.</p>'''
|
||||
|
||||
|
||||
def body(src):
|
||||
def body(src, pages):
|
||||
m = re.search(r"<x-dc>(.*)</x-dc>", src, re.S)
|
||||
html = re.sub(r"<helmet>.*?</helmet>", "", m.group(1), flags=re.S).strip()
|
||||
html = html.replace("{{accent}}", ACCENT)
|
||||
for p in PAGES:
|
||||
# a page not built this time is not linked to: its <a> taken out (the nav, the footers)
|
||||
for p in RELEASE_PAGES:
|
||||
if p not in pages:
|
||||
html = re.sub(r'<a href="%s\.dc\.html"[^>]*>[^<]*</a>\n?' % p, "", html)
|
||||
for p in pages:
|
||||
html = html.replace('href="%s.dc.html"' % p, 'href="/bin/view/%s/"' % p)
|
||||
html = html.replace('href="https://starshipos.org"', 'href="%s"' % ORG)
|
||||
html = html.replace(">starshipos.org</a>", ">starshipos-f18.org</a>")
|
||||
@@ -90,14 +102,43 @@ def forms(html, page):
|
||||
return html
|
||||
|
||||
|
||||
def release(html, tag, sums):
|
||||
"""[TAG], [RELEASE]/<file> and [SHA:<file>] from the release; a file it has not is an error."""
|
||||
html = html.replace("[TAG]", tag)
|
||||
html = html.replace("[RELEASE]/", RELEASES + tag + "/")
|
||||
|
||||
def sha(m):
|
||||
if m.group(1) not in sums:
|
||||
sys.exit("build: %s is not in the release's SHA256SUMS" % m.group(1))
|
||||
return sums[m.group(1)]
|
||||
return re.sub(r"\[SHA:([^\]]+)\]", sha, html)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import argparse
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--release", help="the release's tag, e.g. v4.0.0-alpha.4")
|
||||
ap.add_argument("--sums", help="the release's SHA256SUMS")
|
||||
a = ap.parse_args()
|
||||
if bool(a.release) != bool(a.sums):
|
||||
sys.exit("build: --release and --sums go together")
|
||||
sums = {}
|
||||
if a.sums:
|
||||
for l in open(a.sums).read().split("\n"):
|
||||
f = l.split()
|
||||
if len(f) == 2:
|
||||
sums[f[1].lstrip("*").lstrip("./")] = f[0]
|
||||
os.chdir(os.path.dirname(os.path.abspath(__file__)))
|
||||
for p in PAGES:
|
||||
html = forms(body(open("canvas/%s.dc.html" % p).read()), p)
|
||||
pages = PAGES + (RELEASE_PAGES if a.release else [])
|
||||
for p in pages:
|
||||
html = forms(body(open("canvas/%s.dc.html" % p).read(), pages), p)
|
||||
if p in RELEASE_PAGES:
|
||||
html = release(html, a.release, sums)
|
||||
if p == "TryIt":
|
||||
html = try_it(html)
|
||||
html = colorlock.lock(html, '<div style="background: #0A1222')
|
||||
assert "{{" not in html.replace(colorlock.STYLE, "") and "[SSRN" not in html and ".dc.html" not in html and "_blob" not in html, p
|
||||
assert "[TAG]" not in html and "[RELEASE]" not in html and "[SHA:" not in html, p
|
||||
with open("%s.WebHome.xwiki" % p, "w") as f:
|
||||
f.write(colorlock.GUEST_CHROME + '{{html clean="false"}}\n%s\n%s\n{{/html}}\n' % (FONTS, html))
|
||||
print("wrote", ", ".join("%s.WebHome.xwiki" % p for p in PAGES))
|
||||
print("wrote", ", ".join("%s.WebHome.xwiki" % p for p in pages))
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>StarshipOS — Documents</title>
|
||||
<script src="./support.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<x-dc>
|
||||
<helmet>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=Exo+2:wght@600;700&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
body{margin:0;background:#0A1222}
|
||||
a{color:#F5891F}a:hover{color:#FFB061}
|
||||
</style>
|
||||
</helmet>
|
||||
<div style="background: #0A1222; color: #EEF2F7; font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 16px; line-height: 1.6; min-height: 100vh">
|
||||
|
||||
<header style="border-bottom: 1px solid #22324D">
|
||||
<nav aria-label="Main" style="max-width: 1120px; margin: 0 auto; padding: 20px 24px; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 16px">
|
||||
<a href="Main.dc.html" style="font-family: 'Exo 2', sans-serif; font-weight: 700; font-size: 22px; color: #EEF2F7; text-decoration: none; letter-spacing: 0.02em">starship<span style="color: {{accent}}">OS</span></a>
|
||||
<div style="display: flex; flex-wrap: wrap; gap: 24px; font-size: 14px">
|
||||
<a href="Main.dc.html" style="color: #C8D1DE; text-decoration: none">Home</a>
|
||||
<a href="TryIt.dc.html" style="color: #C8D1DE; text-decoration: none">Try it</a>
|
||||
<a href="Downloads.dc.html" style="color: #C8D1DE; text-decoration: none">Downloads</a>
|
||||
<a href="Documents.dc.html" aria-current="page" style="color: #EEF2F7; text-decoration: none; border-bottom: 2px solid {{accent}}">Documents</a>
|
||||
<a href="Inquiries.dc.html" style="color: #C8D1DE; text-decoration: none">Inquiries</a>
|
||||
<a href="https://starshipos.org" style="color: {{accent}}; text-decoration: none">Contributors →</a>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<section style="max-width: 1120px; margin: 0 auto; padding: 80px 24px 32px">
|
||||
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #4FD1B0">ok> documents</p>
|
||||
<h1 style="margin: 0 0 16px; font-family: 'Exo 2', sans-serif; font-size: clamp(36px, 5vw, 56px); line-height: 1.1">How it was built, and what it says.</h1>
|
||||
<p style="margin: 0 0 24px; max-width: 720px; font-size: 18px; color: #C8D1DE">Every release builds its documents from the same tree as its images: the design record, the dictionary of every word, the book, the formal volumes. Each is a PDF on the release, with its checksum.</p>
|
||||
<div style="display: flex; flex-wrap: wrap; align-items: center; gap: 12px; font-size: 14px">
|
||||
<span style="display: inline-block; padding: 4px 12px; border-radius: 4px; background: #111C30; border: 1px solid #34486A; color: #EEF2F7">[TAG]</span>
|
||||
<a href="[RELEASE]/SHA256SUMS" style="color: #C8D1DE">SHA256SUMS →</a>
|
||||
<a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/releases" style="color: #C8D1DE">All releases →</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section aria-labelledby="new-h" style="max-width: 1120px; margin: 0 auto; padding: 32px 24px 48px">
|
||||
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: {{accent}}">Start here</p>
|
||||
<h2 id="new-h" style="margin: 0 0 32px; font-family: 'Exo 2', sans-serif; font-size: 36px; line-height: 1.15">Two books, kept with every release.</h2>
|
||||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); gap: 24px">
|
||||
|
||||
<article style="background: #111C30; border: 1px solid #34486A; border-radius: 6px; padding: 32px; display: flex; flex-direction: column; gap: 14px">
|
||||
<div><h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 28px">The Book of Fabric</h3><p style="margin: 0; font-size: 13px; color: {{accent}}">the design record, as it happened</p></div>
|
||||
<p style="margin: 0; color: #C8D1DE; font-size: 15px">Every ruling, the reasoning behind it, what was built and what was abandoned, written as the work went -- reproduced as written, corrections and all. The living record first, then the closed ones in order. Fabric is about steady state: this is how it was reached.</p>
|
||||
<div style="font-size: 12px; color: #A3AEC2; word-break: break-all">SHA-256 [SHA:fabric.pdf]</div>
|
||||
<a href="[RELEASE]/fabric.pdf" style="display: inline-block; align-self: flex-start; padding: 12px 20px; background: {{accent}}; color: #0A1222; font-weight: 700; text-decoration: none; border-radius: 4px">fabric.pdf</a>
|
||||
</article>
|
||||
|
||||
<article style="background: #111C30; border: 1px solid #34486A; border-radius: 6px; padding: 32px; display: flex; flex-direction: column; gap: 14px">
|
||||
<div><h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 28px">The Dictionary of v4</h3><p style="margin: 0; font-size: 13px; color: {{accent}}">every word, alphabetical</p></div>
|
||||
<p style="margin: 0; color: #C8D1DE; font-size: 15px">Every word StarForth v4 boots with: its stack notation, what it does, and where it is defined. The names come from the booted system itself, and the build refuses a dictionary that has fallen behind it.</p>
|
||||
<pre style="margin: 0; padding: 12px 14px; background: #0A1222; border: 1px solid #22324D; border-radius: 4px; font-size: 12px; color: #EEF2F7; white-space: pre-wrap">DUP ( x -- x x ) Copy the top value.
|
||||
MINT-ZUSE ( -- ) Mint the real Zuse onto a second stick.</pre>
|
||||
<div style="font-size: 12px; color: #A3AEC2; word-break: break-all">SHA-256 [SHA:dictionary.pdf]</div>
|
||||
<a href="[RELEASE]/dictionary.pdf" style="display: inline-block; align-self: flex-start; padding: 12px 20px; background: {{accent}}; color: #0A1222; font-weight: 700; text-decoration: none; border-radius: 4px">dictionary.pdf</a>
|
||||
</article>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section aria-labelledby="more-h" style="max-width: 1120px; margin: 0 auto; padding: 32px 24px 48px">
|
||||
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: {{accent}}">And the rest</p>
|
||||
<h2 id="more-h" style="margin: 0 0 32px; font-family: 'Exo 2', sans-serif; font-size: 30px; line-height: 1.15">The book, the formal set, the API.</h2>
|
||||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 16px">
|
||||
<a href="[RELEASE]/book.pdf" style="display: block; background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 20px; text-decoration: none"><div style="font-family: 'Exo 2', sans-serif; font-size: 18px; color: #EEF2F7">The book</div><div style="font-size: 13px; color: #A3AEC2">StarshipOS, end to end</div><div style="margin-top: 8px; font-size: 11px; color: #6B7A93; word-break: break-all">[SHA:book.pdf]</div></a>
|
||||
<a href="[RELEASE]/vol1.pdf" style="display: block; background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 20px; text-decoration: none"><div style="font-family: 'Exo 2', sans-serif; font-size: 18px; color: #EEF2F7">Volume I</div><div style="font-size: 13px; color: #A3AEC2">the formal set</div><div style="margin-top: 8px; font-size: 11px; color: #6B7A93; word-break: break-all">[SHA:vol1.pdf]</div></a>
|
||||
<a href="[RELEASE]/vol2.pdf" style="display: block; background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 20px; text-decoration: none"><div style="font-family: 'Exo 2', sans-serif; font-size: 18px; color: #EEF2F7">Volume II</div><div style="font-size: 13px; color: #A3AEC2">the formal set</div><div style="margin-top: 8px; font-size: 11px; color: #6B7A93; word-break: break-all">[SHA:vol2.pdf]</div></a>
|
||||
<a href="[RELEASE]/vol3.pdf" style="display: block; background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 20px; text-decoration: none"><div style="font-family: 'Exo 2', sans-serif; font-size: 18px; color: #EEF2F7">Volume III</div><div style="font-size: 13px; color: #A3AEC2">the formal set</div><div style="margin-top: 8px; font-size: 11px; color: #6B7A93; word-break: break-all">[SHA:vol3.pdf]</div></a>
|
||||
<a href="[RELEASE]/api.pdf" style="display: block; background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 20px; text-decoration: none"><div style="font-family: 'Exo 2', sans-serif; font-size: 18px; color: #EEF2F7">API reference</div><div style="font-size: 13px; color: #A3AEC2">StarForth's C, generated</div><div style="margin-top: 8px; font-size: 11px; color: #6B7A93; word-break: break-all">[SHA:api.pdf]</div></a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section aria-labelledby="paper-h" style="max-width: 1120px; margin: 0 auto; padding: 48px 24px 96px">
|
||||
<div style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 32px 40px; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 24px">
|
||||
<div style="flex: 1 1 420px; min-width: 0">
|
||||
<p style="margin: 0 0 8px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: {{accent}}">The paper</p>
|
||||
<h2 id="paper-h" style="margin: 0 0 8px; font-family: 'Exo 2', sans-serif; font-size: 26px">The ideas behind it, on SSRN.</h2>
|
||||
<p style="margin: 0; color: #C8D1DE; font-size: 15px">The whitepaper the design starts from.</p>
|
||||
</div>
|
||||
<a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5930134" style="display: inline-block; padding: 12px 20px; border: 1px solid #34486A; color: #EEF2F7; text-decoration: none; border-radius: 4px">Read the paper →</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer style="border-top: 1px solid #22324D">
|
||||
<div style="max-width: 1120px; margin: 0 auto; padding: 32px 24px; display: flex; flex-wrap: wrap; gap: 16px 32px; justify-content: space-between; font-size: 13px; color: #A3AEC2">
|
||||
<span>© 2026 Robert Allan James · A Starship Foundation project (in formation)</span>
|
||||
<span style="display: flex; flex-wrap: wrap; gap: 24px"><a href="Main.dc.html" style="color: #C8D1DE">Home</a><a href="Downloads.dc.html" style="color: #C8D1DE">Downloads</a><a href="Inquiries.dc.html" style="color: #C8D1DE">Inquiries</a><a href="https://starshipos.org" style="color: #C8D1DE">starshipos.org</a></span>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
</x-dc>
|
||||
<script type="text/x-dc" data-dc-script data-props='{"accent":{"editor":"color","default":"#F5891F","options":["#F5891F","#5FD3C4","#8FB8FF"]},"$preview":{"width":1280,"height":2400}}'>
|
||||
class Component extends DCLogic {
|
||||
renderVals() {
|
||||
return { accent: this.props.accent ?? '#F5891F' };
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,145 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>StarshipOS — Downloads</title>
|
||||
<script src="./support.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<x-dc>
|
||||
<helmet>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=Exo+2:wght@600;700&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
body{margin:0;background:#0A1222}
|
||||
a{color:#F5891F}a:hover{color:#FFB061}
|
||||
</style>
|
||||
</helmet>
|
||||
<div style="background: #0A1222; color: #EEF2F7; font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 16px; line-height: 1.6; min-height: 100vh">
|
||||
|
||||
<header style="border-bottom: 1px solid #22324D">
|
||||
<nav aria-label="Main" style="max-width: 1120px; margin: 0 auto; padding: 20px 24px; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 16px">
|
||||
<a href="Main.dc.html" style="font-family: 'Exo 2', sans-serif; font-weight: 700; font-size: 22px; color: #EEF2F7; text-decoration: none; letter-spacing: 0.02em">starship<span style="color: {{accent}}">OS</span></a>
|
||||
<div style="display: flex; flex-wrap: wrap; gap: 24px; font-size: 14px">
|
||||
<a href="Main.dc.html" style="color: #C8D1DE; text-decoration: none">Home</a>
|
||||
<a href="TryIt.dc.html" style="color: #C8D1DE; text-decoration: none">Try it</a>
|
||||
<a href="Downloads.dc.html" aria-current="page" style="color: #EEF2F7; text-decoration: none; border-bottom: 2px solid {{accent}}">Downloads</a>
|
||||
<a href="Documents.dc.html" style="color: #C8D1DE; text-decoration: none">Documents</a>
|
||||
<a href="Inquiries.dc.html" style="color: #C8D1DE; text-decoration: none">Inquiries</a>
|
||||
<a href="https://starshipos.org" style="color: {{accent}}; text-decoration: none">Contributors →</a>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<section style="max-width: 1120px; margin: 0 auto; padding: 80px 24px 32px">
|
||||
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: #4FD1B0">ok> downloads</p>
|
||||
<h1 style="margin: 0 0 16px; font-family: 'Exo 2', sans-serif; font-size: clamp(36px, 5vw, 56px); line-height: 1.1">StarshipOS, on a machine of yours.</h1>
|
||||
<p style="margin: 0 0 24px; max-width: 700px; font-size: 18px; color: #C8D1DE">One image per board, straight from the release. Write it to a USB stick or an SD card, boot, and the first boot makes you Zuse, the superuser: your identity lives on the stick.</p>
|
||||
<div style="display: flex; flex-wrap: wrap; align-items: center; gap: 12px; font-size: 14px">
|
||||
<span style="display: inline-block; padding: 4px 12px; border-radius: 4px; background: #111C30; border: 1px solid #34486A; color: #EEF2F7">[TAG]</span>
|
||||
<span style="display: inline-block; padding: 4px 12px; border-radius: 4px; border: 1px solid {{accent}}; color: {{accent}}">alpha · pre-release</span>
|
||||
<a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke/releases" style="color: #C8D1DE">All releases →</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section aria-label="What an alpha means" style="max-width: 1120px; margin: 0 auto; padding: 16px 24px 48px">
|
||||
<div style="background: #111C30; border: 1px solid #34486A; border-left-width: 1px; border-radius: 6px; padding: 24px 28px; display: flex; flex-wrap: wrap; gap: 16px 40px">
|
||||
<div style="flex: 1 1 300px; min-width: 0">
|
||||
<h2 style="margin: 0 0 8px; font-family: 'Exo 2', sans-serif; font-size: 22px">An alpha, honestly.</h2>
|
||||
<p style="margin: 0; color: #C8D1DE; font-size: 15px">Every release is booted in QEMU on amd64, aarch64 and riscv64, passes its 538 power-on checks on each, and its proofs, before it is published. On real hardware it has not been booted yet. If you try it, tell us what happened.</p>
|
||||
</div>
|
||||
<div style="flex: 0 1 260px; display: flex; flex-direction: column; justify-content: center; gap: 8px; font-size: 14px">
|
||||
<div><span style="color: #4FD1B0">✓</span> <span style="color: #C8D1DE">QEMU, three architectures</span></div>
|
||||
<div><span style="color: #A3AEC2">○</span> <span style="color: #C8D1DE">Real hardware: not yet</span></div>
|
||||
<a href="Inquiries.dc.html" style="font-size: 14px">Report how it went →</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section aria-labelledby="images-h" style="max-width: 1120px; margin: 0 auto; padding: 32px 24px 48px">
|
||||
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: {{accent}}">The images</p>
|
||||
<h2 id="images-h" style="margin: 0 0 32px; font-family: 'Exo 2', sans-serif; font-size: 36px; line-height: 1.15">Pick your board.</h2>
|
||||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 24px">
|
||||
|
||||
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px; display: flex; flex-direction: column; gap: 14px">
|
||||
<div><h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 24px">PC</h3><p style="margin: 0; font-size: 13px; color: {{accent}}">any x86-64 PC that boots UEFI from USB</p></div>
|
||||
<p style="margin: 0; color: #C8D1DE; font-size: 15px">A USB stick image. Its first boot makes your Zuse on the stick: no account, no password — the stick is your key.</p>
|
||||
<div style="font-size: 13px; color: #A3AEC2">Write it (it replaces everything on the stick):</div>
|
||||
<pre style="margin: 0; padding: 12px 14px; background: #0A1222; border: 1px solid #22324D; border-radius: 4px; font-size: 12px; color: #EEF2F7; white-space: pre-wrap">xz -dc pc-stick.img.xz | sudo dd of=/dev/sdX bs=4M conv=fsync status=progress</pre>
|
||||
<p style="margin: 0; font-size: 13px; color: #A3AEC2">or balenaEtcher, which reads the .xz as it is.</p>
|
||||
<a href="[RELEASE]/pc-stick.img.xz" style="display: inline-block; align-self: flex-start; padding: 12px 20px; background: {{accent}}; color: #0A1222; font-weight: 700; text-decoration: none; border-radius: 4px">pc-stick.img.xz</a>
|
||||
</article>
|
||||
|
||||
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px; display: flex; flex-direction: column; gap: 14px">
|
||||
<div><h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 24px">Raspberry Pi 5</h3><p style="margin: 0; font-size: 13px; color: {{accent}}">an SD card</p></div>
|
||||
<p style="margin: 0; color: #C8D1DE; font-size: 15px">Boots straight from the Pi's own firmware. Until first-boot Zuse reaches this board, it needs a Zuse identity drive made on a PC.</p>
|
||||
<div style="font-size: 13px; color: #A3AEC2">Write it with Raspberry Pi Imager (Use custom), or:</div>
|
||||
<pre style="margin: 0; padding: 12px 14px; background: #0A1222; border: 1px solid #22324D; border-radius: 4px; font-size: 12px; color: #EEF2F7; white-space: pre-wrap">xz -dc raspi5.img.xz | sudo dd of=/dev/sdX bs=4M conv=fsync status=progress</pre>
|
||||
<a href="[RELEASE]/raspi5.img.xz" style="display: inline-block; align-self: flex-start; padding: 12px 20px; border: 1px solid #34486A; color: #EEF2F7; text-decoration: none; border-radius: 4px">raspi5.img.xz</a>
|
||||
</article>
|
||||
|
||||
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px; display: flex; flex-direction: column; gap: 14px">
|
||||
<div><h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 24px">Milk-V Mars</h3><p style="margin: 0; font-size: 13px; color: {{accent}}">RISC-V, an SD card</p></div>
|
||||
<p style="margin: 0; color: #C8D1DE; font-size: 15px">Found by the board's own U-Boot. Until first-boot Zuse reaches this board, it needs a Zuse identity drive made on a PC.</p>
|
||||
<div style="font-size: 13px; color: #A3AEC2">Write it:</div>
|
||||
<pre style="margin: 0; padding: 12px 14px; background: #0A1222; border: 1px solid #22324D; border-radius: 4px; font-size: 12px; color: #EEF2F7; white-space: pre-wrap">xz -dc MilkV.img.xz | sudo dd of=/dev/sdX bs=4M conv=fsync status=progress</pre>
|
||||
<a href="[RELEASE]/MilkV.img.xz" style="display: inline-block; align-self: flex-start; padding: 12px 20px; border: 1px solid #34486A; color: #EEF2F7; text-decoration: none; border-radius: 4px">MilkV.img.xz</a>
|
||||
</article>
|
||||
|
||||
<article style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 28px; display: flex; flex-direction: column; gap: 14px">
|
||||
<div><h3 style="margin: 0 0 4px; font-family: 'Exo 2', sans-serif; font-size: 24px">QEMU</h3><p style="margin: 0; font-size: 13px; color: {{accent}}">for developers</p></div>
|
||||
<p style="margin: 0; color: #C8D1DE; font-size: 15px">The ISO every release's amd64 acceptance boots, byte for byte. To boot it the way we do, see the developer guide in the repository.</p>
|
||||
<a href="https://gitea.starshipos-f18.org/rajames/LithosAnanke" style="font-size: 14px">The repository →</a>
|
||||
<a href="[RELEASE]/StarshipOS.iso" style="display: inline-block; align-self: flex-start; padding: 12px 20px; border: 1px solid #34486A; color: #EEF2F7; text-decoration: none; border-radius: 4px">StarshipOS.iso</a>
|
||||
</article>
|
||||
|
||||
</div>
|
||||
<p style="margin: 24px 0 0; font-size: 14px; color: #A3AEC2">Rather not write anything? <a href="TryIt.dc.html">Try it in your browser</a> — a real machine, at its prompt in seconds.</p>
|
||||
</section>
|
||||
|
||||
<section aria-labelledby="verify-h" style="max-width: 1120px; margin: 0 auto; padding: 48px 24px">
|
||||
<div style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 40px; display: flex; flex-wrap: wrap; gap: 40px">
|
||||
<div style="flex: 999 1 460px; min-width: 0">
|
||||
<p style="margin: 0 0 12px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: {{accent}}">Verify</p>
|
||||
<h2 id="verify-h" style="margin: 0 0 16px; font-family: 'Exo 2', sans-serif; font-size: 30px; line-height: 1.2">Know it's ours.</h2>
|
||||
<p style="margin: 0 0 16px; color: #C8D1DE">Every file's SHA-256 is in the release's SHA256SUMS. Inside each image, every capsule the system loads is signed by StarshipOS Capsule Signing, issued by the StarshipOS Root CA, and checked at boot.</p>
|
||||
<pre style="margin: 0; padding: 12px 14px; background: #0A1222; border: 1px solid #22324D; border-radius: 4px; font-size: 13px; color: #EEF2F7">sha256sum -c SHA256SUMS --ignore-missing</pre>
|
||||
</div>
|
||||
<div style="flex: 1 1 300px; min-width: 0; display: flex; flex-direction: column; gap: 12px">
|
||||
<div style="font-size: 13px; color: #A3AEC2">StarshipOS Root CA, SHA-256</div>
|
||||
<code style="display: block; padding: 12px 14px; background: #0A1222; border: 1px solid #22324D; border-radius: 4px; font-size: 12px; color: #EEF2F7; word-break: break-all">DA:A7:40:56:65:41:1A:FE:E6:08:85:3F:6E:AD:83:3A:38:30:83:E6:F0:6D:69:A6:A8:9E:92:BD:85:93:39:81</code>
|
||||
<a href="[RELEASE]/SHA256SUMS" style="font-size: 14px">SHA256SUMS →</a>
|
||||
<a href="[RELEASE]/starshipos-root-ca.pem" style="font-size: 14px">The Root CA's certificate →</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section aria-labelledby="docs-h" style="max-width: 1120px; margin: 0 auto; padding: 48px 24px 96px">
|
||||
<div style="background: #111C30; border: 1px solid #22324D; border-radius: 6px; padding: 32px 40px; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 24px">
|
||||
<div style="flex: 1 1 420px; min-width: 0">
|
||||
<p style="margin: 0 0 8px; font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: {{accent}}">Read</p>
|
||||
<h2 id="docs-h" style="margin: 0 0 8px; font-family: 'Exo 2', sans-serif; font-size: 26px">The documents of this release.</h2>
|
||||
<p style="margin: 0; color: #C8D1DE; font-size: 15px">The Book of Fabric, the Dictionary of v4, the book and the formal set -- built from the same tree as these images.</p>
|
||||
</div>
|
||||
<a href="Documents.dc.html" style="display: inline-block; padding: 12px 20px; border: 1px solid #34486A; color: #EEF2F7; text-decoration: none; border-radius: 4px">Documents →</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer style="border-top: 1px solid #22324D">
|
||||
<div style="max-width: 1120px; margin: 0 auto; padding: 32px 24px; display: flex; flex-wrap: wrap; gap: 16px 32px; justify-content: space-between; font-size: 13px; color: #A3AEC2">
|
||||
<span>© 2026 Robert Allan James · A Starship Foundation project (in formation)</span>
|
||||
<span style="display: flex; flex-wrap: wrap; gap: 24px"><a href="Main.dc.html" style="color: #C8D1DE">Home</a><a href="Inquiries.dc.html" style="color: #C8D1DE">Inquiries</a><a href="https://starshipos.org" style="color: #C8D1DE">starshipos.org</a></span>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
</x-dc>
|
||||
<script type="text/x-dc" data-dc-script data-props='{"accent":{"editor":"color","default":"#F5891F","options":["#F5891F","#5FD3C4","#8FB8FF"]},"$preview":{"width":1280,"height":2700}}'>
|
||||
class Component extends DCLogic {
|
||||
renderVals() {
|
||||
return { accent: this.props.accent ?? '#F5891F' };
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -23,6 +23,8 @@ a{color:#F5891F}a:hover{color:#FFB061}
|
||||
<div style="display: flex; flex-wrap: wrap; gap: 24px; font-size: 14px">
|
||||
<a href="Main.dc.html" style="color: #C8D1DE; text-decoration: none">Home</a>
|
||||
<a href="TryIt.dc.html" style="color: #C8D1DE; text-decoration: none">Try it</a>
|
||||
<a href="Downloads.dc.html" style="color: #C8D1DE; text-decoration: none">Downloads</a>
|
||||
<a href="Documents.dc.html" style="color: #C8D1DE; text-decoration: none">Documents</a>
|
||||
<a href="Inquiries.dc.html" aria-current="page" style="color: #EEF2F7; text-decoration: none; border-bottom: 2px solid {{accent}}">Inquiries</a>
|
||||
<a href="https://starshipos.org" style="color: {{accent}}; text-decoration: none">Contributors →</a>
|
||||
</div>
|
||||
|
||||
@@ -25,6 +25,8 @@ a{color:#F5891F}a:hover{color:#FFB061}
|
||||
<a href="#research" style="color: #C8D1DE; text-decoration: none">Research</a>
|
||||
<a href="#silicon" style="color: #C8D1DE; text-decoration: none">Silicon</a>
|
||||
<a href="TryIt.dc.html" style="color: #C8D1DE; text-decoration: none">Try it</a>
|
||||
<a href="Downloads.dc.html" style="color: #C8D1DE; text-decoration: none">Downloads</a>
|
||||
<a href="Documents.dc.html" style="color: #C8D1DE; text-decoration: none">Documents</a>
|
||||
<a href="Inquiries.dc.html" style="color: #C8D1DE; text-decoration: none">Inquiries</a>
|
||||
<a href="https://starshipos.org" style="color: {{accent}}; text-decoration: none">Contributors →</a>
|
||||
</div>
|
||||
|
||||
@@ -23,6 +23,8 @@ a{color:#F5891F}a:hover{color:#FFB061}
|
||||
<div style="display: flex; flex-wrap: wrap; gap: 24px; font-size: 14px">
|
||||
<a href="Main.dc.html" style="color: #C8D1DE; text-decoration: none">Home</a>
|
||||
<a href="TryIt.dc.html" aria-current="page" style="color: #EEF2F7; text-decoration: none; border-bottom: 2px solid {{accent}}">Try it</a>
|
||||
<a href="Downloads.dc.html" style="color: #C8D1DE; text-decoration: none">Downloads</a>
|
||||
<a href="Documents.dc.html" style="color: #C8D1DE; text-decoration: none">Documents</a>
|
||||
<a href="Inquiries.dc.html" style="color: #C8D1DE; text-decoration: none">Inquiries</a>
|
||||
<a href="https://starshipos.org" style="color: {{accent}}; text-decoration: none">Contributors →</a>
|
||||
</div>
|
||||
|
||||
+8
-1
@@ -39,10 +39,17 @@ attach Main badge.jpg
|
||||
attach Main captain-bob.jpg
|
||||
page Inquiries "Inquiries" Inquiries.WebHome.xwiki
|
||||
page TryIt "Try StarshipOS" TryIt.WebHome.xwiki
|
||||
# Downloads and Documents exist once build.py has been given a release (#126, #157)
|
||||
pages="/bin/view/Main/ /bin/view/Inquiries/ /bin/view/TryIt/"
|
||||
if [ -f Downloads.WebHome.xwiki ] && [ -f Documents.WebHome.xwiki ]; then
|
||||
page Downloads "Downloads" Downloads.WebHome.xwiki
|
||||
page Documents "Documents" Documents.WebHome.xwiki
|
||||
pages="$pages /bin/view/Downloads/ /bin/view/Documents/"
|
||||
fi
|
||||
|
||||
echo "=== as a guest"
|
||||
bad=
|
||||
for u in /bin/view/Main/ /bin/view/Inquiries/ /bin/view/TryIt/ \
|
||||
for u in $pages \
|
||||
/bin/download/Main/WebHome/badge.jpg /bin/download/Main/WebHome/captain-bob.jpg; do
|
||||
code=$(curl -s -o /dev/null -w '%{http_code}' "$base$u")
|
||||
if [ "$code" = 200 ]; then echo " $u: 200"; else echo " $u: $code -- NOT readable"; bad=1; fi
|
||||
|
||||
Reference in New Issue
Block a user