Skip to main content

Python interface for the Manta Dota 2 replay parser

Project description

Python Manta

Python bindings for the dotabuff/manta Dota 2 replay parser

PyPI version Documentation Build Status License: MIT Python 3.8+


What This Library Does

Python Manta is a wrapper/bindings library that provides Python access to the excellent Manta Go library for parsing Dota 2 replay files (.dem).

Important Attribution

All the heavy lifting is done by dotabuff/manta - the battle-tested Go replay parser maintained by Dotabuff. This Python library simply:

  1. Wraps the Manta Go library using CGO
  2. Exposes a Pythonic API via ctypes
  3. Provides type-safe Pydantic models for parsed data

If you're working in Go, use Manta directly. This library exists for Python developers who need replay parsing capabilities.

Library Philosophy

Python Manta is a low-level data extraction library, not an analytics tool. We provide:

✅ In Scope ❌ Out of Scope
Raw data extraction Analysis/aggregation logic
Enums/constants for game data (RuneType, EntityType, CombatLogType, DamageType, Team, NeutralItemTier, NeutralItem) Fight detection algorithms
Type-safe Pydantic models Statistics computation
Simple helper properties (e.g., is_pro_match()) Data interpretation

The line: If it's mapping/typing game data → library. If it's interpreting/analyzing → user code.

Users should build analysis logic on top of the raw data we provide.


Table of Contents


Versioning

Python Manta follows a 4-part versioning scheme that tracks the upstream dotabuff/manta version:

v{manta_major}.{manta_minor}.{manta_patch}.{python_manta_release}
Version Part Meaning
1.4.5 Base dotabuff/manta version this release is built on
.1, .2, etc. Python Manta release number for that manta version

Examples:

  • v1.4.5 - Initial release based on manta v1.4.5
  • v1.4.5.1 - First update/bugfix release, still using manta v1.4.5
  • v1.4.5.2 - Second update, still using manta v1.4.5
  • v1.4.6 - New release when manta updates to v1.4.6

This scheme allows us to release updates (new features, bugfixes, documentation) without waiting for upstream manta releases (which happen ~twice per year).


Installation

From PyPI (Recommended)

pip install python-manta

Pre-built wheels are available for:

  • Linux (x86_64)
  • macOS (Intel and Apple Silicon)
  • Windows (AMD64)

No Go installation required - wheels include pre-compiled binaries.

Version Pinning

Always use the latest release for your target Manta version to get bug fixes and improvements:

# Latest release for Manta 1.4.5.x (recommended)
pip install "python-manta>=1.4.5,<1.4.6"

# Or use compatible release operator
pip install "python-manta~=1.4.5"

From Source

See Building from Source section below.


Quick Start

Parse Demo Header

from python_manta import Parser

parser = Parser("match.dem")
result = parser.parse(header=True)

print(f"Map: {result.header.map_name}")
print(f"Server: {result.header.server_name}")
print(f"Build: {result.header.build_num}")
print(f"Network Protocol: {result.header.network_protocol}")

Parse Specific Messages

from python_manta import Parser

parser = Parser("match.dem")

# Extract chat messages (limit to 100)
result = parser.parse(messages={"filter": "CDOTAUserMsg_ChatMessage", "max_messages": 100})

if result.success:
    for msg in result.messages.messages:
        print(f"[Tick {msg.tick}] Player {msg.data['source_player_id']}: {msg.data['message_text']}")

Parse Draft (Picks & Bans)

from python_manta import Parser

parser = Parser("match.dem")
result = parser.parse(game_info=True)

for pick_ban in result.game_info.picks_bans:
    action = "PICK" if pick_ban.is_pick else "BAN"
    team = "Radiant" if pick_ban.team == 2 else "Dire"
    print(f"{team} {action}: Hero ID {pick_ban.hero_id}")

Parser API

The Parser class provides single-pass parsing - all data collected in one file traversal. This is much more efficient when extracting multiple data types.

Single-Pass Parsing

from python_manta import Parser

# Create parser bound to file
parser = Parser("match.dem")

# Collect all data types in ONE parse (instead of 5 separate parses)
result = parser.parse(
    header=True,
    game_info=True,
    combat_log={"types": [0, 4], "max_entries": 100},
    entities={"interval_ticks": 1800, "max_snapshots": 50},
    messages={"filter": "ChatMessage", "max_messages": 100},
)

# Access all results
print(result.header.map_name)
print(result.game_info.match_id)
print(len(result.combat_log.entries))

Index/Seek API (Random Access)

from python_manta import Parser

parser = Parser("match.dem")

# Build keyframe index for seeking
index = parser.build_index(interval_ticks=1800)  # Every 60 seconds
print(f"Total ticks: {index.total_ticks}, Keyframes: {len(index.keyframes)}")

# Get hero state at specific tick
snap = parser.snapshot(target_tick=36000)  # 20 minutes
for hero in snap.heroes:
    print(f"{hero.hero_name}: HP={hero.health}/{hero.max_health} at ({hero.x:.0f}, {hero.y:.0f})")
    print(f"  LH={hero.last_hits} Gold={hero.gold} NW={hero.net_worth} KDA={hero.kda}")

# Include illusions/clones
snap = parser.snapshot(target_tick=36000, include_illusions=True)
for hero in snap.heroes:
    if hero.is_clone:
        print(f"Clone: {hero.hero_name}")
    elif hero.is_illusion:
        print(f"Illusion: {hero.hero_name}")

# Parse events in tick range
result = parser.parse_range(start_tick=25000, end_tick=35000, combat_log=True)
for entry in result.combat_log:
    print(f"Tick {entry['tick']}: {entry['target_name']}")

API Reference

Method Description
Parser(demo_path) Create parser bound to file
parse(**collectors) Single-pass parsing with multiple collectors
build_index(interval_ticks) Build keyframe index for seeking
snapshot(target_tick, include_illusions=False) Get hero state at tick
find_keyframe(index, target_tick) Find nearest keyframe
parse_range(start, end, **collectors) Parse events in tick range
stream(**options) Stream events from demo

Parser Class

The main class for parsing Dota 2 replay files.

class Parser:
    def __init__(self, demo_path: str, library_path: Optional[str] = None)

    # Main parsing method
    def parse(
        self,
        header: bool = False,
        game_info: bool = False,
        combat_log: Optional[Dict] = None,
        entities: Optional[Dict] = None,
        game_events: Optional[Dict] = None,
        modifiers: Optional[Dict] = None,
        string_tables: Optional[Dict] = None,
        messages: Optional[Dict] = None,
        parser_info: bool = False,
    ) -> ParseResult

    # Advanced features
    def build_index(self, interval_ticks: int = 1800) -> DemoIndex
    def snapshot(self, target_tick: int, include_illusions: bool = False) -> EntityStateSnapshot
    def parse_range(self, start_tick: int, end_tick: int, ...) -> RangeParseResult
    def stream(self, combat_log: bool = False, messages: bool = False, ...) -> Iterator[StreamEvent]

Constructor

parser = Parser("match.dem")  # Uses bundled library
parser = Parser("match.dem", library_path="/path/to/libmanta_wrapper.so")  # Custom library

parse(**collectors) -> ParseResult

Single-pass parsing with multiple data collectors. Collects all requested data in ONE file traversal.

Parameters (all optional):

  • header: Set to True to collect header metadata
  • game_info: Set to True to collect draft/game info
  • combat_log: Dict with types, max_entries, heroes_only
  • entities: Dict with interval_ticks, max_snapshots, target_heroes
  • game_events: Dict with event_filter, max_events
  • modifiers: Dict with max_modifiers, debuffs_only, auras_only
  • string_tables: Dict with table_names, include_values, max_entries
  • messages: Dict with filter, max_messages
  • parser_info: Set to True to collect parser state

Returns: ParseResult with all requested data

Raises:

  • FileNotFoundError: If demo file doesn't exist
  • ValueError: If parsing fails

Game Events

Parse Source 1 legacy game events with typed field access:

from python_manta import Parser

parser = Parser("match.dem")

# Parse specific events
result = parser.parse(game_events={"event_filter": "dota_combatlog", "max_events": 100})
for event in result.game_events.events:
    print(f"[{event.tick}] {event.name}: {event.fields}")

Modifiers

Track buffs, debuffs, and auras on units:

from python_manta import Parser

parser = Parser("match.dem")

# Get all modifiers
result = parser.parse(modifiers={"max_modifiers": 100})
for mod in result.modifiers.modifiers:
    print(f"[{mod.tick}] {mod.name} on entity {mod.parent}, duration={mod.duration}, stacks={mod.stack_count}")

# Filter for auras only
result = parser.parse(modifiers={"max_modifiers": 100, "auras_only": True})

Entity Queries

Query entities by class name and extract properties:

from python_manta import Parser

parser = Parser("match.dem")

# Query hero entities
result = parser.parse(entities={"class_filter": "Hero", "max_entities": 10})
for entity in result.entities.entities:
    print(f"{entity.class_name} (index={entity.index})")
    print(f"  Health: {entity.properties.get('m_iHealth')}")

# Query specific properties only
result = parser.parse(entities={
    "class_filter": "Hero",
    "property_filter": ["m_iHealth", "m_iMaxHealth", "m_vecOrigin"],
    "max_entities": 10
})

# Query by exact class names
result = parser.parse(entities={
    "class_names": ["CDOTA_Unit_Hero_Invoker", "CDOTA_Unit_Hero_Pudge"],
    "max_entities": 20
})

String Tables

Extract string tables (userinfo, instancebaseline, etc.):

from python_manta import Parser

parser = Parser("match.dem")

# Get specific table
result = parser.parse(string_tables={"table_names": ["userinfo"], "max_entries": 50})
for entry in result.string_tables.entries:
    print(f"[{entry.table}] {entry.key}: {entry.value[:50]}...")

Combat Log

Parse combat log with filtering and typed entries:

from python_manta import Parser

parser = Parser("match.dem")

# Get all combat log entries
result = parser.parse(combat_log={"max_entries": 100})
for entry in result.combat_log.entries:
    print(f"[{entry.game_time_str}] {entry.type_name}: {entry.attacker_name} -> {entry.target_name}")

# Filter by type (0=DAMAGE, 1=HEAL, 2=MODIFIER_ADD, etc.)
result = parser.parse(combat_log={"types": [0], "max_entries": 100})  # Damage only

# Filter for hero-related entries
result = parser.parse(combat_log={"heroes_only": True, "max_entries": 100})

Parser Info

Get parser metadata and state:

from python_manta import Parser

parser = Parser("match.dem")
result = parser.parse(parser_info=True)
info = result.parser_info

print(f"Final tick: {info.tick}")
print(f"Entity count: {info.entity_count}")
print(f"String tables: {info.string_tables}")

Supported Callbacks (272 Total)

Python Manta implements all 272 Manta callbacks. Use these exact names with parse_universal().

Communication & Chat

Callback Name Description
CDOTAUserMsg_ChatMessage Player text chat messages
CDOTAUserMsg_ChatEvent System chat events (kills, items, etc.)
CDOTAUserMsg_ChatWheel Chat wheel phrases
CDOTAUserMsg_BotChat Bot chat messages
CUserMessageSayText Generic say text
CUserMessageSayText2 Extended say text

Map & Location

Callback Name Description
CDOTAUserMsg_LocationPing Map ping locations
CDOTAUserMsg_MapLine Map drawing/lines
CDOTAUserMsg_WorldLine World-space lines
CDOTAUserMsg_MinimapEvent Minimap events
CDOTAUserMsg_Ping Generic pings
CDOTAUserMsg_CoachHUDPing Coach pings

Game State & Events

Callback Name Description
CDemoFileHeader Demo file metadata
CDemoFileInfo Extended demo info (draft, players)
CDOTAUserMsg_GamerulesStateChanged Game state transitions
CDOTAUserMsg_OverheadEvent Damage numbers, XP, gold
CDOTAUserMsg_UnitEvent Unit actions and abilities
CMsgDOTACombatLogEntry Combat log entries

Draft & Hero Selection

Callback Name Description
CDOTAUserMsg_PlayerDraftPick Player draft picks
CDOTAUserMsg_PlayerDraftSuggestPick Draft suggestions
CDOTAUserMsg_SuggestHeroPick Hero suggestions
CDOTAUserMsg_SuggestHeroRole Role suggestions

Items & Economy

Callback Name Description
CDOTAUserMsg_ItemPurchased Item purchases
CDOTAUserMsg_ItemSold Item sales
CDOTAUserMsg_ItemAlert Item alerts
CDOTAUserMsg_ItemFound Found items
CDOTAUserMsg_FoundNeutralItem Neutral item drops
CDOTAUserMsg_QuickBuyAlert Quick buy alerts

Combat & Abilities

Callback Name Description
CDOTAUserMsg_AbilityPing Ability pings
CDOTAUserMsg_AbilitySteal Rubick spell steal
CDOTAUserMsg_DamageReport Damage reports
CDOTAUserMsg_TE_Projectile Projectile events
CDOTAUserMsg_CreateLinearProjectile Linear projectiles

Network & Technical

Callback Name Description
CNETMsg_Tick Network tick synchronization
CNETMsg_SetConVar Console variable changes
CNETMsg_SignonState Connection state changes
CSVCMsg_ServerInfo Server configuration
CSVCMsg_PacketEntities Entity updates

Demo Control

Callback Name Description
CDemoPacket Demo packets
CDemoStop Demo end marker
CDemoSyncTick Sync tick markers
CDemoStringTables String table data
CDemoClassInfo Class information

Full Callback List by Category

Demo Messages (15 callbacks)
  • CDemoAnimationData
  • CDemoAnimationHeader
  • CDemoClassInfo
  • CDemoConsoleCmd
  • CDemoCustomData
  • CDemoCustomDataCallbacks
  • CDemoFileHeader
  • CDemoFileInfo
  • CDemoFullPacket
  • CDemoPacket
  • CDemoRecovery
  • CDemoSaveGame
  • CDemoSendTables
  • CDemoSpawnGroups
  • CDemoStop
  • CDemoStringTables
  • CDemoSyncTick
  • CDemoUserCmd
Network Messages (15 callbacks)
  • CNETMsg_DebugOverlay
  • CNETMsg_NOP
  • CNETMsg_SetConVar
  • CNETMsg_SignonState
  • CNETMsg_SpawnGroup_Load
  • CNETMsg_SpawnGroup_LoadCompleted
  • CNETMsg_SpawnGroup_ManifestUpdate
  • CNETMsg_SpawnGroup_SetCreationTick
  • CNETMsg_SpawnGroup_Unload
  • CNETMsg_SplitScreenUser
  • CNETMsg_StringCmd
  • CNETMsg_Tick
SVC Messages (25 callbacks)
  • CSVCMsg_BSPDecal
  • CSVCMsg_Broadcast_Command
  • CSVCMsg_ClassInfo
  • CSVCMsg_ClearAllStringTables
  • CSVCMsg_CmdKeyValues
  • CSVCMsg_CreateStringTable
  • CSVCMsg_FlattenedSerializer
  • CSVCMsg_FullFrameSplit
  • CSVCMsg_GetCvarValue
  • CSVCMsg_HLTVStatus
  • CSVCMsg_HltvFixupOperatorStatus
  • CSVCMsg_Menu
  • CSVCMsg_PacketEntities
  • CSVCMsg_PacketReliable
  • CSVCMsg_PeerList
  • CSVCMsg_Prefetch
  • CSVCMsg_Print
  • CSVCMsg_RconServerDetails
  • CSVCMsg_ServerInfo
  • CSVCMsg_ServerSteamID
  • CSVCMsg_SetPause
  • CSVCMsg_SetView
  • CSVCMsg_Sounds
  • CSVCMsg_SplitScreen
  • CSVCMsg_StopSound
  • CSVCMsg_UpdateStringTable
  • CSVCMsg_UserMessage
  • CSVCMsg_VoiceData
  • CSVCMsg_VoiceInit
User Messages (35 callbacks)
  • CUserMessageAchievementEvent
  • CUserMessageAmmoDenied
  • CUserMessageAudioParameter
  • CUserMessageCameraTransition
  • CUserMessageCloseCaption
  • CUserMessageCloseCaptionDirect
  • CUserMessageCloseCaptionPlaceholder
  • CUserMessageColoredText
  • CUserMessageCreditsMsg
  • CUserMessageCurrentTimescale
  • CUserMessageDesiredTimescale
  • CUserMessageFade
  • CUserMessageGameTitle
  • CUserMessageHapticsManagerEffect
  • CUserMessageHapticsManagerPulse
  • CUserMessageHudMsg
  • CUserMessageHudText
  • CUserMessageItemPickup
  • CUserMessageLagCompensationError
  • CUserMessageRequestDiagnostic
  • CUserMessageRequestDllStatus
  • CUserMessageRequestInventory
  • CUserMessageRequestState
  • CUserMessageRequestUtilAction
  • CUserMessageResetHUD
  • CUserMessageRumble
  • CUserMessageSayText
  • CUserMessageSayText2
  • CUserMessageSayTextChannel
  • CUserMessageSendAudio
  • CUserMessageServerFrameTime
  • CUserMessageShake
  • CUserMessageShakeDir
  • CUserMessageShowMenu
  • CUserMessageTextMsg
  • CUserMessageScreenTilt
  • CUserMessageUpdateCssClasses
  • CUserMessageVoiceMask
  • CUserMessageWaterShake
DOTA User Messages (140+ callbacks)
  • CDOTAUserMsg_AbilityDraftRequestAbility
  • CDOTAUserMsg_AbilityPing
  • CDOTAUserMsg_AbilitySteal
  • CDOTAUserMsg_AddQuestLogEntry
  • CDOTAUserMsg_AghsStatusAlert
  • CDOTAUserMsg_AIDebugLine
  • CDOTAUserMsg_AllStarEvent
  • CDOTAUserMsg_BeastChat
  • CDOTAUserMsg_BoosterState
  • CDOTAUserMsg_BotChat
  • CDOTAUserMsg_BuyBackStateAlert
  • CDOTAUserMsg_ChatEvent
  • CDOTAUserMsg_ChatMessage
  • CDOTAUserMsg_ChatWheel
  • CDOTAUserMsg_ChatWheelCooldown
  • CDOTAUserMsg_ClientLoadGridNav
  • CDOTAUserMsg_CoachHUDPing
  • CDOTAUserMsg_CombatHeroPositions
  • CDOTAUserMsg_CombatLogBulkData
  • CDOTAUserMsg_CompendiumState
  • CDOTAUserMsg_ContextualTip
  • CDOTAUserMsg_CourierKilledAlert
  • CDOTAUserMsg_CreateLinearProjectile
  • CDOTAUserMsg_CustomHeaderMessage
  • CDOTAUserMsg_CustomHudElement_Create
  • CDOTAUserMsg_CustomHudElement_Destroy
  • CDOTAUserMsg_CustomHudElement_Modify
  • CDOTAUserMsg_CustomMsg
  • CDOTAUserMsg_DamageReport
  • CDOTAUserMsg_DebugChallenge
  • CDOTAUserMsg_DestroyLinearProjectile
  • CDOTAUserMsg_DismissAllStatPopups
  • CDOTAUserMsg_DodgeTrackingProjectiles
  • CDOTAUserMsg_DuelAccepted
  • CDOTAUserMsg_DuelOpponentKilled
  • CDOTAUserMsg_DuelRequested
  • CDOTAUserMsg_EmptyItemSlotAlert
  • CDOTAUserMsg_EmptyTeleportAlert
  • CDOTAUserMsg_EnemyItemAlert
  • CDOTAUserMsg_ESArcanaCombo
  • CDOTAUserMsg_ESArcanaComboSummary
  • CDOTAUserMsg_FacetPing
  • CDOTAUserMsg_FlipCoinResult
  • CDOTAUserMsg_FoundNeutralItem
  • CDOTAUserMsg_GamerulesStateChanged
  • CDOTAUserMsg_GiftPlayer
  • CDOTAUserMsg_GlobalLightColor
  • CDOTAUserMsg_GlobalLightDirection
  • CDOTAUserMsg_GlyphAlert
  • CDOTAUserMsg_GuildChallenge_Progress
  • CDOTAUserMsg_HalloweenDrops
  • CDOTAUserMsg_HeroRelicProgress
  • CDOTAUserMsg_HighFiveCompleted
  • CDOTAUserMsg_HighFiveLeftHanging
  • CDOTAUserMsg_HotPotato_Created
  • CDOTAUserMsg_HotPotato_Exploded
  • CDOTAUserMsg_HPManaAlert
  • CDOTAUserMsg_HudError
  • CDOTAUserMsg_InnatePing
  • CDOTAUserMsg_InvalidCommand
  • CDOTAUserMsg_ItemAlert
  • CDOTAUserMsg_ItemFound
  • CDOTAUserMsg_ItemPurchased
  • CDOTAUserMsg_ItemSold
  • CDOTAUserMsg_KillcamDamageTaken
  • CDOTAUserMsg_LocationPing
  • CDOTAUserMsg_MadstoneAlert
  • CDOTAUserMsg_MapLine
  • CDOTAUserMsg_MarsArenaOfBloodAttack
  • CDOTAUserMsg_MinimapDebugPoint
  • CDOTAUserMsg_MinimapEvent
  • CDOTAUserMsg_MiniKillCamInfo
  • CDOTAUserMsg_MiniTaunt
  • CDOTAUserMsg_ModifierAlert
  • CDOTAUserMsg_MoveCameraToUnit
  • CDOTAUserMsg_MuertaReleaseEvent_AssignedTargetKilled
  • CDOTAUserMsg_MutedPlayers
  • CDOTAUserMsg_NeutralCampAlert
  • CDOTAUserMsg_NeutralCraftAvailable
  • CDOTAUserMsg_NevermoreRequiem
  • CDOTAUserMsg_OMArcanaCombo
  • CDOTAUserMsg_OutpostCaptured
  • CDOTAUserMsg_OutpostGrantedXP
  • CDOTAUserMsg_OverheadEvent
  • CDOTAUserMsg_PauseMinigameData
  • CDOTAUserMsg_Ping
  • CDOTAUserMsg_PingConfirmation
  • CDOTAUserMsg_PlayerDraftPick
  • CDOTAUserMsg_PlayerDraftSuggestPick
  • CDOTAUserMsg_ProjectionAbility
  • CDOTAUserMsg_ProjectionEvent
  • CDOTAUserMsg_QoP_ArcanaSummary
  • CDOTAUserMsg_QuestStatus
  • CDOTAUserMsg_QueuedOrderRemoved
  • CDOTAUserMsg_QuickBuyAlert
  • CDOTAUserMsg_RadarAlert
  • CDOTAUserMsg_ReceivedXmasGift
  • CDOTAUserMsg_ReplaceQueryUnit
  • CDOTAUserMsg_RockPaperScissorsFinished
  • CDOTAUserMsg_RockPaperScissorsStarted
  • CDOTAUserMsg_RollDiceResult
  • CDOTAUserMsg_RoshanTimer
  • CDOTAUserMsg_SalutePlayer
  • CDOTAUserMsg_SelectPenaltyGold
  • CDOTAUserMsg_SendFinalGold
  • CDOTAUserMsg_SendGenericToolTip
  • CDOTAUserMsg_SendRoshanPopup
  • CDOTAUserMsg_SendRoshanSpectatorPhase
  • CDOTAUserMsg_SendStatPopup
  • CDOTAUserMsg_SetNextAutobuyItem
  • CDOTAUserMsg_SharedCooldown
  • CDOTAUserMsg_ShovelUnearth
  • CDOTAUserMsg_ShowGenericPopup
  • CDOTAUserMsg_ShowSurvey
  • CDOTAUserMsg_SpectatorPlayerClick
  • CDOTAUserMsg_SpectatorPlayerUnitOrders
  • CDOTAUserMsg_SpeechBubble
  • CDOTAUserMsg_StatsHeroMinuteDetails
  • CDOTAUserMsg_StatsMatchDetails
  • CDOTAUserMsg_SuggestHeroPick
  • CDOTAUserMsg_SuggestHeroRole
  • CDOTAUserMsg_SwapVerify
  • CDOTAUserMsg_TalentTreeAlert
  • CDOTAUserMsg_TE_DestroyProjectile
  • CDOTAUserMsg_TE_DotaBloodImpact
  • CDOTAUserMsg_TE_Projectile
  • CDOTAUserMsg_TE_ProjectileLoc
  • CDOTAUserMsg_TE_UnitAnimation
  • CDOTAUserMsg_TE_UnitAnimationEnd
  • CDOTAUserMsg_TimerAlert
  • CDOTAUserMsg_TipAlert
  • CDOTAUserMsg_TutorialFade
  • CDOTAUserMsg_TutorialFinish
  • CDOTAUserMsg_TutorialMinimapPosition
  • CDOTAUserMsg_TutorialPingMinimap
  • CDOTAUserMsg_TutorialRequestExp
  • CDOTAUserMsg_TutorialTipInfo
  • CDOTAUserMsg_UnitEvent
  • CDOTAUserMsg_UpdateLinearProjectileCPData
  • CDOTAUserMsg_UpdateQuestProgress
  • CDOTAUserMsg_UpdateSharedContent
  • CDOTAUserMsg_VersusScene_PlayerBehavior
  • CDOTAUserMsg_VoteEnd
  • CDOTAUserMsg_VoteStart
  • CDOTAUserMsg_VoteUpdate
  • CDOTAUserMsg_WillPurchaseAlert
  • CDOTAUserMsg_WK_Arcana_Progress
  • CDOTAUserMsg_WorldLine
  • CDOTAUserMsg_WRArcanaProgress
  • CDOTAUserMsg_WRArcanaSummary
  • CDOTAUserMsg_XPAlert
Entity Messages (6 callbacks)
  • CEntityMessageDoSpark
  • CEntityMessageFixAngle
  • CEntityMessagePlayJingle
  • CEntityMessagePropagateForce
  • CEntityMessageRemoveAllDecals
  • CEntityMessageScreenOverlay
Miscellaneous Messages (15 callbacks)
  • CMsgClearDecalsForSkeletonInstanceEvent
  • CMsgClearEntityDecalsEvent
  • CMsgClearWorldDecalsEvent
  • CMsgDOTACombatLogEntry
  • CMsgGCToClientTournamentItemDrop
  • CMsgPlaceDecalEvent
  • CMsgSosSetLibraryStackFields
  • CMsgSosSetSoundEventParams
  • CMsgSosStartSoundEvent
  • CMsgSosStopSoundEvent
  • CMsgSosStopSoundEventHash
  • CMsgSource1LegacyGameEvent
  • CMsgSource1LegacyGameEventList
  • CMsgSource1LegacyListenEvents
  • CMsgVDebugGameSessionIDEvent
  • CDOTAMatchMetadataFile

Data Models

All models use Pydantic for validation and serialization.

HeaderInfo

class HeaderInfo(BaseModel):
    map_name: str              # Map name (e.g., "dota")
    server_name: str           # Server identifier
    client_name: str           # Client type
    game_directory: str        # Game directory path
    network_protocol: int      # Network protocol version
    demo_file_stamp: str       # Demo file signature
    build_num: int             # Game build number
    game: str                  # Game identifier
    server_start_tick: int     # Server start tick
    success: bool              # Parse success flag
    error: Optional[str]       # Error message if failed

CHeroSelectEvent

class CHeroSelectEvent(BaseModel):
    is_pick: bool    # True for pick, False for ban
    team: int        # 2 = Radiant, 3 = Dire
    hero_id: int     # Hero ID (see Dota 2 Wiki for mappings)

CDotaGameInfo

class CDotaGameInfo(BaseModel):
    picks_bans: List[CHeroSelectEvent]  # Draft sequence
    success: bool
    error: Optional[str]

MessageEvent

class MessageEvent(BaseModel):
    type: str                    # Callback name
    tick: int                    # Game tick
    net_tick: int                # Network tick
    data: Any                    # Message-specific data (dict)
    timestamp: Optional[int]     # Unix timestamp (ms)

UniversalParseResult

class UniversalParseResult(BaseModel):
    messages: List[MessageEvent]  # Matched messages
    success: bool                 # Parse success flag
    error: Optional[str]          # Error message
    count: int                    # Number of messages

GameEventData

class GameEventData(BaseModel):
    name: str                     # Event name (e.g., "dota_combatlog")
    tick: int                     # Game tick
    net_tick: int                 # Network tick
    fields: Dict[str, Any]        # Event-specific fields

ModifierEntry

class ModifierEntry(BaseModel):
    tick: int                     # Game tick
    name: str                     # Modifier name
    parent: int                   # Parent entity handle
    duration: float               # Duration in seconds (-1 = permanent)
    stack_count: int              # Number of stacks
    is_aura: bool                 # Whether this is an aura

EntityData

class EntityData(BaseModel):
    index: int                    # Entity index
    class_name: str               # Entity class name
    properties: Dict[str, Any]    # Entity properties

CombatLogEntry

class CombatLogEntry(BaseModel):
    tick: int                     # Game tick (~30/second)
    type: int                     # Combat log type ID
    type_name: str                # Human-readable type name
    attacker_name: str            # Attacker name
    target_name: str              # Target name
    inflictor_name: str           # Ability/item name
    value: int                    # Damage/heal value
    health: int                   # Target HP after event
    game_time: float              # Game time in seconds (negative pre-horn)
    game_time_str: str            # Formatted time ("-0:40", "5:32")
    is_attacker_hero: bool        # Whether attacker is a hero
    is_target_hero: bool          # Whether target is a hero
    stun_duration: float          # Stun duration applied
    assist_players: List[int]     # Assist player IDs (for kills)
    # ... 80+ fields total - see documentation for complete list

ParserInfo

class ParserInfo(BaseModel):
    tick: int                     # Final parser tick
    net_tick: int                 # Final network tick
    entity_count: int             # Number of entities
    string_tables: List[str]      # List of string table names
    success: bool                 # Parse success flag

HeroSnapshot

Captured via parser.snapshot() for hero state at a specific tick:

class HeroSnapshot(BaseModel):
    # Identity
    hero_name: str                # e.g., "npc_dota_hero_axe"
    hero_id: int                  # Hero ID
    player_id: int                # Player index (0-9)
    team: int                     # 2 = Radiant, 3 = Dire
    index: int                    # Entity index

    # Position
    x: float                      # X coordinate
    y: float                      # Y coordinate
    z: float                      # Z coordinate

    # Vital stats
    health: int                   # Current HP
    max_health: int               # Max HP
    mana: float                   # Current mana
    max_mana: float               # Max mana
    level: int                    # Hero level
    is_alive: bool                # Whether hero is alive

    # Economy
    gold: int                     # Current gold
    net_worth: int                # Total net worth
    last_hits: int                # Last hits
    denies: int                   # Denies
    xp: int                       # Experience points

    # KDA
    kills: int                    # Kills
    deaths: int                   # Deaths
    assists: int                  # Assists

    # Combat stats
    armor: float                  # Armor value
    magic_resistance: float       # Magic resistance %
    damage_min: int               # Min damage
    damage_max: int               # Max damage
    attack_range: int             # Attack range

    # Attributes
    strength: float               # Strength
    agility: float                # Agility
    intellect: float              # Intelligence

    # Abilities and talents
    abilities: List[AbilitySnapshot]  # List of abilities
    talents: List[TalentChoice]       # Selected talents
    ability_points: int               # Unspent ability points

    # Clone/illusion flags
    is_clone: bool                # MK clone, Morph replicate
    is_illusion: bool             # Regular illusion

    @property
    def kda(self) -> str:         # Returns "K/D/A" format
        return f"{self.kills}/{self.deaths}/{self.assists}"

Common Use Cases

Extract All Chat Messages

from python_manta import Parser

parser = Parser("match.dem")
result = parser.parse(messages={"filter": "CDOTAUserMsg_ChatMessage", "max_messages": 1000})

for msg in result.messages.messages:
    player_id = msg.data.get('source_player_id', 'Unknown')
    text = msg.data.get('message_text', '')
    print(f"Player {player_id}: {text}")

Track Item Purchases

from python_manta import Parser

parser = Parser("match.dem")
result = parser.parse(messages={"filter": "CDOTAUserMsg_ItemPurchased", "max_messages": 1000})

for msg in result.messages.messages:
    player_id = msg.data.get('player_id')
    item_id = msg.data.get('item_ability_id')
    tick = msg.tick
    print(f"[{tick}] Player {player_id} purchased item {item_id}")

Analyze Location Pings

from python_manta import Parser

parser = Parser("match.dem")
result = parser.parse(messages={"filter": "CDOTAUserMsg_LocationPing", "max_messages": 1000})

for msg in result.messages.messages:
    ping_data = msg.data.get('location_ping', {})
    x = ping_data.get('x', 0)
    y = ping_data.get('y', 0)
    player_id = msg.data.get('player_id')
    print(f"Player {player_id} pinged at ({x}, {y})")

Extract Combat Log (Structured)

from python_manta import Parser

parser = Parser("match.dem")
result = parser.parse(combat_log={"max_entries": 1000})

for entry in result.combat_log.entries:
    print(f"[{entry.game_time_str}] {entry.attacker_name} -> {entry.target_name}: {entry.value} damage")

Get Match Statistics

from python_manta import Parser

parser = Parser("match.dem")
result = parser.parse(messages={"filter": "CDOTAUserMsg_StatsMatchDetails", "max_messages": 10})

if result.success and result.messages.messages:
    stats = result.messages.messages[0].data
    print(f"Match stats: {stats}")

Multiple Data Types in Single Pass

from python_manta import Parser

parser = Parser("match.dem")

# Collect ALL data in ONE parse instead of multiple passes
result = parser.parse(
    header=True,
    game_info=True,
    messages={"filter": "ChatMessage", "max_messages": 100},
    combat_log={"heroes_only": True, "max_entries": 500},
)

print(f"Map: {result.header.map_name}")
print(f"Picks: {len([p for p in result.game_info.picks_bans if p.is_pick])}")
print(f"Chat messages: {len(result.messages.messages)}")
print(f"Combat entries: {len(result.combat_log.entries)}")

Development Setup

When you clone this repository, the shared library (.so/.dylib/.dll) is not included. You have two options:

Option 1: Download Pre-built Library (Recommended)

git clone https://github.com/DeepBlueCoding/python-manta.git
cd python-manta
python scripts/download_library.py
pip install -e '.[dev]'

Option 2: Build from Source

Requires Go 1.19+ installed.

git clone https://github.com/DeepBlueCoding/python-manta.git
cd python-manta
git clone https://github.com/dotabuff/manta.git ../manta
./build.sh
pip install -e '.[dev]'

Verify Installation

python -c "from python_manta import Parser; print('Success!')"

Running Tests

# Unit tests only
python run_tests.py --unit

# Integration tests (requires .dem files)
python run_tests.py --integration

# All tests with coverage
python run_tests.py --all --coverage

Architecture

┌─────────────────────────────────────────────────────────────┐
│                      Python Application                      │
├─────────────────────────────────────────────────────────────┤
│  python_manta Package                                        │
│  ├── Parser (main interface)                                │
│  ├── Pydantic Models (type-safe data structures)            │
│  └── ctypes bindings (FFI to shared library)                │
├─────────────────────────────────────────────────────────────┤
│  libmanta_wrapper.so (CGO Shared Library)                   │
│  ├── CGO exports (Parse, BuildIndex, GetSnapshot, etc.)     │
│  ├── 272 callback implementations                           │
│  └── JSON serialization                                      │
├─────────────────────────────────────────────────────────────┤
│  dotabuff/manta (Go Library)                                │
│  ├── PBDEMS2 format parser                                  │
│  ├── Protobuf message decoding                              │
│  └── Callback system                                         │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
                    ┌─────────────────┐
                    │  .dem Replay    │
                    │     File        │
                    └─────────────────┘

Data Flow

  1. Python creates Parser("match.dem") and calls parse(**collectors)
  2. ctypes marshals parameters to C strings
  3. CGO wrapper receives call, opens file
  4. Manta Go library parses the binary .dem file
  5. Registered callbacks capture matching messages based on collectors
  6. All data collected in single pass
  7. Data serialized to JSON and returned to Python
  8. Pydantic models validate and structure the data

AI Integration Guide

This section helps AI systems (LLMs, agents, coding assistants) understand and use this library effectively.

Library Philosophy (Important for AI Agents)

Python Manta is a low-level data extraction library, not an analytics tool.

✅ In Scope ❌ Out of Scope
Raw data extraction Analysis/aggregation logic
Enums/constants (RuneType, EntityType, CombatLogType, DamageType, Team) Fight detection algorithms
Type-safe Pydantic models Statistics computation
Helper properties (e.g., is_pro_match()) Data interpretation

When generating code: Extract raw data with this library, then write analysis logic separately. Don't expect high-level functions like "get_teamfights()" or "calculate_gpm()" - those belong in user code.

Quick Reference

from python_manta import Parser

parser = Parser("match.dem")

# Single-pass parsing - collect ALL data at once
result = parser.parse(
    header=True,                                         # Match metadata
    game_info=True,                                      # Picks, bans, teams
    messages={"filter": "ChatMessage", "max_messages": 100},  # Chat messages
    combat_log={"heroes_only": True, "max_entries": 100},     # Combat events
    entities={"interval_ticks": 900, "max_snapshots": 50},    # Hero positions
    game_events={"event_filter": "dota_combatlog", "max_events": 100},
    modifiers={"max_modifiers": 100},
    parser_info=True,
)

# Access all results from the single parse
print(result.header.map_name)
print(len(result.game_info.picks_bans))
print(len(result.messages.messages))
print(len(result.combat_log.entries))

Which API to Use

Task Collector Config Notes
Match metadata header=True Build number, map, server
Draft sequence game_info=True Picks/bans with hero IDs
Pro match info game_info=True Teams, league, players, winner
Hero positions entities={"interval_ticks": 900} Position, stats at intervals
Chat messages messages={"filter": "ChatMessage"} Player text chat
Item purchases messages={"filter": "ItemPurchased"} Item buy events
Map pings messages={"filter": "LocationPing"} Ping coordinates
Combat damage combat_log={"types": [0]} Structured damage events
Hero kills combat_log={"heroes_only": True} Hero-related combat
Buff tracking modifiers={} Active buffs/debuffs
Hero state entities={} Entity state snapshots
Game events game_events={} 364 named event types
Player info string_tables={"table_names": ["userinfo"]} Steam IDs, names

Common Patterns

Extract multiple data types in single pass:

from python_manta import Parser

parser = Parser("match.dem")
result = parser.parse(
    header=True,
    game_info=True,
    combat_log={"heroes_only": True, "max_entries": 500},
)

print(f"Map: {result.header.map_name}")
for entry in result.combat_log.entries:
    print(f"{entry.attacker_name} hit {entry.target_name} for {entry.value}")

Track all damage to heroes:

parser = Parser("match.dem")
result = parser.parse(combat_log={"types": [0], "heroes_only": True, "max_entries": 1000})
for entry in result.combat_log.entries:
    print(f"{entry.attacker_name} hit {entry.target_name} for {entry.value} damage")

Find specific game events:

parser = Parser("match.dem")
result = parser.parse(game_events={"event_filter": "dota_player_kill", "max_events": 100})
for event in result.game_events.events:
    print(f"Kill at tick {event.tick}: {event.fields}")

Key Constraints

  1. Callback names are case-sensitive - Use exact names from the callback list
  2. Message filter uses substring matching - "Chat" matches CDOTAUserMsg_ChatMessage and CDOTAUserMsg_ChatEvent
  3. Always set max_* limits - Prevents memory issues with large replays
  4. Entity queries return end-of-replay state - For time-series data, use combat log or game events
  5. Combat log only starts after ~12-17 minutes - HLTV broadcast delay; use entity snapshots for early game

Troubleshooting

Library Not Found

FileNotFoundError: Shared library not found

Solution: Install from PyPI (pip install python-manta) or build from source with ./build.sh.

Demo File Not Found

FileNotFoundError: Demo file not found: match.dem

Solution: Provide absolute path or verify the file exists.

Parsing Returns Empty Results

  1. Check the callback name is exact (case-sensitive)
  2. The message type may not exist in that replay
  3. Try without a filter to see all messages: parser.parse(messages={"filter": "", "max_messages": 100})

Memory Issues with Large Replays

Solution: Always set max_messages to a reasonable limit:

# Good - limits memory usage
result = parser.parse_universal("match.dem", "CNETMsg_Tick", 1000)

# Bad - could consume gigabytes of RAM
result = parser.parse_universal("match.dem", "CNETMsg_Tick", 0)

Platform-Specific Issues

macOS Apple Silicon:

  • Ensure you have the ARM64 wheel or build from source on ARM

Windows:

  • The library file is libmanta_wrapper.dll
  • Ensure Visual C++ redistributables are installed

Linux:

  • The library file is libmanta_wrapper.so
  • Ensure glibc version compatibility

Project Links

Related Projects

  • clarity - Java Dota 2 replay parser
  • demoinfo-go - CS:GO demo parser in Go
  • Yasha - Source 1 Dota 2 parser (archived)

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Run tests: python run_tests.py --all
  5. Submit a pull request

License

MIT License - see LICENSE file.


Acknowledgments

  • Manta - The Go replay parser that does all the real work
  • Dotabuff - For maintaining Manta and supporting the community
  • Valve Corporation - For Dota 2 and the replay format

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

python_manta-1.4.7.2-cp313-cp313-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.13Windows x86-64

python_manta-1.4.7.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

python_manta-1.4.7.2-cp313-cp313-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

python_manta-1.4.7.2-cp313-cp313-macosx_10_13_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

python_manta-1.4.7.2-cp312-cp312-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.12Windows x86-64

python_manta-1.4.7.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

python_manta-1.4.7.2-cp312-cp312-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

python_manta-1.4.7.2-cp312-cp312-macosx_10_13_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

python_manta-1.4.7.2-cp311-cp311-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.11Windows x86-64

python_manta-1.4.7.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

python_manta-1.4.7.2-cp311-cp311-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

python_manta-1.4.7.2-cp311-cp311-macosx_10_9_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

python_manta-1.4.7.2-cp310-cp310-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.10Windows x86-64

python_manta-1.4.7.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

python_manta-1.4.7.2-cp310-cp310-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

python_manta-1.4.7.2-cp310-cp310-macosx_10_9_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

python_manta-1.4.7.2-cp39-cp39-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.9Windows x86-64

python_manta-1.4.7.2-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

python_manta-1.4.7.2-cp39-cp39-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

python_manta-1.4.7.2-cp39-cp39-macosx_10_9_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

python_manta-1.4.7.2-cp38-cp38-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.8Windows x86-64

python_manta-1.4.7.2-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

python_manta-1.4.7.2-cp38-cp38-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

python_manta-1.4.7.2-cp38-cp38-macosx_10_9_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

File details

Details for the file python_manta-1.4.7.2-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 362cc7fdf030eb8c9afc6be42a7bbf6456205bbac9115878837326b9bac9a39c
MD5 5fd887bbba6f45b318af057f975a1abe
BLAKE2b-256 d2eea1ec731f51fdcdbd05954f44bdfa9e04a48a2217cc1e945c52b9401d3b45

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp313-cp313-win_amd64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 32bdff528eda01535e1841d935a5cc361cc654842f60f6c4c4b8ac5f17748242
MD5 a3c414f38bf5c5a7e830bcc073308242
BLAKE2b-256 118f7df02c1240e582f64d374e32e264b39580af694dd531008e4bd906648a0d

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 50b16ad17027418203a5be98c01c4e632cf7074a4eb494d684bbaf5d8f2882cb
MD5 4ca024c8bb493f087f33522bd8df80f4
BLAKE2b-256 17d2f27de0cd4e3be0b1c6420ef68008f28b539d8f7986e30f4ec931d4f43775

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c75ad10bfa037e7d70ba17435a8fc7faa64db2b4691a11833489febdd6350d4b
MD5 deede9a619e83de04188d0c54e190bab
BLAKE2b-256 65e64b1cfb4ecf026ba5a74971b873dbe739f250f392e3c64e22ac246382021c

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp313-cp313-macosx_10_13_x86_64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1414de189faa39fa4e5286f31de05844237387300ac58ce62ac291d28fa9c141
MD5 48bbfc91d792b2e0fd03cd914b1466ac
BLAKE2b-256 1894f80fe0204352f2db9fee4f8e4d6f923d26fb466d68b7a0e5e778c4c2d6ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp312-cp312-win_amd64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 43560bfff74d40a1b432c2f8926c8f30aef13c21acbdec1724110f52595e779b
MD5 be43b6c02158bfaa89e64a2c618fa733
BLAKE2b-256 e64a113ebf161bb4568e5af81108db727e0bd89946a18a8c504fdcd84e1f5d49

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d8a171844060a5702ee85bdd6e9dd543013b3573ab5b8c69903b5276cb077c50
MD5 fd878b2816feeeec0e2efe0d93e2fd6e
BLAKE2b-256 22a8efa43c7160b35c9688d902c9472ad160fee965dfe61f5cc6e7e615ca7ca4

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 032b8c6860bd470a349172bb602d86232e284195b3f551c6a7e2063ec8cadeaf
MD5 19230ac1830b81bb9ad58e82de197cd9
BLAKE2b-256 616af939a2ccf105af15438c436de36bf332f2e2518e114a3a55d3ed36cca15a

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 eec04023a28a8bebcf29b5840b61a5e6e52a132c40c949deaf9a62886c44f72d
MD5 235edf7a58200c39f183c146e3784dd0
BLAKE2b-256 ec5100ca5ba667cbe06d212f276b10458f048a4328483b88abba55acfbd63746

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp311-cp311-win_amd64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 22343df9f7802dffdd0df9584a5871afdcb42f3661c986f113e64ac064ee81c5
MD5 ceeda6ddfa4e4684888b44fbecdc5aaf
BLAKE2b-256 ce06f7e3295fc5399d9342ab7cc00abc92088b19396d1a34b442889b5d11d536

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 651f857e0d08617d76ef9c1fbb2b8c73804b459f257dc64b64b0e2a570d2aec8
MD5 9b1427f6cb9ebc58516087bbec68cc1c
BLAKE2b-256 99154f175e72d9767cc2890a8b6adf2867c028382a71b1360838306952ac4e5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0ec036807aa02548059940e205f7c6d015fea4485d0aa7950595835103df01fb
MD5 a39b8d18c93d2a9a5a411343d38ec74d
BLAKE2b-256 4436480c9ae6fb9c9d5c78b08bfd8282747d5ce18645edf18aff9afd518fd0ac

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp311-cp311-macosx_10_9_x86_64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 61e7b3d27f63c8d52e6efc62c62d5ca16338232aba63de2e8a2505fb410941a0
MD5 17c8a31bea83f92b34249d34793686f8
BLAKE2b-256 3c70f9ce5f831d04a86ead0aa898b97a48001e49085e0f4de8614e268119c449

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp310-cp310-win_amd64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 9cba85e2174f717f2957e00970c3ae5de57597bb2c4f527ddbef7a43bb861d11
MD5 63b0d58a3daf98aaca032ddf76511e65
BLAKE2b-256 d1750b5ebdf3b00977ad527f5119220ee943a7c733bfe2f100ece045bff6aacf

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d316ef0c7db599f6c327fe653d03fbc1c2e7d5f8eecf93c6e2d3af911555a8dc
MD5 d4560ad37266c4662138545147a1773b
BLAKE2b-256 d4bfbf1c917c99a92a425eab3c7066b73685961a028449207f4d24f760cf70e7

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e25bdc26e3fc332de851bdd8d5a05ba31d58eae3fe9a0d4de8957bd5d9dd4c56
MD5 1802d196be6d861881a9ff0d556bbcb0
BLAKE2b-256 244afc12407b1b3c46df815b2550ef0fcccdc5b8fab22bfa2c6af50f1f6b04fb

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp310-cp310-macosx_10_9_x86_64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 01a66997ab707ff1a1d5b887cd77d6900d55e0dd624fcd250dc2fd7917fb0d15
MD5 2585c47685e0fc7bc48cc6a2ad1916d3
BLAKE2b-256 7734c9b64192e0329d656b42f1fae9cb9e32c33f6db5aafc29a19207f0b3eea9

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp39-cp39-win_amd64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 8254caa97942d3c2c216c485ad8ea64a2fb978271810e3dfee24621171db373c
MD5 ec5aae9b109eca77d4fccb3eb65591bf
BLAKE2b-256 bb89845a67ce946caf1f277b31c312f8d354197df4f3d249e11854d992fba275

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3500925a2dabe7afcab534e25394b20b8ab1c869b950690e1056a038cc09371b
MD5 0392956a5634f5b6012cd114bc68f3d3
BLAKE2b-256 cc7ac5837196c6e984cff38a34f1d9ca921a484ae2c9016a58ecfef660460911

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2d1c2342b28f168d42f0d86b3ccb0666f8db04756111173d9f9ab0b6037c8c89
MD5 fdee5b757dfd4fc5828f22bd33ccdd06
BLAKE2b-256 876260c317d4a220db2b4b4603cdc0581d224bd7030e66c8c5475c057cddf3f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp39-cp39-macosx_10_9_x86_64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 4448c3890ffffe51066b6763259548eae613c5a8f4930c78a9cf761ca247ba4d
MD5 51ecb1dab05e25c8d541d77e8f7908a8
BLAKE2b-256 fc096f5ff0870802290890f85041d3798bc2a480d14e48601b9aa2bc28d3dd59

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp38-cp38-win_amd64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 ca7b0d1343bbb95d41a200f9c16a5c14d11d75b505b7051b8cf80ce3795d69fb
MD5 435d42850610192249137f8f38171754
BLAKE2b-256 876e95db9fbe8fba6b6e887425d79ca6af49482afc3971e322f0f3fa004e5f9d

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f0794b159318203fc50bd65c4688680815750f9f6189b4a4667087a387b51c87
MD5 fcba72c464bd79ddf3957371e5c10821
BLAKE2b-256 b2249c8563ae9e0e21cfa7c58cf7db6f9d5e8741b828aa792e6b89cfdaea0e36

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp38-cp38-macosx_11_0_arm64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_manta-1.4.7.2-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.7.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fdf8ec96a56fc669c1b36d7dfdc75cc2767cf28c666f207eab683af59f4b7ca7
MD5 84018de25d4045b590d541efe5223c4a
BLAKE2b-256 1ecc475b41b0c78504f0a660d53450760b237a4f071a43587c69d12a432747a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.7.2-cp38-cp38-macosx_10_9_x86_64.whl:

Publisher: build-wheels.yml on DeepBlueCoding/python-manta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page