A modular Luau static-site renderer for Roblox. Parse HTML, resolve CSS, and render the result straight into Roblox GUI objects.
⚠️ We're not responsible for any action Roblox takes against you for using this. Use it at your own risk.
local HttpService = game:GetService("HttpService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local Neutron = require(ReplicatedStorage.Neutron)
-- Server: set up the fetch bridge
local remoteFunction = Instance.new("RemoteFunction")
remoteFunction.Name = "NeutronFetch"
remoteFunction.Parent = ReplicatedStorage
Neutron.Fetcher.bindRemoteFunction(remoteFunction, HttpService, {
transformUrl = function(url)
return "https://r.jina.ai/http://" .. url:gsub("^https?://", "")
end,
})
-- Client: render a page into a frame
local renderer = Neutron.new({
fetcher = Neutron.Fetcher.fromRemoteFunction(remoteFunction)
})
local screenGui = Instance.new("ScreenGui")
screenGui.Parent = Players.LocalPlayer:WaitForChild("PlayerGui")
local mount = Instance.new("Frame")
mount.Size = UDim2.fromScale(1, 1)
mount.Parent = screenGui
renderer:renderUrl("https://example.com", mount)For full setup, image options, fetch config, and architecture docs — see Info.md.
- Open
release/Neutron.module.lua - Create a
ModuleScriptnamedNeutronin Studio - Paste the contents in and
require()it
- Common HTML tags and text nodes
- Inline and embedded CSS — tag, class, and ID selectors
- Block layout with margins and padding
- Roblox RichText text styling
- Proxy-based fetching for public websites
- Low-res image rendering without
EditableImage - Palette-quantized images with frame-budgeted rendering
- No JavaScript — this is a static renderer, not a browser
- CSS support is intentionally minimal
- Some pages may need a proxy or content adapter to be fetchable from Roblox