Radiator Server Documentation — v10.34.2

RadConf value conversions

Text and booleans become Lua strings and booleans. Integer values in the signed 64-bit range become native Luau integers. Floating-point values become Lua numbers. Binary data becomes a Lua string containing the same bytes, including zero bytes. Between filter steps, values keep their meaning: passwords remain masked and timestamps remain dates and times.

Native 64-bit integers

radconf.get() and filter results preserve every integer from -9223372036854775808 to 9223372036854775807. Lua's type(value) reports "integer" for these values. Unsigned RadConf integers within this range also become native integers.

Write integer literals with an i suffix. Use the integer library for arithmetic, comparisons, and conversions:

radconf.set("vars.record_id", 9007199254740993i)
local record_id = radconf.get("vars.record_id")[1]
local next_id = integer.add(record_id, 1i)
radconf.set("vars.next_record_id", next_id)
print(tostring(next_id)) -- 9007199254740994

Use integer.minsigned and integer.maxsigned for the range limits. Arithmetic overflow wraps within 64 bits. Native integers use integer.add(), integer.sub(), and similar functions instead of ordinary Lua arithmetic operators. Compare native integers with native literals, such as record_id == 9007199254740993i.

Ordinary Lua numbers remain floating-point values. Use integer.create(number) to convert an integral number, or integer.fromstring(text) to parse an exact integer from text. Use integer.tonumber(value) when calling a Lua function that requires a number. Converting a large integer to a number can round it.

Existing context fields and methods keep their numeric behavior for script compatibility. They return ordinary numbers, which cannot represent every integer beyond 9007199254740992. Use radconf for variable access that needs full signed integer precision.

JSON values

Ordinary Lua tables represent one JSON value, including JSON arrays. Use radconf.null for JSON null inside a table. Multivalue sequences are distinct from JSON arrays.

Very large integers inside JSON objects and arrays keep every digit. You can display them with tostring() and pass the containing table back without rounding them:

local document = radconf.filter('{"id":9007199254740993}'):json():value()
document.id = integer.add(document.id, 1i)
print(tostring(document.id)) -- 9007199254740994
document.name = "example"
radconf.set("http.request", document)

Values kept in their original form

Radiator Server keeps some values in their original form when returning them to Lua. These include masked passwords, timestamps, regular expressions, and unsigned integers above the signed 64-bit range. Your script can hold these values in a variable and pass them to radconf.set() or radconf.filter().

Use tostring(value) to display a value. Use a filter to convert it into the text or other result your script needs. Lua's type(value) reports "userdata" for these values. This is Lua's name for a value supplied by the application; you do not need to unpack it yourself.

Passwords

Reading a password keeps it masked. Displaying or copying the returned value does not reveal the password:

local password = radconf.get("user.password")
print(tostring(password)) -- Masked display text
radconf.set("vars.saved_password", password) -- Keeps the password masked

Use the reveal filter to obtain the password as a Lua string:

local password = radconf.filter.variable("user.password")
    :reveal()
    :value()

Dates and times

A timestamp keeps its date and time information when returned to Lua. You can save it in another variable or choose its display format with timestamp_format:

local login_time = radconf.filter("2026-10-14T12:00:00Z")
    :timestamp()
    :value()

radconf.set("vars.login_time", login_time)

local date = radconf.filter(login_time)
    :timestamp_format("[year]-[month]-[day]")
    :value()

print(date) -- 2026-10-14

Regular expressions

The regex filter returns a regular expression that you can reuse in other filter calls. This example splits text at commas or semicolons:

local separator = radconf.filter("/[,;]+/"):regex():value()
local groups = radconf.filter("admin;reader,operator")
    :split(separator)
    :values()

print(groups[2]) -- reader

Unsigned integers above the signed range

Unsigned RadConf integers above 9223372036854775807 cannot be represented as positive native Luau integers. Radiator Server keeps them in their original form to preserve every digit. Display them with tostring() and pass the original value to set() to copy it exactly.

For example, after a RadConf pipeline sets vars.record_id to 18446744073709551615:

local record_id = radconf.get("vars.record_id")[1]
print(tostring(record_id)) -- 18446744073709551615
radconf.set("vars.saved_record_id", record_id)

These values do not support ordinary Lua arithmetic. Converting their display text with tonumber() can round the number.

Multivalue sequences

Tables returned by radconf.get() for several values, or by :values(), represent a list of values when passed to radconf.set() or radconf.filter(). You can edit their entries and pass the same table back. Use consecutive indices starting at 1. A table you construct yourself represents one JSON value.

When a result list contains a missing value, Radiator Server keeps a placeholder at that position. Lua would remove the entry if it were stored as nil. Passing the list back to set() or filter() preserves the missing entry. To check an individual entry, extract it with :value():

local entries = radconf.filter(nil):values()
print(#entries) -- 1: the missing value still occupies a position
print(radconf.filter(entries[1]):value() == nil) -- true

See variable access and filter chains for usage examples.