Properties
Community historical photo archive of Iowa and the US Midwest, run on KronoFoto by the University of Northern Iowa.
All properties (5)
| Key | Value | Source | Owner | Updated (UTC) |
|---|---|---|---|---|
| contentType |
null
|
import
Provenance{
"sourceRef": "folio.content_type"
}
|
legacy.folio | Not recorded |
| description | Community historical photo archive of Iowa and the US Midwest, run on KronoFoto by the University of Northern Iowa. | meta | dataset:mus | |
| label | Fortepan US | meta | dataset:mus | |
| rowCount |
27713
|
build | folio.build | |
| schemaVersion |
2
|
build | folio.format |
वस्तुएँ
obj
Link Types
| Forward | Reverse | Links |
|---|---|---|
| No link types loaded. | ||
Observed Schema
| Name | Core | Type | Rows |
|---|---|---|---|
| dto_negative | obj | negative | 3 |
| dto_newspaper | obj | newspaper | 12 |
| dto_object | obj | object | 4 |
| dto_per_person | per | person | 530 |
| dto_photograph | obj | photograph | 26,213 |
| dto_pla_place | pla | place | 820 |
| dto_postcard_front | obj | postcard_front | 130 |
| dto_unknown | obj | unknown | 1 |
Archive Docs
Folio Metadata
json
{
"folio": {
"code": "mus/fpus",
"dataset_key": "mus/fpus",
"label": "Fortepan US",
"row_count": 27713,
"description": "Community historical photo archive of Iowa and the US Midwest, run on KronoFoto by the University of Northern Iowa."
},
"cores": [
{
"code": "obj",
"label": null,
"row_count": 26363
},
{
"code": "per",
"label": null,
"row_count": 530
},
{
"code": "pla",
"label": null,
"row_count": 820
}
],
"dtoTables": [
{
"id": "mus/fpus:dto_negative",
"name": "dto_negative",
"kind": "dto",
"core_code": "obj",
"dto_type": "negative",
"label": "Negative",
"description": null,
"row_count": 3
},
{
"id": "mus/fpus:dto_newspaper",
"name": "dto_newspaper",
"kind": "dto",
"core_code": "obj",
"dto_type": "newspaper",
"label": "Newspaper",
"description": null,
"row_count": 12
},
{
"id": "mus/fpus:dto_object",
"name": "dto_object",
"kind": "dto",
"core_code": "obj",
"dto_type": "object",
"label": "Artifact",
"description": "Three-dimensional physical objects and artifacts that do not fit a more specific type: tools, vessels, garments, specimens, etc.",
"row_count": 4
},
{
"id": "mus/fpus:dto_per_person",
"name": "dto_per_person",
"kind": "dto",
"core_code": "per",
"dto_type": "person",
"label": "Person",
"description": "People associated with collection records: creators, contributors, subjects, interviewees, performers, and other named agents.",
"row_count": 530
},
{
"id": "mus/fpus:dto_photograph",
"name": "dto_photograph",
"kind": "dto",
"core_code": "obj",
"dto_type": "photograph",
"label": "Photograph",
"description": null,
"row_count": 26213
},
{
"id": "mus/fpus:dto_pla_place",
"name": "dto_pla_place",
"kind": "dto",
"core_code": "pla",
"dto_type": "place",
"label": "Place",
"description": "A described PLACE \u2014 a park, site, or similar place-core row (Core::PLACE, 'pla'), as opposed to\na described OBJECT/document/artifact. First real user: App\\Singleton\\Nps (musdig#26), a National\nPark unit \u2014 these fields are place-generic, not NPS-specific, so any future place-oriented\nprovider (a museum campus, a historic site, a trail) gets a real home for them instead of\nfalling into $unmapped/extras.\n/",
"row_count": 820
},
{
"id": "mus/fpus:dto_postcard_front",
"name": "dto_postcard_front",
"kind": "dto",
"core_code": "obj",
"dto_type": "postcard_front",
"label": "Postcard front",
"description": "Concrete BaseItemDto for subjects whose content type is unknown or mixed.\nUse when no domain-specific DTO subclass applies.\n/",
"row_count": 130
},
{
"id": "mus/fpus:dto_unknown",
"name": "dto_unknown",
"kind": "dto",
"core_code": "obj",
"dto_type": "unknown",
"label": "Unknown",
"description": "Concrete BaseItemDto for subjects whose content type is unknown or mixed.\nUse when no domain-specific DTO subclass applies.\n/",
"row_count": 1
}
],
"views": [
"dto_negative",
"dto_newspaper",
"dto_object",
"dto_per_person",
"dto_photograph",
"dto_pla_place",
"dto_postcard_front",
"dto_unknown"
],
"generatedAt": "2026-10-10T18:46:26+00:00",
"metadata": {
"archivePreparedAt": "2026-10-10T18:46:24+00:00",
"schema": {
"tables": 11,
"properties": 170
},
"views": {
"views": 8,
"linkViews": 0
}
}
}
Overview
md
# Folio mus/fpus Fortepan US - Dataset key: `mus/fpus` - Rows: 27,713 - Cores: 3 - Observed DTO tables: 8 ## Cores | Core | Label | Rows | | --- | --- | ---: | | `obj` | obj | 26,363 | | `per` | per | 530 | | `pla` | pla | 820 |
Observed Schema
md
# Observed Schema
## `dto_negative`
- Core: `obj`
- DTO type: `negative`
- Rows: 3
| Field | Type | Flags | Description |
| --- | --- | --- | --- |
| `id` | `?string` | | |
| `sourceUrl` | `?string` | | The citable/reader-facing page for this record (e.g. a museum's public object page). |
| `contentType` | `?string` | | |
| `aggregator` | `?string` | | |
| `stage` | `?string` | filterable, facet | Pipeline processing stage (raw / normalized / enriched). A facet so you can filter to enriched items. Grouped under Admin -- plumbing a visitor neither knows nor wants, and the sidebar starts an Admin block collapsed. / |
| `credit` | `?string` | | Credit line / acknowledgment, e.g. "Gift of the Brooklyn Museum of Art, Paul F. Walter Collection". |
| `sourceCaption` | `?string` | | The source's own caption text, VERBATIM — never an AI summary. Some image sources (e.g. Fortepan) ship only a short caption; keep it on its own field so the UI shows it as the real "Source caption" instead of mislabelling the AI-filled `description` / `denseSummary`. / |
| `year` | `?int` | filterable, facet, sortable | Coverage/production year. |
| `citationUrl` | `?string` | | ItemField::CITATION_URL — deep link back to the source record (e.g. the NARA catalog page). Rendered as the "Original" link on the folio item page. |
| `rightsUri` | `?string` | filterable, facet | dcterms:license URI (rightsstatements.org). Also a facet: some sources (e.g. Cleveland) carry the rights value as a short licence code here rather than a URI (CC0 / Copyrighted), and that splits a collection cleanly. NOTE: if a subclass DTO redeclares this property, repeat #[Field] — PHP attributes are not inherited on a redeclared property. / |
| `subjects` | `?array` | filterable, facet | dcterms:subject — keyword/topical subjects (incl. AI keywords). A sidebar facet. #[Translatable], same as $tags below: each element is extracted/translated independently, so a locale-variant folio build (folio:build --locale=en) folds in translated subject text automatically. Missing before 2026-08-04 -- subjects stayed in the source language on every translated build even after title/description were correctly translated, since applyTranslations() only touches #[Translatable] fields. / |
| `tags` | `?array` | filterable, facet | Raw curator/source-supplied tags -- controlled vocabulary, not free text. |
| `country` | `?string` | filterable, facet | |
| `state` | `?string` | filterable, facet | Primary/display state — see ItemField::STATE. Always set when a record has ≥1 state (the "City, State, Country" line in PhotoGrid.html.twig reads this one, not $states). |
| `city` | `?string` | filterable, facet | |
| `latitude` | `?float` | | |
| `longitude` | `?float` | | |
| `iiifBase` | `?string` | | IIIF Image API base URL — use for AI vision and imgProxy resizing |
| `thumbnailUrl` | `?string` | | |
| `largeImageUrl` | `?string` | | |
| `displayImageUrl` | `?string` | | See ItemField::DISPLAY_IMAGE_URL — source for the small imgproxy presets when set. |
| `pageCount` | `?int` | sortable | Number of pages in the document. |
| `source` | `string` | | Source of this data: import \| ai \| ocr \| human |
| `donor` | `?string` | filterable, facet | Who contributed the photo to the archive (e.g. the Fortepan donor). A sidebar facet. |
| `aiTasks` | `?array` | filterable, facet | Distinct AI tasks applied to this item or any of its images — e.g. observe, analyze, ocr_mistral, enrich_from_hires, info. Derived from the item's claim sources during the folio build (normalized, 'ai:' prefix stripped). A multi-value facet, so you can filter to "items that had analysis" etc. Finer-grained than {@see $stage}: 'enriched' alone can't distinguish observe-only from observe+analyze. / |
## `dto_newspaper`
- Core: `obj`
- DTO type: `newspaper`
- Rows: 12
| Field | Type | Flags | Description |
| --- | --- | --- | --- |
| `id` | `?string` | | |
| `sourceUrl` | `?string` | | The citable/reader-facing page for this record (e.g. a museum's public object page). |
| `contentType` | `?string` | | |
| `aggregator` | `?string` | | |
| `stage` | `?string` | filterable, facet | Pipeline processing stage (raw / normalized / enriched). A facet so you can filter to enriched items. Grouped under Admin -- plumbing a visitor neither knows nor wants, and the sidebar starts an Admin block collapsed. / |
| `credit` | `?string` | | Credit line / acknowledgment, e.g. "Gift of the Brooklyn Museum of Art, Paul F. Walter Collection". |
| `observationProse` | `?string` | | ai:observationProse — detailed AI visual observation (markdown). Rendered with the \|markdown filter. |
| `sourceCaption` | `?string` | | The source's own caption text, VERBATIM — never an AI summary. Some image sources (e.g. Fortepan) ship only a short caption; keep it on its own field so the UI shows it as the real "Source caption" instead of mislabelling the AI-filled `description` / `denseSummary`. / |
| `year` | `?int` | filterable, facet, sortable | Coverage/production year. |
| `citationUrl` | `?string` | | ItemField::CITATION_URL — deep link back to the source record (e.g. the NARA catalog page). Rendered as the "Original" link on the folio item page. |
| `rightsUri` | `?string` | filterable, facet | dcterms:license URI (rightsstatements.org). Also a facet: some sources (e.g. Cleveland) carry the rights value as a short licence code here rather than a URI (CC0 / Copyrighted), and that splits a collection cleanly. NOTE: if a subclass DTO redeclares this property, repeat #[Field] — PHP attributes are not inherited on a redeclared property. / |
| `subjects` | `?array` | filterable, facet | dcterms:subject — keyword/topical subjects (incl. AI keywords). A sidebar facet. #[Translatable], same as $tags below: each element is extracted/translated independently, so a locale-variant folio build (folio:build --locale=en) folds in translated subject text automatically. Missing before 2026-08-04 -- subjects stayed in the source language on every translated build even after title/description were correctly translated, since applyTranslations() only touches #[Translatable] fields. / |
| `tags` | `?array` | filterable, facet | Raw curator/source-supplied tags -- controlled vocabulary, not free text. |
| `country` | `?string` | filterable, facet | |
| `state` | `?string` | filterable, facet | Primary/display state — see ItemField::STATE. Always set when a record has ≥1 state (the "City, State, Country" line in PhotoGrid.html.twig reads this one, not $states). |
| `city` | `?string` | filterable, facet | |
| `latitude` | `?float` | | |
| `longitude` | `?float` | | |
| `iiifBase` | `?string` | | IIIF Image API base URL — use for AI vision and imgProxy resizing |
| `thumbnailUrl` | `?string` | | |
| `largeImageUrl` | `?string` | | |
| `displayImageUrl` | `?string` | | See ItemField::DISPLAY_IMAGE_URL — source for the small imgproxy presets when set. |
| `pageCount` | `?int` | sortable | Number of pages in the document. |
| `source` | `string` | | Source of this data: import \| ai \| ocr \| human |
| `hasTranscription` | `bool` | | Has searchable full-text pages |
| `aiTasks` | `?array` | filterable, facet | Distinct AI tasks applied to this item or any of its images — e.g. observe, analyze, ocr_mistral, enrich_from_hires, info. Derived from the item's claim sources during the folio build (normalized, 'ai:' prefix stripped). A multi-value facet, so you can filter to "items that had analysis" etc. Finer-grained than {@see $stage}: 'enriched' alone can't distinguish observe-only from observe+analyze. / |
## `dto_object`
- Core: `obj`
- DTO type: `object`
- Rows: 4
Three-dimensional physical objects and artifacts that do not fit a more specific type: tools, vessels, garments, specimens, etc.
| Field | Type | Flags | Description |
| --- | --- | --- | --- |
| `id` | `?string` | | |
| `sourceUrl` | `?string` | | The citable/reader-facing page for this record (e.g. a museum's public object page). |
| `contentType` | `?string` | | |
| `aggregator` | `?string` | | |
| `stage` | `?string` | filterable, facet | Pipeline processing stage (raw / normalized / enriched). A facet so you can filter to enriched items. Grouped under Admin -- plumbing a visitor neither knows nor wants, and the sidebar starts an Admin block collapsed. / |
| `credit` | `?string` | | Credit line / acknowledgment, e.g. "Gift of the Brooklyn Museum of Art, Paul F. Walter Collection". |
| `observationProse` | `?string` | | ai:observationProse — detailed AI visual observation (markdown). Rendered with the \|markdown filter. |
| `sourceCaption` | `?string` | | The source's own caption text, VERBATIM — never an AI summary. Some image sources (e.g. Fortepan) ship only a short caption; keep it on its own field so the UI shows it as the real "Source caption" instead of mislabelling the AI-filled `description` / `denseSummary`. / |
| `year` | `?int` | filterable, facet, sortable | Coverage/production year. |
| `citationUrl` | `?string` | | ItemField::CITATION_URL — deep link back to the source record (e.g. the NARA catalog page). Rendered as the "Original" link on the folio item page. |
| `rightsUri` | `?string` | filterable, facet | dcterms:license URI (rightsstatements.org). Also a facet: some sources (e.g. Cleveland) carry the rights value as a short licence code here rather than a URI (CC0 / Copyrighted), and that splits a collection cleanly. NOTE: if a subclass DTO redeclares this property, repeat #[Field] — PHP attributes are not inherited on a redeclared property. / |
| `subjects` | `?array` | filterable, facet | dcterms:subject — keyword/topical subjects (incl. AI keywords). A sidebar facet. #[Translatable], same as $tags below: each element is extracted/translated independently, so a locale-variant folio build (folio:build --locale=en) folds in translated subject text automatically. Missing before 2026-08-04 -- subjects stayed in the source language on every translated build even after title/description were correctly translated, since applyTranslations() only touches #[Translatable] fields. / |
| `tags` | `?array` | filterable, facet | Raw curator/source-supplied tags -- controlled vocabulary, not free text. |
| `country` | `?string` | filterable, facet | |
| `state` | `?string` | filterable, facet | Primary/display state — see ItemField::STATE. Always set when a record has ≥1 state (the "City, State, Country" line in PhotoGrid.html.twig reads this one, not $states). |
| `city` | `?string` | filterable, facet | |
| `latitude` | `?float` | | |
| `longitude` | `?float` | | |
| `iiifBase` | `?string` | | IIIF Image API base URL — use for AI vision and imgProxy resizing |
| `thumbnailUrl` | `?string` | | |
| `largeImageUrl` | `?string` | | |
| `displayImageUrl` | `?string` | | See ItemField::DISPLAY_IMAGE_URL — source for the small imgproxy presets when set. |
| `pageCount` | `?int` | sortable | Number of pages in the document. |
| `source` | `string` | | Source of this data: import \| ai \| ocr \| human |
| `accession` | `?string` | | MuseumVocab::ACCESSION — local accession / catalog number |
| `aiTasks` | `?array` | filterable, facet | Distinct AI tasks applied to this item or any of its images — e.g. observe, analyze, ocr_mistral, enrich_from_hires, info. Derived from the item's claim sources during the folio build (normalized, 'ai:' prefix stripped). A multi-value facet, so you can filter to "items that had analysis" etc. Finer-grained than {@see $stage}: 'enriched' alone can't distinguish observe-only from observe+analyze. / |
## `dto_per_person`
- Core: `per`
- DTO type: `person`
- Rows: 530
People associated with collection records: creators, contributors, subjects, interviewees, performers, and other named agents.
| Field | Type | Flags | Description |
| --- | --- | --- | --- |
| `id` | `?string` | | |
| `contentType` | `?string` | | |
| `name` | `?string` | searchable, sortable | |
| `source` | `string` | | |
| `confidence` | `?float` | | |
## `dto_photograph`
- Core: `obj`
- DTO type: `photograph`
- Rows: 26,213
| Field | Type | Flags | Description |
| --- | --- | --- | --- |
| `id` | `?string` | | |
| `sourceUrl` | `?string` | | The citable/reader-facing page for this record (e.g. a museum's public object page). |
| `contentType` | `?string` | | |
| `aggregator` | `?string` | | |
| `stage` | `?string` | filterable, facet | Pipeline processing stage (raw / normalized / enriched). A facet so you can filter to enriched items. Grouped under Admin -- plumbing a visitor neither knows nor wants, and the sidebar starts an Admin block collapsed. / |
| `title` | `?string` | | dcterms:title |
| `description` | `?string` | | dcterms:description — short curatorial text from the source institution |
| `credit` | `?string` | | Credit line / acknowledgment, e.g. "Gift of the Brooklyn Museum of Art, Paul F. Walter Collection". |
| `denseSummary` | `?string` | | ai:denseSummary — ≤ 400 char retrieval-optimised summary. Entity-rich, factual, no filler. Used by Meilisearch /chat, RAG, chatbots. / |
| `sourceCaption` | `?string` | | The source's own caption text, VERBATIM — never an AI summary. Some image sources (e.g. Fortepan) ship only a short caption; keep it on its own field so the UI shows it as the real "Source caption" instead of mislabelling the AI-filled `description` / `denseSummary`. / |
| `searchSummary` | `?string` | | search_summary - deterministic BM25-friendly text assembled from normalized fields. Distinct from ai:denseSummary, which is an AI-generated retrieval summary. / |
| `year` | `?int` | filterable, facet, sortable | Coverage/production year. |
| `citationUrl` | `?string` | | ItemField::CITATION_URL — deep link back to the source record (e.g. the NARA catalog page). Rendered as the "Original" link on the folio item page. |
| `rightsUri` | `?string` | filterable, facet | dcterms:license URI (rightsstatements.org). Also a facet: some sources (e.g. Cleveland) carry the rights value as a short licence code here rather than a URI (CC0 / Copyrighted), and that splits a collection cleanly. NOTE: if a subclass DTO redeclares this property, repeat #[Field] — PHP attributes are not inherited on a redeclared property. / |
| `subjects` | `?array` | filterable, facet | dcterms:subject — keyword/topical subjects (incl. AI keywords). A sidebar facet. #[Translatable], same as $tags below: each element is extracted/translated independently, so a locale-variant folio build (folio:build --locale=en) folds in translated subject text automatically. Missing before 2026-08-04 -- subjects stayed in the source language on every translated build even after title/description were correctly translated, since applyTranslations() only touches #[Translatable] fields. / |
| `tags` | `?array` | filterable, facet | Raw curator/source-supplied tags -- controlled vocabulary, not free text. |
| `country` | `?string` | filterable, facet | |
| `state` | `?string` | filterable, facet | Primary/display state — see ItemField::STATE. Always set when a record has ≥1 state (the "City, State, Country" line in PhotoGrid.html.twig reads this one, not $states). |
| `city` | `?string` | filterable, facet | |
| `latitude` | `?float` | | |
| `longitude` | `?float` | | |
| `iiifBase` | `?string` | | IIIF Image API base URL — use for AI vision and imgProxy resizing |
| `thumbnailUrl` | `?string` | | |
| `largeImageUrl` | `?string` | | |
| `displayImageUrl` | `?string` | | See ItemField::DISPLAY_IMAGE_URL — source for the small imgproxy presets when set. |
| `pageCount` | `?int` | sortable | Number of pages in the document. |
| `source` | `string` | | Source of this data: import \| ai \| ocr \| human |
| `donor` | `?string` | filterable, facet | Who contributed the photo to the archive (e.g. the Fortepan donor). A sidebar facet. |
| `aiTasks` | `?array` | filterable, facet | Distinct AI tasks applied to this item or any of its images — e.g. observe, analyze, ocr_mistral, enrich_from_hires, info. Derived from the item's claim sources during the folio build (normalized, 'ai:' prefix stripped). A multi-value facet, so you can filter to "items that had analysis" etc. Finer-grained than {@see $stage}: 'enriched' alone can't distinguish observe-only from observe+analyze. / |
| `observationProse` | `?string` | | ai:observationProse — detailed AI visual observation (markdown). Rendered with the \|markdown filter. |
## `dto_pla_place`
- Core: `pla`
- DTO type: `place`
- Rows: 820
A described PLACE — a park, site, or similar place-core row (Core::PLACE, 'pla'), as opposed to
a described OBJECT/document/artifact. First real user: App\Singleton\Nps (musdig#26), a National
Park unit — these fields are place-generic, not NPS-specific, so any future place-oriented
provider (a museum campus, a historic site, a trail) gets a real home for them instead of
falling into $unmapped/extras.
/
| Field | Type | Flags | Description |
| --- | --- | --- | --- |
| `id` | `?string` | | |
| `sourceUrl` | `?string` | | The citable/reader-facing page for this record (e.g. a museum's public object page). |
| `contentType` | `?string` | | |
| `stage` | `?string` | filterable, facet | Pipeline processing stage (raw / normalized / enriched). A facet so you can filter to enriched items. Grouped under Admin -- plumbing a visitor neither knows nor wants, and the sidebar starts an Admin block collapsed. / |
| `title` | `?string` | | dcterms:title |
| `latitude` | `?float` | | |
| `longitude` | `?float` | | |
| `pageCount` | `?int` | sortable | Number of pages in the document. |
| `source` | `string` | | Source of this data: import \| ai \| ocr \| human |
## `dto_postcard_front`
- Core: `obj`
- DTO type: `postcard_front`
- Rows: 130
Concrete BaseItemDto for subjects whose content type is unknown or mixed.
Use when no domain-specific DTO subclass applies.
/
| Field | Type | Flags | Description |
| --- | --- | --- | --- |
| `id` | `?string` | | |
| `sourceUrl` | `?string` | | The citable/reader-facing page for this record (e.g. a museum's public object page). |
| `contentType` | `?string` | | |
| `aggregator` | `?string` | | |
| `stage` | `?string` | filterable, facet | Pipeline processing stage (raw / normalized / enriched). A facet so you can filter to enriched items. Grouped under Admin -- plumbing a visitor neither knows nor wants, and the sidebar starts an Admin block collapsed. / |
| `credit` | `?string` | | Credit line / acknowledgment, e.g. "Gift of the Brooklyn Museum of Art, Paul F. Walter Collection". |
| `observationProse` | `?string` | | ai:observationProse — detailed AI visual observation (markdown). Rendered with the \|markdown filter. |
| `sourceCaption` | `?string` | | The source's own caption text, VERBATIM — never an AI summary. Some image sources (e.g. Fortepan) ship only a short caption; keep it on its own field so the UI shows it as the real "Source caption" instead of mislabelling the AI-filled `description` / `denseSummary`. / |
| `year` | `?int` | filterable, facet, sortable | Coverage/production year. |
| `citationUrl` | `?string` | | ItemField::CITATION_URL — deep link back to the source record (e.g. the NARA catalog page). Rendered as the "Original" link on the folio item page. |
| `rightsUri` | `?string` | filterable, facet | dcterms:license URI (rightsstatements.org). Also a facet: some sources (e.g. Cleveland) carry the rights value as a short licence code here rather than a URI (CC0 / Copyrighted), and that splits a collection cleanly. NOTE: if a subclass DTO redeclares this property, repeat #[Field] — PHP attributes are not inherited on a redeclared property. / |
| `subjects` | `?array` | filterable, facet | dcterms:subject — keyword/topical subjects (incl. AI keywords). A sidebar facet. #[Translatable], same as $tags below: each element is extracted/translated independently, so a locale-variant folio build (folio:build --locale=en) folds in translated subject text automatically. Missing before 2026-08-04 -- subjects stayed in the source language on every translated build even after title/description were correctly translated, since applyTranslations() only touches #[Translatable] fields. / |
| `tags` | `?array` | filterable, facet | Raw curator/source-supplied tags -- controlled vocabulary, not free text. |
| `country` | `?string` | filterable, facet | |
| `state` | `?string` | filterable, facet | Primary/display state — see ItemField::STATE. Always set when a record has ≥1 state (the "City, State, Country" line in PhotoGrid.html.twig reads this one, not $states). |
| `city` | `?string` | filterable, facet | |
| `latitude` | `?float` | | |
| `longitude` | `?float` | | |
| `iiifBase` | `?string` | | IIIF Image API base URL — use for AI vision and imgProxy resizing |
| `thumbnailUrl` | `?string` | | |
| `largeImageUrl` | `?string` | | |
| `displayImageUrl` | `?string` | | See ItemField::DISPLAY_IMAGE_URL — source for the small imgproxy presets when set. |
| `pageCount` | `?int` | sortable | Number of pages in the document. |
| `source` | `string` | | Source of this data: import \| ai \| ocr \| human |
| `aiTasks` | `?array` | filterable, facet | Distinct AI tasks applied to this item or any of its images — e.g. observe, analyze, ocr_mistral, enrich_from_hires, info. Derived from the item's claim sources during the folio build (normalized, 'ai:' prefix stripped). A multi-value facet, so you can filter to "items that had analysis" etc. Finer-grained than {@see $stage}: 'enriched' alone can't distinguish observe-only from observe+analyze. / |
## `dto_unknown`
- Core: `obj`
- DTO type: `unknown`
- Rows: 1
Concrete BaseItemDto for subjects whose content type is unknown or mixed.
Use when no domain-specific DTO subclass applies.
/
| Field | Type | Flags | Description |
| --- | --- | --- | --- |
| `id` | `?string` | | |
| `sourceUrl` | `?string` | | The citable/reader-facing page for this record (e.g. a museum's public object page). |
| `contentType` | `?string` | | |
| `aggregator` | `?string` | | |
| `stage` | `?string` | filterable, facet | Pipeline processing stage (raw / normalized / enriched). A facet so you can filter to enriched items. Grouped under Admin -- plumbing a visitor neither knows nor wants, and the sidebar starts an Admin block collapsed. / |
| `credit` | `?string` | | Credit line / acknowledgment, e.g. "Gift of the Brooklyn Museum of Art, Paul F. Walter Collection". |
| `sourceCaption` | `?string` | | The source's own caption text, VERBATIM — never an AI summary. Some image sources (e.g. Fortepan) ship only a short caption; keep it on its own field so the UI shows it as the real "Source caption" instead of mislabelling the AI-filled `description` / `denseSummary`. / |
| `year` | `?int` | filterable, facet, sortable | Coverage/production year. |
| `citationUrl` | `?string` | | ItemField::CITATION_URL — deep link back to the source record (e.g. the NARA catalog page). Rendered as the "Original" link on the folio item page. |
| `rightsUri` | `?string` | filterable, facet | dcterms:license URI (rightsstatements.org). Also a facet: some sources (e.g. Cleveland) carry the rights value as a short licence code here rather than a URI (CC0 / Copyrighted), and that splits a collection cleanly. NOTE: if a subclass DTO redeclares this property, repeat #[Field] — PHP attributes are not inherited on a redeclared property. / |
| `subjects` | `?array` | filterable, facet | dcterms:subject — keyword/topical subjects (incl. AI keywords). A sidebar facet. #[Translatable], same as $tags below: each element is extracted/translated independently, so a locale-variant folio build (folio:build --locale=en) folds in translated subject text automatically. Missing before 2026-08-04 -- subjects stayed in the source language on every translated build even after title/description were correctly translated, since applyTranslations() only touches #[Translatable] fields. / |
| `tags` | `?array` | filterable, facet | Raw curator/source-supplied tags -- controlled vocabulary, not free text. |
| `country` | `?string` | filterable, facet | |
| `state` | `?string` | filterable, facet | Primary/display state — see ItemField::STATE. Always set when a record has ≥1 state (the "City, State, Country" line in PhotoGrid.html.twig reads this one, not $states). |
| `city` | `?string` | filterable, facet | |
| `latitude` | `?float` | | |
| `longitude` | `?float` | | |
| `iiifBase` | `?string` | | IIIF Image API base URL — use for AI vision and imgProxy resizing |
| `thumbnailUrl` | `?string` | | |
| `largeImageUrl` | `?string` | | |
| `displayImageUrl` | `?string` | | See ItemField::DISPLAY_IMAGE_URL — source for the small imgproxy presets when set. |
| `pageCount` | `?int` | sortable | Number of pages in the document. |
| `source` | `string` | | Source of this data: import \| ai \| ocr \| human |
| `aiTasks` | `?array` | filterable, facet | Distinct AI tasks applied to this item or any of its images — e.g. observe, analyze, ocr_mistral, enrich_from_hires, info. Derived from the item's claim sources during the folio build (normalized, 'ai:' prefix stripped). A multi-value facet, so you can filter to "items that had analysis" etc. Finer-grained than {@see $stage}: 'enriched' alone can't distinguish observe-only from observe+analyze. / |
Query Guide
md
# Query Guide This folio stores canonical rows in `item` and observed field metadata in `schema_table` / `schema_property`. ```sql select * from schema_table where kind = 'dto'; select * from schema_property where table_id = ? order by position; select local_id, label, dto_type, dto_data, extras from item limit 20; ``` Convenience views are generated from observed DTO fields: ```sql select * from dto_negative limit 20; ``` ```sql select * from dto_newspaper limit 20; ``` ```sql select * from dto_object limit 20; ``` ```sql select * from dto_per_person limit 20; ``` ```sql select * from dto_photograph limit 20; ``` ```sql select * from dto_pla_place limit 20; ``` ```sql select * from dto_postcard_front limit 20; ``` ```sql select * from dto_unknown limit 20; ```