Skip to content
dream-ini

Tool active

dream-ini

Import Morrowind.ini into openmw.cfg: a command line, a desktop and handheld GUI, and a Rust and Luau library.

Stable
1.0.1 2026-09-30
Development
1.0.2-dev.0
Package
Program 7 platforms
License
MIT OR Apache-2.0

Overview

Morrowind.ini is where a Morrowind install keeps what the engine reads at startup: the load order, the archives, and hundreds of values for weather, water, moons, fonts and the level-up screen. OpenMW reads none of it. It reads openmw.cfg.

dream-ini moves one into the other. Point it at your Morrowind.ini, and at your openmw.cfg if you have one, and it writes the cfg OpenMW needs: every archive and content file found in your Data Files, the content in the order Morrowind.exe would load it, and the INI’s settings as fallback= lines. Everything in your cfg that it does not import stays exactly as it was, comments included.

One import, three ways in

The command line, the GUI and the library all run the same importer: Morrowind.ini and an optional openmw.cfg in, an openmw.cfg out.

  1. source

    Morrowind.ini

    The load order, the archives, the weather, the fonts: the settings Morrowind.exe reads at startup.

  2. tool

    dream-ini

    Finds every archive and content file in your Data Files, orders the content as Morrowind.exe does, and rewrites only the keys it imports.

  3. result

    openmw.cfg

    content=, fallback-archive=, fallback= and data= lines, written into your existing cfg with its comments kept.

input

Your openmw.cfg

Optional. Read first; everything dream-ini does not import stays as it was.

service

CLI, GUI, library

A command line, a desktop and handheld GUI, and the importer as a Rust crate and a Luau module.

How the pieces relate
  • Morrowind.ini dream-ini
  • dream-ini openmw.cfg
  • Your openmw.cfg --cfg dream-ini
  • CLI, GUI, library runs dream-ini

It is a reimplementation of OpenMW’s mwiniimporter, in Rust, with a GUI that works with a mouse, a keyboard or a controller, on the desktop and on handhelds. Where it behaves differently from the C++ tool, it is on purpose, and written down.

dream-ini --ini "Morrowind/Morrowind.ini" --cfg ~/.config/openmw/openmw.cfg --game-files --in-place

Run it with no arguments and you get the same import as a window:

  • Desktop: Windows, Linux and macOS, driven by mouse, keyboard or a controller.
  • Handhelds: a PortMaster build that draws straight to the framebuffer, and a muOS app.
  • Android: the command line.
  • Library: the importer as a Rust crate, and as the Luau module @dream/ini.

Documentation#

Install

Program · 1.0.1

Download and runa program: one archive per platform, no installer
  1. Download the archive for your platform: Windows, macOS, Apple silicon, macOS, Intel, Linux, Android, PortMaster, muOS.
  2. Unzip it wherever you keep your tools. Nothing goes into the game's folders.
  3. Run dream-ini, or dream-ini.exe on Windows. From a terminal, dream-ini --help lists what it can do.

Then the documentation takes it from there.

Build it with Cargofrom crates.io, for any platform Rust targets
cargo install dream-ini

Cargo builds the program from source and puts dream-ini on your PATH.

DreamWeave clientsCHIMERA and other tools that read the manifest

Give the tool this page's address, or the manifest directly. It finds the release for its channel, checks compatibility and dependencies, downloads from any listed source and refuses bytes whose SHA-256 does not match.

Project id
b3efde19-438b-4325-bf94-fae56bf1d458
Manifest
https://dreamweave-mp.github.io/dream-ini/dreamweave/projects/b3efde19-438b-4325-bf94-fae56bf1d458.json

What is in the archive

  • dream-ini-<platform>.zipone per platform
    • dream-inithe program; dream-ini.exe on Windows

After installing

On Linux and Windows, dream-ini install-launcher adds Dream INI to your application menu, with its icon.

Notes

Unzip the archive anywhere and run dream-ini. With no arguments the desktop builds open the GUI; with --ini they import from the command line. The Android build is the command line only.

On muOS, copy dream-ini-Portmaster-ARM64.muxapp to the ARCHIVE folder on your SD card and install it from the Archive Manager. It appears in Applications as Dream INI.

Start here walks through a first import.

  1. 1.0.1 stable 2026-09-30

    Built on l3i 1.1.0.

    Changed

    • l3i 1.1.0 comes from crates.io; the @dream/ini module is unchanged.
    dream-ini-Windows-X64.zip 3.58 MB · Windows
    Verify · sha256 eac21a9b069a…ad8ee63e
    Release
    1.0.1 (stable)
    Size
    3750033 bytes
    SHA-256
    eac21a9b069a611f23ed010983e6212409812fbf33b4e8f06856a095ad8ee63e
    Commit
    df119713d8e9
    Sources
    1

    Check it yourself: sha256sum dream-ini-Windows-X64.zip must print the digest above.

    dream-ini-macOS-ARM64.zip 3.77 MB · macOS, Apple silicon
    Verify · sha256 b1fe72936bc9…e3fd3ce8
    Release
    1.0.1 (stable)
    Size
    3952600 bytes
    SHA-256
    b1fe72936bc92f3eebd404cca8ba493486b3ad1c7517cd6d6a301293e3fd3ce8
    Commit
    df119713d8e9
    Sources
    1

    Check it yourself: sha256sum dream-ini-macOS-ARM64.zip must print the digest above.

    dream-ini-macOS-X64.zip 3.94 MB · macOS, Intel
    Verify · sha256 8209df5bc1ae…988a80a1
    Release
    1.0.1 (stable)
    Size
    4135566 bytes
    SHA-256
    8209df5bc1aef8ce074574ff322efe39e8e1e9068091b2e834637b6d988a80a1
    Commit
    df119713d8e9
    Sources
    1

    Check it yourself: sha256sum dream-ini-macOS-X64.zip must print the digest above.

    dream-ini-Linux-X64.zip 5.15 MB · Linux
    Verify · sha256 e9bc6c0d59b3…35a69c3d
    Release
    1.0.1 (stable)
    Size
    5401529 bytes
    SHA-256
    e9bc6c0d59b395982d9fb24cab22d4f6ca1292333b3f38c27c3ff04635a69c3d
    Commit
    df119713d8e9
    Sources
    1

    Check it yourself: sha256sum dream-ini-Linux-X64.zip must print the digest above.

    dream-ini-Android-ARM64.zip 812.99 kB · Android
    Verify · sha256 7e9e69c3ec96…6d5c9025
    Release
    1.0.1 (stable)
    Size
    832499 bytes
    SHA-256
    7e9e69c3ec96d02282204339e9c248cc3944b2068825684ac916a1f86d5c9025
    Commit
    df119713d8e9
    Sources
    1

    Check it yourself: sha256sum dream-ini-Android-ARM64.zip must print the digest above.

    dream-ini-Portmaster-ARM64.zip 3.07 MB · PortMaster
    Verify · sha256 face7fc6e24c…8e7fc14e
    Release
    1.0.1 (stable)
    Size
    3221615 bytes
    SHA-256
    face7fc6e24c80fdaae9a2c447c92e574618a36f59325cc1696888c08e7fc14e
    Commit
    df119713d8e9
    Sources
    1

    Check it yourself: sha256sum dream-ini-Portmaster-ARM64.zip must print the digest above.

    dream-ini-Portmaster-ARM64.muxapp 3.14 MB · muOS
    Verify · sha256 94dca5abe1b1…8a1d35e0
    Release
    1.0.1 (stable)
    Size
    3296875 bytes
    SHA-256
    94dca5abe1b1e0f50fd12c25197e74fbc79569211d0babe62d9804818a1d35e0
    Commit
    df119713d8e9
    Sources
    1

    Check it yourself: sha256sum dream-ini-Portmaster-ARM64.muxapp must print the digest above.

  2. 1.0.0 stable 2026-09-29

    First stable release: the Luau API is an l3i extension providing @dream/ini, a large import takes milliseconds instead of a fifth of a second, and the Rust and Luau APIs are under semver.

    Breaking changes

    • The luau feature (lua still works) makes the crate an l3i extension, luau::IniExtension, providing the module @dream/ini. lua::create_module and lua::register are gone with mlua.
    • Multimap values from Luau must be strings; numbers are no longer converted.
    • Building with the luau feature needs l3i’s toolchain: clang, lld and cross-language thin LTO.
    • Rust 1.92.

    Added

    • parseIni accepts a Luau buffer, and an unknown option’s error names the function and lists the known keys.
    • Every @dream/ini function has a Luau type, part of the plan’s generated definitions; the definitions check and the strict script build behind the test-only luau-analysis feature.

    Changed

    • Only search paths that are directories are probed, and the cfg’s data= directories are resolved once per import: the benchmark install imports in 4.9 ms instead of 206 ms.
    • dataDirs and every multimap argument are walked in place through l3i’s table option reader and array visitor, one element on the stack at a time and nothing pinned, and the game and encoding options are inspected without a copy. A dataDirs element that is not a string is reported as ini.importMaps.dataDirs[2]: expected a string, got number, and a dataDirs that is not a table as ini.importMaps.dataDirs: expected an array of strings, got string.
    • The PortMaster GUI renders through dream-soft-render without shape anti-aliasing, and skips drawing frames that did not change.
    • Release builds use thin LTO on every platform.
    • l3i 1.0.0 comes from crates.io.

    Fixed

    • An update of a cfg that sets resources= no longer adds a data= line for resources/vfs, one more on every import.
    • Each INI line loses exactly one trailing carriage return, as in the C++ importer.
    • importMaps, and import_maps in Rust, write encoding= as a path import does, so the Luau encoding option is no longer ignored.

    Migration

    Compose dream_ini::luau::IniExtension into the host’s l3i RuntimePlan. A host that still wants the dreamIni global adds RuntimePolicy::compat_global("@dream/ini", "dreamIni"). Scripts that pass numbers in multimaps must pass strings. Embedding Luau has the setup.

    dream-ini-Windows-X64.zip 3.58 MB · Windows
    Verify · sha256 fb775320d3bd…25e19773
    Release
    1.0.0 (stable)
    Size
    3750216 bytes
    SHA-256
    fb775320d3bd2d3fda03de26e0fb655d7ae2fc78468f849697f24e0325e19773
    Commit
    cd24b42bfe87
    Sources
    1

    Check it yourself: sha256sum dream-ini-Windows-X64.zip must print the digest above.

    dream-ini-macOS-ARM64.zip 3.77 MB · macOS, Apple silicon
    Verify · sha256 d980b53c483a…60454496
    Release
    1.0.0 (stable)
    Size
    3953081 bytes
    SHA-256
    d980b53c483a68aa7f37407c6beb20c829b15f1de0b4051ca32cfee260454496
    Commit
    cd24b42bfe87
    Sources
    1

    Check it yourself: sha256sum dream-ini-macOS-ARM64.zip must print the digest above.

    dream-ini-macOS-X64.zip 3.94 MB · macOS, Intel
    Verify · sha256 5956f9317356…819c53ec
    Release
    1.0.0 (stable)
    Size
    4135847 bytes
    SHA-256
    5956f93173561fc112fe52139160a584f77f3c4b83f8dd9017a531c1819c53ec
    Commit
    cd24b42bfe87
    Sources
    1

    Check it yourself: sha256sum dream-ini-macOS-X64.zip must print the digest above.

    dream-ini-Linux-X64.zip 5.16 MB · Linux
    Verify · sha256 a4ac97ee62ea…f29c40f7
    Release
    1.0.0 (stable)
    Size
    5406331 bytes
    SHA-256
    a4ac97ee62eaeed2a3f0181d03aa8b2dae139837b78befd53398eceef29c40f7
    Commit
    cd24b42bfe87
    Sources
    1

    Check it yourself: sha256sum dream-ini-Linux-X64.zip must print the digest above.

    dream-ini-Android-ARM64.zip 812.75 kB · Android
    Verify · sha256 a9682f2779e2…d193740a
    Release
    1.0.0 (stable)
    Size
    832255 bytes
    SHA-256
    a9682f2779e2dc78beb445325629a3d4c43f728f0a26e051de46877ed193740a
    Commit
    cd24b42bfe87
    Sources
    1

    Check it yourself: sha256sum dream-ini-Android-ARM64.zip must print the digest above.

    dream-ini-Portmaster-ARM64.zip 3.07 MB · PortMaster
    Verify · sha256 072eb3199478…79d8e7e5
    Release
    1.0.0 (stable)
    Size
    3222341 bytes
    SHA-256
    072eb3199478a44a062790bfc49f98105e231785b021c2974fde7de979d8e7e5
    Commit
    cd24b42bfe87
    Sources
    1

    Check it yourself: sha256sum dream-ini-Portmaster-ARM64.zip must print the digest above.

    dream-ini-Portmaster-ARM64.muxapp 3.14 MB · muOS
    Verify · sha256 b4c1566b519d…bc759fbb
    Release
    1.0.0 (stable)
    Size
    3296919 bytes
    SHA-256
    b4c1566b519d12c45b8b85895c60e781a00366b6b174e675025c6bc1bc759fbb
    Commit
    cd24b42bfe87
    Sources
    1

    Check it yourself: sha256sum dream-ini-Portmaster-ARM64.muxapp must print the digest above.

  3. 0.3.1 stable 2026-09-27

    The Lua API runs on Luau with camelCase names, and dream-ini is MIT OR Apache-2.0.

    Breaking changes

    • The Lua API targets Luau through mlua 0.12, with standalone-lua building a vendored Luau, and every Lua name is camelCase: importPaths, gameFiles, dataDirs. Unknown options are errors.

    Changed

    • dream-ini is licensed MIT OR Apache-2.0, at your option, instead of GPL-3.0-only.

    Fixed

    • Updating a cfg keeps its existing settings when openmw-config records the file’s path in another spelling, as on Windows.
    • Dependencies updated past the crossbeam-epoch, quick-xml and webbrowser security advisories.
    dream-ini-Windows-X64.zip 3.68 MB · Windows
    Verify · sha256 8d59d3a21b0d…69525cfd
    Release
    0.3.1 (stable)
    Size
    3862436 bytes
    SHA-256
    8d59d3a21b0daa2ac7f0cddea2c8a1523d073046daa3ace70c84bddf69525cfd
    Commit
    390483d142c5
    Sources
    1

    Check it yourself: sha256sum dream-ini-Windows-X64.zip must print the digest above.

    dream-ini-macOS-ARM64.zip 3.61 MB · macOS, Apple silicon
    Verify · sha256 2a926c34fff6…bf1fd988
    Release
    0.3.1 (stable)
    Size
    3790205 bytes
    SHA-256
    2a926c34fff6233b9192742067180bf4d64dfa9352e86df2a6e4da2cbf1fd988
    Commit
    390483d142c5
    Sources
    1

    Check it yourself: sha256sum dream-ini-macOS-ARM64.zip must print the digest above.

    dream-ini-macOS-X64.zip 3.77 MB · macOS, Intel
    Verify · sha256 1aa68cc03f10…112d09b1
    Release
    0.3.1 (stable)
    Size
    3948600 bytes
    SHA-256
    1aa68cc03f103cb16bd6b87f067b2a6378fae869e7884cc4f5473f8c112d09b1
    Commit
    390483d142c5
    Sources
    1

    Check it yourself: sha256sum dream-ini-macOS-X64.zip must print the digest above.

    dream-ini-Linux-X64.zip 5.10 MB · Linux
    Verify · sha256 d07a09238fa3…f20ee328
    Release
    0.3.1 (stable)
    Size
    5349341 bytes
    SHA-256
    d07a09238fa3c74d301150e5baa6c0b580565ce4195a536f8135d68df20ee328
    Commit
    390483d142c5
    Sources
    1

    Check it yourself: sha256sum dream-ini-Linux-X64.zip must print the digest above.

    dream-ini-Android-ARM64.zip 810.79 kB · Android
    Verify · sha256 01136d67e017…b5a6efda
    Release
    0.3.1 (stable)
    Size
    830254 bytes
    SHA-256
    01136d67e0178927c42957eb729c4bce40d900de567651f74f5fc3f0b5a6efda
    Commit
    390483d142c5
    Sources
    1

    Check it yourself: sha256sum dream-ini-Android-ARM64.zip must print the digest above.

    dream-ini-Portmaster-ARM64.zip 2.98 MB · PortMaster
    Verify · sha256 2b8c9f795b40…162e7955
    Release
    0.3.1 (stable)
    Size
    3120055 bytes
    SHA-256
    2b8c9f795b40517618a7475fb8742609340dac8ea9067c9bee291fc1162e7955
    Commit
    390483d142c5
    Sources
    1

    Check it yourself: sha256sum dream-ini-Portmaster-ARM64.zip must print the digest above.

    dream-ini-Portmaster-ARM64.muxapp 3.05 MB · muOS
    Verify · sha256 54b96d85a32c…7466c6e4
    Release
    0.3.1 (stable)
    Size
    3198280 bytes
    SHA-256
    54b96d85a32c13dc9fb9061f11208a42734c18e0c5110d9f5c1c781c7466c6e4
    Commit
    390483d142c5
    Sources
    1

    Check it yourself: sha256sum dream-ini-Portmaster-ARM64.muxapp must print the digest above.

Credits

  • MaintainerDreamWeave
  • mwiniimporter, the C++ importer dream-ini reimplementsOpenMW
  • Morrowind.exe's rules for GameFile order, gaps and missing files, which dream-ini followsGreatness7