
This script Clean The Library focuses on the core mechanic of the game: sorting and organizing books. The Organize Book feature helps automate the most repetitive part of the experience, allowing books to be placed where they belong without constant manual effort.
Instead of spending an entire session carrying books back and forth between shelves, you can speed up the cleanup process and keep progressing toward upgrades, abilities, and better leaderboard times. It's especially useful for players who want to farm rewards efficiently or complete large sections of the library much faster than normal.
The game's progression depends heavily on how quickly you can sort books and clean the library. This script automates the most time-consuming task, making it easier to earn upgrades, improve completion times, and focus on exploring the library rather than endlessly moving books around.
Script Clean The Library Script (No Key) – Auto Organize Books

-- Simple Book Organizer with Single Toggle
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
local CollectionService = game:GetService("CollectionService")
local UserInputService = game:GetService("UserInputService")
-- Settings
local Settings = {
Enabled = false,
FastMode = false -- Optional: can add as sub-toggle
}
-- GUI Creation
local function CreateUI()
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "BookOrganizerGUI"
screenGui.Parent = Players.LocalPlayer:WaitForChild("PlayerGui")
-- Main Frame
local mainFrame = Instance.new("Frame")
mainFrame.Size = UDim2.new(0, 300, 0, 120)
mainFrame.Position = UDim2.new(0.5, -150, 0.5, -60)
mainFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
mainFrame.BackgroundTransparency = 0.05
mainFrame.BorderSizePixel = 0
mainFrame.ClipsDescendants = true
mainFrame.Parent = screenGui
-- Title
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, 0, 0, 35)
title.Position = UDim2.new(0, 0, 0, 0)
title.BackgroundColor3 = Color3.fromRGB(50, 50, 70)
title.BackgroundTransparency = 0.3
title.Text = "📚 Book Organizer"
title.TextColor3 = Color3.fromRGB(255, 255, 255)
title.TextSize = 16
title.Font = Enum.Font.GothamBold
title.BorderSizePixel = 0
title.Parent = mainFrame
-- Close Button
local closeBtn = Instance.new("TextButton")
closeBtn.Size = UDim2.new(0, 25, 0, 25)
closeBtn.Position = UDim2.new(1, -30, 0, 5)
closeBtn.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
closeBtn.BackgroundTransparency = 0.5
closeBtn.Text = "✕"
closeBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
closeBtn.TextSize = 14
closeBtn.Font = Enum.Font.GothamBold
closeBtn.BorderSizePixel = 0
closeBtn.Parent = mainFrame
-- Status Label
local statusLabel = Instance.new("TextLabel")
statusLabel.Size = UDim2.new(1, -20, 0, 25)
statusLabel.Position = UDim2.new(0, 10, 0, 40)
statusLabel.BackgroundTransparency = 1
statusLabel.Text = "🔴 Disabled"
statusLabel.TextColor3 = Color3.fromRGB(255, 100, 100)
statusLabel.TextSize = 14
statusLabel.Font = Enum.Font.Gotham
statusLabel.TextXAlignment = Enum.TextXAlignment.Left
statusLabel.Parent = mainFrame
-- Toggle Button
local toggleBtn = Instance.new("TextButton")
toggleBtn.Size = UDim2.new(0, 80, 0, 35)
toggleBtn.Position = UDim2.new(1, -90, 0, 70)
toggleBtn.BackgroundColor3 = Color3.fromRGB(200, 60, 60)
toggleBtn.BackgroundTransparency = 0.2
toggleBtn.Text = "START"
toggleBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
toggleBtn.TextSize = 14
toggleBtn.Font = Enum.Font.GothamBold
toggleBtn.BorderSizePixel = 0
toggleBtn.Parent = mainFrame
-- Dragging
local dragging = false
local dragStart, startPos
mainFrame.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
dragging = true
dragStart = input.Position
startPos = mainFrame.Position
end
end)
mainFrame.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
dragging = false
end
end)
UserInputService.InputChanged:Connect(function(input)
if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then
local delta = input.Position - dragStart
mainFrame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
end
end)
closeBtn.MouseButton1Click:Connect(function()
Settings.Enabled = false
screenGui:Destroy()
end)
return screenGui, toggleBtn, statusLabel
end
-- Main Script Logic
local gui, toggleBtn, statusLabel = CreateUI()
local isRunning = false
local currentCoroutine = nil
local Loader = require(ReplicatedStorage.Packages.Loader)
local ReplicaController = require(Loader.Shared.Utility.ReplicaController)
local BooksData = require(Loader.Shared.Data.Books)
local LibraryReplica = nil
for _, r in pairs(ReplicaController._replicas) do
if r.Class == "Library" then LibraryReplica = r break end
end
if not LibraryReplica then
ReplicaController.ReplicaOfClassCreated("Library", function(replica) LibraryReplica = replica end)
while not LibraryReplica do task.wait() end
end
local Library = Workspace.Library
local BooksFolder = Library.Books
local player = Players.LocalPlayer
-- Setup Camera
player.CameraMode = Enum.CameraMode.Classic
player.CameraMinZoomDistance = 20
task.spawn(function() task.wait(0.1) player.CameraMinZoomDistance = 0.5 end)
local shelfModels = {}
for _, shelfModel in ipairs(CollectionService:GetTagged("Shelf")) do
shelfModels[shelfModel.Name] = shelfModel
end
local function getShelfAssignedSeries(shelfId)
local shelfData = LibraryReplica.Data.Shelves[shelfId]
if not shelfData then return nil end
for _, placedBook in pairs(shelfData.Books) do
local bookName = typeof(placedBook) == "Instance" and placedBook.Name or placedBook
local seriesName = bookName:match("^(.-)_(.+)$")
if seriesName then return seriesName end
end
end
local function findShelfForSeries(seriesName, genreName, volumeCount)
for shelfId, shelfData in pairs(LibraryReplica.Data.Shelves) do
if not shelfData.Completed and shelfData.Category == genreName then
local shelfModel = shelfModels[shelfId]
if shelfModel and shelfModel:GetAttribute("Width") == volumeCount then
if getShelfAssignedSeries(shelfId) == seriesName then return shelfModel end
end
end
end
for shelfId, shelfData in pairs(LibraryReplica.Data.Shelves) do
if not shelfData.Completed and shelfData.Category == genreName then
local shelfModel = shelfModels[shelfId]
if shelfModel and shelfModel:GetAttribute("Width") == volumeCount then
if not getShelfAssignedSeries(shelfId) and next(shelfData.Books) == nil then return shelfModel end
end
end
end
end
local function teleportTo(obj)
local char = player.Character
local root = char and char:FindFirstChild("HumanoidRootPart")
local part = obj:IsA("Model") and (obj.PrimaryPart or obj:FindFirstChildOfClass("BasePart")) or obj
if root and part then
root.CFrame = CFrame.new(part.Position + Vector3.new(0, 2, 0))
task.wait(0.05)
end
end
local function organizeBooks()
for _, book in ipairs(BooksFolder:GetChildren()) do
if not isRunning then break end
task.wait(0.02)
local seriesName, volumeStr = book.Name:match("^(.-)_(.+)$")
local volumeNum = tonumber(volumeStr)
if seriesName and volumeNum then
local genreName, bookInfo = BooksData.GetCategory(seriesName)
if genreName and bookInfo then
local shelfModel = findShelfForSeries(seriesName, genreName, bookInfo.VolumeCount)
if shelfModel then
local shelfData = LibraryReplica.Data.Shelves[shelfModel.Name]
if not (shelfData and shelfData.Books[tostring(volumeNum)]) then
teleportTo(book)
LibraryReplica:FireServer("Grab", book)
task.wait(0.1)
teleportTo(shelfModel)
LibraryReplica:FireServer("Place", shelfModel, volumeNum - 1)
task.wait(0.4)
end
end
end
end
end
end
-- Toggle functionality
local function toggleScript()
isRunning = not isRunning
if isRunning then
toggleBtn.Text = "STOP"
toggleBtn.BackgroundColor3 = Color3.fromRGB(60, 200, 60)
statusLabel.Text = "🟢 Running..."
statusLabel.TextColor3 = Color3.fromRGB(100, 255, 100)
Settings.Enabled = true
if currentCoroutine then
task.cancel(currentCoroutine)
end
currentCoroutine = task.spawn(function()
while isRunning do
local success, err = pcall(organizeBooks)
if not success then
warn("Error: " .. err)
statusLabel.Text = "❌ Error: " .. err
statusLabel.TextColor3 = Color3.fromRGB(255, 100, 100)
task.wait(2)
end
task.wait(5) -- Wait before next cycle
end
end)
else
toggleBtn.Text = "START"
toggleBtn.BackgroundColor3 = Color3.fromRGB(200, 60, 60)
statusLabel.Text = "🔴 Disabled"
statusLabel.TextColor3 = Color3.fromRGB(255, 100, 100)
Settings.Enabled = false
if currentCoroutine then
task.cancel(currentCoroutine)
currentCoroutine = nil
end
end
end
toggleBtn.MouseButton1Click:Connect(toggleScript)
-- Cleanup
game:GetService("Players").LocalPlayer:WaitForChild("PlayerGui").ChildRemoved:Connect(function(child)
if child.Name == "BookOrganizerGUI" and isRunning then
isRunning = false
if currentCoroutine then
task.cancel(currentCoroutine)
end
end
end)
print("✅ Book Organizer loaded! Click START to begin organizing.")📚 Script Features
Organize Book
No Key System