Ka-bobs · The open engineering notebook
How this website was built.
From point-and-click pages to prompt-engineered custom features: a real restaurant website becomes a place to study code, computer science, and AI-assisted development.
Living edition · October 13, 2026 · Original explanations and examples, with linked primary sources.
The person at the computer
His restaurant. My part at the keyboard.
I’m Asa Cauvel. I wash dishes at Ka-bobs and work on its website in my spare time. Chef Icky owns the restaurant. I’m grateful he has let me bring his show to the internet.
I noticed that the website needed help and offered to work on it. This notebook explains the custom features I have directed through prompts, and the ordinary code that makes them work.
Asa on Facebook ↗ · A brief creator note ↗
Early 2026
Learning the page editor
I began with the website's point-and-click tools and learned by changing a page, looking at the result and trying again.
Later in 2026
From prompts to pasted code
I started asking AI for code, reading its suggestions and pasting tested pieces into the website. Small changes helped me learn how HTML, CSS and JavaScript work together.
Summer 2026
Beginning to use Codex
I began using Codex during summer 2026 to work with files, inspect code and test changes. From then on, I directed the new custom features through prompts rather than hand-writing their code: describe the behavior, review the result, test it, and publish the change.
These early periods are Asa’s recollection of his own project. The dated update log below records changes supported by public release checks.
The editor shows a bounded cover preview. The complete notebook remains in this code block and displays on the published page.
I remember starting during the cold part of the year, when it was . This is a personal recollection, rather than an exact weather record.
What you are seeing
Photographs, enhanced images, generated art, and code.
Real photography
Many pictures come from real food, people, rooms, and the building. The photo archive keeps descriptions and links to the original Facebook posts.
Explore the photographs ↗Enhanced photographs
Some visual work starts with a real picture and uses AI-assisted changes, such as lighting or presentation. Enhancement and original capture are different stages; a source image should remain part of the asset’s record.
Generated visual effects
Some decorative assets, including peacock artwork, were generated with AI. Other ornament is drawn directly with SVG, CSS gradients, and mathematical paths. The small feather on this notebook is a code-drawn vector.
AI participates in development. On a visit, normal web code renders the page, moves the graphics, responds to controls, and runs the games. An attractive output still needs tests, accessible controls, and a record of what was actually published.
This is an AI-assisted technical notebook checked against project source and cited references. Its teaching models simplify particular mechanisms; they are not a university accreditation or a proof that every feature is correct.
Layers, rather than one giant program
The actual toolbelt.
| Layer | What it does here | Study next |
|---|---|---|
| Squarespace | Hosts the restaurant pages and supplies the content editor, shared navigation, and native forms. Custom code is added in bounded blocks or page-specific fields. | Primary guide ↗ |
| HTML + the DOM | Represent documents, headings, links, forms, game controls, and accessible structure. The browser exposes that document as a tree that scripts can inspect and update. | Primary guide ↗ |
| CSS + SVG | Provide layout, responsive card tables, typography, gilded borders, vector paths, and motion fallbacks. | Primary guide ↗ |
| JavaScript + TypeScript | Implement behavior, timers, game rules, and interface state. TypeScript helps check source before producing JavaScript that browsers run. | Primary guide ↗ |
| Canvas + Web Audio | Draw changing game scenes and synthesize sound. These APIs have their own timing, coordinate, and user-interaction constraints. | Primary guide ↗ |
| Node.js + build tools | Compile and package source, run checks, and create the self-contained game files used by specific site integrations. | Primary guide ↗ |
| Git + Python | Preserve source revisions and support scripts, documentation, and artifact preparation. A source revision and a public release are separately checked. | Primary guide ↗ |
| Codex | Helps inspect files, propose or edit code, and run permitted development tools in response to instructions. Prompts express intent; tests and public checks provide evidence. | Primary guide ↗ |
Solo games can be packaged into an isolated iframe. The online table application is a separate component with accounts and server-side state. Browser-local scores, server records, native website forms, and restaurant confirmations have different owners and lifetimes.
Working with an AI coding agent is a feedback loop: describe the intended behavior and constraints; inspect the relevant source; make a bounded change; run a meaningful check; review the resulting experience; save it; verify the public page. The artifact a visitor receives is the result of that process.
A bridge into the terminology
Start with one idea at a time.
A page is a structured document
A browser needs to know what each part means. Headings divide the story; links move to destinations; buttons perform actions.
Try it: Find one heading, one link and one button on this page. Explain why they have different jobs.
Document structure becomes a question about representation: which model lets people and software find the same relationships?
Style is a system of rules
CSS chooses how content appears. Layout rules, spacing and typography work together; a rule's position alone does not determine whether it wins.
Try it: Compare the same card in a narrow and wide window. Note what changes and what stays readable.
Constraints and optimization appear when several sizes must remain readable at once.
A click becomes an event
A button does not know a task by itself. An event listener connects the user's action to a piece of code, which checks the situation before changing it.
Try it: Use Tab to focus a button, then activate it with the keyboard. Observe its focus indicator.
Input handling connects to human-computer interaction: a useful shortcut must preserve other intentions.
Data remembers the current situation
A card's suit is data. Whose turn it is is state. Keeping these ideas separate from drawing the screen makes a game easier to inspect and test.
Try it: Describe a game using only its state: players, turn, cards, score and phase.
A state machine creates a model whose transitions can be reasoned about independently of the artwork.
Motion connects space and time
Animation updates a position over time. A frame gives another picture, but a timing value tells the program how far movement should progress.
Try it: Pause the greeting and compare the animated route with its still controls.
Trajectory design connects to geometry, sampling and numerical error; smooth pictures alone do not prove correct timing.
Some work completes later
A file or image may arrive after the rest of the page. Code needs a clear way to handle success, failure and a result that belongs to an older request.
Try it: Describe what the interface should show while it waits, succeeds and fails.
Ordering problems grow into concurrency, cancellation and consistency questions.
A change needs more than a convincing screenshot
A screenshot shows one state. A test asks whether a defined behavior still works. Both are useful, and they answer different questions.
Try it: Write one test for a full hand of one suit and another for closing and reopening the table.
Coverage is a measurement of selected cases; reliability also depends on assumptions, environmental variation and failure handling.
Research depth: rules that stay true
Suppose a game says only the current player may move. An invariant expresses a rule that should survive every allowed transition. Formal reasoning asks what must be assumed to establish that rule.
Try it: State a turn-order invariant without mentioning how the game looks.
How can an abstract rule and a running implementation be kept in agreement as features change?
Research depth: a computer number is an approximation
A computer has finite memory, so many real numbers cannot be stored exactly. Small errors can accumulate as a simulation advances through time.
Try it: Compare 0.1 + 0.2 with 0.3, then explain why the mismatch is small but meaningful.
Which errors matter to the visual result, and which can change the rules or long-term behavior?
Research depth: several participants see one game
If several computers share a game, messages may arrive late or repeat. The system needs rules for the accepted state, the order of actions and recovery after a connection changes.
Try it: Describe what should happen if the same move request arrives twice.
Which consistency rules preserve fair play while keeping the interface responsive?
Research depth: learning from imperfect evidence
Measurements can be noisy. Bayesian inference describes how assumptions and evidence combine into a revised account of uncertainty, rather than turning one measurement into absolute certainty.
Try it: Explain what would make a distance estimate more or less trustworthy.
How sensitive is a conclusion to the model, the measurement error and the prior assumptions?
Research depth: an interface communicates a choice
A shiny button can attract attention, but its label and position must explain what happens next. Studying an interface means observing people completing real tasks, not guessing from decoration alone.
Try it: Ask someone to find a game or a menu without coaching. Record where they hesitate.
Which design changes improve comprehension across different abilities and experience levels?
Experiment with the numbers
A small frame-budget spreadsheet.
A display at f frames per second offers a nominal 1000/f milliseconds between frames. Enter estimated costs to see how simulation, drawing, interface updates, and sound compete for that time. This is an editable teaching model; real performance requires measurement.
| Work | Estimated milliseconds |
|---|---|
budget_ms = 1000 / fps; headroom_ms = budget_ms − Σ cost_ms. A negative result means the assumed work exceeds that nominal interval. Frame pacing, parallel work, browser scheduling, and operating-system overhead make a real trace more complicated.
From operational details to formal models
Technical chapters.
Each chapter connects a concrete website mechanism to a more precise computer science model. Read the plain explanation first; then follow the formal argument, inspect the example, and try the exercise.
Chapter 01 · Advanced / research bridge
01 · A website is a composition of systems
Follow a page from the restaurant domain through its document, embedded game, build artifacts, and separate application services.
In ordinary language
A website is a collection of cooperating programs rather than a single picture. The address identifies a resource. The server sends a document and related files. A browser parses that document, applies styles, executes permitted JavaScript, and paints the result. Squarespace supplies the restaurant's page editor and surrounding site structure. Custom sections add behavior that its standard editor does not express. Games can run in their own embedded documents; the application runtime supplies additional routes and services.
The important distinction is between development and execution. Development happens when Asa describes a change, an AI coding tool proposes or edits source, and the result is reviewed and tested. Execution happens later when a visitor's browser runs the published program. A moving skewer is normally JavaScript and CSS running in that browser. The visitor is not conversing with the development model every time it moves.
The audited project contains static HTML/CSS/JavaScript games, TypeScript source for Spades, React components for application interfaces, build scripts, and server/database modules. These are separate layers with different responsibilities. A button's appearance belongs to the interface. Whether a card is legal belongs to the game engine. Whether a player may update a shared room belongs to the server. Confusing these layers creates both ordinary bugs and security problems.
The formal model
Represent a system as a directed dependency graph G = (V, E). Vertices are independently meaningful artifacts or services; an edge u → v means that u depends on v. A rendered page can require a host document, an iframe, its decoded HTML, graphics assets, and browser APIs. Correctness is therefore compositional only when every boundary has a contract: accepted inputs, produced outputs, failure behavior, and ownership.
A local test establishes a proposition about one environment. It does not establish the proposition that a particular public URL serves the same artifact. Source inspection, build verification, deployment identity, and public interaction checks answer different questions. This distinction is an elementary instance of observational equivalence: two implementations are interchangeable only relative to specified observations, not because both return HTTP 200.
How it connects to this website
The source map separates app/ routes, game-src/ editable modules, public/games/ browser assets, db/ schema, and tools/ build operations. GameFrame provides an iframe wrapper with Restart, Fill browser window, and Full screen. Packed Squarespace game builds are an additional publication path; they should not be conflated with a whole application deployment. The Spades publication builder explicitly states that online-room publication is a separate task.
const layers = new Map([
["restaurant-page", ["game-frame"]],
["game-frame", ["game-document"]],
["game-document", ["browser-APIs"]],
["browser-APIs", []]
]);
function visit(name, seen = new Set()) {
if (seen.has(name)) return seen;
seen.add(name);
for (const dependency of layers.get(name) ?? []) visit(dependency, seen);
return seen;
}
console.log([...visit("restaurant-page")].join(" → "));
Run context: Run in a JavaScript console or save as architecture.mjs and run with Node.js.
restaurant-page → game-frame → game-document → browser-APIs
Going deeper
For advanced study, consider failure independence. If a decorative image cannot load, should ordering information remain usable? If a compression API is absent, should an existing game disappear? The current game builders retain an existing frame when replacement cannot proceed. This is an example of a compatibility contract. A dependency graph becomes useful engineering documentation when it also records which failures are recoverable, which layers hold state, and which component owns cleanup.
The project's architecture is heterogeneous: a content-management system, embedded browser applications, and a separate application backend coexist. That is a practical composition problem, not evidence that every available framework is being executed on every page. Dependencies listed in a package file describe the development project; only actual built and delivered artifacts establish a visitor's execution path.
Applied laboratory: take one visible feature and identify its artifact, owner, dependencies, and observable success criteria. For a game launch, write down the canonical entry page, the target frame, the game document, and the action that proves it is playable. Then deliberately imagine one failure at each boundary. A missing frame, unsupported API, failed image, and rejected fullscreen request should not all produce the same unhelpful blank rectangle. Each has a different cause and a different reasonable recovery.
This analysis extends to change impact. If a global script is modified, every page that loads it is potentially affected. If a path-scoped installer changes one frame, the impact is narrower, but it still depends on the host's lifecycle. Enumerating dependencies helps select verification work. It also prevents a change to a single game from being described as a release of all account features. To document the system academically, distinguish component diagrams, deployment diagrams, and runtime traces: the first explains logical responsibilities, the second explains where artifacts execute, and the third explains a particular interaction over time.
A useful oral-exam question is: what could remain wrong even if every dependency loads successfully? Answers include an incorrect rule, misleading status message, inaccessible control, private-data leak, or confusing layout. Architecture organizes these obligations; it does not eliminate them.
Common traps
A successful local build is not evidence that a public page was updated.
An iframe is a document boundary, not automatic proof of a strong security boundary.
Questions to investigate
Draw the dependency graph for a catering inquiry from selection to submission.
Identify which layer should decide a legal card move and explain why.
Further reading: HTML living standard · HTML living standard: The iframe element · esbuild API
Chapter 02 · Advanced / research bridge
02 · Syntax, semantics, and the meaning of a program
Read symbols as a grammar, then distinguish a syntactically valid program from a program that does the intended job.
In ordinary language
Syntax is the grammar of code: which arrangements of characters count as legal expressions and statements. Semantics is what those arrangements mean. In JavaScript, const declares a binding, parentheses supply function arguments or group expressions, braces delimit blocks and object literals, and square brackets often describe arrays or property access. A string is text; a number participates in numeric operations; an array is an ordered collection. These are not interchangeable simply because they can be displayed similarly.
Consider a game score. The expression score + bonus adds numbers if both are numbers, but JavaScript can concatenate text if a string is involved. An interface reading the text "25" from an input must deliberately validate and convert it. A calculator that looks correct can silently implement the wrong operation. Learning to read the language includes learning where conversion happens.
Functions package a computation. Parameters name its inputs; a return statement supplies its output. A pure function's result depends on its inputs and it does not modify external state. Pure calculations are easier to test than code that simultaneously reads a button, changes a score, plays a sound, and stores progress. This project uses small engine and calculation modules alongside interface code for that reason.
The formal model
An operational semantics relates a program configuration to its next configuration. Write ⟨e, σ⟩ → ⟨e′, σ′⟩, where e is an expression and σ an environment/store. The notation separates evaluation from mutation: a pure arithmetic expression may change e while leaving σ invariant; assignment changes the store. An abstract syntax tree records hierarchical structure without treating source text as arbitrary strings.
The pedagogical distinction is threefold: parsing asks whether the program belongs to the language; static analysis asks whether selected properties can be established before execution; runtime evaluation determines actual behavior. A compiler accepting a program establishes neither the correctness of a restaurant estimate nor the fairness of a game. Domain specifications supply those obligations.
How it connects to this website
The Spades source exports typed card helpers, rule definitions, and engine operations instead of embedding all decisions in click handlers. Build scripts bundle modules into browser-deliverable JavaScript. The build also parses generated script text to catch syntax failures. That is a useful gate, but it does not validate every game mechanic or interface interaction.
function addPoints(score, bonus) {
if (!Number.isSafeInteger(score) || score < 0) throw new TypeError("Invalid score");
if (!Number.isSafeInteger(bonus) || bonus < 0) throw new TypeError("Invalid bonus");
const next = score + bonus;
if (!Number.isSafeInteger(next)) throw new RangeError("Score overflow");
return next;
}
console.log(addPoints(100, 25));
try { addPoints(100, "25"); } catch (error) { console.log(error.message); }
Run context: Run in a JavaScript console or as syntax.mjs.
125, followed by Invalid bonus
Going deeper
At a research level, semantics permits precise questions about equivalence. If two score functions return the same result for tested inputs, they may still differ on overflow, malformed data, or side effects. A proof needs an explicitly bounded domain or reasoning for all admissible inputs. Testing supplies observations; formal semantics supplies a language for explaining what those observations are meant to support.
Names also matter. A variable named price may denote dollars, cents, a pre-tip subtotal, or a final quote. Good names encode units and role: foodCents and tipCents are easier to reason about. Comments should explain invariants and tradeoffs rather than narrate punctuation. The durable intellectual work is turning a vague intention into an unambiguous contract that a human reader, compiler, and test can all interrogate.
Applied laboratory: annotate a ten-line program without running it. Identify each binding, expression, branch, function call, and possible exception. Then specify an input/output relation using a few representative and boundary cases. If your prose says that negative bonuses are forbidden, the implementation should enforce that precondition or clearly assign enforcement to its caller. A comment alone has no runtime effect.
Next consider referential transparency. If an expression can be replaced by its result without changing observable behavior, it behaves transparently in that context. A pure calculation of a percentage is often close to this ideal. Reading the current time or changing local storage is not. Mixing these effects into arithmetic makes explanations and tests harder because the result depends on the environment as well as the apparent arguments.
Formal methods begin with this discipline of precise meaning. A Hoare-style statement {P} C {Q} says that if precondition P holds and command C terminates normally, postcondition Q holds. It must account for exceptions and termination assumptions. For the points example, a postcondition includes that the output is a nonnegative safe integer equal to the mathematical sum. This is a modest but meaningful specification, far more useful than saying the function is advanced or intelligent.
Common traps
Valid syntax can express an incorrect algorithm.
Do not use eval to turn user-supplied text into a program.
Questions to investigate
Predict the difference between 10 + 2 and "10" + 2.
Refactor a calculation into a pure function and list its preconditions.
Further reading: ECMAScript 2026 language specification (ECMA-262, 17th ed.) · Types and programming languages
Chapter 03 · Advanced / research bridge
03 · Types make impossible combinations visible
Use TypeScript to describe card identities, match phases, and commands while retaining runtime validation at external boundaries.
In ordinary language
A type describes which values are permitted in a position. A seat can be one of four names. A card can combine a rank and suit. A match phase can be bidding, playing a trick, finishing a hand, or finishing a game. These descriptions let a tool find mistakes before the browser runs the program. For instance, a misspelled phase should not quietly become another game state.
TypeScript extends JavaScript with a static type system. The annotations guide development and are removed from the ordinary JavaScript that reaches the browser. They are not a guard against a visitor manually constructing a malformed HTTP request. Incoming data still needs validation at runtime. The current online Spades handler checks the permitted request fields and card/bid values independently of its TypeScript declarations.
Some designs are better than others. An object with many optional properties permits combinations that should never occur. A discriminated union uses a tag, such as kind, to say exactly which properties belong to each case. A play-card command must contain a card. A ready command must contain a readiness choice. An exhaustive switch forces an implementer to confront new cases when the protocol grows.
The formal model
Sum types represent alternatives; product types represent combinations. A command type C = Bid × BidValue + Play × CardIdentity distinguishes two legal variants. The plus sign denotes alternatives, not arithmetic addition. Control-flow narrowing refines the type under a proposition about a discriminant. An unreachable case can be represented by the bottom-like TypeScript type never.
TypeScript is intentionally pragmatic and includes features that are not a complete proof system for JavaScript behavior. An assertion or any can bypass useful checking. Therefore a static typing judgment Γ ⊢ e : T should be understood relative to the language's rules and assumptions; it does not prove the accuracy of a user-facing policy or an entire distributed protocol.
How it connects to this website
Spades defines Seat, Suit, Rank, CardId, MatchPhase, MatchCommand, MatchState, and SeatProjection. CardId uses a template-literal type combining a rank with a suit. Public-history helpers accept only the subset of projection fields needed for the last move. This makes their information requirements explicit and supports separation between public plays and private hands.
type Action =
| { kind: "bid"; tricks: number }
| { kind: "play"; card: string };
function describe(action: Action): string {
switch (action.kind) {
case "bid": return `Bid ${action.tricks} tricks`;
case "play": return `Play ${action.card}`;
default: {
const unreachable: never = action;
return unreachable;
}
}
}
console.log(describe({kind: "play", card: "AS"}));
Run context: Paste into the official TypeScript Playground, then run. Alternatively compile with TypeScript and run the emitted JavaScript.
Play AS
Going deeper
For deeper study, connect this design to preservation and progress. In a small formal language, preservation says that one evaluation step preserves a well-typed expression's type; progress says a well-typed closed expression is a value or can step. These theorems depend on precise rules. Real browser applications add network failures, mutable documents, external scripts, and user input, so a local theorem cannot be promoted into an unrestricted application guarantee.
Types remain valuable because they compress assumptions into machine-checkable structure. A projection that omits other players' cards restricts what bot and interface functions can accidentally read. A versioned command makes protocol evolution visible. An integer-with-units convention helps prevent mixing milliseconds and seconds. The objective is to make invalid combinations harder to express and remaining assumptions easier to audit.
Applied laboratory: write down the complete set of values your interface can accept for one setting. A suit-order preference is a permutation of four suits, so there are 4! = 24 distinct orders. An arbitrary array of strings has a vastly larger domain. A normalization function narrows that domain at runtime and supplies a defined fallback when stored data is malformed. A static declaration can then describe the normalized values used inside the program.
This illustrates the boundary between representation and validity. A value may be representable by a type yet invalid for the current state. A bid of 13 is a number and lies in the game's numeric range, but it may still be rejected when it is another seat's turn. Types express broad structural constraints; the transition system expresses contextual legality. Both are necessary.
For a deeper exercise, encode different phases with phase-specific fields rather than one large record full of nullable values. Compare how many impossible combinations each design admits. More restrictive types can make code clearer, but they also introduce conversion and maintenance costs when the network protocol or persisted format changes. The engineering decision should be evaluated through concrete invalid states prevented, useful errors produced, and migration obligations created.
Common traps
A type assertion does not validate JSON.
Do not advertise static types as a proof that a program has no bugs.
Questions to investigate
Add a resign action and observe the exhaustiveness error.
Write a runtime predicate that validates an unknown bid before casting it.
Further reading: TypeScript handbook: Narrowing · Types and programming languages
Chapter 04 · Advanced / research bridge
04 · HTML and the DOM are an executable document model
Understand semantic elements, tree operations, text safety, and the difference between a button and a decorative shape.
In ordinary language
HTML describes a document's structure. A heading introduces a section; a navigation region contains navigation; a button triggers an action; a link moves to a resource. Choosing the right element gives a browser and assistive technology useful information before custom styling is added. An elegant gold rectangle becomes an actual control when it has the behavior, focusability, and name of a button.
The Document Object Model, or DOM, represents the parsed document as a tree of nodes. JavaScript can select elements, change text, add children, and listen for events. In this project, game interfaces update scores and status messages through DOM operations while the moving space scene is drawn on Canvas. These two rendering strategies cooperate: Canvas is efficient for a scene with many moving objects, while DOM controls support ordinary text and interaction.
Text and markup are different kinds of input. textContent places text into a node. innerHTML parses a string as markup. If the string contains a visitor's notes or a username, treating it as markup can create a cross-site scripting vulnerability. The safe default for untrusted display data is text insertion. Styling a quoted request does not require giving that request the power to become HTML.
The formal model
Model the DOM as an ordered rooted tree T with node identities and a set of mutation operations. A query maps a selector and tree to zero or more nodes. Rendering code should be explicit about uniqueness: an ID suggests one intended target, while a class may match many elements. A mutation observer reports selected changes; it does not confer ownership of every node in the document.
Escaping is context dependent. A value safe as text is not automatically safe in a URL, attribute, CSS declaration, or JavaScript program. The correct strategy is to avoid crossing interpretation boundaries unnecessarily. Construct a text node for text, use a URL API for URLs, and validate allowed schemes rather than applying one imagined universal sanitizer.
How it connects to this website
Skewer Storm's discovery catalog, image credits, glossary, and source links are assembled with createElement, textContent, and append. The Spades layout observes the hand container so it can adapt after visible layout changes. Packed game installers use MutationObserver to locate their existing frame, then stop or reconcile within a bounded scope. The restaurant footer's photo link is a normal anchor as well as an Extras entry.
<!doctype html>
<meta charset="utf-8">
<h1>Request preview</h1>
<label>Notes <input id="notes" value="A table near the window"></label>
<button id="preview" type="button">Preview notes</button>
<p id="result" role="status"></p>
<script>
document.querySelector("#preview").addEventListener("click", () => {
document.querySelector("#result").textContent =
document.querySelector("#notes").value;
});
</script>
Run context: Save as document.html and open it in a browser.
The notes appear as literal text after Preview notes; markup-like input remains text.
Going deeper
DOM programming has an ownership problem. A custom script sharing a content-management page should select a narrow root, avoid unrelated content, and restore only attributes it changed. Repeated initialization should not create duplicated buttons or listeners. This is idempotence at the document level: applying an installer twice should have the same intended result as applying it once.
At scale, frequent reads of geometry interleaved with writes can force repeated layout work. Collecting measurements, then applying changes together, helps keep an interface responsive. This is an engineering inference about browser pipelines rather than a claim that every control on this site has been fully optimized. The chapter's minimal example prioritizes semantics and correct interpretation; production layout and asynchronous lifecycle add further obligations.
Applied laboratory: inspect a small page as a tree rather than a screenshot. Name the root, landmarks, heading hierarchy, control labels, and status region. Then ask which information remains understandable if styles do not load. A semantic document should preserve much of its purpose. If the meaning exists only in background images or positioned decoration, the content model needs work before further ornament is useful.
Node identity matters when code updates a document. Replacing an entire subtree can discard focus, selection, and listeners attached to its old nodes. Updating a stable status element's text preserves more context. The same principle explains why a game should not rebuild every control after each small score change when a narrow update will suffice. A renderer needs a deliberate policy for which nodes persist and which are recreated.
For advanced readers, distinguish the DOM tree, accessibility tree, layout tree, and painted output. These structures are related but not identical. A node may be present in the DOM yet not visible, or visible yet missing an accessible name. Verification should examine the relevant representation for the claim being made. Counting buttons in markup does not prove they can be reached by keyboard; a screenshot alone does not prove that a screen reader receives an understandable status update.
Common traps
A click listener on a div does not automatically supply keyboard activation.
A selector that matches the wrong control can be syntactically valid and visually destructive.
Questions to investigate
Enter <strong>Hello</strong> and explain why it is displayed literally.
Replace the paragraph with an output element and compare the document semantics.
Further reading: HTML living standard · DOM standard
Chapter 05 · Advanced / research bridge
05 · CSS is a constraint system for readable design
Connect gilded visual styling to the cascade, layout constraints, responsive geometry, and readable information hierarchy.
In ordinary language
CSS describes how document elements are rendered. A selector chooses elements; a declaration assigns a property such as color, padding, border, or display. Several declarations can compete for the same property. The cascade resolves that competition through rules involving origin, importance, layers, specificity, and ordering. It is more precise than saying that the last rule always wins.
Good design expresses priorities. The main action needs a clear label, contrast, sufficient size, and a visible keyboard-focus state. Decoration should support that action rather than conceal it. The restaurant's teal, cream, and antique-gold palette can be expressed with shared custom properties. Reusing those values keeps unrelated pages visually coherent without pasting a slightly different gold color into every rule.
Responsive layout is not simply shrinking a desktop screenshot. The content must fit a changing space. Spades illustrates why: thirteen cards in one suit should remain readable when bidding, while a phone has far less width than a monitor. The source separates presentation ordering from authoritative card state, then applies adaptive hand and table layout. The rules can change the arrangement without changing the game.
The formal model
Think of layout as constraints over available width W, item count n, minimum readable item width m, and gap g. A single row requires n·m + (n−1)·g ≤ W. When this inequality fails, the design must choose among wrapping, reducing nonessential spacing, changing presentation, or scrolling. It cannot preserve every original dimension by assertion.
Specificity is a lexicographic comparison of selector components within the appropriate cascade stage. It is not a decimal number where ten class selectors equal one ID selector. Scope also matters: a narrow root selector reduces accidental effects on a shared host page. The formal aim is not maximum specificity, but predictable resolution of competing constraints and maintainable component boundaries.
How it connects to this website
Catering uses a dedicated kb-catering root, preset cards, a structured summary, gold actions, and local decorative artwork. Spades uses separate hand-layout and table-layout modules plus CSS rules for expanded modes. The fullscreen wrapper changes the shell and restores prior body overflow on exit. These details show that decorative treatment, content hierarchy, and available-space management are connected but distinct tasks.
<!doctype html>
<meta charset="utf-8">
<style>
:root { --ink:#153c38; --paper:#fff8e8; --gold:#d9b35f; }
body { background:var(--paper); color:var(--ink); font:18px system-ui; padding:2rem; }
.choices { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,15rem),1fr)); gap:1rem; }
button { min-height:48px; padding:1rem; border:2px solid var(--gold); border-radius:.6rem; background:#f5d985; color:var(--ink); font:inherit; }
button:focus-visible { outline:3px solid var(--ink); outline-offset:4px; }
button:active { transform:translateY(2px); }
@media (prefers-reduced-motion:reduce) { button { transform:none; } }
</style>
<h1>Choose a gathering</h1>
<div class="choices"><button>Small celebration</button><button>Team lunch</button><button>Build your own</button></div>
Run context: Save as layout.html; resize the browser and navigate with Tab.
The cards reflow; the active keyboard target has an obvious focus outline.
Going deeper
A research-informed interface also treats typography as a resource allocation problem. Extra ornament consumes area and attention. A card rank needs distinguishable glyphs before an elaborate card back matters. A summary should communicate the selected package before decorative animation draws the eye. These are design decisions that can be evaluated through task success and comprehension, not merely a screenshot's visual complexity.
The browser's computed style can explain which rule actually wins. A declaration present in a source file is not proof that it affects a live element. Container dimensions, inherited properties, transforms, viewport rules, and host-page CSS all participate. This is why source validation must be followed by rendered checks at representative widths and heights. Responsive correctness depends on the whole composition.
Applied laboratory: write the layout's constraints before styling it. Require a readable action label, a minimum touch target, a visible focus indicator, and a maximum line length for paragraphs. Then add the feather pattern and gold border while preserving those constraints. This reverses a common failure in which an attractive composition is built first and the controls are squeezed into whatever space remains.
Responsive design also involves height. A wide laptop can have a short viewport, especially when a toolbar or browser zoom consumes space. A design tested only by width can still place a bid button below the visible area. A phone in landscape changes both dimensions. Card-table rules must evaluate the whole available rectangle and decide when a different arrangement is appropriate.
The formal distinction between intrinsic and extrinsic sizing is useful here. Content has minimum and maximum contributions; containers impose additional constraints. A long unbroken string can change a minimum-content width unexpectedly. min-width: 0 on an appropriate flex or grid item can permit shrinking, but the content still needs a wrapping or overflow policy. These mechanisms should be applied with an explanation of the actual pressure in the layout, not copied as mysterious incantations from an unrelated page.
Common traps
Gold-colored text can have poor contrast on a gold background.
Hiding overflow may hide controls instead of solving a layout problem.
Questions to investigate
Calculate whether thirteen 54-pixel cards with 6-pixel gaps fit into 800 pixels.
Test the layout with 200% browser zoom and a longer translated label.
Further reading: CSS cascading and inheritance level 5 · CSS grid layout module level 2 · Web content accessibility guidelines (WCAG) 2.2
Chapter 06 · Advanced / research bridge
06 · Events, promises, and the browser event loop
Explain why asynchronous code can remain single-threaded at the document level and why heavy work can delay an animation.
In ordinary language
A browser responds to clicks, key presses, network completions, timers, and animation requests. These events do not all happen in the order a novice might infer from source text. A click listener runs when the click is dispatched. A promise callback runs when its scheduled microtask is processed. An animation callback runs in relation to a rendering opportunity. Understanding these categories helps explain why a screen can lag even when the Internet connection is working.
Asynchronous does not automatically mean parallel. A promise lets a computation continue later without requiring the current function to block, but its callback can still execute on the document's event loop. A very long calculation can delay input handling and painting. Chaining many microtasks can also postpone a chance to render. Code organization and bounded work matter alongside hardware speed.
The project uses requestAnimationFrame for motion, event listeners for game controls, MutationObserver for host-document changes, and ResizeObserver for layout measurement. Each API has a particular scheduling role. They should not be treated as interchangeable timers. A game also needs to cancel or stop work when the relevant document or interface is no longer active.
The formal model
An event loop includes task queues and a distinct microtask queue. A task can run synchronous JavaScript, after which microtask checkpoints process pending microtasks according to the platform model. Rendering opportunities are not a promise that every timer invocation produces a painted frame. A deadline requested with setTimeout is a lower-bound scheduling intention subject to other work and browser rules, not an exact real-time guarantee.
For responsiveness, bound the work done in a scheduling interval. If computation C exceeds a frame budget B, input and drawing can be delayed. At 60 Hz, the nominal interval is approximately 16.7 ms, but the program should not assume every display, browser, or device uses that rate. Measure elapsed time rather than counting frames as seconds.
How it connects to this website
Skewer Storm obtains timestamp deltas from animation callbacks, updates only running or intermission modes, and renders each frame. Spades schedules a hand redraw and observes changes to its container. Its observers are disconnected on pagehide. The compressed publication loader returns a promise from stream decoding instead of blocking the page while waiting for a document to appear.
console.log("1 · synchronous start");
setTimeout(() => console.log("4 · timer task"), 0);
Promise.resolve().then(() => console.log("3 · promise microtask"));
console.log("2 · synchronous end");
Run context: Run in a fresh JavaScript console or as event-loop.mjs.
1 · synchronous start; 2 · synchronous end; 3 · promise microtask; 4 · timer task
Going deeper
In concurrent systems, a happens-before relation identifies orderings justified by the program model. It is better than assuming wall-clock simultaneity. A callback registered first may still wait for a different external event. Network responses may return out of order; the interface must decide whether a later request supersedes an earlier one. Explicit revisions, cancellation, or stale-result checks are useful patterns.
This matters for character animation too. A list of scheduled launch times encodes intent, while elapsed-time interpolation determines the visible position. If the main thread pauses, actual paints may be delayed. Engineering a resilient sequence means defining the current phase from elapsed time, cleaning up old state, and preserving a readable fallback when motion is disabled. The specification of the sequence is separate from assumptions about perfect scheduling.
Applied laboratory: collect a trace with labels and timestamps around a click, promise continuation, animation callback, and timeout. Predict the ordering guaranteed by the program model, then distinguish it from ordering that merely happened during one run. This separates causal reasoning from an accident of scheduling. A trace can reveal that a network response completed promptly while a long synchronous task delayed its display.
Cancellation is another scheduling concern. If an interface is closed while an asynchronous operation remains pending, its eventual callback must not blindly update a new or unrelated screen. A generation counter can identify which request belongs to the current view; an AbortController can cancel supported operations. These patterns are possible improvements and teaching techniques, not a claim that every request in this project already uses both.
A practical performance budget lists tasks competing for the same rendering opportunity: game simulation, drawing, DOM measurement, image decoding, and decorative animation. Removing a background process might improve available resources, but it does not fix an unbounded computation in a click listener. Diagnosing performance requires measurements tied to specific work. The event-loop model supplies a way to explain those measurements and avoids treating every delay as the same kind of problem.
Common traps
A zero-millisecond timer does not run before the current call stack finishes.
Repeatedly retrying a stale browser editor does not prove an Internet bandwidth problem.
Questions to investigate
Add a second promise callback and predict the order before running it.
Measure a deliberately expensive calculation and explain which user interactions it could delay.
Further reading: HTML living standard: Web application APIs and event loops · Synchronizing with effects
Chapter 07 · Advanced / research bridge
07 · Simulation time, numerical integration, and pauses
Distinguish a game clock from a display refresh rate and explain the limitations of a capped variable time step.
In ordinary language
A moving object has a position and a velocity. If velocity is measured in pixels per second, a frame update moves it by velocity multiplied by the elapsed seconds. This makes motion less dependent on how many frames a device draws. A player on a 120-Hz screen should not move twice as quickly as a player on a 60-Hz screen merely because the screen refreshes more often.
There is a complication when a tab stalls or becomes hidden. A large elapsed interval could suddenly move an enemy across the entire screen. The current Skewer Storm loop clamps its time step to at most 0.033 seconds and pauses running play when the document becomes hidden. This limits giant simulation jumps. It also means the simulation may advance more slowly than wall-clock time during sustained low frame rates. That tradeoff should be described honestly.
A cutscene introduces another clock. Combat, cooldowns, temporary powers, and narrative progress need explicit pause rules. The recent game separates intermission behavior from combat updates. A player should not lose a temporary benefit simply because they stop to read a scientific explanation unless that is an intentional rule. A pause is therefore a state transition, not merely an overlay covering the scene.
The formal model
For the differential equation dx/dt = v, explicit Euler integration computes x[n+1] = x[n] + v[n]·Δt. With constant v this update is exact apart from arithmetic error; with accelerating or interacting systems its error depends on the chosen step and model. The audited game uses a capped variable step, not a universal fixed-step deterministic solver.
An alternative fixed-step accumulator collects wall time and applies repeated updates of h seconds. Rendering can interpolate between previous and current states. To prevent an unbounded catch-up spiral after a stall, an implementation must cap backlog or steps. Each strategy trades temporal fidelity, stability, responsiveness, and reproducibility. The right choice depends on the game's actual dynamics and performance budget.
How it connects to this website
Skewer Storm computes dt = min(0.033, max(0, elapsedMilliseconds/1000)). Visibility changes pause running mode. The update function has a dedicated intermission branch and only advances narrative timing there. On continuation, the next wave resets the player's position and grants a short transition grace period. These are explicit mechanics in source, not claims that an arbitrary browser will maintain a particular frame rate.
function advance(position, velocity, elapsedSeconds, paused) {
const dt = paused ? 0 : Math.min(0.033, Math.max(0, elapsedSeconds));
return position + velocity * dt;
}
console.log(advance(10, 100, 0.02, false));
console.log(advance(10, 100, 5, false));
console.log(advance(10, 100, 0.02, true));
Run context: Run in a JavaScript console or as timing.mjs.
12; 13.3; 10
Going deeper
For graduate work, distinguish numerical reproducibility from gameplay fairness. Identical seeds and identical commands may still produce different trajectories if the simulation uses variable steps, platform-dependent timing, or non-associative floating-point summation. A deterministic card engine has fewer such problems because its important updates are discrete. A continuous shooter should not promise identical cross-device replay without controlling these additional variables.
The clock also becomes a resource in interface design. A brief launch delay can create anticipation; a long mandatory greeting can become friction after repeat visits. Timing should be an explicit, testable parameter. The lesson is to express desired launches, impacts, pauses, and completion as data or state, then verify both the schedule and the human-visible sequence.
Applied laboratory: advance a constant-speed object for one nominal second using several frame sequences. Test sixty intervals of 1/60 second, ten intervals of 0.1 second, and an irregular sequence containing a stall. Compare simulated displacement with wall-clock displacement. Under a 0.033-second clamp, the low-rate sequence advances less simulated time. This is not a contradiction; it is the chosen overload behavior.
Then specify which clock governs each mechanic. A cooldown may use simulated active-play time, a reconnect timeout uses a server clock, a greeting uses elapsed animation time, and an appointment date uses civil time with a time zone. These quantities should not be mixed simply because they all contain numbers. Pausing one clock must not unexpectedly pause another authority's timeout.
For numeric analysis, accumulated rounding can depend on operation order because floating-point addition is not associative. Summing many small increments into a very large experience total can eventually lose increments below the representable spacing. Scaled integers or a carefully defined accumulation strategy can preserve intended fractional progression. A design that promises extraordinarily large experience caps should first specify units, representation, serialization, arithmetic, and display—not merely choose a famous large number for its headline.
Common traps
A clamped time step does not make a simulation automatically frame-rate independent under every load.
Pausing rendering while leaving gameplay timers active is not a complete pause.
Questions to investigate
Compare total distance after one second at 60 Hz and at 10 Hz with this clamp.
Design a fixed-step accumulator and specify its catch-up limit.
Further reading: Fix your timestep! · HTML living standard: Web application APIs and event loops · ECMAScript 2026 language specification (ECMA-262, 17th ed.)
Chapter 08 · Advanced / research bridge
08 · Canvas, geometry, and spatial reasoning
Map logical coordinates to display pixels and use geometric models to explain collision and safe-zone behavior.
In ordinary language
Canvas is a drawable surface. Instead of making every moving star an HTML element, a game can paint a scene by issuing drawing commands each frame. The code maintains objects with positions, sizes, colors, and state. The visible image is the result of drawing those objects in an intentional order. A background star system may move slowly while a nearby projectile moves rapidly, producing a depth cue without requiring a physically complete universe simulation.
The browser's CSS dimensions and the Canvas bitmap dimensions are different. On a high-density display, a canvas that uses one bitmap pixel per CSS pixel can look soft. The audited shooter scales its bitmap by a capped device-pixel ratio and changes the drawing transform. Capping that ratio is a performance choice: more pixels improve potential detail but increase work.
Collision is a mathematical question. Does a projectile intersect a hull? Does the entire hull fit inside a safe region? Testing only a center point can produce an unfair-looking result when the ship overlaps the region's edge. The current boss-warning geometry accounts for the ship's width. That choice translates a vague complaint—"I was in the yellow area"—into a measurable spatial contract.
The formal model
A coordinate transform maps logical coordinates to device coordinates, for example p_device = S·p_logical with a diagonal scale matrix S. Input must use the inverse mapping if event coordinates are measured in CSS space. A collision model is an approximation: axis-aligned boxes, circles, oriented polygons, and pixel masks have different costs and behavioral implications.
For two circles, intersection holds when squared center distance is no greater than the squared sum of radii: (x1−x2)² + (y1−y2)² ≤ (r1+r2)². Avoiding a square root preserves the same ordering for nonnegative distances. Broad-phase partitioning can reduce expensive pair tests when many entities are present; it is an available technique, not a claim that every current game implements a spatial tree.
How it connects to this website
Skewer Storm maintains logical WIDTH and HEIGHT, resizes with the parent, caps bitmap density, and renders stars, enemies, warnings, and effects on a two-dimensional canvas. The scene also includes credited astronomical image assets. Those real observations and the game's fictional atmosphere should remain distinguishable. A visually convincing image does not make the flight model an astrophysical simulation.
function circlesOverlap(a, b) {
const dx = a.x - b.x, dy = a.y - b.y;
return dx * dx + dy * dy <= (a.r + b.r) ** 2;
}
function hullFits(centerX, halfWidth, zoneLeft, zoneRight) {
return centerX - halfWidth >= zoneLeft && centerX + halfWidth <= zoneRight;
}
console.log(circlesOverlap({x:0,y:0,r:2}, {x:3,y:0,r:2}));
console.log(hullFits(50, 8, 40, 60));
console.log(hullFits(44, 8, 40, 60));
Run context: Run in a JavaScript console or as geometry.mjs.
true; true; false
Going deeper
Spatial fairness includes perceptual alignment. The collision shape should approximately match what a player believes is solid. Transparent decorative glow should not silently enlarge a damaging obstacle. Warning colors, outlines, timing, and geometry work together; a mathematically accurate region can still be difficult to interpret if visual boundaries are weak.
An advanced extension is swept collision detection. A tiny fast object can cross a target between two frames without intersecting at either sampled position. Testing the segment of motion against the target addresses this tunneling problem. Choosing such techniques requires measuring actual failure cases and costs. An impressive effect should retain a comprehensible causal relationship between action, warning, contact, and consequence.
Applied laboratory: draw the same logical scene at several bitmap densities and compare clarity, memory usage, and frame time. Keep logical positions fixed while changing only the device transform. If an object moves differently when density changes, the program has probably mixed coordinate systems. The experiment makes the distinction between resolution and simulation geometry visible.
Next overlay collision shapes during a development build. Compare them with the opaque parts of the artwork, warning bands, and perceived safe spaces. A player's complaint can then be investigated as a difference between visual and collision geometry rather than dismissed as poor play. Debug overlays should be separate from the ordinary customer interface, but they can provide unusually clear educational demonstrations.
The depth effect can be parameterized by layers with different velocity scales. Let a distant image use α_d v and a nearby particle use α_n v, with 0 ≤ α_d < α_n. This produces parallax-like relative motion. It is an artistic screen-space model, not a claim about actual travel near a star. Scientific captions should explain real objects while labeling fictional flight and dramatic transitions. That separation lets visual creativity coexist with accurate teaching instead of converting evocative imagery into false physical assertions.
Common traps
More resolution is not free; bitmap work grows with area.
Perspective effects are artistic cues unless backed by an explicitly stated physical model.
Questions to investigate
Transform a pointer position into logical Canvas coordinates after CSS scaling.
Compare a circular collision approximation with a rectangular ship sprite.
Further reading: HTML living standard: The canvas element · Introduction to algorithms (4th ed.)
Chapter 09 · Advanced / research bridge
09 · Input is a protocol, including cancellation
Build interactions that work with mouse, touch, keyboard, and interrupted gestures.
In ordinary language
A drag gesture is not just a mouse moving. It has a beginning, updates, an intended end, and ways to be interrupted. A pointer may leave the element, the browser may interpret a touch as scrolling, or the document may lose focus. If the program only listens for movement while the pointer happens to remain inside a small object, the object can stop following unexpectedly.
Pointer Events provide a common model for mouse, pen, and touch. Pointer capture lets the element that begins a gesture continue receiving events for that pointer until the capture ends. A correct implementation also handles pointercancel and lostpointercapture. Keyboard access is a complementary path, not something to add by pretending every key is another pointer.
This site combines DOM controls with Canvas play. In a shooter, arrow keys and pointer motion can both move a ship, while a deliberate input-mode preference decides which path is active. Focus matters: pressing Space while a button is focused can activate the button rather than fire. A polished interface gives players a stable focus target and a visible account of controls.
The formal model
Model a gesture as a finite-state protocol: Idle → Dragging(pointerId, origin) → Idle, with cancellation transitions from Dragging. Only events matching the captured pointer may update that gesture. This excludes a second finger or unrelated device from hijacking the state. Input coordinates must then be mapped to the game's logical space before they alter the simulation.
Event default behavior is part of the protocol. preventDefault and touch-action affect browser behavior in different ways and should be narrowly applied. Disabling every default key or touch action can damage page navigation and scrolling. An input contract states which keys the game consumes, when it is focused, and how the user can leave the mode.
How it connects to this website
Skewer Storm's input logic distinguishes spaceHeld, pointerType, touchActive, and movement settings. Mouse/keyboard firing and touch auto-fire follow different declared control paths. Public fullscreen wrappers include escape and return controls. The example below teaches a robust drag protocol; it is deliberately a standalone lesson and does not assert that Plate Panic's current glass interaction has been repaired by displaying it here.
<!doctype html>
<meta charset="utf-8">
<style>#token{touch-action:none;position:relative;width:120px;min-height:52px}</style>
<button id="token" type="button">Drag token</button>
<output id="status">Ready</output>
<script>
const token=document.querySelector("#token"), status=document.querySelector("#status");
let drag=null;
token.addEventListener("pointerdown",event=>{
if(event.button!==0 || drag) return;
drag={id:event.pointerId,x:event.clientX,y:event.clientY};
token.setPointerCapture(event.pointerId);
status.textContent="Dragging";
});
token.addEventListener("pointermove",event=>{
if(!drag || event.pointerId!==drag.id) return;
token.style.transform=`translate(${event.clientX-drag.x}px,${event.clientY-drag.y}px)`;
});
function finish(event){
if(!drag || event.pointerId!==drag.id) return;
drag=null; token.style.transform=""; status.textContent="Ready";
}
token.addEventListener("pointerup",finish);
token.addEventListener("pointercancel",finish);
token.addEventListener("lostpointercapture",finish);
</script>
Run context: Save as pointer.html and drag with a mouse or touch device; interrupt the gesture and try again.
The token follows one captured pointer and returns to Ready when the gesture ends or is cancelled.
Going deeper
At a deeper level, input processing is a small distributed system between device, operating system, browser, and application. Events can be coalesced, interrupted, or delayed. The program should reason from the supplied event identity and state rather than assume a perfect stream of physical motion. Explicit cancellation is a first-class part of a successful interaction.
Accessibility extends the state model. A drag-only action may exclude users who cannot operate a pointer precisely. Offering a Load button or keyboard-selectable destination can preserve the task without requiring the same physical gesture. The aim is equivalence of meaningful outcomes, not imitation of mouse movement. Test the contract with real interactions rather than just counting event listeners in source.
Applied laboratory: test a gesture matrix containing click without movement, drag out of bounds, release outside the original element, interrupted touch, second pointer, and loss of page focus. Record the expected state after each case. A test confined to a perfectly centered drag misses the failure modes most likely to make an interaction feel unreliable.
Selection and activation should also be distinct. A card may be focused, highlighted, selected for preview, or committed as a move. Treating all four as the same state can cause accidental plays. A bid interface should keep the hand visible, communicate the selected value, and offer a clear commitment action. The engine still validates the resulting command regardless of how the interface produced it.
At a formal level, input handling is a transducer: it maps an event stream and internal state to actions and new state. Some events should be ignored, some consumed, and some forwarded to ordinary browser behavior. Writing those rules prevents accidental global interception. Keyboard shortcuts are especially important because they coexist with editing, assistive technology, browser commands, and platform conventions. A hidden shortcut should be a convenience with a visible ordinary alternative, not the only route to an important function.
Common traps
Never leave a stale drag flag after cancellation.
Do not disable Select All or ordinary navigation shortcuts globally just to add an Easter egg.
Questions to investigate
Add ArrowLeft and ArrowRight alternatives with a visible position readout.
Identify how a pointer cancel differs from a successful drop.
Further reading: Pointer events level 3 · Web content accessibility guidelines (WCAG) 2.2 · DOM standard
Chapter 10 · Advanced / research bridge
10 · Web Audio connects sound to events and time
Explain generated chimes, oscillator graphs, gain envelopes, audio clocks, and explicit visitor control.
In ordinary language
Sound can make a game feel responsive when it confirms a deliberate action, a reward, or a warning. The current shooter synthesizes several sounds instead of requiring an audio file for every event. An oscillator produces a tone; a gain node controls its amplitude; connecting the nodes routes the signal to the output. Different waveforms, pitches, durations, and envelopes give events distinguishable signatures.
Turning a sound abruptly on and off can produce a click. A short fade-in and fade-out make the transition smoother. The program schedules those fades on the audio context's clock. This is more precise for sound than hoping a visual timer callback will occur at the exact desired sample. Visual and auditory events can be coordinated without pretending their pipelines share one clock.
Browsers commonly require a user interaction before audio can begin. A page may express sound-on as its preference, yet an AudioContext can still start suspended. The code needs to resume it after an allowed action and provide a visible mute control. Hover audio before any interaction cannot be promised on every browser. Deliberate visitor control remains part of an elegant experience.
The formal model
For a sine oscillator, x(t) = A(t) sin(2πft + φ), where f is frequency, φ is phase, and A(t) is the amplitude envelope. A gain ramp defines A over an interval. Exponential ramps need positive nonzero endpoints, so using a tiny positive gain and then stopping the source is a common design. Mixing many voices requires headroom; adding amplitudes indiscriminately can clip or become excessively loud.
Web Audio represents computation as a directed routing graph of nodes. The audio rendering timeline and JavaScript control timeline are distinct. Scheduling parameters through AudioParam connects them deliberately. Resource management is also part of correctness: finished nodes should be disconnected, and simultaneous voices should be bounded for predictable performance.
How it connects to this website
Skewer Storm creates oscillator and gain nodes, applies a short attack and exponential release, tracks active voice counts, and disconnects completed nodes. Sound families separate effects and music. This is source-audited generated audio. It is not evidence of a licensed commercial soundtrack or a promise that audio will bypass a browser's interaction requirement.
<!doctype html>
<meta charset="utf-8">
<button id="chime" type="button">Play a quiet chime</button>
<script>
let audio;
document.querySelector("#chime").addEventListener("click",async()=>{
audio ??= new AudioContext(); await audio.resume();
const tone=audio.createOscillator(),gain=audio.createGain(),t=audio.currentTime;
tone.frequency.value=660; tone.type="sine";
gain.gain.setValueAtTime(0.0001,t);
gain.gain.linearRampToValueAtTime(0.06,t+0.01);
gain.gain.exponentialRampToValueAtTime(0.0001,t+0.3);
tone.connect(gain).connect(audio.destination);
tone.onended=()=>{tone.disconnect();gain.disconnect();};
tone.start(t);tone.stop(t+0.31);
});
</script>
Run context: Save as chime.html and press the button; begin with a low device volume.
A short quiet tone plays after an explicit click if Web Audio is available.
Going deeper
Sound design is an information problem. If every event uses the same loud cue, the player cannot infer what occurred. Short distinctive patterns can communicate state transitions while remaining pleasant. A visual indicator should accompany information-bearing audio so that a muted game remains usable. Audible excitement should not be the sole mechanism for understanding a repair, extra life, or warning.
Advanced analysis connects envelopes to frequency content: discontinuities introduce broadband components, while smoother transitions reduce some abrupt artifacts. That explains why a few milliseconds of shaping can improve quality without adding a recording. The example is intentionally small; production audio additionally needs volume settings, suspension handling, limits, and testing across devices and listening environments.
Applied laboratory: construct three short envelopes using the same frequency and compare their onset and release. An abrupt rectangular envelope, a brief linear attack, and a longer shaped decay will feel different even without changing the note. Keep the listening level low and compare quality rather than maximum loudness. Sound intensity is a design parameter, not a substitute for intelligible feedback.
Then assign each cue an informational role. A reward can rise in pitch; an unavailable action can use a short neutral response; a warning can repeat with limited urgency. The corresponding visual label must communicate the same event. This creates redundancy across sensory channels and lets muted play remain comprehensible.
For advanced study, distinguish synthesis, sampled playback, mixing, and spatialization. Synthesis creates a signal from parameters. Sampled playback uses a recorded signal. Mixing combines voices. Spatialization models the relationship between source and listener. The current small oscillator routine demonstrates synthesis and amplitude shaping, not every part of a full audio engine. Scheduling a source accurately also does not guarantee zero hardware latency; the complete path includes processing blocks, browser buffering, output-device buffering, and the physical listening environment.
Common traps
A sound-enabled preference does not override browser autoplay restrictions.
Do not use an unbounded number of voices or maximum gain to make feedback noticeable.
Questions to investigate
Change the waveform and describe the perceptual difference.
Create different pitch contours for success, warning, and cancellation.
Further reading: Web Audio API
Chapter 11 · Advanced / research bridge
11 · Builds, bundles, compression, and reversible installation
Follow editable modules into a packed game document and learn why compression is delivery engineering rather than secrecy.
In ordinary language
Source code is organized for editing. Browser delivery is organized for loading and execution. A bundler collects modules and produces a deployable program. TypeScript can be compiled to JavaScript. CSS and images can be referenced as files or embedded into a self-contained document. Different delivery choices have different costs: more requests, a larger single response, caching opportunities, and easier or harder updates.
The audited Squarespace game builders bundle the game code, include required styles and assets, verify the resulting script syntax, and create a self-contained HTML document. They gzip that document and encode the compressed bytes as base64 so a page-header script can carry them as text. The browser uses DecompressionStream to reconstruct the document, then places it into the intended iframe's srcdoc.
Compression reduces repeated patterns. Base64 represents bytes with a text alphabet and usually increases the byte count by roughly one third before other compression effects. Neither operation hides source from a determined reader. A browser must recover the program to run it. It is therefore incorrect to store a password, private key, or privileged token inside a "compressed" or "minified" client bundle.
The formal model
Let H be the original UTF-8 byte sequence, Z the gzip transform, and B the base64 representation. Delivery D = B(Z(H)) should satisfy Z⁻¹(B⁻¹(D)) = H for the accepted input. A cryptographic digest records artifact identity, while successful parsing provides a separate syntactic property. Neither implies semantic correctness.
The installer itself has a lifecycle. It locates an existing frame, records the attributes it owns, changes only the intended scoped content, and restores prior state on close or route exit. Idempotent reconciliation prevents duplicate installation. Feature detection provides a compatibility decision before mutation. This is a reversible transformation over a host document, not an invitation to rewrite unrelated Squarespace content.
How it connects to this website
The Spades builder limits itself to /games and #kb-spades-frame. It preserves the frame's existing layout, permissions, and sandbox attributes and restores original source attributes on close, route exit, or pagehide. The Storm builder similarly targets its dedicated game frame. Build-time checks include gzip round trips and expected embedded-image coverage. These are substantial engineering checks, but rendered play still requires public verification.
const original = "An elegant interface should have a reversible release.";
const encoded = new TextEncoder().encode(original);
const compressed = await new Response(
new Blob([encoded]).stream().pipeThrough(new CompressionStream("gzip"))
).arrayBuffer();
const restored = await new Response(
new Blob([compressed]).stream().pipeThrough(new DecompressionStream("gzip"))
).text();
console.log(restored === original);
Run context: Run in a browser console supporting Compression Streams, or save as compression.mjs in a modern Node.js runtime.
true
Going deeper
For advanced readers, publication is a reproducibility problem. The meaningful release identity includes source revision, build-tool behavior, generated output, and host wiring. Hashing the intended output then checking the public frame's decoded document is stronger than simply seeing a new filename. It still does not replace testing controls, layout, audio activation, or gameplay.
Self-contained embeds trade modular caching for publication convenience. Embedding large images can make an editor field expensive to manipulate and increase the host document's initial payload even when the game is not open. A future architectural improvement could isolate lazily loaded versioned assets. That is a design option derived from the observed packaging, not a claim that such a change has already been deployed.
Applied laboratory: package a small self-contained HTML lesson, hash its original bytes, compress it, restore it, and hash the restored bytes. The equality test verifies reversible transport. Then deliberately remove an asset or alter one byte and confirm that the validation detects the change. Such checks are useful because a valid-looking string can still describe the wrong version of a game.
Different forms of identity answer different questions. A source revision identifies tracked source. A build digest identifies output bytes. A release marker identifies the intended integration version. A rendered screenshot records one observation. Combining these records gives an auditable chain, but it is still necessary to ensure that each record actually belongs to the same release rather than collecting unrelated successful artifacts.
The installer should also have an explicit fallback contract. If a required API is absent, preserve a working previous frame or show a helpful message rather than half-installing new code. If the modal closes, remove observers and restore owned attributes. If the route changes, do not keep modifying a detached or repurposed frame. These lifecycle constraints make a packed embed maintainable in a host system whose document may change independently of the game developer's code.
Common traps
Compression and minification are not encryption.
Do not replace an unrelated frame just because its selector looks similar.
Questions to investigate
Measure original, compressed, and base64 lengths for repetitive and random input.
Specify which frame attributes your installer owns and how each is restored.
Further reading: Compression standard · esbuild API · HTML living standard: The iframe element
Chapter 12 · Advanced / research bridge
12 · State machines, legal moves, and bots with limited knowledge
Separate game rules from rendering and distinguish a fair heuristic bot from an opponent that can read hidden cards.
In ordinary language
A game state contains the facts needed to decide what may happen next. In Spades, those include the phase, the player's turn, the hands, bids, current trick, completed tricks, score ledger, and revision. A command proposes an action. The engine checks whether the action is legal and returns an accepted result or an error. A click should not directly rewrite the game's truth without passing through these rules.
The source models explicit phases rather than scattering many unrelated flags. Bidding leads to trick play, a completed hand leads to scoring and another hand, and a completed match leads to a result. This makes questions like "May I play a card while bidding?" precise. The renderer can then display controls appropriate to the phase.
Bots need an information policy. A bot can use its own cards, public bids, visible plays, and inferences from those plays. It should not secretly read an opponent's or partner's unplayed cards. The current source gives bot functions a seat-specific projection. Nil-cover and Nil-attack logic derive from that public view. A bot's tactical behavior is heuristic; it is not automatically optimal simply because its code is complex.
The formal model
Define a transition function δ: S × C → S + E, where S is the state space, C commands, and E errors. An invariant I is preserved if I(s) and an accepted transition δ(s,c)=s′ imply I(s′). Example invariants include unique card ownership, turn membership, and conservation of the fifty-two cards across hands and played history.
Information-limited decision-making uses an observation function O_i: S → P_i for seat i. The bot policy π_i consumes P_i, not the complete state. Many full states can share one projection; they are observationally indistinguishable to that bot. Tests can vary hidden hands while preserving public observations and verify that decisions do not improperly depend on private information.
How it connects to this website
The Spades engine rejects commands for the wrong phase, turn, or revision; follows suit when possible; and prevents leading unbroken Spades when a non-Spade alternative exists. getProjection constructs the view. Public-history helpers derive the last play solely from already face-up cards. Bot code includes partner-Nil cover and attacks an opponent Nil only after the team's normal contract is secured. The source makes these priorities inspectable.
function transition(state, command) {
if (state.phase === "bidding" && command.kind === "bid") {
if (!Number.isInteger(command.value) || command.value < 0 || command.value > 13)
return {ok:false,error:"Invalid bid"};
return {ok:true,state:{phase:"playing",bid:command.value}};
}
return {ok:false,error:"Action is not legal in this phase"};
}
console.log(transition({phase:"bidding"},{kind:"bid",value:4}));
console.log(transition({phase:"bidding"},{kind:"play",card:"AS"}));
Run context: Run in a JavaScript console or as state.mjs.
The bid produces a playing state; playing a card during bidding is rejected.
Going deeper
For graduate study, imperfect-information games can be described through information sets and belief states. A visible failure to follow a suit narrows possible hidden hands, but does not reveal exact cards. A policy can maintain that inference without cheating. The current bot implements a bounded heuristic approximation; a full Bayesian belief update or search over all consistent deals would be a different, more expensive design.
Separating state transitions from drawing also makes history useful. A last-move panel becomes a projection of accepted public play, not a reconstruction from animated card positions. Replaying commands can support debugging, but deterministic replay requires specifying randomness and versioned rules. This is how a pleasant card-table interface connects to formal state-machine engineering.
Applied laboratory: create two complete deals that differ only in cards hidden from one bot, while preserving its own hand and all publicly played information. Feed the same seat projection into the decision function and verify the same result. Then introduce a public event, such as an opponent failing to follow suit, and examine whether the inference changes appropriately. This distinguishes legitimate learning from hidden-information access.
State invariants can be checked after every accepted command in a simulation. Count cards in all hands, current trick, and completed tricks; verify uniqueness and expected totals. Verify that the next turn is consistent with the phase. Verify that scoring follows the selected rule version. A long random simulation is more useful when every intermediate step is checked than when it merely reaches an ending without crashing.
Heuristic priorities should be documented as policy rather than inevitability. Protecting a partner's Nil, securing a team's contract, attacking an opponent's Nil, and avoiding unnecessary bags can conflict. The source's ordered decision rules expose those tradeoffs. An alternative search-based bot could evaluate many future deals, but its quality would depend on inference, sampling, objective functions, and runtime cost. Stronger-looking behavior is not automatically fairer, faster, or more understandable.
Common traps
A public projection should omit hidden cards rather than merely hide them visually.
Bot sophistication is not evidence of a mathematically optimal policy.
Questions to investigate
List five card-conservation invariants.
Design a test that detects a bot reading another seat's hidden hand.
Further reading: TypeScript handbook: Narrowing · Introduction to algorithms (4th ed.) · Types and programming languages
Chapter 13 · Advanced / research bridge
13 · Forms, estimates, units, and trustworthy handoffs
Treat a selection summary as data, calculate with clear units, and distinguish preparing a request from actually submitting it.
In ordinary language
A catering planner turns choices into a structured request. The visitor selects a package, quantity, date, service, and optional details. The calculator produces an estimate and a readable summary. Preparing that summary is not the same as submitting an inquiry, and submitting an inquiry is not the same as confirming a booking. The interface should make each transition explicit.
The audited Squarespace catering planner hands a request to the restaurant's inquiry form through a versioned message. It waits for an acknowledgement and tells the visitor to enter contact details and press the form's Submit button. If the handoff fails, it offers copy/download and a normal form fallback. The separate React application's inquiry component posts JSON to its own API; that is a different implementation and should not be substituted in an explanation of the Squarespace planner.
Numbers need units. Dollars, cents, percentages, guest counts, and quantities are different domains. Integer cents avoid many errors caused by repeatedly adding decimal monetary values. Inputs need bounds and validation before arithmetic. JavaScript's Number is floating point, so tiny fractions and very large integers require careful representation. Displaying a decimal nicely does not fix the underlying arithmetic.
The formal model
For nonnegative cents c and a percentage represented as basis points b, a deterministic rounding convention can compute round(c·b/10000). The operation is exact only within the chosen integer arithmetic's valid range. For unrestricted integer precision, BigInt can implement rational rounding with integer division. Explicitly defining the convention avoids the ambiguity of rounding each item, subtotal, or final total differently.
A handoff protocol can be described as Idle → Preparing → Ready or Failed, followed by a separate visitor submission step. Validate message source, origin, type, version, and payload. An acknowledgement confirms preparation, not mail delivery. Distributed interface success is a series of claims about different stages, each requiring its own evidence.
How it connects to this website
The source names foodCents, tipCents, and foodAndTipCents and notes the actual 18% policy in the customer request. Unpriced additions remain subject to restaurant confirmation. The planner checks event details, sets a handoff timeout, verifies its parent and origin on acknowledgement, and keeps copy/download fallbacks. It also limits notes and avoids saving selected event date and notes in its local preference save.
function percentageInCents(cents, basisPoints) {
if (!Number.isSafeInteger(cents) || cents < 0) throw new TypeError("Invalid cents");
if (!Number.isSafeInteger(basisPoints) || basisPoints < 0) throw new TypeError("Invalid rate");
const numerator = BigInt(cents) * BigInt(basisPoints);
return (numerator + 5000n) / 10000n;
}
const subtotal = 25000;
const tip = percentageInCents(subtotal, 1800);
console.log(`${tip} cents`);
Run context: Run in a JavaScript console or as estimate.mjs.
4500 cents; this demonstrates arithmetic, not an authoritative event quote.
Going deeper
At an advanced level, numeric representation is part of the domain model. A finite floating-point value approximates a real number; it is not that real number. Exact decimal rules can be represented through scaled integers or rationals when the relevant range is bounded. The correct unit belongs in names, interfaces, serialization, and tests, not only in a paragraph of documentation.
Formality also means preserving agency. The visitor should see their selections before sending, know whether any payment is taken, and understand that availability requires restaurant review. A technically elaborate handoff remains incomplete if it cannot communicate these states. Test failure and timeout paths, not only the successful animation leading to the form.
Applied laboratory: enumerate the states of one request in everyday language, then bind each visible message to exactly one state. "Selections prepared" belongs to form preparation. "Request received" belongs to a successful receiver response. "Booking confirmed" requires the restaurant's actual confirmation. If one message spans several stages, rewrite it so a visitor cannot reasonably mistake a draft estimate for a reserved event.
Validation has both syntactic and semantic parts. A date can have a valid YYYY-MM-DD format yet be unsuitable for a booking. A guest count can be an integer yet exceed the planner's intended range. A phone string can be displayable without being useful for contact. The form should validate only claims it can support and avoid asserting external facts it has not checked.
Numerical serialization introduces another boundary. BigInt is suitable for exact integer arithmetic but ordinary JSON.stringify does not directly serialize it. A protocol can encode such values as validated decimal strings, or use bounded safe integers where appropriate. The format must be versioned and understood on both sides. Mathematical precision, transport representation, and user-facing currency formatting are separate decisions that should be documented together when a calculator becomes a real business interface.
Common traps
Never label a prepared form as a delivered email or a confirmed booking.
Do not trust a browser-submitted total as the authoritative server price.
Questions to investigate
Specify how half-cent rounding should work and test a boundary case.
Diagram the difference between preparation, submission, receipt, review, and confirmation.
Further reading: ECMAScript 2026 language specification (ECMA-262, 17th ed.) · Fetch standard · HTML living standard: The iframe element
Chapter 14 · Advanced / research bridge
14 · Shared rooms require server authority and atomic updates
Teach origins, membership, private projections, idempotency, compare-and-swap revisions, and the limits of a client-side sandbox.
In ordinary language
A shared game has a problem that a solo game can avoid: two people can act at almost the same time. Each may be looking at an older version of the board. The server must decide which action is legal, apply one accepted change, and tell both players the result. A browser's claim that it won is not sufficient. Shared state needs an authority that the players cannot simply edit through their own page.
The audited room modules validate membership, keep revisions, limit request rates, and record command identities. A revision expresses which state a move was based on. A command ID allows a retry to be recognized instead of applying the same move twice. These mechanisms matter when a connection drops after the server accepts a move but before the client receives the response.
This architecture exists in source for Connect Four, Checkers, and Spades. Source presence is not a statement that every room is publicly enabled or that every two-client flow has been verified. The Spades API has an explicit feature gate. The teaching page can explain the design while the public update log separately records what was actually released.
The formal model
Optimistic concurrency uses a compare-and-swap condition: accept an update only when stored revision r equals expected revision r_e, then advance to r+1. A transaction must couple the state update to its receipt. Otherwise a failed second operation could leave the system unable to distinguish an accepted action from a retry. Idempotency means repeated equivalent commands do not create repeated effects.
Authorization asks whether an authenticated actor may perform an operation on a particular object; authentication identifies the actor. Origin checks and permitted request schemas provide additional defenses, but do not replace authorization. A private seat projection should contain only that seat's private hand plus public facts. Security is an end-to-end invariant, not a label on a component.
How it connects to this website
The room code uses prepared SQL parameters, transactional D1 batches, expected revisions, command receipts, invitation digests, membership checks, and presence heartbeats. Spades distinguishes a human seat from bot-controlled replacement. The API reads bounded JSON bodies, rejects extra client-controlled fields, checks same-origin POSTs, and returns no-store responses. The iframe wrapper's allow-scripts plus allow-same-origin combination should not be advertised as isolation for arbitrary hostile same-origin code.
-- Run in a scratch SQLite database; this is a simplified concurrency lesson.
CREATE TABLE board (id TEXT PRIMARY KEY, revision INTEGER NOT NULL, choice TEXT);
INSERT INTO board VALUES ('demo', 0, NULL);
UPDATE board SET choice='A', revision=revision+1
WHERE id='demo' AND revision=0;
SELECT changes() AS first_update;
UPDATE board SET choice='B', revision=revision+1
WHERE id='demo' AND revision=0;
SELECT changes() AS stale_update;
SELECT revision, choice FROM board;
Run context: Execute the statements in order in a temporary SQLite database.
The first update changes one row, the stale update changes zero, and the board remains revision 1 with choice A.
Going deeper
Graduate readers can relate this design to linearizability: each accepted operation should appear to occur at one point between invocation and response, consistent with the application's sequential rules. The compare-and-swap update supplies a candidate linearization point, while the transaction ties dependent effects to it. End-to-end proof would require auditing all relevant reads, writes, failure paths, and database semantics.
Client progress and a server wallet are also different authorities. Solo trophies stored in localStorage are visitor-controlled display progress. They should not silently become redeemable value or trusted account balances. The current solo Spades reward code explicitly labels its coins local, while the application's Play Points ledger is a separate server system. Explaining this distinction prevents attractive interface language from overstating the security model.
Applied laboratory: simulate two requests reading revision zero. Let the first update succeed and make the second execute its original compare-and-swap condition. The second must detect that the state changed, then refresh rather than overwrite. Add a retry of the first command and show that its recorded identity returns the previous accepted result instead of producing another move.
Threat modeling starts with assets, actors, entry points, and trust boundaries. A game room protects membership and private hands. A request form protects customer contact details. A server wallet protects its ledger. A decorative effect has different requirements. Treating every component as equally sensitive wastes effort, while treating every browser value as trustworthy creates avoidable vulnerabilities.
Presence handling demonstrates why time-based decisions need care. A heartbeat can be delayed by a network interruption or background-tab throttling. A forfeit or bot replacement is therefore a rule about observed inactivity, not a reliable reading of a player's intention. The server should re-check presence inside the state-changing operation to avoid racing with a reconnect. Testing this boundary requires two independent clients or a controlled concurrent harness; a solo screenshot cannot demonstrate the relevant property.
Common traps
A compressed browser bundle is not a place for secrets.
A heartbeat alone cannot prove whether a user intentionally abandoned a match.
A sandbox flag combination must be evaluated in its actual origin context.
Questions to investigate
Add a command receipt and make update plus receipt atomic.
Explain why a membership check must occur before returning a room projection.
Further reading: Transaction · D1 database: Worker API · SQL language expressions: Parameters · HTML living standard: The iframe element
Chapter 15 · Advanced / research bridge
15 · Tests, properties, observability, and release evidence
Move from example-based checking to invariants, reproducible simulation, rendering checks, and honest verification boundaries.
In ordinary language
A test is a question with an observable answer. Does a shuffle preserve every card? Does a stale revision fail? Does a thirteen-card hand fit while bidding? Does a cutscene actually pause combat? These questions cover different layers. A pure function test cannot show that a gold button is readable on a phone. A screenshot cannot prove that a transaction protects against duplicate commands.
Example-based tests use selected cases. Property-style tests check a relation across many generated inputs: a shuffled deck always has the same elements, a legal move preserves card conservation, or a suit-order preference never changes the authoritative hand. Reproducible random seeds help turn a failure into a case another person can investigate.
The current project contains focused engine tests, bot simulations, room tests, reward/settlement checks, layout fixtures, build guards, and public release records. These are complementary evidence. A green test report supports exactly what was exercised under its assumptions. It should not be expanded into "all features are perfect" or "the whole campaign was played" when those activities did not occur.
The formal model
For a function f and invariant P, a property test samples x from a defined domain and checks P(x,f(x)). Its epistemic strength depends on domain coverage, oracle correctness, independence, and the distribution of samples. A test that repeats the implementation's formula may confirm a shared error rather than detect it. Boundary cases and independent models are especially valuable.
Verification can be decomposed into claims: source identity, syntax validity, behavioral invariants, integration identity, rendered usability, and delivery status. A SHA-256 match addresses byte identity. A compiler addresses selected syntactic/static properties. A browser interaction addresses observed behavior in a particular environment. Each claim needs the right witness; no single witness establishes the entire system.
How it connects to this website
Spades tests cover hand ordering, public last-play derivation, bot Nil behavior, and expanded-layout distributions. Storm checks combat rules, opening progression, transit lessons, warning geometry, and spawn behavior. The build verifies expected images and a gzip round trip. Public checks for the v19 shooter exercised start, firing, phone sizing, first-wave transition, and a science intermission; that bounded evidence is distinct from a full eight-boss playthrough.
import assert from "node:assert/strict";
import test from "node:test";
function deck() {
return ["C","D","H","S"].flatMap(suit =>
["2","3","4","5","6","7","8","9","10","J","Q","K","A"].map(rank=>rank+suit));
}
test("a deck has 52 unique cards and 13 cards per suit",()=>{
const cards=deck();
assert.equal(cards.length,52);assert.equal(new Set(cards).size,52);
for(const suit of ["C","D","H","S"])
assert.equal(cards.filter(card=>card.endsWith(suit)).length,13);
});
Run context: Save as deck.test.mjs and run node --test deck.test.mjs.
One passing test that checks three independent deck properties.
Going deeper
For advanced verification, mutation testing asks whether deliberately introduced defects cause the tests to fail. Metamorphic testing checks relations between executions when exact expected output is difficult to calculate. For example, permuting irrelevant hidden cards should not change a public-information bot decision. These techniques expose weaknesses in a test oracle and help avoid superficial confidence from a large count of checks.
Observability makes failures explainable. A revision, release marker, state phase, structured error, and narrowly scoped log can identify what happened without exposing credentials or private customer details. The public update history should record what changed, why, and the checks actually completed. It is a useful educational artifact precisely because it distinguishes intention from evidence.
Applied laboratory: write down the claim before selecting a test. For "the hand fits," define the viewport, zoom, hand distribution, minimum readable dimensions, and presence of other controls. For "the move cannot be duplicated," define identity, retry behavior, database atomicity, and concurrent requests. A test becomes meaningful when it can fail for the defect implied by the claim.
An acceptance matrix should include representative devices, error paths, focus behavior, reduced motion, and state restoration. The point is not to run every conceivable combination after every harmless edit. It is to choose checks that cover the change's plausible effects and expand when new evidence reveals a risk. More repeated tests without a new hypothesis do not automatically produce better knowledge.
For advanced readers, distinguish coverage metrics from correctness. Executing a line shows that it was reached, not that its result was validated. Branch coverage improves visibility but does not cover every meaningful state combination. Model-based testing can generate command sequences from an independent transition model and compare accepted behavior. The independence of that model is crucial: copying the same incorrect rule into both implementation and oracle merely produces consistent error.
Common traps
A test report is not a deployment receipt.
An untested error path can remain broken even when the happy path works.
Questions to investigate
Write a property asserting that display sorting preserves the multiset of cards.
Construct an independent oracle for a safe-zone geometry boundary.
Further reading: Test runner · Introduction to algorithms (4th ed.) · TypeScript handbook: Narrowing
Chapter 16 · Advanced / research bridge
16 · Prompt engineering becomes software through review
Explain human direction, AI-generated changes, source control, provenance, limitations, and an evidence-backed public update history.
In ordinary language
Asa's account of this project's history begins with the restaurant website going online in early 2026 and basic point-and-click editing. He then began copying AI-generated code into the site. During summer 2026, he learned to use Codex for more of the development work. This is the project's reported chronology, not a claim about when Codex was first released. Chef Icky owns and leads the restaurant; Asa contributes the website work with the owner's permission.
Prompt engineering expresses goals, constraints, examples, and feedback in language a model can use. A coding agent can then inspect project files, propose or apply changes, run available tools, and help test the result. The official OpenAI documentation describes Codex as a coding agent. In this project, the human still supplies the restaurant's intent and judges the outcome. The model does not become the restaurant owner or the authority on its policies.
The resulting visitor experience consists mainly of ordinary programs and media. Many restaurant photographs are real. Some visuals can be based on real photographs with AI-assisted adjustments; other artwork and effects can be generated. A trustworthy asset record labels these categories where known and preserves original credits. Looking at an image is not enough to reconstruct its editing history, so uncertainty should be recorded rather than disguised.
The formal model
The development process can be modeled as an iterative synthesis-and-verification loop. Given specification S and context C, a generator proposes program P. A validator produces observations V(P), and a human evaluates whether those observations satisfy the intended contract. Since neither S nor V is automatically complete, acceptance is conditional evidence rather than a proof of unrestricted correctness.
This resembles counterexample-guided refinement: a complaint, failing test, or observed layout defect supplies a counterexample to an earlier assumption, and the implementation is revised. The analogy is methodological; it does not claim that a probabilistic language model is itself a formally verified synthesizer. Source control and preserved release artifacts make each iteration inspectable and reversible.
How it connects to this website
The actual workflow includes readable TypeScript/JavaScript, bundled artifacts, original and generated art, focused tests, rollback backups, and public checks. Codex is a development tool; it is not embedded as a live conversational model in every gold button. The teaching examples here are simplified original examples. They do not publish secrets, private restaurant correspondence, or imply that all third-party artwork has the same license as the example code.
const update = {
date: "2026-10-12",
area: "educational example",
change: "Separate intent, implementation and verification",
reason: "Make limitations and evidence visible",
checks: ["Review source", "Test behavior", "Check rendered result"],
status: "Example, not a deployment receipt"
};
console.log(JSON.stringify(update, null, 2));
Run context: Run in a JavaScript console or as update-log.mjs.
A structured example update record; its explicit status prevents it from becoming a false live-release claim.
Going deeper
A serious public learning resource welcomes falsification. Readers can identify an unclear explanation, propose a better test, or point out a boundary the implementation has not handled. Advanced contributors may care about type soundness, atomicity, latency budgets, input semantics, or asset licensing. Beginners may simply ask why the same-looking buttons behave differently. Both questions can improve the specification.
The update log should use dated entries and evidence-derived language: changed, tested, published, and observed are different verbs. A living library can grow without pretending its first edition covers everything or exceeds a thousand printed pages. Its academic value comes from precise concepts, attributable sources, runnable examples, and candid limitations—not a fabricated length or claims of institutional endorsement.
Applied laboratory: express a request in four parts: intention, boundaries, acceptance criteria, and verification. "Make the greeting faster" becomes a schedule with launch intervals, impact intervals, an overall completion bound, preserved controls, and a reduced-motion fallback. That specification gives the coding tool a concrete target and gives the human a result that can be assessed without guessing what prettier or smarter meant.
Review should focus on what the program actually does. Ask whether it changes unrelated pages, introduces new dependencies, exposes private information, invents restaurant terms, or hides a failed action behind cheerful wording. A model can be fluent while misunderstanding any of these. Feedback is valuable when it identifies a reproducible counterexample rather than only rewarding confident prose.
A public teaching archive can share the method without exposing private operational history. Show simplified source, relevant contracts, references, and dated change summaries. Keep credentials, personal correspondence, internal costs, and sensitive account records out of the learning material. Invite corrections and contributions through a normal contact path. This turns prompt engineering into a transparent case study of software work: human goals, generated proposals, explicit constraints, implementation artifacts, tests, and observed results remain distinguishable.
Common traps
An AI-generated program can contain incorrect assumptions even when it compiles.
Do not describe a public resource as accredited university instruction or exhaustive coverage of computer science.
Showing code does not automatically grant redistribution rights to every asset or dependency.
Questions to investigate
Turn a vague visual request into acceptance criteria with observable outcomes.
Write an update entry that honestly distinguishes a local candidate from a verified public release.
Further reading: Codex CLI · Test runner · esbuild API · Synchronizing with effects
Make a model visible
The interactive laboratory.
A finite-state machine
A transition function chooses the next state from the current state and a command. Invalid transitions are disabled. A simulation step counts only while the machine is running.
State: idle · accepted simulation steps: 0
δ : S × C ⇀ S is a partial transition function: not every command is defined in every state. The invariant here is that a paused machine cannot increase its step count.
The real greeting’s timing, as a model
For skewer i ∈ {0,1,2,3,4}, launch time is 450 + 120i ms and impact time is 1650 + 720i ms. All five are in flight together between 930 and 1650 ms. Move the clock and inspect each flight.
Elapsed time: 1000 milliseconds
| Target | Launch | Impact | Phase | Flight progress |
|---|---|---|---|---|
| Menu | 450 ms | 1650 ms | Waiting | 0% |
| Catering | 570 ms | 2370 ms | Waiting | 0% |
| Event request | 690 ms | 3090 ms | Waiting | 0% |
| DoorDash | 810 ms | 3810 ms | Waiting | 0% |
| 930 ms | 4530 ms | Waiting | 0% |
Normalized progress is pᵢ(t) = clamp((t − launchᵢ) / (impactᵢ − launchᵢ), 0, 1). A quadratic Bézier path then maps that scalar to a point: B(p) = (1−p)²P₀ + 2(1−p)pP₁ + p²P₂. The derivative gives the tangent direction used to turn the skewer.
This slider is a pure timing model. Browser frame scheduling, focus pauses, layout measurements, and finite arithmetic still affect a running animation.
An excerpt from the published greeting
var LEAD_IN=450, LAUNCH_GAP=120, FIRST_FLIGHT=1200,
HIT_GAP=720, HIGHLIGHT_HOLD=720, FLIGHT_FADE=220;These are the current timing constants. The interactive model above explains their relationship; it does not replace the complete animation’s visibility, geometry, cleanup, and accessibility logic.
Read the punctuation as well as the words
Syntax workshop.
These original examples introduce small, reusable ideas. Their identifiers are teaching names, and their run context matters.
Give an action a real button
<button type="button">Pause animation</button>A button communicates an action and supplies native keyboard behavior.
Watch for: A plain div may look clickable but needs extra work to behave like a control. A form button without an explicit type may submit the form.
Connect a label to its field
<label for="practice-name">Your display name</label>
<input id="practice-name" type="text">Matching for and id connects the visible label to its input.
Watch for: A placeholder can disappear while typing; it is not a replacement for a lasting label.
Keep a style near its feature
.learning-card {
padding: 1rem;
border: 1px solid #b8964f;
}A named feature selector limits which elements receive the rule.
Watch for: A broad rule such as button can unexpectedly alter controls in another feature.
Let columns adapt
.learning-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
gap: 1rem;
}Items use as many readable columns as the available width permits.
Watch for: A fixed wide minimum can overflow a narrow phone. Test the actual content, not an empty layout.
A constant binding can hold a changing object
const round = { score: 0 };
round.score += 1;The binding still refers to the same object while one property changes.
Watch for: Const does not freeze an object's contents. Reassigning round itself is a different operation.
Return a useful result
function cardLabel(rank, suit) {
return `${rank} of ${suit}`;
}Parameters carry inputs; return gives the caller a result it can reuse.
Watch for: Printing a value and returning a value are different actions.
Compare without converting types
const isTwo = value === 2;Strict equality checks the operands without converting a string into a number.
Watch for: The text "2" and the number 2 are different values; convert input deliberately when a numeric comparison is intended.
Handle an element that is absent
const control = document.querySelector('.practice-control');
if (control) {
control.textContent = 'Ready';
}The check makes the change conditional on finding the element.
Watch for: Calling a method on null throws. A selector can be valid while matching nothing.
Connect an action to a response
control.addEventListener('click', () => {
status.textContent = 'Action received';
});The listener runs when the click arrives, after the elements have been found.
Watch for: Registering the same work repeatedly can make one click perform several actions. Keep initialization and cleanup clear.
Respect a request for less movement
@media (prefers-reduced-motion: reduce) {
.practice-sparkle { animation: none; }
}The rule replaces the unnecessary movement when the user's preference matches.
Watch for: Turning off decorative motion should not remove the useful text, controls or result.
A small structured record
{
"title": "Practice round",
"complete": false
}JSON uses quoted property names and a limited set of structured values.
Watch for: Comments and trailing commas can be valid in some programming languages but are not valid JSON.
A small numerical surprise
const sum = 0.1 + 0.2;
const exactlyEqual = sum === 0.3;The second result is false because these fractions are approximated in the Number representation.
Watch for: A single fixed tolerance is not right for every scale or measurement. Choose one for the actual quantity being compared.
Keep the vocabulary within reach
The working glossary.
No matching term. Try a broader word or choose all levels.
Website
A collection of related pages and experiences reached through a web address.
Web page
One document or view in a website, such as a menu, game or history page.
Browser
The application that requests web content and turns it into a usable page.
URL
An address identifying a resource and often a particular page or position within it.
Domain
The named part of a web address, such as ka-bobs.com.
Hosting
The service that stores or runs a website so browsers can reach it.
Client
The side requesting a service; on the web, a visitor's browser is usually the client.
Server
A system that receives requests and supplies data, files or computed responses.
Source code
Instructions and descriptions written in a programming or markup language.
CMS
A content management system that provides tools for editing and publishing pages.
HTML
The markup language used to describe a web document's content and structure.
Element
A structured part of a document, such as a heading, link or button.
Attribute
Information attached to an element, such as an image description or a button type.
Semantic HTML
Elements chosen for their meaning, so a button acts as a button and a heading labels a section.
Heading
A title that identifies a section and helps readers understand the document's hierarchy.
Landmark
A recognizable page region, such as navigation or main content, that assists efficient movement.
Accessibility
Designing an experience people can use with different abilities, inputs and assistive tools.
Alternative text
A useful text equivalent for an image when its visual content communicates information.
Focus
The element currently receiving keyboard input; a visible focus indicator helps show where you are.
ARIA
Attributes that describe interface roles, names and states when native HTML does not express them adequately.
CSS
The language describing visual presentation, including color, spacing, layout and motion.
Selector
A CSS pattern choosing which elements a style rule applies to.
Cascade
The ordered process used to choose a style when several rules could apply.
Specificity
One comparison within the cascade that measures how particular competing selectors are.
Box model
The content, padding, border and margin areas that determine an element's space.
Flexbox
A layout system for arranging items along a main direction and distributing space.
CSS Grid
A layout system that arranges items into rows and columns.
Responsive design
A layout that adapts to the available space and input conditions.
Viewport
The area through which a document is viewed; its size can differ from the whole screen.
Media query
A condition that applies styles when a device or user preference matches.
CSS custom property
A named style value that can be reused and changed through the cascade.
Transform
A change to visual position, rotation, scale or shape without rewriting the underlying content.
JavaScript
A programming language used to respond to input, manage data and change web experiences.
Variable
A named binding used to refer to a value while a program runs.
Constant binding
A binding declared with const that cannot be reassigned; an object it refers to can still change.
Function
A reusable operation that can accept inputs, perform work and return a result.
Parameter
A named input in a function's definition.
Return value
The result a function supplies to the code that called it.
Array
An ordered collection of values, useful for a hand of cards or a sequence of steps.
Object
A value grouping named properties, such as a card's suit and rank.
Boolean
A value that is either true or false.
Scope
The part of a program in which a particular binding can be accessed.
Closure
A function that retains access to bindings from the surrounding place where it was created.
Event
A report that something happened, such as a click, key press or completed load.
Event listener
A function registered to respond when a chosen event occurs.
DOM
The browser's tree of document nodes that code can inspect and change.
State
The information describing the current situation, such as whose turn it is or whether motion is paused.
State machine
A model of allowed states and the transitions that move between them.
Rendering
Turning content and state into the visible result a user sees.
Frame
One visual update in a sequence; motion is created by changing successive frames.
requestAnimationFrame
A browser API that schedules work before a repaint and supplies a timing value.
Delta time
The elapsed time between updates, used to make movement less dependent on frame rate.
SVG
A vector-image format describing shapes, paths and text that can be scaled.
Canvas
A drawable surface where code places pixels or shapes rather than individual document elements.
Web Audio
Browser tools for generating, processing and connecting sound sources.
Reduced motion
A user preference that can replace unnecessary movement with a calmer presentation.
JSON
A text format for structured values, with quoted property names and no comments.
HTTP
A protocol used for requests and responses between web systems.
API
A defined interface through which one piece of software uses another's capabilities.
Request
A message asking a system for a resource or operation.
Response
The result returned after a system handles a request.
Asynchronous work
Work whose completion happens later, allowing other activity while its result is pending.
Promise
A JavaScript object representing the eventual success or failure of an asynchronous operation.
Browser storage
Browser-managed space for retaining data; different storage tools have different lifetimes and restrictions.
sessionStorage
Storage scoped to a browsing session and origin, commonly used for temporary per-tab preferences.
Cache
A retained result reused to avoid repeating work; its freshness needs to be managed.
Hash
A computed fingerprint useful for comparing data; cryptographic hashes have stronger properties than ordinary checksums.
Version control
A system recording changes so earlier work can be inspected and recovered.
Commit
A recorded set of changes in a version-control history.
Regression test
A check that helps catch a previously working behavior breaking after a change.
Test fixture
Controlled data or setup used to make a test repeatable.
Debugging
Finding the reason for an unexpected result and checking a correction.
Syntax
The rules governing how instructions are written in a language.
Runtime
The environment and period in which a program actually executes.
Race condition
A result that depends on an unintended ordering of overlapping operations.
Idempotency
A property where repeating an operation has the same intended effect as doing it once.
Invariant
A condition intended to stay true across all allowed changes in a system.
Finite precision
The limit imposed by storing numbers with a finite amount of information.
Computational complexity
The study of how resource needs grow as a problem's input grows.
Formal verification
Mathematical reasoning used to establish specified properties under stated assumptions.
Bayesian inference
Updating a model of uncertainty by combining prior assumptions with observed evidence.
Linear algebra
The mathematics of vectors, matrices and linear relationships, useful for graphics and many models.
Affine transformation
A transformation combining a linear change with a translation, including shifts, rotations and scaling.
Bézier curve
A curve shaped by control points, useful for smooth paths and interfaces.
Sampling
Observing a continuous quantity at selected points; spacing and noise affect what can be recovered.
Numerical integration
Approximating accumulated change using finite calculations, such as updating simulated movement.
Distributed state
Information maintained across several participants or machines that must coordinate their views.
Observability
The ability to understand a system's behavior through meaningful outputs, measurements and traces.
Artificial intelligence
A broad field of computer methods performing tasks such as prediction, pattern recognition or generation.
Prompt
The instructions and context supplied to a generative model for a particular task.
Prompt engineering
Designing and refining those instructions, examples and constraints, then evaluating the model's output.
Standards, classics, courses, and research
The reference library.
128 linked primary resources, categorized for study. Standards specify behavior; manuals explain APIs; textbooks build theory; courses supply a route through exercises; research papers isolate a claim and its assumptions.
Read a manual when an API surprises you, a specification when exact behavior matters, and a textbook when you need a model that connects many cases. Follow a research result back to its assumptions before applying it to a browser, game, or distributed system.
No matching resource. Try a broader phrase or choose all levels.
First steps: from readable text to working code
Build a small page, give it one interactive control, and explain each line before adding complexity.
Browser engineering: structure, timing, input, and rendering
Explain what the browser guarantees, measure the rendered result, and preserve keyboard and reduced-motion usability.
Game engineering: simulation, graphics, feedback, and invariants
Separate rendering from state transitions and simulation, then test timing, legal actions, and conserved quantities.
Graduate path: what a program means
Relate syntax, semantics, type judgments, proofs, and compiler correctness; state assumptions explicitly.
- Structure and interpretation of computer programs (2nd ed.)
- 6.042J: Mathematics for computer science
- 6.045J: Automata, computability, and complexity
- Compilers: Principles, techniques, and tools (2nd ed.)
- Types and programming languages
- Practical foundations for programming languages (2nd ed.)
- An axiomatic basis for computer programming
- Software Foundations
- CompCert
Shared state: networking, databases, and multiplayer coordination
Model authoritative state, ordering, recovery, idempotency, and failure before choosing a deployment product.
- CS 144: Introduction to computer networking (Fall 2026)
- Operating systems: Three easy pieces (Version 1.10)
- Designing data-intensive applications
- PostgreSQL documentation: Transaction isolation
- Atomic commit in SQLite
- Time, clocks, and the ordering of events in a distributed system
- 6.5840: Distributed systems (Spring 2026)
- In search of an understandable consensus algorithm (Extended version)
- Paxos made simple
- Durable Objects documentation
Account engineering: identity, sessions, and recovery
Design boundaries and recovery deliberately; connect practical checklists with threat models and cryptographic definitions.
- Authentication cheat sheet
- Password storage cheat sheet
- Forgot password cheat sheet
- Session management cheat sheet
- Same-origin policy
- Content Security Policy (CSP) implementation
- Web Authentication: An API for accessing public key credentials—Level 3
- Digital identity guidelines: Authentication and authenticator management
- A graduate course in applied cryptography
AI-assisted development: instructions, tools, and evidence
Define behavior, let the agent operate within tools and permissions, and verify the resulting software with repeatable checks.
Reading shelves: AI-assisted software development · Accessibility and human-computer interaction · Correctness, testing, and formal methods · Databases and distributed systems · Foundations and algorithms · Graphics, games, and audio · Programming languages and semantics · Security and account engineering · Software design and engineering classics · Systems and developer tools · University courses and learning paths · Web programming and browser behavior · Web standards and layout
AI-assisted software development
ChatGPT and Codex documentation ↗
The current official hub describes the coding agent and its capabilities. A model proposes work; a harness supplies tools, context, permissions, and feedback, and the resulting software still requires verification.
Access: Free online
OpenAI. (n.d.). ChatGPT and Codex documentation. Retrieved October 12, 2026, from Primary source
Prompting ↗
Official guidance on communicating goals and constraints. Strong prompts specify observable behavior and acceptance criteria, while tests and review check whether those goals were met.
Access: Free online
OpenAI. (n.d.). Prompting. Retrieved October 12, 2026, from Primary source
Custom instructions with AGENTS.md ↗
Explains persistent project instructions for a coding agent. A readable instruction file can encode conventions, build commands, and verification expectations alongside a repository.
Access: Free online
OpenAI. (n.d.). Custom instructions with AGENTS.md. Retrieved October 12, 2026, from Primary source
Codex security ↗
Official documentation on security and permission boundaries around agent work. Distinguish what a model can suggest from which tools its environment actually permits it to use.
Access: Free online
OpenAI. (n.d.). Codex security. Retrieved October 12, 2026, from Primary source
Working with evals ↗
Introduces structured evaluation of model behavior against representative tasks. Evaluation supports evidence about an AI workflow; it does not replace ordinary software tests for the generated application.
Access: Free online
OpenAI. (n.d.). Working with evals. Retrieved October 12, 2026, from Primary source
Function calling ↗
Explains how a model can request structured tool operations that application code executes. The tool boundary separates a language-model output from an actual change to a file, browser, or service.
Access: Free online
OpenAI. (n.d.). Function calling. Retrieved October 12, 2026, from Primary source
Pattern recognition and machine learning ↗
A classic graduate introduction to probabilistic models, inference, and learning. It supplies mathematical background for machine learning, not an architectural description of today’s proprietary coding models.
Access: Author’s institutional page links an authorized full PDF; commercial print available
Bishop, C. M. (2006). Pattern recognition and machine learning. Springer. Primary source
Accessibility and human-computer interaction
Web Content Accessibility Guidelines (WCAG) 2.2 ↗
Testable accessibility criteria for content and interaction across devices. Use these criteria with actual keyboard, zoom, contrast, and assistive-technology checks.
Access: Free online
World Wide Web Consortium. (2024, December 12). Web Content Accessibility Guidelines (WCAG) 2.2 [Recommendation]. Primary source
ARIA authoring practices guide ↗
Interaction patterns for dialogs, menus, tabs, and other widgets. Its examples clarify roles, accessible names, focus behavior, and keyboard operation.
Access: Free online
World Wide Web Consortium. (n.d.). ARIA authoring practices guide. Retrieved October 12, 2026, from Primary source
The design of everyday things (Revised and expanded ed.) ↗
Explains signifiers, feedback, conceptual models, and why interfaces can invite mistakes. Its vocabulary helps turn a game control from a decorative rectangle into an understandable action.
Access: Publisher page; commercial book
Norman, D. A. (2013). The design of everyday things (Revised and expanded ed.). Basic Books. Primary source
prefers-reduced-motion CSS media feature ↗
Explains how to respond to a user’s reduced-motion preference. Preserve the information and action even when a decorative animation is reduced or skipped.
Access: Free online
MDN contributors. (n.d.). prefers-reduced-motion CSS media feature. Retrieved October 12, 2026, from Primary source
10 usability heuristics for user interface design ↗
Broad principles such as visible system status, recognition, error prevention, and recoverability help evaluate an interface. Heuristic review complements testing with real users rather than replacing it.
Access: Free online
Nielsen, J. (1994, April 24). 10 usability heuristics for user interface design. Nielsen Norman Group. Primary source
Web accessibility tutorials ↗
Practical guidance on images, tables, forms, menus, and page structure. Connects accessibility criteria with concrete HTML decisions.
Access: Free online
World Wide Web Consortium. (n.d.). Web accessibility tutorials. Retrieved October 12, 2026, from Primary source
Understanding WCAG 2.2 ↗
Explains the intent, benefits, examples, and supporting techniques behind individual criteria. These explanations are informative guidance, distinct from the normative Recommendation.
Access: Free online
World Wide Web Consortium. (n.d.). Understanding WCAG 2.2. Retrieved October 12, 2026, from Primary source
Correctness, testing, and formal methods
Specifying systems: The TLA+ language and tools for hardware and software engineers ↗
A formal route from state transitions to safety, liveness, and model checking. Useful for reasoning about allowed moves, turn ownership, and behavior across failures before writing an implementation.
Access: Author page links a personal-use PDF; commercial book
Lamport, L. (2002). Specifying systems: The TLA+ language and tools for hardware and software engineers. Addison-Wesley. Primary source
Notes on structured programming (2nd ed.; EWD 249) ↗
A classic argument for composing programs so that their correctness remains understandable. This archive displays the April 1970 second edition and identifies the original August 1969 manuscript.
Access: Free online
Dijkstra, E. W. (1970). Notes on structured programming (2nd ed.; EWD 249). E. W. Dijkstra Archive, University of Texas at Austin. Primary source
An axiomatic basis for computer programming ↗
Introduces reasoning with preconditions, commands, and postconditions. A Hoare triple describes what must be true before an operation and what it guarantees afterward.
Access: Original paper hosted for a Carnegie Mellon course
Hoare, C. A. R. (1969). An axiomatic basis for computer programming. Communications of the ACM, 12(10), 576–580, 583. Primary source
Installation ↗
The official entry point to browser automation and testing. Useful for checking the actual rendered interface, interaction, and responsive behavior rather than only a pure function.
Access: Free online
Microsoft. (n.d.). Installation. Retrieved October 12, 2026, from Primary source
Getting started ↗
Introduces a JavaScript and TypeScript test runner. Focused tests can exercise scoring, legal moves, drop probabilities, and game-state transitions without manually replaying an entire game.
Access: Free online
Vitest contributors. (n.d.). Getting started. Retrieved October 12, 2026, from Primary source
Introduction ↗
Introduces property-based testing: generate many inputs and test an invariant. Especially useful for hand layouts, card conservation, and scoring rules across unusual combinations.
Access: Free online
fast-check contributors. (n.d.). Introduction. Retrieved October 12, 2026, from Primary source
Test runner ↗
Documents Node’s built-in test facilities. Provides a lightweight way to verify runtime behavior without introducing a separate test framework for every small component.
Access: Free online
Node.js contributors. (n.d.). Test runner. Retrieved October 12, 2026, from Primary source
Software Foundations ↗
An interactive series connecting logic, functional programming, program semantics, and machine-checked proofs. It is a rigorous progression beyond testing a finite set of examples.
Access: Free online
Software Foundations authors. (n.d.). Software Foundations. Retrieved October 12, 2026, from Primary source
CompCert ↗
An industrial-strength example of a formally verified compiler. Study the scope of its correctness guarantees to see how a proof relates to assumptions and to the rest of a software system.
Access: Free online
CompCert development team. (n.d.). CompCert. Retrieved October 12, 2026, from Primary source
Databases and distributed systems
Designing data-intensive applications ↗
Compares data models, storage systems, replication, transactions, consistency, and stream processing. Read its architectural tradeoffs before assuming a multiplayer service is simply a web page with accounts.
Access: Publisher page; commercial first edition
Kleppmann, M. (2017). Designing data-intensive applications. O’Reilly Media. Primary source
Time, clocks, and the ordering of events in a distributed system ↗
Introduces happened-before relations and logical clocks. It explains why concurrent network events cannot always be ordered by a single wall-clock timestamp.
Access: Free online
Lamport, L. (1978). Time, clocks, and the ordering of events in a distributed system. Communications of the ACM, 21(7), 558–565. Primary source
In search of an understandable consensus algorithm (Extended version) ↗
A primary account of replicated logs, leader election, and agreement across machines. Useful advanced context for durable services, without implying that a small arcade needs to implement Raft itself.
Access: Free online
Ongaro, D., & Ousterhout, J. (2014, May 20). In search of an understandable consensus algorithm (Extended version). Primary source
Paxos made simple ↗
A short foundational explanation of consensus with competing proposals and failures. Compare its safety argument with Raft after learning the difference between agreement and reliable message delivery.
Access: Free online
Lamport, L. (2001). Paxos made simple. ACM SIGACT News, 32(4), 51–58. Primary source
PostgreSQL documentation: Tutorial ↗
Introduces relational tables, SQL queries, updates, and database concepts. A useful path from spreadsheet-like data to explicit schemas and constraints.
Access: Free online
PostgreSQL Global Development Group. (n.d.). PostgreSQL documentation: Tutorial. Retrieved October 12, 2026, from Primary source
PostgreSQL documentation: Transaction isolation ↗
Explains what concurrent transactions may observe under different isolation levels. Relevant to preventing a virtual balance from being spent twice across overlapping requests.
Access: Free online
PostgreSQL Global Development Group. (n.d.). PostgreSQL documentation: Transaction isolation. Retrieved October 12, 2026, from Primary source
Atomic commit in SQLite ↗
Explains how a database coordinates a commit so that it is applied coherently despite interruption. Atomicity is a precise storage guarantee rather than a synonym for general reliability.
Access: Free online
SQLite developers. (n.d.). Atomic commit in SQLite. Retrieved October 12, 2026, from Primary source
Durable Objects documentation ↗
Official documentation for a stateful server-side coordination primitive. Compare a shared authoritative room with clients that each hold their own disconnected local state.
Access: Free online
Cloudflare. (n.d.). Durable Objects documentation. Retrieved October 12, 2026, from Primary source
D1 documentation ↗
Official documentation for Cloudflare’s managed database service. Read together with transaction and schema concepts; a product name alone does not describe the guarantees of a specific application.
Access: Free online
Cloudflare. (n.d.). D1 documentation. Retrieved October 12, 2026, from Primary source
Database system concepts (7th ed.) ↗
A broad database textbook on relational design, queries, transactions, storage, and concurrency. The author-hosted site provides selected chapters, exercises, and teaching materials rather than unrestricted access to every chapter.
Access: Author-hosted companion site; selected free chapters and materials; commercial book
Silberschatz, A., Korth, H. F., & Sudarshan, S. (2019). Database system concepts (7th ed.). McGraw-Hill. Primary source
Foundations and algorithms
Introduction to algorithms (4th ed.) ↗
A rigorous route from pseudocode to correctness, running-time analysis, graphs, dynamic programming, and algorithm design. Useful for reasoning about game searches and efficient data handling.
Access: Publisher page; commercial book; selected supporting materials available
Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2022). Introduction to algorithms (4th ed.). MIT Press. Primary source
The art of computer programming: Vol. 1. Fundamental algorithms (3rd ed.) ↗
A classic mathematical reference for fundamental structures and algorithm analysis. Best approached after introductory programming and discrete mathematics.
Access: Author bibliography; commercial volumes
Knuth, D. E. (1997). The art of computer programming: Vol. 1. Fundamental algorithms (3rd ed.). Addison-Wesley. Primary source
The art of computer programming: Vol. 2. Seminumerical algorithms (3rd ed.) ↗
Mathematical treatments of random numbers and arithmetic illuminate what pseudorandomness means. Useful background for separating a loot-table probability from an informal feeling that a game is fair.
Access: Author bibliography; commercial volume
Knuth, D. E. (1997). The art of computer programming: Vol. 2. Seminumerical algorithms (3rd ed.). Addison-Wesley. Primary source
The art of computer programming: Vol. 3. Sorting and searching (2nd ed.) ↗
A detailed reference on sorting, searching, and the analysis of algorithms. Offers deeper context for indexing collections and finding relevant game records efficiently.
Access: Author bibliography; commercial volume
Knuth, D. E. (1998). The art of computer programming: Vol. 3. Sorting and searching (2nd ed.). Addison-Wesley. Primary source
Open data structures: An introduction ↗
An open textbook with implementations and analysis of lists, queues, trees, hashing, heaps, and graphs. A practical companion to a more expansive algorithms text.
Access: Free authorized PDF on university-press page; print available
Morin, P. (2013). Open data structures: An introduction. Athabasca University Press. Primary source
Programming pearls (2nd ed.) ↗
Problem-solving essays connect data representation, algorithm design, correctness, and performance. A useful antidote to optimizing code before understanding the problem or measuring the cost.
Access: Publisher page; commercial book; samples or supplements may be available
Bentley, J. (1999). Programming pearls (2nd ed.). Addison-Wesley. Primary source
Concrete mathematics: A foundation for computer science (2nd ed.) ↗
Discrete mathematical tools for sums, recurrences, integer functions, counting, and probability. Useful preparation for proving a running-time bound or analyzing a randomized game mechanism.
Access: Publisher page; commercial book; samples or supplements may be available
Graham, R. L., Knuth, D. E., & Patashnik, O. (1994). Concrete mathematics: A foundation for computer science (2nd ed.). Addison-Wesley. Primary source
Algorithms (4th ed.) ↗
An implementation-oriented treatment of data structures, sorting, graphs, and strings. The author’s companion materials connect theoretical analysis with executable examples and test data.
Access: Publisher page; commercial book; samples or supplements may be available
Sedgewick, R., & Wayne, K. (2011). Algorithms (4th ed.). Addison-Wesley. Primary source
Algorithm design ↗
Teaches algorithm design techniques through the problems that motivate them. A valuable route into greedy methods, dynamic programming, networks, and reasoning about tractability.
Access: Publisher page; commercial book; samples or supplements may be available
Kleinberg, J., & Tardos, É. (2005). Algorithm design. Addison-Wesley. Primary source
Graphics, games, and audio
Canvas tutorial ↗
Teaches drawing, transformations, animation, pixel operations, and compositing. It is a practical foundation for two-dimensional browser-game renderers.
Access: Free online
MDN contributors. (n.d.). Canvas tutorial. Retrieved October 12, 2026, from Primary source
Web Audio API ↗
Introduces audio graphs, oscillators, gains, and scheduled sound. Supports explanations of synthesized game feedback and mixing rather than playing a separate file for every effect.
Access: Free online
MDN contributors. (n.d.). Web Audio API. Retrieved October 12, 2026, from Primary source
Physically based rendering: From theory to implementation (4th ed.) ↗
A deeply technical open rendering text connecting geometry, sampling, radiometry, light transport, and implementation. A research-level expansion beyond a two-dimensional canvas effect; it does not imply this website runs an offline path tracer.
Access: Free authorized online text; commercial print edition
Pharr, M., Jakob, W., & Humphreys, G. (2023). Physically based rendering: From theory to implementation (4th ed.). MIT Press. Primary source
Web Audio API 1.1 ↗
The normative audio-graph and processing specification. A deeper reference for scheduling, channels, mixing, and node behavior after an introductory sound-synthesis tutorial.
Access: Free online
World Wide Web Consortium. (2026, September 22). Web Audio API 1.1 [Working Draft]. Primary source
Game development ↗
An index of browser-game techniques and APIs. Start here for the connection among rendering, input, audio, and game logic.
Access: Free online
MDN contributors. (n.d.). Game development. Retrieved October 12, 2026, from Primary source
Window: requestAnimationFrame() method ↗
Schedules a callback around the browser’s rendering cycle. Movement should use elapsed time rather than assume that every device produces the same number of frames each second.
Access: Free online
MDN contributors. (n.d.). Window: requestAnimationFrame() method. Retrieved October 12, 2026, from Primary source
Autoplay guide for media and Web Audio APIs ↗
Explains browser restrictions on audio and media that begin without user interaction. A visible sound control and graceful recovery are part of a reliable sound-enabled interface.
Access: Free online
MDN contributors. (n.d.). Autoplay guide for media and Web Audio APIs. Retrieved October 12, 2026, from Primary source
The book of shaders ↗
An interactive introduction to fragment shaders and procedural visual patterns. A useful connection between small mathematical functions and rich moving textures.
Access: Free online
Gonzalez Vivo, P., & Lowe, J.. (n.d.). The book of shaders. Retrieved October 12, 2026, from Primary source
Fix your timestep! ↗
Explains fixed, variable, and semi-fixed simulation steps and their tradeoffs. Separating simulation from rendering helps make motion and collisions less dependent on a player’s frame rate.
Access: Free online
Fiedler, G. (2004, June 10). Fix your timestep! Gaffer on Games. Primary source
Three.js documentation ↗
The maintainer’s API reference for a JavaScript 3D graphics library. A learning option for scenes, cameras, geometry, and materials; not a claim that every site effect uses Three.js.
Access: Free online
Three.js contributors. (n.d.). Three.js documentation. Retrieved October 12, 2026, from Primary source
What is Phaser? ↗
An official introduction to a dedicated browser-game framework. Compare the services a framework supplies with the custom code a small canvas game must implement.
Access: Free online
Phaser Studio. (n.d.). What is Phaser?. Retrieved October 12, 2026, from Primary source
Programming languages and semantics
Structure and interpretation of computer programs (2nd ed.) ↗
Develops abstraction, higher-order procedures, state, interpreters, and evaluation models through Scheme. The publisher links an authorized open-access edition.
Access: Free authorized edition linked by publisher; print edition available
Abelson, H., Sussman, G. J., & Sussman, J. (1996). Structure and interpretation of computer programs (2nd ed.). MIT Press. Primary source
Types and programming languages ↗
A graduate-level treatment of operational semantics, lambda calculus, subtyping, polymorphism, and type safety. Explains why a type checker can rule out particular classes of mistakes without proving every program correct.
Access: Publisher page; commercial book
Pierce, B. C. (2002). Types and programming languages. MIT Press. Primary source
Practical foundations for programming languages (2nd ed.) ↗
Formalizes syntax, judgments, dynamics, types, and abstraction across language designs. The author provides an abbreviated online edition and supplementary exercises.
Access: Free abbreviated author edition; commercial complete book
Harper, R. (2016). Practical foundations for programming languages (2nd ed.). Cambridge University Press. Primary source
The TypeScript handbook ↗
Teaches structural typing, narrowing, generics, and the relationship between TypeScript and JavaScript. Static checks improve development feedback; generated JavaScript still needs runtime validation.
Access: Free online
Microsoft. (n.d.). The TypeScript handbook. Retrieved October 12, 2026, from Primary source
The C programming language (2nd ed.) ↗
A concise classic on C syntax, pointers, arrays, functions, and program structure. C is valuable background for machine-level reasoning; this book describes an older language standard, so contemporary compiler manuals still matter.
Access: Publisher page; commercial book; sample code available
Kernighan, B. W., & Ritchie, D. M. (1988). The C programming language (2nd ed.). Prentice Hall. Primary source
Compilers: Principles, techniques, and tools (2nd ed.) ↗
The Dragon Book explains lexing, parsing, intermediate representations, optimization, and code generation. It helps distinguish the grammar of a language from what a program means when executed.
Access: Publisher page; commercial book
Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2006). Compilers: Principles, techniques, and tools (2nd ed.). Addison-Wesley. Primary source
ECMAScript language specification (living draft) ↗
The language’s formal reference defines values, evaluation, objects, promises, and execution behavior. The fetched editor’s draft carries a 2027 heading; it is a living draft, not a claim that an ECMAScript 2027 standard has already been ratified.
Access: Free online
Ecma International. (n.d.). ECMAScript language specification (living draft). Retrieved October 12, 2026, from Primary source
The Python tutorial ↗
The official language tutorial covers data structures, control flow, functions, modules, and exceptions. Python is also useful for build helpers and research scripts even when the public website runs JavaScript.
Access: Free online
Python Software Foundation. (n.d.). The Python tutorial. Retrieved October 12, 2026, from Primary source
Learn Rust ↗
The official learning hub links the Rust book, examples, and language references. Ownership and borrowing offer another way to reason about resource lifetimes and safe memory access.
Access: Free online
Rust Project. (n.d.). Learn Rust. Retrieved October 12, 2026, from Primary source
Tutorials ↗
Official introductions to Go programming and common application patterns. A useful comparison language for typed programs and networked systems.
Access: Free online
Go authors. (n.d.). Tutorials. Retrieved October 12, 2026, from Primary source
Concepts, techniques, and models of computer programming ↗
Connects programming paradigms through computation models rather than teaching each language in isolation. Supports deeper comparison among stateful, declarative, concurrent, and constraint-based approaches.
Access: Publisher page; commercial book; samples or supplements may be available
Van Roy, P., & Haridi, S. (2004). Concepts, techniques, and models of computer programming. MIT Press. Primary source
Structure and interpretation of computer programs: JavaScript edition ↗
Adapts the classic abstraction and interpreter material to JavaScript. Compare the conceptual model with the browser’s actual host APIs: the language alone does not supply the DOM, canvas, or audio engine.
Access: Publisher page links an authorized open-access edition; commercial print available
Abelson, H., Sussman, G. J., Henz, M., & Wrigstad, T. (2022). Structure and interpretation of computer programs: JavaScript edition. MIT Press. Primary source
How to design programs: An introduction to programming and computing (2nd ed.) ↗
A systematic design-recipe approach to data definitions, examples, functions, and tests. Offers a strong teaching bridge from beginner syntax to deliberate program construction.
Access: Publisher page; authorized free online edition at htdp.org; print available
Felleisen, M., Findler, R. B., Flatt, M., & Krishnamurthi, S. (2018). How to design programs: An introduction to programming and computing (2nd ed.). MIT Press. Primary source
The C++ programming language (4th ed.) ↗
The language designer’s reference and tutorial on C++11, abstraction, templates, resource management, and concurrency. Historical edition context matters: later C++ standards add features beyond this book.
Access: Publisher page; this print edition is out of print; commercial eBook listed
Stroustrup, B. (2013). The C++ programming language (4th ed.). Addison-Wesley. Primary source
Security and account engineering
A graduate course in applied cryptography ↗
An author-hosted working textbook on encryption, signatures, authenticated protocols, and security definitions. Connects everyday account safety to formal adversarial models and mathematical assumptions.
Access: Free author-hosted draft
Boneh, D., & Shoup, V.. (n.d.). A graduate course in applied cryptography. Retrieved October 12, 2026, from Primary source
Web Authentication: An API for accessing public key credentials—Level 3 ↗
Defines browser-facing public-key authentication ceremonies. Helpful background for passkeys; a specification link does not mean passkeys are already implemented in this arcade.
Access: Free online
World Wide Web Consortium. (2026, August 25). Web Authentication: An API for accessing public key credentials—Level 3 [Recommendation]. Primary source
Web Cryptography Level 2 ↗
Defines cryptographic operations and key interfaces exposed to browser code. Cryptographic primitives need a sound protocol and key management; calling a crypto API alone does not secure an account system.
Access: Free online
World Wide Web Consortium. (2025, April 22). Web Cryptography Level 2 [First Public Working Draft]. Primary source
Same-origin policy ↗
Explains the origin boundary among scheme, host, and port. This matters for embedded games, browser storage, and requests between different services.
Access: Free online
MDN contributors. (n.d.). Same-origin policy. Retrieved October 12, 2026, from Primary source
Content Security Policy (CSP) implementation ↗
A practical guide to constraining what scripts and resources may execute or load. A policy must be tested against the actual hosting environment and application requirements.
Access: Free online
MDN contributors. (n.d.). Content Security Policy (CSP) implementation. Retrieved October 12, 2026, from Primary source
Authentication cheat sheet ↗
Covers authentication, reauthentication, account changes, throttling, and recovery. Use it to distinguish identity verification from authorization to perform an action.
Access: Free online
OWASP Foundation. (n.d.). Authentication cheat sheet. Retrieved October 12, 2026, from Primary source
Password storage cheat sheet ↗
Explains password hashing and suitable work factors. Passwords should not be stored as plaintext or reversibly encrypted merely so a site can email them back.
Access: Free online
OWASP Foundation. (n.d.). Password storage cheat sheet. Retrieved October 12, 2026, from Primary source
Forgot password cheat sheet ↗
Describes secure recovery using controlled reset flows and tokens. Recovery is an authentication boundary, not just an email template.
Access: Free online
OWASP Foundation. (n.d.). Forgot password cheat sheet. Retrieved October 12, 2026, from Primary source
Session management cheat sheet ↗
Covers session identifiers, cookies, lifecycle, and attack prevention. A successful login must be followed by safe handling of the session that represents it.
Access: Free online
OWASP Foundation. (n.d.). Session management cheat sheet. Retrieved October 12, 2026, from Primary source
Cross site scripting prevention cheat sheet ↗
Explains contextual output encoding, safe sinks, and HTML sanitization. Displaying public code examples requires treating them as text rather than executable markup.
Access: Free online
OWASP Foundation. (n.d.). Cross site scripting prevention cheat sheet. Retrieved October 12, 2026, from Primary source
SQL injection prevention cheat sheet ↗
Recommends parameterized queries and appropriate database privileges. A user’s username or form input must remain data rather than become part of an executable SQL command.
Access: Free online
OWASP Foundation. (n.d.). SQL injection prevention cheat sheet. Retrieved October 12, 2026, from Primary source
Digital identity guidelines: Authentication and authenticator management ↗
A standards-body treatment of authenticators, assurance, session management, and recovery. Study the applicable requirements and context rather than treating a checklist as proof that a system is secure.
Access: Free online
National Institute of Standards and Technology. (n.d.). Digital identity guidelines: Authentication and authenticator management. Retrieved October 12, 2026, from Primary source
Software design and engineering classics
The mythical man-month: Essays on software engineering (Anniversary ed.) ↗
Essays on coordination, conceptual integrity, estimates, and the difficulty of changing a complex software system. Read its historical arguments critically; faster code generation does not automatically remove integration and verification work.
Access: Publisher page; commercial book; samples or supplements may be available
Brooks, F. P., Jr. (1995). The mythical man-month: Essays on software engineering (Anniversary ed.). Addison-Wesley. Primary source
Design patterns: Elements of reusable object-oriented software ↗
A classic vocabulary for recurring object-oriented designs and their tradeoffs. Patterns describe a design problem and its forces; they are not a demand to wrap every small function in a class hierarchy.
Access: Publisher page; commercial book; samples or supplements may be available
Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design patterns: Elements of reusable object-oriented software. Addison-Wesley. Primary source
Code complete (2nd ed.) ↗
A broad software-construction reference on design, defensive programming, naming, debugging, and quality. Useful for judging generated code by behavior and maintainability rather than by its apparent sophistication.
Access: Publisher page; commercial book; samples or supplements may be available
McConnell, S. (2004). Code complete (2nd ed.). Microsoft Press. Primary source
The pragmatic programmer: Your journey to mastery (20th anniversary ed.) ↗
Practical essays on requirements, reversibility, tools, duplication, testing, and professional responsibility. Its broad principles help connect a small website change to a disciplined development workflow.
Access: Publisher page; commercial book; samples or supplements may be available
Thomas, D., & Hunt, A. (2019). The pragmatic programmer: Your journey to mastery (20th anniversary ed.). Addison-Wesley. Primary source
Refactoring: Improving the design of existing code (2nd ed.) ↗
Explains behavior-preserving changes through small transformations supported by tests. This edition uses JavaScript examples, which makes its design vocabulary particularly approachable for browser developers.
Access: Publisher page; commercial book; samples or supplements may be available
Fowler, M. (2018). Refactoring: Improving the design of existing code (2nd ed.). Addison-Wesley. Primary source
The practice of programming ↗
A concise classic on style, algorithms, interfaces, debugging, testing, portability, and performance. Especially useful when teaching why readable code and simple interfaces remain valuable across programming languages.
Access: Publisher page; commercial book; samples or supplements may be available
Kernighan, B. W., & Pike, R. (1999). The practice of programming. Addison-Wesley. Primary source
Effective Java (3rd ed.) ↗
A collection of API and language-design lessons on objects, generics, enums, methods, and concurrency. Compare its Java-specific advice with JavaScript’s different semantics rather than transplanting rules blindly.
Access: Publisher page; commercial book; samples or supplements may be available
Bloch, J. (2017). Effective Java (3rd ed.). Addison-Wesley. Primary source
Systems and developer tools
Introduction to Node.js ↗
Explains JavaScript execution outside the browser. This supports understanding build scripts, local test runners, and server programs without confusing them with customer-side scripts.
Access: Free online
Node.js contributors. (n.d.). Introduction to Node.js. Retrieved October 12, 2026, from Primary source
Pro Git (2nd ed.) ↗
An authorized free book on commits, branches, collaboration, and Git internals. Version control records changes and supports comparison and rollback; it is distinct from publication to a live site.
Access: Free online
Chacon, S., & Straub, B. (2014). Pro Git (2nd ed.). Apress. Primary source
Computer systems: A programmer’s perspective (3rd ed.) ↗
Connects programs to data representations, machine instructions, memory hierarchies, processes, networking, and concurrency. Useful for understanding why code, hardware, and operating systems jointly determine behavior.
Access: University textbook page; commercial book; author supplements available
Bryant, R. E., & O’Hallaron, D. R. (2016). Computer systems: A programmer’s perspective (3rd ed.). Pearson. Primary source
Operating systems: Three easy pieces (Version 1.10) ↗
An open textbook organized around virtualization, concurrency, and persistence. Explains scheduling, address spaces, locks, storage, and the operating-system abstractions below application code.
Access: Free author-hosted chapters; paid print/convenience editions optional
Arpaci-Dusseau, R. H., & Arpaci-Dusseau, A. C. (2023). Operating systems: Three easy pieces (Version 1.10). Arpaci-Dusseau Books. Primary source
About Git ↗
Distinguishes Git version control from GitHub’s hosting and collaboration features. Helpful context for source history, review, and sharing code.
Access: Free online
GitHub. (n.d.). About Git. Retrieved October 12, 2026, from Primary source
xv6 teaching operating system ↗
A small teaching operating system with source and a book linked by the course. It makes processes, system calls, virtual memory, and filesystem mechanisms inspectable.
Access: Free online
Massachusetts Institute of Technology. (2025). xv6 teaching operating system. Primary source
Code: The hidden language of computer hardware and software (2nd ed.) ↗
A gradual explanation of how representations, logic gates, memory, and instructions combine into computers. A public-level bridge into the layers beneath a high-level language.
Access: Publisher page; commercial book; samples or supplements may be available
Petzold, C. (2022). Code: The hidden language of computer hardware and software (2nd ed.). Microsoft Press. Primary source
University courses and learning paths
CS50x 2026: CS50’s introduction to computer science ↗
A free course for learners with or without prior experience, spanning C, memory, algorithms, Python, SQL, and web programming. Paid certificates are optional and separate from viewing its public course materials.
Access: Free online
Harvard University. (2026). CS50x 2026: CS50’s introduction to computer science. Primary source
6.006: Introduction to algorithms ↗
Lectures, notes, problems, and solutions on modeling computational problems and analyzing algorithms. Provides an organized bridge from practical code to mathematical reasoning.
Access: Free online
Massachusetts Institute of Technology. (2020). 6.006: Introduction to algorithms. Primary source
6.042J: Mathematics for computer science ↗
Proofs, sets, functions, graphs, state machines, counting, and discrete probability form the mathematical vocabulary of software. Includes an open textbook and exercises.
Access: Free online
Massachusetts Institute of Technology. (2015). 6.042J: Mathematics for computer science. Primary source
The missing semester of your CS education ↗
Teaches practical tools around programming: shells, editors, debugging, version control, and automation. Useful when a learner can write a function but cannot yet navigate a real development workflow.
Access: Free online
Massachusetts Institute of Technology. (n.d.). The missing semester of your CS education. Retrieved October 12, 2026, from Primary source
CS 61A: Structure and interpretation of computer programs (Fall 2026) ↗
Introduces functions, abstraction, recursion, interpreters, and computational models. The public course materials provide a structured complement to the classic SICP text.
Access: Free online
University of California, Berkeley. (2026). CS 61A: Structure and interpretation of computer programs (Fall 2026). Primary source
6.5840: Distributed systems (Spring 2026) ↗
A graduate course organized around distributed systems papers, labs, and failure-aware design. Appropriate after networking and concurrency foundations.
Access: Free online
Massachusetts Institute of Technology. (2026). 6.5840: Distributed systems (Spring 2026). Primary source
CS 144: Introduction to computer networking (Fall 2026) ↗
A university path through datagrams, reliability, byte streams, and TCP. Helps explain what network protocols provide and what a multiplayer application must still enforce.
Access: Free online
Stanford University. (2026). CS 144: Introduction to computer networking (Fall 2026). Primary source
6.045J: Automata, computability, and complexity ↗
Studies the limits of computation, formal languages, and computational complexity. Provides theory behind parsing, state machines, and the distinction between difficult and uncomputable tasks.
Access: Free online
Massachusetts Institute of Technology. (2011). 6.045J: Automata, computability, and complexity. Primary source
18.06: Linear algebra ↗
Vectors, matrices, subspaces, and transformations support graphics and numerical computing. The connection to rotating and projecting an object becomes clearer after the underlying mathematics.
Access: Free online
Massachusetts Institute of Technology. (2010). 18.06: Linear algebra. Primary source
15-445/645: Introduction to database systems (Fall 2024) ↗
An implementation-oriented course covering storage, indexes, query execution, transactions, and concurrency control. A route from using SQL to understanding how a database works.
Access: Free online
Carnegie Mellon University. (2024). 15-445/645: Introduction to database systems (Fall 2024). Primary source
Nand to Tetris ↗
Builds a conceptual computer stack from logic gates through machine language, a compiler, and an operating system. Projects make the layers beneath a high-level language tangible.
Access: Free online
Nisan, N., & Schocken, S.. (n.d.). Nand to Tetris. Retrieved October 12, 2026, from Primary source
Learn web development ↗
An official collection of practical courses on modern web development. Use it alongside standards and MDN to move between conceptual lessons and current implementation patterns.
Access: Free online
Google. (n.d.). Learn web development. Retrieved October 12, 2026, from Primary source
Web programming and browser behavior
Learn web development ↗
A structured entry point to HTML, CSS, JavaScript, accessibility, and development practices. Suitable for readers who want to understand the syntax before studying formal specifications.
Access: Free online
MDN contributors. (n.d.). Learn web development. Retrieved October 12, 2026, from Primary source
JavaScript guide ↗
Explains JavaScript values, control flow, functions, objects, and modules with executable examples. Connect these constructs to event-driven buttons and game state.
Access: Free online
MDN contributors. (n.d.). JavaScript guide. Retrieved October 12, 2026, from Primary source
Quick start ↗
Introduces components, state, events, and data flow. A useful comparison with imperative DOM code: render a view from state instead of manually synchronizing every element.
Access: Free online
React contributors. (n.d.). Quick start. Retrieved October 12, 2026, from Primary source
JavaScript execution model ↗
Explains agents, heaps, stacks, job queues, and the event loop. This model helps analyze why synchronous work can delay input even when asynchronous operations exist.
Access: Free online
MDN contributors. (n.d.). JavaScript execution model. Retrieved October 12, 2026, from Primary source
Pointer events ↗
Practical guidance on mouse, touch, and pen interaction. Pointer capture and touch-action rules are particularly relevant to robust dragging in a game.
Access: Free online
MDN contributors. (n.d.). Pointer events. Retrieved October 12, 2026, from Primary source
ResizeObserver ↗
Observes element-size changes rather than only window changes. Useful when a game frame, dialog, or panel changes size inside a responsive page.
Access: Free online
MDN contributors. (n.d.). ResizeObserver. Retrieved October 12, 2026, from Primary source
Intersection Observer API ↗
Reports intersection with a viewport or container asynchronously. It can support deferring offscreen work and pausing effects that the visitor cannot currently see.
Access: Free online
MDN contributors. (n.d.). Intersection Observer API. Retrieved October 12, 2026, from Primary source
Web Storage API ↗
Describes localStorage and sessionStorage. Browser-local saved preferences or trophies are distinct from authenticated server records and should be explained accordingly.
Access: Free online
MDN contributors. (n.d.). Web Storage API. Retrieved October 12, 2026, from Primary source
Web Workers API ↗
Introduces background execution with message passing. Workers can offload appropriate computation but do not directly manipulate the page’s DOM.
Access: Free online
MDN contributors. (n.d.). Web Workers API. Retrieved October 12, 2026, from Primary source
Web performance ↗
Organizes performance concepts and measurement tools. Measuring load, rendering, and responsiveness is more informative than guessing whether a device needs more RAM.
Access: Free online
MDN contributors. (n.d.). Web performance. Retrieved October 12, 2026, from Primary source
Web standards and layout
HTML standard ↗
The normative living standard for document structure, parsing, forms, embedding, and browser behavior. Read a beginner tutorial before using it to resolve precise implementation questions.
Access: Free online
WHATWG. (n.d.). HTML standard. Retrieved October 12, 2026, from Primary source
DOM standard ↗
Defines the document tree and event model that scripts manipulate. It gives exact meanings to nodes, event dispatch, and tree operations.
Access: Free online
WHATWG. (n.d.). DOM standard. Retrieved October 12, 2026, from Primary source
CSS snapshot 2026 ↗
An index of CSS modules and their maturity, rather than a single tutorial. It helps distinguish a widely implemented feature from work still evolving in a draft.
Access: Free online
World Wide Web Consortium. (2026, June 22). CSS snapshot 2026 [Group Note]. Primary source
CSS Grid Layout Module Level 1 ↗
Defines two-dimensional layout, track sizing, placement, and alignment. The cited March 26, 2025 document is a Candidate Recommendation Draft, not a claim that every discussed feature has identical browser support.
Access: Free online
World Wide Web Consortium. (2025, March 26). CSS Grid Layout Module Level 1 [Candidate Recommendation Draft]. Primary source
CSS Flexible Box Layout Module Level 1 ↗
Defines one-dimensional flexible layout and its sizing rules. Useful for diagnosing wrapping, shrinking, and overflow instead of repeatedly guessing at margins.
Access: Free online
World Wide Web Consortium. (2025, October 14). CSS Flexible Box Layout Module Level 1 [Candidate Recommendation Draft]. Primary source
CSS Animations Level 1 ↗
Specifies keyframes, durations, delays, iteration, and animation events. Exact timing terminology helps explain how several visual effects can overlap without starting simultaneously.
Access: Free online
World Wide Web Consortium. (2023, March 2). CSS Animations Level 1 [Working Draft]. Primary source
Web Animations ↗
Defines the animation timing model and programmatic control of effects. Useful for pause, replay, cancellation, and compositing rather than accumulating unmanaged timers.
Access: Free online
World Wide Web Consortium. (2023, June 5). Web Animations [Working Draft]. Primary source
Scalable Vector Graphics (SVG) 2 ↗
Describes vector shapes, coordinate systems, painting, text, and interaction. Vector effects remain distinct from generated raster photographs and can scale without the same pixel-resolution limit.
Access: Free online
World Wide Web Consortium. (2026, October 6). Scalable Vector Graphics (SVG) 2 [Candidate Recommendation Snapshot]. Primary source
Pointer Events ↗
Unifies mouse, touch, and pen input through pointer identities and capture. Relevant to drag interactions that must survive motion outside their original element.
Access: Free online
World Wide Web Consortium. (2026, June 30). Pointer Events [Recommendation]. Primary source
Fullscreen API standard ↗
Defines fullscreen requests, permissions, and lifecycle behavior. Browser fullscreen and a CSS layout that fills the window are related experiences with different technical guarantees.
Access: Free online
WHATWG. (n.d.). Fullscreen API standard. Retrieved October 12, 2026, from Primary source
Fetch standard ↗
The browser request model covers headers, responses, origins, credentials, and cross-origin controls. Useful for understanding why a request that works on a server may be restricted in a browser.
Access: Free online
WHATWG. (n.d.). Fetch standard. Retrieved October 12, 2026, from Primary source
URL standard ↗
Specifies parsing and serialization of web addresses. It explains how relative paths, percent encoding, and URL components should be handled consistently.
Access: Free online
WHATWG. (n.d.). URL standard. Retrieved October 12, 2026, from Primary source
Media Queries Level 5 ↗
Defines conditions for responsive styles and user preferences. Useful for adapting layout, interaction, and motion to the user’s environment rather than simply shrinking desktop content.
Access: Free online
World Wide Web Consortium. (2026, February 19). Media Queries Level 5 [Working Draft]. Primary source
APA-style references use a retrieval date for living material and verified edition information for fixed books. Access notes distinguish freely available material from commercial books. This notebook links sources and writes its own explanations; it does not reproduce their copyrighted chapters.
Another view of the same library
The interactive reference table.
| Introduction to algorithms (4th ed.) | Foundations and algorithms | Undergraduate–Graduate | Publisher page; commercial book; selected supporting materials available |
| Structure and interpretation of computer programs (2nd ed.) | Programming languages and semantics | Undergraduate–Graduate | Free authorized edition linked by publisher; print edition available |
| Types and programming languages | Programming languages and semantics | Graduate–Research | Publisher page; commercial book |
| The art of computer programming: Vol. 1. Fundamental algorithms (3rd ed.) | Foundations and algorithms | Graduate–Research | Author bibliography; commercial volumes |
| Practical foundations for programming languages (2nd ed.) | Programming languages and semantics | Graduate–Research | Free abbreviated author edition; commercial complete book |
| HTML standard | Web standards and layout | Intermediate–Research | Free online |
| DOM standard | Web standards and layout | Intermediate–Research | Free online |
| CSS snapshot 2026 | Web standards and layout | Intermediate–Research | Free online |
| Web Content Accessibility Guidelines (WCAG) 2.2 | Accessibility and human-computer interaction | All levels | Free online |
| ARIA authoring practices guide | Accessibility and human-computer interaction | Intermediate | Free online |
| Learn web development | Web programming and browser behavior | Beginner | Free online |
| JavaScript guide | Web programming and browser behavior | Beginner–Intermediate | Free online |
| The TypeScript handbook | Programming languages and semantics | Intermediate | Free online |
| Quick start | Web programming and browser behavior | Intermediate | Free online |
| Introduction to Node.js | Systems and developer tools | Beginner–Intermediate | Free online |
| Pro Git (2nd ed.) | Systems and developer tools | Beginner–Advanced | Free online |
| Canvas tutorial | Graphics, games, and audio | Intermediate | Free online |
| Web Audio API | Graphics, games, and audio | Intermediate–Advanced | Free online |
| CS50x 2026: CS50’s introduction to computer science | University courses and learning paths | Beginner–Undergraduate | Free online |
| 6.006: Introduction to algorithms | University courses and learning paths | Undergraduate | Free online |
| The art of computer programming: Vol. 2. Seminumerical algorithms (3rd ed.) | Foundations and algorithms | Graduate–Research | Author bibliography; commercial volume |
| The art of computer programming: Vol. 3. Sorting and searching (2nd ed.) | Foundations and algorithms | Graduate–Research | Author bibliography; commercial volume |
| The C programming language (2nd ed.) | Programming languages and semantics | Undergraduate–Advanced | Publisher page; commercial book; sample code available |
| Compilers: Principles, techniques, and tools (2nd ed.) | Programming languages and semantics | Undergraduate–Graduate | Publisher page; commercial book |
| Computer systems: A programmer’s perspective (3rd ed.) | Systems and developer tools | Undergraduate–Graduate | University textbook page; commercial book; author supplements available |
| Open data structures: An introduction | Foundations and algorithms | Undergraduate | Free authorized PDF on university-press page; print available |
| Operating systems: Three easy pieces (Version 1.10) | Systems and developer tools | Undergraduate–Graduate | Free author-hosted chapters; paid print/convenience editions optional |
| Designing data-intensive applications | Databases and distributed systems | Advanced–Graduate | Publisher page; commercial first edition |
| Specifying systems: The TLA+ language and tools for hardware and software engineers | Correctness, testing, and formal methods | Graduate–Research | Author page links a personal-use PDF; commercial book |
| Notes on structured programming (2nd ed.; EWD 249) | Correctness, testing, and formal methods | Advanced–Graduate | Free online |
| An axiomatic basis for computer programming | Correctness, testing, and formal methods | Graduate–Research | Original paper hosted for a Carnegie Mellon course |
| Time, clocks, and the ordering of events in a distributed system | Databases and distributed systems | Graduate–Research | Free online |
| In search of an understandable consensus algorithm (Extended version) | Databases and distributed systems | Graduate–Research | Free online |
| Paxos made simple | Databases and distributed systems | Graduate–Research | Free online |
| A graduate course in applied cryptography | Security and account engineering | Graduate–Research | Free author-hosted draft |
| The design of everyday things (Revised and expanded ed.) | Accessibility and human-computer interaction | All levels | Publisher page; commercial book |
| Physically based rendering: From theory to implementation (4th ed.) | Graphics, games, and audio | Graduate–Research | Free authorized online text; commercial print edition |
| 6.042J: Mathematics for computer science | University courses and learning paths | Undergraduate | Free online |
| The missing semester of your CS education | University courses and learning paths | Beginner–Intermediate | Free online |
| CS 61A: Structure and interpretation of computer programs (Fall 2026) | University courses and learning paths | Undergraduate | Free online |
| 6.5840: Distributed systems (Spring 2026) | University courses and learning paths | Graduate | Free online |
| CS 144: Introduction to computer networking (Fall 2026) | University courses and learning paths | Undergraduate | Free online |
| 6.045J: Automata, computability, and complexity | University courses and learning paths | Undergraduate–Graduate | Free online |
| 18.06: Linear algebra | University courses and learning paths | Undergraduate | Free online |
| 15-445/645: Introduction to database systems (Fall 2024) | University courses and learning paths | Advanced Undergraduate–Graduate | Free online |
| Nand to Tetris | University courses and learning paths | Undergraduate | Free online |
| CSS Grid Layout Module Level 1 | Web standards and layout | Advanced–Research | Free online |
| CSS Flexible Box Layout Module Level 1 | Web standards and layout | Advanced | Free online |
| CSS Animations Level 1 | Web standards and layout | Advanced | Free online |
| Web Animations | Web standards and layout | Advanced–Research | Free online |
| Scalable Vector Graphics (SVG) 2 | Web standards and layout | Advanced | Free online |
| Web Audio API 1.1 | Graphics, games, and audio | Advanced–Research | Free online |
| Pointer Events | Web standards and layout | Advanced | Free online |
| Fullscreen API standard | Web standards and layout | Advanced | Free online |
| Fetch standard | Web standards and layout | Advanced–Research | Free online |
| URL standard | Web standards and layout | Advanced | Free online |
| ECMAScript language specification (living draft) | Programming languages and semantics | Advanced–Research | Free online |
| Web Authentication: An API for accessing public key credentials—Level 3 | Security and account engineering | Advanced–Research | Free online |
| Web Cryptography Level 2 | Security and account engineering | Advanced–Research | Free online |
| Media Queries Level 5 | Web standards and layout | Advanced | Free online |
| Game development | Graphics, games, and audio | Beginner–Intermediate | Free online |
| Window: requestAnimationFrame() method | Graphics, games, and audio | Intermediate | Free online |
| JavaScript execution model | Web programming and browser behavior | Advanced | Free online |
| Pointer events | Web programming and browser behavior | Intermediate | Free online |
| prefers-reduced-motion CSS media feature | Accessibility and human-computer interaction | Intermediate | Free online |
| ResizeObserver | Web programming and browser behavior | Intermediate | Free online |
| Intersection Observer API | Web programming and browser behavior | Intermediate | Free online |
| Web Storage API | Web programming and browser behavior | Intermediate | Free online |
| Web Workers API | Web programming and browser behavior | Intermediate–Advanced | Free online |
| Web performance | Web programming and browser behavior | Intermediate–Advanced | Free online |
| Autoplay guide for media and Web Audio APIs | Graphics, games, and audio | Intermediate | Free online |
| Same-origin policy | Security and account engineering | Intermediate–Advanced | Free online |
| Content Security Policy (CSP) implementation | Security and account engineering | Advanced | Free online |
| Authentication cheat sheet | Security and account engineering | Intermediate–Advanced | Free online |
| Password storage cheat sheet | Security and account engineering | Intermediate–Advanced | Free online |
| Forgot password cheat sheet | Security and account engineering | Intermediate–Advanced | Free online |
| Session management cheat sheet | Security and account engineering | Intermediate–Advanced | Free online |
| Cross site scripting prevention cheat sheet | Security and account engineering | Intermediate–Advanced | Free online |
| SQL injection prevention cheat sheet | Security and account engineering | Intermediate–Advanced | Free online |
| Digital identity guidelines: Authentication and authenticator management | Security and account engineering | Advanced–Research | Free online |
| PostgreSQL documentation: Tutorial | Databases and distributed systems | Beginner–Intermediate | Free online |
| PostgreSQL documentation: Transaction isolation | Databases and distributed systems | Advanced–Graduate | Free online |
| Atomic commit in SQLite | Databases and distributed systems | Advanced–Graduate | Free online |
| Durable Objects documentation | Databases and distributed systems | Advanced | Free online |
| D1 documentation | Databases and distributed systems | Intermediate–Advanced | Free online |
| The book of shaders | Graphics, games, and audio | Intermediate–Advanced | Free online |
| Fix your timestep! | Graphics, games, and audio | Intermediate–Advanced | Free online |
| Three.js documentation | Graphics, games, and audio | Intermediate–Advanced | Free online |
| What is Phaser? | Graphics, games, and audio | Intermediate | Free online |
| Installation | Correctness, testing, and formal methods | Intermediate | Free online |
| Getting started | Correctness, testing, and formal methods | Intermediate | Free online |
| Introduction | Correctness, testing, and formal methods | Intermediate–Advanced | Free online |
| Test runner | Correctness, testing, and formal methods | Intermediate | Free online |
| Software Foundations | Correctness, testing, and formal methods | Graduate–Research | Free online |
| CompCert | Correctness, testing, and formal methods | Graduate–Research | Free online |
| 10 usability heuristics for user interface design | Accessibility and human-computer interaction | All levels | Free online |
| Web accessibility tutorials | Accessibility and human-computer interaction | Beginner–Intermediate | Free online |
| Understanding WCAG 2.2 | Accessibility and human-computer interaction | Intermediate | Free online |
| Learn web development | University courses and learning paths | Beginner–Advanced | Free online |
| The Python tutorial | Programming languages and semantics | Beginner–Intermediate | Free online |
| Learn Rust | Programming languages and semantics | Intermediate–Advanced | Free online |
| Tutorials | Programming languages and semantics | Intermediate | Free online |
| About Git | Systems and developer tools | Beginner | Free online |
| xv6 teaching operating system | Systems and developer tools | Advanced Undergraduate–Graduate | Free online |
| ChatGPT and Codex documentation | AI-assisted software development | All levels | Free online |
| Prompting | AI-assisted software development | Beginner–Advanced | Free online |
| Custom instructions with AGENTS.md | AI-assisted software development | Intermediate | Free online |
| Codex security | AI-assisted software development | Intermediate–Advanced | Free online |
| Working with evals | AI-assisted software development | Advanced | Free online |
| Function calling | AI-assisted software development | Advanced | Free online |
| The mythical man-month: Essays on software engineering (Anniversary ed.) | Software design and engineering classics | Intermediate–Graduate | Publisher page; commercial book; samples or supplements may be available |
| Design patterns: Elements of reusable object-oriented software | Software design and engineering classics | Intermediate–Advanced | Publisher page; commercial book; samples or supplements may be available |
| Code complete (2nd ed.) | Software design and engineering classics | Intermediate–Advanced | Publisher page; commercial book; samples or supplements may be available |
| The pragmatic programmer: Your journey to mastery (20th anniversary ed.) | Software design and engineering classics | Intermediate–Advanced | Publisher page; commercial book; samples or supplements may be available |
| Refactoring: Improving the design of existing code (2nd ed.) | Software design and engineering classics | Intermediate–Advanced | Publisher page; commercial book; samples or supplements may be available |
| The practice of programming | Software design and engineering classics | Intermediate–Advanced | Publisher page; commercial book; samples or supplements may be available |
| Programming pearls (2nd ed.) | Foundations and algorithms | Undergraduate–Advanced | Publisher page; commercial book; samples or supplements may be available |
| Concrete mathematics: A foundation for computer science (2nd ed.) | Foundations and algorithms | Advanced Undergraduate–Graduate | Publisher page; commercial book; samples or supplements may be available |
| Algorithms (4th ed.) | Foundations and algorithms | Undergraduate–Advanced | Publisher page; commercial book; samples or supplements may be available |
| Algorithm design | Foundations and algorithms | Undergraduate–Graduate | Publisher page; commercial book; samples or supplements may be available |
| Code: The hidden language of computer hardware and software (2nd ed.) | Systems and developer tools | Beginner–Undergraduate | Publisher page; commercial book; samples or supplements may be available |
| Concepts, techniques, and models of computer programming | Programming languages and semantics | Advanced Undergraduate–Graduate | Publisher page; commercial book; samples or supplements may be available |
| Structure and interpretation of computer programs: JavaScript edition | Programming languages and semantics | Undergraduate–Graduate | Publisher page links an authorized open-access edition; commercial print available |
| How to design programs: An introduction to programming and computing (2nd ed.) | Programming languages and semantics | Beginner–Undergraduate | Publisher page; authorized free online edition at htdp.org; print available |
| Database system concepts (7th ed.) | Databases and distributed systems | Undergraduate–Graduate | Author-hosted companion site; selected free chapters and materials; commercial book |
| The C++ programming language (4th ed.) | Programming languages and semantics | Advanced Undergraduate–Graduate | Publisher page; this print edition is out of print; commercial eBook listed |
| Effective Java (3rd ed.) | Software design and engineering classics | Intermediate–Advanced | Publisher page; commercial book; samples or supplements may be available |
| Pattern recognition and machine learning | AI-assisted software development | Advanced Undergraduate–Research | Author’s institutional page links an authorized full PDF; commercial print available |
CSV files can be opened by spreadsheet programs. Export uses the currently visible rows; it contains public bibliographic information and saves locally.
October 12, 2026 · Building this notebook
The page teaches its own construction.
This living journal began on October 12, 2026. Earlier dated entries were reconstructed from release records and public checks. Early manual editor work remains an approximate recollection. Historical feature links open today’s version of a page, rather than a preserved snapshot.
A Python renderer combines reviewed chapter, glossary, reference, and release data into a static HTML document. Text is escaped before it becomes markup. That makes the examples readable as code instead of executing them. Narrow CSS selectors keep the teal, cream, and gold design inside this notebook. Ordinary JavaScript connects labeled controls to explicit state and calculations.
Escaping a teaching example
from html import escape
def display_code(source):
return "<pre><code>" + escape(source, quote=True) + "</code></pre>
The library filters compute a predicate over each resource’s title, author, subjects, and reading level. Sorting permutes rows without changing their resource identity. The CSV exporter quotes cells, preserves embedded quotes, and prevents leading spreadsheet formula characters from being interpreted as formulas. The timing lab and budget sheet operate on numerical models rather than live restaurant or account data.
The notebook’s interactive source
These are the actual script components for this edition. They are displayed as text. Read the comments and the preceding chapter explanations, then experiment in your own local test page.
learning.js
(function(){
'use strict';
var root=document.getElementById('kb-build-lab');
if(!root||root.dataset.ready==='true')return;
root.dataset.ready='true';
var chapters=Array.from(root.querySelectorAll('.kbl-chapter'));
var status=root.querySelector('#kbl-copy-status');
root.querySelector('#kbl-expand').addEventListener('click',function(){chapters.forEach(function(el){el.open=true;});});
root.querySelector('#kbl-compact').addEventListener('click',function(){chapters.forEach(function(el){el.open=false;});});
root.querySelectorAll('[data-jump]').forEach(function(a){a.addEventListener('click',function(){var target=root.querySelector(a.getAttribute('href'));if(target&&target.tagName==='DETAILS')target.open=true;});});
root.querySelectorAll('[data-copy]').forEach(function(button){button.addEventListener('click',async function(){var code=root.querySelector('#'+button.dataset.copy);try{if(!code||!navigator.clipboard)throw new Error('clipboard unavailable');await navigator.clipboard.writeText(code.textContent);status.textContent='Code copied. Read and test it before adapting it.';}catch(error){status.textContent='Copy is unavailable here. Select the code and use your usual Copy command.';}});});
function filter(section,input,select){
var cards=Array.from(root.querySelectorAll(section+' [data-search]'));
var text=root.querySelector(input),level=root.querySelector(select),count=root.querySelector(section+' .kbl-results'),empty=root.querySelector(section+' .kbl-empty');
function apply(){var q=text.value.toLocaleLowerCase().trim();var chosen=level.value;var visible=0;cards.forEach(function(card){var match=(!q||card.dataset.search.includes(q))&&(!chosen||card.dataset.level.includes(chosen));card.hidden=!match;if(match)visible++;});count.textContent=visible+' of '+cards.length+' entries shown';empty.hidden=visible!==0;}
text.addEventListener('input',apply);level.addEventListener('change',apply);apply();
}
filter('#kbl-library','#kbl-library-search','#kbl-library-level');
filter('#kbl-glossary','#kbl-glossary-search','#kbl-glossary-level');
var mode='idle',steps=0;
var transitions={idle:{start:'running',reset:'idle'},running:{pause:'paused',reset:'idle'},paused:{resume:'running',reset:'idle'}};
function renderState(){root.querySelectorAll('[data-state]').forEach(function(el){el.setAttribute('aria-current',String(el.dataset.state===mode));});root.querySelector('#kbl-state-status').textContent='State: '+mode+' · accepted simulation steps: '+steps;root.querySelectorAll('[data-command]').forEach(function(button){var command=button.dataset.command;button.disabled=command==='step'?mode!=='running':!transitions[mode][command];});}
root.querySelectorAll('[data-command]').forEach(function(button){button.addEventListener('click',function(){var command=button.dataset.command;if(command==='step'){if(mode==='running')steps++;}else if(transitions[mode][command]){mode=transitions[mode][command];if(command==='reset')steps=0;}renderState();});});renderState();
var clock=root.querySelector('#kbl-clock');
function renderClock(){var time=Number(clock.value);root.querySelector('#kbl-clock-status').textContent='Elapsed time: '+time+' milliseconds';root.querySelectorAll('[data-flight]').forEach(function(row){var i=Number(row.dataset.flight),launch=450+i*120,impact=1650+i*720;var phase=time<launch?'Waiting':time<impact?'In flight':'Arrived';var fraction=Math.max(0,Math.min(1,(time-launch)/(impact-launch)));row.querySelector('[data-phase]').textContent=phase;row.querySelector('[data-progress]').textContent=Math.round(fraction*100)+'%';});}clock.addEventListener('input',renderClock);renderClock();
root.querySelector('#kbl-print').addEventListener('click',function(){chapters.forEach(function(el){el.open=true;});window.print();});
var destination=null;
try{destination=location.hash&&document.getElementById(decodeURIComponent(location.hash.slice(1)));}catch(error){destination=null;}
if(destination&&!root.contains(destination))destination=null;
if(destination&&destination.tagName==='DETAILS')destination.open=true;
}());
learning-workbench.js
(function(){'use strict';var root=document.getElementById('kb-build-lab');if(!root)return;
var table=root.querySelector('#kbl-catalog-table');
if(table){var rows=Array.from(table.tBodies[0].rows),search=root.querySelector('#kbl-table-search'),status=root.querySelector('#kbl-table-status');
function filter(){var q=search.value.trim().toLocaleLowerCase(),n=0;rows.forEach(function(row){row.hidden=!!q&&!(row.dataset.search||row.textContent).toLocaleLowerCase().includes(q);if(!row.hidden)n++;});status.textContent=n+' of '+rows.length+' resources in the table';}
search.addEventListener('input',filter);filter();
table.querySelectorAll('[data-sort]').forEach(function(button){button.addEventListener('click',function(){var column=Number(button.dataset.sort),ascending=button.dataset.direction!=='asc';table.querySelectorAll('th').forEach(function(th){th.removeAttribute('aria-sort');});button.parentElement.setAttribute('aria-sort',ascending?'ascending':'descending');button.dataset.direction=ascending?'asc':'desc';rows.sort(function(a,b){return a.cells[column].textContent.localeCompare(b.cells[column].textContent,undefined,{numeric:true})*(ascending?1:-1);});rows.forEach(function(row){table.tBodies[0].appendChild(row);});filter();});});
root.querySelector('#kbl-export-csv').addEventListener('click',function(){function cell(value){value=String(value);if(/^[=+@-]/.test(value))value="'"+value;return '"'+value.replace(/"/g,'""')+'"';}var records=[['Title','Category','Level','Access','Primary URL']];rows.filter(function(row){return!row.hidden;}).forEach(function(row){records.push(Array.from(row.cells).map(function(td){return td.textContent.trim();}).concat(row.querySelector('a').href));});var url=URL.createObjectURL(new Blob(['\uFEFF'+records.map(function(row){return row.map(cell).join(',');}).join('\r\n')],{type:'text/csv;charset=utf-8'}));var link=document.createElement('a');link.href=url;link.download='Ka-bobs-Code-Reference-Library.csv';link.click();setTimeout(function(){URL.revokeObjectURL(url);},1000);status.textContent='Reference table exported as CSV. Open it in Excel, Numbers, LibreOffice, or another spreadsheet app.';});}
var sheet=root.querySelector('#kbl-frame-sheet');if(sheet){function recalc(){var fps=Number(root.querySelector('#kbl-fps').value),budget=1000/fps,total=0;sheet.querySelectorAll('[data-cost]').forEach(function(input){var v=Number(input.value);total+=Number.isFinite(v)?Math.max(0,Math.min(1000,v)):0;});var margin=budget-total;root.querySelector('#kbl-budget-result').textContent='Frame budget: '+budget.toFixed(2)+' ms · estimated work: '+total.toFixed(2)+' ms · '+(margin>=0?'headroom: '+margin.toFixed(2)+' ms':'over budget by '+(-margin).toFixed(2)+' ms')+'. These are your teaching estimates, not a measurement of this device.';}sheet.addEventListener('input',recalc);root.querySelector('#kbl-fps').addEventListener('change',recalc);recalc();}
}());
learning-art.js
(function () {
'use strict';
var root = document.getElementById('kb-build-lab');
if (!root || root.dataset.artHook === 'true') return;
root.dataset.artHook = 'true';
var activeCleanup = null;
function init() {
if (activeCleanup || !root.isConnected) return;
var canvas = root.querySelector('#kbl-art-canvas');
var pause = root.querySelector('#kbl-art-pause');
var options = root.querySelector('#kbl-art-options');
var panel = root.querySelector('#kbl-art-drawer');
var close = root.querySelector('#kbl-art-close');
var motion = root.querySelector('#kbl-art-motion');
var density = root.querySelector('#kbl-art-density');
var status = root.querySelector('#kbl-art-status');
var snowy = root.querySelector('#kbl-snowy');
if (!canvas || !pause || !options || !panel || !close || !motion || !density || !status) return;
var ctx = canvas.getContext('2d');
if (!ctx) { status.textContent = 'Canvas artwork is unavailable. The learning page is ready.'; pause.disabled = true; options.disabled = true; return; }
var reduce = window.matchMedia('(prefers-reduced-motion: reduce)');
var controller = new AbortController();
var signal = controller.signal;
var enabled = !reduce.matches;
var explicitMotion = false;
var inView = true;
var width = 0, height = 0, pixelRatio = 1;
var frameId = 0, lastPaint = 0, elapsed = 0, disposed = false;
var snow = [], lastSnow = -Infinity;
var count = window.innerWidth < 600 ? 3 : 5;
density.value = String(count);
motion.checked = enabled;
var observer = null, resizeObserver = null, classObserver = null;
function listen(target, type, handler, opts) {
target.addEventListener(type, handler, Object.assign({ signal: signal }, opts || {}));
}
function allowed() {
return enabled && inView && !document.hidden && !root.classList.contains('kbl-no-motion') && root.isConnected;
}
function updateControls() {
pause.textContent = enabled ? 'Pause art' : 'Resume art';
pause.setAttribute('aria-pressed', String(!enabled));
motion.checked = enabled;
status.textContent = enabled ? 'Gentle Canvas motion · no sound' : 'Still Canvas illustration · no sound';
}
function hidePanel(restoreFocus) {
panel.hidden = true;
options.setAttribute('aria-expanded', 'false');
if (restoreFocus && root.contains(document.activeElement)) options.focus();
}
function showPanel() {
panel.hidden = false;
options.setAttribute('aria-expanded', 'true');
close.focus();
}
function feather(x, y, scale, angle, phase) {
ctx.save(); ctx.translate(x, y); ctx.rotate(angle); ctx.scale(scale, scale);
ctx.lineWidth = 1.1;
ctx.strokeStyle = 'rgba(220,188,111,.22)';
ctx.beginPath();ctx.moveTo(0,180);ctx.bezierCurveTo(-6,90,6,-10,0,-150);ctx.stroke();
for (var k = 0; k < 11; k++) {
var py = 112-k*23;
var reach = 30 + Math.sin((k/11)*Math.PI)*62;
ctx.strokeStyle = k%2 ? 'rgba(90,185,165,.16)' : 'rgba(220,188,111,.17)';
ctx.beginPath();ctx.moveTo(0,py);ctx.bezierCurveTo(-reach*.25,py-8,-reach,py-45,-reach*.85,py-66);ctx.stroke();
ctx.beginPath();ctx.moveTo(0,py);ctx.bezierCurveTo(reach*.25,py-8,reach,py-45,reach*.85,py-66);ctx.stroke();
}
ctx.translate(0,-112);ctx.rotate(Math.sin(phase)*.04);
ctx.fillStyle='rgba(29,127,112,.1)';ctx.strokeStyle='rgba(214,185,105,.25)';
ctx.beginPath();ctx.ellipse(0,0,37,57,0,0,Math.PI*2);ctx.fill();ctx.stroke();
ctx.strokeStyle='rgba(95,208,181,.22)';ctx.beginPath();ctx.ellipse(0,-3,24,39,0,0,Math.PI*2);ctx.stroke();
ctx.fillStyle='rgba(12,37,52,.22)';ctx.strokeStyle='rgba(214,185,105,.25)';
ctx.beginPath();ctx.ellipse(0,-6,12,22,0,0,Math.PI*2);ctx.fill();ctx.stroke();
ctx.restore();
}
function draw(time, dt) {
if (!width || !height) return;
ctx.setTransform(pixelRatio,0,0,pixelRatio,0,0);ctx.clearRect(0,0,width,height);
for (var i = 0; i < count; i++) {
var phase = time/43+i*1.37;
var x = width*(.12+.76*(i/Math.max(1,count-1))) + Math.sin(phase)*width*.018;
var y = height*(.26+(i%3)*.23);
var scale = Math.min(width/1000,.95)*(.84+(i%3)*.1);
feather(x,y,scale,Math.sin(time/37+i)*.075+(i%2?-.29:.29),phase);
}
if (dt > 0) {
snow = snow.filter(function (flake) {
flake.age = Math.max(0,(performance.now()-flake.born)/1000);flake.y += flake.speed*dt;
flake.x += Math.sin(flake.age*1.6+flake.phase)*7*dt;
return flake.age < flake.life && flake.y < height+12;
});
}
snow.forEach(function (flake) {
var fade = Math.min(1,flake.age/.25,(flake.life-flake.age)/1.3);
ctx.save();ctx.translate(flake.x,flake.y);ctx.rotate(flake.phase+flake.age*.2);
ctx.strokeStyle='rgba(231,247,236,'+(Math.max(0,fade)*.6)+')';ctx.lineWidth=.8;
for(var branch=0;branch<3;branch++){ctx.rotate(Math.PI/3);ctx.beginPath();ctx.moveTo(-flake.size,0);ctx.lineTo(flake.size,0);ctx.stroke();}
ctx.restore();
});
}
function resize() {
var box = canvas.getBoundingClientRect();
width = Math.max(1,Math.round(box.width));height = Math.max(1,Math.round(box.height));
pixelRatio = Math.min(window.devicePixelRatio || 1,1.5,Math.sqrt(2000000/(width*height)));
canvas.width = Math.max(1,Math.round(width*pixelRatio));canvas.height = Math.max(1,Math.round(height*pixelRatio));
draw(enabled?elapsed:0,0);
}
function stop() { if(frameId)window.cancelAnimationFrame(frameId);frameId=0;lastPaint=0; }
function loop(timestamp) {
frameId = 0;
if(disposed || !allowed()){if(!root.isConnected)cleanup();return;}
if(!lastPaint)lastPaint=timestamp;
var gap=timestamp-lastPaint;
if(gap>=50){var dt=Math.min(.1,gap/1000);lastPaint=timestamp;elapsed+=dt;draw(elapsed,dt);}
frameId=window.requestAnimationFrame(loop);
}
function reconcile() {
if(allowed()){if(!frameId){lastPaint=0;frameId=window.requestAnimationFrame(loop);}}
else {stop();snow=[];draw(enabled?elapsed:0,0);}
}
function setMotion(value, explicit) {
enabled=Boolean(value);if(explicit)explicitMotion=true;
if(!enabled)snow=[];
updateControls();reconcile();
}
function snowfall() {
if(!snowy)return;
if(!allowed()){status.textContent='Art is paused. Resume art for the brief snow effect.';return;}
var now=performance.now();if(now-lastSnow<7000)return;lastSnow=now;
var word=snowy.getBoundingClientRect(),box=canvas.getBoundingClientRect();
var sourceX=word.left-box.left+word.width/2, sourceY=word.bottom-box.top;
if(sourceY < -20 || sourceY > height)return;
snow=[];
for(var n=0;n<24;n++)snow.push({x:sourceX+(Math.random()-.5)*Math.max(24,word.width),y:sourceY-6,age:0,born:now,life:4.8+Math.random()*1.2,speed:20+Math.random()*26,phase:Math.random()*Math.PI*2,size:1.8+Math.random()*2});
status.textContent='A brief snowfall from the word · ends within six seconds · no sound';
reconcile();
}
function cleanup() {
if(disposed)return;disposed=true;stop();snow=[];
if(observer)observer.disconnect();if(resizeObserver)resizeObserver.disconnect();if(classObserver)classObserver.disconnect();
controller.abort();panel.hidden=true;options.setAttribute('aria-expanded','false');activeCleanup=null;
}
activeCleanup=cleanup;
listen(pause,'click',function(){setMotion(!enabled,true);});
listen(motion,'change',function(){setMotion(motion.checked,true);});
listen(density,'change',function(){count=[3,5,8].includes(Number(density.value))?Number(density.value):5;draw(enabled?elapsed:0,0);});
listen(options,'click',function(){if(panel.hidden)showPanel();else hidePanel(true);});
listen(close,'click',function(){hidePanel(true);});
listen(document,'keydown',function(event){if(event.key==='Escape'&&!panel.hidden){event.preventDefault();hidePanel(true);}});
listen(document,'visibilitychange',reconcile);
listen(window,'resize',resize,{passive:true});
listen(window,'pagehide',cleanup);
listen(window,'beforeprint',function(){stop();});
listen(window,'afterprint',reconcile);
listen(reduce,'change',function(){if(!explicitMotion)setMotion(!reduce.matches,false);});
if(snowy){
var nativeButton=snowy.tagName==='BUTTON';
if(!nativeButton){snowy.setAttribute('role','button');snowy.setAttribute('tabindex','0');listen(snowy,'keydown',function(event){if(event.key==='Enter'||event.key===' '){event.preventDefault();snowfall();}});}
snowy.setAttribute('aria-label','Snowy: release a brief decorative snowfall');
listen(snowy,'click',snowfall);
}
if(typeof IntersectionObserver==='function'){
observer=new IntersectionObserver(function(entries){inView=entries[0].isIntersecting;if(!inView)hidePanel(false);reconcile();},{threshold:0});observer.observe(root);
}
if(typeof ResizeObserver==='function'){resizeObserver=new ResizeObserver(resize);resizeObserver.observe(canvas);}
if(typeof MutationObserver==='function'){classObserver=new MutationObserver(reconcile);classObserver.observe(root,{attributes:true,attributeFilter:['class']});}
updateControls();resize();reconcile();
}
window.addEventListener('pageshow',function(event){if(event.persisted)init();});
init();
}());
The snow demonstration creates a finite set of small flakes near the word, updates their positions over elapsed time, and removes the effect after it finishes. The peacock demonstration draws mathematical curves on Canvas; it has a visible motion control, a capped frame rate, and still rendering for reduced-motion preferences. The sources distinguish visual ornament from the state machine that owns its lifecycle.
Further reading: Python html.escape reference · Canvas tutorial · HTML living standard · WCAG 2.2
Changes you can inspect
Website update log.
Published changes, why they were made, and the checks actually completed. This log will grow as the site evolves.
Canonical account and high-score entry pages
Published account and high-score entry pages on ka-bobs.com. Added guarded private progress backup and restore, revision-conflict checks and server-authoritative completed-game experience for supported board games.
Why: Connect restaurant-domain navigation to the existing account service without treating client-side progress as trustworthy ranked scores.
Checked: Account validation and backup checks, Play Points checks, TypeScript and production build passed. Checked the public entry links, high-score filter and phone layout.
Scope: Current authentication still uses the existing ChatGPT/Sites sign-in. Independent restaurant email/password registration, email recovery and real two-device acceptance remain unfinished. Private ship backups are not verified public rankings.
See the feature ↗Clear ownership and an explicit AI disclosure
Kept Asa’s introduction brief, thanked owner Chef Icky, retained the Facebook link, and named OpenAI’s ChatGPT and Codex as development tools. Added a link to this engineering notebook.
Why: Credit the website work while making it clear that Chef Icky owns and leads the restaurant.
Checked: Read the public introduction and links and checked for captured browser errors.
Scope: This describes the development process. Ordinary website interactions still run as browser code rather than invoking a coding model for each animation.
See the feature ↗A native Extras menu with gold accents
Replaced the visible scripted Extras interface with a native Squarespace dropdown containing nine routes, including the Food Library, Photo Archive, coding notebook, update log, creator credit, Arcade, account, high scores and visitor guide.
Why: Give the supporting pages a dependable home and keep the phone’s main menu focused on the restaurant.
Checked: Opened the public desktop dropdown and phone submenu, checked links and overflow, and preserved the desktop Arcade route.
Scope: The small styling layer hides the superseded scripted controls only when the native dropdown exists. This was a navigation change, not a redesign of every page.
See the feature ↗A photographic Food Library
Published 75 menu entries in eleven categories, with 55 real food photographs from the restaurant’s DoorDash listing. The remaining twenty entries explicitly await a photograph. DoorDash ordering buttons appear at the top and bottom.
Why: Make dishes easier to explore without accidental ordering-link taps on a phone.
Checked: Checked category and photo filters, typo-tolerant search, photo enlargement, Escape and focus return, all 55 hosted images, and a 390-pixel phone layout.
Scope: Prices are DoorDash base prices recorded October 13, not approved dine-in or catering prices. Missing images are labelled rather than invented.
See the feature ↗A keyboard route to the Arcade
Jackie's third greeting explains Alt + Shift + G for the Arcade. Other page shortcuts use the same combination with M, R, C, P or H.
Why: Offer an optional quick route while preserving ordinary typing and text selection.
Checked: The Arcade shortcut opened the published Games page. Ctrl+A still selected text, and the shortcut did not navigate or submit a form while typing.
Scope: The other five destinations passed focused code tests; they were not all opened in the public browser test. Shortcuts may be handled differently by other devices or browsers.
See the feature ↗Icky's kabob tray moves together
Five skewers can now be in flight together, with their button arrivals spaced 720 milliseconds apart. Icky's segment uses a six-second hold instead of ten seconds.
Why: Keep the greeting lively and readable while reaching the useful buttons sooner.
Checked: All five flights and target stops were observed on desktop and phone. Pause, resume, replay and the reduced-motion static view were checked.
Scope: The six-second hold applies to Icky's segment, not the entire three-person greeting. The checks cover the recorded desktop and phone views.
See the feature ↗Solo Spades: a clearer table
Improved full-window controls, card arrangement while bidding and the solo victory presentation. Suit order can be customized, and the last move remains available to review.
Why: Make cards and decisions easier to see, including when a hand contains a long suit.
Checked: Public desktop and phone bidding, a custom suit order, the first trick, last-move display and close/reopen behavior were checked. The long-suit and victory scenes were also checked in controlled test matches.
Scope: The full-window fallback was checked; operating-system fullscreen and a complete public match were not. This update covers solo Spades. Local trophy points are virtual and have no cash or restaurant value.
See the feature ↗Skewer Storm: a stronger opening and science intermissions
Rebalanced the opening waves to provide more small opponents and earned pickups. Added paused science intermissions, a reset position before continuing, clearer approach warnings and rare heavy skewer options.
Why: Make the opening more rewarding and give players time to read, regroup and prepare.
Checked: The public game, first-wave intermission and next-wave continuation were played; desktop and phone layouts were checked. Focused runtime tests checked the added mechanics.
Scope: The complete campaign and every rare pickup were not played in the public browser check. Overall balance remains a playtesting task.
See the feature ↗Photo archive joins Extras
Added Photo archive to the existing Extras menus and the site footer, alongside the Arcade and Website by Asa Cauvel links.
Why: Give visitors a clear route to the photographs without crowding the main restaurant navigation.
Checked: The existing menus, new archive link and footer were checked on desktop and phone.
Scope: This entry covers the observed navigation and archive page; it does not date the original creation of the other links.
See the feature ↗The first older photo collection
Published twelve reviewed photographs from 2014 with descriptions and links to their original Facebook posts.
Why: Let visitors explore the food, rooms and memories while keeping a route back to the original posts.
Checked: Larger photographs, captions and original-post links were checked in the published desktop and phone views.
Scope: This is the first reviewed collection, not the complete Facebook photo history.
See the feature ↗More context in the press archive
Added a sourced Bradford Era story from 2008 and corrected the byline on an existing October 2025 entry.
Why: Keep the restaurant's history readable and give credit to the original reporting.
Checked: The published archive was checked on desktop and phone.
Scope: This update does not claim that every article about Ka-bobs has been collected.
See the feature ↗A guide to visiting Bradford
Added a visitor guide connecting a meal at Ka-bobs with official local attraction information, directions and useful restaurant links.
Why: Help visitors plan a stop and find the next useful page.
Checked: The published guide and its homepage link were checked on desktop and phone.
Scope: The recorded checks cover these pages and their layouts, not every device or external attraction.
See the feature ↗Homepage artwork adapts to screen size and motion choices
Added responsive image variants to the homepage hero and bounded changes to its animated facade and staff controls. The greeting retains a static reduced-motion view and visible pause and resume choices.
Why: Keep the historic building and restaurant introduction readable on phones as well as larger displays.
Checked: Exact saved source was confirmed on the public site. Desktop and phone hero and facade images loaded without horizontal overflow; meal, inquiry, ordering, and call links remained. Staff controls and the reduced-motion paused view were checked.
Scope: Image-file sizes are not a measured loading-performance result. These checks cover the recorded views and controls, not every network or browser.
See the feature ↗Plate Panic adds gold controls and Suds Surge
Published larger gold actions, clearer cleaning progress, Chill/Steady/Rush pacing, rechargeable Suds Surge, perfect-rack streak rewards, optional risky loading, and clearer water and queue states. Mushroom effects stopped inverting the controls.
Why: Make the dishroom easier to read while giving players choices, rewards, and a useful recovery ability.
Checked: The saved editor and public payload matched the tested release. Public desktop click-and-hold cleaning, rack shortcut, water-busy state, pause, and phone cleaning were checked. The phone controls measured 52 pixels high; focused tests preserved glass and rack rules.
Scope: Surge and glass drag also passed local real-input checks. The complete human week was not played, and the previously observed host-page observer exception was not claimed fixed.
See the feature ↗Glass dragging gets visible feedback and a phone target
Allowed a glass to visibly follow a drag even when its rinse water is too dirty, made blocked drops return safely with refill guidance, improved fast and off-center landing intent, and exposed a larger glass-rack target on phone and tablet.
Why: Replace silent refusal with a clear action and explain why a glass cannot be rinsed yet.
Checked: The exact V4 payload was confirmed on the public page and the phone rack was visible. Focused tests and real-input local fixtures checked dirty-water refusal, refill and retry, mouse dragging, two-click transfer, and keyboard fallback.
Scope: The dirty-water drag and retry scenarios were tested locally; the public phone check established rack visibility and sizing. A full public week was not played.
See the feature ↗Plate Panic explains the next useful action
Added contextual dishroom guidance, explicit partial-rack instructions, ready-pan soak protection, corrected pause timing, and automatic loading when rack space becomes available.
Why: Remove confusing waits and make the relationship between the rail, rack, washer, and side work visible.
Checked: The saved artifact matched the public desktop and phone game. Cleaning, automatic loading, partial-rack launch, potato side work, pause and resume, expanded-window play, and Escape were checked. Engine tests covered later-day flow.
Scope: The complete human week was not played. Existing unattributed host-page observer errors remained outside this game change.
See the feature ↗Plate Panic makes cleaning and loading more direct
Published a more playable dishroom flow with hold-to-clean controls, automatic rack loading, washer progress, and an expanded browser-window mode.
Why: Make the core cleaning-and-rack loop easier to operate before adding more complexity.
Checked: The exact public game script was checked. Two dishes were cleaned and loaded on desktop and phone; the washer ran, pause froze its cycle, and Escape restored the surrounding page after expanded-window play.
Scope: A full human week was not repeated. The public page also had unattributed observer errors during reload, so this entry does not claim an entirely clean host-page console.
See the feature ↗A shorter creator note, with Chef Icky clearly credited
Replaced the longer creator presentation with a brief thank-you that identifies Chef Icky as owner and Asa as the website builder. Added the updated photographic mushroom visual while keeping the Facebook link.
Why: Explain the website contribution without implying that Asa owns or leads the restaurant.
Checked: The exact public script, short bio, original portrait, mushroom image, Facebook address, replay, pause, and desktop and phone layouts were checked.
Scope: The mushroom is an artistic effect. These checks do not authenticate the provenance of every other image on the site.
See the feature ↗Skewer Storm gets a faster, more tactical campaign
Published twenty-four timed courses with eight distinct bosses, expanded emitters and enemies, shorter guidance and shield effects, adverse pickups, turbo, and stocked 3,000-HP repairs.
Why: Respond to playtesting that found earlier progression too easy and automatic assistance too strong.
Checked: The public game exactly matched the tested release. Start, held-Space shots, movement, turbo, and pause were checked on desktop; phone sizing, firing, pause, and stock controls were checked too. Focused runtime tests exercised late enemy attacks.
Scope: Scheduled flight timing is a design budget rather than a measured complete human run. The full campaign, every rare item, and long-session balance were not publicly played.
See the feature ↗Extras makes room for the Arcade and creator note
Improved the gold and teal Extras menu, moved the mobile Arcade entry into it, linked Website by Asa Cauvel, and added Asa’s Facebook button to the creator page.
Why: Keep restaurant navigation prominent on smaller screens while giving the website work a modest, discoverable credit.
Checked: The saved navigation and creator changes were checked publicly on desktop and phone. The creator link opened the correct page, the Facebook address matched, and the recorded phone layouts had no horizontal overflow.
Scope: The original desktop Arcade placement was preserved. These checks cover the recorded menu layouts and links.
See the feature ↗Solo Spades gains suit order and last-move review
Added twenty-four suit-order choices, a default Hearts/Clubs/Diamonds/Spades order, clearer bidding cards, Show last move, and a single-skewer trick presentation.
Why: Make a hand easier to read and let players review what just happened without guessing.
Checked: Public phone bidding showed all thirteen cards. A custom suit order and reset worked, and the last-move panel was checked on desktop and phone. Closing and reopening cleaned up the frame and restored the surrounding page.
Scope: This was the solo game. Expanded-window fallback was checked; operating-system fullscreen and a complete public match were not. The public check did not establish the whole trick animation visually.
See the feature ↗Skewer Storm adds hull health and a discovery guide
Changed each life to a 10,000-HP hull, expanded weapon and stored-item choices, and integrated ten credited Hubble photographs with astronomy material and a discovery guide.
Why: Give players damage they can respond to, more strategic choices, and a connection between the fictional flight and real observations.
Checked: The exact tested artifact was confirmed on the public page. Desktop and phone layouts, the health and life display, all ten gallery images, and their credit links were checked.
Scope: The full campaign and long-session balance were not played. The game setting is fictional and is not an astrophysical flight simulation.
See the feature ↗Skewer Storm gets a self-contained flight console
Published the expanded space shooter on its Ka-bobs page with held-Space desktop firing, touch movement, three starting lives, tactical waves, named pickups, and a responsive flight console.
Why: Turn the shooter into a more deliberate arcade experience with distinct desktop and touch controls.
Checked: The saved game artifact matched the public iframe. Landscape, phone, and desktop console sizes were checked without horizontal overflow, and existing local profile experience was preserved.
Scope: The complete eight-wave human playthrough and overall boss and weapon balance were not completed in this release check.
See the feature ↗An orderly Arcade shelf and online-table entrance
Moved the compact 500-game collection below the featured games and added entrance links for Connect Four, Spades, and Checkers online tables.
Why: Keep the featured games easy to find and give the larger collection and table rooms clear, separate routes.
Checked: The existing Games page save and public placement were checked on desktop and phone. The online hub and signed-out table presentation were also checked after publication.
Scope: The entrance links open the separately hosted table application. This release did not verify a complete match between two remote signed-in people; its account sign-in path still needed work.
See the feature ↗Catering becomes a public planner
Published the public catering page with thirty presets, package choices, customization, gold and peacock styling, and a handoff to the restaurant inquiry form. The former draft address redirects to the public page.
Why: Help visitors start from a complete package and send their actual selections for review.
Checked: Desktop and phone layouts were checked. A test inquiry was delivered with its selected package, guest count, event details, and calculated food subtotal plus the 18% tip.
Scope: Submitting a request does not take payment or confirm availability. The 5,000-guest input limit is an inquiry limit, not a promise of venue capacity or fulfillment. The delivery check covers the configured inquiry mailbox.
See the feature ↗The catering planner opens for review
Enabled the special review link for the catering planner, kept it outside the ordinary navigation, and checked changes to guest count and package selection.
Why: Let staff review a working calculator before its customer launch.
Checked: The enabled page was saved and read back, opened while signed out, and displayed the checked kabob and wrap subtotals.
Scope: This was an unlisted review, not a customer launch or a password-protected room. Anyone with the link could open it. The old review address later became a route to the public planner.
See the feature ↗Dustin joins the Blackjack table
Published the updated dealer portrait and pencil flourish on the existing Blackjack page while preserving its card rules and controls.
Why: Give the table a recognizable Ka-bobs character without replacing the game underneath it.
Checked: The saved page script matched the public script. A desktop hand and a phone hand with reduced motion were completed, and the portrait flourish cleaned up afterward.
Scope: These checks cover the recorded hands and layouts, not every Blackjack strategy or device. Virtual chips have no cash value.
See the feature ↗An open invitation
Ideas, corrections, and thoughtful feedback are welcome.
Have a better explanation, a useful source, a game idea, or a reproducible bug? Send a note. A clear example—what you tried, what happened, and what you expected—helps turn a suggestion into something testable.
Chef Icky owns Ka-bobs. Asa’s contribution here is the website and its custom digital features. Third-party software, images, fonts, and publications keep their respective rights and licenses. Study and test the teaching examples before adapting them.