Properties

Community historical photo archive of Iowa and the US Midwest, run on KronoFoto by the University of Northern Iowa.

All properties (5)
Folio property values and provenance
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

26,363 photos, 1860–2025

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;
```