Skip to main content

Slot Metadata

Slot metadata is the typed summary stored with a save slot.

Use it for menus, compatibility checks, and player-facing save cards.

Record metadata also uses the slot metadata shape. Scene, Scope, and custom records add record_key and record_kind to the saved metadata so tools can tell which payload inside the slot they are inspecting.

SaveFlowSlotMetadata Fields

FieldTypePurpose
slot_idStringStable storage key.
display_nameStringPlayer-facing name.
save_typeStringmanual, autosave, checkpoint, or project-specific value.
chapter_nameStringChapter or campaign label.
location_nameStringCurrent area/room label.
playtime_secondsintTotal playtime shown in save UI.
difficultyStringOptional difficulty label.
thumbnail_pathStringOptional screenshot/thumbnail path.
created_at_unixintCreation timestamp.
created_at_isoStringCreation timestamp string.
saved_at_unixintLast save timestamp.
saved_at_isoStringLast save timestamp string.
scene_pathStringScene path captured for restore safety.
project_titleStringProject metadata.
game_versionStringGame build/version metadata.
data_versionintData version metadata.
save_schemaStringSchema label used by compatibility checks.

Record-aware saves may also include these metadata keys:

FieldTypePurpose
record_keyStringStable identity for one payload inside the slot.
record_kindStringmain, scene, scope, or project-specific/custom kind.

Extra fields should be basic Variant-safe data or typed SaveFlow data. Do not store heavy runtime objects in slot metadata.

Slot Metadata vs Record Metadata

The slot_id remains the player-facing save identity.

record_key identifies the payload inside that slot.

slot_id = slot_1
record_key = scope:res://world/project_room_dungeon.tscn:room
record_kind = scope

Save menus normally use slot metadata and summaries. Editor tools, migration tools, and release checks can inspect record metadata to find missing, outdated, or conflicting payloads under that slot.

Metadata Methods

metadata.apply_extra(extra: Dictionary) -> void
metadata.apply_patch(meta_patch: Dictionary) -> void
metadata.get_saveflow_authoring_warnings() -> PackedStringArray
metadata.get_extra_field_names() -> PackedStringArray
metadata.set_field(field_id: String, value: Variant) -> void

Use set_field() when code can target either a built-in metadata field or a custom metadata key.

SaveFlowSlotWorkflow Methods

slot_workflow.select_slot_index(slot_index: int) -> String
slot_workflow.active_slot_id() -> String
slot_workflow.set_slot_id_override(slot_index: int, slot_id: String) -> void
slot_workflow.clear_slot_id_overrides() -> void
slot_workflow.slot_id_for_index(slot_index: int) -> String
slot_workflow.fallback_display_name_for_index(slot_index: int) -> String
slot_workflow.build_active_slot_metadata(...) -> SaveFlowSlotMetadata
slot_workflow.build_slot_metadata(slot_index: int, ...) -> SaveFlowSlotMetadata
slot_workflow.build_empty_card(slot_index: int) -> Resource
slot_workflow.build_card_for_index(slot_index: int, summary: Dictionary = {}) -> Resource
slot_workflow.build_cards_for_indices(slot_indices: PackedInt32Array, summaries: Array = []) -> Array

SaveFlowSlotCard Fields

FieldTypePurpose
slot_indexintUI/order index.
slot_idStringStable storage key.
display_nameStringPlayer-facing name.
save_typeStringSave category.
chapter_nameStringChapter label.
location_nameStringLocation label.
playtime_secondsintPlaytime display data.
difficultyStringDifficulty label.
thumbnail_pathStringThumbnail path.
saved_at_unixintTimestamp.
saved_at_isoStringTimestamp string.
existsboolWhether the slot exists.
is_activeboolWhether this card is the selected active slot.
compatibleboolCompatibility result.
compatibility_reasonsPackedStringArrayHuman-readable compatibility issues.

Update a card from a summary:

card.apply_summary(summary)