diff --git a/apps/web/index.html b/apps/web/index.html
index 660456e..d75bab3 100644
--- a/apps/web/index.html
+++ b/apps/web/index.html
@@ -6,7 +6,7 @@
- An open-source, AI-native successor to HyperCard. Cards,
- buttons, fields and HyperTalk, and a stack stays editable while it runs.
+ An open-source, AI-native successor to HyperCard. A script
+ can stop and ask a language model, and the stack stays editable the whole time
+ it runs.
on mouseUp
@@ -114,16 +115,16 @@ Examples
- Each opens in the playground, running. Switch to the edit tool to read the
- scripts that make it work.
+ Open any of these and it starts running in the playground. Switch to the edit
+ tool to read the scripts behind it.
-
Cluedo
A drawn mansion with clickable rooms, and a case you close by
- deduction.The board is drawn artwork and every room on it is a button, so you
+ close the case by clicking your way around the mansion.
@@ -131,8 +132,9 @@ Examples
Myst
An island, four Ages, and one book you should not open. Go ▸ Map finds
- the trap without running a line.Wander the island and the Ages it leads to, and try not to open the
+ wrong book. Go ▸ Map finds that trap by reading the scripts, without
+ running any of them.
@@ -140,8 +142,9 @@ Examples
LLMs for n00bs
Nine slides on how a language model works. The last one asks a real
- model, and says so plainly when none is set up.Explains how a language model works, one drawn slide at a time, then
+ finishes by asking a real one — and says so plainly when you have not
+ set one up.
@@ -149,7 +152,8 @@ Examples
Address Book
A card per person, one shared background.Shows what backgrounds are for: everyone gets their own card, while the
+ layout they all sit on is edited once.
@@ -157,14 +161,18 @@ Examples
Recipe Box
Chunk expressions doing arithmetic on the ingredients.Doubles a recipe by pulling the number out of each ingredient line,
+ which is what chunk expressions are for.
-
Todo
- A list, a dialog, and a loop.
+ Adds whatever you type to the list, then walks back through it to count
+ what is still outstanding.
@@ -210,9 +218,9 @@
The desktop application
same file.
- Stacks export as a PDF, as a PNG of the map, as a self-contained web page, and
- as a Decker deck — from the
- playground as readily as from the application.
+ Every export the application offers works in the playground too: PDF, a PNG of
+ the map, a self-contained web page, and a
+ Decker deck.
diff --git a/apps/web/src/landing.css b/apps/web/src/landing.css
index 0cfc19f..7e4e76e 100644
--- a/apps/web/src/landing.css
+++ b/apps/web/src/landing.css
@@ -293,3 +293,45 @@ body {
.colophon a {
color: var(--ink);
}
+
+/* ----------------------------------------------------------------- phones */
+
+/*
+ * A phone is narrower than `put ai("Summarize this card") into field
+ * "Summary"`. Scrolling the sample sideways is no help when nothing on
+ * screen says it scrolls — the line just stops at the edge and looks
+ * broken — and shrinking it to fit would take it under ten pixels. So on a
+ * narrow screen it wraps instead.
+ */
+@media (max-width: 34rem) {
+ .desk {
+ padding: 20px 10px 32px;
+ gap: 20px;
+ }
+
+ .window__body {
+ padding: 12px 14px;
+ }
+
+ .hero__script {
+ white-space: pre-wrap;
+ overflow-wrap: break-word;
+ font-size: 11px;
+ }
+
+ .hero__line {
+ font-size: 15px;
+ }
+
+ /* Thumb-sized, and each on its own line rather than three cramped side
+ by side. */
+ .hero__buttons {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .button {
+ text-align: center;
+ padding: 8px 18px;
+ }
+}
diff --git a/docs/website.md b/docs/website.md
index 0d6814a..75b70b1 100644
--- a/docs/website.md
+++ b/docs/website.md
@@ -12,17 +12,17 @@ follows from there being no server.
## The playground is the application
-The playground page renders the desktop's own React components — the card,
-the inspector, the assistant sidebar, the map, the dialogs. It can, because
+The playground page renders the desktop's own React components, down to the
+dialog a script blocks on. It can, because
the desktop keeps its whole shell behind one module (`apps/desktop/src/api.ts`,
a typed wrapper per command), and the renderer never learns which shell
answers. Vite swaps that one module for `apps/web/src/api.ts`; nothing else
in the desktop tree is touched, so the two interfaces cannot drift apart —
they are the same files.
-Behind the web `api.ts` sits `crates/web` (`hyperlab-web`): the same crates
-the desktop wraps — runtime, parser, persistence, graph, the assistant —
-compiled to WebAssembly, exporting one function per desktop command. Its
+Behind the web `api.ts` sits `crates/web` (`hyperlab-web`), which wraps the
+same crates the Tauri shell wraps, compiled to WebAssembly and exporting one
+function per desktop command. Its
`view.rs` is a hand-kept twin of the desktop's, and a test serializes a
snapshot and checks the field names against what the renderer expects.
@@ -110,8 +110,8 @@ keeps the same shape with the parts a page has:
script blocked mid-line on `ai("…")`. The wire protocol is the same Rust
code the desktop uses (`hyperlab-ai-providers` built without its native
clients); only the transport is the browser's.
-- The site being static files is the guarantee's other half: there is no
- HyperLab server for a key, a stack, or a question to visit.
+- The site being static files is the guarantee's other half: nothing a
+ browser sends has anywhere of ours to stop off at on the way.
Anthropic requires the `anthropic-dangerous-direct-browser-access` header
before answering a browser at all. Sending it is honest here: the request