out. It
only reads the game — it can't change or break anything in it.
1. Make sure AFK Journey is installed and you've opened it at least once (so its data is downloaded).
2. Open the Terminal app: press ⌘ Space, type Terminal, press Enter.
3. Copy this box and paste it into Terminal, then press Enter. It installs three small helper libraries.
python3 -m pip install --user pycryptodome lz4 lupa
That's it for setup. You won't need to do this again.
Copy the whole box, paste into Terminal, press Enter. This pulls all the hero/skill tables and every language you have installed. It takes a few minutes (it processes around 800 skill files).
cd ~/git-repos/afkj-parser
./afkj-extract
When it finishes you'll see DONE and how long it took. Your files are in the out folder.
With the game closed, paste this box. It reads the game (including all 17 languages from the game's server), then builds the feed stargazer imports and checks it.
cd ~/git-repos/afkj-parser
./afkj-extract --locales-from cdn
./afkj-parse build
The last line says PASSED or FAILED. Above it, one line per check, and a
summary of what changed since the last time stargazer imported, such as new heroes or a new season's artifacts.
Lines starting with ! are worth a read; lines starting with ✗ are why it failed, with the fix
suggested on the line under them. When it fails, the feed stargazer reads is left as it was.
To see exactly what changed for one hero (old text above new, changed words marked):
./afkj-parse diff --hero karma
Then import in stargazer as usual (npm run import:seasonal there). Once that's done, come back and
record this feed as the one stargazer has, so the next update is compared against it:
cd ~/git-repos/afkj-parser
./afkj-parse accept
Travelling with only a tablet? The update works without the local machine and without the game. A Claude Code session on
the web does it from a public copy of the game data. On claude.ai/code, start a session with both
afkj-parser and stargazer selected, and send it this:
Update stargazer from the fallback data and push a branch: follow docs/integrations.html section 2.3.
It builds the feed, imports it into stargazer and pushes a branch there. Read the changes on that branch, then merge it. Text and numbers update this way. New pictures, a new hero's page and the filter check wait until you are home, because they need the game installed on the local machine. The full steps, and what has not been tried yet, are in Integrations §2.3.
With the game closed, paste this box. It reads every hero's battle code, compares the filter tags with stargazer, rebuilds the Debuff and Haste sweeps and the review page, and lists any debuff or Haste the rows don't cover yet.
cd ~/git-repos/afkj-parser
make audit
open out/tools/stargazer-filter-audit.html
Start at Needs review at the top. It lists heroes new since the last review, heroes in the game data that aren't on stargazer yet, a note if the game data changed, rows the code check found that nobody has reviewed, and Debuff or Haste sweep sites with no row. Treat those rows as a starting point and check them before changing stargazer. Details: Battle scripts §8.
Once everything is reviewed and stargazer is updated, record it so the next check compares against it:
python3 tools/stargazer_filter_audit.py --mark-reviewed
To see what came out, paste this — it opens the folder in Finder:
open ~/git-repos/afkj-parser/out
Inside raw you'll find locales (the game text, one file per language) and tables
(heroes, skills, and more). api is the feed stargazer imports, once you've built it (next section).
Shows what it would do — which languages you have, what's missing — and writes nothing.
cd ~/git-repos/afkj-parser
./afkj-extract --list
cd ~/git-repos/afkj-parser
./afkj-extract --only loc
Example: only heroes and their status effects.
cd ~/git-repos/afkj-parser
./afkj-extract --only tables --tables Unit,SkillBuff
The tool can only save languages your game has actually downloaded. To add one: open AFK Journey, switch to that language in Settings (let it download), quit the game, then run:
cd ~/git-repos/afkj-parser
./afkj-extract --only loc
Tip: run the Preview box above first — it lists which languages are present vs
missing.
Or skip selecting languages: this downloads all 17 straight from the game's servers, checking each file as it arrives. It first checks that the servers have the same game version you have installed; if not, open the game, let it update, quit it, and run it again.
cd ~/git-repos/afkj-parser
./afkj-extract --only loc --locales-from cdn
Either way the languages land in out/raw/locales/.
The game's pictures can be saved as normal PNG files. There are a lot (~12,000), so this is separate and you'll usually want to grab just some. First, one extra one-time install:
python3 -m pip install --user Pillow texture2ddecoder
Then, for example, just the hero head icons:
cd ~/git-repos/afkj-parser
./afkj-extract --only textures --textures "*herohead*"
They land in out/raw/textures. Leave off --textures "*herohead*" to get everything (slow —
thousands of files). Change the text in quotes to match other names (e.g. "*avatar*").
Type the hero's name as it appears in the game (capital letters don't matter). This saves every picture of that hero: their portrait, the big recruitment art, skins, and small icons. Needs the image install above.
cd ~/git-repos/afkj-parser
./afkj-extract --only textures --hero Karma
It prints which hero it found (e.g. Karma -> #132 Karma (codename 'doublehead')). Inside the game's
files, heroes go by a number and a codename rather than their name, so the file names use those. Where to look in
out/raw/textures/icon:
| Folder | What's there |
|---|---|
hero | The portrait card from the hero list (spui_herohead_132.png) |
heroult | The tall portrait shown during the ultimate |
tavern | The biggest full-body art (the …hero_timeline… file), from the recruitment banner |
heroskin | Skin portraits and art, if the hero has skins |
For several heroes at once, separate the names with commas: --hero "Karma,Ravion".
This saves every hero's portrait (the picture on the hero card) with the same file names stargazer uses, plus each hero's skin portrait. Needs the image install above.
cd ~/git-repos/afkj-parser
./afkj-extract --only portraits --reference ../stargazer/src/assets/images/character
What you get in out/images/heroes:
| Where | What's there |
|---|---|
out/images/heroes/ | One picture per hero, named like stargazer's (karma.png). Ready to copy over stargazer's pictures. |
alt/ | Skin portraits (igor_alt.png). These are for chaldea; don't copy them into stargazer. |
manifest.csv | A list of every file and which hero and game file it came from. Its in_reference column says no for heroes stargazer doesn't have (for example story-only units): leave those out unless you're adding that hero. |
A full portrait run replaces the folder after extraction succeeds. A run with --hero updates only those heroes and keeps the other pictures. Failed extraction preserves the previous folder. To copy the pictures into stargazer:
cd ~/git-repos/afkj-parser
python3 -c "import csv, shutil; [shutil.copy('out/images/heroes/' + r['file'], '../stargazer/src/assets/images/character/') for r in csv.DictReader(open('out/images/heroes/manifest.csv')) if r['in_reference'] == 'yes']"
That copies only the heroes stargazer already has (in_reference is yes).
This saves the artifact pictures with the file names stargazer and chaldea use. Needs the image install above.
cd ~/git-repos/afkj-parser
./afkj-extract --only artifacts
What you get in out/images/artifacts:
out/images/artifacts/ | The six artifacts every season has (starshard.png, …, named like stargazer's src/assets/images/artifact/) and the current season's (vine-snare.png, …, named like chaldea's dist/img/seasonal/artifact/), in one folder. |
manifest.csv | A list of every file and which game file it came from. Its set column says which are the six (pre-season) and which are this season's (season). |
When a new season starts, tools/seasonal_icons.py picks this season's pictures out by
that column and makes the .webp and .avif copies. You don't need to
replace the six permanent ones or the current season's: stargazer's six are cleaner copies than the game's, and
chaldea's match. The checks behind that are in
Architecture → Artifact & icon export, which also covers
stargazer's other icons (class, faction and so on). The game's copies of those aren't better either.
cd ~/git-repos/afkj-parser
./afkj-extract --only phantimals
You get out/images/phantimals/: one picture per Phantimal this season (gervan.png, …),
named like chaldea's dist/img/seasonal/phantimal/, plus a manifest.csv. A Phantimal that
fights as two units (Wedge of Matter and Wedge of Power) gets two pictures.
| You see… | What to do |
|---|---|
No module named afkj_extract or command not found |
Make sure you pasted both lines of the box (the cd … line first), and that you did the one-time setup above. |
No module named 'lupa' (or lz4 / Crypto) |
Run the setup box again: python3 -m pip install --user pycryptodome lz4 lupa |
No module named 'texture2ddecoder' or PIL (images) |
Run: python3 -m pip install --user Pillow texture2ddecoder |
no playable hero matches … |
Check the spelling. The message suggests close names (did you mean: …). |
AFK Journey appears to be running |
Quit the game, then run the box again. |
no sandbox container… |
Install AFK Journey and open it once (let it finish downloading), then try again. |
| It's taking a long time | A full run processes ~800 skill files — a few minutes is normal. Use --only loc or
--only tables --tables Unit for quick runs. |
out folder. After a game
update, run the full box again to get the latest data.