diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2ff983f5..a84f8e2c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -47,6 +47,7 @@ All notable changes to `ichava/core` follow [Keep a Changelog](https://keepachan
### Changed
+- **The Twemoji pack is `ichava/icon-sets-twemoji`** (owner, 2026-11-05: forward only, no aliases). The emoji pack ships Twemoji only and was renamed from `ichava/icon-sets-emoji`. `icon-sets.json` lists it under key `twemoji` (was `emoji`), package and repository `ichava/icon-sets-twemoji` and title `Twemoji`, so `ichava::ichava-core.install twemoji` installs it and `emoji` is no longer a key; the OpenMoji entry's description follows that pack's `config.json`. The docs pack table, architecture diagrams, pack-docs link and `check-updates` example name the new package, and the registration golden's fixture moved to `RegistrationGolden/twemoji` with the pack's current `config.json`. Stored ids `ichava/icon-sets-emoji::twemoji/...` no longer resolve; hosts delete them and re-seed the pack. `NoFormerTwemojiPackNameTest` fails if the old name appears anywhere in this repository outside this changelog (proven red on a planted line).
- **`icon-sets.json` records each pack's `visibility`** (`public` or `private`), synced by `bin/sync-icon-sets.php` from the repos API and kept when a response does not state it (F-02). Documented under *The pack catalogue* in `docs/tools/artisan-commands.md`. `tests/Unit/SyncIconSetsVisibilityTest.php`.
- **The generic Blade snippet uses a prefix this host registers**: the short one while `components.short_prefix` names one, `ichava-core` when it is off (`ComponentPrefixes::snippetPrefix()`).
- **`IconDriverInterface` states `SvgDriver`'s real API** (`render(IconData …)`, `load(string $path …)`), `SvgDriver` implements it, the provider binds it, and `IconRegistry`, `IconSvgReader` and `DirectoryIconDriver` depend on it (C-17). The interface's old directory methods (`all`, `has`, `setConfig`, `getConfig`, `setIconPath`, `getIconPath`) are gone from it; `DirectoryIconDriver` keeps them as its own API. `IconRegistry::driver()` returns the interface. `tests/Feature/IconDriverContractTest.php`.
diff --git a/docs/architecture.md b/docs/architecture.md
index 957d635a..7956b26f 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -30,7 +30,7 @@ flowchart TB
browser["ichava/icon-browser REST API + Inertia/React browser middleware + browser views PRIVATE, licensed"]
tabler["ichava/icon-sets-tabler 6,202 icons"]
flag["ichava/icon-sets-flag 542 flags, 1x1 + 4x3"]
- emoji["ichava/icon-sets-emoji 3,435 Twemoji icons"]
+ twemoji["ichava/icon-sets-twemoji 3,435 Twemoji icons"]
third["3rd-party packs via ichava::icon-sets-package-scaffolder.make"]
meta["ichava/ichava pre-split monolith, superseded by core ARCHIVED 2026-09-22, read-only"]
toolkit["ichava/icon-sets-sync Docker-first sync tool refreshes vendored SVGs via PR (not installed by users)"]
@@ -40,11 +40,11 @@ flowchart TB
browser -- depends on --> core
tabler -- depends on --> core
flag -- depends on --> core
- emoji -- depends on --> core
+ twemoji -- depends on --> core
third -- depends on --> core
toolkit -. CI refreshes .-> tabler
toolkit -. CI refreshes .-> flag
- toolkit -. CI refreshes .-> emoji
+ toolkit -. CI refreshes .-> twemoji
react -. replaces the SPA in .-> browser
classDef engine fill:#1f6feb,stroke:#1f6feb,color:#fff
@@ -54,7 +54,7 @@ flowchart TB
classDef tooling fill:#bf8700,stroke:#bf8700,color:#fff
class core engine
class browser http
- class tabler,flag,emoji,third pack
+ class tabler,flag,twemoji,third pack
class meta,motion,react other
class toolkit tooling
```
@@ -106,8 +106,8 @@ classDiagram
class FlagIcons_IconsServiceProvider["IconsServiceProvider"] {
<>
}
- class EmojiSets_IconsServiceProvider["IconsServiceProvider"] {
- <>
+ class Twemoji_IconsServiceProvider["IconsServiceProvider"] {
+ <>
}
PackageServiceProvider <|-- IchavaServiceProvider
PackageServiceProvider <|-- SupportServiceProvider
@@ -115,7 +115,7 @@ classDiagram
PackageServiceProvider <|-- IconBrowserServiceProvider
IconPackServiceProvider <|-- TablerIcons_IconsServiceProvider
IconPackServiceProvider <|-- FlagIcons_IconsServiceProvider
- IconPackServiceProvider <|-- EmojiSets_IconsServiceProvider
+ IconPackServiceProvider <|-- Twemoji_IconsServiceProvider
```
**Every pack's provider is called `IconsServiceProvider`.** The short name is a constant across the
diff --git a/docs/installation.md b/docs/installation.md
index 1a5a0f59..f2b1ead7 100644
--- a/docs/installation.md
+++ b/docs/installation.md
@@ -72,7 +72,7 @@ the repositories block in step 1, then require it. Some of the public ones:
|---|---|---|
| `ichava/icon-sets-tabler` | 6,238 | `https://github.com/ichava/icon-sets-tabler` |
| `ichava/icon-sets-flag` | 542 | `https://github.com/ichava/icon-sets-flag` |
-| `ichava/icon-sets-emoji` | 3,435 | `https://github.com/ichava/icon-sets-emoji` |
+| `ichava/icon-sets-twemoji` | 3,435 | `https://github.com/ichava/icon-sets-twemoji` |
| `ichava/icon-sets-openmoji` | 8,568 | `https://github.com/ichava/icon-sets-openmoji` |
```bash
diff --git a/docs/recipes/use-an-icon-pack.md b/docs/recipes/use-an-icon-pack.md
index 81340efc..08cfc193 100644
--- a/docs/recipes/use-an-icon-pack.md
+++ b/docs/recipes/use-an-icon-pack.md
@@ -61,7 +61,7 @@ Each pack's repository has a `docs/` directory:
- [`ichava/icon-sets-tabler/docs/`](https://github.com/ichava/icon-sets-tabler/tree/main/docs)
- [`ichava/icon-sets-flag/docs/`](https://github.com/ichava/icon-sets-flag/tree/main/docs)
-- [`ichava/icon-sets-emoji/docs/`](https://github.com/ichava/icon-sets-emoji/tree/main/docs)
+- [`ichava/icon-sets-twemoji/docs/`](https://github.com/ichava/icon-sets-twemoji/tree/main/docs)
Look there for stroke widths, variant lists, attribution, and any pack-specific behaviour.
diff --git a/docs/tools/artisan-commands.md b/docs/tools/artisan-commands.md
index 30083193..7b2e19c0 100644
--- a/docs/tools/artisan-commands.md
+++ b/docs/tools/artisan-commands.md
@@ -92,7 +92,7 @@ Reports whether any registered icon pack is behind its upstream source. Reads ea
```bash
php artisan ichava::ichava-core.check-updates # table for every pack
-php artisan ichava::ichava-core.check-updates --package=ichava/icon-sets-emoji # restrict to one pack
+php artisan ichava::ichava-core.check-updates --package=ichava/icon-sets-twemoji # restrict to one pack
php artisan ichava::ichava-core.check-updates --format=json # machine-readable
php artisan ichava::ichava-core.check-updates --fail-on-stale # exit 1 if any pack is behind
```
diff --git a/icon-sets.json b/icon-sets.json
index 1284fe62..0ad65f85 100644
--- a/icon-sets.json
+++ b/icon-sets.json
@@ -42,10 +42,10 @@
"visibility": "public"
},
{
- "key": "emoji",
- "package": "ichava/icon-sets-emoji",
- "repository": "ichava/icon-sets-emoji",
- "title": "Emoji Sets",
+ "key": "twemoji",
+ "package": "ichava/icon-sets-twemoji",
+ "repository": "ichava/icon-sets-twemoji",
+ "title": "Twemoji",
"description": "Twemoji, Twitter/X's open-source emoji set, as SVG. Unicode 17 / Emoji 17 spec. Categorised by Unicode CLDR groups. OpenMoji is in ichava/icon-sets-openmoji.",
"license": "MIT (code) / CC-BY 4.0 (Twemoji assets)",
"icon_count": 3435,
@@ -64,7 +64,7 @@
"package": "ichava/icon-sets-openmoji",
"repository": "ichava/icon-sets-openmoji",
"title": "OpenMoji",
- "description": "OpenMoji emoji in two sets (colour and black outline), Unicode emoji 16.0, grouped by Unicode CLDR category. Moved verbatim from ichava/icon-sets-emoji.",
+ "description": "OpenMoji emoji in two sets (colour and black outline), Unicode emoji 16.0, grouped by Unicode CLDR category. Moved verbatim from ichava/icon-sets-twemoji, which now ships Twemoji only.",
"license": "MIT (code) / CC-BY-SA 4.0 (OpenMoji assets)",
"icon_count": 8568,
"variants": [
diff --git a/src/Constants/JsonConfigConstants.php b/src/Constants/JsonConfigConstants.php
index 290ad622..6c14bd6d 100644
--- a/src/Constants/JsonConfigConstants.php
+++ b/src/Constants/JsonConfigConstants.php
@@ -308,8 +308,8 @@ public static function getType(): string
* is the site of the project whose icons the pack vendors, and it is the
* only place that fact is recorded in a human-facing form.
*
- * Returns '' when the pack has no single upstream -- `icon-sets-emoji`
- * vendors two projects across three sets and omits the key deliberately.
+ * Returns '' when the pack omits the key -- `icon-sets-twemoji` does, and
+ * names its upstream, with its URL, in `metadata.authors` instead.
*
* Example: https://tabler-icons.io/
*/
@@ -495,7 +495,7 @@ public static function getUpstreamCdnUrls(): array
*
* { "type": "npm", "package": "...", "source_path": "..." }
* { "type": "github-archive", "archive_url": "...", "source_path": "..." }
- * { "type": "recipe", "recipe": "emoji-sets" }
+ * { "type": "recipe", "recipe": "twemoji-sets" }
* { "type": "url", "version_field": "version" }
*
* @return array|null
diff --git a/src/Events/IconPackUpdateAvailable.php b/src/Events/IconPackUpdateAvailable.php
index 19c5539a..b31c6aab 100644
--- a/src/Events/IconPackUpdateAvailable.php
+++ b/src/Events/IconPackUpdateAvailable.php
@@ -27,9 +27,9 @@ public function __construct(
/**
* Which source under the pack's `upstream` block fired the
* event. "primary" for the canonical source; the value of
- * `additional_sources[*].name` for secondary trackers (e.g.
- * emoji-sets dispatches one event for `primary` (Twemoji) and
- * one for `openmoji` whenever either upstream moves).
+ * `additional_sources[*].name` for secondary trackers (a pack
+ * that tracks a second upstream dispatches one event for
+ * `primary` and one for that source whenever either moves).
*/
public string $sourceName = 'primary',
) {}
diff --git a/src/Services/SvgProcessingService.php b/src/Services/SvgProcessingService.php
index 332dda85..28bc1875 100644
--- a/src/Services/SvgProcessingService.php
+++ b/src/Services/SvgProcessingService.php
@@ -61,7 +61,7 @@ final class SvgProcessingService
* 4: the sanitiser drops stray text and CDATA directly under `