catnhub (OPEN-SOURCE)
Has scripts for ABA, Monday Morning Misery and Climb for Animals Eggs. Pretty decent ui, built off of bypass hub ui
the risk scan cleared this script. it still noticed a few things:
risk 1/10 · safe
sends data to or loads code from discord.gg, cdn.jsdelivr.net, 127.0.0.1, games.roblox.com.
loadstring(game:HttpGet("https://pasteblox.com/raw/catnba/catn"))()pbx pull 8z9nkyq4xxraw link never changes · v2 live
what's new in v2
· @catnbamade completely open source
including every script
-- https://discord.gg/TwqtNreVMr for updates
local Vanta = (function(...)
local Players = game:GetService("Players");
local TweenService = game:GetService("TweenService");
local UserInputService = game:GetService("UserInputService");
local HttpService = game:GetService("HttpService");
local RunService = game:GetService("RunService");
local Lighting = game:GetService("Lighting");
local CoreGui = game:GetService("CoreGui");
local plr = Players.LocalPlayer;
local unpack = table.unpack or unpack;
local Vanta = {Version="2.1"};
local U = {fast=false};
local function rgb(r, g, b)
return Color3.fromRGB(r, g, b);
end
local THEMES = {Graphite={Background=rgb(9, 9, 11),Sidebar=rgb(12, 12, 14),Panel=rgb(22, 22, 26),Element=rgb(17, 17, 20),Hover=rgb(26, 26, 30),Stroke=rgb(36, 36, 42),Text=rgb(237, 237, 240),SubText=rgb(150, 150, 160),Muted=rgb(98, 98, 108)},Slate={Background=rgb(9, 11, 15),Sidebar=rgb(12, 14, 19),Panel=rgb(20, 24, 32),Element=rgb(16, 19, 26),Hover=rgb(24, 28, 38),Stroke=rgb(33, 39, 52),Text=rgb(232, 236, 244),SubText=rgb(140, 150, 170),Muted=rgb(92, 102, 122)},Warm={Background=rgb(12, 11, 10),Sidebar=rgb(15, 14, 13),Panel=rgb(26, 24, 22),Element=rgb(21, 19, 18),Hover=rgb(30, 28, 26),Stroke=rgb(42, 39, 36),Text=rgb(240, 236, 230),SubText=rgb(158, 150, 140),Muted=rgb(108, 101, 93)},Paper={Light=true,Background=rgb(250, 250, 250),Sidebar=rgb(244, 244, 245),Panel=rgb(255, 255, 255),Element=rgb(255, 255, 255),Hover=rgb(244, 244, 246),Stroke=rgb(228, 228, 231),Text=rgb(24, 24, 27),SubText=rgb(100, 100, 110),Muted=rgb(160, 160, 170)}};
THEMES.Halloween = {Limited={From={10,15},To={11,3},Ends="Nov 3"},Accent={rgb(255, 122, 24),rgb(30, 12, 0)},Background=rgb(10, 7, 14),Sidebar=rgb(14, 10, 19),Panel=rgb(27, 19, 35),Element=rgb(20, 14, 27),Hover=rgb(33, 23, 42),Stroke=rgb(50, 36, 60),Text=rgb(246, 238, 230),SubText=rgb(172, 156, 170),Muted=rgb(116, 100, 120)};
local THEME_ORDER = {"Graphite","Slate","Warm","Paper","Halloween"};
local function themeActive(name)
local t = THEMES[name];
if not t then
return false;
end
if not t.Limited then
return true;
end
local ok, d = pcall(os.date, "*t");
if (not ok or (type(d) ~= "table")) then
return false;
end
local today = (d.month * 100) + d.day;
local a, b = (t.Limited.From[1] * 100) + t.Limited.From[2], (t.Limited.To[1] * 100) + t.Limited.To[2];
if (a <= b) then
return (today >= a) and (today <= b);
end
return (today >= a) or (today <= b);
end
local function themeList()
local list = {};
for _, n in ipairs(THEME_ORDER) do
if themeActive(n) then
table.insert(list, n);
end
end
return list;
end
local ACCENTS = {Mono={rgb(237, 237, 240),rgb(14, 14, 16),Light={rgb(24, 24, 27),rgb(250, 250, 250)}},Blue={rgb(59, 130, 246),rgb(255, 255, 255)},Emerald={rgb(16, 185, 129),rgb(3, 20, 13)},Amber={rgb(245, 158, 11),rgb(32, 18, 0)},Rose={rgb(244, 63, 94),rgb(255, 255, 255)},Violet={rgb(139, 92, 246),rgb(255, 255, 255)},Orange={rgb(249, 115, 22),rgb(32, 14, 0)}};
local ACCENT_ORDER = {"Mono","Blue","Emerald","Amber","Rose","Violet","Orange"};
Vanta.Themes, Vanta.Accents = THEMES, ACCENTS;
Vanta.ThemeActive, Vanta.ThemeList = themeActive, themeList;
local STATUS = {Good=rgb(52, 199, 123),Warn=rgb(245, 166, 35),Bad=rgb(240, 82, 82)};
U.assets = {Glow="rbxassetid://8992230677"};
local BUILDER = "rbxasset://fonts/families/BuilderSans.json";
local F = {Regular=Font.new(BUILDER, Enum.FontWeight.Regular),Medium=Font.new(BUILDER, Enum.FontWeight.Medium),SemiBold=Font.new(BUILDER, Enum.FontWeight.SemiBold),Mono=Font.new("rbxasset://fonts/families/RobotoMono.json", Enum.FontWeight.Medium)};
F.Bold = F.SemiBold;
F.Display = F.SemiBold;
local function new(class, props, children)
local obj = Instance.new(class);
local parent;
if obj:IsA("GuiObject") then
obj.BorderSizePixel = 0;
end
for k, v in pairs(props or {}) do
if (k == "Parent") then
parent = v;
else
obj[k] = v;
end
end
for _, c in ipairs(children or {}) do
c.Parent = obj;
end
if parent then
obj.Parent = parent;
end
return obj;
end
local function corner(r)
return new("UICorner", {CornerRadius=UDim.new(0, r or 6)});
end
local function stroke(color, thickness, transparency)
return new("UIStroke", {Color=(color or rgb(36, 36, 42)),Thickness=(thickness or 1),Transparency=(transparency or 0),ApplyStrokeMode=Enum.ApplyStrokeMode.Border});
end
local function pad(l, r, t, b)
return new("UIPadding", {PaddingLeft=UDim.new(0, l or 0),PaddingRight=UDim.new(0, r or l or 0),PaddingTop=UDim.new(0, t or l or 0),PaddingBottom=UDim.new(0, b or t or l or 0)});
end
local function list(padding, dir, align, valign)
return new("UIListLayout", {Padding=UDim.new(0, padding or 0),FillDirection=(dir or Enum.FillDirection.Vertical),HorizontalAlignment=(align or Enum.HorizontalAlignment.Left),VerticalAlignment=(valign or Enum.VerticalAlignment.Top),SortOrder=Enum.SortOrder.LayoutOrder});
end
local function text(props)
return new("TextLabel", {BackgroundTransparency=1,FontFace=(props.FontFace or F.Regular),TextColor3=(props.TextColor3 or rgb(237, 237, 240)),TextSize=(props.TextSize or 13),TextXAlignment=(props.TextXAlignment or Enum.TextXAlignment.Left),TextYAlignment=(props.TextYAlignment or Enum.TextYAlignment.Center),Text=(props.Text or ""),RichText=(props.RichText or false),TextWrapped=(props.TextWrapped or false),TextTruncate=(props.TextTruncate or Enum.TextTruncate.None),Size=(props.Size or UDim2.new(1, 0, 0, 16)),Position=(props.Position or UDim2.new()),AnchorPoint=(props.AnchorPoint or Vector2.new()),AutomaticSize=(props.AutomaticSize or Enum.AutomaticSize.None),LayoutOrder=(props.LayoutOrder or 0),ZIndex=(props.ZIndex or 1),Parent=props.Parent});
end
local function tween(obj, time, goal, style, dir)
local t = TweenService:Create(obj, TweenInfo.new((U.fast and 0) or time, style or Enum.EasingStyle.Quint, dir or Enum.EasingDirection.Out), goal);
t:Play();
return t;
end
local function guiParent()
if (type(gethui) == "function") then
local ok, h = pcall(gethui);
if (ok and h) then
return h;
end
end
local ok = pcall(function()
return CoreGui.Name;
end);
if ok then
return CoreGui;
end
return plr:WaitForChild("PlayerGui");
end
local function screenGui(name, order)
local g = new("ScreenGui", {Name=name,ResetOnSpawn=false,ZIndexBehavior=Enum.ZIndexBehavior.Sibling,DisplayOrder=(order or 100),IgnoreGuiInset=true});
if ((type(syn) == "table") and (type(syn.protect_gui) == "function")) then
pcall(syn.protect_gui, g);
end
g.Parent = guiParent();
return g;
end
local function keyName(key)
if (typeof(key) ~= "EnumItem") then
return "None";
end
local names = {LeftControl="LCtrl",RightControl="RCtrl",LeftShift="LShift",RightShift="RShift",LeftAlt="LAlt",RightAlt="RAlt",Return="Enter",MouseButton1="M1",MouseButton2="M2",MouseButton3="M3",Backquote="`"};
return names[key.Name] or key.Name;
end
local function round(v, step)
step = step or 1;
local r = math.floor((v / step) + 0.5) * step;
local decimals = tostring(step):match("%.(%d+)");
if decimals then
r = tonumber(string.format("%." .. #decimals .. "f", r));
end
return r;
end
local function fmt(v)
if (math.floor(v) == v) then
return tostring(math.floor(v));
end
return tostring(v);
end
local function toHex(c)
return string.format("%02X%02X%02X", math.floor((c.R * 255) + 0.5), math.floor((c.G * 255) + 0.5), math.floor((c.B * 255) + 0.5));
end
local function fromHex(h)
h = tostring(h or ""):gsub("#", "");
if (#h ~= 6) then
return nil;
end
local r, g, b = tonumber(h:sub(1, 2), 16), tonumber(h:sub(3, 4), 16), tonumber(h:sub(5, 6), 16);
if not (r and g and b) then
return nil;
end
return Color3.fromRGB(r, g, b);
end
local function luma(c)
return (c.R * 0.299) + (c.G * 0.587) + (c.B * 0.114);
end
local function safeCall(fn, ...)
if (type(fn) ~= "function") then
return;
end
local args = {...};
task.spawn(function()
local ok, err = pcall(fn, unpack(args));
if not ok then
warn("[vanta] callback error: " .. tostring(err));
end
end);
end
local function draggable(handle, target, conns, onStart)
local dragging, start, origin;
table.insert(conns, handle.InputBegan:Connect(function(input)
if ((input.UserInputType == Enum.UserInputType.MouseButton1) or (input.UserInputType == Enum.UserInputType.Touch)) then
dragging, start, origin = true, input.Position, target.Position;
if onStart then
onStart();
end
local c;
c = input.Changed:Connect(function()
if (input.UserInputState == Enum.UserInputState.End) then
dragging = false;
c:Disconnect();
end
end);
end
end));
table.insert(conns, UserInputService.InputChanged:Connect(function(input)
if not dragging then
return;
end
if ((input.UserInputType == Enum.UserInputType.MouseMovement) or (input.UserInputType == Enum.UserInputType.Touch)) then
local d = input.Position - start;
target.Position = UDim2.new(origin.X.Scale, origin.X.Offset + d.X, origin.Y.Scale, origin.Y.Offset + d.Y);
end
end));
end
local fs = {ok=((type(writefile) == "function") and (type(readfile) == "function"))};
fs.read = function(path)
if not fs.ok then
return nil;
end
local ok, res = pcall(function()
if ((type(isfile) == "function") and not isfile(path)) then
return nil;
end
return readfile(path);
end);
return (ok and res) or nil;
end;
fs.write = function(path, data)
if not fs.ok then
return;
end
pcall(function()
local built = "";
for part in path:gmatch("([^/]+)/") do
built = ((built == "") and part) or (built .. "/" .. part);
if ((type(makefolder) == "function") and ((type(isfolder) ~= "function") or not isfolder(built))) then
makefolder(built);
end
end
writefile(path, data);
end);
end;
local fontTried = false;
U.loadFonts = function()
if fontTried then
return;
end
fontTried = true;
if (not fs.ok or (type(getcustomasset) ~= "function") or (type(isfile) ~= "function")) then
return;
end
local done, fam = false, nil;
task.spawn(function()
local ok, res = pcall(function()
local base = "https://cdn.jsdelivr.net/gh/rsms/inter@v3.19/docs/font-files/Inter-";
local faces = {};
for _, w in ipairs({{"Regular",400},{"Medium",500},{"SemiBold",600}}) do
local file = "Vanta/Inter-" .. w[1] .. ".otf";
if not isfile(file) then
fs.write(file, game:HttpGet(base .. w[1] .. ".otf"));
end
table.insert(faces, {name=w[1],weight=w[2],style="normal",assetId=getcustomasset(file)});
end
fs.write("Vanta/Inter.json", HttpService:JSONEncode({name="Inter",faces=faces}));
return getcustomasset("Vanta/Inter.json");
end);
if ok then
fam = res;
end
done = true;
end);
local waited = 0;
while not done and (waited < 4) do
task.wait(0.05);
waited = waited + 0.05;
end
if (type(fam) == "string") then
F.Regular = Font.new(fam, Enum.FontWeight.Regular);
F.Medium = Font.new(fam, Enum.FontWeight.Medium);
F.SemiBold = Font.new(fam, Enum.FontWeight.SemiBold);
F.Bold, F.Display = F.SemiBold, F.SemiBold;
end
end;
Vanta.MissingIcons = {};
local ICONS = {bell="rbxassetid://97392696311902",bot="rbxassetid://80451686744860",bug="rbxassetid://83626408925438",cat="rbxassetid://124252153404931",["chart-column"]="rbxassetid://97915995538580",check="rbxassetid://93898873302694",["chevron-down"]="rbxassetid://134243273101015",["circle-check"]="rbxassetid://85262178816537",["circle-x"]="rbxassetid://76821953846248",clock="rbxassetid://121808839832144",coins="rbxassetid://116510979641930",crosshair="rbxassetid://134242818164054",droplet="rbxassetid://100597455015098",egg="rbxassetid://117851493400222",ellipsis="rbxassetid://140019550645825",eye="rbxassetid://100033680381365",["eye-off"]="rbxassetid://135928786788378",fish="rbxassetid://124360663785796",["gamepad-2"]="rbxassetid://92483947987410",ghost="rbxassetid://113822048130017",gift="rbxassetid://109855212076373",hash="rbxassetid://82890331678520",house="rbxassetid://98755624629571",info="rbxassetid://124560466474914",layers="rbxassetid://81973586053257",["layout-dashboard"]="rbxassetid://139929981863901",["layout-grid"]="rbxassetid://81344910161871",list="rbxassetid://113179976918783",["map-pin"]="rbxassetid://84279202219901",["message-circle"]="rbxassetid://127255077587058",minus="rbxassetid://118026365011536",monitor="rbxassetid://72664649203050",["mouse-pointer-2"]="rbxassetid://117093892862228",music="rbxassetid://113343203848535",["panel-left"]="rbxassetid://97419752870313",power="rbxassetid://96479131758775",["refresh-cw"]="rbxassetid://138133190015277",searc … +862 chars (open raw for the full line)
local ICON_ALIAS = {home="house",close="x",cross="x",gear="settings",cog="settings",warning="triangle-alert",alert="triangle-alert",error="circle-x",success="circle-check",sword="swords",chart="chart-column",cursor="mouse-pointer-2",combat="swords",visuals="eye",misc="ellipsis",players="users",teleport="map-pin",farm="wheat",auto="bot"};
U.setIcon = function(img, name)
if (not name or (name == "")) then
img.Image = "";
return;
end
name = tostring(name);
if name:find("^rbxassetid://") then
img.Image = name;
return;
end
local id = ICONS[name] or ICONS[ICON_ALIAS[name] or ""];
if not id then
Vanta.MissingIcons[name] = true;
end
img.Image = id or "";
end;
local blurFx, blurRefs = nil, 0;
U.blur = function(on, size)
if on then
blurRefs = blurRefs + 1;
if (not blurFx or not blurFx.Parent) then
blurFx = new("BlurEffect", {Name="VantaBlur",Size=0,Parent=Lighting});
end
tween(blurFx, 0.4, {Size=(size or 12)});
else
blurRefs = math.max(blurRefs - 1, 0);
if (blurFx and (blurRefs == 0)) then
local b = blurFx;lines 1–300 of 8,500open raw find-in-page only searches the lines loaded so far. "show all" loads the rest.