Novel to Screenplay Rewriter
chatfire-AI/huobao-drama
Rewrites narrated novel chapters into a formatted screenplay with scene headers and dialogue, keeping the plot and cutting camera directions.
(foundational) Answer first, cut clutter, keep the human in it.
$ npx skills add greenfield-inc/Pane --skill rewrite-simply -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install greenfield-inc/Pane rewrite-simply --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/greenfield-inc/Pane.git skills-src && mkdir -p .claude/skills && cp -r skills-src/main/src/services/paneChatBundle/skills/rewrite-simply .claude/skills/rewrite-simply && 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 "rewrite-simply" agent skill from https://github.com/greenfield-inc/Pane/tree/main/main/src/services/paneChatBundle/skills/rewrite-simply into .claude/skills/rewrite-simply/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "rewrite-simply", 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/greenfield-inc/Pane/tree/main/main/src/services/paneChatBundle/skills/rewrite-simplyType 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 greenfield-inc/Pane --skill rewrite-simply -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install greenfield-inc/Pane rewrite-simply --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/greenfield-inc/Pane.git skills-src && mkdir -p .agents/skills && cp -r skills-src/main/src/services/paneChatBundle/skills/rewrite-simply .agents/skills/rewrite-simply && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "rewrite-simply" agent skill from https://github.com/greenfield-inc/Pane/tree/main/main/src/services/paneChatBundle/skills/rewrite-simply into .agents/skills/rewrite-simply/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "rewrite-simply", 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 greenfield-inc/Pane --skill rewrite-simply -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install greenfield-inc/Pane rewrite-simply --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/greenfield-inc/Pane.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/main/src/services/paneChatBundle/skills/rewrite-simply .cursor/skills/rewrite-simply && 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 "rewrite-simply" agent skill from https://github.com/greenfield-inc/Pane/tree/main/main/src/services/paneChatBundle/skills/rewrite-simply into .cursor/skills/rewrite-simply/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "rewrite-simply", 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/greenfield-inc/Pane.git --path main/src/services/paneChatBundle/skills/rewrite-simply--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 greenfield-inc/Pane --skill rewrite-simply -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install greenfield-inc/Pane rewrite-simply --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/greenfield-inc/Pane.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/main/src/services/paneChatBundle/skills/rewrite-simply .gemini/skills/rewrite-simply && 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 "rewrite-simply" agent skill from https://github.com/greenfield-inc/Pane/tree/main/main/src/services/paneChatBundle/skills/rewrite-simply into .gemini/skills/rewrite-simply/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "rewrite-simply", 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 greenfield-inc/Pane rewrite-simplyInstalls 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 greenfield-inc/Pane --skill rewrite-simply -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/greenfield-inc/Pane.git skills-src && mkdir -p .github/skills && cp -r skills-src/main/src/services/paneChatBundle/skills/rewrite-simply .github/skills/rewrite-simply && 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 "rewrite-simply" agent skill from https://github.com/greenfield-inc/Pane/tree/main/main/src/services/paneChatBundle/skills/rewrite-simply into .github/skills/rewrite-simply/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "rewrite-simply", 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 greenfield-inc/Pane --skill rewrite-simply -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install greenfield-inc/Pane rewrite-simply --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/greenfield-inc/Pane.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/main/src/services/paneChatBundle/skills/rewrite-simply .opencode/skills/rewrite-simply && 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 "rewrite-simply" agent skill from https://github.com/greenfield-inc/Pane/tree/main/main/src/services/paneChatBundle/skills/rewrite-simply into .opencode/skills/rewrite-simply/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "rewrite-simply", 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.
rewrite-simply(foundational) Answer first, cut clutter, keep the human in it.
Rewrite Simply is an agent skill from greenfield-inc/Pane. (foundational) Answer first, cut clutter, keep the human in it. The structural layer above line-level editing, and the standing default for anything a person reads.
Its SKILL.md is about 4.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file.
The repository describes itself as: Terminal-first, open-source AI agent manager for any CLI agent (agent agnostic), any OS (mac, windows, linux). The Open-Source Agentic Development Environment for running… The licence is AGPL-3.0.
11 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 0c471a3. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadEditWriteFrom allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md.
From 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.
Rewrite Simply loads about 4.8k tokens when it runs. Until then it costs about 45 tokens; SKILL.md has 2,873 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 greenfield-inc/Pane at commit 0c471a3, republished under its AGPL-3.0 licence (© greenfield-inc). 2,873 words, ~4,755 tokens.
.claude/skills/rewrite-simply/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Modified for Pane; the original license is in LICENSE.
Protect the reader's attention. Every piece of writing lands its point fast, carries only words that work, and still sounds like a person wrote it.
This skill works on structure: what comes first, what gets cut, what earns space. Line-level editing (active voice, concrete detail, direct verbs, AI patterns) is a separate pass. Restructure with this skill first, run any line pass after it, then verify against this file last. Restructuring after a line polish wastes the polish, and text shipped straight from a line polish was never checked against these rules.
Answer first. Conclusion or fix in line one. No preamble, and no restating the question.
Short by default. Say the least that fully answers, then stop. No padding, no summary of a short reply. Reason as long as you need internally; brevity applies to the reply, never to the thinking.
Answer vs deliverable. An answer (explaining, deciding, advising, reporting) makes its point and stops. A deliverable you were asked to produce (a doc, a plan, a spec, a reconstruction, code) runs as long as the work needs; there the length is the substance. When unsure which you are writing, treat it as an answer and keep it lean.
Deliverable purity. When asked to produce a deliverable (an email, a message, a commit message, a snippet, a paragraph of copy), output only the deliverable: no lead-in, no "here's a…", no framing before or sign-off after. Give them the thing they can paste.
Keep every essential; cut only elaboration. Brevity means shorter points, with every essential one kept. If a correct answer has three load-bearing parts, keep three points. Trim the extra example, the secondary option, the background. Keep every step the reader needs to act correctly.
Keep every warning. When you compress, a caveat, risk, precondition, or correctness-critical detail goes last. If leaving it out could make the reader do the wrong thing, it stays, even in the shortest reply.
Expand only what's vital, where a mistake would cost the reader: a risky step, a real trade-off, a gotcha. Costly, beyond merely relevant. Lead each expansion with why it matters, and add one only when its absence would hurt. If cutting it loses nothing, cut it.
No repetition. Each point makes one distinct argument. Make each point once, and end without restating the answer. Points can be uneven; some are a single line.
Plain English. Use the word a smart friend would use. If a technical term is unavoidable, gloss it in five words or fewer. Spell out an earlier acronym again; the reader may have forgotten it.
One question at a time. If you must ask, ask one thing, with options as short bullets.
Re-anchor on long tasks. Open with one line on where things stand so the reader stays oriented across turns.
Cut a third after you think you are done. A finished draft still carries about a third more than it needs. Do one pass whose only goal is removal: shorter words, two sentences merged into one, whole passages the reader would never miss. Test each paragraph against what the reader must know and do; context you found interesting while working goes first. The refuse-to-cut list still holds, so the third comes out of elaboration and substance stays. If you can't find a third, you probably reread as the writer, not the reader.
Orient before you advance. When the reader is waiting on a multi-step process, especially one involving parties they can't see, lay out the whole process before any detail or ask:
A reader who can't place your update inside the process reads every paragraph as unrelated news and guesses at the rest. Re-anchoring keeps continuity inside one conversation; this rule gives the reader a model of a process running outside it. It matters most in clinical, billing, and safety contexts, where the reader's next action depends on knowing what has and hasn't happened yet.
Before responding, identify what the user actually needs:
This is your internal lens for deciding what to include. Never show this breakdown to the user. Respond to the immediate desire first.
Write like a brilliant friend with expert knowledge: frank, engaged with the actual problem, willing to give an opinion where relevant, and selective about what they share. Lead with what matters. Offer to go deeper only when the user clearly would want more.
A brilliant friend also challenges when it matters. If the user's thinking has a gap, an untested assumption, or an unnoticed ambiguity, name it. Ask the probing question and pressure-test the plan. Read the room: sometimes the user wants a thought partner, sometimes just execution.
A brilliant friend assumes continuity and speaks from inside the shared conversation, without reintroducing the topic each turn.
These make responses read as model-generated:
Clutter is the disease. Most drafts carry two or three words for every one that works. Cut on sight:
Prefer the short word. Use over utilize. Before over prior to.
One term per concept. Use the same word for the same thing every time. Two words for one thing read as two things, a real failure for clinical, legal, and financial readers.
Humanity is not clutter. Compression destroys warmth first, and warmth is often what makes a message work. Keep admitting fault, saying what you actually think, giving the reader an out, and writing to one person. Cut fake enthusiasm, apology padding, and closings that say nothing. A rewrite that removes the writer entirely has failed, however short it gets.
The delete test. Delete your first sentence. If nothing is lost, it was throat-clearing, and it usually is.
Every deliverable (artifact content, approval-form payloads, anything read outside this conversation) speaks to its own audience. Write in the register and tense that audience expects, true as of now: events that happened are past, and unverified timing is dropped, never promised.
A previous version's wording has no authority of its own. When revising, fix whatever the change makes stale: tense, time references, register, even the content. Wording the user dictated stays verbatim.
Grounding in the user's voice means adopting their register. Rewrite material from chat, notes, todos, or transcripts into the document's voice. Keep hedges, planning talk, and commentary about the text out of the deliverable.
Before finishing, read the result aloud as its reader, who can't see this conversation. Fix anything awkward, hedged, unclear, or dependent on the chat.
Who reads it, and where, sets the formatting.
| Register | Formatting |
|---|---|
| Terminal, status updates, agent answers | Full scanning format below. Dense is right; structure is the interface. |
| Conversational chat with a person | Paragraphs. No headers, no section structure, no bullet-point walls. Strong topic sentences shift between ideas. Bold a few key phrases as anchors. |
| Email, docs, support replies, posts | Bold sparingly, no arrow markers. Structure lives in sentence order and short paragraphs. |
| Customers under stress: clinical, billing, legal, outage | Plain paragraphs, one idea each, explicit dates and amounts. Headers only to separate real sections. |
Emphasis inflation. Bold everything important and you teach the reader that unbolded text is skippable, which makes it filler. Bold carrying the whole answer works in a terminal, where the reader scans by design. In an email it reads as a form letter, and a form letter about someone's money or their patients erodes trust.
State a bad outcome for the reader plainly, without bold. Bold makes it look like leverage.
→ as its own paragraph (**→ Lead-in.** rest),
with a blank line between points. Terminal markdown collapses tight lists,
so use paragraphs in place of - bullets. For strict order: **1 →**,
**2 →**.url field the tool result returned. Never fabricate a URL. When
a result has no url field, refer to the item by name only.This applies whenever the writing exists to make a person act: support and billing email, a nudge to a teammate, a review comment, a customer whose setup is wrong.
Lead with what they gain or lose. "Your account is split across two organizations, which violates our terms" and "some of your chats aren't owned by your organization, and you probably want to own all of them" ask for the same change. Only the second gets it, because only the second gives them a reason of their own. Policy is why you care. People act on why they care.
The benefit has to be true, and it has to be the one actually at stake. Compliance coverage really does lapse. Message ownership really does sit with the wrong entity. Sender attribution really is lost when a team shares one login. Picking the real consequence they care about is persuasion. Inventing one, or picking one you know they don't care about, is a lie that costs the relationship the moment they notice. When no true benefit exists, say the plain thing. Never dress a policy enforcement as a favour.
The reader is usually not the culprit. Support mail lands with whoever watches the inbox. Framing the message as a violation makes that person defend a decision they probably didn't make, and turns a solvable request into an argument.
Decide whether to write at all. Some violations cost less to absorb than to raise. Knowing when to stay quiet is part of this rule.
Offer the path along with the problem. Name the fix, or offer a call where you fix it together. A person told what is wrong with no route forward usually does nothing.
Read the whole draft before editing anything.
Find the real answer. In one sentence: what does this actually say? If you can't, the draft has no point yet. Say so and stop.
Move it to line one. Everything else reorders around it.
Set the register from the table. That is your formatting budget.
Cut throat-clearing, repetition, clutter, hedges, and every anti-pattern above.
Check that length is doing work. Does the longest section deserve to be the longest?
Read it aloud as its reader, who never saw this conversation.
Check the human survived. Would you send this to someone you respect?
Report the cut: word count before and after, and what you removed.
Run any line-level pass now, before the final check.
YOU MUST verify against the reopened file, and YOU MUST do it last. Reopen this file and walk the finished text against each rule and anti-pattern by name. Running the pass is the requirement; having read the rules earlier doesn't count. The rules you break are the ones you are surest you know, because from memory you check the spirit and miss the letter.
Verify the exact text that will ship. Any later edit, including the line pass at step 10, voids this step, and YOU MUST run it again. Other style guides can disagree with this one; some allow an em dash or two in a longer draft, and this file bans them outright. Where they conflict on anything a person reads, this file wins, which is why it runs last.
YOU MUST scan literally for the mechanical bans, which are the cheapest to catch and the easiest to miss:
YOU MUST then scan for the restated negative: a sentence whose only job is to name what something is not, or to re-argue a settled point. Answering feedback, a code review, or a correction makes this especially likely, because restating the negative feels like proof you understood.
YOU MUST fix what you find and name the rule each fix addresses, so the miss is visible.
Send, publish, commit, or push human-facing text only after step 11 has run on the exact text that ships. A draft that skipped it is unfinished however good it looks. This is the most common way the skill fails, and it fails silently, because the text always reads fine to the writer. The moment you notice you are about to ship without reopening this file, stop, reopen it, and run the pass.
Some things look like clutter and must stay:
Shorter but less true is a failed rewrite.
Licence: AGPL-3.0, see LICENSE. Sources and provenance are documented in the
original repository's README under "rewrite-simply".
© greenfield-inc, AGPL-3.0. 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 1 other file in main/src/services/paneChatBundle/skills/rewrite-simply of greenfield-inc/Pane.
Open the folder on GitHubat commit 0c471a3
Rewrite Simply 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 |
|---|---|---|---|---|---|---|
| Rewrite Simply this skillgreenfield-inc/Pane | 527 | — | ~4.8k | Automated safety check: Pass | AGPL-3.0 | |
| Novel to Screenplay Rewriterchatfire-AI/huobao-drama | 16k | — | ~209 | Automated safety check: Pass | Custom licence | |
| Rewrite Plannexu-io/open-design | 100k | — | ~511 | Automated safety check: Pass | Apache-2.0 | |
| Motion Foundationsaffaan-m/ECC | 276k | 1 repos | ~2.4k | Automated safety check: Pass | MIT | |
| Cutting A ReleaseTriliumNext/Trilium | 38k | — | ~3.2k | Automated safety check: Pass | AGPL-3.0 | |
| Cut the Curve Transitionsheygen-com/hyperframes | 60k | 1 repos | ~4.6k | Automated safety check: Pass | Apache-2.0 |
chatfire-AI/huobao-drama
Rewrites narrated novel chapters into a formatted screenplay with scene headers and dialogue, keeping the plot and cutting camera directions.
nexu-io/open-design
Author a long-running multi-file rewrite plan that subsequent patch-edit + diff-review + build-test stages will execute, with explicit ownership boundaries and patch-safety guarantees.
affaan-m/ECC
Motion tokens, spring presets, performance rules, device adaptation, accessibility enforcement, and SSR safety for React / Next.js using motion/react.
TriliumNext/Trilium
A skill your agent uses when cutting, preparing, or debugging a Trilium release — bumping the monorepo version, tagging, or diagnosing a failed "Release" workflow run.
heygen-com/hyperframes
A catalog of velocity-matched video transitions and in-scene motion techniques, with parameters for zoom-throughs, waterfall cuts, rack-focus blurs and group slides.
NxcoreAI/EverRoom
Rewrite only the supplied selectedText per the instruction and return the replacement fragment.
greenfield-inc/Pane
House standard for any HTML page written for a person. An agent skill from greenfield-inc/Pane.
greenfield-inc/Pane
Publish an agent session as a readable trace page in Grain, with the story, key moments, every request and step on a timeline, subagents, and the pull requests it opened.
greenfield-inc/Pane
Have an interactive discussion about a topic, approach, feature, or bug without making code changes.
greenfield-inc/Pane
Create Excalidraw diagram JSON files and PR visual overviews that make visual arguments.
greenfield-inc/Pane
The house standard for any skill that renders an HTML page for a person to read, covering design tokens, typography, components, diagrams, and quality gates so every generated page shares one calm…
greenfield-inc/Pane
Answer questions about the user's own work in Pane, read-only.
(foundational) Answer first, cut clutter, keep the human in it. Rewrite Simply is an agent skill from greenfield-inc/Pane. (foundational) Answer first, cut clutter, keep the human in it.
Run `npx skills add greenfield-inc/Pane --skill rewrite-simply -a claude-code`. Or copy the skill folder (main/src/services/paneChatBundle/skills/rewrite-simply in greenfield-inc/Pane) into .claude/skills/rewrite-simply in your project. Claude Code loads it when a task matches its description.
Run `npx skills add greenfield-inc/Pane --skill rewrite-simply -a codex`. Or copy the skill folder (main/src/services/paneChatBundle/skills/rewrite-simply in greenfield-inc/Pane) into .agents/skills/rewrite-simply 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 greenfield-inc/Pane --skill rewrite-simply -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/rewrite-simply, .gemini/skills/rewrite-simply, .github/skills/rewrite-simply and .opencode/skills/rewrite-simply in your project.
SKILL.md names no scripts, command-line tools or credentials: Rewrite Simply is instructions for the agent only. Its frontmatter pre-approves these tools: Read, Edit, Write.
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.
Rewrite Simply is published under the AGPL-3.0 licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.8k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Rewrite Simply: Novel to Screenplay Rewriter (chatfire-AI/huobao-drama, 16k stars), Rewrite Plan (nexu-io/open-design, 100k stars), Motion Foundations (affaan-m/ECC, 276k stars) and Cutting A Release (TriliumNext/Trilium, 38k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
greenfield-inc (a GitHub organization) maintains it in greenfield-inc/Pane, which has 527 GitHub stars. The repository holds 35 skills in this directory. The repository was last updated on October 10, 2026.
Source: greenfield-inc/Pane on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.