Library morrowind active current
dream_archive
Read, extract and write Bethesda BSA and BA2 archives, from Morrowind to Starfield, as a Jess package in Luau.
Indexed from dream_archive. Project metadata is published by the project's own site; AsHyAmS indexes that claim.
- stable · current
- 2.0.0 2026-10-21
- development
- 2.0.1-dev.11 2026-10-24
- License
- MIT OR Apache-2.0
- Versioning
- numeric
01Dependencies
From the current release, stable 2.0.0.
The current release declares no relationships.
02Used by
Current releases of indexed projects that point here, by id or through a capability.
- required by DreamWind
2 - required by dream-archivetool
2 - required by vfstool_lib
2
03Compatibility
As the publisher declares it for the current release. This index claims nothing further.
- Platforms
- not restricted
04Releases
14 releases, newest first. Yanked and deprecated releases stay listed.
-
2.0.1-dev.11 developmenthead
source
f7aefa4861b1org.dreamweave.dream-archive-2.0.1-dev.11.jpkVerify · sha256 3fa016acf21c…d7ce409e · 1 source
- SHA-256
- 3fa016acf21c50581e8423611d66ed752fdc805d998f8a6d4ae82d48d7ce409e
- Size
- 261439 bytes
- Media type
application/vnd.jess.jpk- publisher
- https://github.com/DreamWeave-MP/dream_archive/releases/download/development/org.dreamweave.dream-archive-2.0.1-dev.11.jpk
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum org.dreamweave.dream-archive-2.0.1-dev.11.jpkmust print the digest above. -
2.0.0 stablecurrentbreaking notes
dream_archive is a Jess package, written in Luau; the Rust crate continues on the rust branch at 1.1.0.
Publisher's notes
Breaking changes
- The library is the Jess package
org.dreamweave.dream-archive, module@dream-archive, installed with jess rather than Cargo. The Rust cratedream_archivestays at 1.1.0 on crates.io and on this repository'srustbranch, and is no longer developed on main.
source
7af9ffda3828· tagdream_archive-2.0.0org.dreamweave.dream-archive-2.0.0.jpkVerify · sha256 281c27bf86a2…23035730 · 1 source
- SHA-256
- 281c27bf86a2b9ea14dc9baa4959a9a9d213784332acfefcc9a9a9e623035730
- Size
- 261432 bytes
- Media type
application/vnd.jess.jpk- publisher
- https://github.com/DreamWeave-MP/dream_archive/releases/download/dream_archive-2.0.0/org.dreamweave.dream-archive-2.0.0.jpk
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum org.dreamweave.dream-archive-2.0.0.jpkmust print the digest above. - The library is the Jess package
-
1.1.0 stable
Relicensed as MIT OR Apache-2.0 and built on l3i 1.1.0.
Publisher's notes
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/archivemodule is unchanged.
source
6cf4005005b5· tagdream_archive-1.1.0dream_archive-1.1.0.crateVerify · sha256 ef05ce9b63b8…1dbc24c7 · 1 source
- SHA-256
- ef05ce9b63b87ff34e29708aa5d58829608063a64cf236420adbba101dbc24c7
- Size
- 7404128 bytes
- Media type
application/gzip- publisher
- https://static.crates.io/crates/nil/dream_archive-1.1.0.crate
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum dream_archive-1.1.0.cratemust print the digest above. -
1.0.0 stablebreaking notesmigration notes
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.
Publisher's notes
Breaking changes
- The
luaufeature (luais the old name of the same feature) binds the crate as an l3i extension,luau::ArchiveExtension, providing@dream/archive.dream_archive::lua, themluatypes and thestandalone-luafeature are gone. - Building with the
luaufeature needs l3i's toolchain: clang, lld and cross-language thin LTO. - Every
open*in Luau returns the oneArchivetype;archive:entries()is a view of entry handles, not a table of tables. - Luau entry hashes are integers:
entry.hashandentry.folderHashreplace the old tables and fields, withhashHexandfolderHashHexfor the hex spelling. BA2 hashes aredirectoryHash,fileHashandextensionHash; sizes and offsets aresize,storedSizeandoffseton every format. - Luau integer arguments must be exact:
readEntry(1.5)is an error instead of a rounded read. bsa::Error::InvalidFileRecordFlagsis 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_hashandcontains_hashon every archive family,get_idby path, andHashFields::from_numeric.archive:readInto(entry, buffer, offset)in Luau decodes a member straight into abuffer, andarchive:getByHashandarchive:containsHashtake 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-analysisfeature. toBuffer()on every Luau builder; onlyba2.Builderhad it.dream_archive::flate2, the re-exportedflate2whoseCompressionset_zlib_leveltakes, so naming a zlib level needs noflate2dependency of your own.
Changed
- Path lookups normalize into a stack buffer instead of allocating:
containsover 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 ascontainsandreadEntrytake 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_bytesandadd_dds_filetake 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 haveDDSD_DEPTHor its caps haveDDSCAPS2_VOLUME.- A cubemap's extended
DX10DDS 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, andadd_dds_bytesandadd_dds_filerefused 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.nifmissed andmeshes/door.nif/found a member a BSA answered the other way round; hash-only TES4 lookups misseda//b/c.nif. Archives without names now hash the normalized path. - Luau
entry.nameis the part of the path after its last separator in every family. For a BA2 entry it was the whole stored path, the same asentry.path. - Luau
entry.folderis""for an entry at the root of a TES3 archive or a BA2, as it was for TES4, instead ofnil;nilmeans the archive stores no names. - The crate builds with only the
ba2feature: it now enables thelz4_flexfeature its compressor needs, which onlybsa-tes4turned on before. Builds with one BSA family alone no longer carry dead code.
Migration
Compose
dream_archive::luau::ArchiveExtensioninto the host's l3iRuntimePlan. A host that still wants thedreamArchiveglobal addsRuntimePolicy::compat_global("@dream/archive", "dreamArchive"). That release's Embedding Luau page listed what scripts must change; the Luau port's documentation replaces it.source
94f37c74ce28· tagdream_archive-1.0.0dream_archive-1.0.0.crateVerify · sha256 fe94718bdde6…743d2225 · 1 source
- SHA-256
- fe94718bdde6117e633510a184a036c88bad99d0a745c0d18de21301743d2225
- Size
- 7408572 bytes
- Media type
application/gzip- publisher
- https://static.crates.io/crates/nil/dream_archive-1.0.0.crate
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum dream_archive-1.0.0.cratemust print the digest above. - The
-
0.2.3 stable
Publisher's notes
Fixed
- TES3 entry hashes are read low half first, so
Entry::hashequalshash_file(path).0.numeric()for the same path.
source
3eaa4d22a03a· tagdream_archive-0.2.3dream_archive-0.2.3.crateVerify · sha256 25b1eed987e0…984a149d · 1 source
- SHA-256
- 25b1eed987e0302b243cc795cbce18bfc3a1d02db92877edf6bb3784984a149d
- Size
- 6689282 bytes
- Media type
application/gzip- publisher
- https://static.crates.io/crates/nil/dream_archive-0.2.3.crate
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum dream_archive-0.2.3.cratemust print the digest above. - TES3 entry hashes are read low half first, so
-
0.2.2 stable
Publisher's notes
Changed
- Rust 1.88, as
mlua0.12 requires.
Fixed
- Fallout 3's voice archives open: their file name block is padded with NUL bytes after the last name.
source
335dd75d1459· tagdream_archive-0.2.2dream_archive-0.2.2.crateVerify · sha256 5e7837eaef7d…51ff7a73 · 1 source
- SHA-256
- 5e7837eaef7dd893694b275e94f3e46559514adecdfe503d630332d951ff7a73
- Size
- 6688798 bytes
- Media type
application/gzip- publisher
- https://static.crates.io/crates/nil/dream_archive-0.2.2.crate
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum dream_archive-0.2.2.cratemust print the digest above. - Rust 1.88, as
-
0.2.0 stablebreaking notes
The Lua API runs on Luau, with camelCase names, and Oblivion's archives open.
Publisher's notes
Breaking changes
- The Lua bindings build against
mlua0.12;standalone-luaselects Luau instead of LuaJIT. - Lua names are camelCase (
dreamArchive.openPath,archive:readFileRequired), and so are enum values ("bsaTes4","skyrimSe"); constants are UPPER_SNAKE. dream_path0.2 andlz4_flex0.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.
source
891a4dbde556· tagdream_archive-0.2.0dream_archive-0.2.0.crateVerify · sha256 9b8153b18ab3…9414ae51 · 1 source
- SHA-256
- 9b8153b18ab32ccc5447f2fb412c2e91c7259374accc12b0d43349139414ae51
- Size
- 6688544 bytes
- Media type
application/gzip- publisher
- https://static.crates.io/crates/nil/dream_archive-0.2.0.crate
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum dream_archive-0.2.0.cratemust print the digest above. - The Lua bindings build against
-
0.1.6 stable
Publisher's notes
Added
open_file,open_file_requiredandopen_entry: a member as astd::io::Read, borrowed straight from the archive when it is stored uncompressed.
source
49ec1cf1cb2b· tagdream_archive-0.1.6dream_archive-0.1.6.crateVerify · sha256 b430d6bfd34d…905fa08f · 1 source
- SHA-256
- b430d6bfd34d48ba33ac26ea6d78099e205fbb1b04b54a916bed8bb3905fa08f
- Size
- 6686453 bytes
- Media type
application/gzip- publisher
- https://static.crates.io/crates/nil/dream_archive-0.1.6.crate
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum dream_archive-0.1.6.cratemust print the digest above. -
0.1.5 stable
Publisher's notes
Added
Dx10Builder::add_archive_entrycopies a DX10 texture's header, chunk records and stored bytes unchanged, instead of rebuilding them.
source
275004ee0809· tagdream_archive-0.1.5dream_archive-0.1.5.crateVerify · sha256 a2fb1512b3bd…892f46b8 · 1 source
- SHA-256
- a2fb1512b3bd0cce7a79d5b5c8fa2d34dc2b559ca6e0d7232fda651c892f46b8
- Size
- 6684011 bytes
- Media type
application/gzip- publisher
- https://static.crates.io/crates/nil/dream_archive-0.1.5.crate
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum dream_archive-0.1.5.cratemust print the digest above. -
0.1.4 stable
Publisher's notes
Added
- A host can add its own Lua methods to the archive userdata:
lua::LuaArchivewitharchive()andpath(),create_module_with_archive_methods,register_archive_methodsandadd_archive_methods.
source
f62c6b2bd38c· tagdream_archive-0.1.4dream_archive-0.1.4.crateVerify · sha256 26a6ca990278…c04e539f · 1 source
- SHA-256
- 26a6ca990278ecde7e8ec853ab35b3ef6cc3c250063c92b68263cac0c04e539f
- Size
- 6681682 bytes
- Media type
application/gzip- publisher
- https://static.crates.io/crates/nil/dream_archive-0.1.4.crate
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum dream_archive-0.1.4.cratemust print the digest above. - A host can add its own Lua methods to the archive userdata:
-
0.1.3 stable
Publisher's notes
Changed
bstrcomes throughdream_pathand is re-exported asdream_archive::bstr; the crate no longer depends on it directly.
source
31b8a298bd65· tagdream_archive-0.1.3dream_archive-0.1.3.crateVerify · sha256 84720935c839…aa44aafa · 1 source
- SHA-256
- 84720935c8390aeac858dd0e6db8c48b2446531aabaafd7a8653907eaa44aafa
- Size
- 6680385 bytes
- Media type
application/gzip- publisher
- https://static.crates.io/crates/nil/dream_archive-0.1.3.crate
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum dream_archive-0.1.3.cratemust print the digest above. -
0.1.2 stable
Publisher's notes
Added
dream_pathis re-exported.
Changed
- The
luafeature no longer picks a Lua runtime: the host chooses one through its ownmlua.standalone-luaselects vendored LuaJIT. - Rust 1.87.
source
c07c7f65e0ff· tagdream_archive-0.1.2dream_archive-0.1.2.crateVerify · sha256 2a92a79eb580…cf345987 · 1 source
- SHA-256
- 2a92a79eb58028ad30921937e59b419b6026773c4e8c228559bf73dfcf345987
- Size
- 6680411 bytes
- Media type
application/gzip- publisher
- https://static.crates.io/crates/nil/dream_archive-0.1.2.crate
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum dream_archive-0.1.2.cratemust print the digest above. -
0.1.1 stablebreaking notes
Builders read files when they write, and can copy entries from an opened archive.
Publisher's notes
Breaking changes
- Builders write with
write_seek, to anyWrite + Seek;write_tois gone.
Added
add_archive_entryon every builder, andadd_archive_entry_with_compressionon 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_requiredandextract_entry_by_id;extracted_lenandextracted_len_by_idfor BA2 and TES4.
Changed
add_fileandadd_dirrecord each source's path and size and read it when the archive is written. A source that changed size in between fails the write.
source
fe966096a85f· tagdream_archive-0.1.1dream_archive-0.1.1.crateVerify · sha256 5213b694d2b1…a30c7bce · 1 source
- SHA-256
- 5213b694d2b11b6325208dba49f0ae94a37de11331e4ff71149ee933a30c7bce
- Size
- 6679730 bytes
- Media type
application/gzip- publisher
- https://static.crates.io/crates/nil/dream_archive-0.1.1.crate
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum dream_archive-0.1.1.cratemust print the digest above. - Builders write with
-
0.1.0 stable
First release: read, extract and write BA2, TES3 BSA and TES4 BSA archives in pure Rust.
Publisher's notes
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_lossyandextract_to_with_encoding. - Parallel extraction behind the
parallelfeature. - Lua bindings through
mluaand vendored LuaJIT, behind theluafeature.
source
0ee5dcba6cdf· tagdream_archive-0.1.0dream_archive-0.1.0.crateVerify · sha256 345dd3d128d5…41ab7323 · 1 source
- SHA-256
- 345dd3d128d5a2bc571f2977e8ca740861618a8ef737b7cc9c18003941ab7323
- Size
- 6674592 bytes
- Media type
application/gzip- publisher
- https://static.crates.io/crates/nil/dream_archive-0.1.0.crate
The digest is the publisher's claim, recorded in its manifest. This index did not download the archive. Check it yourself:
sha256sum dream_archive-0.1.0.cratemust print the digest above.
07Observed changes
What this index saw change in this claim's manifest.
08People
- maintainerDreamWeave