How to replicate items client grab and move around

I’m trying to find a way to replicate an item a player has grabbed and is moving around. I’ve tried using SetNetworkOwner when they grab it. Basically when client grabs, I weld it to a client side hand and then can move the item around. This is all client side. I fire a remote to server to SetNetworkOwner (which I assumed meant client handles all physics and thus replication) but it’s not changing at all on other clients or the server. I’ve also tried just sending the CFrame to the server on RenderStepped, but it’s causing lots of glitches with items being flung around/flying out of the map

-- Client
-- Add a grip attachment at the end of the arm
	local Attachment = Instance.new("Attachment")
	Attachment.Name = "Grip"
	Attachment.Position = Vector3.new(0, -(Distance / 2), 0)
	Attachment.Parent = self.Arm["Right Arm"]

	if GrabbableItem then -- Grabbable item
		PlayerService.GrabItem:Fire(instance)

		self.GrabbedItem = instance
		instance:SetAttribute("PickupLookVector", instance:GetPivot().LookVector)

		-- Weld item to arm
		local Weld = Instance.new("Weld")
		Weld.Part0 = self.Arm["Right Arm"]
		Weld.Part1 = instance
		Weld.C0 = CFrame.new(
			self.Arm["Right Arm"].CFrame:PointToObjectSpace(Attachment.WorldCFrame.Position),
			instance:GetPivot().LookVector
		)

		Weld.Parent = self.Arm["Right Arm"]
	end
-- Server
self.Client.GrabItem:Connect(function(player, item)
	item:SetNetworkOwner(player) -- does nothing
end)

Is instance an anchored BasePart instance? The server is automatically set as the network owner of anchored BasePart instances.

Able to provide a video? Would help clear stuff up.

you cant pass instances between client and server

you have to serialize them into a string or something, and then get the instance back from the server

i think the best way and most secure way is to put all grabbable parts into a folder, then send a unique ID attribute or unique name to the server, and then the server can find the part in the folder