Experimental browser for the Atmosphere
if you don't believe me for some reason here's the lua code that's calling into web API
May 8, 2025, 5:44 PM
{ "uri": "at://did:plc:azy5dtqi56fxhgohal7ytb2a/app.bsky.feed.post/3loohmrt2h224", "cid": "bafyreiav7pn2aoqji3vyz5k4cqswmnlxmynqaq72xmg6xcrzummbbqyuvi", "value": { "text": "if you don't believe me for some reason here's the lua code that's calling into web API", "$type": "app.bsky.feed.post", "embed": { "$type": "app.bsky.embed.recordWithMedia", "media": { "$type": "app.bsky.embed.images", "images": [ { "alt": "local js = require(\"js\")\nlocal window = js.global\nlocal document = window.document\n\nlocal canvas = document:getElementById(\"canvas\")\nlocal ctx = canvas:getContext(\"2d\")\n\nlocal image = js.new(window.Image)\nimage.src = \"./brazil.jpg\"\n\n\nlocal obj = {dx = 1, dy = 1, x = 10, y = 10}\nfunction main()\n wait_for_event(image, \"load\")\n draw()\nend\n\nfunction draw()\n ctx.fillStyle = \"gray\"\n ctx:fillRect(0, 0, 640, 360)\n ctx.fillStyle = \"black\"\n ctx.font = \"30px monospace\";\n\n ctx:drawImage(image, obj.x, obj.y, 200, 200)\n obj.x = obj.dx + obj.x\n if obj.x < 0 or obj.x > 440 then\n obj.dx = obj.dx * -1\n end\n obj.y = obj.dy + obj.y\n if obj.y < 0 or obj.y > 160 then\n obj.dy = obj.dy * -1\n end\n\n ctx:fillText(\"lua in the browser!!!\", 200, 250)\n window:requestAnimationFrame(draw)\nend\n\ncoroutine.wrap(main)()", "image": { "$type": "blob", "ref": { "$link": "bafkreic55eixzhwdxzaqhy3y6wfbye2lfny7obnd4jrs2wry4sqfmzwbei" }, "mimeType": "image/jpeg", "size": 319775 }, "aspectRatio": { "width": 477, "height": 723 } } ] }, "record": { "$type": "app.bsky.embed.record", "record": { "cid": "bafyreibcc7zaox7a4bjti6zx6eypicnrvdxosxur5et7ni65dsfvkvseny", "uri": "at://did:plc:azy5dtqi56fxhgohal7ytb2a/app.bsky.feed.post/3loohg5bizs24" } } }, "langs": [ "en" ], "createdAt": "2025-05-08T17:44:07.235Z" } }