Quiet Canvas artwork · no sound

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.

How the website’s components fit together
LayerWhat it does hereStudy next
SquarespaceHosts 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 DOMRepresent 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 + SVGProvide layout, responsive card tables, typography, gilded borders, vector paths, and motion fallbacks.Primary guide ↗
JavaScript + TypeScriptImplement behavior, timers, game rules, and interface state. TypeScript helps check source before producing JavaScript that browsers run.Primary guide ↗
Canvas + Web AudioDraw changing game scenes and synthesize sound. These APIs have their own timing, coordinate, and user-interaction constraints.Primary guide ↗
Node.js + build toolsCompile and package source, run checks, and create the self-contained game files used by specific site integrations.Primary guide ↗
Git + PythonPreserve source revisions and support scripts, documentation, and artifact preparation. A source revision and a public release are separately checked.Primary guide ↗
CodexHelps 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.

beginner

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?

beginner

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.

beginner

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.

intermediate

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.

intermediate

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.

intermediate

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.

advanced

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

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

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

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

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

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.

WorkEstimated 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.

javascript
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.

javascript
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.

typescript
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.

html
<!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.

html
<!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.

javascript
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.

javascript
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.

javascript
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.

html
<!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.

html
<!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.

javascript
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.

javascript
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.

javascript
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.

sql
-- 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.

javascript
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.

javascript
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.

IdleRunningPaused

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

TargetLaunchImpactPhaseFlight progress
Menu450 ms1650 msWaiting0%
Catering570 ms2370 msWaiting0%
Event request690 ms3090 msWaiting0%
DoorDash810 ms3810 msWaiting0%
Facebook930 ms4530 msWaiting0%

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

JavaScript · published timing constants
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.

beginner

Give an action a real button

html
<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.

beginner

Connect a label to its field

html
<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.

beginner

Keep a style near its feature

css
.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.

intermediate

Let columns adapt

css
.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.

beginner

A constant binding can hold a changing object

javascript
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.

beginner

Return a useful result

javascript
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.

beginner

Compare without converting types

javascript
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.

intermediate

Handle an element that is absent

javascript
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.

intermediate

Connect an action to a response

javascript
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.

intermediate

Respect a request for less movement

css
@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.

intermediate

A small structured record

json
{
  "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.

advanced

A small numerical surprise

javascript
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.

beginner

Website

A collection of related pages and experiences reached through a web address.

beginner

Web page

One document or view in a website, such as a menu, game or history page.

beginner

Browser

The application that requests web content and turns it into a usable page.

beginner

URL

An address identifying a resource and often a particular page or position within it.

beginner

Domain

The named part of a web address, such as ka-bobs.com.

beginner

Hosting

The service that stores or runs a website so browsers can reach it.

beginner

Client

The side requesting a service; on the web, a visitor's browser is usually the client.

beginner

Server

A system that receives requests and supplies data, files or computed responses.

beginner

Source code

Instructions and descriptions written in a programming or markup language.

beginner

CMS

A content management system that provides tools for editing and publishing pages.

beginner

HTML

The markup language used to describe a web document's content and structure.

beginner

Element

A structured part of a document, such as a heading, link or button.

beginner

Attribute

Information attached to an element, such as an image description or a button type.

beginner

Semantic HTML

Elements chosen for their meaning, so a button acts as a button and a heading labels a section.

beginner

Heading

A title that identifies a section and helps readers understand the document's hierarchy.

intermediate

Landmark

A recognizable page region, such as navigation or main content, that assists efficient movement.

beginner

Accessibility

Designing an experience people can use with different abilities, inputs and assistive tools.

beginner

Alternative text

A useful text equivalent for an image when its visual content communicates information.

beginner

Focus

The element currently receiving keyboard input; a visible focus indicator helps show where you are.

intermediate

ARIA

Attributes that describe interface roles, names and states when native HTML does not express them adequately.

beginner

CSS

The language describing visual presentation, including color, spacing, layout and motion.

beginner

Selector

A CSS pattern choosing which elements a style rule applies to.

intermediate

Cascade

The ordered process used to choose a style when several rules could apply.

intermediate

Specificity

One comparison within the cascade that measures how particular competing selectors are.

beginner

Box model

The content, padding, border and margin areas that determine an element's space.

intermediate

Flexbox

A layout system for arranging items along a main direction and distributing space.

intermediate

CSS Grid

A layout system that arranges items into rows and columns.

beginner

Responsive design

A layout that adapts to the available space and input conditions.

beginner

Viewport

The area through which a document is viewed; its size can differ from the whole screen.

intermediate

Media query

A condition that applies styles when a device or user preference matches.

intermediate

CSS custom property

A named style value that can be reused and changed through the cascade.

intermediate

Transform

A change to visual position, rotation, scale or shape without rewriting the underlying content.

beginner

JavaScript

A programming language used to respond to input, manage data and change web experiences.

beginner

Variable

A named binding used to refer to a value while a program runs.

beginner

Constant binding

A binding declared with const that cannot be reassigned; an object it refers to can still change.

beginner

Function

A reusable operation that can accept inputs, perform work and return a result.

beginner

Parameter

A named input in a function's definition.

beginner

Return value

The result a function supplies to the code that called it.

beginner

Array

An ordered collection of values, useful for a hand of cards or a sequence of steps.

beginner

Object

A value grouping named properties, such as a card's suit and rank.

beginner

Boolean

A value that is either true or false.

intermediate

Scope

The part of a program in which a particular binding can be accessed.

advanced

Closure

A function that retains access to bindings from the surrounding place where it was created.

beginner

Event

A report that something happened, such as a click, key press or completed load.

intermediate

Event listener

A function registered to respond when a chosen event occurs.

intermediate

DOM

The browser's tree of document nodes that code can inspect and change.

intermediate

State

The information describing the current situation, such as whose turn it is or whether motion is paused.

advanced

State machine

A model of allowed states and the transitions that move between them.

intermediate

Rendering

Turning content and state into the visible result a user sees.

beginner

Frame

One visual update in a sequence; motion is created by changing successive frames.

intermediate

requestAnimationFrame

A browser API that schedules work before a repaint and supplies a timing value.

advanced

Delta time

The elapsed time between updates, used to make movement less dependent on frame rate.

intermediate

SVG

A vector-image format describing shapes, paths and text that can be scaled.

intermediate

Canvas

A drawable surface where code places pixels or shapes rather than individual document elements.

advanced

Web Audio

Browser tools for generating, processing and connecting sound sources.

beginner

Reduced motion

A user preference that can replace unnecessary movement with a calmer presentation.

intermediate

JSON

A text format for structured values, with quoted property names and no comments.

intermediate

HTTP

A protocol used for requests and responses between web systems.

intermediate

API

A defined interface through which one piece of software uses another's capabilities.

beginner

Request

A message asking a system for a resource or operation.

beginner

Response

The result returned after a system handles a request.

intermediate

Asynchronous work

Work whose completion happens later, allowing other activity while its result is pending.

intermediate

Promise

A JavaScript object representing the eventual success or failure of an asynchronous operation.

intermediate

Browser storage

Browser-managed space for retaining data; different storage tools have different lifetimes and restrictions.

intermediate

sessionStorage

Storage scoped to a browsing session and origin, commonly used for temporary per-tab preferences.

intermediate

Cache

A retained result reused to avoid repeating work; its freshness needs to be managed.

advanced

Hash

A computed fingerprint useful for comparing data; cryptographic hashes have stronger properties than ordinary checksums.

intermediate

Version control

A system recording changes so earlier work can be inspected and recovered.

intermediate

Commit

A recorded set of changes in a version-control history.

intermediate

Regression test

A check that helps catch a previously working behavior breaking after a change.

intermediate

Test fixture

Controlled data or setup used to make a test repeatable.

beginner

Debugging

Finding the reason for an unexpected result and checking a correction.

beginner

Syntax

The rules governing how instructions are written in a language.

intermediate

Runtime

The environment and period in which a program actually executes.

advanced

Race condition

A result that depends on an unintended ordering of overlapping operations.

advanced

Idempotency

A property where repeating an operation has the same intended effect as doing it once.

advanced

Invariant

A condition intended to stay true across all allowed changes in a system.

advanced

Finite precision

The limit imposed by storing numbers with a finite amount of information.

research

Computational complexity

The study of how resource needs grow as a problem's input grows.

research

Formal verification

Mathematical reasoning used to establish specified properties under stated assumptions.

research

Bayesian inference

Updating a model of uncertainty by combining prior assumptions with observed evidence.

advanced

Linear algebra

The mathematics of vectors, matrices and linear relationships, useful for graphics and many models.

advanced

Affine transformation

A transformation combining a linear change with a translation, including shifts, rotations and scaling.

advanced

Bézier curve

A curve shaped by control points, useful for smooth paths and interfaces.

advanced

Sampling

Observing a continuous quantity at selected points; spacing and noise affect what can be recovered.

research

Numerical integration

Approximating accumulated change using finite calculations, such as updating simulated movement.

research

Distributed state

Information maintained across several participants or machines that must coordinate their views.

advanced

Observability

The ability to understand a system's behavior through meaningful outputs, measurements and traces.

beginner

Artificial intelligence

A broad field of computer methods performing tasks such as prediction, pattern recognition or generation.

beginner

Prompt

The instructions and context supplied to a generative model for a particular task.

intermediate

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.

Graduate–Research

Graduate path: what a program means

Relate syntax, semantics, type judgments, proofs, and compiler correctness; state assumptions explicitly.

  1. Structure and interpretation of computer programs (2nd ed.)
  2. 6.042J: Mathematics for computer science
  3. 6.045J: Automata, computability, and complexity
  4. Compilers: Principles, techniques, and tools (2nd ed.)
  5. Types and programming languages
  6. Practical foundations for programming languages (2nd ed.)
  7. An axiomatic basis for computer programming
  8. Software Foundations
  9. CompCert
Advanced–Graduate

Shared state: networking, databases, and multiplayer coordination

Model authoritative state, ordering, recovery, idempotency, and failure before choosing a deployment product.

  1. CS 144: Introduction to computer networking (Fall 2026)
  2. Operating systems: Three easy pieces (Version 1.10)
  3. Designing data-intensive applications
  4. PostgreSQL documentation: Transaction isolation
  5. Atomic commit in SQLite
  6. Time, clocks, and the ordering of events in a distributed system
  7. 6.5840: Distributed systems (Spring 2026)
  8. In search of an understandable consensus algorithm (Extended version)
  9. Paxos made simple
  10. Durable Objects documentation
Intermediate–Research

Account engineering: identity, sessions, and recovery

Design boundaries and recovery deliberately; connect practical checklists with threat models and cryptographic definitions.

  1. Authentication cheat sheet
  2. Password storage cheat sheet
  3. Forgot password cheat sheet
  4. Session management cheat sheet
  5. Same-origin policy
  6. Content Security Policy (CSP) implementation
  7. Web Authentication: An API for accessing public key credentials—Level 3
  8. Digital identity guidelines: Authentication and authenticator management
  9. A graduate course in applied cryptography

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

All levelsdocumentation

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

Beginner–Advanceddocumentation

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

Intermediatedocumentation

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

Intermediate–Advanceddocumentation

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

Advanceddocumentation

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

Advanceddocumentation

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

Advanced Undergraduate–Researchbook

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

All levelsstandard

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

Intermediatedocumentation

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

All levelsbook

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

Intermediatedocumentation

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

All levelsarticle

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

Beginner–Intermediatedocumentation

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

Intermediatedocumentation

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

Graduate–Researchbook

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

Advanced–Graduatemanuscript

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

Graduate–Researchpaper

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

Intermediatedocumentation

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

Intermediatedocumentation

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

Intermediate–Advanceddocumentation

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

Intermediatedocumentation

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

Graduate–Researchbook series

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

Graduate–Researchdocumentation

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

Advanced–Graduatebook

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

Graduate–Researchpaper

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

Graduate–Researchpaper

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

Graduate–Researchpaper

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

Beginner–Intermediatedocumentation

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

Advanced–Graduatedocumentation

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

Advanced–Graduatedocumentation

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

Advanceddocumentation

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

Intermediate–Advanceddocumentation

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

Undergraduate–Graduatebook

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

Undergraduate–Graduatebook

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

Graduate–Researchbook

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

Undergraduatebook

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

Undergraduate–Advancedbook

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

Advanced Undergraduate–Graduatebook

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

Undergraduate–Advancedbook

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

Undergraduate–Graduatebook

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

Intermediatedocumentation

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

Intermediate–Advanceddocumentation

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

Graduate–Researchbook

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

Advanced–Researchstandard

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

Beginner–Intermediatedocumentation

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

Intermediatedocumentation

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

Intermediatedocumentation

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

Intermediate–Advancedbook

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

Intermediate–Advancedarticle

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

Intermediate–Advanceddocumentation

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

Intermediatedocumentation

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

Undergraduate–Graduatebook

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

Graduate–Researchbook

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

Graduate–Researchbook

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

Intermediatedocumentation

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

Undergraduate–Advancedbook

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

Undergraduate–Graduatebook

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

Advanced–Researchstandard

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

Beginner–Intermediatedocumentation

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

Intermediate–Advanceddocumentation

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

Intermediatedocumentation

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

Advanced Undergraduate–Graduatebook

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

Undergraduate–Graduatebook

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

Beginner–Undergraduatebook

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

Advanced Undergraduate–Graduatebook

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

Graduate–Researchbook

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

Advanced–Researchstandard

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

Intermediate–Advanceddocumentation

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

Advanceddocumentation

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

Intermediate–Advanceddocumentation

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

Intermediate–Advanceddocumentation

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

Intermediate–Advanceddocumentation

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

Intermediate–Advanceddocumentation

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

Intermediate–Advanceddocumentation

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

Intermediate–Advanceddocumentation

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

Advanced–Researchstandard

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

Intermediate–Graduatebook

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

Intermediate–Advancedbook

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

Intermediate–Advancedbook

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

Intermediate–Advancedbook

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

Intermediate–Advancedbook

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

Intermediate–Advancedbook

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

Intermediate–Advancedbook

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

Beginner–Intermediatedocumentation

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

Beginner–Advancedbook

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

Undergraduate–Graduatebook

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

Undergraduate–Graduatebook

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

Beginnerdocumentation

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

Advanced Undergraduate–Graduatecourse resource

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

Beginner–Undergraduatebook

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

Beginner–Undergraduatecourse

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

Undergraduatecourse

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

Undergraduatecourse

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

Beginner–Intermediatecourse

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

Graduatecourse

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

Undergraduatecourse

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

Undergraduate–Graduatecourse

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

Undergraduatecourse

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

Advanced Undergraduate–Graduatecourse

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

Undergraduatecourse

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

Beginner–Advancedcourse collection

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

Beginnerdocumentation

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

Beginner–Intermediatedocumentation

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

Intermediatedocumentation

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

Advanceddocumentation

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

Intermediatedocumentation

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

Intermediatedocumentation

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

Intermediatedocumentation

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

Intermediatedocumentation

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

Intermediate–Advanceddocumentation

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

Intermediate–Advanceddocumentation

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

Intermediate–Researchdocumentation

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

Intermediate–Researchdocumentation

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

Intermediate–Researchdocumentation

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

Advanced–Researchstandard

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

Advancedstandard

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

Advancedstandard

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

Advanced–Researchstandard

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

Advancedstandard

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

Advancedstandard

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

Advancedstandard

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

Advanced–Researchstandard

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

Advancedstandard

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

Advancedstandard

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.

Primary resources; select a column heading to sort
Introduction to algorithms (4th ed.)Foundations and algorithmsUndergraduate–GraduatePublisher page; commercial book; selected supporting materials available
Structure and interpretation of computer programs (2nd ed.)Programming languages and semanticsUndergraduate–GraduateFree authorized edition linked by publisher; print edition available
Types and programming languagesProgramming languages and semanticsGraduate–ResearchPublisher page; commercial book
The art of computer programming: Vol. 1. Fundamental algorithms (3rd ed.)Foundations and algorithmsGraduate–ResearchAuthor bibliography; commercial volumes
Practical foundations for programming languages (2nd ed.)Programming languages and semanticsGraduate–ResearchFree abbreviated author edition; commercial complete book
HTML standardWeb standards and layoutIntermediate–ResearchFree online
DOM standardWeb standards and layoutIntermediate–ResearchFree online
CSS snapshot 2026Web standards and layoutIntermediate–ResearchFree online
Web Content Accessibility Guidelines (WCAG) 2.2Accessibility and human-computer interactionAll levelsFree online
ARIA authoring practices guideAccessibility and human-computer interactionIntermediateFree online
Learn web developmentWeb programming and browser behaviorBeginnerFree online
JavaScript guideWeb programming and browser behaviorBeginner–IntermediateFree online
The TypeScript handbookProgramming languages and semanticsIntermediateFree online
Quick startWeb programming and browser behaviorIntermediateFree online
Introduction to Node.jsSystems and developer toolsBeginner–IntermediateFree online
Pro Git (2nd ed.)Systems and developer toolsBeginner–AdvancedFree online
Canvas tutorialGraphics, games, and audioIntermediateFree online
Web Audio APIGraphics, games, and audioIntermediate–AdvancedFree online
CS50x 2026: CS50’s introduction to computer scienceUniversity courses and learning pathsBeginner–UndergraduateFree online
6.006: Introduction to algorithmsUniversity courses and learning pathsUndergraduateFree online
The art of computer programming: Vol. 2. Seminumerical algorithms (3rd ed.)Foundations and algorithmsGraduate–ResearchAuthor bibliography; commercial volume
The art of computer programming: Vol. 3. Sorting and searching (2nd ed.)Foundations and algorithmsGraduate–ResearchAuthor bibliography; commercial volume
The C programming language (2nd ed.)Programming languages and semanticsUndergraduate–AdvancedPublisher page; commercial book; sample code available
Compilers: Principles, techniques, and tools (2nd ed.)Programming languages and semanticsUndergraduate–GraduatePublisher page; commercial book
Computer systems: A programmer’s perspective (3rd ed.)Systems and developer toolsUndergraduate–GraduateUniversity textbook page; commercial book; author supplements available
Open data structures: An introductionFoundations and algorithmsUndergraduateFree authorized PDF on university-press page; print available
Operating systems: Three easy pieces (Version 1.10)Systems and developer toolsUndergraduate–GraduateFree author-hosted chapters; paid print/convenience editions optional
Designing data-intensive applicationsDatabases and distributed systemsAdvanced–GraduatePublisher page; commercial first edition
Specifying systems: The TLA+ language and tools for hardware and software engineersCorrectness, testing, and formal methodsGraduate–ResearchAuthor page links a personal-use PDF; commercial book
Notes on structured programming (2nd ed.; EWD 249)Correctness, testing, and formal methodsAdvanced–GraduateFree online
An axiomatic basis for computer programmingCorrectness, testing, and formal methodsGraduate–ResearchOriginal paper hosted for a Carnegie Mellon course
Time, clocks, and the ordering of events in a distributed systemDatabases and distributed systemsGraduate–ResearchFree online
In search of an understandable consensus algorithm (Extended version)Databases and distributed systemsGraduate–ResearchFree online
Paxos made simpleDatabases and distributed systemsGraduate–ResearchFree online
A graduate course in applied cryptographySecurity and account engineeringGraduate–ResearchFree author-hosted draft
The design of everyday things (Revised and expanded ed.)Accessibility and human-computer interactionAll levelsPublisher page; commercial book
Physically based rendering: From theory to implementation (4th ed.)Graphics, games, and audioGraduate–ResearchFree authorized online text; commercial print edition
6.042J: Mathematics for computer scienceUniversity courses and learning pathsUndergraduateFree online
The missing semester of your CS educationUniversity courses and learning pathsBeginner–IntermediateFree online
CS 61A: Structure and interpretation of computer programs (Fall 2026)University courses and learning pathsUndergraduateFree online
6.5840: Distributed systems (Spring 2026)University courses and learning pathsGraduateFree online
CS 144: Introduction to computer networking (Fall 2026)University courses and learning pathsUndergraduateFree online
6.045J: Automata, computability, and complexityUniversity courses and learning pathsUndergraduate–GraduateFree online
18.06: Linear algebraUniversity courses and learning pathsUndergraduateFree online
15-445/645: Introduction to database systems (Fall 2024)University courses and learning pathsAdvanced Undergraduate–GraduateFree online
Nand to TetrisUniversity courses and learning pathsUndergraduateFree online
CSS Grid Layout Module Level 1Web standards and layoutAdvanced–ResearchFree online
CSS Flexible Box Layout Module Level 1Web standards and layoutAdvancedFree online
CSS Animations Level 1Web standards and layoutAdvancedFree online
Web AnimationsWeb standards and layoutAdvanced–ResearchFree online
Scalable Vector Graphics (SVG) 2Web standards and layoutAdvancedFree online
Web Audio API 1.1Graphics, games, and audioAdvanced–ResearchFree online
Pointer EventsWeb standards and layoutAdvancedFree online
Fullscreen API standardWeb standards and layoutAdvancedFree online
Fetch standardWeb standards and layoutAdvanced–ResearchFree online
URL standardWeb standards and layoutAdvancedFree online
ECMAScript language specification (living draft)Programming languages and semanticsAdvanced–ResearchFree online
Web Authentication: An API for accessing public key credentials—Level 3Security and account engineeringAdvanced–ResearchFree online
Web Cryptography Level 2Security and account engineeringAdvanced–ResearchFree online
Media Queries Level 5Web standards and layoutAdvancedFree online
Game developmentGraphics, games, and audioBeginner–IntermediateFree online
Window: requestAnimationFrame() methodGraphics, games, and audioIntermediateFree online
JavaScript execution modelWeb programming and browser behaviorAdvancedFree online
Pointer eventsWeb programming and browser behaviorIntermediateFree online
prefers-reduced-motion CSS media featureAccessibility and human-computer interactionIntermediateFree online
ResizeObserverWeb programming and browser behaviorIntermediateFree online
Intersection Observer APIWeb programming and browser behaviorIntermediateFree online
Web Storage APIWeb programming and browser behaviorIntermediateFree online
Web Workers APIWeb programming and browser behaviorIntermediate–AdvancedFree online
Web performanceWeb programming and browser behaviorIntermediate–AdvancedFree online
Autoplay guide for media and Web Audio APIsGraphics, games, and audioIntermediateFree online
Same-origin policySecurity and account engineeringIntermediate–AdvancedFree online
Content Security Policy (CSP) implementationSecurity and account engineeringAdvancedFree online
Authentication cheat sheetSecurity and account engineeringIntermediate–AdvancedFree online
Password storage cheat sheetSecurity and account engineeringIntermediate–AdvancedFree online
Forgot password cheat sheetSecurity and account engineeringIntermediate–AdvancedFree online
Session management cheat sheetSecurity and account engineeringIntermediate–AdvancedFree online
Cross site scripting prevention cheat sheetSecurity and account engineeringIntermediate–AdvancedFree online
SQL injection prevention cheat sheetSecurity and account engineeringIntermediate–AdvancedFree online
Digital identity guidelines: Authentication and authenticator managementSecurity and account engineeringAdvanced–ResearchFree online
PostgreSQL documentation: TutorialDatabases and distributed systemsBeginner–IntermediateFree online
PostgreSQL documentation: Transaction isolationDatabases and distributed systemsAdvanced–GraduateFree online
Atomic commit in SQLiteDatabases and distributed systemsAdvanced–GraduateFree online
Durable Objects documentationDatabases and distributed systemsAdvancedFree online
D1 documentationDatabases and distributed systemsIntermediate–AdvancedFree online
The book of shadersGraphics, games, and audioIntermediate–AdvancedFree online
Fix your timestep!Graphics, games, and audioIntermediate–AdvancedFree online
Three.js documentationGraphics, games, and audioIntermediate–AdvancedFree online
What is Phaser?Graphics, games, and audioIntermediateFree online
InstallationCorrectness, testing, and formal methodsIntermediateFree online
Getting startedCorrectness, testing, and formal methodsIntermediateFree online
IntroductionCorrectness, testing, and formal methodsIntermediate–AdvancedFree online
Test runnerCorrectness, testing, and formal methodsIntermediateFree online
Software FoundationsCorrectness, testing, and formal methodsGraduate–ResearchFree online
CompCertCorrectness, testing, and formal methodsGraduate–ResearchFree online
10 usability heuristics for user interface designAccessibility and human-computer interactionAll levelsFree online
Web accessibility tutorialsAccessibility and human-computer interactionBeginner–IntermediateFree online
Understanding WCAG 2.2Accessibility and human-computer interactionIntermediateFree online
Learn web developmentUniversity courses and learning pathsBeginner–AdvancedFree online
The Python tutorialProgramming languages and semanticsBeginner–IntermediateFree online
Learn RustProgramming languages and semanticsIntermediate–AdvancedFree online
TutorialsProgramming languages and semanticsIntermediateFree online
About GitSystems and developer toolsBeginnerFree online
xv6 teaching operating systemSystems and developer toolsAdvanced Undergraduate–GraduateFree online
ChatGPT and Codex documentationAI-assisted software developmentAll levelsFree online
PromptingAI-assisted software developmentBeginner–AdvancedFree online
Custom instructions with AGENTS.mdAI-assisted software developmentIntermediateFree online
Codex securityAI-assisted software developmentIntermediate–AdvancedFree online
Working with evalsAI-assisted software developmentAdvancedFree online
Function callingAI-assisted software developmentAdvancedFree online
The mythical man-month: Essays on software engineering (Anniversary ed.)Software design and engineering classicsIntermediate–GraduatePublisher page; commercial book; samples or supplements may be available
Design patterns: Elements of reusable object-oriented softwareSoftware design and engineering classicsIntermediate–AdvancedPublisher page; commercial book; samples or supplements may be available
Code complete (2nd ed.)Software design and engineering classicsIntermediate–AdvancedPublisher page; commercial book; samples or supplements may be available
The pragmatic programmer: Your journey to mastery (20th anniversary ed.)Software design and engineering classicsIntermediate–AdvancedPublisher page; commercial book; samples or supplements may be available
Refactoring: Improving the design of existing code (2nd ed.)Software design and engineering classicsIntermediate–AdvancedPublisher page; commercial book; samples or supplements may be available
The practice of programmingSoftware design and engineering classicsIntermediate–AdvancedPublisher page; commercial book; samples or supplements may be available
Programming pearls (2nd ed.)Foundations and algorithmsUndergraduate–AdvancedPublisher page; commercial book; samples or supplements may be available
Concrete mathematics: A foundation for computer science (2nd ed.)Foundations and algorithmsAdvanced Undergraduate–GraduatePublisher page; commercial book; samples or supplements may be available
Algorithms (4th ed.)Foundations and algorithmsUndergraduate–AdvancedPublisher page; commercial book; samples or supplements may be available
Algorithm designFoundations and algorithmsUndergraduate–GraduatePublisher page; commercial book; samples or supplements may be available
Code: The hidden language of computer hardware and software (2nd ed.)Systems and developer toolsBeginner–UndergraduatePublisher page; commercial book; samples or supplements may be available
Concepts, techniques, and models of computer programmingProgramming languages and semanticsAdvanced Undergraduate–GraduatePublisher page; commercial book; samples or supplements may be available
Structure and interpretation of computer programs: JavaScript editionProgramming languages and semanticsUndergraduate–GraduatePublisher 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 semanticsBeginner–UndergraduatePublisher page; authorized free online edition at htdp.org; print available
Database system concepts (7th ed.)Databases and distributed systemsUndergraduate–GraduateAuthor-hosted companion site; selected free chapters and materials; commercial book
The C++ programming language (4th ed.)Programming languages and semanticsAdvanced Undergraduate–GraduatePublisher page; this print edition is out of print; commercial eBook listed
Effective Java (3rd ed.)Software design and engineering classicsIntermediate–AdvancedPublisher page; commercial book; samples or supplements may be available
Pattern recognition and machine learningAI-assisted software developmentAdvanced Undergraduate–ResearchAuthor’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

Python · original teaching extract
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
JavaScript · this notebook
(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
JavaScript · this notebook
(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
JavaScript · this notebook
(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.