Run it
Copy the script and paste it into your executor.
HttpService = :()
UserInputService = :()
RunService = :()
Players = :()
LocalPlayer = Players.LocalPlayer
UserId = LocalPlayer.UserId
FileName = UserId ..
isMobile = UserInputService.TouchEnabled
guiWidth = isMobile
guiHeight = isMobile
ScreenGui = .()
ScreenGui.Name =
ScreenGui.Parent = :()
ScreenGui.ResetOnSpawn =
NotebookData = {[] = }
CurrentTab =
IsMinimized =
TutorialContent =
MainFrame = .()
MainFrame.Size = .(, guiWidth, , guiHeight)
MainFrame.Position = .(, -guiWidth/, , -guiHeight/)
MainFrame.BackgroundColor3 = .(, , )
MainFrame.BorderSizePixel =
MainFrame.Active =
MainFrame.Parent = ScreenGui
DragHandle = .()
DragHandle.Size = .(, , , )
DragHandle.BackgroundColor3 = .(, , )
DragHandle.Text =
DragHandle.Font = .Font.SourceSansBold
DragHandle.Parent = MainFrame
CloseBtn = .()
CloseBtn.Size = .(, , , ); CloseBtn.Position = .(, -, , )
CloseBtn.Text = ; CloseBtn.BackgroundColor3 = .(, , ); CloseBtn.Parent = DragHandle
MinBtn = .()
MinBtn.Size = .(, , , ); MinBtn.Position = .(, -, , )
MinBtn.Text = ; MinBtn.BackgroundColor3 = .(, , ); MinBtn.Parent = DragHandle
AddNoteMenu = .()
AddNoteMenu.Size = .(, , , )
AddNoteMenu.Position = .(, -, , -)
AddNoteMenu.BackgroundColor3 = .(, , )
AddNoteMenu.BorderSizePixel =
AddNoteMenu.Visible =
AddNoteMenu.Parent = MainFrame
NameInput = .()
NameInput.Size = .(, -, , ); NameInput.Position = .(, , , -)
NameInput.PlaceholderText = ; NameInput.Text = ; NameInput.Parent = AddNoteMenu
SubmitBtn = .()
SubmitBtn.Size = .(, -, , ); SubmitBtn.Position = .(, , , -)
SubmitBtn.Text = ; SubmitBtn.Parent = AddNoteMenu
ToolBar = .()
ToolBar.Size = .(, , , ); ToolBar.Position = .(, , , )
ToolBar.BackgroundColor3 = .(, , ); ToolBar.Parent = MainFrame
SaveBtn = .()
SaveBtn.Size = .(, , , -); SaveBtn.Position = .(, , , )
SaveBtn.Text = ; SaveBtn.BackgroundColor3 = .(, , ); SaveBtn.Parent = ToolBar
AddBtn = .()
AddBtn.Size = .(, , , -); AddBtn.Position = .(, , , )
AddBtn.Text = ; AddBtn.BackgroundColor3 = .(, , ); AddBtn.Parent = ToolBar
TabScroll = .()
TabScroll.Size = .(, -, , ); TabScroll.Position = .(, , , )
TabScroll.BackgroundTransparency = ; TabScroll.CanvasSize = .(, , , )
TabScroll.ScrollBarThickness = ; TabScroll.Parent = ToolBar
TabList = .()
TabList.FillDirection = .FillDirection.Horizontal; TabList.Padding = .(, ); TabList.Parent = TabScroll
ContentScroll = .()
ContentScroll.Size = .(, -, , -); ContentScroll.Position = .(, , , )
ContentScroll.BackgroundColor3 = .(, , ); ContentScroll.CanvasSize = .(, , , )
ContentScroll.ScrollBarThickness = ; ContentScroll.Parent = MainFrame
ContentBox = .()
ContentBox.Size = .(, -, , ); ContentBox.Position = .(, , , )
ContentBox.MultiLine = ; ContentBox.TextWrapped = ; ContentBox.TextXAlignment = .TextXAlignment.Left; ContentBox.TextYAlignment = .TextYAlignment.Top
ContentBox.BackgroundTransparency = ; ContentBox.ClearTextOnFocus = ; ContentBox.Parent = ContentScroll
()
_, v (TabScroll:()) v:() v:()
(name, isTut)
f = .(); f.Size = .(, , , -); f.BackgroundColor3 = (CurrentTab == name) .(, , ) .(, , ); f.Parent = TabScroll
b = .(); b.Size = isTut .(,,,) .(,,,); b.Text = name; b.BackgroundTransparency = ; b.Parent = f
b.MouseButton1Click:(()
CurrentTab ~= NotebookData[CurrentTab] = ContentBox.Text
CurrentTab = name; ContentBox.Text = isTut TutorialContent NotebookData[name]; ContentBox.ReadOnly = isTut; ()
)
isTut name ~=
d = .(); d.Size = .(,,,); d.Position = .(,,,); d.Text = ; d.TextColor3 = .(,,); d.BackgroundTransparency = ; d.Parent = f
d.MouseButton1Click:(() NotebookData[name] = ; CurrentTab = ; ContentBox.Text = NotebookData[]; () )
(, )
n, _ (NotebookData) n ~= (n, )
SubmitBtn.MouseButton1Click:(()
NameInput.Text ~= NameInput.Text ~=
NotebookData[CurrentTab] = ContentBox.Text
NotebookData[NameInput.Text] = ; CurrentTab = NameInput.Text
ContentBox.Text = ; AddNoteMenu.Visible = ; NameInput.Text = ; ()
)
MinBtn.MouseButton1Click:(()
IsMinimized = IsMinimized
ContentScroll.Visible = IsMinimized; ToolBar.Visible = IsMinimized
MainFrame.Size = IsMinimized .(, guiWidth, , ) .(, guiWidth, , guiHeight)
)
SaveBtn.MouseButton1Click:(()
writefile
CurrentTab ~= NotebookData[CurrentTab] = ContentBox.Text
(FileName, HttpService:(NotebookData))
SaveBtn.Text = ; .(); SaveBtn.Text =
)
AddBtn.MouseButton1Click:(() AddNoteMenu.Visible = AddNoteMenu.Visible )
CloseBtn.MouseButton1Click:(() ScreenGui:() )
dragging, dragStart, startPos
DragHandle.InputBegan:((input) input.UserInputType == .UserInputType.MouseButton1 input.UserInputType == .UserInputType.Touch dragging = ; dragStart = input.Position; startPos = MainFrame.Position )
UserInputService.InputEnded:((input) input.UserInputType == .UserInputType.MouseButton1 input.UserInputType == .UserInputType.Touch dragging = )
RunService.RenderStepped:(() dragging inputPos = UserInputService:(); MainFrame.Position = .(, inputPos.X - (guiWidth/), , inputPos.Y - ) )
isfile (FileName) s, d = (() HttpService:((FileName)) ) s NotebookData = d
ContentBox.Text = NotebookData[] ; ()
This script uses a Local-First Storage System to ensure your notes are persistent, private, and organized. How it Works: Local File Creation: The script utilizes the executor's writefile() function to create a physical .json document directly on your device. It stays in your executor's Workspace folder. UserId Account Locking: To prevent notes from being mixed up, the filename is prefixed with your unique Roblox UserId. This ensures that even on a shared device, only the account that wrote the notes can load them. Zero Server Interaction: Your text is never sent to a database, a Discord webhook, or any external website. All data remains offline on your hardware. JSON Serialization: The script converts your notes into a structured data format called JSON. This allows the script to remember multiple tabs, their specific titles, and the exact text inside each one. Cross-Session Persistence: Because the file is saved to your storage, you can close Roblox, update your executor, or switch games, and your notes will be waiting for you the next time you execute the script. Why this is Secure: Invisible to Game Devs: Since the saving happens through the executor's internal system, game owne

Universal