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.6.0-cp313-cp313-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.13Windows x86-64

python_manta-1.4.6.0-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.6.0-cp313-cp313-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

python_manta-1.4.6.0-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.6.0-cp312-cp312-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.12Windows x86-64

python_manta-1.4.6.0-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.6.0-cp312-cp312-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

python_manta-1.4.6.0-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.6.0-cp311-cp311-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.11Windows x86-64

python_manta-1.4.6.0-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.6.0-cp311-cp311-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

python_manta-1.4.6.0-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.6.0-cp310-cp310-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.10Windows x86-64

python_manta-1.4.6.0-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.6.0-cp310-cp310-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

python_manta-1.4.6.0-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.6.0-cp39-cp39-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.9Windows x86-64

python_manta-1.4.6.0-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.6.0-cp39-cp39-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

python_manta-1.4.6.0-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.6.0-cp38-cp38-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.8Windows x86-64

python_manta-1.4.6.0-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.6.0-cp38-cp38-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

python_manta-1.4.6.0-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.6.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d3b0cf3e0da6e70d8bcf3bdca1ba34a11c1181a70a7b252533224986cbe45392
MD5 30f586ffb262c367b2d20f14e1fef59c
BLAKE2b-256 baf7409286d416028c53a135b34d132c4657225a970680eef1da99fa8710e9fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-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.6.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 1c837ddc61cd7dbd6fac231e09891151272434186ba6e0fa5934f46a0cec54d6
MD5 85731c2d344a8da4f2b3d991a71b438d
BLAKE2b-256 a9cbe4b7a463c23571a7a0df1a4fb117fbd9c2604242c938402ebe96edd0f192

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7156724e53a0a86c079f7d886d20704ee2eec63cfbf57a7ad853b5b606375ff9
MD5 1ece16dffd152c519bbe1e52bda90add
BLAKE2b-256 03b1800fb7fcf1a5accbb19fc981fd39de8cc8c91c989eb682662c935e2ed8cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 32e85a869948c36f75141d1c31fc4ec0bed73c9f7587729adfe98e7da37844ec
MD5 52ac380917cae85df77d70ebfc7269b2
BLAKE2b-256 0f068b8cbdbe058e2e1adeae9f36bef31a453bdb3ac8747d201f53ec23ed3dca

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 5cd9cdd361805c329e5f667847c5ee81184031e61c9cd92b6594d583ea8061f9
MD5 2f93b40cc7ccc896c474e9e205e511ca
BLAKE2b-256 884ef4fd04140594289d30a3f6ab02f2a6c4f552249118a1f5f1b4156b1a3d13

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-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.6.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 22702c02c5ba0d5e32b1d1250424a0edb0cdca1f88c7d69111c89404499e84b8
MD5 64a051513d5c3e62878606918b15bca5
BLAKE2b-256 275662f2bf857380cb470cdb0c3a654dfc7643c1b403a97f4931f63c3021ffbf

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 32f9f42b85f65033be4354e3a809220271d83991c58b94c7537c22cb7e05c7f2
MD5 6948b1a9894fda8af552f4fd3eeab3ce
BLAKE2b-256 603782c51153156b8eb1fa63f14204f7dd33522f1e33c8b317fa720e99b300a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 8c8075f27fe29d93a25a53bbf8b8b7bd5f69be15167e5a6a32183f41a82b6d66
MD5 425e50e5e8f81137c56d6b4528994e30
BLAKE2b-256 84ce0a267b611375a1a1e6e178a3f741d1b95fd0f966cbdc1840e7839c651980

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 89af43b4403dbc48cf2a0fcebca7f6268fd657404cf08f1f7cdef0263ff51306
MD5 0ec94aff3e0183957b85b8586ffec38c
BLAKE2b-256 9b07bb5920f73b8429dbe62d228ec4d272c4d81db85b27f482cffb23e530551c

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-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.6.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 fad449a658aa2ba277adef43874424dccd555fd29e4c8cba2b520dd56192cfa5
MD5 1ab33abc56ec0849d2f4aee23e34b2cf
BLAKE2b-256 464489f146c4cce7158cb79069b9afd95b743da3b0201990f8ddf6398e5ee4cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9a04c44350de18cad83afd9dcfca21d8ace676706dbecd3c20324a455685e285
MD5 ae345e1bc80bf78176e0b607b3d60b40
BLAKE2b-256 e63149797a6622c4d80e6cf0d526e678c65579065b48f88bc6c7a5b38d2bcdbb

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 cbc1d5932e8fbf4a3df256740a00a517bae7b7526b74979093e92c6f8eab5fd6
MD5 c7dbdcdbd1949f3a9e3ac41e107634e1
BLAKE2b-256 8fe8bec468363d4977e5b999cd8104ab7cfbe8a723b4c7ca44a9b2277e2b9af6

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b404dd00965ad501aa3c0f3e27ef743231793faedc4e635f19054f516180ad22
MD5 15b530745507644bf02430e1f4c41ed9
BLAKE2b-256 8d64b0980037ee7b6f099bac6da83732450bcc52ac0b5c226cde221f2d4dc1a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-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.6.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 ec2460b4f973fca847452eea91b01412f0fad87958179cb4509c0ff0f068d259
MD5 6c25f4ab842a2174637dede3ac9a2fbf
BLAKE2b-256 89b61332dcbea26b980dbb6c440a074e5dbe65e1d5f7bf51bacf0c008eb850c4

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e68b3adbe8e082dba9a04bbb9dcf0207fef22025f18204b967e8c807f181bc4c
MD5 aa5457187abc8e0fcbe10b31389ffaad
BLAKE2b-256 80217ea689740dea1f22f24c8ed671988a44d5e987617b82b1d725b59c5f7407

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 67154dc1d1d0b9ef5e3cbcfa60fff3a1c60bfb46e79231b0e53e4423689746de
MD5 60d1d63bb8179e378a65033f524b71fd
BLAKE2b-256 31a56c10ed2bb5a9e4394e24a373e5329b9987250d50a43fea12510715a78227

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 42a18ad010ccefd8369d2c26479cff15c423eae6553c8ad906364128ed225d51
MD5 d6e306c83eb9fbf51d7f00ae59b74de3
BLAKE2b-256 13a5f3047e6cffffdad0c03b41049cb0efbc7f2fa7ece1245541add2b945583f

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-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.6.0-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 eacf79953d34e24287c37bc165b772e8575e0ed6d014775e88110ebfb4f9741e
MD5 319a14b3f4794bbfbcb3365aabc0a6d4
BLAKE2b-256 60555c9d077f9fc4b922b7d853939320e7d92d685aeab26bd8ef9c29d83d3d77

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b1affd73cc0437ab3d72b4b18b0b11afa1fbc3321c51c57196cb9ed55c5e6dbb
MD5 412a3d4eae7706a3a2f7d277ecc9e037
BLAKE2b-256 c8483fc80971ac9a0700bf35b4c5554673731cba99a21cacdd2955d5f6a5b0f4

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 407613b0e61e7a663844bd79c94229fb7131230cb4a578beb7c076ac222a4532
MD5 fcce0b17c472bd98706a44fc27370bcd
BLAKE2b-256 f530a11e0704dfcb52372324f55714ca75b8b233a5fd124bf8f8f484e7e85550

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 fa01191b84fce8365dd9ed2defb9cb0b634376a377a67720e91fbbaf5e4c6d6a
MD5 6652eb5dc7b38b12d1bca281d5fdf9ea
BLAKE2b-256 7a56f8bcb02af97d74b4c3212c52a129c134536f55904c545c0599851995f66e

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-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.6.0-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 4669ba5957a77f9c301f30a79b54942fdf12c1e0c417908919bb9cc3c6e1f47b
MD5 8e520ac0a04a102dd669ebe4037d78fa
BLAKE2b-256 cc6d8ff8227c78c4cb3bc68e97eae35e286e3bc311d36a2e444c6f5aa51638e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4139efeed046c9e9e2ea706fdd85461e2535f5b1db75188bb13f093f2ca8243e
MD5 00ba9796a514cb669baeacd368b0d6b4
BLAKE2b-256 dd20747c69aba5c4cad939e36257d6789de43e546d254f2ca3dfaa39cc462d09

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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.6.0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_manta-1.4.6.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 30d2b6debac5d6d9ebc0fd5c64885ed8a26dbe0473ddca9b2f9ee134475b59c0
MD5 aef0818baea09b23bd0e32acbd0e21c2
BLAKE2b-256 c4592abba5aac3483a1ab04b6556762033bf4021fc78ad1d50e09cb4bd2aa9ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_manta-1.4.6.0-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