What it reads

All eight .sl2 variants. Each one renders in its own status screen, skinned to that game.

  • Dark Souls Remastered. Identity, class, sex, every attribute, souls, humanity, play time, deaths, the full inventory, held boss souls, twelve boss-defeat flags, and all 43 bonfires with how far each one is kindled. Dark Souls is the only game here that records a bonfire you found but never lit, so it is the only one that can tell you.
  • Dark Souls: Prepare to Die. The same, at the same depth. Both releases keep the same stat block. Only its position differs.
  • Dark Souls II: Scholar of the First Sin. Attributes, class, covenant with rank, sex, hollowing, deaths, play time, and an inventory that names infusions and reinforcement levels. All 77 bonfires by area, and bosses counted from three separate signals that have to agree.
  • Dark Souls II, vanilla. The same depth as Scholar. The two releases differ by one encryption key and nothing else.
  • Dark Souls III. The deepest read here. Attributes, souls, play time, embered state, NG+, the full inventory with infusions and +N, all 77 bonfires by name, bosses from two independent flag sets, covenants joined, rewards from 57 NPCs, which Lords of Cinder are on the throne, and 426 world items picked up across six areas. It also tells you which of the bosses still alive you can reach right now.
  • Elden Ring Nightreign. The character list and the Steam account that owns the file, and nothing further. The save itself is not the obstacle: it decrypts completely, and every one of its fourteen blocks proves its own checksum, which is how the key was confirmed rather than assumed. What is missing is that relics, unlocked Nightfarers, Murks and Sigs and the Nightlord kills have one save behind them so far, and one save cannot contradict itself.
  • Sekiro. The odd one out. No name, no attributes, no levelling, because the game has none of them. What it does have is the one thing nothing else here can do: Attack Power rises by exactly one per Memory consumed, so a boss whose token you spent hours ago is still counted. Play time, journey, Sen, max HP and Posture, everything carried, key items, the storage box, boss kills and Sculptor's Idols from their own event flags. Both flag sets reset when you start a new journey, so an NG+ save honestly reports fewer than the character earned.
  • Elden Ring. Identity, attributes and runes in full. Weapons, armour and ashes named by type, so armour can never come back as a weapon. Remembrances held, and the bosses they prove dead. Talismans, spells and goods sit in a part of the save that moves between patches and is not parsed, so that item list is partial. The page says so where the list is.

A slot drops to inventory only rather than print an attribute it cannot verify. A save holding several characters gets a tab each, and every export button writes the whole file: every slot, not the one you happen to be looking at.

What that looks like

Real saves, read by this page. Each one keeps its own game's colour, sampled off that game's own menus. Click any of them for the full image.

Dark Souls III character read by this page: level 92, attributes, souls, covenant, play time and the four Cinders of a Lord
Dark Souls III, at four Cinders of a Lord
Dark Souls II character with its full derived-stat panel
Dark Souls II, with the whole derived panel
Sekiro character: Sen, Attack Power, Vitality, max HP and Posture, and the Memory bosses count
Sekiro, which has no level to show
Elden Ring character: rune level, all eight attributes, runes held and max HP
Elden Ring, stats checked against the roster
Bonfires discovered, listed by area, with the ones still missing named
Bonfires by area, and the ones still missing
Combined mode: one timeline across several runs and several games
Combined mode: a folder of backups, as one history

How it works

A .sl2 is one packed archive of blocks. Most of them are encrypted, one per character, and a few more hold the world. The page unpacks the archive, decrypts each block with the key the game itself ships, and reads fields off positions the community mapped over years.

Parsing runs on a background thread, so a nine megabyte save does not freeze the page, and only the tables for the game you dropped get fetched. After the first visit it works offline. The page, its code, its font and the tables it has already used are cached, so you can read a save on a plane.

There are three ways to take the reading with you. Copy Markdown is the one to paste into an LLM, since it cannot open a .sl2 but reads Markdown fine. Download .md is that same text as a file. Download .json is the same data written for a program, against a published schema, and byte for byte identical to what the command line tool writes. One thing to know before you consume it: a field is there only if it was read. Dark Souls III keeps no death counter, so a DS3 character has no deaths key at all. Not a zero, not a null.

Every game hides its data somewhere else

  • Dark Souls II. Vanilla and Scholar use different keys over an identical layout, so the page tries both and reads whichever one opens. Which release you have is decided by which key works, not by a guess. Bonfires and boss kills come from a second world block the game keeps well away from the character.
  • Dark Souls, both releases. The character block moves as the save grows, so a fixed offset is worthless. Remastered is found by a marker that always sits beside it. Prepare to Die has no such marker, so it is found by your character's own name.
  • Dark Souls III. The stats move between patches, so the block is located by content instead of position: the nine numbers that add up to your level. That is the game's own formula, so a false match is close to impossible.
  • Elden Ring. The same trick with eight numbers, plus every owned item read straight out of the game's item array.
  • Sekiro. The easy one, for once. Nothing is encrypted and nothing moves between patches. Each item record carries a type code beside its ID, which is why a piece of armour can never come back named as a weapon.

Two rules, and neither one bends

It never prints a number it cannot verify. If a stat block fails its own check, that slot drops to inventory only and the attributes are simply gone. A missing field costs you nothing. A wrong one quietly tells you your character is something it is not, and you would have no way of knowing. So the field goes.

Progress is a floor, not a ceiling. A boss counts as dead only when the save still proves it: the soul sitting in your pack, a defeat flag, or a place past it you could not have reached with the boss alive. Kill a boss, spend the soul, leave no flag and no gate behind you, and it stays off the list. The tool under-claims on purpose. Everything it shows you happened. There is simply more that it cannot see.

Changelog

2026/08/19Elden Ring Nightreign opens. Its saves decrypt, and the character list and Steam account are read. Only those: the file gives up relics, Nightfarers and Nightlord kills too, but with one save to check against they are not printed. The key was not taken on trust — every Nightreign block carries a checksum of its own contents, and all fourteen agree
2026/08/19 • The character field that reads Male or Female is labelled Sex now, not Gender. Those are the values the games store, so the label moved rather than the values. The JSON key keeps its old name, because renaming it would break anything already reading the export
2026/08/18 • Screenshots, and a set of them on this page. One card per game read from a real save, the bonfire list, the inventory and the combined timeline, plus a social card rebuilt against the new plate. Under half a megabyte for the lot, and they load only when you scroll to them
2026/08/18How to contribute written down. The short version: send a save. A report needs the file, the line this printed and the line it should have printed, trimmed to that — and a pair of saves with one thing changed between them is worth more still, because that is what pins the fields no published editor knows
2026/08/18 • Elden Ring item names now come from the game's own tables instead of a community list. The list had 83 names wrong outright and 35 more with the accents stripped, and its Ashes of War table held 239 rows between 120 names, sixteen of them all reading "Ash of War: Lion's Claw"
2026/08/18Unarmed and the bare Head, Body, Arms and Legs no longer appear in an Elden Ring inventory. They are what the game puts in an empty equipment slot, so every character was carrying all five
2026/08/18 • Elden Ring's item array starts at 0x30, not 0x20. Entries vary in length and take their stride from the id just read, so the old start drifted through the whole array. 148 of 182 test characters were reading item categories that do not exist
2026/08/18 • Elden Ring stat blocks are not aligned to four bytes, so the old search stepped over three quarters of every character and found 29 of 182. Five more were worse than missing: they read levels of 2, 13, 22 and 25 for characters the game puts at 125, 150 and 160. The search follows the level field now, and every candidate is checked against the character list the save keeps separately
2026/08/18 • 170 more Elden Ring characters in the test set, each one documented with its own in-game status screen to check the reading against. That is what turned up all three faults above
2026/08/18 • The README now says how much testing sits behind each game. 260 saves and 442 characters, and which games have been walked end to end rather than sampled
2026/08/18 • Interface rebuilt against a screenshot of the Dark Souls III inventory screen, with its plate colour, its barely-there separators and its burnt orange selection bar sampled straight off the image. Georgia throughout, with adobe-garamond-pro first in the stack for anyone who owns it
2026/08/18 • Page rebuilt as the menu itself: one slab over the scene with its edges feathered, the list down the left, the status box on the right, the category strip across the top and the button prompts along the bottom
2026/08/18 • Sekiro world pickups. The 5xxxxxxx pickup flags live at category k = map_k + 66, which makes 589 of 826 curated rows readable
2026/08/17 • Sekiro miniboss roster regenerated from the installed game instead of a community list. It came back with 37 rows where the list had 33, including all five Headless
2026/08/17 • Local game-file reader added: archive unpack, MSB maps, EMEVD events, roster. Sekiro needs Oodle Kraken, DS1 to DS3 need nothing
2026/08/15 • More DS3 event flags wired in
2026/08/14 • Doxygen documentation, themed and deployed with the site
2026/08/14 • Sekiro event flags solved and shipped. Boss kills and Sculptor's Idols now come from their own flags rather than from what is in your bag
2026/08/13 • Sekiro key items, the storage box, and minibosses
2026/08/12 • Sekiro Vitality found at 0x34498. Ten candidates were killed by arithmetic before that one survived
2026/08/12 • Four saves scanned for a field that turned out not to be in them, and nothing shipped. That is the honest outcome and it gets a line too
2026/08/10 • The Steam account that owns the file, read from the save itself
2026/08/10 • Longer item lists in every game, and a restructured README
2026/08/09 • Sekiro support: play time, journey, Sen, Attack Power, max HP and Posture, and everything carried, each item named against its own type table
2026/08/09 • All 426 DS3 world pickups across six areas
2026/08/09 • Six regressions from the previous session found and fixed before anything new went in
2026/08/08 • Combined mode. Point it at a folder and get one cross-game history with a journey chart and a save tree per run
2026/08/08 • DS3 endings
2026/08/04 • Bug fixes
2026/08/01 • JSON export against a published schema, byte for byte identical to the command line tool
2026/08/01 • Codebase split into the sl2 package, with sl2_to_md.py left as the entry point
2026/08/01 • MIT licence added
2026/07/28 • New icon and social card
2026/07/27 • GitHub Actions deploys the site on every push
2026/07/27 • Dark Souls Remastered and Prepare to Die read in full: gender, deaths, play time, derived stats
2026/07/26 • The DS3 flag addressing formula, which is what made bonfires, bosses and pickups readable at all
2026/07/26 • Vanilla Dark Souls II reaches full tier, and DS2 bonfires group by area
2026/07/23 • DS3 embered state, and three rounds of flag-scan speedups
2026/07/14 • Website overhaul
2026/07/13 • Attributes on the web app
2026/07/12 • Ported to the browser. Before this it was a Python script and nothing else
2026/07/11 • All five game families curated
2026/07/08 • Support for every game in the command line tool
2026/07/07 • First commit

Type and colour

The whole page is set in one face: adobe-garamond-pro if you have it, and Georgia if you do not. Adobe Garamond Pro is what FromSoftware actually uses for the Dark Souls games and for Sekiro's Latin text. It is not redistributable, so it sits first in the stack and resolves only when it is already installed on your machine or an Adobe Fonts kit is added to the page. Georgia carries everyone else. Nothing is downloaded either way, which is part of why this page still makes no cross-origin request at all.

Elden Ring uses Agmena, which is a Garamond with squarer serifs. Demon's Souls is closer to Pinnacle JY or ITC Galliard. Sekiro's decorative Japanese, including the 死 pop-up, is 白舟極太楷書. None of those are free either, and the fallback for all of them is the same system serif.

Where the colours come from

Every accent here is the colour that game prints its own overlays in, measured by the FromSoft Image Macro Creator. Dark Souls lights a bonfire in rgb(255,228,92), Dark Souls II in rgb(255,177,68), Dark Souls III in rgb(255,206,86). Elden Ring finds a lost grace in rgb(220,135,56). Sekiro writes in white and kills you in rgb(183,48,44). They are used flat and pulled down a stop for a dark room, as rules and values and one filled chip, with none of the bloom the games draw behind their text. The colour is there to tell you which game you are reading. Nothing else has to.

The grain on the page and on every panel is one patch of fractal noise drained of colour, which is the same trick the macro creator uses on its own boxes.