Contacts integration
contactsvCard contacts linked to Open Register objects with a role per link (applicant, handler, advisor, ...). Reverse lookup from any contact answers 'which objects is this person on?'.
Link people to an object with a role per link. The same person can be an applicant on one case and an advisor on another. The link lives in openregister_contact_links (the role and cached display fields) plus X-OPENREGISTER-* properties on the vCard (so NC Contacts knows the person is linked too).
Screenshot
The integration registers in OpenRegister's in-page registry and renders as one of the tabs on the standalone integrations view. The tab is highlighted active here so you can see exactly which surface this leaf controls.

Captured by tests/e2e/leaf-screenshots.spec.ts against the seeded integration-verification register on the dev container. Empty state (Nothing linked yet) is expected on a freshly seeded object — link an upstream entity from the tab's + Add affordance to populate it.
What it does
- Lists vCard contacts linked to each Open Register object on the Contacts sidebar tab, grouped by role.
- Lets users link an existing contact (picker) or create a new contact from a name + email + phone (inline form).
- Lets users update a link's role without re-linking. The role lives on the link, not the contact.
- Lets users unlink a contact. The vCard stays in NC Contacts; the link row and
X-OPENREGISTER-*properties are removed. - Resolves a
referenceType: 'contacts'schema property to a single-entity chip with display name and role. - Reverse lookup: "all objects where person X has role Y" via
GET /api/contacts/{uid}/objects.
Setup
1. Install NC Contacts
Install the contacts Nextcloud app. Without it, the Contacts tab stays hidden and the OCS capabilities mark the leaf enabled: false.
2. Make sure each user has an addressbook
CardDAV creates a personal addressbook automatically on first use. If a user has none, the Contacts tab shows an empty state with a "Create an addressbook" link.