Open-source project
witch-house/pronoun.is avatar
witch-house/pronoun.is

pronoun.is: a URL that shows how a pronoun set is used

Show people how to use pronouns!

925 stars99 forksClojureAGPL-3.0

At a glance

What is it?
pronoun.is is a small Clojure web application that renders example sentences for whatever pronouns a person uses, addressed entirely through the URL path. The whole content is a tab delimited file, and the project is AGPL licensed, which matters if you plan to self host it in a product.
Who is it for?
Adopt pronoun.is when you want a public page that shows example sentences for the pronoun set someone uses, and host it with the container or the uberjar, both of which need nothing beyond a Java runtime and the resources directory. Do not adopt it as a component inside a larger product without reading the AGPL-3.0 terms, since the licence reaches network use of a modified version.
Can I use it commercially?
Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
Is it still maintained?
Yes. The repository last received commits 161 days ago.
What is it written in?
Mainly Clojure, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The URL is the query

There is no search box and no account. You put the pronouns into the path and the site returns example sentences using them. A full set works, for example https://pronoun.is/ze/zir/zir/zirs/zirself, which is accurate but unwieldy, so the site also accepts only the first form or two, such as https://pronoun.is/she/her or https://pronoun.is/they, and fills in the rest. Alternatives can be expressed too, with ?or= or /:or, so https://pronoun.is/they/:or/he and https://pronoun.is/she?or=they both work. The audience is two groups at once: a person who wants a link to put in a bio or a forum signature, and the organisation that hosts it, which is why the self hosting instructions are as prominent as the user facing ones.

The database is one tab delimited file

The content of the site is a single tab delimited file, resources/pronouns.tab, with a header row and five fields per pronoun set:

code
subject|object|possessive-determiner|possessive-pronoun|reflexive
-------|------|---------------------|------------------|---------
they   | them | their               | theirs           | themselves

Adding a set means adding a line, and the ordering rules are part of the data. The top six pronouns are displayed on the front page and the README asks that they not be edited without discussion, because they were hand curated by usage frequency. Below that, the rest are sorted alphabetically by subject and then roughly by frequency within a subject, and a new set that shares an object pronoun with existing sets should be inserted immediately below those. The one practical trap is the tabs themselves. A text editor configured not to type tabs will silently break the file, and the README shows the workarounds, Ctrl q then tab in Emacs and Ctrl v then tab in Vi.

Four namespaces, one of them overdue for a split

The server is small enough that the code layout is the architecture. The top-level logic for running the server lives in pronouns.web, in src/pronouns/web.clj. The page rendering markup is in pronouns.pages, which uses hiccup to render HTML from Clojure data structures, so the templates are code rather than string templates. pronouns.config is currently used only for loading the pronoun database. The last namespace, pronouns.util, is the one the author is unhappy with: it contains both actual utility functions used elsewhere and what you would call controllers if you came from MVC, the code that computes what the pages need in order to render themselves. The README says plainly that util should probably be broken up into at least two namespaces and that the placement of things in it should be more deliberate. Knowing that before you read the code saves some time.

Three ways to run it yourself

For system administrators and self hosters the README lists several routes. The recommended one is a container build with podman or docker:

bash
$ podman build -t witch-house/pronouns .

Second, the repository has a Procfile for use with Heroku. Third, you can build an uberjar, set the PORT environment variable and run it with Java:

bash
$ lein uberjar
$ java -jar target/pronouns-standalone.jar

Which route you pick comes down to how much you want to customise. Heroku is the least work for a public instance. The uberjar is the simplest thing to run on a machine you control, because it is a single artefact and a single environment variable. The container route is the one the project recommends, and it is also the route the Dockerfile supports, with one caveat that is worth knowing before you build it.

The container image expects a jar you built yourself

The Dockerfile does not compile the application. It starts from eclipse-temurin:25-jre-alpine, copies a prebuilt standalone jar and the resources directory into place, sets the port and runs the jar:

dockerfile
FROM docker.io/library/eclipse-temurin:25-jre-alpine

COPY target/pronouns-standalone.jar /pronoun.is/app.jar

COPY resources/ /resources

ENV PORT 3000

EXPOSE 3000

CMD ["java", "-jar", "/pronoun.is/app.jar" ]

So the build step that produces target/pronouns-standalone.jar has to happen before the container build, otherwise the copy has nothing to work with. The repository has a build.sh script at the top level, which is the natural place to look for how that jar is produced. The runtime image itself is deliberately thin, a JRE on Alpine with the jar and the resources, and nothing else.

The dev loop reloads code but not the pronoun file

Development needs leiningen, and the app is launched locally with a single command:

bash
$ PORT=3000 lein run

That starts the server and opens your default browser on the index page. The server reloads files as you edit them, with one exception the README calls unfortunate: pronouns.tab is loaded as a resource, so changing the pronoun database requires restarting the app. If you are iterating on new pronoun sets, which is the kind of contribution this project most wants, that restart is a small tax worth knowing about. The test suite has a similar split, with the full run and the unit only run as separate invocations:

bash
$ lein test :all
$ lein preflight

lein test :unit skips the end to end tests, which the README says add only about four seconds but can be quite informative. lein preflight runs everything the CI pipeline runs, and the README asks contributors to run it before opening a pull request, along with tests for any new logic.

AGPL, no releases, and a recent enough push

The licence is the part to read carefully before you deploy this. The licence field on the repository says AGPL-3.0, and the COPYING file sits at the top level. For a public instance that is unobtrusive, but AGPL reaches further than most permissive licences when you modify the software and offer it over a network, which is exactly what a self hosted pronoun site is. The repository has no GitHub releases, so there is no versioned artefact to pin to, and deployment comes from the main branch. On maintenance, the last push to the main branch was on 2026-05-15, so the code is being touched within the last few months. The project's stated philosophy is narrow and worth repeating: it aims foremost and exclusively to be a useful resource for people to communicate the personal pronoun they use for themselves.

Editorial conclusion

Adopt pronoun.is when you want a public page that shows example sentences for the pronoun set someone uses, and host it with the container or the uberjar, both of which need nothing beyond a Java runtime and the resources directory. Do not adopt it as a component inside a larger product without reading the AGPL-3.0 terms, since the licence reaches network use of a modified version. Verify first that the pronouns you need are already in resources/pronouns.tab, because auto filling from one or two forms only works for entries in that file, and that your editor is inserting real tab characters, since a file of spaces will not parse.

Frequently asked questions

How do I use pronoun.is for a specific pronoun set?

Put the pronouns in the URL path. A full set such as https://pronoun.is/ze/zir/zir/zirs/zirself works, and you can give only the first one or two, for example https://pronoun.is/she/her or https://pronoun.is/they, and the rest are filled in from the database.

How do I show two alternative pronoun sets on pronoun.is?

Use the ?or= query parameter or the /:or path style. Both https://pronoun.is/they/:or/he and https://pronoun.is/she?or=they are given as examples of the two ways to do it.

How do I add a pronoun set to the pronoun.is database?

Edit resources/pronouns.tab, a tab delimited file with the fields subject, object, possessive-determiner, possessive-pronoun and reflexive, and make sure your editor inserts real tab characters. Insert a set that shares an object pronoun immediately below the existing sets with that object, and leave the hand curated top six alone.

How do I self host pronoun.is?

The recommended route is building the container with podman or docker, for example podman build -t witch-house/pronouns .. You can also deploy with the included Procfile on Heroku, or create an uberjar with lein uberjar and run java -jar target/pronouns-standalone.jar with the PORT environment variable set.

What licence is pronoun.is released under?

The licence field on the repository says AGPL-3.0, with the COPYING file at the top level. The repository has no GitHub releases, and the last push to the main branch was on 2026-05-15.

Official sources

  1. Issues
  2. License: AGPL-3.0
  3. Project website
  4. README
  5. witch-house/pronoun.is on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/witch-house-pronoun-is.svg)](https://hysenlabs.com/projects/witch-house-pronoun-is)

Was this useful?