Skip to content
Genesis v2.0 and Soteria v7.0 are here. Read the announcement
Back to blog
September 1, 2026·2 min read

Genesis v2.0

A new major version of Genesis, Soteria's Luau decompiler, with better variable and table naming plus several fixes.

Version 2.0 of Genesis, Soteria's Luau decompiler, is out now.

Fixes

  • Fixed a naming bug affecting a variable declared once but only given its real value later (a common pattern for a value shared across several functions): it could end up split into two different names, with one of them looking like an accidental undeclared global.
  • Fixed a related bug where a variable that already held a real value could get silently renamed to something unrelated by a later conditional update, leaving its original declaration orphaned and looking unused.
  • Fixed values assigned inside an if being lost after the branch: the conditional could vanish entirely and the variable read the same value on every path.
  • Fixed a reassignment inside a branch being dropped, leaving a read that resolved to nothing.
  • Fixed a conditional write letting a variable declaration get optimized away, turning it into an accidental global write.
  • Hardened the bytecode reader against a malformed length value that could crash the parser.
  • Removed a whole class of crashes on malformed input where instruction operands exceeded the declared limits.

Improvements

  • Table literals that used to get split across several stray helper variables (local t1 = {...}; local t2 = {...}; parent.Field = t1; ...) now collapse back into one clean literal, matching how you'd actually write it by hand.
  • The main table a module hands back (return SomeModule) now gets named after the script itself instead of a generic placeholder, when that name is available.
  • Small lookup-style tables now get named from their own keys instead of a generic placeholder (e.g. a table with Cash/Gems fields becomes CGTable).
  • Constructors on nested/namespaced classes (e.g. Utils.Logger.new(...)) now get named after the class being constructed, and no longer get an unnecessary numeric suffix unless there's an actual second one to disambiguate from.
  • Variables assigned straight from a function or method call now get named after that call instead of staying a generic placeholder.
  • Never-reassigned local variables are now declared with const instead of local, matching how a person would actually write it.
  • Loop variables from a plain table iteration are now named i/v, like a person would write them, instead of restating the table's name on both (smart naming for things like :GetChildren() results is unchanged).
  • Table names pulled from an obfuscated script's own instance name are no longer used when that name is a hash/GUID rather than a real word, since dumping a 32-character hash into a variable name was worse than a generic placeholder.
  • Recovered string interpolation: backtick strings now come back as backtick strings instead of their compiled equivalent.
  • Stopped interpolated strings from being bound to a pointless throwaway variable, they inline into whatever uses them.
  • Named numeric loop counters the way people write them, instead of leaving raw slot names.

Like always if you run into any issues or unexpected behavior, let us know on Discord.

SoteriaSoteria

Secure your Luau scripts and accelerate your developer experience.

Products

  • Oracle
  • Genesis

Tools

  • Script Library
  • DevEx Converter
  • FFlags Directory

Docs & Support

  • Documentation
  • Roblox Status
  • Error Codes
  • Runtimes

Company

  • About
  • Blog
  • Discord
  • Contact

Legal

  • Terms of Service
  • Privacy Policy
  • Cookie Policy
  • Acceptable Use

© 2026 Soteria. All rights reserved.

SoteriaSoteria
Pricing
Get Started