Indexer Contract

May 20, 2026 · View on GitHub

This document is the authoritative reference for all data the project service sends to the indexer service, which makes resources searchable via the query service.

Update this document in the same PR as any change to indexer message construction.


Resource Types


Project

Object type: project

NATS subject: lfx.index.project

Source struct: internal/domain/models/project.goProjectBase

Indexed on: create, update, delete of a project.

Data Schema

These fields are indexed and queryable via filters or cel_filter in the query service.

FieldTypeDescription
uidstringProject unique identifier
slugstringURL-safe project identifier
namestringProject name
descriptionstring (optional)Project description
publicboolWhether the project is publicly visible
is_foundationboolWhether the project is a foundation
parent_uidstring (optional)UID of the parent project (if nested)
stagestring (optional)Project lifecycle stage
categorystring (optional)Project category
legal_entity_typestring (optional)Legal entity type
legal_entity_namestring (optional)Legal entity name
legal_parent_uidstring (optional)UID of the legal parent entity
funding_model[]string (optional)Funding model types
entity_dissolution_datetimestamp (optional)Date the legal entity was dissolved
entity_formation_document_urlstring (optional)URL to the formation document
formation_datetimestamp (optional)Date the project was formed
autojoin_enabledboolWhether auto-join is enabled
charter_urlstring (optional)URL to the project charter
logo_urlstring (optional)URL to the project logo
website_urlstring (optional)Project website URL
repository_urlstring (optional)Project repository URL
created_attimestamp (optional)Creation time (RFC3339); null if not yet set
updated_attimestamp (optional)Last update time (RFC3339); null if not yet set

Tags

Tag FormatExamplePurpose
project_slug:{value}project_slug:kubernetesFind projects by slug

The project_slug tag is only emitted when slug is non-empty.

Access Control (IndexingConfig)

FieldValue
access_check_objectproject:{uid}
access_check_relationviewer
history_check_objectproject:{uid}
history_check_relationwriter

Search Behavior

FieldValue
fulltextname, slug, description (non-empty values only)
name_and_aliasesname, slug (non-empty values only)
sort_namename
publicset from project.public

Parent References

RefCondition
project:{parent_uid}Only when parent_uid is set

Project Settings

Object type: project_settings

NATS subject: lfx.index.project_settings

Source struct: internal/domain/models/project.goProjectSettings

Indexed on: create, update, delete of project settings. Settings share the same UID as their parent project.

Data Schema

FieldTypeDescription
uidstringProject UID (same as the parent project)
mission_statementstring (optional)Project mission statement
announcement_datetimestamp (optional)Project announcement date (RFC3339)
auditors[]objectUsers with audit access. Each object has avatar (string), email (string), name (string), username (string — holds the user ID / sub value), and optionally invite (object — see Invite Object) when the user has no LFID yet
writers[]objectUsers with write access. Each object has avatar (string), email (string), name (string), username (string — holds the user ID / sub value), and optionally invite (object — see Invite Object) when the user has no LFID yet
meeting_coordinators[]objectUsers with meeting coordinator access. Each object has avatar (string), email (string), name (string), username (string — holds the user ID / sub value), and optionally invite (object — see Invite Object) when the user has no LFID yet
created_attimestamp (optional)Creation time (RFC3339); null if not yet set
updated_attimestamp (optional)Last update time (RFC3339); null if not yet set

Invite Object

When a user in writers, auditors, or meeting_coordinators has no LFID yet (their username is empty), a pending invite is tracked in a nested invite object. The invite is cleared and username is populated when the user accepts the invite.

FieldTypeDescription
uidstringInvite UID returned by the invite service
emailstringEmail address the invite was delivered to
expires_attimestamp (optional)Invite expiry time (RFC3339); absent if the invite service did not return an expiry

Tags

Tags are sent as template placeholders inside IndexingConfig.Tags and resolved by the indexer using the document's own field values.

Tag TemplateResolved ExamplePurpose
{{ uid }}cbef1ed5-17dc-4a50-84e2-6cddd70f6878Direct lookup by UID
{{ mission_statement }}Advancing open source...Lookup by mission statement text

Tags are only emitted when the corresponding field is non-empty.

Access Control (IndexingConfig)

FieldValue
access_check_objectproject:{project_uid} (the parent project UID, not the settings UID)
access_check_relationauditor
history_check_objectproject:{project_uid} (the parent project UID, not the settings UID)
history_check_relationwriter

Search Behavior

FieldValue
fulltext(none)
name_and_aliases(none)
sort_name(none)
public(not set)

Parent References

RefCondition
project:{uid}Always set (when uid is non-empty)

Object type: project_link

NATS subject: lfx.index.project_link

Source struct: internal/domain/models/link.goProjectLink

Indexed on: create, delete of a project link.

Data Schema

FieldTypeDescription
uidstringLink unique identifier
project_uidstringUID of the owning project
folder_uidstring (optional)UID of the folder this link belongs to
namestringDisplay name of the link
urlstringTarget URL
descriptionstring (optional)Link description
created_by_usernamestring (optional)Username of the creator
created_attimestampCreation time (RFC3339)
updated_attimestampLast update time (RFC3339)

Tags

Tag FormatExamplePurpose
{uid}abc-123Direct lookup by UID
project_link_uid:{uid}project_link_uid:abc-123Find links by UID
project_uid:{project_uid}project_uid:proj-456Find all links for a project
folder_uid:{folder_uid}folder_uid:folder-789Find all links in a folder

folder_uid tag is only emitted when folder_uid is set and non-empty.

Access Control (IndexingConfig)

FieldValue
access_check_objectproject:{project_uid}
access_check_relationviewer
history_check_objectproject:{project_uid}
history_check_relationauditor

Search Behavior

FieldValue
sort_namename
fulltext(none)
public(not set)

Parent References

RefCondition
project:{project_uid}Always set

Project Folder

Object type: project_folder

NATS subject: lfx.index.project_folder

Source struct: internal/domain/models/folder.goProjectFolder

Indexed on: create, delete of a project folder.

Data Schema

FieldTypeDescription
uidstringFolder unique identifier
project_uidstringUID of the owning project
namestringDisplay name of the folder (unique per project)
created_by_usernamestring (optional)Username of the creator
created_attimestampCreation time (RFC3339)
updated_attimestampLast update time (RFC3339)

Tags

Tag FormatExamplePurpose
{uid}folder-123Direct lookup by UID
project_folder_uid:{uid}project_folder_uid:folder-123Find folders by UID
project_uid:{project_uid}project_uid:proj-456Find all folders for a project

Access Control (IndexingConfig)

FieldValue
access_check_objectproject:{project_uid}
access_check_relationviewer
history_check_objectproject:{project_uid}
history_check_relationauditor

Search Behavior

FieldValue
sort_namename
fulltext(none)
public(not set)

Parent References

RefCondition
project:{project_uid}Always set

Project Document

Object type: project_document

NATS subject: lfx.index.project_document

Source struct: internal/domain/models/document.goProjectDocument

Indexed on: upload (create), delete of a project document.

Data Schema

FieldTypeDescription
uidstringDocument unique identifier
project_uidstringUID of the owning project
folder_uidstring (optional)UID of the folder this document belongs to
namestringDisplay name of the document (unique per project)
descriptionstring (optional)Document description
file_namestringOriginal file name from the upload
file_sizeint64File size in bytes
content_typestringMIME type of the file
uploaded_by_usernamestring (optional)Username of the uploader
created_attimestampCreation time (RFC3339)
updated_attimestampLast update time (RFC3339)

Tags

Tag FormatExamplePurpose
{uid}doc-123Direct lookup by UID
project_document_uid:{uid}project_document_uid:doc-123Find documents by UID
project_uid:{project_uid}project_uid:proj-456Find all documents for a project
folder_uid:{folder_uid}folder_uid:folder-789Find all documents in a folder
content_type:{content_type}content_type:application/pdfFilter documents by MIME type
uploaded_by:{username}uploaded_by:aliceFilter documents by uploader

folder_uid tag is only emitted when folder_uid is set and non-empty. content_type and uploaded_by tags are only emitted when their respective fields are non-empty.

Access Control (IndexingConfig)

FieldValue
access_check_objectproject:{project_uid}
access_check_relationviewer
history_check_objectproject:{project_uid}
history_check_relationauditor

Search Behavior

FieldValue
sort_namename
fulltext(none)
public(not set)

Parent References

RefCondition
project:{project_uid}Always set