diff --git a/.github/social-preview.png b/.github/social-preview.png
new file mode 100644
index 00000000..0f9134e4
Binary files /dev/null and b/.github/social-preview.png differ
diff --git a/README.md b/README.md
index 7731ce71..afe00e0a 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,14 @@
# libtmux for Java
+
+
+
+
+
+
+
+
+
[](https://github.com/libtmux/libtmux-java/actions/workflows/ci.yml)
[](https://github.com/libtmux/libtmux-java/actions/workflows/tmux-matrix.yml)
[](https://central.sonatype.com/artifact/io.github.libtmux/libtmux)
diff --git a/assets/README.md b/assets/README.md
new file mode 100644
index 00000000..6a297c70
--- /dev/null
+++ b/assets/README.md
@@ -0,0 +1,14 @@
+# Logo assets
+
+SVG and 512 × 512 transparent PNG artwork from the libtmux logo kit,
+revision `555f60aff5341d8ba59c7466eb9abb537084c98d`.
+
+Library marks use the cog, workspace marks the tiled tmuxp base, and MCP
+marks the Model Context Protocol symbol. Language colors follow
+[GitHub Linguist](https://github.com/github-linguist/linguist/blob/538da05f034fa5c83bd81df128d144e208898da3/lib/linguist/languages.yml).
+The source libtmux and tmuxp artwork belongs to the project owner. The MCP
+symbol comes from the [upstream logo](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/088176704a4e8f20e7f1d237de1de8484aa412fd/docs/logo/light.svg).
+
+Package-specific artwork sits beside its README where the package format
+supports it. `.github/social-preview.png` is the cog sharing card, ready to
+upload under the repository's **Settings → Social preview**.
diff --git a/assets/logo.png b/assets/logo.png
new file mode 100644
index 00000000..e601df48
Binary files /dev/null and b/assets/logo.png differ
diff --git a/assets/logo.svg b/assets/logo.svg
new file mode 100644
index 00000000..5f308932
--- /dev/null
+++ b/assets/logo.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/build-logic/conventions/src/main/kotlin/libtmux.publication.gradle.kts b/build-logic/conventions/src/main/kotlin/libtmux.publication.gradle.kts
index 172c1aa1..3b860147 100644
--- a/build-logic/conventions/src/main/kotlin/libtmux.publication.gradle.kts
+++ b/build-logic/conventions/src/main/kotlin/libtmux.publication.gradle.kts
@@ -12,6 +12,15 @@
// service that is gone.
plugins { id("com.vanniktech.maven.publish") }
+// Ship each JVM package's artwork alongside its classes. The BOM has no JAR.
+plugins.withId("java") {
+ tasks.named("processResources") {
+ from(layout.projectDirectory.dir("assets")) {
+ into("META-INF/libtmux/${project.name}")
+ }
+ }
+}
+
group = "io.github.libtmux"
version = providers.gradleProperty("libtmuxVersion").getOrElse("0.0.1-alpha.1-SNAPSHOT")
diff --git a/libtmux-bom/README.md b/libtmux-bom/README.md
index bd5295cf..db24d22c 100644
--- a/libtmux-bom/README.md
+++ b/libtmux-bom/README.md
@@ -1,5 +1,14 @@
# libtmux-bom
+
+
+
+
+
+
+
+
+
**Name one BOM version. Every BOM-managed libtmux coordinate follows it.**
diff --git a/libtmux-bom/assets/logo.png b/libtmux-bom/assets/logo.png
new file mode 100644
index 00000000..e601df48
Binary files /dev/null and b/libtmux-bom/assets/logo.png differ
diff --git a/libtmux-bom/assets/logo.svg b/libtmux-bom/assets/logo.svg
new file mode 100644
index 00000000..5f308932
--- /dev/null
+++ b/libtmux-bom/assets/logo.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/libtmux-jackson/README.md b/libtmux-jackson/README.md
index 455e4d60..1b93211e 100644
--- a/libtmux-jackson/README.md
+++ b/libtmux-jackson/README.md
@@ -1,5 +1,14 @@
# libtmux-jackson
+
+
+
+
+
+
+
+
+
**A filter expression, as a versioned JSON document.**
The core has no dependencies and never will. This module is where Jackson lives,
diff --git a/libtmux-jackson/assets/logo.png b/libtmux-jackson/assets/logo.png
new file mode 100644
index 00000000..e601df48
Binary files /dev/null and b/libtmux-jackson/assets/logo.png differ
diff --git a/libtmux-jackson/assets/logo.svg b/libtmux-jackson/assets/logo.svg
new file mode 100644
index 00000000..5f308932
--- /dev/null
+++ b/libtmux-jackson/assets/logo.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/libtmux-junit5/README.md b/libtmux-junit5/README.md
index ac362ab9..fcd35ed3 100644
--- a/libtmux-junit5/README.md
+++ b/libtmux-junit5/README.md
@@ -1,5 +1,14 @@
# libtmux-junit5
+
+
+
+
+
+
+
+
+
**A JUnit 5 extension that gives each test its own tmux server, and guarantees it
is gone afterwards.**
diff --git a/libtmux-junit5/assets/logo.png b/libtmux-junit5/assets/logo.png
new file mode 100644
index 00000000..e601df48
Binary files /dev/null and b/libtmux-junit5/assets/logo.png differ
diff --git a/libtmux-junit5/assets/logo.svg b/libtmux-junit5/assets/logo.svg
new file mode 100644
index 00000000..5f308932
--- /dev/null
+++ b/libtmux-junit5/assets/logo.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/libtmux-kotlin/README.md b/libtmux-kotlin/README.md
index edafaade..cc9e2a00 100644
--- a/libtmux-kotlin/README.md
+++ b/libtmux-kotlin/README.md
@@ -1,5 +1,14 @@
# libtmux-kotlin
+
+
+
+
+
+
+
+
+
**Coroutine wrapper classes, a session/window/split DSL, and `Flow`/`StateFlow`
bridges over the Java API.**
diff --git a/libtmux-kotlin/assets/logo.png b/libtmux-kotlin/assets/logo.png
new file mode 100644
index 00000000..71b819a3
Binary files /dev/null and b/libtmux-kotlin/assets/logo.png differ
diff --git a/libtmux-kotlin/assets/logo.svg b/libtmux-kotlin/assets/logo.svg
new file mode 100644
index 00000000..9e70bc76
--- /dev/null
+++ b/libtmux-kotlin/assets/logo.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/libtmux-mcp/README.md b/libtmux-mcp/README.md
index 63d20fc5..d12cfd32 100644
--- a/libtmux-mcp/README.md
+++ b/libtmux-mcp/README.md
@@ -1,5 +1,14 @@
# libtmux-mcp
+
+
+
+
+
+
+
+
+
**A tmux server, exposed to a model over the Model Context Protocol.**
Point Claude Code, Claude Desktop, Codex, or any MCP client at a tmux socket and
diff --git a/libtmux-mcp/assets/logo.png b/libtmux-mcp/assets/logo.png
new file mode 100644
index 00000000..9aa269c8
Binary files /dev/null and b/libtmux-mcp/assets/logo.png differ
diff --git a/libtmux-mcp/assets/logo.svg b/libtmux-mcp/assets/logo.svg
new file mode 100644
index 00000000..c464f7fb
--- /dev/null
+++ b/libtmux-mcp/assets/logo.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/libtmux-scala-cats/README.md b/libtmux-scala-cats/README.md
index 3e7f0702..e08ac5ea 100644
--- a/libtmux-scala-cats/README.md
+++ b/libtmux-scala-cats/README.md
@@ -1,5 +1,14 @@
# libtmux-scala-cats
+
+
+
+
+
+
+
+
+
**Cats Effect resources and FS2 observations for `libtmux-scala`.**
This optional module adds scoped blocking execution and loss-aware control
diff --git a/libtmux-scala-cats/assets/logo.png b/libtmux-scala-cats/assets/logo.png
new file mode 100644
index 00000000..6d962e10
Binary files /dev/null and b/libtmux-scala-cats/assets/logo.png differ
diff --git a/libtmux-scala-cats/assets/logo.svg b/libtmux-scala-cats/assets/logo.svg
new file mode 100644
index 00000000..a442260e
--- /dev/null
+++ b/libtmux-scala-cats/assets/logo.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/libtmux-scala-ox/README.md b/libtmux-scala-ox/README.md
index cfff76d5..b35d723b 100644
--- a/libtmux-scala-ox/README.md
+++ b/libtmux-scala-ox/README.md
@@ -1,5 +1,14 @@
# libtmux-scala-ox
+
+
+
+
+
+
+
+
+
**An Ox `Flow` over libtmux subscriptions and live views, for structured
concurrency on virtual threads.**
diff --git a/libtmux-scala-ox/assets/logo.png b/libtmux-scala-ox/assets/logo.png
new file mode 100644
index 00000000..6d962e10
Binary files /dev/null and b/libtmux-scala-ox/assets/logo.png differ
diff --git a/libtmux-scala-ox/assets/logo.svg b/libtmux-scala-ox/assets/logo.svg
new file mode 100644
index 00000000..a442260e
--- /dev/null
+++ b/libtmux-scala-ox/assets/logo.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/libtmux-scala/README.md b/libtmux-scala/README.md
index 7f737317..fe3207f1 100644
--- a/libtmux-scala/README.md
+++ b/libtmux-scala/README.md
@@ -1,5 +1,14 @@
# libtmux-scala
+
+
+
+
+
+
+
+
+
**Scala 3 collections and opaque handles over libtmux for Java.**
Use Scala collections and explicit effects to inspect and operate tmux through
diff --git a/libtmux-scala/assets/logo.png b/libtmux-scala/assets/logo.png
new file mode 100644
index 00000000..6d962e10
Binary files /dev/null and b/libtmux-scala/assets/logo.png differ
diff --git a/libtmux-scala/assets/logo.svg b/libtmux-scala/assets/logo.svg
new file mode 100644
index 00000000..a442260e
--- /dev/null
+++ b/libtmux-scala/assets/logo.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/libtmux-workspace-cli/README.md b/libtmux-workspace-cli/README.md
index 2133dd0c..0f1705ad 100644
--- a/libtmux-workspace-cli/README.md
+++ b/libtmux-workspace-cli/README.md
@@ -1,5 +1,14 @@
# libtmux-workspace-cli
+
+
+
+
**Builds a session from a tmuxp-shaped YAML description.**
Enough of [tmuxp](https://tmuxp.git-pull.com/)'s format to describe a workspace
diff --git a/libtmux-workspace/assets/logo.png b/libtmux-workspace/assets/logo.png
new file mode 100644
index 00000000..2425fe85
Binary files /dev/null and b/libtmux-workspace/assets/logo.png differ
diff --git a/libtmux-workspace/assets/logo.svg b/libtmux-workspace/assets/logo.svg
new file mode 100644
index 00000000..ea210646
--- /dev/null
+++ b/libtmux-workspace/assets/logo.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/libtmux/README.md b/libtmux/README.md
index 68031d89..f011a52b 100644
--- a/libtmux/README.md
+++ b/libtmux/README.md
@@ -1,5 +1,14 @@
# libtmux
+
+
+
+
+
+
+
+
+
**Typed, blocking access to a tmux server. No runtime dependencies.**
This is the whole library. Everything else in the repository is an adapter to
diff --git a/libtmux/assets/logo.png b/libtmux/assets/logo.png
new file mode 100644
index 00000000..e601df48
Binary files /dev/null and b/libtmux/assets/logo.png differ
diff --git a/libtmux/assets/logo.svg b/libtmux/assets/logo.svg
new file mode 100644
index 00000000..5f308932
--- /dev/null
+++ b/libtmux/assets/logo.svg
@@ -0,0 +1,2 @@
+
+