Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
70ddf74
chore: add textrefs/.github as submodule at github-profile/
maehr Jun 7, 2026
5f63ebe
docs: revise get-started prose and document staging deploy flow
maehr Jun 7, 2026
30a12a0
fix(ci): repair URL extraction in link-check workflow
maehr Jun 7, 2026
6dd6e0d
chore(deps): bump astro 6.4.4 and migrate to zod 4
maehr Jun 7, 2026
74bce51
docs(association): sync statutes board size and review tracks with do…
maehr Jun 9, 2026
6b0f0e8
docs(spec): tighten dereferenceable-location guidance to should (#7)
maehr Jun 9, 2026
da48c31
docs(spec): self-contained §13 example with @context (#8)
maehr Jun 9, 2026
56eb064
chore(data): bump submodule with second resolvers on single-resolver …
maehr Jun 9, 2026
e9b09d4
feat(spec)!: replace target_kind with dcterms:conformsTo (#6)
maehr Jun 9, 2026
e54b883
chore(data): bump submodule to registry main (36cae56)
maehr Jun 9, 2026
666dc78
fix(404): mark docs/404.mdx as draft to drop catch-all route conflict
maehr Jun 9, 2026
d3ae0d7
fix(ci): repair link-check workflow + bump deps to zod 4 (#5)
maehr Jun 9, 2026
24b2e36
docs: add ORCID for Luz Christopher Seiberth (#19)
maehr Jun 26, 2026
9c9f2b5
feat(spec)!: seed CanonicalReference UUIDs from the semantic identity…
maehr Jul 5, 2026
82bc899
feat(spec): draft lifecycle with retractable pre-promotion identity (…
maehr Jul 5, 2026
1952650
chore(data): bump submodule to registry main (40af385)
maehr Jul 5, 2026
a765770
feat(spec): require explicit canonical ASCII digit and case forms in …
maehr Jul 5, 2026
37d1481
fix(spec): erratum batch and spec-consistency fixes (#10, #11, #12, #…
maehr Jul 5, 2026
29c15e4
feat(site): flag draft records and exclude them from search indexing …
maehr Jul 5, 2026
59a1c54
chore(deps): astro 6.4.8, dompurify 3.4.11, actions/checkout v7
maehr Jul 5, 2026
3455674
chore(release): v0.1.0 — version bump, changelog, roadmap (#28)
maehr Jul 5, 2026
dd1038d
feat(deps)!: upgrade to Astro 7 / Starlight 0.41, all dependencies to…
maehr Jul 6, 2026
238490e
feat(site)!: minimal static templates for reference pages (#30)
maehr Jul 6, 2026
c4b623a
chore(release): regenerate changelog with Astro 7 and slim ref pages
maehr Jul 6, 2026
3dcff6f
chore(data): bump submodule to registry main (c0a3275, ORCID docs)
maehr Jul 6, 2026
fbe8196
chore(deps): Astro 7.1 + dependency refresh (#39) (#43)
maehr Jul 26, 2026
e68c8f7
fix(spec): resolve normative contradictions before the v0.1.0 tag (#44)
maehr Jul 26, 2026
e0b6ef1
fix(site): add explicit whitespace between inline elements (#53) (#54)
maehr Jul 31, 2026
03cee88
fix(site): list works instead of references on CitationSystem pages (…
maehr Jul 31, 2026
b365cfc
feat(standard)!: collapse record lifecycle to draft → active (ADR-000…
maehr Aug 4, 2026
5c2a6f3
feat(standard)!: preferred citation system and qualified /cite/ alias…
maehr Aug 12, 2026
7a94c0e
feat(standard)!: replace SKOS mapping relations with alternateOf and …
maehr Aug 12, 2026
0e9c824
chore(data): bump registry pin to the ADR-0006 reclassification
maehr Aug 12, 2026
aba818d
feat(compile): map locator variables into a provider's own vocabulary…
maehr Aug 12, 2026
a958928
chore(data): bump registry pin to the resolver review
maehr Aug 12, 2026
d2390c9
chore(deps): refresh all dependencies before v0.1.0 (#73)
maehr Aug 12, 2026
71dd92a
fix: release hardening before v0.1.0 (#46, #47, #49, #50) (#75)
maehr Aug 12, 2026
0df2b27
chore(release): v0.1.0 metadata — CITATION.cff, changelog, checklist …
maehr Aug 12, 2026
fa78eb9
ci: bump actions/setup-node to v7 (#32) (#77)
maehr Aug 12, 2026
37faf37
ci(deps): point Dependabot version updates at staging (#78)
maehr Aug 12, 2026
3f6670e
docs: resolve the consistency audit before v0.1.0 (#79) (#80)
maehr Aug 13, 2026
f5a037f
fix(compile): stop projecting retired mapping assertions onto Work (#…
maehr Aug 24, 2026
a4a3b85
feat(api): add works and systems collection endpoints (#83) (#87)
maehr Aug 24, 2026
8bcfdca
feat(api): resolve a reference by work and locator without its UUID (…
maehr Aug 24, 2026
cd9aae3
feat(standard): name works by abbreviation and translated title (#85)…
maehr Aug 25, 2026
8bc25ce
feat(find): resolve a familiar citation to a canonical reference (#90)
maehr Aug 25, 2026
6c31d8f
chore(data): bump the registry pointer to 455bb27f (#95)
maehr Aug 25, 2026
a5764fb
chore(data): bump the registry pointer to 7d109195 (#96)
maehr Aug 26, 2026
1c827f1
fix: pre-release cleanup — link check, deprecated tombstones, orphan …
maehr Aug 27, 2026
5bdb5e0
docs(decisions): refresh the ADR follow-up checklists before the v0.1…
maehr Aug 27, 2026
5914e26
fix(api): publish the contract and correct the 404 declaration (#113,…
maehr Aug 31, 2026
cf3a416
feat(site): add the /dump/ index and robots.txt (#116, #114) (#119)
maehr Aug 31, 2026
0607ec6
feat(standard): publish the generated JSON Schema at /schemas/v1/ (#1…
maehr Aug 31, 2026
56cab1b
fix: address PR #4 review findings before v0.1.0 (#120) (#121)
maehr Aug 31, 2026
c41a230
chore(deps): update dependencies before v0.1.0 (#102)
maehr Sep 2, 2026
c9605b5
fix(site): suppress the draft banner on the 404 page (#111) (#126)
maehr Sep 2, 2026
819fcb9
docs(association): finalise the founding documents and limit Board me…
maehr Sep 2, 2026
d9239bd
fix(site): let a whole-query label beat a split match in /find/ (#138)
maehr Sep 2, 2026
990fc4f
docs(standard): state the tombstone projection rule correctly (#140)
maehr Sep 2, 2026
257f17e
fix(site): keep redirects and untranslated fallbacks out of the sitem…
maehr Sep 2, 2026
4d1c708
perf(site): compile the registry once per build, not twice (#139)
maehr Sep 2, 2026
2d71119
feat(standard): publish the TextRefs ontology (#127)
maehr Sep 2, 2026
c360c02
fix(standard): publish license_url as dcterms:rights, not dcterms:lic…
maehr Sep 2, 2026
41f2d31
chore(agents): track CLAUDE.md and document the GitHub workflow (#141)
maehr Sep 2, 2026
bdd1d60
docs(blog): announce the founding of the association (#142)
maehr Sep 3, 2026
ba908c7
fix(site): render the resolver-target licence and rights correctly (#…
maehr Sep 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@
path = data
url = https://github.com/textrefs/registry.git
branch = main
[submodule "github-profile"]
path = github-profile
url = https://github.com/textrefs/.github.git
branch = main
18 changes: 15 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,13 +91,25 @@ The commit-msg hook (commitlint) rejects non-conforming messages, so a plain `gi

The changelog is generated from this history via `npm run changelog` (git-cliff).

## Branching model

The production site (`textrefs.org`) is built and deployed from `main`. To keep `main`'s history low-noise while still allowing many small content edits, day-to-day docs/blog/copy work batches on a long-lived `staging` branch and is squash-merged into `main` to publish.
Comment thread
maehr marked this conversation as resolved.

- `main` — production source. Pushes here auto-deploy via `.github/workflows/pages.yml`. Release tags (`vX.Y.Z`, `vYYYY.MM.N`) are cut from `main`.
Comment thread
maehr marked this conversation as resolved.
Outdated
- `staging` — long-lived batching branch for docs, blog posts, copy, registry-pointer bumps, and other content edits. Does **not** auto-deploy. Edits accumulate here as many small commits.
- To publish: open a PR `staging → main` and squash-merge. The squash-commit lands on `main` as one conventional commit (so `git-cliff` stays clean) and triggers the production deploy.
- Manual preview / ad-hoc deploy: from the GitHub Actions UI, run the **Pages** workflow via `workflow_dispatch` and pick `staging` (or any branch) as the ref. This deploys that ref to production until the next push to `main`. There is no separate preview URL — GitHub Pages serves a single site per repo, so manual staging deploys temporarily replace production. Use sparingly.
- Infrastructure changes (CI, release workflow, build tooling, deploy config) target `main` directly so they are not gated on the next staging-to-main snapshot.

Squash merging is the only enabled merge style on the canonical repo, so `staging`'s noisy history is collapsed into a single conventional-commit message on `main` and `git-cliff` still produces a clean `CHANGELOG.md`.

## Submitting a pull request

1. Branch from `main`.
1. Branch from `staging` for content/docs/blog; branch from `main` for infra, CI, or release-workflow changes.
2. Keep PRs focused — one logical change per PR.
3. Link related issues in the PR description.
4. Include local verification results: `npm run verify:fast` for routine work, or `npm run verify` plus `npm run validate:data` for registry-data, standard, release, production-build, or CI changes.
5. Open the PR against `main`. GitHub requests `@textrefs/maintainers` by default via `.github/CODEOWNERS`; maintainers may add technical or expert reviewers based on the track.
5. Open the PR against the branch you started from (`staging` or `main`). GitHub requests `@textrefs/maintainers` by default via `.github/CODEOWNERS`; maintainers may add technical or expert reviewers based on the track.

## Project layout

Expand All @@ -112,7 +124,7 @@ Two release trains. The Zenodo–GitHub webhook MUST be enabled once per reposit
1. Bump `version` in `package.json` to match the new tag.
2. `npm run changelog` to regenerate `CHANGELOG.md`.
3. Update spec page frontmatter `maturity:` if the release transitions the ladder.
4. Commit, open PR, merge to `main`.
4. Open a PR `staging → main` and squash-merge it. The squash message should be a conventional commit (`docs(release): vX.Y.Z` or similar) so the changelog stays clean.
5. Tag `vX.Y.Z[-pre]` on `main`; push the tag.
6. Verify the GitHub Release fires and Zenodo mints the version DOI.
7. Fill the concept DOI into `CITATION.cff` `identifiers:` and the badge in `README.md` (once, after the first release).
Expand Down
1 change: 1 addition & 0 deletions github-profile
Submodule github-profile added at 5fbd18
22 changes: 10 additions & 12 deletions src/content/docs/get-started/index.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,25 @@
---
title: Get started
description: Why TextRefs exists, who it's for, and how it fits with existing identifier systems.
description: Why a passage needs one persistent identity, and how TextRefs supplies it without replacing existing editions or identifiers.
sidebar:
order: 1
---

## The gap
A passage has one identity. The editions that carry it are many.

Citations like "Plato, _Republic_ 514a" or "Aristotle, _Eth. Nic._ 1094a1" are foundational to scholarship in classics, theology, law, philosophy, and adjacent disciplines. Every serious edition, commentary, and database uses them. Yet none of them has a native, persistent, machine-readable identifier you can paste into a tool, link from a paper, or feed to an indexing pipeline. They live as plain text inside footnotes and prose, dependent on the reader knowing the citation convention.
"Plato, _Republic_ 514a" is the same passage in Burnet's Oxford text, the Slings OCT that replaced it, Shorey's Loeb, and every translation that keeps the Stephanus numbers. Pagination, apparatus and language differ. The reference does not. It is the most durable thing in the scholarly record: central to classics, theology, law and philosophy, used by every edition and commentary, and understood across centuries.

That mismatch — central in scholarship, invisible to software — is what TextRefs addresses.
To software it is invisible. The number lives as plain text in a footnote, dependent on a reader who knows the convention. No tool can resolve it, no link can carry it, no pipeline can index it. A reference that survived four hundred years on paper breaks in a decade online, because the edition behind it sits in a repository the citation cannot reach.

## What TextRefs is
TextRefs closes that gap. Every canonical reference is minted as a persistent identity of its own, a single HTTP URI for the passage a scholar means. Editions, translations, corpora and databases attach to it as curated mappings: a Stephanus locator, a CTS URN, a Wikidata QID, a DOI for the Loeb, the reading URL of the archive that holds the text. The citation becomes the doorway, and everything that carries the passage is reachable through it.

TextRefs is an open registry. For each canonical reference we mint a persistent HTTP URI, attach curated mappings to relevant external identifiers (CTS URNs, Wikidata QIDs, DOIs, library and edition URLs), record resolver targets where readers can inspect the passage, document provenance and uncertainty, and publish everything as JSON-LD under non-profit governance. The registry is read-only and changes happen via reviewed pull requests; data is released under CC0 so it can flow into any tool that needs it.
This is the interoperability scholarship has lacked. Every scholar already keeps the map privately. Bekker for the _Metaphysics_, Corcilius for the _De anima_, Rashed for _On Generation and Corruption_. Exact, hard-won, and gone the moment the article closes. TextRefs makes it shared and machine-readable. Oxford and the Loeb, Leipzig and Perseus, Wikidata and VIAF keep their own identifiers, their own homes, their own richer work, joined through the one reference they share. No central host. No redundancy. Authority stays with the institutions that earned it, and the archive that digitised an edition is now one mapping away from every citation of the passage it holds.

The same model covers a Stephanus passage in Plato, a Bekker line in Aristotle, a chapter-and-verse in the Vulgate, an article in the _Summa_, and a fragment in the _Digesta_ — every traditional reference system is a `CitationSystem` with its own locator rules.
The division is deliberate. TextRefs holds the reference layer only and nothing else. It hosts no text, replaces no edition, claims no apparatus. The same model covers every field that cites by structure: a Stephanus passage in Plato, a Bekker line in Aristotle, an article in the _Summa_, a chapter and verse in the Vulgate, a fragment in the _Digesta_. Each citation system carries its own locator rules. The registry stays small, persistent and legally reusable, released under CC0 so the data flows into any tool that needs it, curated by scholars through reviewed contributions, governed as non-profit infrastructure, not owned by a press.

## Use TextRefs with existing systems
Four record types carry the model. `Work`, `CitationSystem`, `CanonicalReference`, and `MappingAssertion` for equivalence, published as JSON-LD against SKOS, Dublin Core and schema.org. Existing systems are layered, never displaced. A DOI still names the edition. A CTS URN still names the passage in Perseus. TextRefs holds the canonical reference they share, and makes it resolve.

Use TextRefs for the stable citation identity: the passage, article, line, section, or fragment a scholar means when they write a traditional reference. Keep edition text, commentary, apparatus, translations, and platform-specific records in the systems that already curate them.

This division is deliberate. TextRefs stays small, persistent, and legally reusable; libraries, editions, catalogues, and reading platforms keep doing the richer work they are built for. The registry connects them through curated mappings instead of trying to replace them. See the [related systems comparison](/get-started/related-systems/) for the full picture.
[Browse the registry](/reg/). [Read the standard](/standard/). [Bring your corpus in](/get-started/authoring/).

## Keep reading

Expand All @@ -30,6 +28,7 @@ This division is deliberate. TextRefs stays small, persistent, and legally reusa
- [Mappings and resolver targets](/get-started/mappings-and-resolver-targets/) — how to model external identifiers, reading URLs, and canonical-citation candidates.
- [Authoring registry data](/get-started/authoring/) — the contributor YAML format and the `npm run build:data` pipeline.
- [Related identifier systems](/get-started/related-systems/) — how TextRefs relates to DOI, ARK, CTS, DTS, Wikidata, VIAF, and friends.
- [URL layout](/get-started/url-layout/) — how `/id/`, `/reg/`, `/cite/`, and `/api/` fit together.
- [The standard](/standard/) — the normative specification text (`v0.1.0-draft`).
- [The association](/association/) — the non-profit behind TextRefs, its statutes, and the open board search.

Expand All @@ -39,4 +38,3 @@ This division is deliberate. TextRefs stays small, persistent, and legally reusa
- [`/id/work/plato.republic/`](/id/work/plato.republic/) — Plato's _Republic_ with Stephanus pagination.
- [`/cite/plato.republic/514a`](/cite/plato.republic/514a) — a short alias that redirects to the canonical reference URL.
- [`/reg/`](/reg/) — the registry browser.
- [URL layout](/get-started/url-layout/) — how `/id/`, `/reg/`, `/cite/`, and `/api/` fit together.
Loading