# The Citation Network of This Wiki: Analysis and Artworks Treating Each Note as a Hyperedge

- Author: Shuichiro Ogawa (Design Researcher / Design Consultant), https://jamjet-iqbal.com/
- Published: 2026-09-23; updated: 2026-09-25
- Canonical (HTML): https://jamjet-iqbal.com/en/notes/citation-weave-of-this-wiki/
- Japanese version: https://jamjet-iqbal.com/notes/citation-weave-of-this-wiki/ (Markdown: https://jamjet-iqbal.com/notes/citation-weave-of-this-wiki.md)
- Language: en
- Keywords: citation-network, co-citation, bibliographic-coupling, hypergraph, network-analysis, louvain, forceatlas2, data-art, visualization, wiki, self-analysis

> Of the 4,227 references cited in the reference sections of 142 public notes, the 445 cited by two or more notes were taken as knots, and their co-citation graph (5,870 edges) was split by the Louvain method into 11 clusters (modularity 0.7263). Each cluster was given a theme name after reading its contents, and the clusters were ordered by their share of papers, from fewer papers to more papers. Time was taken as the day a note first appears in the log and grouped into the six periods of "Interests over time" on the top page. Six of the seven clusters with a paper share of 80% or more have 70% or more of their segments in a single period, while only the "Watching the industry" cluster, 91% web pages, appears in all six periods. The reference that bridges the most clusters is Doshi & Hauser 2024, cited by 8 notes across five of the six periods. The site's Citation Network page draws this result as fifteen works: four live works whose arrangement is generated by forces on every view (marbling on a plane with the proportions of the frame, the weave on a free plane with no frame, the constellation on a sky mapped by stereographic projection, the rings in cells of period and cluster), five live works moved by swarm rules (slime mould with Physarum-style particles, school with Couzin's three-zone model, cells with the Primordial Particle System, foam with weighted centroidal Voronoi, brushstroke with swarmalators), three stills based on hierarchical edge bundling, arc diagrams, and streamgraphs, and three stills drawn by swarms (dry garden with the Vicsek model, coral with reaction–diffusion in a robot swarm, roots with coalescing token passing). Below them the page lists five lines under "What stands out" whose conditions are checked against the data at build time (the only cluster cited in all six periods, clusters made almost entirely of papers being cited mostly in one period, clusters that never share a note, the homogenization paper cited by notes from five periods, and pairs of notes sharing 10 or more sources all written within three days). The default work is marbling: in the order the notes were written, it drops one pair of ink and water drops per note at the centroid of the points of the sources the note cites, and with the drop map of mathematical marbling and a divergence-free stream function it pushes the rings of earlier notes outward and stretches them longer. The points of the sources stay where the layout put them. "Generate again" changes only positions and the shapes of lines and rings that follow from them, never the connections. In marbling and the constellation, repulsion between sources of different clusters reaches further and pushes harder than within a cluster, so clusters read only through how densely points crowd. The look follows the site theme: the light one is sumi ink on washi paper, the dark one is light added up over a dark field. Clusters are shown in order of paper share, by the shade of one ink in the light look and the brightness of one hue of white light in the dark look; the kind of a reference by two shapes, a filled disc (academic: papers and preprints) and a ring (practice: companies, public bodies, and the web, such as news and blogs); and the age of the link a line stands for by that line's own bleed (ink spreading in the light look, a glow spreading in the dark one; the darker edge and the granulation draw on Curtis et al. 1997). Only the weave's threads do not bleed. Every work is first drawn in thin lines, and once drawing ends, a per-work "Finishing" line appears and the bleed is added over about ten seconds. The counting, the force computation, and each work's formulas and curve construction (the drop map, a stream function with the midpoint method, centripetal Catmull–Rom curves, stereographic projection, uniform cubic B-splines, half circles, Gaussian kernels) are transcribed from the implementation in the body.

The public notes in this wiki are written under a rule that they end with a list of references.
Each reference carries a DOI or a URL wherever possible.

Stack those lists across 142 notes and you can see which references are cited by how many notes, and which notes stand on the same literature.
A wikilink is a connection the writer made on purpose.
Overlaps in the reference lists accumulate without the writer noticing.
Do those unnoticed overlaps match the picture the writer holds of this wiki?

## Why treat a note as a bundle rather than a line

The obvious way to draw connections between notes is to make each note a node and each wikilink an edge.
This note does something else: it makes each reference a node and treats each note as a **hyperedge** that binds, all at once, every reference that note cites.
An ordinary edge joins exactly two points; a hyperedge joins any number of points at once.

The reason to keep the bundle is that breaking it into pairs loses information.
Battiston et al. (2020) review how projecting many-body interactions onto a pairwise network loses which sets were involved together.
For example, a triangle in which references A, B, and C are all connected could come from one note citing all three, or from three notes each citing two of them.
A pairwise graph cannot tell these apart.

That said, cluster detection and centrality were computed on the pairwise graph (the co-citation graph).
It is the drawing that keeps the bundles: each note is drawn as one thread passing through the references it cites.

In the pairwise graph, each edge is what the citation-analysis literature calls co-citation.
Small (1973) called it **co-citation** when two documents are cited together by a third, and took the number of documents citing both as its strength.
Here the citing documents are notes.
The weight of an edge between two references is the number of notes that cite both.

There is also the reverse relation.
Kessler (1963) called it **bibliographic coupling** when two documents cite the same third document.
In this wiki, that corresponds to two notes sharing a reference.
This note does not compute a separate coupling network, but when threads bundle at a single knot in the drawing, you are seeing bibliographic coupling directly.

Efforts to map the structure of a field from citation relations have been surveyed as the visualization of knowledge domains (Börner et al., 2003).
There are also dedicated tools, such as CiteSpace, for detecting and visualizing trends in a literature (Chen, 2006).
This note applies that approach not to a field but to one writer's wiki.

## What was counted, and how

All numbers come from `dist/client/network.json` as built on 2026-09-24.
The computation is done by `src/lib/citation-weave.ts`, as follows.

- **Scope**: the 142 Japanese notes directly under `wiki/note/` that are not drafts. The 33 drafts were excluded. English versions were not counted. Sections hidden on the public pages were removed, as they are on those pages.
- **Extraction**: only lines in a `##` section whose heading begins with 参照文献, References, 参考文献, or 出典 were read, up to the next `##` heading. URLs in related-notes or unverified-items sections were not counted as citations.
- **Identification**: DOIs were lowercased into a single key. doi.org URLs and publisher URLs of the `/doi/` form were also converted to DOIs. Other URLs were keyed after dropping `www.` from the host, any trailing `/`, and parameters beginning with `utm_`. Links to this site itself were excluded.
- **Paper or not**: a reference with a DOI, or one without a DOI but written as an arXiv (`/abs/` or `/pdf/`), ACL Anthology, or OpenReview (`/forum` or `/pdf`) URL, counts as a **paper**; everything else counts as a **web page**. Preprints and conference proceedings are fixed documents even without a DOI.
- **Knots**: a reference cited by two or more public notes is called a knot, where threads gather.
- **Co-citation graph**: knots are nodes; for every pair of knots listed in the same note, the pair's weight goes up by 1.
- **Clusters**: the weighted Louvain method (Blondel et al., 2008) searches for a partition with high modularity (Newman & Girvan, 2004). Its randomness comes from a fixed seed, so the same wiki always yields the same partition. Clusters were numbered from 0 in order of size.
- **Paper share and order**: the share of a cluster's knots that are papers is its **paper share**. Clusters were ordered by paper share, smallest first (ties by number), and the figures use this order as an axis from fewer papers to more papers.
- **Theme names**: each cluster was given a readable name and a one-line description. These names are not computed. The writer assigned them by hand after reading each cluster's most-cited references and the notes that cite them. Names are matched to clusters through a few representative references chosen for each theme. Pairs with more representative references in common are assigned first, and no theme is used for two clusters. Louvain's cluster numbers change as the wiki grows, so the match goes through references rather than numbers. In this build, all 11 clusters received a theme name.
- **Machine names**: separately from the theme names, the tags of notes passing through a cluster's knots were counted, weighted by how many of those knots each note passes, and the top two were joined into a name that is also kept. Tags found on nearly every note (ai, design, generative-ai, research, literature, literature-review, literature-map) and year tags were excluded.
- **Betweenness**: Freeman's (1977) betweenness centrality was computed with Brandes's (2001) algorithm, without weights, and normalized so that the maximum is 1. Co-citation weight expresses closeness, so feeding it into shortest paths as a distance would invert its meaning. That is why weights were not used.
- **Reference layout**: at build time, ForceAtlas2 (Jacomy et al., 2014) was run for 500 iterations with the graphology implementation. The settings are the values graphology infers from the number of nodes (strong gravity on, gravity 0.05, scalingRatio 10). Initial positions come from a fixed-seed random generator. These coordinates are kept in `network.json` as a record of the analysis. The live works on the page do not use them; they generate a new arrangement in the browser on every view (see below).
- **Date written**: the first day a note's slug appears in the target column of `wiki/log.md` is taken as the day the note was written. Rows for English versions (targets beginning with `en/`) are not counted. All 142 notes have a log record, so no note fell back on the frontmatter `updated`.
- **Periods**: the dates written were grouped into the same six periods as [Interests over time](/en/#interests) on the top page. The period boundaries come from a separate analysis that read the shift in interests from first log appearances. A note written on a day between two periods goes into the earlier period (the two watches written on 09-07 fall in period 4).
- **Segments by period**: each time a note passes through one of a cluster's knots, one segment is counted for that note's period. The period with the most segments is the cluster's thickest period. For each knot, the period of the first note citing it is the period in which the knot first appeared.

This note itself and [Drawing Networks as Data Art: Literature on Placement, Bundling, Time, and Flow](https://jamjet-iqbal.com/en/notes/network-data-art-methods-literature/), which collects the methods behind the artworks, are excluded from the computation.
It cites only methodological literature, so counting it as a thread would rewrite its own results.
For example, Kosara (2007) is cited only by [What Data Visualization and Data Art Share, and Where They Differ](https://jamjet-iqbal.com/en/notes/data-viz-vs-data-art-literature/); counting this note would turn it into a knot.

## The whole in numbers

Of the 142 notes, 137 yielded at least one reference.
There are 4,227 distinct references, of which 2,089 (49.4%) have a DOI.

There are 445 knots, 10.5% of all references.
The remaining 3,782 (89.5%) appear in only one note.
Among the knots, 332 (74.6%) are cited by exactly two notes.
65 are cited by three notes, 26 by four, 10 by five, 6 by six, 3 by seven, 1 by eight, and 2 by nine.
295 of the knots (66.3%) are papers: 247 with a DOI and 48 papers without one, such as arXiv preprints.

The co-citation graph has 5,870 edges, and the Louvain method returned 11 clusters.
The modularity is 0.7263.
Of the edges, 4,876 lie inside clusters and 994 (16.9%) cross between them, so the cluster boundaries are clear.

## What the 11 clusters correspond to in this wiki

The table runs from the cluster with the smallest paper share to the largest.
Theme names were assigned by the writer after reading the contents; machine names were computed from tags.

| No. | Theme name | Machine name | Knots | Paper share | Notes passing | Thickest period | Main notes forming it |
|---|---|---|---|---|---|---|---|
| 10 | Public skill standards | skill-standard / デジタルスキル標準 (Digital Skill Standards) | 1 | 0% | 2 | Period 5 | [Which standard can design and new-business work actually sit on?](https://jamjet-iqbal.com/en/notes/design-work-process-standards/), [How do you measure a business analyst's skills?](https://jamjet-iqbal.com/en/notes/dss-p-business-analyst-measurement/) |
| 0 | Watching the industry | design-tools / weekly-watch | 96 | 9% | 43 | Period 1 | weekly watches, [Industry Discourse on Agentic Experience (AX): What Vendors, Consultants, and Practitioners Are Saying](https://jamjet-iqbal.com/en/notes/agentic-experience-industry/), [AI Adoption in the Design Industry: Perspectives from Policy, Data, and Product Developers (2026)](https://jamjet-iqbal.com/en/notes/ai-in-design-industry/) |
| 3 | Delegating judgment to AI, and evaluation standards | ai-frontier / jev | 51 | 25% | 23 | Period 6 | [TypeSafe AI's Jev: What It Guarantees and What It Does Not](https://jamjet-iqbal.com/en/notes/typesafe-ai-jev/), [When Judgment Becomes a Function Call, What Moves in Design](https://jamjet-iqbal.com/en/notes/jev-typed-judgment-design/), [How to Use Jev, and Where Not To](https://jamjet-iqbal.com/en/notes/jev-usage-patterns/) |
| 9 | Design systems | design-systems / design-tokens | 8 | 63% | 3 | Period 5 | [Design System Best Practices: What the Evidence from Research and Practice Supports](https://jamjet-iqbal.com/en/notes/design-system-practices/), [How Much of the Evidence for Adjudicating the Six Design System Conflicts Is in Place?](https://jamjet-iqbal.com/en/notes/design-system-adjudication-evidence/) |
| 8 | LLMs as judges | llm-as-a-judge / evaluation | 15 | 80% | 5 | Period 2 | [Recent Currents in LLM-as-a-Judge: A Literature Map of 53 Core Studies and a Standalone Chapter on Creativity Evaluation](https://jamjet-iqbal.com/en/notes/llm-as-a-judge-literature/), [The Genesis of LLM-as-a-Judge: A Confluence of Three Lineages and Four Demands](https://jamjet-iqbal.com/en/notes/llm-as-a-judge-history/) |
| 1 | Research gaps and reframing problems | abduction / research-gaps | 58 | 83% | 35 | Period 2 | [Where Are the Gaps in AI Research? Seven Voids Found by Reframing](https://jamjet-iqbal.com/en/notes/ai-research-gaps-abduction/), [An Academic Map of Methods for Reframing Problems: From Abduction-2 to Problem Structuring](https://jamjet-iqbal.com/en/notes/problem-definition-methods-literature/) |
| 2 | AI in design practice and education | design-education / chi | 52 | 90% | 37 | Period 1 | [Designer Careers That Will Generate Value over the Next Five Years — Academic Review (2026)](https://jamjet-iqbal.com/en/notes/designer-career-value-literature/), [AI in the Design Industry: An Academic Review (2026)](https://jamjet-iqbal.com/en/notes/ai-in-design-literature/), [AI Slop: Reading It as Outsourced Verification, Not Low Quality](https://jamjet-iqbal.com/en/notes/ai-slop-design-creativity/) |
| 7 | Measuring dispositions and ability | construct-validity / gyaru | 39 | 95% | 17 | Period 3 | [What Was Measured as "Gyaru-Mind": The Provenance of Eight Factors and Its Limits](https://jamjet-iqbal.com/en/notes/gyaru-mind-operationalization/), [When Is a Disposition Being Measured? Measurement as Conditional Tendency, and Measurement as Co-occurrence](https://jamjet-iqbal.com/en/notes/disposition-measurement-literature/), [How Might Gyaru-Mind Be Measured: What the Two Existing Scales Leave Out](https://jamjet-iqbal.com/en/notes/gyaru-mind-measurement-design/) |
| 4 | Generative art and creativity | computational-creativity / generative-art | 43 | 98% | 18 | Period 3 | [The Scholarly Lineage of Generative Art: A 94-Item Literature Map from Information Aesthetics to the Post-LLM Era](https://jamjet-iqbal.com/en/notes/generative-art-literature/), [Which Angle for a Generative-Art Review Paper Attracts Citations? An Empirical Analysis Using Bibliographic Data](https://jamjet-iqbal.com/en/notes/generative-art-review-citation-strategy-literature/) |
| 5 | How to frame research questions | design-research / problematization | 42 | 100% | 30 | Period 2 | [Where Do Novel Research Questions Come From? The Four Loci and Their Combinations, Examined Against the Literature](https://jamjet-iqbal.com/en/notes/novel-research-questions-literature/), [How Novelty Is Made and How It Is Claimed: A Typology of Establishing Strategies](https://jamjet-iqbal.com/en/notes/novelty-establishing-strategies-literature/) |
| 6 | Learning and cognitive load | cognitive-load / computational-thinking | 40 | 100% | 22 | Period 3 | [Does Being Able to Build Mean Being Able to Learn? Rereading the Learning Outcomes of End-User Development Through Motive](https://jamjet-iqbal.com/en/notes/end-user-development-novice-learning-literature/), [The Debate Over Designing Failure Into Learning: Four Lineages Versus Cognitive Load Theory](https://jamjet-iqbal.com/en/notes/failure-driven-learning-debate/), [Can Incompetence Be Defined as Raising Other People's Cognitive Load?](https://jamjet-iqbal.com/en/notes/competence-as-cognitive-load/) |

"Watching the industry" is made almost entirely of web pages.
Of its 96 knots, 9 are papers (8 with a DOI, 1 on arXiv) and the other 87 are web pages.
The web pages come from vendors' changelogs and announcements, such as Figma (8), Anthropic (5), and Adobe and Vercel (4 each); from pages of public bodies such as the European Commission, EUR-Lex, the U.S. Bureau of Labor Statistics, and Japan's Agency for Cultural Affairs; from survey reports by McKinsey, Gartner, and the World Economic Forum; and from practitioner writing such as Nielsen Norman Group.
The most-cited knot in the cluster is Figma's Release Notes, cited at the same URL by 9 weekly watches.
Of the 274 thread segments passing through this cluster, 139 belong to the 16 public watches (weekly and monthly scholarly).
32 of the 96 knots are cited only by watches.

"Delegating judgment to AI, and evaluation standards" is the cluster whose tag-based name is ai-frontier / jev.
It consists mostly of the three notes on TypeSafe AI's Jev, which account for 84 of the 118 thread segments passing through it.
It holds Jev's official documentation (8 knots) and NIST documents, and it also contains the design-research paper Dorst et al. (2001).
Only 13 of its 51 knots are papers (9 with a DOI, 4 on arXiv).

"LLMs as judges" was formed almost single-handedly by the two LLM-as-a-Judge notes.
None of its 15 knots has a DOI, but 12 are papers on arXiv (10) and in the ACL Anthology (2), which gives a paper share of 80%.
The other 3 are OpenAI's list of API deprecations, the page of the UK AI Security Institute's evaluation framework Inspect, and a page in the NeurIPS proceedings.
The last is a paper, but because the NeurIPS proceedings are not among the places treated as holding papers, it is counted as a web page.

"Research gaps and reframing problems" is the cluster of the series of notes looking for research gaps and of notes on reframing problems.
At the top are Dorst (2011), Rittel & Webber (1973), and Lee et al. (2025), on generative AI and critical thinking.
Physics references shared by the gap-finding series (such as Davisson & Germer, 1927) also land here.
12 of its 48 papers are arXiv papers without a DOI.

"AI in design practice and education" is the cluster of CHI-style research on generative AI entering design practice and education.
Jansson & Smith (1991) and Wadinambiarachchi et al. (2024), both on design fixation, are near the top.
Of the 11 clusters, this one has the most outside connections.
Of the 665 edges attached to its knots, 349 (52%) go to other clusters.

"Measuring dispositions and ability", "Generative art and creativity", "How to frame research questions", and "Learning and cognitive load" are academic clusters whose paper share is 95% or more (37 of 39, 42 of 43, 42 of 42, and 40 of 40 papers, respectively).
They correspond to construct measurement and attempts to measure the gyaru mind, to generative art and computational creativity, to how research questions are constructed and to Research through Design, and to cognitive load theory and scaffolding.
At the top of "Measuring dispositions and ability" are Costanza-Chock (2020), Buchanan (1992), and Lave & Wenger (1991).

"Design systems" is the cluster of the two design-system notes (09-11), and "Public skill standards" is a cluster of a single knot.
That knot is IPA's Digital Skill Standards, cited by [Which standard can design and new-business work actually sit on?](https://jamjet-iqbal.com/en/notes/design-work-process-standards/) and [How do you measure a business analyst's skills?](https://jamjet-iqbal.com/en/notes/dss-p-business-analyst-measurement/).
Neither of these two notes has any other knot.
So in the co-citation graph the knot is an isolated node with no edges, and the Louvain method returned it as a cluster of its own.

## Most-cited references, and references that connect clusters

The most-cited references are as follows.
The first period is the period of the first note that cited the reference.

| Reference | Notes | Cluster | Betweenness | First period |
|---|---|---|---|---|
| Dorst 2011, The core of "design thinking" and its application | 9 | Research gaps and reframing problems | 0.119 | Period 1 |
| Figma, Release Notes | 9 | Watching the industry | 0.055 | Period 1 |
| Doshi & Hauser 2024, Generative AI enhances individual creativity but reduces the collective diversity of novel content | 8 | Generative art and creativity | 1 | Period 1 |
| McKinsey / QuantumBlack 2025, The State of AI | 7 | Watching the industry | 0.18 | Period 1 |
| Sandberg & Alvesson 2011, Ways of constructing research questions | 7 | How to frame research questions | 0.094 | Period 2 |
| Framer, Updates | 7 | Watching the industry | 0.051 | Period 1 |

The top of the betweenness ranking is a different set.
Doshi & Hauser (2024) is at 1 (the maximum), followed by Gaver (2012) at 0.2568, Dorst et al. (2001) at 0.1864, McKinsey's State of AI at 0.18, Zimmerman et al. (2007) at 0.1631, and Lee et al. (2025) at 0.1549.

Being cited often and connecting clusters are not the same thing.
Figma's Release Notes is cited by 9 notes, but its betweenness is only 0.055.
This is probably because all 9 citing notes are watches, and most of its co-citation partners lie inside "Watching the industry".
Rittel & Webber (1973) is also cited by 6 notes, but its betweenness is only 0.019.
Three of the 6 citing notes belong to one series on reframing problems.
Conversely, Gaver (2012) is cited by only 4 notes, but those include both notes forming "How to frame research questions" and [What Was Measured as "Gyaru-Mind": The Provenance of Eight Factors and Its Limits](https://jamjet-iqbal.com/en/notes/gyaru-mind-operationalization/), on measuring the gyaru mind, which makes it the second strongest bridge.

From the side of the notes, the number of clusters a thread passes through (its cluster span) is distributed as follows.
62 notes pass through one cluster, 31 through two, 23 through three, 5 through four, 3 through five, and 1 through seven; 17 notes have no knots.
The only note spanning seven clusters is [Writing Material for a Review Article: The Assumption Ledger and Nearest-Neighbour Literature Left by 17 Novelty Audits](https://jamjet-iqbal.com/en/notes/review-paper-writing-material/), which gathers nearby literature from several surveys as material for a review paper.
The three notes spanning five clusters are [AI Slop: Reading It as Outsourced Verification, Not Low Quality](https://jamjet-iqbal.com/en/notes/ai-slop-design-creativity/), [AI Adaptation in Design Education — The Current State and Structural Challenges of Curriculum Reform](https://jamjet-iqbal.com/en/notes/design-education-ai-adaptation/), and [Adversarial Review of Two Generative Art Surveys: Examining the Literature Map and the Citation Strategy Against the Design-Theory Canon](https://jamjet-iqbal.com/en/notes/generative-art-adversarial-review/).

## The 17 notes with no knots

Five of the 17 have a reference section, but it contains no DOI and no URL at all.
They are [The Role of Designers in the AI Era — Industry x Academia Roundtable (Business-Only Revision)](https://jamjet-iqbal.com/en/notes/designer-role-ai-roundtable/), [The Democratization-Recommodification Paradox: How AI Turns 'Anyone Can Do It' into 'No One Can Charge for It'](https://jamjet-iqbal.com/en/notes/democratization-recommodification-paradox/), [AI Commoditization Resilience of Design Billing Models — Output-Based Billing Is Most Vulnerable, and Retainer Stickiness Does Not Mean High Margins](https://jamjet-iqbal.com/en/notes/design-pricing-vs-ai-commoditization/), [AX and Design: A Cross-Comparison of Academic and Industry Perspectives](https://jamjet-iqbal.com/en/notes/agentic-experience-design-synthesis/), and ['Design Is Not Craft' — Industry x Academia Roundtable](https://jamjet-iqbal.com/en/notes/design-is-not-craft-roundtable/), all roundtable or synthesis notes written in June, in period 1.
The roundtable notes from that period either listed references by bibliographic details alone or left their sources to the parent note or the working ledger.
The method here picks up nothing from them.

The remaining 12 do cite references, but no other public note cites any of them.
Those citing the most are [Slop Seen Through Design History: The Profession Began as a Countermeasure to Shoddy Mass Production](https://jamjet-iqbal.com/en/notes/slop-design-history/) (62), [Novice Group Work with a Shared AI Agent: A Literature Map of CSCL and AI-Supported Collaborative Learning (2026)](https://jamjet-iqbal.com/en/notes/shared-ai-agent-groupwork-literature/) (48), design-craft-relationship-industry (42), forward-deployed-designer (32), and [What Data Visualization and Data Art Share, and Where They Differ](https://jamjet-iqbal.com/en/notes/data-viz-vs-data-art-literature/) (29), among others.
These notes are not isolated within the wiki.
They connect to other notes through wikilinks.
Having no knot means that no other public note has yet entered the region of literature that the note opened.

## Clusters passed through, period by period

The notes were grouped into the six periods by the date they were written, and the knot segments passed by each period's notes were counted per cluster.
Knots first appearing are the knots that a note of that period cited for the first time.

| Period | Dates | Notes (with knots) | Segments | Top three clusters by segments (share) | Knots first appearing (papers) |
|---|---|---|---|---|---|
| 1 | 06-07 to 07-12 | 44 (36) | 272 | Watching the industry (64%), AI in design practice and education (20%), Research gaps and reframing problems (4%) | 149 (73) |
| 2 | 07-15 to 07-29 | 37 (35) | 290 | Research gaps and reframing problems (40%), How to frame research questions (29%), LLMs as judges (10%) | 121 (105) |
| 3 | 08-02 to 08-24 | 34 (30) | 305 | Generative art and creativity (27%), Measuring dispositions and ability (26%), Learning and cognitive load (24%) | 115 (101) |
| 4 | 08-27 to 08-31 | 10 (8) | 77 | Watching the industry (36%), AI in design practice and education (35%), Delegating judgment to AI, and evaluation standards (10%) | 18 (9) |
| 5 | 09-11 to 09-14 | 5 (5) | 28 | Design systems (54%), Watching the industry (39%), Public skill standards (7%) | 11 (5) |
| 6 | 09-18 to 09-22 | 12 (11) | 124 | Delegating judgment to AI, and evaluation standards (68%), Watching the industry (10%), Research gaps and reframing problems (9%) | 31 (2) |

In period 1, "Research gaps and reframing problems" and "Delegating judgment to AI, and evaluation standards" tie at 12 segments (4%).
Only three clusters have segments in period 5.
Period 4 also includes the two watches written on 09-07, between periods.

Only "Watching the industry" has segments in all six periods.
Its segments lean heavily on period 1, with 175, but it shows up in every period after that too, with 15, 32, 28, 11, and 13.
90 of its 99 segments from period 2 onward come from watches; the watches, written in every period, keep this cluster going.

The academic clusters gather in a single period.
Period 2 holds 116 of the 152 segments (76%) of "Research gaps and reframing problems", 83 of the 112 (74%) of "How to frame research questions", and 28 of the 30 of "LLMs as judges".
Period 3 holds 81 of the 100 segments of "Generative art and creativity", 79 of the 90 of "Measuring dispositions and ability", and 74 of the 86 of "Learning and cognitive load".
Period 6 holds 84 of the 118 segments of "Delegating judgment to AI, and evaluation standards", and period 5 holds 15 of the 16 of "Design systems".

The exception is "AI in design practice and education".
Of its 116 segments, 54 fall in period 1 and 27 in period 4, giving it two peaks.
The 27 segments in period 4 come from notes on slop, such as [AI Slop: Reading It as Outsourced Verification, Not Low Quality](https://jamjet-iqbal.com/en/notes/ai-slop-design-creativity/) (11), [Does Seeming Common Online Mean It Is Common?](https://jamjet-iqbal.com/en/notes/representation-population-decoupling-literature/) (7), and [The History of Slop and Countermeasures: Why the Same Wager Keeps Failing](https://jamjet-iqbal.com/en/notes/slop-countermeasures-history/) (6).
15 of those 27 pass through knots that had already appeared in periods 1 to 3, and 8 of them through knots that first appeared in period 1 (such as Jansson & Smith, 1991, and Wadinambiarachchi et al., 2024).
The other 12 pass through knots that first appeared in period 4: literature newly shared among the slop notes.
Part of the CHI-style research gathered in period 1 to study changes in work and education is cited again in period 4 as footing for the argument about slop, alongside new literature.

What first appears as a knot also differs by period.
Of the knots first appearing in periods 2 and 3, 105 of 121 and 101 of 115 are papers.
In period 1 it is 73 of 149, roughly half papers and half web pages.
In period 6 only 2 of 31 are papers, and 27 of the 31 belong to "Delegating judgment to AI, and evaluation standards", such as Jev's documentation.

## A reading from design theory

What follows is interpretation based on the numbers above.

First, the knowledge in this wiki seems to be anchored in literature in two different ways.
On the industry side ("Watching the industry"), the knots are URLs of pages that keep being updated.
Figma's Release Notes is cited by 9 weekly watches, but its content differs each time it is cited.
Small's (1973) co-citation presupposes that the cited item is a single fixed document.
With a continuously updated page, the same knot need not point to the same content.
The knots of "Watching the industry" are therefore closer to observation posts visited repeatedly than to a shared intellectual base.
That this cluster alone appears in all six periods also fits the reading of observation posts.
On the academic side, the knots are papers and point to fixed documents.
Many of those knots, however, are made by pairs of notes written on the same day on neighboring topics.
Of the 43 knots in "Generative art and creativity", 35 are cited by both generative-art notes written on 08-02, and each of the two passes 39.
In "How to frame research questions" as well, the two notes written on 07-27 each pass 28 of its 42 knots.
Such knots are more naturally read as consecutive surveys building on the same body of literature than as separate questions independently arriving at the same references.
That 74.6% of the knots are cited by exactly two notes is consistent with this reading.

Second, industry observation and research on learning and measurement never meet within a single note.
There are zero co-citation edges between "Watching the industry" and "Learning and cognitive load" and between "Watching the industry" and "Measuring dispositions and ability", and only 4 between "Watching the industry" and "How to frame research questions".
The outside connections of "Watching the industry" lean toward "Delegating judgment to AI, and evaluation standards" (73 edges) and "AI in design practice and education" (61 edges).
Industry observation reaches the academic clusters through CHI-style research on generative AI in design practice and through the cluster that includes documents such as NIST's.
Notes like [AI Adaptation in Design Education — The Current State and Structural Challenges of Curriculum Reform](https://jamjet-iqbal.com/en/notes/design-education-ai-adaptation/) and [From Maker to Editor: A Structural Analysis of the Designer Role Transition in the Age of AI](https://jamjet-iqbal.com/en/notes/maker-to-editor-paradigm/), which pass through "Watching the industry" and academic clusters at once, are few, and within this wiki they act as bridges.

Third, the classics of design theory gather not in the cluster that discusses design practice but in the clusters that discuss how to construct research questions.
The 9 notes citing Dorst (2011), one of the two most-cited references, are all about reframing, the methodology and epistemology of design research, gap-finding, reframing problems, and new research questions, and they were written between 07-09 and 07-27.
Zimmerman et al. (2007), Gaver (2012), and Cross's Designerly Ways of Knowing (the 1982 article and the 2006 book) are in "How to frame research questions"; Buchanan (1992) and Kimbell (2011) are in "Measuring dispositions and ability".
"Watching the industry" holds only 9 papers out of 96 knots.
One reading is that in this wiki, design theory has been used less as a frame for explaining changes in industry than as a tool for thinking about how to pose the writer's own research questions.

Fourth, some references return across periods.
Doshi & Hauser (2024) is cited by 8 notes, from [The Economics of AI and Design — Reading the Structural Transformation of Design Labor Through Six Economic Theories](https://jamjet-iqbal.com/en/notes/ai-economics-and-design/), written on 06-28, to [What Social Coordination Costs Arise from Collaborating with Others on Creative Work](https://jamjet-iqbal.com/en/notes/creative-collaboration-coordination-cost-literature/), written on 09-22.
The 8 notes span periods 1, 2, 3, 4, and 6; the only period without it is period 5, on design systems.
It also has the highest betweenness.
As its title states, it deals with the finding that generative AI raises individual creativity while lowering the collective diversity of what is produced.
Anderson et al. (2024), on the homogenizing effect of LLMs on human ideation, is also cited by 5 notes in periods 2, 3, 4, and 6, and has a betweenness of 0.1422.
Since a finding about homogenization sits at the top of the betweenness ranking, one concern that crosses the period-by-period turnover of academic clusters can be read as homogenization.

Fifth, the thickest clusters of each period broadly match the headings of "Interests over time" on the top page, but in some periods half of the heading does not show up in the citations.
In period 2 (Research methods, and how questions are framed), 69% of the segments fall in "Research gaps and reframing problems" and "How to frame research questions".
In period 5 (Design systems, and the standards work sits on) and period 6 (Judgments handed to AI, and thinking by making), too, the thickest cluster matches the first half of the heading.
The second half of period 6, however, the 5 notes on data visualization, SF prototyping, and creative collaboration, holds only 16 segments (13%) in all.
In period 4 (AI slop, and where design as a field came from), the notes on history, [The Genealogy of Design Research in Japan: Three Origins, and the University That Passed the Presidency Around](https://jamjet-iqbal.com/en/notes/japan-design-research-genealogy-literature/) and [Was the 'Absence of a Science of Design' Asserted Three Times? Rereading the Observations of 1978, 2008, and 2023 in Their Sources](https://jamjet-iqbal.com/en/notes/design-discipline-absence-literature/), pass through only 2 knots between them.
In period 3 (Learning, and measuring ability), the thickest cluster is "Generative art and creativity", which is not in the heading, and 78 of its 81 segments come from the pair of generative-art notes.

Two causes overlap in this fifth mismatch.
The period headings read topics by the number of notes, while segments are weighted by the number of knots a note cites.
A pair of notes passing 39 knots each can, on its own, make the thickest cluster of a period.
The other cause is that literature on a new topic needs time to be cited again by another note before it becomes a knot.
The notes of the second half of period 6 and the history notes of period 4 opened regions of literature that no later note has entered yet.
The gap does not show that the headings are wrong.
It shows that interest seen through the number of notes and interest seen through citations are two maps that measure different things.

## What stands out

The purpose of the [Citation Network](/en/network) page is to bring out, from the links between citations, what characterizes this site and the writer's tendencies of thought.
Directly below the works, the page places the heading "What stands out" and five lines of text.
The writer wrote the lines after reading the analysis above, but whether each line appears is decided on every build by checking a condition against the data.
A line whose condition fails is not shown.
The check is done by `src/lib/network-habits.ts`, and the Japanese and English pages use the same check.

The heading used to name the writer's habits, and the lines described the numbers as the writer's habits, as in "Papers are read one theme at a time, each theme gathered into a single period."
The present lines state only the relations among numbers that the conditions check.
The reading of those numbers as the writer's habits stays in this note, under "Clusters passed through, period by period" and "A reading from design theory".

| No. | Line on the page (with this build's values) | Work to look at |
|---|---|---|
| 1 | “Watching the industry” is the only group of sources that notes cite in all six periods. | River |
| 2 | Each group made almost entirely of papers is cited mostly in one period. | Rings |
| 3 | No note that cites a source in “Watching the industry” also cites a source in “Learning and cognitive load” or a source in “Measuring dispositions and ability”. | Bundle |
| 4 | Notes from five of the six periods cite the same paper, which found that stories written with ideas from generative AI end up more alike. | Constellation |
| 5 | Any two notes that cite 10 or more sources in common were written within three days of each other. | Arcs |

On the page, each line has a link to the work where it can be seen (such as "See it in River ↑"), and the supporting sentences sit under "What each point rests on" inside "More detail, and sources" at the end.
The condition behind each line and its value in this build are as follows.

- **Condition for line 1**: exactly one cluster has segments in all six periods. This time only "Watching the industry" qualifies, with 175, 15, 32, 28, 11, and 13 segments per period (the same values as in "Clusters passed through, period by period").
- **Condition for line 2**: at least two clusters have a paper share of 95% or more (as a percentage rounded to the nearest whole number) and two or more knots, and every one of them has 70% or more of its segments in a single period. This time four clusters qualify: "Generative art and creativity" has 81 of 100 segments (81%, period 3), "How to frame research questions" 83 of 112 (74%, period 2), "Learning and cognitive load" 74 of 86 (86%, period 3), and "Measuring dispositions and ability" 79 of 90 (88%, period 3). The supporting sentence on the page rounds the lowest share down and says "at least 74%". The paper share of "Measuring dispositions and ability" is 37 of 39 (94.9%), which rounds to 95%.
- **Condition for line 3**: the cluster of line 1 exists, and some cluster (with two or more knots) has never been cited together with it in a single note. 43 notes pass through knots of "Watching the industry", and none of them also passes through a knot of "Learning and cognitive load" or "Measuring dispositions and ability". "Public skill standards", with a single knot, never shares a note with "Watching the industry" either, but the two-knot condition leaves it out.
- **Condition for line 4**: the knot with the highest betweenness is Doshi & Hauser (2024), and the notes citing it span four or more periods. Because the line states what this paper says, the line is dropped entirely if another reference takes the top place. This time its betweenness is 1, and it is cited by 8 notes spanning five of the six periods (all but period 5).
- **Condition for line 5**: at least three pairs of notes share 10 or more sources, and every such pair was written within 3 days of each other. A source cited by both notes of a pair is always a knot, so the count is of shared knots. This time seven pairs qualify, the largest gap is 3 days, and five of the seven pairs were written on the same day. The most, 35 sources, are shared by [The Scholarly Lineage of Generative Art: A 94-Item Literature Map from Information Aesthetics to the Post-LLM Era](https://jamjet-iqbal.com/en/notes/generative-art-literature/) and [Which Angle for a Generative-Art Review Paper Attracts Citations? An Empirical Analysis Using Bibliographic Data](https://jamjet-iqbal.com/en/notes/generative-art-review-citation-strategy-literature/), written on 08-02. The others are [Where Do Novel Research Questions Come From? The Four Loci and Their Combinations, Examined Against the Literature](https://jamjet-iqbal.com/en/notes/novel-research-questions-literature/) and [How Novelty Is Made and How It Is Claimed: A Typology of Establishing Strategies](https://jamjet-iqbal.com/en/notes/novelty-establishing-strategies-literature/) on 07-27 (24), [TypeSafe AI's Jev: What It Guarantees and What It Does Not](https://jamjet-iqbal.com/en/notes/typesafe-ai-jev/) on 09-18 and [How to Use Jev, and Where Not To](https://jamjet-iqbal.com/en/notes/jev-usage-patterns/) on 09-21 (18), the same [TypeSafe AI's Jev: What It Guarantees and What It Does Not](https://jamjet-iqbal.com/en/notes/typesafe-ai-jev/) and [When Judgment Becomes a Function Call, What Moves in Design](https://jamjet-iqbal.com/en/notes/jev-typed-judgment-design/) on 09-21 (17), [When Is a Disposition Being Measured? Measurement as Conditional Tendency, and Measurement as Co-occurrence](https://jamjet-iqbal.com/en/notes/disposition-measurement-literature/) and [How Might Gyaru-Mind Be Measured: What the Two Existing Scales Leave Out](https://jamjet-iqbal.com/en/notes/gyaru-mind-measurement-design/) on 08-15 (16), [The Genesis of LLM-as-a-Judge: A Confluence of Three Lineages and Four Demands](https://jamjet-iqbal.com/en/notes/llm-as-a-judge-history/) and [Recent Currents in LLM-as-a-Judge: A Literature Map of 53 Core Studies and a Standalone Chapter on Creativity Evaluation](https://jamjet-iqbal.com/en/notes/llm-as-a-judge-literature/) on 07-29 (13), and [Where Are the Gaps in AI Research? Seven Voids Found by Reframing](https://jamjet-iqbal.com/en/notes/ai-research-gaps-abduction/) and [AI Research Gaps, a Third Time: Rereading Them as Rewritings of the Game Board](https://jamjet-iqbal.com/en/notes/ai-research-gaps-problem-definition/) on 07-19 (11).

The five lines rewrite readings from the sections above as conditions that can be checked on every build.
Lines 1 and 2 correspond to "Clusters passed through, period by period", line 3 to the second point of "A reading from design theory", line 4 to the fourth, and line 5 to the reading of paired notes in the first.

## Drawing it as artworks

The [Citation Network](/en/network) page draws this result as fifteen works.
Nine of them are live works that generate a new arrangement on every page view: marbling, the rings, the weave, and the constellation, and the swarm works slime mould, school, cells, foam, and brushstroke.
The other six are stills that draw their finished form at once: the bundle, the arcs, and the river, and the swarm stills dry garden, coral, and roots.
The tabs place the live works first and then the stills, in this order.
With no URL hash, the leftmost work, marbling, opens.
Marbling replaced an earlier work; a link with the earlier work's hash is rewritten to the marbling hash when it opens.
Every work is first drawn in thin lines only, and bleed is added as a "finishing" step once drawing ends (only the weave's threads do not bleed; described under "Thin lines while drawing, and the finishing" below).

The page shows the pictures first.
From the top come the heading and a one-line description, the works drawn large, how to read the work (a table of what is seen and what it stands for), the four steps and six quantities from notes to pictures, and "What stands out" from the previous section (five lines), all open.
The reading shows only the work picked in the tabs and switches with them.
Everything else goes into a closed "More detail, and sources" at the end.
That section holds how to read position and distance, how the swarm works move, the 11 groups, the six periods, what each point rests on, the numbers, raw data and records, and the references.
Every number on the page is counted from the data at build time.

The shape of a reference's mark, the way clusters are shown, and the bleed of lines follow the same rules in all fifteen works.
The shape shows the kind of reference, and the bleed shows the age of the link a line stands for (both are described under "The two looks" below).
Clusters are shown in order of paper share: in the light look, the fewer papers a cluster has, the lighter its ink; the more papers, the darker.
Theme names, not cluster numbers, are written over the figure.

### How periods are labelled

Periods are shown by a circled number and a short name.
Inside the figures only the circled number appears, small (in the crack of the rings, beside the baseline of the arcs, and on the scale under the river); the short names are kept out of the figures.
The circled numbers, short names, how each span is phrased (such as "Early June to mid-July 2026"), and the number of notes are listed once, under "The six periods" in "More detail, and sources", and the top-page heading appears on the card shown when a period is selected in a figure.
"Period 1" to "period 6" in this note are ① to ⑥.

| Label | Span | Heading on the top page | Notes |
|---|---|---|---|
| ① Work and pay | 06-07 to 07-12 | How AI changes designers' work and pay | 44 |
| ② Research methods | 07-15 to 07-29 | Research methods, and how questions are framed | 37 |
| ③ Learning and measuring | 08-02 to 08-24 | Learning, and measuring ability | 34 |
| ④ Slop and lineage | 08-27 to 08-31 | AI slop, and where design as a field came from | 10 |
| ⑤ Standards | 09-11 to 09-14 | Design systems, and the standards work sits on | 5 |
| ⑥ Judgment and making | 09-18 to 09-22 | Judgments handed to AI, and thinking by making | 12 |

The labels and headings live in one place, `src/data/interest-periods.ts`, which both the top page and the Citation Network page read.

### The two looks

The works switch between two looks with the site theme.
The light one looks like sumi ink printed on hand-made washi paper; the dark one looks like light laid over a dark field.
Outside the frame of the figure (headings, text, buttons, tables), both themes look like every other page of the site.

The washi ground of the light look is made of formation clouds (uneven thickness of the sheet), long kōzo fibres, bark specks and other inclusions, an uneven deckle edge, and a fine paper tooth.
Its colour is rgb(246, 243, 235), and its pattern is fixed per seed.

In the dark look, only the field of the figure becomes a near-black #07080b, and lines add up (lighter), so overlaps glow brighter.
The light is spread by bloom (adding back downscaled, blurred copies of the picture), over faint star dust.

The way clusters are shown also changes with the look.
The 11 clusters exceed the number that categorical colours can tell apart (eight), and they already carry an order, the paper share.
An ordered quantity needs only steps of lightness (or shade); hue carries no meaning.
So each look fixes a single hue and shows the clusters on one ordered scale.
In the light look the scale is the shade of one ink, oklch(0.195 0.012 60), at opacity 0.46 to 0.90: clusters with fewer papers are lighter, clusters with more papers darker.
In the dark look it is the brightness of one near-neutral, slightly warm white light, oklch(L 0.018 75), with L in even steps from 0.44 to 0.97 (about 0.053 between neighbouring clusters).
Clusters with fewer papers are dimmer, clusters with more papers brighter.
Even the dim end stays bright enough to see on the near-black field.
Earlier, the light look's ink leaned slightly blue for fewer papers and slightly brown for more, and the dark look used a colour scale whose hue shifted along the order.
The change of hue added nothing to the order of the clusters, so it was removed.
In both looks, red marks only the element under the pointer or the selected element.
Every point turns red the same way on hover and on selection.
No work uses red in its default picture.
The point of the most cited source is drawn in its cluster's shade (brightness in the dark look) like any other point.
The still bundle used to keep the most cited source red, but a single red point left in the default picture draws the eye before the data, so it was dropped.
Cluster names are written on the figure and in each work's table, so no cluster has to be told apart by colour alone.

The shape of a reference's mark is the same in both looks and shows the kind of reference.
There are two kinds.
**Academic** means papers and preprints, drawn as a filled disc.
**Practice** means companies, public bodies, and the web, such as news and blogs, drawn as a ring.
This is the same split as the "papers" and "web pages" used for the paper share: academic corresponds to papers, practice to web pages.
The shape shows each reference's kind, and a cluster's shade (its brightness in the dark look) shows the share of academic references in it.
The ring is drawn thin to match the fine lines, and thickens only slightly with its radius so that a small one can still be told from a disc (0.22 of the radius, but never below 0.7 px or 0.75 of the scale, and never above 0.4 of the radius so the hole stays open).
Neither shape has an outline.
The disc and the ring have the same outer radius, so the size of a mark still shows only the number of citing notes.
Of the 445 knots, 295 are academic and 150 are practice.

The bleed of a line shows the age of the link it stands for.
**Age** is how long before the day the last note was written (09-22) a date lies, divided by the span from the first note (06-07) to the last; the newest day is 0 and the first day is 1.
The amount of bleed is this age rounded to five levels (0, 0.25, 0.5, 0.75, 1); the older a line, the further its ink soaks into the paper in the light look, and the wider and softer its glow in the dark look.
Red lines never bleed in either look.
Knot marks, and the note ticks of the arcs and the rings, do not bleed either.

For each work, age is measured from the day the line came into being.

- **Marbling**: a ring's line takes the age of the day its note was written, times 0.7.
- **Weave**: threads do not bleed (see "The weave and the constellation").
- **Constellation and bundle**: a line is dated by the day the note that first cited both sources together was written.
- **Rings**: a line from a note to a knot is dated by the day the note was written. A period ring takes the age of the period's start day times 0.7, so it bleeds less than the lines.
- **Arcs**: an arc is dated by the day the newer of its two notes was written, since a bibliographic-coupling arc comes into being on that day.
- **River**: the band boundaries and the strands inside the bands are dated point by point along the horizontal axis and split where the level changes; the further left, the older. The band fills do not bleed.

Bleed is not a post-process applied to the finished picture; it is part of how each single line is drawn.
In the light look, a line with bleed 0 is a sharp brush line with only its core.
As the amount rises, the core grows paler by the ink that moves outward (0.5 times at bleed 1), and a wet body spreads around it.
The body is the core's shoulder plus four outlines that grow fainter outward, so it is darker where they overlap on the inside.
It is drawn on a coarse layer and laid onto the paper blurred, so its edge fades smoothly into the paper without steps.
The body's ink does not take the line's colour; it is a warm black along the hue of the washi ground (rgb(34, 31, 27)), laid at low opacity so the washi pattern shows through.
The spread grows with the 1.6th power of the amount, so lines of middle age spread modestly and only the oldest lines spread wide.

Just inside the outer edge of the body, ink gathers in a thin, faint band.
Only the outer edge of that band wavers slightly with the direction of the washi fibres and the paper tooth (by a tenth of the spread, smoothed twice with its neighbours).
The band is weakened the more crowded with lines the place it passes through is.
Where lines run densely side by side, their edge bands overlap, and without that weakening the overlaps would read as ragged stripes.
Only lines at the two oldest levels (0.75 and 1) get fine, faint grains inside the body, darker in the valleys of the paper tooth.
No feathering runs out along the fibres beyond the edge.
The bundle and the constellation, which draw more than a thousand lines (and the rings when they have more than 1,200 lines), leave out the edge band and the grains, and weaken the body by how crowded the lines are.

In the dark look, the same amount becomes the spread of the glow.
The glow has four layers that grow fainter outward (three in the bundle and the constellation); the larger the amount, the weaker the glow as a whole and the dimmer the core (0.42 times at bleed 1).
Within a layer, glows take the lighter of the two (lighten), and layers are added, so even where lines are dense the glow stops at the cluster's colour instead of burning to white.
The finishing adds bloom on top.

The washi and the ink are not a fluid simulation.
The flow of the water surface in marbling likewise only carries points along a velocity field given by formulas; no fluid equations are solved.
The ideas come from studies that model paper and ink on the computer.
Curtis et al. (1997) model paper as a height field together with a fluid capacity (§4.1), and treat the edge darkening where pigment gathers at the rim of a wet area (§4.3.3, eq. (3)) and the granulation where pigment settles into the valleys of the paper (§2.1 and §4.5) (full text checked).
The band where ink gathers inside the outer edge of the body draws on this edge darkening.
The band is kept faint and is weakened where lines are crowded, so the edge never gets as dark as in Curtis et al.'s (1997) watercolours.
The grains in the body of old lines draw on the granulation.
Chu & Tai (2005), according to the abstract, compute percolation in a non-uniform porous medium with the lattice Boltzmann method to reproduce ink dispersing in absorbent paper in real time.
This site does not do that computation; it borrows only the look of paper absorbing differently from place to place, so that the edge wavers.
Guo & Kunii (1991) model the bleed of sumi painting from the structure of the paper, the flow of the liquid, and the adsorption of particles; the topic was checked through an index abstract and the related-work section of Curtis et al. (1997).
Keeping bleed as the width and edge of each line (the five levels, the layering of wet body, edge band and grains, the formula for the spread, and the weakening by crowding), letting the outer edge of the band waver along the direction of the washi fibres and the paper tooth, the way the washi fibres are drawn, and mapping bleed to age are not in these studies; they are this site's own design.
No peer-reviewed graphics study that models the fibre structure of washi was found (Japanese-language databases were not searched).

### Thin lines while drawing, and the finishing

Every work is drawn in thin lines while it is being drawn.
A thin line is a brush line with only its core: it tapers in and out at both ends, and its width wavers by the work's brush pressure or by a per-line random wave (0.75 to 1.25 times, about 40 px long); it has no bleed.
Both ends taper to the same width, and the entry is not heavier (the brush pressure of the weave threads and the arcs used to start thick and thin out toward the exit).
The older the line, the slightly paler its ink (0.8 times at bleed 1).
In the dark look a thin line is a thin line of light, and a light bloom (one copy of the picture downscaled to 1/6, added back) is laid over the whole figure every frame.
Bleed is also left out while drawing because wash lines are too heavy to redraw every frame.
In a measurement noted in the implementation, drawing the test bench's 142 threads (120 points each) in the light look took 46 ms with thin lines and 286 ms with wash (Chrome software rendering, 1280 × 800).

When drawing ends, a "Finishing" label appears at the lower left, where the period label sits.
The same drawing is drawn once more with only the way of drawing lines switched to ink wash, and the picture moves from thin lines to wash over about ten seconds.
The progress advances in proportion to elapsed time, and the smoothness is left to the compositing curve alone (a smoothstep, flat at both ends).
It used to take about two seconds with easing on the progress as well; easing applied twice makes the change look abrupt in the middle.
In the light look the wash picture darkens while tightening from a blur, and the thin picture fades away, so the ink seems to soak into the paper.
The wash picture carries the same cores, so no line seems to vanish on the way.
In the dark look the stage where the glow fills in and the stage where the bloom fills in overlap, so there is no moment of switching.
The label changes with the work and the theme and says what the finishing is doing in that work.
In marbling, for example, the light look starts with "Finishing: redrawing the fine rings in wet ink" and switches in the second half to "Finishing: letting older rings bleed into the paper".
The dark look shows "Finishing: letting older rings glow wider" and switches in the second half to "Finishing: laying a soft glow over the whole picture".
The weave's threads do not bleed, so in the light look the finishing leaves them unchanged, and in the dark look only the finishing bloom is added.
When the move ends, the label fades, and the live region announces "Finished".
For the live works, the thin picture at the moment drawing ends is identical to the last frame down to the pixel, and the finishing starts from that picture.
The three stills also draw their thin picture at once and then run the same finishing.
With reduced motion (prefers-reduced-motion), the arrangement is computed to the end and the finished picture is drawn at once, without the label.

The finishing is a separate step with its own label so that the finished state reads as a clearly marked last move, not as a continuation of the drawing.
Without the label, lines thickening and soaking into the paper would be hard to tell from the network still growing.

Points are drawn quieter than lines.
A point is drawn at 0.65 of the radius used for hit-testing and for placing the card (red points at 0.78), so it stays as easy to tap as before.
The order of sizes does not change.
In the light look a point's ink is filled at 0.72 of the cluster's shade.
In the dark look the glow around a point is weak (strength 0.14; 0.9 for red), and a core, the cluster's colour moved towards white, sits at opacity 0.58.

Every work has a "Show points" button below it; pressing it removes every point (marbling's points, knots, stars, the bundle's marks, the note ticks of the arcs, and the small faint dots of the next paragraph) and leaves only the lines.
The river's only points are the small faint dots.
While points are hidden their hit targets are removed too.
The arrangement is not recomputed; the picture is only redrawn, and a finished picture is redrawn already finished.
The button's state is kept across switching works and "Generate again", and is not saved.
The only buttons below the works are this "Show points" and, for the works arranged by forces, "Generate again".
The earlier buttons for saving an image and for turning the network to the long side of the frame were removed.

Sources cited by only one note (3,782) are not knots, but every work places them as small faint dots around where that note sits.
Their size and strength vary slightly per seed, and their shade (brightness in the dark look) is the level of the cluster the note cites most.
Where they go in each work:

- **Weave**: around the note's thread (the grains it already had).
- **Marbling**: around the spot where the note's ink was dropped, with a standard deviation of 0.45 times the ink drop's radius; like the knot points, they are not carried by the flow.
- **Rings**: around the note's tick, inside the band of its period. Along the ring the standard deviation is an arc length of 2.2 px · u · √(sources cited); inward they shift by a half-normal with standard deviation 0.3 times the band's thickness.
- **Constellation**: around the centroid, on the sphere, of the stars the note cites. They are scattered by a normal distribution in the tangent plane (standard deviation 0.55 times the spacing per star × √(sources cited)) and mapped by the same stereographic projection. Dots of notes without knots sit around a point in the view ellipse fixed by the seed and slug.
- **Bundle**: just inside the circle, toward the circular mean angle of the sources the note cites.
- **Arcs**: above the note's tick, on the arc side. Height is half-normal with standard deviation 1.6 px · u · √(sources cited), so the more sources a note cites, the higher they pile.
- **River**: at the date the note was written (±2.5 days), inside the band of the cluster the note cites most.

The small faint dots are never hit targets, and in the live works they appear when their note arrives.

### The forces that arrange the live works

In marbling, the weave, and the constellation, the positions of the knots are computed in the viewer's browser from a balance of forces that push points apart and pull them together.
The three works differ in the space they are placed in and in how far the push reaches.
Marbling places its knots in a rectangle with the same proportions as the frame (this note calls it the **plane**), and the constellation places them on the unit sphere (the **sky**).
The weave grows its network on a plane with no frame (the **free plane**) and fits the settled network to the frame by rotating it.
The rings are arranged by a separate computation confined to cells, described under "Why the rings are not left to the forces".

The form of the forces is borrowed from ForceAtlas2 (Jacomy et al., 2014).
In ForceAtlas2, repulsion is proportional to the product of the two nodes' degrees plus one and inversely proportional to distance (F_r = k_r (deg_1 + 1)(deg_2 + 1) / d, eq. 2 of the paper).
Gravity is proportional to degree plus one (F_g = k_g (deg + 1), eq. 4), and the attraction along a weighted edge is proportional to the weight and the distance (F_a = w^δ d, eq. 6).

This site takes the number of notes citing a knot as its **mass** m, and bases the strength of its push on the square root of that (this note calls it the **charge** q).
Attraction along co-citation edges is F_a = k_a w d: eq. 6 with δ = 1, multiplied by a coefficient k_a (1 in marbling, 0.3 in the constellation, 0.04 in the weave).
ForceAtlas2's attraction has no coefficient; k_a keeps each tick's step small enough for the explicit integration to stay stable.
The ForceAtlas2 paper does not use the word "mass"; deg + 1 appears there as a coefficient of repulsion and gravity.
Using mass as inertia, so that acceleration is F / m, is this site's own design.

The form of the repulsion depends on the space.
The weave's repulsion is F_r = k_r q_i q_j / d, eq. 2 with the product of charges in place of the product of (deg + 1), and it reaches every pair.
The weave pairs it with a pull to the center of constant size, F_g = k_g g (the form of eq. 4 without the (deg + 1) factor), and the network settles into a roughly disc-like shape.
In marbling and the constellation, the repulsion is cut off at a reach R: F_r = k q_i q_j (1/d − 1/R) for d < R, falling continuously to 0 at R.
A 1/d repulsion that reaches every pair makes a two-dimensional Coulomb system on the plane: paired with a pull to the center it settles into a disc, and shut in a box its charge piles up at the walls.
A repulsion that reaches only a few times the mean spacing acts like the pressure of a gas in a box, so the knots fill the box at an even density.

In marbling and the constellation, the split between clusters is made by the reach of the repulsion.
Repulsion between knots of the same cluster reaches a short way (in marbling, 1.6 times the mean spacing, coefficient 1), and repulsion between knots of different clusters reaches far and pushes hard (in marbling, 8 times, coefficient 3.5).
The sky uses the same form: 3.4 times within a cluster, 8 times across clusters with four times the coefficient.
Knots in a cluster can come close to each other, clusters are pushed apart, and sparse gaps remain between them.
No cluster boundaries or filled areas are drawn; a cluster reads only through how densely its points crowd.
Since the clusters were found from co-citation by the Louvain method, this repulsion reinforces the co-citation structure once more at the level of clusters.
The weave's repulsion does not distinguish clusters.

The charge is kept apart from the mass so that the inertia actually takes effect.
If the repulsion carried the product of masses, a knot's own mass would cancel in F / m, and a heavy knot would get the same acceleration as a light one.
In the present form, under every force, the same force accelerates a knot less the heavier it is.
The measurements made with the weave's implementation before families and temperament were added, however, showed no tendency for knots cited by more notes to move less per tick.
The more notes cite a knot, the larger the total weight of its co-citation springs, roughly in proportion to its mass, so the spring strength per unit of mass does not fall.
What the design supports is therefore "the same force accelerates a heavy knot less", not "heavier sources move less".
The formulas and the measured values are under "The force computation" in "Formulas of the works" below.

In marbling and the constellation, the charge also carries a per-knot variation.
It is q_i = √m_i · exp(σ z_i), where z_i approximates a standard normal draw from the seed, and σ is 0.7 on the plane and 0.8 on the sky.
Of the 445 knots, 332 are cited by two notes; if their charges were equal, the balance of short-range repulsion would pack each cluster into an evenly spaced, hexagonal lattice.
The variation makes the spacing irregular, so it reads as the unevenness of scattered points or of a starry sky.
The variation applies to the repulsion only, not to the mass (inertia) or to the co-citation springs.
The weave's charge stays √m.

The plane adds three more forces.
The edge force is the repulsion a knot would feel if knots of the same density continued beyond the edge, scaled by 0.6; it keeps knots pushed from inside from lining up along the edge.
A weak linear pull to the center (coefficient 0.8) keeps small clusters, pushed by the long cross-cluster repulsion, from lining up in a row at the edge.
Time enters as a target on the horizontal axis given by the order in which knots arrived in the network (older on the left in the setting).
An arriving knot is placed near its target and is afterwards pulled toward it by a very weak spring (coefficient 0.004).
The spring is much weaker than the co-citation attraction, and in the settled arrangement the rank correlation (Spearman) between horizontal position and arrival order was close to 0 (−0.20 to +0.34 across five seeds at two aspect ratios, 1.605 and 1.638).
Neither period nor age can be read from horizontal position in marbling.
In marbling, time is shown by how the rings overlap, stretch, and bleed (described under "Marbling").
A note with no knots joins the plane as a mass-1 particle with no springs.
The particle arrives at a uniformly random point in the rectangle, pushes against every other particle with a short repulsion, and drifts into the gaps between clusters.

On the sky, the knots move as three-dimensional positions on the unit sphere.
After each move they are returned to length 1, and their velocity is dropped onto the tangent plane.
The sphere is mapped to the frame by a stereographic projection centred on the viewpoint, with a full angle of 136° along the long side of the frame.
The stereographic projection preserves angles, so the shapes of the constellations are not distorted, and they appear larger toward the edge of the view.
An elliptical pull toward the centre of the view (matched to the frame's proportions and weakened along the long side) keeps the spread of stars inside the frame, and a soft edge force pulls back only the stars whose elliptical radius exceeds 0.88.
No constraint presses stars against the frame, so the outline of the spread follows neither the rectangle nor a circle.
No coordinate grid is drawn.
According to its abstract, Kobourov & Wampler (2005) generalize force-directed layout to spherical and hyperbolic geometry through projections onto tangent spaces.
This site uses a simpler form, computing forces from three-dimensional difference vectors and dropping them onto the tangent plane, and does not use that paper's computations.
Snyder (1987) is given as the standard source for the formulas of the stereographic projection.

The free plane has no frame.
The network settles where the push between all pairs balances the pull to the center, and the settled network is rotated to fit the frame (the fitting is described in the next section).
Overlapping circles are pushed apart so that drawn knots do not overlap (the same idea as d3-force's forceCollide).
The free plane's coefficients and the form of its pull to the center change with the seed (next section).

The order in time also enters the computation.
Notes arrive one at a time in the order they were written, and each arrival adds the knots that note cites and the springs between them.
The arrangement shifts a little with each arrival and settles after the last note has arrived.
The random seed changes on every page view.
The seed is not shown on screen; it is written only to the URL hash (`#<work>/<seed>`).
Opening the same hash reproduces the same arrangement.
Within one view, every work arranged by forces uses the same seed.

Drawing a graph by letting points push apart while springs pull edges together goes back to Eades's (1984) spring embedder.
Eades treated vertices as rings and edges as springs of logarithmic strength (C_1 log(d / c_2)).
Fruchterman & Reingold (1991) also belong to this line of force-directed methods.

### Why no single arrangement is shown as the answer

The earlier page showed every viewer the same arrangement, computed once at build time with a fixed seed.
When the same picture appears every time, viewers tend to take the positions themselves as meaningful.
Positions found by forces, however, depend on the starting positions.
Gansner et al. (2005) used 25 random initial layouts when comparing their method, which presupposes that layouts vary with the starting positions.
Venturini et al. (2021) argue that when viewing a network laid out by a force-directed model, the closeness a viewer reads retains relational ambiguity.

The live works therefore generate a different arrangement on every view.
Pressing "Generate again" below the works grows the network again from the start with a new seed.
What changes is only the positions of the points, the paths of lines, and the shapes of marbling's rings that follow from them; in the rings, the direction of the crack changes as well.
In marbling, the seed also sets the direction of the flow (one of the two directions along the long side of the frame), the phases of the band flows, and which way the vortices turn.
Which points are joined by lines, which thread passes through which points, which note's drops fall on the centroid of which points, and the co-citation weights are fixed by the data and do not depend on the seed.

On marbling's plane and the constellation's sky, the seed changes four things.

- **Placement**: the jitter of a knot's position when it arrives, and where a source with no co-cited partner yet is placed.
- **Charge variation**: the per-knot factor exp(σ z_i).
- **Small coefficient ranges**: 0.85 to 1.15 times for the plane's attraction and time spring, and 0.94 to 1.06 times for the reach of cross-cluster repulsion.
- **The sky's viewpoint**: the centre of the view (uniform on the sphere) and the roll about the line of sight.

What the seed does not change: the set of knots, the co-citation edges and weights, the clusters, the sizes (the mass, and √m as the base of the charge), the order in which notes arrive, and the type of space (the plane's proportions and the axis carrying time, the width of the sky's view).
The large shape of an arrangement is always one rectangle filling the frame on the plane, and always a set of islands with starless sky between them on the sky; the seed changes where clusters sit and the details.

On the weave's free plane, the seed also draws three more things.
All of them change the initial configuration and the ranges of the force coefficients; none of them touches the co-citation relations.

- **Orientation**: a drawing rotation θ uniform on 0 to 2π, and a reflection with probability 1/2. Rotation and reflection are applied only when fitting to the frame. If θ would give an elongated network less than 75% of the scale of its best-fitting orientation, θ is moved to the nearest orientation that reaches 75%.
- **Initial-configuration family**: one of six, disc, spiral, ring, two lobes, line, and scattered clusters, chosen with weights 1, 1, 1, 1, 0.8, and 1.2. For every family but the disc, the point each knot's pull to the center aims at is moved from the center of the network to a position given by the family's template, and that pull is tripled. This note calls it **memory gravity**. The network is drawn toward the template while it grows and while it cools, so the large shape remembers the template. Template positions are decided only by the clusters (Louvain) and the order in which knots arrived. In the ring, for example, each cluster's arc is placed on a circle, with knots along the arc in order of arrival; in the two lobes, the clusters are split in two by a division with few co-citations across it.
- **Temperament**: the repulsion coefficient is multiplied by 0.7 to 1.5, the attraction coefficient by 0.7 to 1.4, and the pull-to-center coefficient by 0.5 to 2 (uniform on a log scale). In addition, with probability 0.3 the attraction becomes the LinLog type (the form of ForceAtlas2's eq. 3), and with probability 0.2 the pull to the center becomes a strong gravity proportional to distance (the form of eq. 5).

Because template positions depend only on clusters and arrival order, sources cited together are pulled toward the same place.
The design expects that choosing a family does not break the relation that closeness comes from co-citation.
This expectation, and how much the arrangements vary, were measured on the arrangements for seeds 1 to 8.
Variation was measured as the misfit that remains after two arrangements of the knots are overlaid with translation, rotation, reflection, and scale matched (the Procrustes disparity: 0 means the same shape, and values close to 1 mean different shapes).
The mean over the 28 pairs of the eight seeds was 0.543 for the implementation before families and temperament and 0.784 for the present weave.
For every seed, the set of co-citation edges and their weights were identical (5,870 edges).
Preservation, measured as the rank correlation (Spearman) between the co-citation weight w and the distance for each pair of knots, was −0.336 to −0.370 over all pairs for the present weave and −0.372 to −0.379 for the implementation before families and temperament.
Over the pairs joined by an edge only, it was −0.413 to −0.489 and −0.485 to −0.568 respectively.
It is negative for every seed: sources cited together more often are still placed closer.
The correlation is, however, slightly weaker than before families and temperament.
A likely reason is that the pull toward template positions sets positions separately from the co-citation springs.
The family template sets the large shape of the network, but shapes such as a spiral or a ring represent no relation in the data.

The structure of the three arrangements was compared as the mean over five seeds (7, 11, 23, 101, 202).
Every distance was measured in the coordinates mapped to the frame.
Marbling was measured on a 1085 × 676 px frame, at the positions of the knots in its layout (marbling's points).
The weave and the constellation were measured on a frame 968 px wide with aspect ratio 1.638.
The weave was run until it settled, with a cap of 20,000 ticks, and then fitted to the frame.

| | Spearman(w, distance) | within / between | silhouette | purity of 5 nearest | CV of nearest distance |
|---|---|---|---|---|---|
| Marbling (plane) | −0.468 | 0.195 | 0.623 | 0.976 | 0.33 |
| Weave (free plane) | −0.448 | 0.265 | 0.377 | 0.897 | 0.13 |
| Constellation (sky) | −0.426 | 0.290 | 0.464 | 0.962 | 0.35 |

- **Spearman(w, distance)**: the rank correlation between the weight w of a co-citation edge and the distance between its two ends. The more negative, the closer sources cited together more often sit.
- **within / between**: the mean distance between pairs of knots in the same cluster divided by the mean distance between pairs in different clusters. The smaller, the more tightly clusters hold together.
- **silhouette**: for each knot, (b − a) / max(a, b), where a is its mean distance to its own cluster and b its mean distance to the nearest other cluster, averaged over all knots. The closer to 1, the more clearly clusters separate.
- **purity of 5 nearest**: for knots in clusters of six or more knots, the mean share of the five nearest knots that belong to the same cluster.
- **CV of nearest distance**: the coefficient of variation of each knot's distance to its nearest knot (dropping the shortest and longest 10%). The smaller, the more evenly spaced, as in a lattice.

Marbling and the constellation have a higher silhouette and purity, which show how clusters separate, than the weave.
This is because repulsion between sources of different clusters reaches further and pushes harder than within a cluster.
The correlation between co-citation and closeness is slightly stronger than the weave's in marbling and slightly weaker in the constellation.
The within / between ratio is smaller than the weave's in marbling and slightly larger in the constellation.
The ratio in the constellation likely does not shrink because the stars within each cluster also spread to fill the view evenly (this mechanism was not tested).
The CV of the nearest distance is 0.33 in marbling and 0.35 in the constellation against 0.13 in the weave: points in marbling and the constellation are spaced less regularly than in the weave.
Across seeds, the correlation ranged from −0.45 to −0.49 for marbling, from −0.41 to −0.52 for the weave, and from −0.40 to −0.47 for the constellation, and it was negative for every seed.
The silhouette ranged from 0.58 to 0.67 for marbling and 0.44 to 0.49 for the constellation, against 0.21 to 0.54 for the weave, so in marbling and the constellation how readable the clusters are varies less from seed to seed.
The weave's values matched, seed by seed, those of the arrangement the three works shared before marbling and the constellation were given spaces of their own.
The measurements were made on a test bench that runs only the layout computation outside the browser.

What survives from one arrangement to the next is only relative closeness, which knots sit near which, and, in marbling and the constellation, how densely the clusters crowd.
The overall shape and orientation change every time and carry no meaning.
Large shapes in the weave, such as a spiral, a ring, or a band, are also not relations in the data but the family template the seed chose.
For example, in the build-time reference layout, "Public skill standards" sat at the right edge (x = 0.95).
Since this cluster has no edges, that position says nothing about its relation to other clusters.
Relations between clusters are more reliably read from the edge counts given above than from positions in any arrangement.

### Why the rings are not left to the forces

In the rings, the six rings from the center outward are the six periods, with period 1 at the center.
Each knot sits on the ring of the period in which it was first cited.
Angle shows the cluster: going clockwise, the slices run from the smallest paper share to the largest.

If the start of that order (the cluster with the fewest papers) touched its end (the cluster with the most), the minimum and the maximum would look continuous.
The rings therefore have a single wedge-shaped crack, like the radial check that opens in a drying cross-section of a tree.
The crack opens 25° at the outer edge and narrows toward the center, to 0.78 of that at the center.
The slices start at one edge of the crack and run clockwise to the other edge.
The band rings thin out before the crack like a lifted brush and break off, and the note ticks near the crack also thin.
The direction of the crack turns with the seed, so "Generate again" moves the crack as well.
The clockwise direction of the slices, and the mapping of radius to period and angle to cluster order, do not change.

Outside the rings, a thin gauge arc is drawn as a scale of paper share.
It runs clockwise from an edge of the crack, starting with a small dot on the side with fewer papers and ending with a small arrowhead on the side with more.
Its colour follows the same progression as the cluster scale (light to dark ink on paper, dim to bright light at night), and it carries no text.
Periods are marked only by circled numbers (① to ⑥), small and faint, at the height of each band inside the crack.
A period gets no number where the number does not fit in the width of the crack or the thickness of the band.

Forces run in the rings too, but they are applied differently from the weave and the constellation.
A knot cannot leave the cell where the band of its period meets the slice of its cluster, and after each tick it is put back inside the cell.
It is pulled to the cell's center by a strong gravity proportional to distance (the form of ForceAtlas2's eq. 5 without the mass), and repulsion works only between knots of the same cell.
Co-citation attraction still works weakly across cells, so a knot leans a little toward the side where its partners are.
That is about all a position inside a cell shows; small shifts mean nothing.

The rings and slices were kept out of the forces' hands so that the data values, period and cluster, map straight onto position.
The hive plots of Krzywinski et al. (2012) set the axes and the coordinates along them from node attributes.
According to the publisher's abstract, unlike force-directed layouts, this makes the plots reproducible and comparable.
The bands and slices of the rings borrow this idea and confine the part decided by forces to the inside of each band and slice.

### Marbling

Marbling (suminagashi) is the technique of dropping ink onto a water surface to form a pattern and transferring it to paper.
In the marbling work, each note becomes a pair of drops: one drop of ink and one drop of water.
Notes arrive one at a time in the order they were written; each arrival drops the ink, and then drops the water at the same centre right after.
Pushed by the water, the ink becomes a thin ring.

A drop falls at the centroid of the positions, in the plane's layout, of the knots the note cites.
A note with no knots drops at the current position of its particle in the plane's layout (the particle has been carried by the drops and flows so far).
The area of the ink drop is proportional to the number of knots the note cites (a note with no knots counts as 1).
The water drop's radius is 0.8 times the ink drop's, and the total area of all ink and water is 1.7 times the area of the frame's inner box.
Because the total exceeds the box, the pattern fills the frame to its corners, and the older outer rings are cut off at the edge of the paper.

The drop map uses the formula checked on Jaffer's explanatory page (Jaffer, 2010).
Dropping a drop of radius r centred at C moves a point P on the water surface to C + (P − C) √(1 + r² / |P − C|²).
The page shows, from the areas of concentric annuli, that this map preserves the area of every neighbourhood not containing C.
A new drop pushes older rings outward, and a pushed ring grows thinner while keeping its area.
The mathematical marbling methods that include this map are set out in Lu et al. (2012), whose co-authors include Jaffer.
According to its abstract, the paper presents a mathematical way to emulate marbling with closed-form expressions, allowing real-time visual feedback and flowing animation.
This site has not read the body of the paper; the formula rests on Jaffer's page.

The water surface flows gently the whole time the drops are falling.
The flow is given by a divergence-free stream function that overlays three meandering band flows whose direction alternates from band to band, a uniform strain that stretches the pattern along the flow, a flow toward the four corners that brings the pattern's outline closer to the frame's rectangle, and small vortices beside and downstream of the four largest drops (the formulas are under "Marbling" in "Formulas of the works").
The flow runs along the long side of the frame, and the seed decides which way.
The flow is handed out every four notes, in proportion to that number of notes; there is no final pass that flows everything at the end.
A ring receives only the flow that follows its drop, so the earlier a ring fell, the longer it is carried.
The last note's ring is hardly carried and stays round.
On a tall frame the long and short sides differ little, and the same flow as on a wide frame would not show its direction, so the meander and the vortices are weakened, the stretch along the flow is strengthened, and the flow toward the corners is weakened.

What each look stands for:

- **Ring**: one note.
- **Ring size**: the number of knots the note cites (the area of the ink drop is proportional to it).
- **How rings overlap and stretch**: the order of writing. Later drops push earlier rings outward and the flow keeps going, so the earlier a note was written, the further out its ring is pushed and the thinner and longer it is stretched.
- **Ring shade**: the level of the cluster the note cites most (ties: the cluster with more knots), as ink shade in the light look and brightness of light in the dark look. The fewer knots a note cites, the fainter its ring; small faint rings left at the edges usually belong to notes that cite no knot.
- **Bleed of a ring's line**: the age of the day its note was written, times 0.7.
- **Point**: a knot. Its size is the number of notes citing it, its shape the kind, its shade the cluster, and it stays at its position in the layout.
- **Small faint dots**: sources cited by only one note, placed around the spot where that note's ink was dropped and not carried by the flow.
- **Red**: the point or ring under the pointer or selected (nothing is red otherwise).

The rings are mostly line, and both line and fill are faint.
In the order the drops fell, the inside of each drop is cleared and then filled with ink (a water drop only clears), and a thin line is drawn along the ring's edge.
Ink under a later drop is hidden, and the ground between rings is washi (darkness in the dark look).
In the dark look, lines add up, so lines are made fainter where rings crowd, to keep them from blowing out to white.
Selecting a point redraws, in dark ink, the rings (outer and inner edges) of the notes that cite that source.

In marbling, a note's ring can be selected as well as a point.
Hit-testing looks at the points first.
If no point is hit, it finds the newest drop containing the pointer; if that drop is ink, its note is selected (the pointer is in the ring's band).
In the water (a ring's hole) or outside every drop, it selects the note of the newest drop whose ink or water edge lies within the line tolerance (10 px for a mouse, 16 px for touch).
If nothing is hit, nothing is selected.
Selecting a note's ring works like selecting a thread in the weave: the ring's outer and inner edges are redrawn in red, the points of the sources the note cites are brought out in ink, and the ring edges of other notes citing the same sources are drawn in ink, darker the more sources they share.
The card shows the note's title, the date it was written, its period, how many other notes share its sources, and a link to open the note.

The points do not move with the rings so that the clusters can still be read.
In a variant that also carried the points with the drop map and the flow, the drops pushed points out of their centroids, and in a development measurement the silhouette fell to 0.06.
Leaving the points at their layout positions divides the work: the pattern shows the history of the notes, and the points show the closeness of sources.
Since each drop falls on the centroid of its points, the points of the sources a note cites gather near the middle of that note's newer rings.
The structure of marbling's point layout is given in the table under "Why no single arrangement is shown as the answer".

While drawing, the events (ink drops, water drops, flows) are put in a fixed order and committed one by one as their times come.
Drops grow from zero area (ink, then water, 160 ms each), and a flow is shown flowing little by little from the time the previous flow was committed.
A point appears over 400 ms once the ink drop of the first note citing that source starts to fall.
The plane's layout is not shown moving; it is settled in the first few frames, and only then does the count of note arrival times begin.
The order and content of the commits do not depend on time, so the picture drawn to the end is identical, down to the coordinates of the points, to the picture computed at once as a still.

### The weave and the constellation

In the weave, each note becomes one thread that passes through the knots it cites in order.
The order starts from the knot farthest from the knots' centroid and then connects to the nearest remaining one.
References cited only by that note are scattered around the thread as fine grains (shaded at the thread's cluster level).
Threads with no knots join the simulation as mass-1 particles with no springs and three times the pull toward the center.
They settle in the gaps or at the edge of the network, and each such thread is drawn as a small loop around its particle.
A thread is a fine line of ink (a fine line of light in the dark look) and does not bleed.
Its width is thin and even, with only a small brush-pressure waver, and both ends taper to the same minimum width.
A thread's shade (brightness in the dark look) is the level of the cluster it passes through most.
Long threads, and threads passing through crowded places, are made fainter so that overlaps do not keep darkening.

In the constellation, knots become stars, and only nearby stars that are often cited together are joined by straight lines, into small constellations.
The size of a star is the number of notes citing that reference.
There are 5,870 edges; drawn in full, the long lines across clusters would cover the sky between clusters in a grey haze, and lines would fill each cluster so that no constellation shape could be read.
The lines therefore follow a rule that, like the constellation lines of a star chart, joins stars with few lines.
Only co-cited pairs whose two stars lie within 0.08 times the short side S of the frame are candidates; distant pairs are never joined, whatever their co-citation count w.
Candidates are taken in order of w, most first (ties: shorter first), and a pair is added when it joins two separate constellations (a maximum spanning forest by Kruskal's method).
A pair is skipped if its line would cross a line already drawn (sharing an endpoint does not count as crossing) or if the joined constellation would have more than 10 stars.
Then, within each constellation, at most one more pair with w ≥ 3 is added if it crosses nothing, to make a small loop.
No line crosses another (the number of crossing pairs was counted and is 0), the sky holds many small constellations of at most 10 stars, and stars no pair was chosen for stay as points.
Counted on a stage 1,100 px wide and 686 px high, seeds 7, 11 and 23 give 60, 65 and 61 constellations with 349, 339 and 353 lines, and 39, 43 and 33 stars left unjoined. Constellations of 8 to 10 stars are the most common (28, 31 and 32 of them), and a constellation has a median of 5 to 7 lines and at most 10.
Lines have one constant shade (ink at opacity 0.5 in the light look, light at 0.42 in the dark look); only their width grows slightly with w, and their bleed is held to 0.3 times their age.
The earlier rules were removed: fading long lines, the exception for bridge sources (high betweenness), fading parallel bundles and fans, tiers for lines within and across clusters, and the correction for degree.
While drawing, the same rule is applied to the co-citations of the notes that have arrived, at that frame's positions.
Selecting a star brings out all its co-citation neighbours and their lines, including pairs not chosen as constellation lines.

### The three stills

The bundle draws the co-citation edges with Holten's (2006) hierarchical edge bundling.
Knots are placed on a circle, and a four-level hierarchy is built: root, cluster, period, knot.
The curve joining two knots is a B-spline whose control points are the path between them in the hierarchy tree.
Holten showed that a bundling strength β varies the drawing continuously from straight lines, the raw connections, to bundles, the implicit adjacency between parents.
This work sets β to 0.85.
Inserting the period level inside each cluster is this work's choice, and it makes the bundles branch once more within a cluster.
Edges can also be bundled by treating the edges themselves as attracting springs (Holten & van Wijk, 2009).

The arcs borrow the form of Wattenberg's (2002) arc diagram.
According to the abstract, an arc diagram joins pairs of identical substrings that repeat within a string, showing its structure of repetition.
Here notes are placed at equal intervals on a single baseline in the order they were written, and a semicircular arc joins two notes that cite at least one reference in common.
What repeats is not a string but the references cited.
The relation an arc shows is Kessler's (1963) bibliographic coupling.
Making each arc a true semicircle is this work's choice: the height of an arc reads directly as how many notes were written between the two.
Each source cited by two or more notes sits as a small dot at the top of the arc joining the first and last notes that cite it (sources on the same arc are lined up along it).
Touching a source's dot picks that source.

The river is a streamgraph that stacks the amount of each cluster's segments along the dates notes were written.
According to its abstract, the ThemeRiver of Havre et al. (2002) shows the strength of themes as the width of bands in a river flowing through time.
Byron & Wattenberg (2008) showed that stacked graphs, ThemeRiver, and Streamgraph each minimize a different energy function, and they also proposed ways to color and order the layers.
This work uses their weighted wiggle as the baseline and adopts the inside-out ordering, placing layers that appear early in the middle and adding later ones alternately to the outside.
The horizontal axis is taken by day rather than rounded to the six periods, and each note's segments are spread with a Gaussian kernel and summed.
Each source cited by two or more notes sits as a small dot in its group's band at the day it was first cited, and touching it picks that source.
In the light look, the layers are filled as pale ink laid on the washi (opacity 0.045 to 0.2), and the boundaries and the outline are thin ink lines.
The layers are neither cut out nor given drop shadows.
Inside a layer run up to four hair-thin, faint strands, depending on the layer's thickness.
In the dark look, the layers are filled with a very thin film of the cluster's colour, and each boundary is a thin dark groove carrying a faint seam of light.
Only in the finishing are four nested bands added, growing slightly brighter towards the layer's midline.
No bright core line is drawn along the midline.
While drawing, the fills are paler than their finished values (0.55 times in light, 0.6 times in dark) and fill in with the finishing.

### The eight swarm works

The eight swarm works get their form from rules in which each individual reacts only to its neighbours or to the traces left around it.
Nothing computes the overall shape.
The data enter the rules as the number of individuals, the order and place in which they are born, and the weights of the relations between them.
The methods were chosen from a survey that sorts 17 swarm algorithms into four families (forming and splitting groups, aligning a flock, forming shapes and distributions with point swarms, and organisation and propagation across scales).
The condition was that no two works, old or new, share the same vocabulary of line, surface, and arrangement of points.

Five are live works.
Slime mould uses the particle model of Jones (2010): sources are food, four particles per citation turn toward the stronger scent as they crawl, and the paths they use remain as the lines of a network.
School uses the three-zone model of Couzin et al. (2002): each source is one member, sources of the same group and sources cited together match heading and gather, and each group turns in a whirl with an empty core.
Each line is part of the path a member moved along to where it is now.
Cells uses the Primordial Particle System of Schmickl et al. (2016): every source (4,227) becomes a particle, and from a rule that turns each particle only by how many neighbours it has, clusters form, grow, pinch, and split.
Particles of groups with more particles follow the same rule at a scale 1.45 times larger, so large and small clusters lie side by side.
The lines are contours of particle density and the particles' short tracks.
Foam uses the weighted centroidal Voronoi method of Secord (2002): each source holds one patch of the picture, and Lloyd iterations move each patch to its centroid, so patches pack small where many references sit.
Brushstroke uses the swarmalators of O'Keeffe et al. (2017): each source takes the order it was first cited as its phase, and sources close in phase gather into a ring.
The ring is cut open at its gap (where the newest source meets the oldest) and drawn as a band that sways from the oldest sources at left to the newest at right.

Three are stills.
Dry garden uses the model of Vicsek et al. (1995): sources cited by only one note become particles that flow while matching their neighbours' heading and split at each group's cluster of points.
The settled direction of the flow is drawn as evenly spaced fine lines by the method of Jobard & Lefer (1997).
Coral uses the morphogenesis of a robot swarm by Slavkov et al. (2018): every source becomes a dot on a lattice and passes two substances with its neighbours in the same group, forming a Turing pattern.
The amount of activator is drawn as dot size, so the pattern appears only from differences in the size of halftone dots.
Roots uses the token passing of Israeli & Jalfon (1990): on a ring of notes in the order they were written, each note's token walks to a neighbour and merges with any token it meets.
Drawn with position across and time downward, the fine lines from the notes' dots at the top join as they go down.

Except for roots, each individual is born at a place taken from the same rectangle force layout as the marbling, run in step on the same clock.
Sources often cited together are born near each other, so the closeness of co-citation enters the rules as the place of birth.
Swarms have no temperature like a force layout, so the live works run for a set time after the last note arrives, and that moment is held as the picture.
The three stills fix the random seed and run to the end in small chunks before being drawn, so they look the same every time they open.
While they compute, the lower left of the frame shows how far the computation has come.

The names of the works come from images that inspired them (slime mould, school, cells, foam, brushstroke, dry garden, coral, roots).
Brushstroke was first drawn as a Zen ensō (a ring painted in one stroke); once the ring was cut open into a band flowing left to right, it was renamed as the ensō opened into one stroke.
The pictures, however, do not draw those things (stones, islands, fish, living tubes, and so on).
If they did, the image would be read before the marks of the data.
Every mark on the screen stands for a source, a note, a co-citation, a period, or a group, or is the trace of an individual's movement.
In every work, touching a small faint dot of a source cited by only one note picks that note, and touching the point of a source picks that source.

### The rules that set each order

The order around the bundle's circle, of the rings' slices, along the arcs' baseline, and of the river's layers is each set by a single comparison function.
A comparison function looks at its keys in turn and consults the next key only when the previous one gives no difference, so the same data always yields the same order.

| Comparison function | Used in | Keys, in order |
|---|---|---|
| groupOrder | groups around the bundle, slices of the rings | lower paper share first, then more knots in the group, then smaller group number |
| knotOrder | knots within a group in the bundle | earlier first-cited period first, then more citing notes, then higher betweenness, then the reference key (DOI or URL) |
| noteOrder | notes along the arcs' baseline | earlier date written first, then slug |
| layerOrder | layers of the river | earlier onset (the day a note first passed through the group) first, then larger total of segments, then smaller group number |

In this data, the only clusters with the same paper share are "How to frame research questions" and "Learning and cognitive load" (both 100%), and the former, with more knots, comes first.
This order matches the table in the section on the 11 clusters.
Within a cluster in the bundle, knots are grouped by period and then ordered by citations, so each period within a cluster is a contiguous stretch of the circle, and knots within a period are not ordered by date.
In the arcs, notes written on the same day have no before and after, so the slug decides.
In the river, layers are added one at a time in layerOrder, each to the outside of whichever side, top or bottom, has the smaller total of segments so far (the top on a tie).

### Precedents the works drew on

In deciding how the works look, precedents that turned data into artworks were consulted.
Lima (2011) gives the spread of network drawings the name Networkism.
Others consulted were Lupi & Posavec's (2016) Dear Data, Posavec's Writing Without Words, Lombardi's Narrative Structures, and Viégas & Wattenberg's (2012) Wind Map.
According to its official page, Wind Map is a personal art project, launched in 2012, that draws near-term surface wind forecasts over the US as flowing lines.
Viégas & Wattenberg (2007), as the title says, deal with artistic data visualization beyond visual analytics.

The figure can be seen both as an analytical chart and as a woven picture.
Kosara (2007), as the title says, positions visualization criticism as the link connecting information visualization and art.
How the language of evaluation changes depending on which one a figure is treated as was examined in [What Data Visualization and Data Art Share, and Where They Differ](https://jamjet-iqbal.com/en/notes/data-viz-vs-data-art-literature/).
The page puts the pictures first, but so that the analysis holds even if a picture invites misreading, it sets out the basis for each point and the numbers in text inside "More detail, and sources", and the computation and the formulas of the works are kept in this note.

## Formulas of the works

The formulas below are transcribed from the implementation as of 2026-09-25.
"More detail, and sources" on the [Citation Network](/en/network) page leaves out formulas and coefficients and points to this note as the analysis note under "Raw data and records".
They are written in ASCII (`*` multiplies, `^` is a power, `sqrt` a square root, `sum` a sum, `U(a, b)` a uniform random number between a and b).
Lengths are in simulation units in the force computation and in screen pixels elsewhere.
To match the page, this section says "group" and "source" where the rest of this note says "cluster" and "reference".

### From notes to numbers

Three things are counted from the notes: how many notes cite each source, how many notes cite two sources together, and the day each note was written. The groups, the paper share, and the periods are computed from these three.

#### Counting

```text
T          = the set of published notes (drafts and the 2 notes on this analysis excluded)
refs(n)    = source keys read from the reference section of note n
             (DOIs lower-cased; URLs without www., trailing / and utm_)
count(r)   = |{ n in T : r in refs(n) }|           # notes citing source r
K          = { r : count(r) >= 2 }                 # knots (sources cited by 2+ notes)
w(a, b)    = |{ n in T : a in refs(n), b in refs(n) }|    # co-citation weight (a, b in K)
paper(r)   = 1  if r is a DOI, arXiv, ACL Anthology or OpenReview (a paper)
             0  otherwise (a web page)
C          = Louvain(K, w)                         # groups (weighted, fixed random seed)
share(c)   = sum_{k in c} paper(k) / |c|           # paper share
order(c)   = rank of c by share(c), ascending      # 0 = fewest papers
bc(k)      = C_B(k) / max_j C_B(j)                 # betweenness (unweighted, Brandes)
born(n)    = the first day note n appears in wiki/log.md
period(n)  = max{ p : start_p <= born(n) }         # the six periods
first(k)   = period(the first note citing k)
pass(c, p) = sum_{n : period(n) = p} |refs(n) intersect c| # segments per period
```

Implementation: `src/lib/citation-weave.ts, src/data/interest-periods.ts`

#### From numbers to marks

A knot’s radius grows with the square root of the number of citing notes, so its area is roughly proportional to that number. The shape is the source’s kind: a filled disc for academic, a ring for practice. The bleed of a line is the age of the day the line came into being, rounded to five levels. While drawing, lines are thin; the finishing draws the same drawing again with wash lines and lays it over.

```text
r(c)    = r_min + 1.35 * u * sqrt(max(0, c - 2))   # knot radius (c = notes citing it)
u       = clamp(W / 960, 0.5, 1.3)                 # scale from the drawing width W
r_min   = clamp(3.5 * W / 1000, 2.6, 4)
          factor per work: bundle 0.5, marbling 0.48 (at least 0.55 * r_min), others 1
tone(c) = 0.46 + 0.44 * order(c) / (G - 1)         # ink opacity (G = number of groups)
pos(c)  = (tone(c) - 0.46) / 0.44                  # position on the scale (0 = fewer papers, 1 = more)
light   = colour one ink oklch(0.195 0.012 60), opacity tone(c)
dark    = colour oklch(0.44 + 0.53 * pos(c), 0.018, 75) (hue and chroma fixed, only lightness rises), opacity 0.95
shape   = paper(k) = 1 (academic): filled disc; 0 (practice): ring. Same outer radius for both, the same in light and dark. No outline
          ring width = min(max(0.7, 0.75 * u, 0.22 * d), 0.4 * d)
drawn point = d = 0.65 * r (red 0.78 * r). Hit-testing and card placement keep r
          light point opacity = 0.72 * tone(c)
          dark point = a glow (additive, strength 0.14; red 0.9) and a core, the cluster colour moved 18% towards white (opacity 0.58)
          turning "Show points" off removes the points (the small faint dots too) and their hit targets
small faint dot = a source cited by only one note. radius = (0.3 + 0.75 * U^2) * max(0.8, u)
          opacity = (light 0.42 * tone, dark 0.5) * (0.55 + 0.45 * U); shade = level of the cluster the note cites most
red     = only the element under the pointer or selected, and its own marks. Never in the default picture (the most cited knot is in its cluster shade too)
          red test: R - max(G, B) > 110
age(t)  = clamp((b_max - t) / (b_max - b_min), 0, 1)   # b_min, b_max = born of the first and last notes
                                                      # 0 = newest, 1 = oldest
bleed   = round(4 * age) / 4                          # five levels (0, 0.25, 0.5, 0.75, 1); red lines always 0
thin line (while drawing):
  width w(s) = width * (taper + (1 - taper) * sin(pi * s)^0.6) * p(s)   # s = fraction of the line's length, taper 0.22 by default
  p(s)  = the work's brush pressure, else 0.75 + 0.5 * noise(s * L / 40)  # L = line length (px)
  core opacity = a * (1 - 0.2 * bleed) (a = the line's opacity), no bleed
  dark: one copy of the whole figure downscaled to 1/6 is added (strength 0.7)
wash line (finishing), light:
  S     = min(bleed^1.6 * (8 + 6 * width^0.7), maxSpread)   # spread (px): 14 at width 1, 27 at width 5
          maxSpread is a per-line cap; no work passes one at present
  h     = the thin line's half width,  sw = 0.4 + 1.2 * noise(a wave of about 34 px along the line)
  ha    = a^0.45                                            # base strength of the halo
  core  = opacity a * (1 - 0.5 * bleed^1.3)
  body  = half width h + 0.45 + 0.07 * S (opacity ha * 0.14 * bleed) and
          half width h + k * S * sw (k = 0.2, 0.42, 0.65, 0.9; opacity ha * (1 + bleed) * 0.05, 0.035, 0.025, 0.018): five in all
          colour is a warm black rgb(34, 31, 27); drawn with multiply on a coarse layer at 0.75 x, laid on blurred by 2.4 px
  edge band = from the outer edge h + 0.9 * S * sw inward by 0.35 + 0.3 * bleed px
          opacity ha * (0.03 + 0.08 * bleed) / (1 + 0.6 * (n - 1))   # n = mean number of lines in the 12 px cells the line passes (rounded to 5 steps)
          the outer edge wavers by 0.1 * S * sw with the washi fibre direction, web and tooth, smoothed twice with its neighbours
  grains = only when bleed >= 0.75: grains darker in the tooth's valleys inside half width h + 0.6 * S * sw (opacity ha * 0.035 * bleed^2)
  halos of the same level are filled once together; the opacity is the root mean square of those stacked (overlaps do not darken)
  bundle, constellation (and rings with more than 1,200 lines): body as strokes of several widths, weakened by 1 / (1 + 0.25 * (n - 1)); no edge band or grains
wash line (finishing), dark:
  S     = min(0.5 + 0.4 * width + bleed^1.5 * (13 + 4 * width^0.7), maxSpread)   # 18 px at width 1
  e     = 1 / (1 + 0.8 * bleed^1.5)
  glow  = the midline stroked at width w_0 + 2 * k * S, four layers, (k, opacity) = (0.08, 0.28e), (0.26, 0.15e), (0.55, 0.09e), (1, 0.05e)
          opacity times a^0.6 and 1 / (1 + 0.25 * (n - 1)); three layers for the bundle, constellation (and rings with more than 1,200 lines)
          w_0 = width * (taper + 0.72 * (1 - taper)); lighten within a layer, layers added together
  core  = opacity a * (1 - 0.58 * bleed)
finishing (t goes from 0 to 1 in proportion to elapsed time, about 10 s, k = smoothstep(t)):
  light = thin picture * (1 - k)  +  wash picture * k (the wash is added, so on a transparent ground this is an exact blend; blur (1 - k) * 2.5 px)
  dark  = thin picture * (1 - k_w)  +  wash picture * k_w  +  bloom * k_b (the last two added)
          k_w = smoothstep(0, 0.7, t),  k_b = smoothstep(0.3, 1, t)
  bloom = the wash picture downscaled to 1/4, 1/8, 1/16 and added with weights 0.45, 0.4, 0.32; times (1 - m)^1.5 where the original brightness is m
          all times clamp((0.92 - p99) / 0.35, 0.3, 1) (p99 = 99th percentile of brightness over pixels with lines)
  with reduced motion, the picture at t = 1 is drawn at once
```

Implementation: `src/lib/citation-weave.ts (isPaper), src/lib/weave-works/common.ts (drawKnot, knotDot), src/lib/weave-works/style.ts (ageOf, InkBatch, composeFinish, bloomLayer), src/lib/weave-sketch.ts (startFinish)`

### The force computation

Sources push each other apart, and sources cited together pull on each other through springs. A source cited by more notes is heavier, so the same force changes its velocity less. Marbling is computed on a rectangular plane and the constellation on a sphere, and sources in different groups push each other harder and from further off than sources in the same group. The weave is computed on a plane with no frame, where every source pushes every other and the whole is pulled toward the center or toward a family template. The seed changes the placement jitter, the coefficient ranges, the charge variation in marbling and the constellation, the sky's viewpoint, and the weave's family, temperament, and drawing orientation; the pairs of springs and their weights do not change.

#### Marbling's plane

```text
unit    = the mean spacing of particles (the rectangle's area is set to the number of particles P: width sqrt(P * aspect), height sqrt(P / aspect))
          P = number of knots + number of notes without knots,  aspect = width / height of the frame's inner box
m_i     = count_i                              # mass (1 for a particle of a note without knots)
q_i     = sqrt(m_i) * exp(0.7 * z_i)           # charge; z_i = (U + U + U + U - 2) * sqrt(3) (from the seed)
push (only pairs with d < R, d >= 0.08):
  F_r   = k * q_i * q_j * (1/d - 1/R)
          same group                         k = 1,    R = 1.6
          different groups                   k = 3.5,  R = R_x = 8 * U(0.94, 1.06)
          involving a particle without knots k = 1,    R = 3.2
spring  F_a = k_a * w_ij * d,   k_a = 1 * U(0.85, 1.15)
edge    F_w = q_i * (wall(h_1) - wall(h_2))    # per axis; h_1, h_2 = distances to the two edges (0.5 inside)
          wall(h) = 0.6 * 3.5 * qbar * integral_{x > h} integral (1/r - 1/R_x) * (x / r) dy dx   # r < R_x, qbar = mean charge
center  F_c = -0.8 * m_i * (x_i - x_c) / (width / 2) (y likewise, divided by height / 2)
time    F_t = kappa * m_i * (tau_i - x_i)      # knots only, horizontal axis (older on the left in the setting)
          kappa = 0.004 * U(0.85, 1.15)
          tau_i = 0.5 + (r_i + 0.5) / P * (width - 1)   # r_i = rank of arrival in the network
v_i <- (v_i + alpha * F_i / m_i) * 0.6,   |v_i| <= 0.6
x_i <- x_i + v_i, then put back 0.5 inside the edges, dropping velocity toward the edge
alpha <- alpha - alpha * (1 - 0.001^(1/300))   # 1 to 0.001 in 300 ticks
note t arrives at tick 3 * t. Where a new particle starts (g = U + U + U - 1.5):
  knot vertical   = the vertical of its partners' centroid + 2.4 * g if it has partners, else U(0.5, height - 0.5)
  knot horizontal = tau_i + 0.36 * g
  particle of a note without knots = uniformly random in the rectangle (no time spring)
  w_ij += 1 for each of its pairs, and alpha <- max(alpha, 0.3)
stop when every note has arrived and alpha < 0.001
mapping: (x / width, y / height) straight onto the frame's inner box (margins of 6% left and right, 7% top and bottom)
while drawing: the layout is not shown moving; it is settled first, and then the note arrival times are counted
```

#### The weave's free plane

```text
m_i = count_i                    # mass: notes citing the source (1 for a particle of a note without knots)
q_i = sqrt(m_i)                  # charge: how hard it pushes
F_r = k_r * q_i * q_j / d        # push (every pair, d >= 0.5)          k_r = 2.25 * a_r
F_a = k_a * w_ij * d             # spring (co-cited pairs)               k_a = 0.04 * a_a
      LinLog type: F_a = k_a * w_ij * L * ln(1 + d / L),   L = 0.2 * R_ref
F_g = k_g * g_i * G              # pull to the center (constant size)    k_g = 4 * a_g
      strong gravity: F_g = (2 * k_g / R_ref) * g_i * G * d
      g_i = 1 (knot), 3 (particle of a note without knots)
      aimed at c_i = origin (disc family), mu * 1.8 * R_ref * slot_i (other families: memory gravity)
      G = 1 (disc family), 3 (other families)
R_ref = max(30, 0.29 * k_r * Q / k_g)             # rough radius of the web (Q = total charge arrived)
if d < R_i + R_j                 # push overlapping marks apart (added to the velocity)
  v_i += (x_i - x_j) * (R_i + R_j - d) / d * 0.5 * R_j^2 / (R_i^2 + R_j^2)
  R_i = 0.0055 * S * (1 + 0.39 * sqrt(max(0, m_i - 2)))    # S = current width of the web
v_i <- (v_i + alpha * F_i / m_i) * 0.6,   |v_i| <= 12      # one tick with inertia
x_i <- x_i + v_i
alpha <- alpha * 0.001^(1/300)                     # cooling (1 to 0.001 in 300 ticks)
note t arrives at tick 3 * t. Where a new knot starts:
  with partners in the web: in a disc of radius 0.5 * max(2, 0.25 * D) around their centroid (D = mean distance from the web's centroid)
  without: in a disc of radius max(2, 0.08 * R_ref) around the template position mu * 1.8 * R_ref * slot_i
  disc family: in a disc of radius max(0.8 * R_ref, max(2, 0.25 * D)) around the web's centroid
  w_ij += 1 for each of its pairs, and alpha <- max(alpha, 0.3)
stop when every note has arrived and alpha < 0.001
```

The values drawn from the seed are as follows. The same seed gives the same values.

```text
family  = one of disc, spiral, ring, lobes, line, clusters, with weights 1, 1, 1, 1, 0.8, 1.2
mu      ~ U(0.75, 1) (0 for disc)
a_r ~ U(0.7, 1.5),   a_a ~ U(0.7, 1.4),   a_g = 2^U(-1, 1)
LinLog attraction: probability 0.3,   strong gravity: probability 0.2
orientation: theta_s ~ U(0, 2 * pi),   reflection: probability 1/2
phi ~ U(0, 2 * pi)
template position slot_i of each family (in units of R_ref; r_i = arrival order scaled to 0..1):
  line     = (3 * (r_i - 0.5), s * sin(2 * pi * r_i + phi)),   s ~ U(0, 0.45)
  ring     = arcs proportional to group size on a circle of radius s (groups in random order), arrival order along each arc,   s ~ U(1, 1.3)
  spiral   = the ring's arcs laid on a spiral whose radius grows from 0.35 to 1.6 over s turns,   s ~ U(1.2, 1.6)
  lobes    = groups split in two lobes centered at (-s, 0) and (+s, 0); inside a lobe each group is offset onto a circle of radius 0.45,   s ~ U(0.85, 1.15)
             split: among splits that put 30% to 70% of the knots on one side, one of the 4 with the fewest co-citations across
  clusters = one point per group in a disc of radius s, kept apart from the others (largest groups first, best-candidate),   s ~ U(1.1, 1.5)
```

#### Fitting the weave to the frame

Rotation, reflection, and scaling keep the ratios of distances, so the relations of closeness stay as they are.

```text
axis = 0.5 * atan2(2 * S_xy, S_xx - S_yy)   # principal axis of the second moments about the centroid
l1 >= l2 = eigenvalues of the second moments,  W, H = width and height of the frame
scale(phi) = min(W / sqrt(l1 * cos^2 phi + l2 * sin^2 phi), H / sqrt(l1 * sin^2 phi + l2 * cos^2 phi))
orientation:
  theta = theta_s if scale(theta_s - axis) >= 0.75 * max_phi scale(phi)
  otherwise the orientation meeting that condition closest to theta_s (searched in 1° steps)
  reflection as the seed says
after rotating, fit the extent without the outer 1% at each end, keeping the aspect ratio
outliers: x' = hi + m * tanh((x - hi) / m)  # eased into the margin m
while drawing: each frame moves 0.12 of the way from the previous fitting; once stopped, this rises by 0.04 per frame to 1
```

#### The constellation's sky

```text
viewpoint   centre of view e_z uniform on the sphere, roll about the line of sight U(0, 2 * pi) (from the seed)
projection  (X, Y) = 2 * (p_x, p_y) / (1 + p_z)   # p = unit vector in the viewpoint's basis; a point at angle theta lies 2 * tan(theta / 2) from the centre
            full angle 136° along the long side: half width a = 2 * tan(34°), half height along the short side b = a / aspect
unit        s = 0.62 * sqrt(Omega / N)          # Omega = solid angle of the visible rectangle, N = number of knots
m_i = count_i,   q_i = sqrt(m_i) * exp(0.8 * z_i)
push (d = chord length / s, only pairs with d < R, d >= 0.08):
  F_r       = c * 2 * q_i * q_j * (1/d - 1/R)
            same group        c = 1,  R = 3.4
            different groups  c = 4,  R = 8
spring      F_a = 0.3 * w_ij * d                # three-dimensional difference vector (unit s)
gravity     toward the centre of view (within the star's tangent plane)
            |F_g| = m_i * (0.9 * sqrt((0.06 * X / a)^2 + (Y / b)^2) + (r > 0.88 ? 150 * (r - 0.88) : 0))
            r = sqrt((X / a)^2 + (Y / b)^2)      # wide frame; on a tall frame the 0.06 goes on the Y side
v_i <- (v_i + alpha * F_i / m_i) * 0.6, dropped onto the tangent plane, |v_i| <= 0.5
p_i <- (p_i + s * v_i) / |p_i + s * v_i|       # back onto the sphere
where a new star goes: with partners, their centroid (returned to the sphere) plus U(-1, 1) * 1.4 * s on each axis
                       without, uniformly random inside the view's ellipse (radius up to 0.75)
mapping: (0.5 + X / (2 * a), 0.5 + Y / (2 * b)) onto the frame's inner box
temperature, arrival schedule, and stop condition as on the plane
```

Implementation: `src/lib/weave-works/physics.ts (createPlane, wallTable, charmOf, createFree, layoutProfile, familySlots, Fitter, fitAngle, createSky, skyView, stereo), src/lib/weave-works/marbling.ts (marblingPlane, replaySim), src/lib/weave-works/common.ts (innerBox, mapUnit)`

What follows the literature: the push has the form of equation 2 of ForceAtlas2 (Jacomy et al., 2014), with the product of charges q_i q_j in place of the product of degrees plus one, (deg_i + 1)(deg_j + 1). In marbling and the constellation it is cut off at a reach R. The spring is equation 6 with δ = 1, times a coefficient k_a. ForceAtlas2’s attraction has no coefficient; multiplying by k_a is the same as changing the unit of the coordinates, and it keeps each tick’s step small enough for the explicit integration to stay stable. The weave’s pull to the center is the form of equation 4 without its (deg + 1) factor. The weave’s LinLog attraction puts a length unit L into the ln(1 + d) of equation 3, and returns to k_a w d when d is much smaller than L. The weave’s strong gravity has the form of equation 5, with a coefficient that makes it the same order of size as equation 4 at the distance R_ref. The pull to the center on marbling’s plane and the sky’s gravity grow with distance, like equation 5, with the mass in place of (deg + 1). The velocity update and the cooling (velocityDecay 0.4, alphaDecay, alphaMin) follow the defaults of d3-force (D3, n.d.), and pushing the weave’s overlapping marks apart follows the same idea as its forceCollide. Snyder (1987) is given as the standard source for the stereographic projection. The idea of force-directed layout on a sphere appears in the abstract of Kobourov & Wampler (2005), but their computations are not used.

This site’s own design: using mass as inertia (ForceAtlas2 has no inertia, and d3-force fixes every point’s mass at 1), making the charge the square root of the mass (times a variation in marbling and the constellation), cutting the repulsion off at a reach in marbling and the constellation and giving it different reaches and strengths within and across groups, the plane’s edge force and time spring, the sky’s elliptical gravity and soft edge, the shape of the weave’s overlap radius, the initial-configuration families and memory gravity, the temperament ranges of the coefficients, choosing the LinLog attraction and strong gravity by chance, the fitting to the frame (the seed orientation with fitAngle), and growing the web in the order the notes were written and reheating at each arrival are taken from no source. The charge is √m, and the weave’s pull to the center carries no mass, so that the acceleration F/m shrinks with a source’s own mass. If the push carried the product of masses, the mass would cancel in F/m and a heavy source would get the same acceleration as a light one. In the present form the acceleration is k_r q_j / (d √m_i) from the weave’s push, k q_j (1/d − 1/R) / √m_i times the variation from the push in marbling and the constellation, k_g g_i / m_i from the weave’s pull to the center, and k_a w_ij d / m_i from a spring. The pull to the center on marbling’s plane, the sky’s gravity, and the time spring carry the mass, so their acceleration does not depend on it.

The following measurements were made with the weave’s implementation before the per-seed families and temperament were added (coefficients fixed at the defaults k_r = 2.25, k_a = 0.04, k_g = 4, and every pull aimed at the center of the web). They have not been repeated with the present implementation. Measured with seed 48213, the mean acceleration α|F|/m that each force gives per tick falls from knots cited by 2 notes to knots cited by 6 or more: from 0.84 to 0.49 for the push, 0.67 to 0.41 for the springs, and 0.31 to 0.11 for the pull to the center. Yet the mean distance moved per tick is not smaller for heavy sources. The rank correlation (Spearman) between mass and distance moved is +0.068 (seed 48213), +0.107 (seed 7), and +0.049, +0.073, +0.130 (seeds 1, 2, 3): close to zero or slightly positive (the earlier implementation, which put the mass on both the push and the pull, gave +0.10 to +0.16). The more notes cite a source, the larger the total weight Σw of its co-citation springs, roughly in proportion to its mass, so the spring strength per unit of mass does not fall. The velocity loses 40% every tick, so a knot follows its moving point of balance. The measurement therefore does not support “heavier sources move less”; it supports only that the same force accelerates them less.

At build time, positions are also computed once with ForceAtlas2 (the graphology implementation) and kept in the raw data as a record of the analysis. The settings are those returned by inferSettings (strong gravity on, gravity 0.05, scalingRatio 10, slowDown 1 + ln N, no Barnes–Hut), with 500 iterations and initial positions from a fixed-seed generator (mulberry32, 0x5eed). The works do not use these positions.

### Marbling

In the order the notes were written, drops of ink and water fall on the centroid of the points of the sources each note cites; the drop map pushes older rings outward, and the flow of a stream function stretches them. The points of the sources do not move.

```text
point p_k = position of a knot in marbling's plane (px, mapped onto the frame's inner box); moved by neither drops nor flow
n_t       = max(1, number of knots note t cites)
area      a_1 = 1.7 * (area of the inner box) / ((1 + 0.8^2) * sum_t n_t)
ink radius r_t = sqrt(n_t * a_1 / pi),   water radius = 0.8 * r_t
centre    C_t = (1 / |K_t|) * sum_{k in K_t} p_k       # K_t = knots note t cites
          a note without knots: its particle's position at the time of the drop (particles are also carried by drops and flow)
order of events: for each note t (in order of born), ink drop (C_t, r_t) -> water drop (C_t, 0.8 * r_t)
          a flow every 4 notes and after the last note (time 1.5 * k / T; k = notes in that step, T = number of notes)
drop map (centre C, radius r; applied to every boundary point and to the particles of notes without knots):
  P' = C + (P - C) * sqrt(1 + r^2 / |P - C|^2)
  then add the circle of centre C and radius r as a new boundary
carried by the flow (midpoint method, time dt):
  P_mid = P + (dt / 2) * v(P),   P' = P + dt * v(P_mid)
boundary spacing: where a mapped segment exceeds 3 px, map the midpoint of the unmapped segment and insert it (depth up to 14)
          coarser the further outside the frame, up to 24 times; points closer than 0.8 px are thinned out
ring shade = tone(the group the note cites most) (ties: the group with more knots; 0.5 without knots)
faintness f_t = 0.3 + 0.7 * min(1, sqrt(n_t / 4))
fill    ink drop: clear the inside, then fill at opacity 0.09 * tone * f_t (light) or 0.06 * f_t (dark)
        water drop: only clear the inside
line    width max(0.5, 0.7 * u); colour is ink in the light look, light of brightness tone in the dark look
        opacity 0.36 * tone * f (light), 0.3 * f (dark)
        f = f_t (light) or f_t * c (dark), rounded to steps of powers of 0.8 (measured per run of 10 points)
        c = (2 / n)^0.8 when n > 2, else 1; n = rings passing each 5 px cell, summed over the 3 × 3 cells and divided by 3
            (about 1 for a single line)
line bleed = bleed(0.7 * age(born(t)))
point radius = max(0.55 * r_min, 0.48 * r(count))
while drawing: the ink drop and then the water drop each grow from zero area over 160 ms
        (drops at the same centre add their squared radii, so mapping with the partial area is valid)
        a point appears over 400 ms once the ink drop of the first note citing that source starts to fall
```

The flow field is as follows.

```text
coordinates xi  = ((x - b_x) * m_x + (y - b_y) * m_y) / S       # along the flow
            eta = (-(x - b_x) * m_y + (y - b_y) * m_x) / S      # across the flow
            (b_x, b_y) = centre of the inner box,  S = short side of the frame,  (m_x, m_y) = (cos th, sin th)
            th = 0 (wide) or pi / 2 (tall), plus pi with probability 1/2 (from the seed)
stream function:
  psi = sum_{k=1..3} A_k * sin(2 * pi * f_k * eta + phi_k + c_k * sin(2 * pi * b_k * xi + chi_k))   # band flows
      + strain * xi * eta * S^2                                                             # uniform strain
      - (uniform flow equal to the band flows' mean over the inner box)
      + corner * a * b * s(u) * s(v) * (s(v)^2 - s(u)^2)                                   # flow toward the corners
      + sum of vortices
  f = (0.9, 2.1, 4.3),   A_k = D_k * S^2 / (2 * pi * f_k),   D = (0.16, 0.09, 0.045)
  b = (0.45, 0.9, 1.6),   c = (0.6, 0.6, 0.7) * meander,   phi_k, chi_k ~ U(0, 2 * pi)
  u = (x - b_x) / a,  v = (y - b_y) / b,  a, b = half width and half height of the inner box,  s(t) = t / sqrt(1 + t^2 / 1.5^2)
  vortices: one per drop of the 4 notes citing the most knots
      centre = C_t + 0.6 * R * m + side * 0.5 * R * m_perp (R = outer radius of ink and water, side = ±1 from the seed)
      velocity = G * exp(-d^2 / (2 * sigma^2)) / sigma^2 * (-dy, dx) (d < 4 * sigma)
      sigma = 0.07 * S,   G = side * 3.5 * vortex * sigma^2
velocity v = (dpsi/dy, -dpsi/dx)                  # divergence 0
         computed once on a 3 px grid (extended by half the frame beyond each side) and interpolated bilinearly
tone per frame shape (strain, meander, vortex, corner): wide (0.25, 1, 1, 0.5), tall (0.45, 0.3, 0.3, 0.15)
total flow time = 1.5 (per unit of time, each band shifts by at most D_k * S)
```

Implementation: `src/lib/weave-works/marbling.ts (createMarbler, marble, createMarbling)`

#### How the line is built

A ring is drawn as a closed polyline that joins the boundary points in order with straight segments and returns to the first point.

```text
ring = (x_0, y_0) -> (x_1, y_1) -> ... -> (x_{n-1}, y_{n-1}) -> (x_0, y_0)
       split into runs of 10 points and drawn as one path per (group, bleed level, faintness level)
while drawing: when events are in progress, only every second boundary point is mapped and drawn
       where a mapped segment exceeds 6 px and has stretched beyond twice its unmapped length, the mapped midpoint is inserted (depth up to 6)
```

Implementation: `src/lib/weave-works/marbling.ts (paint, closedPath)`

The drop map is Jaffer's (2010) formula. The page states that the area of every neighbourhood not containing C is preserved, and that drops dropped in turn at the same centre add their areas. The mathematical marbling methods as a whole are set out in Lu et al. (2012), but this site has not read the body of that paper. A velocity field made from a stream function ψ as v = (∂ψ/∂y, −∂ψ/∂x) has zero divergence, since ∂²ψ/∂x∂y − ∂²ψ/∂y∂x = 0, so the flow preserves area. Batchelor (1967/2000) is given as the standard source for the stream function, and Press et al. (1992) for the midpoint method. The shape of the flow (the combination of band flows, strain, flow toward the corners, and vortices), how the centres and sizes of the drops are set, handing out the flow between drops, and keeping the points still are this site's own design.

### The weave

One thread runs through the knots placed by the forces, nearest first. Between knots the thread sags a little, and its two ends fray out briefly. Threads do not bleed.

```text
order: start at the knot farthest from the knots' centroid, then go to the nearest unvisited knot
       (while moving, re-order only if the path gets at least 1% shorter)
control points P = [ T_s, A_1, M_12, A_2, M_23, ..., A_k, T_e ]   # A_j = knot positions
sag   M_j = (A_{j-1} + A_j) / 2 + s_j * n_j
      n_j = (-(y_j - y_{j-1}), x_j - x_{j-1}) / |A_j - A_{j-1}|    # unit normal of the span
      s_j = min(40 * u, 0.18 * |A_j - A_{j-1}|) * sigma_j,  sigma_j ~ U(-1, 1)
fray  T_s = A_1 + L * (cos(phi + delta), sin(phi + delta)),  phi = direction from A_2 to A_1
      delta ~ U(-0.6, 0.6),  L ~ U(10 * u, 32 * u)            # T_e likewise
thread with 0 or 1 knot: closed loop of 5 points  c + rho * r_j * (cos theta_j, sin theta_j)
      theta_j = start + pi + 2 * pi * j / 5,  r_0 = 1,  r_j ~ U(0.75, 1.25),  rho ~ U(6 * u, 13 * u)
      one knot: c = A_1 + rho * (cos start, sin start)       # point 0 lies on the knot
      no knot:  c = the position of the note's particle
dust (sources only this note cites) = point at fraction f of the curve + normal offset (U + U + U - 1.5) * 7 * u
thread opacity a = clamp(a_0 * f_len * f_dense, 0.03, 0.3)
      a_0 = clamp(18 / T, 0.1, 0.2) * (1.7 light, 2.1 dark)        # T = number of notes
      f_len = clamp((L_ref / L)^0.35, 0.6, 1.2),  L_ref = 0.32 * (W + H) / 2   # L = thread length
      f_dense = clamp((4 / m)^0.6, 0.3, 1.4)      # m = mean number of threads through the 18 px cells the thread passes
      0.55 times for a thread with 0 or 1 knot
thread colour = level tone of the group the thread passes through most (ties: the lower group id; 0.5 without knots)
      light: ink at opacity a * tone / 0.9;  dark: light of brightness tone at opacity a
width = max(0.7, 0.9 * u),  end taper = 0.14 (both ends taper to the same minimum width)
brush pressure p(s) = 0.95 * (1 + press * (0.65 * sin(2 * pi * f_1 * s + phi_1) + 0.35 * sin(2 * pi * f_2 * s + phi_2)))
      f_1 ~ U(0.6, 1.6),  f_2 ~ U(2.5, 4.5),  press = 0.32 light, 0.2 dark
thread bleed = 0 (no bleed; the finishing leaves the lines unchanged, and in the dark look only the bloom is added)
knot radius = r(threads that have passed through it so far)
jitter random numbers = prng(hash(slug) xor seed * 0x9e3779b1)
```

Implementation: `src/lib/weave-works/weave.ts`

#### How the line is built

A thread is a centripetal Catmull–Rom curve through all control points, converted to one cubic Bézier per span for drawing.

```text
t_0 = 0
t_{i+1} = t_i + |P_{i+1} - P_i|^(1/2)          # knot spacing = square root of point distance (alpha = 1/2)
the span from P_1 to P_2 as a cubic Bezier (B_0, B_1, B_2, B_3):
  l_ab = |P_b - P_a|,   a_ab = sqrt(l_ab)
  B_0 = P_1,   B_3 = P_2
  B_1 = (P_1 * (2 * l_01 + 3 * a_01 * a_12 + l_12) - P_0 * l_12 + P_2 * l_01) / (3 * a_01 * (a_01 + a_12))
  B_2 = (P_2 * (2 * l_23 + 3 * a_23 * a_12 + l_12) + P_1 * l_23 - P_3 * l_12) / (3 * a_23 * (a_23 + a_12))
  C(s) = (1-s)^3 * B_0 + 3 * (1-s)^2 * s * B_1 + 3 * (1-s) * s^2 * B_2 + s^3 * B_3,   s in [0, 1]
ends: an open curve adds P_-1 = 2 * P_0 - P_1 and P_n = 2 * P_{n-1} - P_{n-2}; a closed curve wraps around
```

Implementation: `src/lib/weave-works/common.ts (catmullRomBeziers)`

Among the family of Catmull–Rom curves whose knot spacing is |P_{i+1} − P_i|^α, the centripetal one with α = 1/2 is used. Yuksel et al. (2009) proved that for cubic Catmull–Rom curves only α = 1/2 guarantees no cusps and no self-intersections within a span. Yuksel et al. (2011) is the journal version by the same authors. The conversion to Bézier uses the same formula as curveCatmullRom in d3-shape and draws the same curve. For Catmull–Rom curves themselves, Catmull & Rom (1974) is given as the standard source.

### The constellation

Stars are knots, and lines join nearby sources that are often cited together, added a few at a time so that no two lines cross. A constellation has at most 10 stars; lines have one constant shade and grow slightly thicker the more notes cite the pair together.

```text
star i at the sky position mapped by the stereographic projection,  radius = r(count_i) (1.18 times in the light look)
candidate = a pair with w_ij >= 1 and |x_i - x_j| <= 0.08 * S       # S = short side of the frame
order     = most w first; ties: shorter first
forest    = in that order, add pairs that join two separate constellations (Kruskal, maximum spanning forest)
            skip: pairs whose line crosses a line already drawn (sharing an endpoint is allowed), pairs whose joined constellation exceeds 10 stars
loop      = within a constellation, add at most 1 pair with w >= 3 if it crosses nothing
line opacity = light 0.5, dark 0.42 (neutral ink, constant)
width(w) = max(0.75, 0.85 * u) * (1 + 0.15 * min(3, w - 1)),  end taper = 0.7
line bleed = bleed(0.3 * age(born(the first note citing both i and j)))
small faint star = a source cited by only one note, scattered around the spherical centroid c of that note's stars by a tangent-plane normal
        standard deviation = 0.55 * s * sqrt(n)   # s = apparent spacing per star (tangent plane), n = sources the note cites
        notes without knots: around a point inside the view ellipse (radius 0.75) fixed by the seed and slug
timing: a star lights up when the first note citing it arrives; small faint stars appear over 600 ms after their note arrives
        a line starts 220 ms after the first note citing both sources arrives (while drawing, the rule is applied at that frame's positions)
```

Implementation: `src/lib/weave-works/constellation.ts`

#### How the line is built

A line is a straight segment between two stars, grown from one end.

```text
x(s) = (1 - s) * x_i + s * x_j,   s in [0, pr]   # pr grows from 0 to 1 as the line is drawn
```

Implementation: `src/lib/weave-works/common.ts (segment)`

### The rings

Each source can sit only in the cell where the band of the period it was first cited meets the slice of its group. Its place inside the cell comes from a strong pull to the cell’s center, pushing among sources of the same cell, and weak springs that reach across cells.

```text
R_p = R_max * (0.5 * (p + 1) / P + 0.5 * sqrt(N_p / N))   # outer radius of period p's band (P periods)
      N_p = knots first cited in periods 0..p,  inner radius of the first band = 0.22 * R_0
a_k ~ U(0, 2 * pi) (per seed)                             # direction of the middle of the crack
crack(r) = 25° * (0.78 + 0.22 * min(1, r / R_max))        # opening of the crack at radius r
theta_c = (2 * pi - 25°) * max(4, size_c) / S             # width of group c's slice
      S = sum_c max(4, size_c) + max(12, 0.05 * N)        # the last term is the slice for notes without knots
      clockwise from a_k + 25° / 2 in groupOrder, gaps of 0.03
      then the slice for notes without knots (the gap before it is 0.06)
rings thin out over 36 * u px before an edge of the crack (to 0.06 of their width and opacity); ticks nearby thin to 0.4
gauge arc: radius R_max + max(7, 8 * u), clockwise from an edge of the crack, coloured along the group scale from 0 to 1
      a small dot at the start (fewer papers), a small arrowhead at the end (more papers); no text
period numbers: in the direction of the middle of the crack, at mid-band radius (0.6 * R_0 for p = 0)
      placed only where the number's circumcircle fits the crack's width and the band's thickness and clears the previous number
cell(i) = (the slice of its group) meets (the band of first(i))
coordinates below: R_max = 1
F_g = k_g * d                  # strong pull to the cell center     k_g = 0.4
      center = middle angle of the slice, radius sqrt((r_0^2 + r_1^2) / 2)
F_r = s_c * k_r * q_i * q_j / d   # push (pairs in the same cell only)   k_r = 1
      s_c = k_g * rho_c^2 * n_c / (k_r * Q_c^2)
      Q_c = sum_{i in c} q_i,  n_c = knots in the cell,  rho_c = sqrt(cell area / pi)
F_a = k_a * w_ij * d           # spring (works across cells)          k_a = 0.002
v_i <- (v_i + alpha * F_i / m_i) * 0.6,   |v_i| <= 0.02,   d >= 0.002
after each tick: angle back into the slice without 8% at each side; radius into the band without 10% inside and 12% outside (by area)
no pushing apart of overlaps
note tick: on the outer circle of its period; angle = mean angle of its knots in the slice of its main group
line bleed = bleed(age(born(n))),  bleed of ring p = bleed(0.7 * age(start_p)),  ticks do not bleed
```

Implementation: `src/lib/weave-works/rings.ts, src/lib/weave-works/physics.ts`

#### How the line is built

A straight segment runs from a note’s tick to each knot the note cites.

```text
x(s) = (1 - s) * x_note + s * x_knot,   s in [0, 1]
```

Implementation: `src/lib/weave-works/rings.ts`

The pull to the center grows with distance (the form of ForceAtlas2’s equation 5 without the mass) so that each cell fills evenly. With a pull of constant size balanced against a 1/d push, the charge inside radius r grows like r and the density peaks at the center; with a pull proportional to distance it grows like r², and the cell fills evenly. The factor s_c comes from the balance condition Σ_i x_i·F_i = 0 (the virial): k_g Σ r_i² = s_c k_r Σ_{i<j} q_i q_j, and treating the cell as a uniform disc of radius ρ_c gives Σ r_i² = n_c ρ_c² / 2 and Σ_{i<j} q_i q_j ≈ Q_c² / 2. Fixing the bands and slices by values in the data follows the idea of hive plots (Krzywinski et al., 2012).

### The bundle

Sources sit around a circle, and each line between two sources bends along the route of its groups and periods, so lines bundle.

```text
angle: slot = (2 * pi - 0.05 * (G + 1)) / N;  knot j of a group: theta = start_g + slot * (j + 0.5)
       groups clockwise from the top in groupOrder
       inside a group in knotOrder (first-cited period, more citing notes, higher betweenness, reference key)
tree: root (center O) -> group (radius 0.36R, middle of its arc) -> period (0.66R, mean angle of its knots) -> knot (R)
control polygon for knots a, b = path in the tree (through their lowest common ancestor)
  same group and period:  [P_a, S_a, P_b]
  same group:             [P_a, S_a, G_a, S_b, P_b]
  different groups:       [P_a, S_a, G_a, O, G_b, S_b, P_b]
straightening (beta = 0.85):
  P'_i = beta * P_i + (1 - beta) * (P_0 + i / (N - 1) * (P_{N-1} - P_0))
line opacity(w) = dens * min(0.32, 0.045 + 0.04 * (w - 1)) * (tone_a + tone_b) / 2
                  x 0.5 for pairs in the same group and period,  dens = clamp(R / 320, 0.55, 1.15)
line width(w)   = min(1.3, 0.55 + 0.12 * (w - 1)) * max(0.9, 0.9 * u)
mark radius = 0.5 * r(count)
line bleed  = bleed(age(born(the first note citing both a and b)))   # notes taken in order of born
```

Implementation: `src/lib/weave-works/bundle.ts`

#### How the line is built

The straightened control polygon is smoothed by a uniform cubic B-spline. The end points are tripled, so each line starts and ends on a knot.

```text
Q = [P'_0, P'_0, P'_0, P'_1, ..., P'_{N-1}, P'_{N-1}, P'_{N-1}]
segment s (s = 0 .. |Q| - 4), t in [0, 1):
  C_s(t) = (1/6) * [t^3  t^2  t  1] * | -1   3  -3   1 | * [ Q_s   ]
                                      |  3  -6   3   0 |   [ Q_s+1 ]
                                      | -3   0   3   0 |   [ Q_s+2 ]
                                      |  1   4   1   0 |   [ Q_s+3 ]
k = max(4, round(R / 60)) samples per segment, drawn as a polyline
```

Implementation: `src/lib/weave-works/bundle.ts (bspline, straighten)`

The straightening formula and β = 0.85 follow equation (1) in Section 3.2 of Holten (2006): with β = 1 the line follows the tree path, and with β = 0 it becomes straight. For the basis of the uniform cubic B-spline, de Boor (1978) and Bartels et al. (1987) are given as the standard sources. Inserting the period level inside each group is this site’s choice.

### The arcs

Notes are spaced evenly in the order they were written, and a half circle joins two notes that cite the same source. The further apart in that order, the bigger the arc.

```text
position of note i (in noteOrder: date written, then slug on the same day): u_i = u_0 + i * (u_1 - u_0) / (n - 1)
arc (a, b) is drawn when S_ab = refs_K(a) intersect refs_K(b) is not empty    # bibliographic coupling
  w = |S_ab|,   tone = shade of the group holding most of S_ab
opacity = min(0.6, 0.09 + 0.11 * (sqrt(w) - 1)) * (0.55 + 0.5 * tone)
width   = max(0.5, u * (0.5 + 0.5 * (sqrt(w) - 1)))
note tick: length max(5, 6 * u) outward from the baseline; 0.55 x and lighter for notes sharing nothing
arc bleed = bleed(age(max(born(a), born(b))))    # the day the newer note was written; ticks do not bleed
```

Implementation: `src/lib/weave-works/arcs.ts`

#### How the line is built

An arc is a half circle centered between the two notes; only when it does not fit is its height scaled down, the same factor for every arc.

```text
c = (u_a + u_b) / 2,   r = (u_b - u_a) / 2
x(theta) = c - r * cos(theta)
y(theta) = y_0 - s * r * sin(theta),   theta in [0, pi]     # y_0 = baseline
s = min(1, available height / max r)                         # s = 1: a true half circle
portrait (4:5): x and y swap; the baseline stands on the left and arcs open to the right
```

Implementation: `src/lib/weave-works/arcs.ts`

Joining with arcs is borrowed from the arc diagram (Wattenberg, 2002), and the relation joined is bibliographic coupling (Kessler, 1963). Making each arc a true half circle, so that its height reads as the distance in writing order, is this site’s choice.

### The river

Each time a note passes through a group’s sources, a gentle hill centered on the day it was written is added, and the hills of all groups are stacked.

```text
p_{n,c} = knots of group c that note n cites
f_c(t)  = sum_n p_{n,c} * K(t - t_n)                # thickness of group c's layer (t_n = born(n))
K(x)    = exp(-x^2 / (2 * h^2)) / (h * sqrt(2 * pi)),   h = 6 days   # Gaussian kernel of area 1
          t on a daily grid from the first born - 15 days to the last born + 15 days; kernel cut at 4h
layer order (inside-out): one layer at a time in layerOrder (onset day, larger total of segments, group number),
      each to the outside of the side, top or bottom, with the smaller total so far (the top on a tie)
baseline (weighted wiggle):
  g_0(t_j) = g_0(t_{j-1}) - sum_i (df_i / 2 + sum_{k<i} df_k) * f_i(t_j) / sum_i f_i(t_j)
  df_i = f_i(t_j) - f_i(t_{j-1})
boundaries  y_i(t) = g_0(t) + sum_{k<i} f_k(t),   i = 0 .. L
fill opacity = light 0.045 + 0.155 * (tone - 0.46) / (0.90 - 0.46), dark 0.035 + 0.04 * pos (a film of the cluster colour)
      while drawing, 0.55 x in light and 0.6 x in dark; no cut-outs, no drop shadows
boundaries and outline = ink lines (light: width max(0.45, 0.55 * u), opacity 0.24)
      dark: inner boundaries cut as dark grooves of width max(0.8, 0.9 * u), carrying a seam of light (width max(0.4, 0.55 * u), opacity 0.26)
      the outline thins away where the whole flow is thinner than 7 * u px, an inner boundary where the layer above is thinner than 2.5 * u px
dark finishing only: four nested bands at fractions 0.5 +- 0.5 * b / 4.35 of the layer (b = 4, 3, 2, 1),
      each at opacity 0.15 * (0.75 + 0.35 * pos) / 4, edges blurred by 3 * u px, added; no core line on the midline
selected note's band: half height p_{n,c} * K(t - t_n) * scale / 2 around the layer's midline
line bleed = bleed(age(the day at x))    # boundaries and strands split where the level changes; fills do not bleed
```

Implementation: `src/lib/weave-works/river.ts`

#### How the line is built

Each layer boundary (one point per day) is smoothed with a centripetal Catmull–Rom curve. A span is evaluated by three levels of linear interpolation.

```text
t_0 = 0
t_{i+1} = t_i + |P_{i+1} - P_i|^(1/2)          # knot spacing = square root of point distance (alpha = 1/2)
span from P_1 to P_2, t in [t_1, t_2]:
  A_1 = ((t_1 - t) * P_0 + (t - t_0) * P_1) / (t_1 - t_0)     # A_2, A_3 likewise
  B_1 = ((t_2 - t) * A_1 + (t - t_0) * A_2) / (t_2 - t_0)
  B_2 = ((t_3 - t) * A_2 + (t - t_1) * A_3) / (t_3 - t_1)
  C(t) = ((t_2 - t) * B_1 + (t - t_1) * B_2) / (t_2 - t_1)
points are taken every max(2, 3 * u) px along the curve
ends: an open curve adds P_-1 = 2 * P_0 - P_1 and P_n = 2 * P_{n-1} - P_{n-2}; a closed curve wraps around
currents inside a layer: k = min(4, floor(max thickness / (15 * u)) - 1) lines at fractions q / (k + 1) between its boundaries
      width = min(0.45, max(0.16, 0.04 * g)) * u * min(1, g / 3) (g = the layer's thickness at x / (k + 1))
      light: the cluster's ink at opacity 0.11 * tone; dark: the cluster's light at opacity 0.03 + 0.06 * (1 - |2 * q / (k + 1) - 1|)
```

Implementation: `src/lib/weave-works/common.ts (spline), src/lib/weave-works/river.ts`

The baseline formula and the inside-out order follow Byron & Wattenberg (2008). The baseline comes from minimizing the squared slopes of the layers weighted by their thickness, and its differencing is the same as d3’s stackOffsetWiggle. Showing an amount along time by the width of a band belongs to the line of ThemeRiver (Havre et al., 2002). For density estimation with a Gaussian kernel, Silverman (1986) is given as the standard source. Evaluating a span by three levels of linear interpolation is what Yuksel et al. (2009) illustrate in their Figure 3 as the algorithm of Barry and Goldman; the original, Barry & Goldman (1988), is given as the standard source.

### Common formulas of the swarm works

The swarm works share the clock on which notes arrive and the rule for when they stop.

```text
note t arrives   = at tick 3t (the same clock as the other live works)
1 tick           = 1 tick of the plane layout for birthplaces, and `substeps` steps of the swarm
stop             = tail ticks after the last note arrives
birthplace       = the source's position in the same plane layout as the marbling (with stronger cross-group repulsion); for a note, the centroid of its sources
stills           = random seed fixed at 1, run to the end in 12 ms chunks before drawing; progress = tick / (3T + tail)
```

Implementation: `src/lib/weave-works/swarm.ts (swarmSimulation, KnotPoints)`

### Slime mould

Particles born at the sources crawl over a field T (the amount of scent). Lines are the ridges of the field; width is how many particles passed, darkness how long the path was used.

```text
individuals = 4 per citation (about 19,000); grid = about 170,000 cells set only by the aspect ratio
move : one cell along heading h; if the target is outside or occupied, stay and pick a random heading; if moved, T += 5
sense: read T 9 cells ahead at h and h ± 45° (F, FL, FR)
       F > FL and F > FR: keep; F < FL and F < FR: turn 45° either way (random); FL < FR: turn right 45°; FR < FL: turn left 45°
field: T ← 0.9 * mean3x3(T); each tick, food at source i adds 10 * (notes citing i)
memory: M ← M + 0.012 * (T - M); old paths = max T so far
lines: only the positive part of (lightly smoothed field − widely blurred field), the ridges
bleed = bleed(mean ageOf of the notes that bore the particles crawling there) (ink-wash layer only)
time : 2 steps per tick; 420 ticks after the last note
```

Implementation: `src/lib/weave-works/physarum.ts`

### School

Each source is one member; it aligns and gathers only with kin (same group and co-cited sources). Each line is part of the path it moved, heaviest at the head.

```text
kin weight w_ij = [same group] + 0.35 * min(3, co-citations)
heading d_i: if anyone is within repulsion (radius 1), d_i = -sum r_ij / |r_ij|
             else d_i = norm(sum_{orientation zone} w_ij v_j) + norm(sum_{attraction zone} w_ij r_ij / |r_ij| + home pull)
             home pull = toward the centroid of the group's plane positions, rising from distance 3 to 16
update: θ ← θ + clamp(angle(d_i) - θ + N(0, 0.03), ±0.05), x ← x + 0.3 * (cos θ, sin θ); field of view 270°
        orientation zone 1–7, attraction zone 7–14, width of the arena 110 * sqrt(aspect)
line  : the path back 44 + 9 * sqrt(count - 2) px from the head; width 1.1 + 0.55 * sqrt(count - 2)
bleed = bleed(0.55 * ageOf(the day the source was first cited))
time  : 2 steps per tick; 520 ticks after the last note; speed falls to 0 over the last 260 ticks
```

Implementation: `src/lib/weave-works/school.ts`

### Cells

Every source is a particle that turns only by how many neighbours it has. Lines are density contours and the particles' short tracks.

```text
Δφ = α + β * N * sign(R - L), p ← p + v * (cos φ, sin φ)
α = 180°, β = 17°, v = 0.67 (the defaults of Schmickl et al. 2016); N, L, R = particles within radius r (all, left, right)
scale λ_i = 1.45 for particles of groups with more particles than the median (P_g), 1 otherwise; radius λr, speed λv, β unchanged
      L and R count only particles of the same λ (counting across scales made the cells come apart and the particles scatter)
space = a rectangle with reflecting edges (a torus in the paper); all particles update at once (one by one in the paper); density 0.13 per unit²
density field D = sum (1 - d² / (2.2λ)²)²; contours at D = 2.05 + 1.6k (k = 0..4)
time  : 3 steps per tick; 420 ticks after the last note
```

Implementation: `src/lib/weave-works/cells.ts`

### Foam

Each source holds one patch of the picture and moves to its patch's centroid.

```text
ρ(x) = (ε + sum_k c_k * N(x; a_k, σ) + sum_t d_t * N(x; b_t, 1.6σ))^2.2   # a_k = plane position of source k, c_k = citation count
                                                                      # b_t, d_t = birthplace and dot count of note t
ε = 0.025 * mean, σ = 0.02 * H
patch V_i = Voronoi region of point i (an exact convex polygon cut by bisector half-planes)
p_i ← p_i + 0.85 * (∫_{V_i} ρ x dx / ∫_{V_i} ρ dx - p_i)                 # one Lloyd iteration per tick
border shade = mean of the two sides' group shades; borders between different groups are bolder
bleed = bleed(mean ageOf of the days the two sources were first cited)
time  : 320 ticks after the last note
```

Implementation: `src/lib/weave-works/foam.ts`

### Brushstroke

The ring of swarmalators is cut open into a band.

```text
dx_i/dt = (1/n) sum_{j != i} [ (x_j - x_i) / |x_j - x_i| * (1 + J cos(θ_j - θ_i)) - (x_j - x_i) / |x_j - x_i|² ]
dθ_i/dt = (1/n) sum_{j != i} K_ij sin(θ_j - θ_i) / |x_j - x_i|
J = 1, K_ij = 0.05 * w_ij (w = co-citations), dt = 0.1
θ_i(0) = 2π * 0.93 * rank_i / (N - 1)            # rank = order first cited
band: across = angle along the ring's centreline (cut at the gap; oldest at left)
      up and down = the sway of the centreline's radius (the wave) and the offset from it (the band's width), both capped by tanh (0.26 and 0.17 of the height)
strand width = density of sources there; breaks where there are none; shade = age and how many sources were first cited then
time: 2 steps per tick; 600 ticks after the last note
```

Implementation: `src/lib/weave-works/stroke.ts`

### Dry garden

Sources cited by only one note become particles that flow while aligning.

```text
θ_k ← arg( sum_{|x_j - x_k| < 4} e^{iθ_j} + [near an edge] * 2 * m_k * t_k ) + 0.15 * (ξ - 1/2)
                                     # m_k = particles within radius 4, t_k = tangent of the nearest cluster's edge
x_k ← x_k + 0.3 * e^{iθ_k}; pairs closer than 0.6 are pushed apart by half each; the garden is periodic, area 16,000
cluster of points = the group's points shrunk while keeping their orientation in the plane layout, kept apart to the sum of their room radii (0.45 + 0.3 * sqrt(max(0, count - 2))) + 0.3
rings n_g = clamp(round(1 + sqrt(sum count_g) / 4), 2, 5); ring k = the contour at distance (k + 0.6) * d from the cluster
flow lines = evenly spaced streamlines (Jobard & Lefer 1997) of the heading field of the last 300 ticks; spacing d = max(3.6 px, 1.1 of the garden)
ring bleed = bleed(0.3 * mean ageOf of the group's sources); flow lines never bleed
time: notes * 3 + 480 ticks (fixed seed)
```

Implementation: `src/lib/weave-works/garden.ts`

### Coral

Every source is a dot on a lattice that passes two substances with its neighbours.

```text
f = clamp(0.08u - 0.08v + C_g, 0, 0.23) - 0.03u, g = clamp(0.1u - 0.12, 0, 0.5) - 0.06v
u ← u + 0.0015 * (160 f + 4 * sum(u_j - u)), v ← v + 0.0015 * (160 g + 80 * sum(v_j - v))   # neighbours = the 6 of the same group
C_g = 0.015 + 0.045 * order_g / (groups - 1)            # by rank of paper share (0.03 fixed in the paper)
edge dots: with u < 4 and no neighbour with u ≥ 4 or moving, start with probability 0.0005 and follow the edge; stop next to u ≥ 4 or after 300 steps
dot radius = h * (0.08 + 0.42 * sqrt(smoothstep(1.2, 5.6, u))); shade = group
time: 2 steps per tick; 700 ticks after the last note (fixed seed)
```

Implementation: `src/lib/weave-works/coral.ts`

### Roots

Each note's token walks along a ring and merges with the tokens it meets.

```text
ring position = order the notes were written (newest next to oldest); every note starts with one token
P(step right) = (1 + 0.6 s_r) / (2 + 0.6 (s_l + s_r))     # s = sources shared with that neighbour
1 round = move each live token once, in random order; tokens on the same position merge (carrying all their notes)
y = sqrt(t / (1.3 * t_few))      # t_few = the round when 3 tokens remain; beyond it lies below the frame
width = max(0.45, 0.8 u) * k^0.58 (k = notes carried); merge dot radius = 0.55 * width
source dots = along the path of the note that first cited each source, most cited first (radius = 0.62 * r)
bleed = bleed(mean ageOf of the notes carried)
```

Implementation: `src/lib/weave-works/roots.ts`

## Limitations

- **References with neither DOI nor URL are not counted**: 5 of the 142 notes yielded no references at all (137 yielded some). References listed only by bibliographic details never become knots, however often they are cited.
- **URL normalization has errors**: a continuously updated page merges content from different times under one key. Conversely, the arXiv and published versions of the same paper are counted as separate references.
- **Whether something is a paper depends on where it is hosted**: only arXiv, the ACL Anthology, and OpenReview are treated as places that hold papers. A paper without a DOI hosted elsewhere, like the page in the NeurIPS proceedings, is counted as a web page and lowers its cluster's paper share. The shapes use the same split, so such a reference is drawn as a practice ring.
- **Theme names are the writer's reading**: the partition is computed, but the theme names and descriptions were written by the writer after reading the contents. Matching through representative references keeps the same name on the same contents when clusters are reshuffled; it does not guarantee that the name is apt. The tag-based machine names can also drift from a cluster's contents ("AI in design practice and education" has the machine name design-education / chi, but notes on slop also pass through it).
- **The date written is the first log appearance**: the log can record a note later than it was actually written. Four notes have a frontmatter `updated` earlier than their first log appearance (such as [AI Adaptation in Design Education — The Current State and Structural Challenges of Curriculum Reform](https://jamjet-iqbal.com/en/notes/design-education-ai-adaptation/), with `updated` on 07-09 or 07-10 and a first log appearance on 07-12), so for at least these four the record lags the writing.
- **The period boundaries are borrowed from another analysis**: the six periods come from the analysis that read the shift in interests from first log appearances, not from the citation data. Moving the boundaries would change the segments per period and the number of knots first appearing.
- **Recent periods form knots less easily**: a reference becomes a knot only when a second note cites it, so references from periods that have had less time since writing are less likely to count as knots. The small number of knots first appearing in periods 4 to 6 includes this truncation effect.
- **Paired notes inflate the knots**: two notes written consecutively on the same body of literature produce many knots by themselves. The number of knots does not equal the number of times notes independently arrived at the same reference.
- **This is a network of the public part only**: because the 33 drafts are excluded, references shared only through draft notes are invisible. "Interests over time" on the top page counts notes including drafts and excludes the watches, so its note counts per period do not match the ones here.
- **An isolated knot is counted as a cluster**: "Public skill standards" contains a single knot, and the count of 11 clusters includes it.
- **The partition and centralities come from a single setting**: no comparison across different random seeds for the Louvain method was made. Betweenness was computed without weights and normalized by the maximum.
- **The live arrangement changes with every view**: the arrangements of marbling, the weave, the constellation, and the rings on the page are regenerated with a new random seed on every view. Statements in this note about coordinates (such as x = 0.95 for "Public skill standards") record the build-time reference layout. Using mass as inertia, with acceleration F / m, is this site's own choice. Measurements with the weave's implementation before families and temperament were added showed no tendency for heavier knots to move less (rank correlations of +0.05 to +0.13 across five seeds). They have not been repeated with the present implementation. How much the design changes the readability of the arrangement has not been tested, either in the literature or in this note.
- **The readable clusters of marbling and the constellation come from strengthening repulsion across clusters**: as a mean over five seeds (7, 11, 23, 101, 202), the silhouette was 0.623 for marbling and 0.464 for the constellation, against 0.377 for the weave. The rank correlation between co-citation weight and distance was −0.468 for marbling and −0.426 for the constellation, against −0.448 for the weave, so in the constellation reading co-citation from closeness became slightly less precise. Since the clusters were found from co-citation, readable clusters do not add evidence independent of co-citation. Only five seeds were measured, on a 1085 × 676 px frame for marbling and a frame of aspect ratio 1.638 for the weave and the constellation.
- **Horizontal position in marbling does not show the period**: marbling's plane feeds the order in which sources arrived into the horizontal axis through a very weak spring, but in the settled arrangement the rank correlation between horizontal position and arrival order is close to 0 (−0.20 to +0.34), so the period cannot be read from horizontal position. Marbling shows time through how rings overlap, stretch, and bleed; periods are read in the rings and the river.
- **The shape of marbling's rings also depends on a flow with no meaning in the data**: how a ring stretches depends not only on the size and order of the drops but also on the shape of the flow this site chose (band flows, strain, flow toward the corners, vortices). The bends of the rings and the places of the vortices say nothing about relations between sources. The silhouette of 0.06 that ruled out carrying the points along with the rings is a value from a development comparison and has not been remeasured under the conditions of this note's table. The formula of the drop map was checked on Jaffer's explanatory page and has not been compared with the body of Lu et al. (2012).
- **Much of the form of the swarm works comes from the rules' constants**: the mesh of the slime mould, the radius of the school's whirls, the size of the cells, and the spacing of the coral's pattern are set mostly by the constants of the rules (sensing distance, turning angle, strength of diffusion), not by the data. The data set the number of individuals, the order and place of birth, and the weights of the relations. Where a work departs from its paper (a closed rectangle instead of a periodic space, updating all individuals at once instead of one by one, the lattice and some constants of the coral), it is noted at the top of each file. Vicsek et al. (1995), Reynolds (1987), Lloyd (1982), Du et al. (1999), Slavkov et al. (2018), Israeli & Jalfon (1990), and Jobard & Lefer (1997) were checked bibliographically on Crossref, and the rules against the survey and whatever full text could be read.
- **The swarm works are stopped at a chosen time**: individuals keep moving, so the finished picture is the one held a set time after the last note arrives. Stopping at another time would move the whirls and change the network.
- **The "What stands out" lines state only relations among numbers**: the five conditions check relations among numbers: segments, co-citation, betweenness, and gaps between dates written. Reading them as the writer's tendencies of thought is this note's interpretation; it does not measure how the writer actually read or thought. The thresholds of the conditions (95%, 70%, 10 sources, 3 days, and so on) were set by the writer, and moving them changes which clusters and pairs qualify.

## References

- Barry, P. J., & Goldman, R. N. (1988). A recursive evaluation algorithm for a class of Catmull-Rom splines. In *Proceedings of the 15th Annual Conference on Computer Graphics and Interactive Techniques (SIGGRAPH '88)* (pp. 199–204). ACM. https://doi.org/10.1145/54852.378511
- Bartels, R. H., Beatty, J. C., & Barsky, B. A. (1987). *An introduction to splines for use in computer graphics and geometric modeling*. Morgan Kaufmann. ISBN 0-934613-27-3
- Batchelor, G. K. (2000). *An introduction to fluid dynamics*. Cambridge University Press. https://doi.org/10.1017/CBO9780511800955 (Original work published 1967)
- Battiston, F., Cencetti, G., Iacopini, I., Latora, V., Lucas, M., Patania, A., Young, J.-G., & Petri, G. (2020). Networks beyond pairwise interactions: Structure and dynamics. *Physics Reports*, 874, 1–92. https://doi.org/10.1016/j.physrep.2020.05.004
- Blondel, V. D., Guillaume, J.-L., Lambiotte, R., & Lefebvre, E. (2008). Fast unfolding of communities in large networks. *Journal of Statistical Mechanics: Theory and Experiment*, 2008(10), P10008. https://doi.org/10.1088/1742-5468/2008/10/P10008
- Börner, K., Chen, C., & Boyack, K. W. (2003). Visualizing knowledge domains. *Annual Review of Information Science and Technology*, 37(1), 179–255. https://doi.org/10.1002/aris.1440370106
- Brandes, U. (2001). A faster algorithm for betweenness centrality. *Journal of Mathematical Sociology*, 25(2), 163–177. https://doi.org/10.1080/0022250X.2001.9990249
- Byron, L., & Wattenberg, M. (2008). Stacked graphs: Geometry & aesthetics. *IEEE Transactions on Visualization and Computer Graphics*, 14(6), 1245–1252. https://doi.org/10.1109/TVCG.2008.166
- Catmull, E., & Rom, R. (1974). A class of local interpolating splines. In R. E. Barnhill & R. F. Riesenfeld (Eds.), *Computer aided geometric design* (pp. 317–326). Academic Press. https://doi.org/10.1016/B978-0-12-079050-0.50020-5
- Chen, C. (2006). CiteSpace II: Detecting and visualizing emerging trends and transient patterns in scientific literature. *Journal of the American Society for Information Science and Technology*, 57(3), 359–377. https://doi.org/10.1002/asi.20317
- Chu, N. S.-H., & Tai, C.-L. (2005). MoXi: Real-time ink dispersion in absorbent paper. *ACM Transactions on Graphics*, 24(3), 504–511. https://doi.org/10.1145/1073204.1073221
- Couzin, I. D., Krause, J., James, R., Ruxton, G. D., & Franks, N. R. (2002). Collective memory and spatial sorting in animal groups. *Journal of Theoretical Biology*, 218(1), 1–11. https://doi.org/10.1006/jtbi.2002.3065
- Curtis, C. J., Anderson, S. E., Seims, J. E., Fleischer, K. W., & Salesin, D. H. (1997). Computer-generated watercolor. In *Proceedings of the 24th Annual Conference on Computer Graphics and Interactive Techniques (SIGGRAPH '97)* (pp. 421–430). ACM. https://doi.org/10.1145/258734.258896
- D3. (n.d.). *d3-force* [Software documentation]. https://d3js.org/d3-force
- de Boor, C. (1978). *A practical guide to splines*. Springer. ISBN 978-0-387-90356-9
- Du, Q., Faber, V., & Gunzburger, M. (1999). Centroidal Voronoi tessellations: Applications and algorithms. *SIAM Review*, 41(4), 637–676. https://doi.org/10.1137/S0036144599352836
- Eades, P. (1984). A heuristic for graph drawing. *Congressus Numerantium*, 42, 149–160. https://www.cs.ubc.ca/~will/536E/papers/Eades1984.pdf
- Freeman, L. C. (1977). A set of measures of centrality based on betweenness. *Sociometry*, 40(1), 35–41. https://doi.org/10.2307/3033543
- Fruchterman, T. M. J., & Reingold, E. M. (1991). Graph drawing by force-directed placement. *Software: Practice and Experience*, 21(11), 1129–1164. https://doi.org/10.1002/spe.4380211102
- Gansner, E. R., Koren, Y., & North, S. (2005). Graph drawing by stress majorization. In *Graph Drawing 2004* (Lecture Notes in Computer Science, Vol. 3383, pp. 239–250). Springer. https://doi.org/10.1007/978-3-540-31843-9_25
- Guo, Q., & Kunii, T. L. (1991). Modeling the diffuse paintings of "sumie." In T. L. Kunii (Ed.), *Modeling in computer graphics* (pp. 329–338). Springer. https://doi.org/10.1007/978-4-431-68147-2_21
- Havre, S., Hetzler, E., Whitney, P., & Nowell, L. (2002). ThemeRiver: Visualizing thematic changes in large document collections. *IEEE Transactions on Visualization and Computer Graphics*, 8(1), 9–20. https://doi.org/10.1109/2945.981848
- Holten, D. (2006). Hierarchical edge bundles: Visualization of adjacency relations in hierarchical data. *IEEE Transactions on Visualization and Computer Graphics*, 12(5), 741–748. https://doi.org/10.1109/TVCG.2006.147
- Holten, D., & van Wijk, J. J. (2009). Force-directed edge bundling for graph visualization. *Computer Graphics Forum*, 28(3), 983–990. https://doi.org/10.1111/j.1467-8659.2009.01450.x
- Israeli, A., & Jalfon, M. (1990). Token management schemes and random walks yield self-stabilizing mutual exclusion. In *Proceedings of the Ninth Annual ACM Symposium on Principles of Distributed Computing (PODC ’90)* (pp. 119–131). ACM. https://doi.org/10.1145/93385.93409
- Jacomy, M., Venturini, T., Heymann, S., & Bastian, M. (2014). ForceAtlas2, a continuous graph layout algorithm for handy network visualization designed for the Gephi software. *PLoS ONE*, 9(6), e98679. https://doi.org/10.1371/journal.pone.0098679
- Jaffer, A. (2010). *Dropping paint*. https://people.csail.mit.edu/jaffer/Marbling/Dropping-Paint (copyright notice 2006, 2010; accessed 2026-09-24)
- Jobard, B., & Lefer, W. (1997). Creating evenly-spaced streamlines of arbitrary density. In W. Lefer & M. Grave (Eds.), *Visualization in Scientific Computing ’97* (pp. 43–55). Springer. https://doi.org/10.1007/978-3-7091-6876-9_5
- Jones, J. (2010). Characteristics of pattern formation and evolution in approximations of Physarum transport networks. *Artificial Life*, 16(2), 127–153. https://doi.org/10.1162/artl.2010.16.2.16202
- Kessler, M. M. (1963). Bibliographic coupling between scientific papers. *American Documentation*, 14(1), 10–25. https://doi.org/10.1002/asi.5090140103
- Kobourov, S. G., & Wampler, K. (2005). Non-Euclidean spring embedders. *IEEE Transactions on Visualization and Computer Graphics*, 11(6), 757–767. https://doi.org/10.1109/TVCG.2005.103
- Kosara, R. (2007). Visualization criticism: The missing link between information visualization and art. In *Proceedings of the 11th International Conference Information Visualization (IV '07)* (pp. 631–636). IEEE. https://doi.org/10.1109/IV.2007.130
- Krzywinski, M., Birol, I., Jones, S. J. M., & Marra, M. A. (2012). Hive plots: Rational approach to visualizing networks. *Briefings in Bioinformatics*, 13(5), 627–644. https://doi.org/10.1093/bib/bbr069
- Lima, M. (2011). *Visual complexity: Mapping patterns of information*. Princeton Architectural Press. ISBN 978-1-56898-936-5
- Lloyd, S. (1982). Least squares quantization in PCM. *IEEE Transactions on Information Theory*, 28(2), 129–137. https://doi.org/10.1109/TIT.1982.1056489
- Lombardi, M. (n.d.). *Narrative structures* [Drawings]. Whitney Museum of American Art. https://whitney.org/artists/7340
- Lu, S., Jaffer, A., Jin, X., Zhao, H., & Mao, X. (2012). Mathematical marbling. *IEEE Computer Graphics and Applications*, 32(6), 26–35. https://doi.org/10.1109/MCG.2011.51
- Lupi, G., & Posavec, S. (2016). *Dear Data*. Princeton Architectural Press. ISBN 978-1-61689-532-7
- Newman, M. E. J., & Girvan, M. (2004). Finding and evaluating community structure in networks. *Physical Review E*, 69(2), 026113. https://doi.org/10.1103/PhysRevE.69.026113
- O’Keeffe, K. P., Hong, H., & Strogatz, S. H. (2017). Oscillators that sync and swarm. *Nature Communications*, 8, 1504. https://doi.org/10.1038/s41467-017-01190-3
- Posavec, S. (n.d.). *Writing without words*. https://www.stefanieposavec.com/archive/writing-without-words
- Press, W. H., Teukolsky, S. A., Vetterling, W. T., & Flannery, B. P. (1992). *Numerical recipes in C* (2nd ed.). Cambridge University Press. ISBN 0-521-43108-5
- Reynolds, C. W. (1987). Flocks, herds and schools: A distributed behavioral model. *Computer Graphics (Proceedings of SIGGRAPH ’87)*, 21(4), 25–34. https://doi.org/10.1145/37401.37406
- Schmickl, T., Stefanec, M., & Crailsheim, K. (2016). How a life-like system emerges from a simplistic particle motion law. *Scientific Reports*, 6, 37969. https://doi.org/10.1038/srep37969
- Secord, A. (2002). Weighted Voronoi stippling. In *Proceedings of the 2nd International Symposium on Non-Photorealistic Animation and Rendering (NPAR ’02)* (pp. 37–43). ACM. https://doi.org/10.1145/508530.508537
- Silverman, B. W. (1986). *Density estimation for statistics and data analysis*. Chapman & Hall. ISBN 0-412-24620-1
- Slavkov, I., Carrillo-Zapata, D., Carranza, N., Diego, X., Jansson, F., Kaandorp, J., Hauert, S., & Sharpe, J. (2018). Morphogenesis in robot swarms. *Science Robotics*, 3(25), eaau9178. https://doi.org/10.1126/scirobotics.aau9178
- Small, H. (1973). Co-citation in the scientific literature: A new measure of the relationship between two documents. *Journal of the American Society for Information Science*, 24(4), 265–269. https://doi.org/10.1002/asi.4630240406
- Snyder, J. P. (1987). *Map projections: A working manual* (U.S. Geological Survey Professional Paper 1395). U.S. Geological Survey. https://doi.org/10.3133/pp1395
- Venturini, T., Jacomy, M., & Jensen, P. (2021). What do we see when we look at networks: Visual network analysis, relational ambiguity, and force-directed layouts. *Big Data & Society*, 8(1). https://doi.org/10.1177/20539517211018488
- Vicsek, T., Czirók, A., Ben-Jacob, E., Cohen, I., & Shochet, O. (1995). Novel type of phase transition in a system of self-driven particles. *Physical Review Letters*, 75(6), 1226–1229. https://doi.org/10.1103/PhysRevLett.75.1226
- Viégas, F. B., & Wattenberg, M. (2007). Artistic data visualization: Beyond visual analytics. In *Online Communities and Social Computing (HCI International 2007)* (Lecture Notes in Computer Science, pp. 182–191). Springer. https://doi.org/10.1007/978-3-540-73257-0_21
- Viégas, F., & Wattenberg, M. (2012). *Wind map* [Interactive artwork]. http://hint.fm/wind/
- Wattenberg, M. (2002). Arc diagrams: Visualizing structure in strings. In *IEEE Symposium on Information Visualization (InfoVis 2002)* (pp. 110–116). IEEE. https://doi.org/10.1109/INFVIS.2002.1173155
- Yuksel, C., Schaefer, S., & Keyser, J. (2009). On the parameterization of Catmull-Rom curves. In *2009 SIAM/ACM Joint Conference on Geometric and Physical Modeling* (pp. 47–53). ACM. https://doi.org/10.1145/1629255.1629262
- Yuksel, C., Schaefer, S., & Keyser, J. (2011). Parameterization and applications of Catmull–Rom curves. *Computer-Aided Design*, 43(7), 747–755. https://doi.org/10.1016/j.cad.2010.08.008

## Related notes

- [What Data Visualization and Data Art Share, and Where They Differ](https://jamjet-iqbal.com/en/notes/data-viz-vs-data-art-literature/): on the distinction between a chart for analysis and a figure as a work. The woven figure of this note is open to both readings.
- [Writing Material for a Review Article](https://jamjet-iqbal.com/en/notes/review-paper-writing-material/): the only note spanning seven clusters. Gathering nearby literature from several surveys in one place has made it a bridge between clusters.
- [AI Slop: Reading It as Outsourced Verification, Not Low Quality](https://jamjet-iqbal.com/en/notes/ai-slop-design-creativity/): spans five clusters and is one of the notes citing the homogenization literature. It is also one of the notes that cite again, in period 4, CHI-style research that first appeared in period 1.
- [Literature on Drawing Networks as Data Art](https://jamjet-iqbal.com/en/notes/network-data-art-methods-literature/): the methods and precedents behind the artworks (placement, bundling, time, flow), each with how far it was verified.
