Skip to content
S3LightFixes

Tool Morrowind active

S3LightFixes

Generate a plugin that retunes every light in your OpenMW load order: color, radius, duration and flicker, from one command.

"org.dreamweave.s3lightfixes" = "1.1.0"
Stable
1.1.0 2026-10-23
Package
Jess package
License
MIT

Overview

S3LightFixes reads every plugin in your OpenMW load order and writes one more: S3LightFixes.omwaddon, a fixed copy of every light record it found. Firelight turns softer and reaches further, colored lights keep their color, flicker stops, negative lights go dark, and carried lights burn longer. Enable it last, and every light in the game follows the same rules, whichever mod it came from.

The program is what jess fetches; the plugin is not. It is built from your load order, on your machine, and has to be built again when your mods change.

One run, one plugin

S3LightFixes reads the lights and interior cells of every plugin in your load order and writes the fixed versions into one plugin that loads after them.

  1. source

    openmw.cfg

    Your load order: every content= file, found through the data= directories.

  2. tool

    s3lightfixes

    Takes the last version of each light record, recolors it, resizes its radius, stretches its duration and strips its flicker.

  3. result

    S3LightFixes.omwaddon

    Every light, fixed, plus the interior cells you asked to relight. Enable it last.

How the pieces relate
  • openmw.cfg s3lightfixes
  • s3lightfixes S3LightFixes.omwaddon
  • lightconfig.toml settings s3lightfixes
  • s3lightfixes writes lightconfig.log
jess workspace run --trusted s3lightfixes

That is a whole run: it finds your openmw.cfg, reads the lights, writes the plugin to your data-local folder, or the one you ran it in, and prints what it changed. Morrowind's torch, for one:

LIGH "torch" from "Morrowind.esm": color [245, 140, 40, 0] -> [140, 74, 46, 0], radius 256 -> 307, duration 210 -> 525, flags LightFlags(DYNAMIC | CAN_CARRY | FIRE | OFF_BY_DEFAULT | FLICKER_SLOW) -> LightFlags(DYNAMIC | CAN_CARRY | FIRE | OFF_BY_DEFAULT)

Everything it does is a setting:

  • Multipliers: hue, saturation, brightness and radius for firelight and for colored light,

and one for duration.

  • Overrides: a color, radius, duration or flags of your own for any light, and ambient light,

sunlight and fog for any interior, chosen by regular expression.

  • Exclusions: lights, cells and whole plugins to leave alone.
  • Enabling: --auto-enable adds the plugin to your openmw.cfg, after backing the file up.

It descends from vtastek's Lightfixes.pl and wazabear's Waza-lightfixes, which did the same through tes3cmd. S3LightFixes is a Jess package, org.dreamweave.s3lightfixes, written in Luau: it runs wherever jess does, with nothing else to install.

Documentation§

  • Start here: get it, generate the plugin, enable it, and read what it

changed.

and setting.

These pages describe the default branch, which the development build carries. The Rust program, 0.5.0 and its downloads for each platform, lives on the rust branch.

Install

Jess package · 1.1.0

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
55e873c9-1ddc-4b13-b59a-0eb790bb2565
Manifest
https://dreamweave-mp.github.io/S3LightFixes/dreamweave/projects/55e873c9-1ddc-4b13-b59a-0eb790bb2565.json

What is in the archive

  • s3lightfixes.zip
    • the mod's filesone data directory
    • s3lightfixes-dwmod.tomlthe project's mod.toml
    • dreamweave.release.jsonwhat this archive is, for tools

After installing

It reads your load order from openmw.cfg and writes S3LightFixes.omwaddon; enable that plugin last in your load order, and run it again whenever your mods change.

Notes

S3LightFixes runs through jess. In a workspace that names it under [dev-dependencies], jess workspace sync fetches it and jess workspace run --trusted s3lightfixes runs it. Start here walks through a first run.

  1. 1.1.0 stable 2026-10-23

    S3LightFixes finds OpenMW's own configuration when none is named, as the original does.

    Added

    • With neither --config nor OPENMW_CONFIG, the openmw.cfg in the folder OpenMW keeps its own in on this platform: Documents\My Games\OpenMW on Windows, wherever Documents was moved, Library/Preferences/openmw on macOS, and the XDG config folder elsewhere. Its ?userconfig? and ?userdata? are OpenMW's own folders. Needs jess 0.2.1 or later.
    org.dreamweave.s3lightfixes-1.1.0.jpk 72.7 kB · jpk
    Verify · sha256 a1d41dac5ffc…ae82461b0
    Release
    1.1.0 (stable)
    Size
    74413 bytes
    SHA-256
    a1d41dac5ffca9fb0192e64e2faaaccf6576e78a7a8862475b1668eae82461b0
    Commit
    1a608873d150
    Package
    org.dreamweave.s3lightfixes
    Content digest
    4bdabef4b5b7888ff531d172cf54a0a873bc542d16039e2c62c0bef00696b3e9
    Sources
    1

    Check it yourself: sha256sum org.dreamweave.s3lightfixes-1.1.0.jpk must print the digest above.

  2. 1.0.0 stable 2026-10-21

    S3LightFixes is a Jess package, written in Luau; the Rust program continues on the rust branch at 0.5.0.

    Breaking changes

    • The tool is the Jess package org.dreamweave.s3lightfixes, run through jess rather than as a downloaded binary, so the per-platform downloads, the PortMaster build and the AUR package end with 0.5.0. The Rust program stays on its GitHub releases and this repository's rust branch, and is no longer developed on main.
    org.dreamweave.s3lightfixes-1.0.0.jpk 72.3 kB · jpk
    Verify · sha256 daa4dfe1fc0c…663fd33dd
    Release
    1.0.0 (stable)
    Size
    73985 bytes
    SHA-256
    daa4dfe1fc0cb5191f66b10f8a07dd6d9c6b61c1deb3488386ddecc663fd33dd
    Commit
    128f85d19ff3
    Package
    org.dreamweave.s3lightfixes
    Content digest
    f0c8c2a9b5ee74a6525883b4f38cf0098ac98d994e29e88abd2083dae75d598f
    Sources
    1

    Check it yourself: sha256sum org.dreamweave.s3lightfixes-1.0.0.jpk must print the digest above.

  3. 0.5.0 stable unreleased 2026-09-29

    A cleaned-up command line, runs that check or preview without writing anything, a log of every change, RGB colors in overrides, and the MIT license.

    Breaking changes

    • -V is --version, and --colored-value no longer has a short form.
    • -i, --info is gone: use --version.
    • -l, --write-log and save_log, which wrote the whole plugin as text, are gone: every run writes lightconfig.log instead.
    • Light flags in overrides are spelled as in the Construction Set, FLICKER_SLOW and PULSE_SLOW; FLICKERSLOW and PULSESLOW are errors.
    • --ambient colors on the command line are red, green and blue, 0 to 255, not hue, saturation and value. lightconfig.toml still reads the old form.
    • --openmw-cfg takes a folder holding openmw.cfg, or a file named exactly openmw.cfg, and stops the run with exit code 127 on anything else.

    Added

    • --dry-run reads everything and prints every change without writing a file.
    • --validate-config checks lightconfig.toml, the options and every pattern, and stops. It fails on a key in lightconfig.toml it does not know, which a run warns about and ignores.
    • dry_run and validate_config in lightconfig.toml.
    • red, green and blue as a fixed color in light overrides, and red_mult, green_mult and blue_mult, applied last.
    • flag in light overrides takes any of the nine light flags, or a list of them, so an override can keep CAN_CARRY.
    • --disable-negative-lights and disable_negative_lights: negative lights can be kept.
    • lightconfig.log: the config, output and counts of a run, and one line per changed record. Every run also prints it.
    • --auto-enable backs up openmw.cfg to openmw.cfg.s3lightfixes.bak before editing it, and edits nothing if the backup fails.
    • --generate-completion for bash, elvish, fish, PowerShell and zsh, and --generate-manpage.
    • Android and PortMaster archives.
    • A Rust library, s3lightfixes, with the settings, overrides and light arithmetic the program uses.

    Changed

    • Licensed MIT, instead of GPL-3.0-or-later.
    • openmw.cfg is found as OpenMW finds its root config: OPENMW_CONFIG, OPENMW_CONFIG_DIR, beside the program, the Linux global config, then the user's.
    • The Linux builds need glibc 2.34 or newer, down from 2.39.
    • Every archive holds s3lightfixes, s3lightfixes-README.md, s3lightfixes-LICENSE and a Sigstore bundle.
    • openmw-config 1.1, and updated dependencies.

    Fixed

    • The user openmw.cfg is read when no other is found, on Windows and macOS too.
    • Exclusions and light and ambient overrides match ids and plugin names in any case. An override pattern with a capital letter matched nothing.
    • Infinite lights stay infinite, unless an override gives them a fixed duration.
    • A plugin named S3LightFixes is never read as input, whatever its extension.
    • An unreadable lightconfig.toml exits with status 1. On Linux and macOS it exited 0.
    • Messages are printed when no dialog can be shown, such as on Linux without zenity, kdialog or yad.
    • Saving rewrites lightconfig.toml under the name it was found with, instead of adding a second file on a case-sensitive system.
    • A dry run piped into head no longer ends in an error.

    Migration

    Most runs need no change. Scripts and launchers that pass options do: -V is now --version, so give --colored-value in full; use --version for -i; drop -l, since every run writes lightconfig.log. Spell light flags FLICKER_SLOW and PULSE_SLOW, and give --ambient colors as red, green and blue. --openmw-cfg needs a folder, or a file named exactly openmw.cfg. Then run s3lightfixes --validate-config: it says save_log can be deleted from lightconfig.toml, and fails on any other key it does not read.

Credits

  • MaintainerDreamWeave
  • Lightfixes.pl, the tes3cmd script this all descends fromvtastek
  • Waza-lightfixes, the program S3LightFixes succeedswazabear
  • tes3, the Rust library that reads and writes the pluginsGreatness7
  • Infinite lights that stay infiniteArrean