catnhub (OPEN-SOURCE)

Has scripts for ABA, Monday Morning Misery and Climb for Animals Eggs. Pretty decent ui, built off of bypass hub ui

publicluau#keyless#aba#mondaymorningmiseryupdated

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

· @catnba

made completely open source

including every script

catnhub-open-source.luau
codediff
-- 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.

changelog

2 versions · 1 with notes
  1. made completely open source

    live

    @catnba·+8499 lines·

    including every script

  2. first version

    @catnba·