The reason the TextButton is registered as nil is because you have used FindFirstChild(), which is generally used when you are unsure that a child will exist.
In this case, since it is a client-side script, you need to replace FindFirstChild() with WaitForChild(), which will yield the code until the given child exists. WaitForChild() is very helpful within the client when a given object is needed for the code to run correctly.
Example:
local updatebutton = buttons:WaitForChild("UpdatesButton")
--this will make the script wait until the child exists. Make sure you
--put the correct name in character for character, otherwise you can get an infinite yield error where it is waiting forever.
Ah yes this helped, I also changed a few things @12345koip@Doomcolp
I did what you both said, there are no errors, but the frame doesn’t show up when i click the updates button
local sgui = startergui.MainMenuGUI
local mainframe = sgui:FindFirstChild("MainFrame")
local buttons = mainframe:FindFirstChild("Buttons")
local updatebutton = buttons:WaitForChild("UpdatesButton")
local openframe = mainframe:WaitForChild("UpdateLogFrame")
openframe.Visible = false
script.Parent.MouseButton1Click:Connect(function(click)
openframe.Visible = true
end)