player dysnc
Key RequiredUniversal

player dysnc

Universal Scriptlfduty287lfduty287 117 views 168 executesUpdated Jul 19, 2026
Unrated
00
Lua Script•689 lines (21460 chars)
-- Desync GUI v1.0
-- Server-client desync: walk around invisibly, toggle off = TP to visual pos

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")

local LocalPlayer = Players.LocalPlayer
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")

-- 
-- State
-- 
local desyncActive = false
local speedBoosted = false
local defaultSpeed = 16
local currentSpeed = 16
local invisSeat = nil
local invisWeld = nil
local savedCFrame = nil
local desyncLoop = nil

local hiddenPos = nil -- set dynamically to above current position

-- 
-- Colors
-- 
local C = {
    Bg          = Color3.fromRGB(12, 12, 16),
    Surface     = Color3.fromRGB(22, 22, 28),
    SurfaceMid  = Color3.fromRGB(30, 30, 38),
    SurfaceLt   = Color3.fromRGB(40, 40, 50),
    SurfaceHover= Color3.fromRGB(50, 50, 60),
    Border      = Color3.fromRGB(45, 45, 55),
    Accent      = Color3.fromRGB(120, 80, 255),
    AccentDim   = Color3.fromRGB(90, 55, 200),
    AccentGlow  = Color3.fromRGB(160, 120, 255),
    Green       = Color3.fromRGB(50, 205, 120),
    GreenDim    = Color3.fromRGB(35, 160, 90),
    Red         = Color3.fromRGB(255, 70, 70),
    RedDim      = Color3.fromRGB(200, 50, 50),
    Yellow      = Color3.fromRGB(255, 200, 50),
    Text        = Color3.fromRGB(210, 210, 220),
    TextBright  = Color3.fromRGB(255, 255, 255),
    TextDim     = Color3.fromRGB(130, 130, 150),
    TextMuted   = Color3.fromRGB(85, 85, 100),
    White       = Color3.fromRGB(255, 255, 255),
}

-- 
-- Utility
-- 
local function Create(class, props)
    local inst = Instance.new(class)
    for k, v in pairs(props or {}) do
        if k ~= "Parent" and k ~= "Children" then inst[k] = v end
    end
    if props and props.Parent then inst.Parent = props.Parent end
    if props and props.Children then
        for _, child in ipairs(props.Children) do child.Parent = inst end
    end
    return inst
end

local function AddCorner(parent, radius)
    local c = Instance.new("UICorner")
    c.CornerRadius = UDim.new(0, radius or 6)
    c.Parent = parent
    return c
end

local function AddStroke(parent, color, thickness, transparency)
    local s = Instance.new("UIStroke")
    s.Color = color or C.Border
    s.Thickness = thickness or 1
    s.Transparency = transparency or 0.5
    s.Parent = parent
    return s
end

local function AddPadding(parent, l, t, r, b)
    local p = Instance.new("UIPadding")
    p.PaddingLeft = UDim.new(0, l or 0)
    p.PaddingTop = UDim.new(0, t or 0)
    p.PaddingRight = UDim.new(0, r or 0)
    p.PaddingBottom = UDim.new(0, b or 0)
    p.Parent = parent
    return p
end

local function Smooth(inst, props, dur)
    return TweenService:Create(inst, TweenInfo.new(dur or 0.25, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), props)
end

local function Spring(inst, props, dur)
    return TweenService:Create(inst, TweenInfo.new(dur or 0.4, Enum.EasingStyle.Back, Enum.EasingDirection.Out), props)
end

local function Quick(inst, props)
    return TweenService:Create(inst, TweenInfo.new(0.1, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), props)
end

local function PlaySound(id, vol, pitch)
    pcall(function()
        local s = Instance.new("Sound")
        s.SoundId = "rbxassetid://" .. tostring(id)
        s.Volume = vol or 0.2
        s.PlaybackSpeed = pitch or 1
        s.Parent = PlayerGui
        s:Play()
        s.Ended:Connect(function() s:Destroy() end)
        task.delay(3, function() if s and s.Parent then s:Destroy() end end)
    end)
end

-- 
-- Notification
-- 
local notifContainer = Create("ScreenGui", {
    Name = "Desync_Notifs",
    ResetOnSpawn = false,
    ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
    Parent = PlayerGui,
})
Create("UIListLayout", {
    SortOrder = Enum.SortOrder.LayoutOrder,
    Padding = UDim.new(0, 4),
    VerticalAlignment = Enum.VerticalAlignment.Top,
    HorizontalAlignment = Enum.HorizontalAlignment.Right,
    Parent = notifContainer,
})
local np = Instance.new("UIPadding")
np.PaddingTop = UDim.new(0, 10)
np.PaddingRight = UDim.new(0, 10)
np.Parent = notifContainer

local function Notify(text, notifType)
    PlaySound(6895079853, 0.15, 1.1)
    local types = {
        success = C.Green,
        error = C.Red,
        info = C.Accent,
        warning = C.Yellow,
    }
    local col = types[notifType] or types.info

    local notif = Create("Frame", {
        BackgroundColor3 = C.Surface,
        BackgroundTransparency = 0.05,
        Size = UDim2.new(0, 240, 0, 34),
        BorderSizePixel = 0,
        Position = UDim2.new(1.5, 0, 0, 0),
        Parent = notifContainer,
    })
    AddCorner(notif, 6)
    AddStroke(notif, C.Border, 1, 0.6)

    Create("Frame", {
        BackgroundColor3 = col,
        Size = UDim2.new(0, 3, 1, 0),
        BorderSizePixel = 0,
        Parent = notif,
    })

    Create("TextLabel", {
        Text = text,
        Font = Enum.Font.GothamBold,
        TextSize = 11,
        TextColor3 = C.Text,
        TextXAlignment = Enum.TextXAlignment.Left,
        BackgroundTransparency = 1,
        Size = UDim2.new(1, -18, 1, 0),
        Position = UDim2.new(0, 12, 0, 0),
        TextTruncate = Enum.TextTruncate.AtEnd,
        Parent = notif,
    })

    Spring(notif, { Position = UDim2.new(1, 0, 0, 0) }, 0.4):Play()

    task.delay(3, function()
        if notif and notif.Parent then
            Smooth(notif, { Position = UDim2.new(1.5, 0, 0, 0), BackgroundTransparency = 1 }, 0.25):Play()
            task.delay(0.3, function() if notif and notif.Parent then notif:Destroy() end end)
        end
    end)
end

-- 
-- Desync Logic
-- 
local function getRoot(char)
    return char:FindFirstChild("HumanoidRootPart")
        or char:FindFirstChild("Torso")
        or char:FindFirstChild("UpperTorso")
end

-- 
-- Activation Function
-- 
local function ToggleDesync()
    local character = LocalPlayer.Character
    if not character then return end
    local root = getRoot(character)
    if not root then return end

    desyncActive = not desyncActive

    if desyncActive then
        -- TURN DESYNC ON
        savedCFrame = root.CFrame
        hiddenPos = savedCFrame * CFrame.new(0, 500, 0) -- Teleports server model up high
        
        -- Start Desync Loop
        desyncLoop = RunService.Heartbeat:Connect(function()
            if character and getRoot(character) then
                -- Add your explicit position desync replication code here
            end
        end)
        
        Notify("Desync Activated", "success")
    else
        -- TURN DESYNC OFF
        if desyncLoop then
            desyncLoop:Disconnect()
            desyncLoop = nil
        end
        
        -- Return to visual placement
        if savedCFrame then
            root.CFrame = savedCFrame
        end
        
        Notify("Desync Deactivated", "info")
    end
end

-- 
-- Keybind Listener (Press X to Toggle)
-- 
UserInputService.InputBegan:Connect(function(input, gameProcessedEvent)
    -- This makes sure the cheat doesn't toggle when typing in game chat
    if gameProcessedEvent then return end 
    
    if input.KeyCode == Enum.KeyCode.X then
        ToggleDesync()
    end
end)
-- ═══ Speed Button ═══
local speedRow = Create("Frame", {
    BackgroundColor3 = C.Surface,
    BackgroundTransparency = 0.7,
    Size = UDim2.new(1, 0, 0, 44),
    BorderSizePixel = 0,
    LayoutOrder = 3,
    Parent = content,
})
AddCorner(speedRow, 6)

Create("TextLabel", {
    Text = "Speed Boost",
    Font = Enum.Font.GothamBold,
    TextSize = 11,
    TextColor3 = C.TextBright,
    TextXAlignment = Enum.TextXAlignment.Left,
    BackgroundTransparency = 1,
    Size = UDim2.new(1, 0, 0, 14),
    Position = UDim2.new(0, 10, 0, 3),
    Parent = speedRow,
})
Create("TextLabel", {
    Text = "Faster movement while desynced",
    Font = Enum.Font.Gotham,
    TextSize = 8,
    TextColor3 = C.TextMuted,
    TextXAlignment = Enum.TextXAlignment.Left,
    BackgroundTransparency = 1,
    Size = UDim2.new(1, 0, 0, 12),
    Position = UDim2.new(0, 10, 0, 18),
    Parent = speedRow,
})

local speedBtn = Create("TextButton", {
    Text = "Speed OFF",
    Font = Enum.Font.GothamBold,
    TextSize = 9,
    TextColor3 = C.White,
    BackgroundColor3 = C.SurfaceLt,
    Size = UDim2.new(0, 56, 0, 22),
    Position = UDim2.new(1, -66, 0.5, 0),
    AnchorPoint = Vector2.new(0, 0.5),
    Parent = speedRow,
})
AddCorner(speedBtn, 5)

speedRow.MouseEnter:Connect(function() Quick(speedRow, { BackgroundTransparency = 0.55 }):Play() end)
speedRow.MouseLeave:Connect(function() Quick(speedRow, { BackgroundTransparency = 0.7 }):Play() end)

speedBtn.MouseButton1Click:Connect(function()
    PlaySound(6895079853, 0.15, 1.2)
    Quick(speedBtn, { Size = UDim2.new(0, 50, 0, 19) }):Play()
    task.delay(0.1, function()
        Spring(speedBtn, { Size = UDim2.new(0, 56, 0, 22) }, 0.3):Play()
    end)

    speedBoosted = not speedBoosted
    local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("Humanoid")
    if hum then
        if speedBoosted then
            hum.WalkSpeed = 100
            speedBtn.Text = "Speed ON"
            speedBtn.BackgroundColor3 = C.GreenDim
            Notify("Speed: 100", "success")
        else
            hum.WalkSpeed = defaultSpeed
            speedBtn.Text = "Speed OFF"
            speedBtn.BackgroundColor3 = C.SurfaceLt
            Notify("Speed: " .. defaultSpeed, "info")
        end
    end
end)

-- Spacer
Create("Frame", {
    BackgroundTransparency = 1,
    Size = UDim2.new(1, 0, 0, 8),
    LayoutOrder = 4,
    Parent = content,
})

-- ═══ Speed Slider ═══
local sliderSection = Create("Frame", {
    BackgroundColor3 = C.Surface,
    BackgroundTransparency = 0.7,
    Size = UDim2.new(1, 0, 0, 52),
    BorderSizePixel = 0,
    LayoutOrder = 5,
    Parent = content,
})
AddCorner(sliderSection, 6)

Create("TextLabel", {
    Text = "Speed Value",
    Font = Enum.Font.GothamBold,
    TextSize = 11,
    TextColor3 = C.TextBright,
    TextXAlignment = Enum.TextXAlignment.Left,
    BackgroundTransparency = 1,
    Size = UDim2.new(1, -65, 0, 14),
    Position = UDim2.new(0, 10, 0, 4),
    Parent = sliderSection,
})
Create("TextLabel", {
    Text = "Set walk speed when boosted",
    Font = Enum.Font.Gotham,
    TextSize = 8,
    TextColor3 = C.TextMuted,
    TextXAlignment = Enum.TextXAlignment.Left,
    BackgroundTransparency = 1,
    Size = UDim2.new(1, -65, 0, 12),
    Position = UDim2.new(0, 10, 0, 18),
    Parent = sliderSection,
})

-- Value badge
local speedVal = Create("TextLabel", {
    Text = "100",
    Font = Enum.Font.GothamBold,
    TextSize = 10,
    TextColor3 = C.AccentGlow,
    BackgroundColor3 = C.SurfaceMid,
    Size = UDim2.new(0, 44, 0, 18),
    Position = UDim2.new(1, -54, 0, 4),
    Parent = sliderSection,
})
AddCorner(speedVal, 4)
AddStroke(speedVal, C.Border, 1, 0.5)

-- Track
local track = Create("Frame", {
    BackgroundColor3 = C.SurfaceLt,
    Size = UDim2.new(1, -20, 0, 4),
    Position = UDim2.new(0, 10, 1, -12),
    Parent = sliderSection,
})
AddCorner(track, 2)

local fill = Create("Frame", {
    BackgroundColor3 = C.Accent,
    Size = UDim2.new(0, 0, 1, 0),
    Position = UDim2.new(0, 0, 0, 0),
    Parent = track,
})
AddCorner(fill, 2)

local sliderThumb = Create("Frame", {
    BackgroundColor3 = C.White,
    Size = UDim2.new(0, 12, 0, 12),
    Position = UDim2.new(0, -6, 0.5, 0),
    Parent = track,
})
AddCorner(sliderThumb, 6)

local speedSliderVal = 100
local speedMin, speedMax, speedStep = 16, 500, 1

local function updateSpeedSlider(val)
    speedSliderVal = math.clamp(math.round(val / speedStep) * speedStep, speedMin, speedMax)
    currentSpeed = speedSliderVal
    local pct = (speedSliderVal - speedMin) / (speedMax - speedMin)
    pct = math.clamp(pct, 0, 1)
    fill.Size = UDim2.new(pct, 0, 1, 0)
    sliderThumb.Position = UDim2.new(pct, -6, 0.5, 0)
    speedVal.Text = tostring(speedSliderVal)
    -- If speed boost is on, apply immediately
    if speedBoosted then
        local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("Humanoid")
        if hum then hum.WalkSpeed = speedSliderVal end
    end
end

updateSpeedSlider(100)

sliderSection.MouseEnter:Connect(function() Quick(sliderSection, { BackgroundTransparency = 0.55 }):Play() end)
sliderSection.MouseLeave:Connect(function() Quick(sliderSection, { BackgroundTransparency = 0.7 }):Play() end)

local sliderDragging = false
sliderThumb.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        sliderDragging = true
        PlaySound(6895079853, 0.1, 0.8)
    end
end)
track.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        sliderDragging = true
        PlaySound(6895079853, 0.1, 0.8)
        local relX = (input.Position.X - track.AbsolutePosition.X) / track.AbsoluteSize.X
        updateSpeedSlider(speedMin + relX * (speedMax - speedMin))
    end
end)
UserInputService.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        if sliderDragging then sliderDragging = false end
    end
end)
UserInputService.InputChanged:Connect(function(input)
    if sliderDragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
        local relX = math.clamp((input.Position.X - track.AbsolutePosition.X) / track.AbsoluteSize.X, 0, 1)
        updateSpeedSlider(speedMin + relX * (speedMax - speedMin))
    end
end)

-- Spacer
Create("Frame", {
    BackgroundTransparency = 1,
    Size = UDim2.new(1, 0, 0, 8),
    LayoutOrder = 6,
    Parent = content,
})

-- ═══ Transparency Slider ═══
local transSection = Create("Frame", {
    BackgroundColor3 = C.Surface,
    BackgroundTransparency = 0.7,
    Size = UDim2.new(1, 0, 0, 52),
    BorderSizePixel = 0,
    LayoutOrder = 7,
    Parent = content,
})
AddCorner(transSection, 6)

Create("TextLabel", {
    Text = "Visibility",
    Font = Enum.Font.GothamBold,
    TextSize = 11,
    TextColor3 = C.TextBright,
    TextXAlignment = Enum.TextXAlignment.Left,
    BackgroundTransparency = 1,
    Size = UDim2.new(1, -65, 0, 14),
    Position = UDim2.new(0, 10, 0, 4),
    Parent = transSection,
})
Create("TextLabel", {
    Text = "Character transparency",
    Font = Enum.Font.Gotham,
    TextSize = 8,
    TextColor3 = C.TextMuted,
    TextXAlignment = Enum.TextXAlignment.Left,
    BackgroundTransparency = 1,
    Size = UDim2.new(1, -65, 0, 12),
    Position = UDim2.new(0, 10, 0, 18),
    Parent = transSection,
})

local transVal = Create("TextLabel", {
    Text = "0.5",
    Font = Enum.Font.GothamBold,
    TextSize = 10,
    TextColor3 = C.AccentGlow,
    BackgroundColor3 = C.SurfaceMid,
    Size = UDim2.new(0, 44, 0, 18),
    Position = UDim2.new(1, -54, 0, 4),
    Parent = transSection,
})
AddCorner(transVal, 4)
AddStroke(transVal, C.Border, 1, 0.5)

local transTrack = Create("Frame", {
    BackgroundColor3 = C.SurfaceLt,
    Size = UDim2.new(1, -20, 0, 4),
    Position = UDim2.new(0, 10, 1, -12),
    Parent = transSection,
})
AddCorner(transTrack, 2)

local transFill = Create("Frame", {
    BackgroundColor3 = C.Accent,
    Size = UDim2.new(0, 0, 1, 0),
    Position = UDim2.new(0, 0, 0, 0),
    Parent = transTrack,
})
AddCorner(transFill, 2)

local transThumb = Create("Frame", {
    BackgroundColor3 = C.White,
    Size = UDim2.new(0, 12, 0, 12),
    Position = UDim2.new(0, -6, 0.5, 0),
    Parent = transTrack,
})
AddCorner(transThumb, 6)

local transSliderVal = 0.5
local transMin, transMax, transStep = 0, 1, 0.05
local desyncTransparency = 0.5

local function updateTransSlider(val)
    transSliderVal = math.clamp(math.round(val / transStep) * transStep, transMin, transMax)
    desyncTransparency = transSliderVal
    local pct = (transSliderVal - transMin) / (transMax - transMin)
    pct = math.clamp(pct, 0, 1)
    transFill.Size = UDim2.new(pct, 0, 1, 0)
    transThumb.Position = UDim2.new(pct, -6, 0.5, 0)
    transVal.Text = tostring(transSliderVal)
    -- Apply live if desync is active
    if desyncActive and LocalPlayer.Character then
        setCharacterTransparency(LocalPlayer.Character, desyncTransparency)
    end
end

updateTransSlider(0.5)

transSection.MouseEnter:Connect(function() Quick(transSection, { BackgroundTransparency = 0.55 }):Play() end)
transSection.MouseLeave:Connect(function() Quick(transSection, { BackgroundTransparency = 0.7 }):Play() end)

local transDragging = false
transThumb.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        transDragging = true
        PlaySound(6895079853, 0.1, 0.8)
    end
end)
transTrack.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        transDragging = true
        PlaySound(6895079853, 0.1, 0.8)
        local relX = (input.Position.X - transTrack.AbsolutePosition.X) / transTrack.AbsoluteSize.X
        updateTransSlider(transMin + relX * (transMax - transMin))
    end
end)
UserInputService.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        if transDragging then transDragging = false end
    end
end)
UserInputService.InputChanged:Connect(function(input)
    if transDragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
        local relX = math.clamp((input.Position.X - transTrack.AbsolutePosition.X) / transTrack.AbsoluteSize.X, 0, 1)
        updateTransSlider(transMin + relX * (transMax - transMin))
    end
end)

-- Spacer
Create("Frame", {
    BackgroundTransparency = 1,
    Size = UDim2.new(1, 0, 0, 8),
    LayoutOrder = 8,
    Parent = content,
})

-- ═══ Info ═══
Create("TextLabel", {
    Text = "Toggle desync on, walk around\nfreely, then toggle off to TP\nto where you are visually.",
    Font = Enum.Font.Gotham,
    TextSize = 8,
    TextColor3 = C.TextMuted,
    TextXAlignment = Enum.TextXAlignment.Left,
    BackgroundTransparency = 1,
    Size = UDim2.new(1, 0, 0, 30),
    TextWrapped = true,
    LayoutOrder = 9,
    Parent = content,
})

-- Bottom spacer
Create("Frame", {
    BackgroundTransparency = 1,
    Size = UDim2.new(1, 0, 0, 6),
    LayoutOrder = 10,
    Parent = content,
})

-- ═══ Keyboard Shortcut ═══
UserInputService.InputBegan:Connect(function(input, processed)
    if processed then return end
    if input.KeyCode == Enum.KeyCode.X then
        desyncBtn.MouseButton1Click:Fire()
    end
end)

-- ═══ Reset on respawn ═══
LocalPlayer.CharacterAdded:Connect(function(char)
    -- Reset state
    if desyncActive then
        desyncActive = false
        if desyncLoop then desyncLoop:Disconnect() desyncLoop = nil end
        if invisSeat and invisSeat.Parent then invisSeat:Destroy() end
        invisSeat = nil
        invisWeld = nil
        savedCFrame = nil
        desyncBtn.Text = "OFF"
        desyncBtn.BackgroundColor3 = C.SurfaceLt
        statusDot.BackgroundColor3 = C.TextMuted
    end
    speedBoosted = false
    speedBtn.Text = "Speed OFF"
    speedBtn.BackgroundColor3 = C.SurfaceLt
    Notify("Desync reset (respawn)", "warning")
end)

-- ═══ Anti-seat-cleanup loop ═══
-- Some games delete workspace parts periodically, silently recreate the seat instead of turning off
task.spawn(function()
    while task.wait(0.5) do
        if desyncActive and (not invisSeat or not invisSeat.Parent) then
            -- Seat got deleted by the game, silently recreate it
            local char = LocalPlayer.Character
            if not char then continue end
            local root = getRoot(char)
            local torso = getTorso(char)
            if not root or not torso then continue end

            -- Recreate seat at hidden pos
            invisSeat = Instance.new("Seat")
            invisSeat.Name = "DesyncSeat_" .. math.random(10000, 99999)
            invisSeat.Anchored = false
            invisSeat.CanCollide = false
            invisSeat.Transparency = 1
            invisSeat.Size = Vector3.new(2, 1, 1)
            invisSeat.Position = hiddenPos
            invisSeat.Parent = workspace

            -- Weld it
            invisWeld = Instance.new("Weld")
            invisWeld.Name = "DesyncWeld"
            invisWeld.Part0 = invisSeat
            invisWeld.Part1 = torso
            invisWeld.Parent = invisSeat

            task.wait()
            -- Snap seat to where the player visually is
            invisSeat.CFrame = root.CFrame
        end
    end
end)

-- ═══ Open animation ═══
main.Size = UDim2.new(0, 0, 0, 0)
main.BackgroundTransparency = 1
task.delay(0.05, function()
    PlaySound(6895079853, 0.25, 0.9)
    Spring(main, {
        Size = UDim2.new(0, 200, 0, 390),
        BackgroundTransparency = 0.04,
    }, 0.6):Play()
    Smooth(glow, { BackgroundTransparency = 0.95 }, 0.4):Play()
end)

Notify("Desync loaded! Press X to toggle", "success")

Features & Information

click x to desync your player from the game and you can speed yourself up

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts