OpenPronoun

An open standard for getting pronouns right in software.
Model them, parse them, store them, and show them the way each person asked, consistently across every system that touches their name.
Draft 0.1, open for feedback. Reference libraries are MIT licensed.

Why a standard?
Section titled “Why a standard?”Pronouns show up everywhere a person’s name does: profiles, patient charts, HR systems, class rosters, chat apps, and the emails your product sends on someone’s behalf. Today almost every team solves this from scratch, and the usual answers fall short.
- Free-text fields are flexible, but software can’t use them. You can’t safely write “They updated their settings” from a string someone typed.
- Short dropdowns leave people out. “He / She / They / Other” tells everyone whose pronouns aren’t listed that they’re the exception.
- Nothing interoperates. Pronouns entered in one system don’t survive the trip to the next.
Getting this wrong isn’t cosmetic. Misgendering erodes trust, and in settings like healthcare it can discourage people from seeking care at all. OpenPronoun gives teams a shared, well-tested answer so they don’t have to invent one, and so the people using their software are addressed correctly everywhere.
How it works
Section titled “How it works”Parse what people actually type
Section titled “Parse what people actually type”Different spellings, spacing, capitalization, and word order all normalize to one canonical pronoun set with every grammatical form filled in. Multiple sets, neopronouns, and answers like any pronouns or ask me are part of the model, not edge cases. See Parsing & normalization.
Store once, display everywhere
Section titled “Store once, display everywhere”Because every form is stored, any part of your product can show pronouns consistently: a short label beside a name, a grammatically correct generated sentence, or a public view that leaves out sets the person only shares with some people. See Display & stringification.

Drop-in components
Section titled “Drop-in components”Don’t want to build the UI yourself? Drop in a component, set it, and forget it. Each one looks good out of the box, takes on your product’s look when you want it to, and follows this spec without you having to read it.
Try it. Open the list to add a set, remove one, drag to reorder, or choose Custom to create your own:
What gets stored
[
{
"subjective": "they",
"objective": "them",
"possessive_adjective": "their",
"possessive_pronoun": "theirs",
"reflexive": "themselves"
},
{
"subjective": "she",
"objective": "her",
"possessive_adjective": "her",
"possessive_pronoun": "hers",
"reflexive": "herself"
}
]This is the real PronounSelector in badge mode. It’s styled only with theme tokens to
match these docs, and follows your light or dark setting.
Here’s all it takes in your app:
import { useState } from "react";import { PronounDisplay, PronounSelector, type PronounEntry } from "@openpronoun/react";
export function ProfilePronouns() { const [pronouns, setPronouns] = useState<PronounEntry[]>([]);
return ( <> <PronounSelector value={pronouns} onChange={setPronouns} /> <PronounDisplay pronouns={pronouns} /> </> );}- Looks right by default. Light and dark themes, accessible names, visible focus, and full keyboard support, including reordering sets.
- Restyles to match you. Override theme tokens, attach your own class names to each part, or swap the icons.
- Behaves to spec. Built on
@openpronoun/core, so custom sets, multiple sets, exclusions, and privacy are handled for you.
React components are available now in @openpronoun/react. Preact is in
development by a community contributor, and Vue, Svelte, Solid, and a
framework-free web component are open for anyone who’d like to build them. The
components guide covers everything they do and how to
restyle them.
Quick start
Section titled “Quick start”Working with the data directly, or in a framework without components yet?
Start with @openpronoun/core.
npm install @openpronoun/coreimport { parse, format } from "@openpronoun/core";
const pref = parse("they/them, she/her");// [{ subjective: "they", objective: "them", possessive_adjective: "their",// possessive_pronoun: "theirs", reflexive: "themselves" },// { subjective: "she", ... }]
format(pref!); // "They/Them, She/Her"format(pref!, { form: "expanded" }); // "They/Them/Theirs, She/Her/Hers"
parse("any pronouns"); // [{ type: "any" }]parse("no pronouns"); // [{ type: "none" }] (use their name)parse("fae/faer"); // known neopronoun set, all five formsThe usage guide covers validation and privacy filtering, with live examples for React, Vue, Svelte, Solid, Preact, Alpine, and vanilla JS.
Designed around the people being described
Section titled “Designed around the people being described”The spec bakes in a few commitments, so every implementation inherits them.
- No “Other” bucket. Anything that doesn’t match a known set is kept exactly as the person wrote it, never rejected or mangled.
- More than one set is normal.
she/they,he/they, and ranked or unranked combinations are part of the core model. - Neopronouns are real pronouns.
xe/xem,ze/zir,fae/faer, and others parse into full sets like any other. - Different answers mean different things. Any pronouns, no pronouns (use my name), ask me, and prefer not to say are distinct, and none of them is treated as a blank.
- “Not these” is respected. A set someone has excluded is never shown or used.
- Context and privacy travel with the data. “he/him (at work)” keeps its note, and a set shared only with some audiences stays out of public views.
- Asking is optional. The UX guidance treats pronoun fields as optional, explained, and under the person’s control.
What the standard covers
Section titled “What the standard covers”| Area | What it defines |
|---|---|
| Data model | PronounSet and PronounPreference: five English forms, multiple sets with optional ranking, any / none / ask / unspecified, custom entries, exclusions, context, privacy, and language. |
| Parsing | Turning real-world input into the model: separators, scrambled order, concatenated sets, special phrases, and freeform capture. |
| Display | Canonical short and expanded strings, multiple sets, context, and capitalization. |
| Conformance | Normative requirements in RFC 2119 language, a published JSON Schema, and shared test fixtures. |
| UX & accessibility | How to ask for pronouns respectfully and show them clearly. |
| Internationalization and security & privacy | Language tagging, localization, and handling pronoun data with care. |
The model lines up with emerging healthcare work such as HL7’s Gender Harmony pronoun value sets, while staying general-purpose. The overview and motivation cover the background.
Packages
Section titled “Packages”| Package | What it’s for |
|---|---|
@openpronoun/core | Reference TypeScript implementation: parse, format, validate, filterByAudience, and the pronoun lexicon. |
@openpronoun/react | Drop-in React components and hooks for collecting and displaying pronouns per the spec, themeable and restylable. |
@openpronoun/schema | Canonical JSON Schema for the data model. |
@openpronoun/zod | Zod schemas and inferred TypeScript types mirroring the JSON Schema. |
@openpronoun/conformance | Language-agnostic parsing and formatting fixtures any implementation can test against. |
Writing a port in another language? Validate against @openpronoun/schema and
run the @openpronoun/conformance fixtures, and you’re testing against the same
expectations as the reference library. More in
Reference implementations.
Show you conform
Section titled “Show you conform”Implementations that meet the conformance requirements may display the badge:
Help shape it
Section titled “Help shape it”OpenPronoun is a draft, and it gets better with more voices: engineers, designers, linguists, clinicians, and anyone who has been misnamed by software. If your pronouns didn’t parse the way they should, that’s a gap in the lexicon, not a problem with you. Contributing explains how to report it, suggest spec changes, or send code.