Hz Metavrx UI Set
meta-quest/agentic-tools
Builds app UI for Meta VR and Horizon OS with the MetaVrx UI Set, a Jetpack Compose component library and design system.
Writes and reviews composables for Compose and CMP: the Route/Screen/leaf split, state-read placement and stability, loading/empty/error UX states, LazyColumn lists and grids, animation choice…
$ npx skills add Meet-Miyani/compose-skill --skill compose-ui -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Meet-Miyani/compose-skill compose-ui --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Meet-Miyani/compose-skill.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/compose-ui .claude/skills/compose-ui && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "compose-ui" agent skill from https://github.com/Meet-Miyani/compose-skill/tree/main/skills/compose-ui into .claude/skills/compose-ui/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compose-ui", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Meet-Miyani/compose-skill/tree/main/skills/compose-uiType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Meet-Miyani/compose-skill --skill compose-ui -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Meet-Miyani/compose-skill compose-ui --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Meet-Miyani/compose-skill.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/compose-ui .agents/skills/compose-ui && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "compose-ui" agent skill from https://github.com/Meet-Miyani/compose-skill/tree/main/skills/compose-ui into .agents/skills/compose-ui/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compose-ui", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Meet-Miyani/compose-skill --skill compose-ui -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Meet-Miyani/compose-skill compose-ui --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Meet-Miyani/compose-skill.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/compose-ui .cursor/skills/compose-ui && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "compose-ui" agent skill from https://github.com/Meet-Miyani/compose-skill/tree/main/skills/compose-ui into .cursor/skills/compose-ui/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compose-ui", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Meet-Miyani/compose-skill.git --path skills/compose-ui--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Meet-Miyani/compose-skill --skill compose-ui -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Meet-Miyani/compose-skill compose-ui --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Meet-Miyani/compose-skill.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/compose-ui .gemini/skills/compose-ui && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "compose-ui" agent skill from https://github.com/Meet-Miyani/compose-skill/tree/main/skills/compose-ui into .gemini/skills/compose-ui/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compose-ui", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Meet-Miyani/compose-skill compose-uiInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Meet-Miyani/compose-skill --skill compose-ui -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Meet-Miyani/compose-skill.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/compose-ui .github/skills/compose-ui && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "compose-ui" agent skill from https://github.com/Meet-Miyani/compose-skill/tree/main/skills/compose-ui into .github/skills/compose-ui/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compose-ui", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Meet-Miyani/compose-skill --skill compose-ui -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Meet-Miyani/compose-skill compose-ui --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Meet-Miyani/compose-skill.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/compose-ui .opencode/skills/compose-ui && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "compose-ui" agent skill from https://github.com/Meet-Miyani/compose-skill/tree/main/skills/compose-ui into .opencode/skills/compose-ui/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compose-ui", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
compose-uiWrites and reviews composables for Compose and CMP: the Route/Screen/leaf split, state-read placement and stability, loading/empty/error UX states, LazyColumn lists and grids, animation choice…
Compose UI is an agent skill from Meet-Miyani/compose-skill. Writes and reviews composables for Compose and CMP: the Route/Screen/leaf split, state-read placement and stability, loading/empty/error UX states, LazyColumn lists and grids, animation choice, accessibility and semantics, design-system tokens, CMP Res resources, Coil images, and keyboard/focus. Use when touching @Composable code, recomposition, stability, LazyColumn, animation, shimmer or skeleton, accessibility, theme, colors, Res.string, Coil, focus, or keyboard. Do NOT use for MVI, error tiers, or module…
Its SKILL.md is about 3.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 15 other files, including reference files (for example `references/accessibility.md`, `references/adaptive-and-insets.md` and `references/design-system.md`).
It sits in Frontend & Design, covering Accessibility and Design systems. It works with Gradle, Jetpack Compose and Android. The repository describes itself as: Compose Skill (Compose Kit): agent skills for Jetpack Compose & Compose Multiplatform. Makes Claude Code, Codex, Cursor, Copilot, Gemini CLI and OpenCode write better Compose… The licence is MIT.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 8770766. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
rgFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Compose UI loads about 3.7k tokens when it runs, and up to ~32k if it reads all its reference files. Until then it costs about 174 tokens; SKILL.md has 1,909 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Meet-Miyani/compose-skill at commit 8770766, republished under its MIT licence (© Meet-Miyani). 1,909 words, ~3,703 tokens.
.claude/skills/compose-ui/SKILL.md (or your agent's skills folder). This skill also uses 14 other files; get the full folder from GitHub.You are acting as a senior staff mobile engineer who owns this codebase's architecture. You are accountable for how it looks in two years, not for pleasing the requester today.
You reason about scope, not vibes. "Wrapping it in remember" and "adding @Immutable" are not diagnoses. The only question that matters is: when this value changes, which composable scopes re-execute? Answer that before changing a line. Satisfying the wording of a rule while defeating its purpose is a violation.
compose-architecture skill)compose-architecture skill, Operating stance items 7–11). Routing, case classification and verification gates stay silent there.gradle/libs.versions.toml and the current official docs first; unreachable docs means marking the code unverified.| Task | Use instead |
|---|---|
| Route first: decide the task path and files to read | the compose skill, before anything below |
| Add, change or review a screen, destination or slice | the compose-feature skill |
| Repositories, Ktor, Room, DataStore, Paging, offline-first | the compose-data skill |
commonMain sharing, expect/actual, iOS/Swift, desktop, web | the compose-platform skill |
| New project or module, convention plugins, version catalog, CI, guards | the compose-project skill |
| Navigation 3 API mechanics (scenes, decorators, deep-link recipes) | the android/skills navigation-3 skill, if installed; optional depth only |
Compiler-report internals beyond the loop in performance-diagnostics.md | the skydoves diagnosing-compose-stability skill, if installed; optional depth only |
Iron law: read depth decides cost. A state read invalidates the nearest enclosing composable scope, not the line that reads it. When a screen re-executes too often, move the read down to the leaf that renders it, never wrap the scope in
remember. A violation means deleting the hoisted read and re-verifying with the gates below.
Rules 1–3 and 5–11 are non-negotiables. Rule 4 is a default: a recorded project decision wins over it with no argument (see the compose-architecture skill, existing-projects.md item 5).
These rules govern code you write. When you review or conform existing working code, a deviation is a finding to report with its severity, not a reason to rewrite; follow the review and conform paths.
onAction. A Screen that reads the ViewModel doubles every entry point; a leaf that takes onAction can dispatch anything. Prevents: entry-point duplication and unreviewable leaves.Scaffold content lambda, or a lazy-list builder scope and pass the snapshot value down. When a deep consumer needs fast-changing state, pass the State or a lambda, not the read value. A clock read above the list it feeds re-executes the box, the builder, and every visible item lambda on every tick. Prevents: per-tick list invalidation (brief F-15).UiState as formatted strings. UiState and UiModels carry the Instant; formatting happens in the presentation mapper or at display. A per-second updateState of a remaining-time string invalidates every collector of that state. Prevents: unrestorable ticked state and whole-screen invalidation.===), stable ones by equals. Types from a module built without the Compose compiler are never inferred stable. List only packages where every class is immutable; check the file when adding a model class. Also declare kotlin.collections.* (wired by build-logic). @Immutable is a promise the compiler believes without checking: apply it only when the class is genuinely immutable, or in-place mutation renders stale UI no recomposition fixes. Convert third-party unstable types at the boundary into a type the kit owns (LoadState.Error holds a Throwable; present AppError instead). Never add a wrapper only for stability. Prevents: lost skipping and stale UI (brief F-16, F-17; M-11).compose-architecture skill (rule 8): skeletons for the cold load only, refresh keeps content with an indicator, a failed refresh keeps the items with a Retry holding it. Prevents: wiped content and trapped screens.contentType; never the index. Keep item scope light: hoist parsing and formatting out of item scope. Prevents: scrambled row state and per-tick parsing.consumeWindowInsets chained after the applying padding. Prevents: unrestorable panes and double-offset content (AND-21, AND-23, AND-27, AND-72).commonMain never imports java.*, android.*, LocalContext, or R; inject dispatchers and use Dispatchers.Default as the shared default. A java.time.Instant or LocalContext reference compiles on Android and breaks every other target. Time is kotlin.time.Instant; strings are CMP Res accessors. Dispatchers.IO exists on Kotlin/Native since coroutines 1.7.0 but is unavailable when the module also targets JS/Wasm. Prevents: shared code that compiles on only some targets.ux-states.md decision tables.| Situation | Fix |
|---|---|
Domain model from a module without the Compose compiler sits in UiState | Declare its package in the stability configuration file (rule 4) |
Class is genuinely immutable (vals, read-only collections) and the report still flags it | @Immutable, describing truth only |
| An M-11 trigger fires (derived values, merged sources, UI-only fields, hidden fields) | UI-specific wrapper class |
| Anything else, including "make it skippable" on a mutable class | Stop. No annotation, no wrapper |
| Thought | Reality |
|---|---|
"I'll read the clock at the top and pass now down; it is easier." | No. Rule 2: passing the value moves the cost up. Pass the State or read at the leaf. |
| "I'll tick a formatted countdown string from the ViewModel; simpler." | No. Rules 2–3: the string invalidates every collector each second. Carry the Instant; read the clock at the leaf. |
"I'll wrap it in remember to fix the recomposition." | No. Rule 2 (iron law): remember caches a value; it does not change which scope re-executes. Find the read. |
"Adding @Immutable will make it skippable." | No. Rule 4: only when the class is genuinely immutable, or mutation renders stale UI. |
| "Every feature needs a UiModel for consistency." | No. Rule 4: consistency means the same rule, not the same files. Name the M-11 trigger or hold the domain model. |
"I'll pass the whole NoteUiModel in the key so detail skips the fetch." | No. Keys carry identity; detail re-fetches by identity (see the compose-architecture skill, rule 15). |
| "This refresh can show a full-screen spinner; it is only a second." | No. Rule 7: refresh keeps content with an indicator. Skeletons are cold-load only. |
| "Index keys are fine; the list never reorders today." | No. Rule 8: keys come from domain identity, plus contentType. |
| "I'll hardcode this color; the tokens do not have it." | No. Rule 5: tokens only in feature code. Name the missing token as an open gap. |
| "I'll copy this component; the condition was specific to that screen." | No. Rule 6: copy the gate with the component. |
| "I'll put this string inline; translation comes later." | No. Rule 9: every user-facing string is a resource in every locale before done. |
"I'll use java.time / LocalContext here; it works on my device." | No. Rule 11: commonMain uses kotlin.time.Instant and CMP Res. Never java.*, android.*, LocalContext, or R. |
"I'll default this dispatcher to Dispatchers.IO; it is only shared code." | Rule 11: inject it and default to Dispatchers.Default in commonMain, which may also target JS/Wasm. |
rg -n "ViewModel|koinViewModel|collectAsState" --glob '*Screen.kt' --glob '*Sheet.kt' shows ViewModel reads only in *Route.kt).rememberSaveable mirror of a UiState field and no LaunchedEffect syncing two copies of one value (see the compose-architecture skill, rules 9–10): yes or no.UiState; the clock is read at the leaf that renders it: yes or no.UiState/UiModel stable; every @Immutable holds only vals of immutable types (see performance-diagnostics.md for the loop).rg -n "Color\(0x" --glob '*.kt' <feature-root> is empty outside the design-system module (guard check-hardcoded-colors.sh).items(/item( call in a lazy list carries a key from domain identity and a contentType: yes or no.check-locale-parity.sh).Load only the references this task needs. One level deep.
Also read review-mode.md when reviewing a feature UI change.
Also read ui-testing.md when changing UI behavior.
state-reads-and-stability.md — read depth, deferred reads, derived state, stable UiModels, the report's blind spot.
ux-states.md — skeleton vs keep-content vs spinner, validation, disabled vs hidden.
lists.md — keys, contentType, item-scope work, grids, nesting, paging hookup.
motion.md — animation API choice, graphicsLayer, gestures.
shared-elements.md — shared-element choice, keys, modifier order, overlay.
accessibility.md — semantics, touch targets, contrast, actions, RTL.
design-system.md — tokens, component placement, reuse inventory, sheets/dialogs/snackbar chrome.
resources.md — CMP Res vs Android R, qualifiers, locale parity, imports, maps.
resources-media.md — icons, fonts, raw files and remote content.
images.md — Coil 3 setup and API choice, placeholders, caching, CMP placement.
keyboard-and-focus.md — focus on arrival, IME actions, dismiss rules.
modifiers.md — modifier order, custom Modifier.Node, lambda (deferred-read) modifiers.
adaptive-and-insets.md — window size classes, panes, edge-to-edge and insets exactly once.
performance-diagnostics.md — diagnose, fix, verify loop: compiler reports, tracing, baseline profiles, R8, release-mode honesty.
© Meet-Miyani, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 14 other files (references) in skills/compose-ui of Meet-Miyani/compose-skill.
Open the folder on GitHubat commit 8770766
Compose UI next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Compose UI this skillMeet-Miyani/compose-skill | 301 | — | ~3.7k | Automated safety check: Pass | MIT | |
| Hz Metavrx UI Setmeta-quest/agentic-tools | 215 | — | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Material Design 3 UI/UX Guideskydashnet/material-design-3-ui-skill | 135 | — | ~3k | Automated safety check: Pass | MIT | |
| Configuring Test Dependenciesskydoves/android-testing-skills | 333 | — | ~4.1k | Automated safety check: Pass | Apache-2.0 | |
| Android AccessibilityMoustachauve/WLED-Android | 169 | 3 repos | ~471 | Automated safety check: Pass | Apache-2.0 | |
| Test Componentgluestack/gluestack-ui | 5.3k | — | ~3.2k | Automated safety check: Pass | None |
meta-quest/agentic-tools
Builds app UI for Meta VR and Horizon OS with the MetaVrx UI Set, a Jetpack Compose component library and design system.
skydashnet/material-design-3-ui-skill
Guides designing, reviewing or implementing interfaces that follow Google's Material Design 3 system: semantic tokens, component states, adaptive layout and accessibility.
skydoves/android-testing-skills
A skill your agent uses to wire the correct Gradle dependency matrix for Jetpack Compose UI tests.
Moustachauve/WLED-Android
Expert checklist and prompts for auditing and fixing Android accessibility issues, especially in Jetpack Compose.
gluestack/gluestack-ui
Comprehensive testing of gluestack-ui components across platforms and apps
github/awesome-copilot
Comprehensive guide for creating professional UI/UX designs in Penpot using MCP tools.
Meet-Miyani/compose-skill
Adds, changes, or reviews a screen, sheet, dialog, or destination slice (endpoint to repository to ViewModel to UI to navigation to DI to tests) in a Compose or CMP project.
Meet-Miyani/compose-skill
A skill your agent uses when writing, changing or reviewing code that touches the house contract for Jetpack Compose and Compose Multiplatform apps: module graph, MVI/BaseViewModel, error tiers…
Meet-Miyani/compose-skill
Owns platform splits for Compose Multiplatform apps: places declarations in commonMain, chooses expect/actual vs interface plus DI, wires host adapters and ports, and validates iOS/Swift interop…
Meet-Miyani/compose-skill
Owns project and build-level work for Compose and Compose Multiplatform apps: bootstrapping a new project, adopting the kit in an existing project, adding or extracting a module, convention plugins…
Meet-Miyani/compose-skill
Owns repositories, data sources and mapping for Compose and Compose Multiplatform apps: DTO to domain to UiModel boundaries, Ktor clients and bearer auth, WebSocket and SSE, Room, DataStore, Paging…
Meet-Miyani/compose-skill
Use this skill first for any Jetpack Compose or Compose Multiplatform task: a new feature or screen, a change to existing code, a bug fix, a review, making code follow the kit, project or build…
Works with
Categories
Writes and reviews composables for Compose and CMP: the Route/Screen/leaf split, state-read placement and stability, loading/empty/error UX states, LazyColumn lists and grids, animation choice…. Compose UI is an agent skill from Meet-Miyani/compose-skill. Writes and reviews composables for Compose and CMP: the Route/Screen/leaf split, state-read placement and stability, loading/empty/error UX states, LazyColumn lists and grids, animation choice, accessibility and semantics, design-system tokens, CMP Res resources, Coil images, and keyboard/focus.
Compose UI fits situations like: touching @Composable code; module graph (compose-architecture); data work (compose-feature; module work (compose-project).
Run `npx skills add Meet-Miyani/compose-skill --skill compose-ui -a claude-code`. Or copy the skill folder (skills/compose-ui in Meet-Miyani/compose-skill) into .claude/skills/compose-ui in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Meet-Miyani/compose-skill --skill compose-ui -a codex`. Or copy the skill folder (skills/compose-ui in Meet-Miyani/compose-skill) into .agents/skills/compose-ui in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Meet-Miyani/compose-skill --skill compose-ui -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/compose-ui, .gemini/skills/compose-ui, .github/skills/compose-ui and .opencode/skills/compose-ui in your project.
Going by SKILL.md and its folder, Compose UI needs the command-line tools its instructions call (rg).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Compose UI is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.7k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 28k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Compose UI: Hz Metavrx UI Set (meta-quest/agentic-tools, 215 stars), Material Design 3 UI/UX Guide (skydashnet/material-design-3-ui-skill, 135 stars), Configuring Test Dependencies (skydoves/android-testing-skills, 333 stars) and Android Accessibility (Moustachauve/WLED-Android, 169 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Meet-Miyani (a GitHub user) maintains it in Meet-Miyani/compose-skill, which has 301 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on October 6, 2026.
Source: Meet-Miyani/compose-skill on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.