COWMODSКаталог модов

PlayerActionLogger (PAL)

a mod that log the client action (can be used with complemantary python script for ai commentary while playing)

Автор: gigachadfr2410обновлён 23 авг. 2026 г.
УправлениеТехнологииУтилиты

Описание

PlayerActionLogger (PAL)

PAL logs what your player does to a structured file, designed to be read by an LLM so it can commentate your gameplay live. It ships with an optional Python bot that speaks the commentary out loud.

It is client-side only: it works in singleplayer and on any server, the server does not need it, and it only ever logs your own player.

If you make a video with it, please credit this project.


What the log looks like

Every event is one JSON line, tagged with a level so a reader can tell an emergency from background noise:

The event log

LevelMeaning
INFOBackground. Mining, walking, scenery, commands
NOTABLEWorth mentioning. Kills, advancements, chat, damage
CRITICALHappening now. Deaths, low health, lava, a creeper at your back

That level is the whole point: it is what lets a commentator interrupt itself for a creeper and stay quiet through the 200th stone block.

What it tracks

  • Vitals — health, hunger, armour, XP, status effects, and when any of them turn dangerous
  • Combat — what you killed, what killed you, damage taken and where it came from
  • Mining — ore finds, session summaries, what you actually dug through
  • Building and containers — placement, chests, workstations, crafting
  • Danger — hostile mobs closing in, lava, long falls, drowning
  • World — biome, dimension, time of day, weather, height
  • Progress — advancements, level ups, vanilla statistics
  • Chat — what you say, what others say, commands you run

Live state, not just history

Alongside the log, the mod rewrites player_state.json every second — the log says what happened, this says what is true right now:

The live state file

Vitals, position, equipment with durability, the full inventory and your vanilla statistics. It means a reader can answer "how many times have I died to lava" or "what am I holding" without replaying the whole log.

The companion bot (optional)

The mod is useful on its own — anything that can read JSONL can use it. But the repository also has a Python bot that reads the log, sends it to Gemini and speaks the reply out loud, with a local web dashboard:

The dashboard

Live vitals, your inventory drawn with real item icons (modded items included — the textures are read from the jars you already have), the event feed, API quotas, and start/stop for the commentator. It runs on 127.0.0.1 only.

Versions

MinecraftLoaderNeeds
26.1.2FabricFabric API
1.21.11FabricFabric API
1.21.1FabricFabric API
1.21.1NeoForge 21.1nothing else

The NeoForge build as no dependency — it uses NeoForge's own events, so it drops straight into a modpack without dragging anything else in.

All builds are the same mod at the same version number: one feature set, whichever jar you take.

How to use

  1. Install Fabric (or NeoForge for the NeoForge build) for your Minecraft version.
  2. On Fabric, install Fabric API.
  3. Drop the matching jar into mods/ — the file name tells you which game and loader it is for.
  4. Play. Logging starts as soon as you join a world.

Where the files go: <your minecraft folder>/logs/player_actions/ — session.log for the events, player_state.json for the live snapshot.

Why

It was built for LLM commentary — having something react to your gameplay while you play — but the log is plain JSONL with nothing AI-specific about it, so it works just as well for gameplay tracking, stats, or anything else that wants to know what you did.

Source, the Python bot and issues: https://github.com/gigachadfr/PAL

Галерея

old resultcomplemantary python script web dashboard

Последние версии

Все версии →
release

PlayerActionLogger (PAL) 2.2.0

2.2.0
23 авг. 2026 г.69Minecraft: 1.21.1neoforge
Скачать
Что нового
# 2.2.0 First release since 1.2.5, and the mod has been rewritten. If you are coming from 1.2.5, read the first two sections — the log format changed and the old one is gone. ## Breaking **The log is now JSONL.** 1.2.5 wrote lines like `[19:55:06] IMPORTANT: ...`, with `IMPORTANT` and `CHAT` as the only markers. Every event is now one JSON object per line, with a type and a level: {"t":"19:57:19","lvl":"INFO","type":"kills","msg":"Killed 1x Cow."} {"t":"19:59:48","lvl":"CRITICAL","type":"death","msg":"DIED: shot by Pillager at Y=78."} Anything that parsed the old text format has to be rewritten. In exchange, a reader gets a machine-readable type and a severity instead of having to pattern-match on English sentences. **Three levels instead of one flag.** `INFO` is background, `NOTABLE` is worth mentioning, `CRITICAL` is happening right now. That is what lets a commentator interrupt itself for a creeper and stay quiet through the 200th stone block. ## It actually works in multiplayer now 1.2.5 read the player through `ServerPlayerEntity`, which only exists when your own client is hosting. On any real server it was `null`, so **the mod silently logged nothing at all** — it looked installed and did nothing. Everything now reads client-visible state only. The same code works in singleplayer and on a server, and it still only ever logs your own player. ## New **`player_state.json`**, rewritten every second next to the log. The log says what *happened*; this says what is *true* — vitals, position, biome, dimension, weather, equipment with durability, your whole inventory, status effects and vanilla statistics. It means a reader can answer "what am I holding" without replaying the log from the start. **Death history that survives restarts**, so "how many times have I died to lava" has an answer. **A lot more of the game is tracked.** Danger (hostile mobs closing in, lava, drowning, long falls), combat with kill attribution, mining sessions and first-ore finds, building and containers, what you are looking at, advancements, level ups, scenery and time of day, chat and commands. **Exact kills and damage when you are hosting.** In singleplayer the integrated server runs in the same game, so the mod reads the real damage source and who landed the killing blow instead of guessing. On a remote server it falls back to inference, as before. **Four builds:** | Minecraft | Loader | |---|---| | 26.1.2 | Fabric | | 1.21.11 | Fabric | | 1.21.1 | Fabric | | 1.21.1 | NeoForge 21.1 | 1.2.5 was 1.20.4 only. The NeoForge build as no dependency — it uses NeoForge's own events, so it drops into a modpack without dragging anything else in. ## Fixed **Block and item names were coming out in your language.** 1.2.5 used the translated display name, so on a French client a diamond ore logged as *Minerai de diamant* — and every check the mod did against English names silently never matched. Names now come from the registry, so the log is stable and English whatever the game is set to. **A long fall was announced every four seconds** instead of once, each time with a bigger number. Since `CRITICAL` interrupts whatever the commentator is saying, a single drop could talk over everything else. Now announced once per fall. **Lava was a false alarm with Fire Resistance.** Standing in lava with the potion active is not an emergency; it was shouting `CRITICAL` every five seconds through a potion you drank on purpose. Same for fire, and for a fall with Slow Falling or an elytra. **Nearby mobs flooded the log.** An unchanged group of mobs is no longer restated every few seconds — it repeats only when the threat actually escalates. ## Notes The mod is still **client-side only** and works on any server without the server having it. Files go to `<your minecraft folder>/logs/player_actions/` — `session.log` and `player_state.json`.
release

PlayerActionLogger (PAL) 2.2.0

2.2.0
23 авг. 2026 г.52Minecraft: 1.21.11fabric
Скачать
Что нового
# 2.2.0 First release since 1.2.5, and the mod has been rewritten. If you are coming from 1.2.5, read the first two sections — the log format changed and the old one is gone. ## Breaking **The log is now JSONL.** 1.2.5 wrote lines like `[19:55:06] IMPORTANT: ...`, with `IMPORTANT` and `CHAT` as the only markers. Every event is now one JSON object per line, with a type and a level: {"t":"19:57:19","lvl":"INFO","type":"kills","msg":"Killed 1x Cow."} {"t":"19:59:48","lvl":"CRITICAL","type":"death","msg":"DIED: shot by Pillager at Y=78."} Anything that parsed the old text format has to be rewritten. In exchange, a reader gets a machine-readable type and a severity instead of having to pattern-match on English sentences. **Three levels instead of one flag.** `INFO` is background, `NOTABLE` is worth mentioning, `CRITICAL` is happening right now. That is what lets a commentator interrupt itself for a creeper and stay quiet through the 200th stone block. ## It actually works in multiplayer now 1.2.5 read the player through `ServerPlayerEntity`, which only exists when your own client is hosting. On any real server it was `null`, so **the mod silently logged nothing at all** — it looked installed and did nothing. Everything now reads client-visible state only. The same code works in singleplayer and on a server, and it still only ever logs your own player. ## New **`player_state.json`**, rewritten every second next to the log. The log says what *happened*; this says what is *true* — vitals, position, biome, dimension, weather, equipment with durability, your whole inventory, status effects and vanilla statistics. It means a reader can answer "what am I holding" without replaying the log from the start. **Death history that survives restarts**, so "how many times have I died to lava" has an answer. **A lot more of the game is tracked.** Danger (hostile mobs closing in, lava, drowning, long falls), combat with kill attribution, mining sessions and first-ore finds, building and containers, what you are looking at, advancements, level ups, scenery and time of day, chat and commands. **Exact kills and damage when you are hosting.** In singleplayer the integrated server runs in the same game, so the mod reads the real damage source and who landed the killing blow instead of guessing. On a remote server it falls back to inference, as before. **Four builds:** | Minecraft | Loader | |---|---| | 26.1.2 | Fabric | | 1.21.11 | Fabric | | 1.21.1 | Fabric | | 1.21.1 | NeoForge 21.1 | 1.2.5 was 1.20.4 only. The NeoForge build as no dependency — it uses NeoForge's own events, so it drops into a modpack without dragging anything else in. ## Fixed **Block and item names were coming out in your language.** 1.2.5 used the translated display name, so on a French client a diamond ore logged as *Minerai de diamant* — and every check the mod did against English names silently never matched. Names now come from the registry, so the log is stable and English whatever the game is set to. **A long fall was announced every four seconds** instead of once, each time with a bigger number. Since `CRITICAL` interrupts whatever the commentator is saying, a single drop could talk over everything else. Now announced once per fall. **Lava was a false alarm with Fire Resistance.** Standing in lava with the potion active is not an emergency; it was shouting `CRITICAL` every five seconds through a potion you drank on purpose. Same for fire, and for a fall with Slow Falling or an elytra. **Nearby mobs flooded the log.** An unchanged group of mobs is no longer restated every few seconds — it repeats only when the threat actually escalates. ## Notes The mod is still **client-side only** and works on any server without the server having it. Files go to `<your minecraft folder>/logs/player_actions/` — `session.log` and `player_state.json`.
release

PlayerActionLogger (PAL) 2.2.0

2.2.0
23 авг. 2026 г.31Minecraft: 26.1.2fabric
Скачать
Что нового
# 2.2.0 First release since 1.2.5, and the mod has been rewritten. If you are coming from 1.2.5, read the first two sections — the log format changed and the old one is gone. ## Breaking **The log is now JSONL.** 1.2.5 wrote lines like `[19:55:06] IMPORTANT: ...`, with `IMPORTANT` and `CHAT` as the only markers. Every event is now one JSON object per line, with a type and a level: {"t":"19:57:19","lvl":"INFO","type":"kills","msg":"Killed 1x Cow."} {"t":"19:59:48","lvl":"CRITICAL","type":"death","msg":"DIED: shot by Pillager at Y=78."} Anything that parsed the old text format has to be rewritten. In exchange, a reader gets a machine-readable type and a severity instead of having to pattern-match on English sentences. **Three levels instead of one flag.** `INFO` is background, `NOTABLE` is worth mentioning, `CRITICAL` is happening right now. That is what lets a commentator interrupt itself for a creeper and stay quiet through the 200th stone block. ## It actually works in multiplayer now 1.2.5 read the player through `ServerPlayerEntity`, which only exists when your own client is hosting. On any real server it was `null`, so **the mod silently logged nothing at all** — it looked installed and did nothing. Everything now reads client-visible state only. The same code works in singleplayer and on a server, and it still only ever logs your own player. ## New **`player_state.json`**, rewritten every second next to the log. The log says what *happened*; this says what is *true* — vitals, position, biome, dimension, weather, equipment with durability, your whole inventory, status effects and vanilla statistics. It means a reader can answer "what am I holding" without replaying the log from the start. **Death history that survives restarts**, so "how many times have I died to lava" has an answer. **A lot more of the game is tracked.** Danger (hostile mobs closing in, lava, drowning, long falls), combat with kill attribution, mining sessions and first-ore finds, building and containers, what you are looking at, advancements, level ups, scenery and time of day, chat and commands. **Exact kills and damage when you are hosting.** In singleplayer the integrated server runs in the same game, so the mod reads the real damage source and who landed the killing blow instead of guessing. On a remote server it falls back to inference, as before. **Four builds:** | Minecraft | Loader | |---|---| | 26.1.2 | Fabric | | 1.21.11 | Fabric | | 1.21.1 | Fabric | | 1.21.1 | NeoForge 21.1 | 1.2.5 was 1.20.4 only. The NeoForge build as no dependency — it uses NeoForge's own events, so it drops into a modpack without dragging anything else in. ## Fixed **Block and item names were coming out in your language.** 1.2.5 used the translated display name, so on a French client a diamond ore logged as *Minerai de diamant* — and every check the mod did against English names silently never matched. Names now come from the registry, so the log is stable and English whatever the game is set to. **A long fall was announced every four seconds** instead of once, each time with a bigger number. Since `CRITICAL` interrupts whatever the commentator is saying, a single drop could talk over everything else. Now announced once per fall. **Lava was a false alarm with Fire Resistance.** Standing in lava with the potion active is not an emergency; it was shouting `CRITICAL` every five seconds through a potion you drank on purpose. Same for fire, and for a fall with Slow Falling or an elytra. **Nearby mobs flooded the log.** An unchanged group of mobs is no longer restated every few seconds — it repeats only when the threat actually escalates. ## Notes The mod is still **client-side only** and works on any server without the server having it. Files go to `<your minecraft folder>/logs/player_actions/` — `session.log` and `player_state.json`.
release

PlayerActionLogger (PAL) 2.2.0

2.2.0
23 авг. 2026 г.25Minecraft: 1.21.1fabric
Скачать
Что нового
# 2.2.0 First release since 1.2.5, and the mod has been rewritten. If you are coming from 1.2.5, read the first two sections — the log format changed and the old one is gone. ## Breaking **The log is now JSONL.** 1.2.5 wrote lines like `[19:55:06] IMPORTANT: ...`, with `IMPORTANT` and `CHAT` as the only markers. Every event is now one JSON object per line, with a type and a level: {"t":"19:57:19","lvl":"INFO","type":"kills","msg":"Killed 1x Cow."} {"t":"19:59:48","lvl":"CRITICAL","type":"death","msg":"DIED: shot by Pillager at Y=78."} Anything that parsed the old text format has to be rewritten. In exchange, a reader gets a machine-readable type and a severity instead of having to pattern-match on English sentences. **Three levels instead of one flag.** `INFO` is background, `NOTABLE` is worth mentioning, `CRITICAL` is happening right now. That is what lets a commentator interrupt itself for a creeper and stay quiet through the 200th stone block. ## It actually works in multiplayer now 1.2.5 read the player through `ServerPlayerEntity`, which only exists when your own client is hosting. On any real server it was `null`, so **the mod silently logged nothing at all** — it looked installed and did nothing. Everything now reads client-visible state only. The same code works in singleplayer and on a server, and it still only ever logs your own player. ## New **`player_state.json`**, rewritten every second next to the log. The log says what *happened*; this says what is *true* — vitals, position, biome, dimension, weather, equipment with durability, your whole inventory, status effects and vanilla statistics. It means a reader can answer "what am I holding" without replaying the log from the start. **Death history that survives restarts**, so "how many times have I died to lava" has an answer. **A lot more of the game is tracked.** Danger (hostile mobs closing in, lava, drowning, long falls), combat with kill attribution, mining sessions and first-ore finds, building and containers, what you are looking at, advancements, level ups, scenery and time of day, chat and commands. **Exact kills and damage when you are hosting.** In singleplayer the integrated server runs in the same game, so the mod reads the real damage source and who landed the killing blow instead of guessing. On a remote server it falls back to inference, as before. **Four builds:** | Minecraft | Loader | |---|---| | 26.1.2 | Fabric | | 1.21.11 | Fabric | | 1.21.1 | Fabric | | 1.21.1 | NeoForge 21.1 | 1.2.5 was 1.20.4 only. The NeoForge build as no dependency — it uses NeoForge's own events, so it drops into a modpack without dragging anything else in. ## Fixed **Block and item names were coming out in your language.** 1.2.5 used the translated display name, so on a French client a diamond ore logged as *Minerai de diamant* — and every check the mod did against English names silently never matched. Names now come from the registry, so the log is stable and English whatever the game is set to. **A long fall was announced every four seconds** instead of once, each time with a bigger number. Since `CRITICAL` interrupts whatever the commentator is saying, a single drop could talk over everything else. Now announced once per fall. **Lava was a false alarm with Fire Resistance.** Standing in lava with the potion active is not an emergency; it was shouting `CRITICAL` every five seconds through a potion you drank on purpose. Same for fire, and for a fall with Slow Falling or an elytra. **Nearby mobs flooded the log.** An unchanged group of mobs is no longer restated every few seconds — it repeats only when the threat actually escalates. ## Notes The mod is still **client-side only** and works on any server without the server having it. Files go to `<your minecraft folder>/logs/player_actions/` — `session.log` and `player_state.json`.
release

PlayerActionLogger (PAL) 1.2.5

1.2.5
9 окт. 2025 г.61Minecraft: 1.20.4fabric
Скачать
Что нового
more information complemantary python script and source code on https://github.com/gigachadfr/PAL/tree/main