Skip to content
dream_archive

dream_archiveChangelog

Changelog

Every release of dream_archive, newest first. A release marked unreleased is declared in mod.toml and published when its tag is pushed.

Releases

13 declared

  1. 2.0.0 stable 2026-10-21

    dream_archive is a Jess package, written in Luau; the Rust crate continues on the rust branch at 1.1.0.

    Breaking changes

    • The library is the Jess package org.dreamweave.dream-archive, module @dream-archive, installed with jess rather than Cargo. The Rust crate dream_archive stays at 1.1.0 on crates.io and on this repository's rust branch, and is no longer developed on main.
    org.dreamweave.dream-archive-2.0.0.jpk 255.3 kB · jpk
    Verify · sha256 281c27bf86a2…623035730
    Release
    2.0.0 (stable)
    Size
    261432 bytes
    SHA-256
    281c27bf86a2b9ea14dc9baa4959a9a9d213784332acfefcc9a9a9e623035730
    Commit
    7af9ffda3828
    Package
    org.dreamweave.dream-archive
    Content digest
    2542758bf2af0319bcecca13eb44158c43b87733d207eb02f13d647412ee9dc1
    Sources
    1

    Check it yourself: sha256sum org.dreamweave.dream-archive-2.0.0.jpk must print the digest above.

  2. 1.1.0 stable 2026-09-30

    Relicensed as MIT OR Apache-2.0 and built on l3i 1.1.0.

    Changed

    • Relicensed from GPL-3.0 to MIT OR Apache-2.0: this is the first release under the new terms, and releases up to and including 1.0.0 stay GPL.
    • Requires dream-path 1.1, its first MIT OR Apache-2.0 release.
    • l3i 1.1.0 comes from crates.io; the @dream/archive module is unchanged.
    dream_archive-1.1.0.crate 7.1 MB · crate
    Verify · sha256 ef05ce9b63b8…01dbc24c7
    Release
    1.1.0 (stable)
    Size
    7404128 bytes
    SHA-256
    ef05ce9b63b87ff34e29708aa5d58829608063a64cf236420adbba101dbc24c7
    Commit
    6cf4005005b5
    Sources
    1

    Check it yourself: sha256sum dream_archive-1.1.0.crate must print the digest above.

  3. 1.0.0 stable 2026-09-29

    First stable release: the Luau binding is an l3i extension providing @dream/archive, every archive family looks entries up by hash, and lookups and zlib reads allocate less.

    Breaking changes

    • The luau feature (lua is the old name of the same feature) binds the crate as an l3i extension, luau::ArchiveExtension, providing @dream/archive. dream_archive::lua, the mlua types and the standalone-lua feature are gone.
    • Building with the luau feature needs l3i's toolchain: clang, lld and cross-language thin LTO.
    • Every open* in Luau returns the one Archive type; archive:entries() is a view of entry handles, not a table of tables.
    • Luau entry hashes are integers: entry.hash and entry.folderHash replace the old tables and fields, with hashHex and folderHashHex for the hex spelling. BA2 hashes are directoryHash, fileHash and extensionHash; sizes and offsets are size, storedSize and offset on every format.
    • Luau integer arguments must be exact: readEntry(1.5) is an error instead of a rounded read.
    • bsa::Error::InvalidFileRecordFlags is gone. Nothing returned it: both flag bits of a TES4 file record are read as the format defines them.

    Added

    • get_by_hash, get_id_by_hash and contains_hash on every archive family, get_id by path, and HashFields::from_numeric.
    • archive:readInto(entry, buffer, offset) in Luau decodes a member straight into a buffer, and archive:getByHash and archive:containsHash take the family's hash shape.
    • Luau type definitions for the whole module, checked by Luau's own type checker in the tests behind the luau-analysis feature.
    • toBuffer() on every Luau builder; only ba2.Builder had it.
    • dream_archive::flate2, the re-exported flate2 whose Compression set_zlib_level takes, so naming a zlib level needs no flate2 dependency of your own.

    Changed

    • Path lookups normalize into a stack buffer instead of allocating: contains over 4096 distinct paths takes 0.39 ms instead of 1.03 ms (TES3) and 1.43 ms (TES4).
    • zlib members inflate from the archive through one inflater per thread: a 64 KiB TES4 member reads in 18 µs instead of 68 µs.
    • Walking entries from Luau is 5 to 23 times faster than with mlua, and small calls such as contains and readEntry take about half as long: 4096 TES3 entries take 0.73 ms instead of 6.15 ms.
    • dream-path 1.0 and l3i 1.0.0 come from crates.io; Rust 1.92.

    Fixed

    • Dx10Builder::add_dds_bytes and add_dds_file take DDS files whose depth field is 1, as many tools write for ordinary textures. A DDS file is a volume texture only when its flags have DDSD_DEPTH or its caps have DDSCAPS2_VOLUME.
    • A cubemap's extended DX10 DDS header has an array size of 1, one cube, as the DDS format and DirectXTex count it: extraction wrote 6, which DirectXTex-based tools read as six cubes, and add_dds_bytes and add_dds_file refused cubemaps saved by texconv. Cubemaps extracted by earlier versions, which say 6 over one cube's data, are still accepted.
    • Every family matches a lookup path the same way, with dream-path's normalization. BA2 lookups kept repeated separators and dropped a trailing one, so meshes//door.nif missed and meshes/door.nif/ found a member a BSA answered the other way round; hash-only TES4 lookups missed a//b/c.nif. Archives without names now hash the normalized path.
    • Luau entry.name is the part of the path after its last separator in every family. For a BA2 entry it was the whole stored path, the same as entry.path.
    • Luau entry.folder is "" for an entry at the root of a TES3 archive or a BA2, as it was for TES4, instead of nil; nil means the archive stores no names.
    • The crate builds with only the ba2 feature: it now enables the lz4_flex feature its compressor needs, which only bsa-tes4 turned on before. Builds with one BSA family alone no longer carry dead code.

    Migration

    Compose dream_archive::luau::ArchiveExtension into the host's l3i RuntimePlan. A host that still wants the dreamArchive global adds RuntimePolicy::compat_global("@dream/archive", "dreamArchive"). That release's Embedding Luau page listed what scripts must change; the Luau port's documentation replaces it.

    dream_archive-1.0.0.crate 7.1 MB · crate
    Verify · sha256 fe94718bdde6…1743d2225
    Release
    1.0.0 (stable)
    Size
    7408572 bytes
    SHA-256
    fe94718bdde6117e633510a184a036c88bad99d0a745c0d18de21301743d2225
    Commit
    94f37c74ce28
    Sources
    1

    Check it yourself: sha256sum dream_archive-1.0.0.crate must print the digest above.

  4. 0.2.3 stable 2026-09-27

    Fixed

    • TES3 entry hashes are read low half first, so Entry::hash equals hash_file(path).0.numeric() for the same path.
    dream_archive-0.2.3.crate 6.4 MB · crate
    Verify · sha256 25b1eed987e0…4984a149d
    Release
    0.2.3 (stable)
    Size
    6689282 bytes
    SHA-256
    25b1eed987e0302b243cc795cbce18bfc3a1d02db92877edf6bb3784984a149d
    Commit
    3eaa4d22a03a
    Sources
    1

    Check it yourself: sha256sum dream_archive-0.2.3.crate must print the digest above.

  5. 0.2.2 stable 2026-09-26

    Changed

    • Rust 1.88, as mlua 0.12 requires.

    Fixed

    • Fallout 3's voice archives open: their file name block is padded with NUL bytes after the last name.
    dream_archive-0.2.2.crate 6.4 MB · crate
    Verify · sha256 5e7837eaef7d…951ff7a73
    Release
    0.2.2 (stable)
    Size
    6688798 bytes
    SHA-256
    5e7837eaef7dd893694b275e94f3e46559514adecdfe503d630332d951ff7a73
    Commit
    335dd75d1459
    Sources
    1

    Check it yourself: sha256sum dream_archive-0.2.2.crate must print the digest above.

  6. 0.2.0 stable 2026-09-26

    The Lua API runs on Luau, with camelCase names, and Oblivion's archives open.

    Breaking changes

    • The Lua bindings build against mlua 0.12; standalone-lua selects Luau instead of LuaJIT.
    • Lua names are camelCase (dreamArchive.openPath, archive:readFileRequired), and so are enum values ("bsaTes4", "skyrimSe"); constants are UPPER_SNAKE.
    • dream_path 0.2 and lz4_flex 0.14.

    Fixed

    • Oblivion's BSAs open. Their version 103 headers set the bit that means XMem compression from version 104 on; it is now ignored for 103, as OpenMW ignores it.
    dream_archive-0.2.0.crate 6.4 MB · crate
    Verify · sha256 9b8153b18ab3…39414ae51
    Release
    0.2.0 (stable)
    Size
    6688544 bytes
    SHA-256
    9b8153b18ab32ccc5447f2fb412c2e91c7259374accc12b0d43349139414ae51
    Commit
    891a4dbde556
    Sources
    1

    Check it yourself: sha256sum dream_archive-0.2.0.crate must print the digest above.

  7. 0.1.6 stable 2026-04-28

    Added

    • open_file, open_file_required and open_entry: a member as a std::io::Read, borrowed straight from the archive when it is stored uncompressed.
    dream_archive-0.1.6.crate 6.4 MB · crate
    Verify · sha256 b430d6bfd34d…3905fa08f
    Release
    0.1.6 (stable)
    Size
    6686453 bytes
    SHA-256
    b430d6bfd34d48ba33ac26ea6d78099e205fbb1b04b54a916bed8bb3905fa08f
    Commit
    49ec1cf1cb2b
    Sources
    1

    Check it yourself: sha256sum dream_archive-0.1.6.crate must print the digest above.

  8. 0.1.5 stable 2026-04-28

    Added

    • Dx10Builder::add_archive_entry copies a DX10 texture's header, chunk records and stored bytes unchanged, instead of rebuilding them.
    dream_archive-0.1.5.crate 6.4 MB · crate
    Verify · sha256 a2fb1512b3bd…c892f46b8
    Release
    0.1.5 (stable)
    Size
    6684011 bytes
    SHA-256
    a2fb1512b3bd0cce7a79d5b5c8fa2d34dc2b559ca6e0d7232fda651c892f46b8
    Commit
    275004ee0809
    Sources
    1

    Check it yourself: sha256sum dream_archive-0.1.5.crate must print the digest above.

  9. 0.1.1 stable 2026-04-27

    Builders read files when they write, and can copy entries from an opened archive.

    Breaking changes

    • Builders write with write_seek, to any Write + Seek; write_to is gone.

    Added

    • add_archive_entry on every builder, and add_archive_entry_with_compression on the BA2 and TES4 builders: an entry of an opened archive of the same family, copied when the archive is written.
    • Stable entry ids: entries_with_ids, entry_by_id, entry_by_id_required and extract_entry_by_id; extracted_len and extracted_len_by_id for BA2 and TES4.

    Changed

    • add_file and add_dir record each source's path and size and read it when the archive is written. A source that changed size in between fails the write.
    dream_archive-0.1.1.crate 6.4 MB · crate
    Verify · sha256 5213b694d2b1…3a30c7bce
    Release
    0.1.1 (stable)
    Size
    6679730 bytes
    SHA-256
    5213b694d2b11b6325208dba49f0ae94a37de11331e4ff71149ee933a30c7bce
    Commit
    fe966096a85f
    Sources
    1

    Check it yourself: sha256sum dream_archive-0.1.1.crate must print the digest above.

  10. 0.1.2 stable 2026-04-27

    Added

    • dream_path is re-exported.

    Changed

    • The lua feature no longer picks a Lua runtime: the host chooses one through its own mlua. standalone-lua selects vendored LuaJIT.
    • Rust 1.87.
    dream_archive-0.1.2.crate 6.4 MB · crate
    Verify · sha256 2a92a79eb580…fcf345987
    Release
    0.1.2 (stable)
    Size
    6680411 bytes
    SHA-256
    2a92a79eb58028ad30921937e59b419b6026773c4e8c228559bf73dfcf345987
    Commit
    c07c7f65e0ff
    Sources
    1

    Check it yourself: sha256sum dream_archive-0.1.2.crate must print the digest above.

  11. 0.1.4 stable 2026-04-27

    Added

    • A host can add its own Lua methods to the archive userdata: lua::LuaArchive with archive() and path(), create_module_with_archive_methods, register_archive_methods and add_archive_methods.
    dream_archive-0.1.4.crate 6.4 MB · crate
    Verify · sha256 26a6ca990278…0c04e539f
    Release
    0.1.4 (stable)
    Size
    6681682 bytes
    SHA-256
    26a6ca990278ecde7e8ec853ab35b3ef6cc3c250063c92b68263cac0c04e539f
    Commit
    f62c6b2bd38c
    Sources
    1

    Check it yourself: sha256sum dream_archive-0.1.4.crate must print the digest above.

  12. 0.1.3 stable 2026-04-27

    Changed

    • bstr comes through dream_path and is re-exported as dream_archive::bstr; the crate no longer depends on it directly.
    dream_archive-0.1.3.crate 6.4 MB · crate
    Verify · sha256 84720935c839…eaa44aafa
    Release
    0.1.3 (stable)
    Size
    6680385 bytes
    SHA-256
    84720935c8390aeac858dd0e6db8c48b2446531aabaafd7a8653907eaa44aafa
    Commit
    31b8a298bd65
    Sources
    1

    Check it yourself: sha256sum dream_archive-0.1.3.crate must print the digest above.

  13. 0.1.0 stable 2026-04-27

    First release: read, extract and write BA2, TES3 BSA and TES4 BSA archives in pure Rust.

    Added

    • Archive, which detects the family of any supported archive and lists, reads and extracts it.
    • BA2 GNRL and DX10 reading and extraction; DX10 textures come out as DDS files with headers rebuilt from the archive's metadata. GNMF archives are identified, not extracted.
    • TES3 BSA reading, extraction and writing.
    • TES4 BSA reading, extraction and writing for versions 103, 104 and 105: zlib and LZ4 frames, string tables, embedded names, and hash-only archives through extract_to_with_paths.
    • BA2 GNRL writing, and DX10 writing from DDS files or from texture metadata and raw payloads.
    • Legacy filename code pages: encode_filename, decode_filename_lossy and extract_to_with_encoding.
    • Parallel extraction behind the parallel feature.
    • Lua bindings through mlua and vendored LuaJIT, behind the lua feature.
    dream_archive-0.1.0.crate 6.4 MB · crate
    Verify · sha256 345dd3d128d5…941ab7323
    Release
    0.1.0 (stable)
    Size
    6674592 bytes
    SHA-256
    345dd3d128d5a2bc571f2977e8ca740861618a8ef737b7cc9c18003941ab7323
    Commit
    0ee5dcba6cdf
    Sources
    1

    Check it yourself: sha256sum dream_archive-0.1.0.crate must print the digest above.