{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreieyp5avevuoivcpoac62sjm6eeje2fuiaybbxcswxkkuplqptcyva",
"commit": {
"cid": "bafyreid6rr3bfr3pqir3yp3e7p24ianzpssntf7reoq23hcjdu5vf3asfq",
"rev": "3moccwqylwu2n"
},
"uri": "at://did:plc:xg2vq45muivyy3xwatcehspu/app.bsky.feed.post/3moccwqvva22n",
"validationStatus": "valid"
},
"content": {
"$type": "pub.leaflet.content",
"pages": [
{
"$type": "pub.leaflet.pages.linearDocument",
"blocks": [
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Engineering is supposed to be fun! I might feel like this version of Mr Byrne at times but challenging myself always proves to make me happy. Today I want to do a little dive into a few things I did this week."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"aspectRatio": {
"height": 480,
"width": 640
},
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreifggpwjayyyy5m64nj7bmuflu2vcqzg6rtt2obfkxq4uynhhqpone"
},
"mimeType": "image/webp",
"size": 43224
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://github.com/desertthunder/regulus"
}
],
"index": {
"byteEnd": 140,
"byteStart": 133
}
}
],
"plaintext": "I've been having a lot of fun putting silliness in my projects and working on ambitious projects. The big one these days is probably Regulus, the Gleam to WASM compiler I've been writing."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"plaintext": "Tables, Dependencies, & JS"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Here are three big things I worked on with some context."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.orderedList",
"children": [
{
"$type": "pub.leaflet.blocks.orderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
],
"index": {
"byteEnd": 78,
"byteStart": 63
}
}
],
"plaintext": "WebAssembly stores callable function references in a table. An element segment initializes that table with the functions the module needs, lets compiled code pass functions around as values, call them indirectly, and support closures/higher-order functions more cleanly."
}
},
{
"$type": "pub.leaflet.blocks.orderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
],
"index": {
"byteEnd": 8,
"byteStart": 0
}
}
],
"plaintext": "Lowering is the compiler step that turns typed source-level code into a lower-level IR. Making owner-aware typed interfaces means each known function/type is tracked with where it came from: the current module, another module, or a dependency package. This prevents name confusion when different modules or packages expose similar names."
}
},
{
"$type": "pub.leaflet.blocks.orderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "I started working heavily on the JavaScript ABI (Application Binary Interface). An ABI is the low-level contract for how compiled code talks to its host or other compiled code: function names, parameter/return shapes, memory layout, pointers, strings, handles, and value encoding. The JS host ABI is the growing contract between generated WASM and JavaScript."
}
}
],
"startIndex": 1
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://reggie.desertthunder.dev/"
}
],
"index": {
"byteEnd": 108,
"byteStart": 104
}
}
],
"plaintext": "If you're interested, the companion book I'm writing should go into more detail about the concepts. The docs do an okay job with this as well."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
],
"index": {
"byteEnd": 10,
"byteStart": 0
}
}
],
"level": 2,
"plaintext": "man resume"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "I made a website for my resume with what feels like my \"signature\" static site setup:"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.unorderedList",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Astro"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://jvns.ca/blog/2026/05/15/moving-away-from-tailwind--and-learning-to-structure-my-css-/"
}
],
"index": {
"byteEnd": 19,
"byteStart": 0
}
}
],
"plaintext": "Well structured css"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "An open graph image that looks sorta like a terminal"
}
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://resume.desertthunder.dev/"
}
],
"index": {
"byteEnd": 78,
"byteStart": 71
}
}
],
"plaintext": "Updating my resume always feels a little tedious, but making it into a website has made it easier to address feedback. My dad likes that it's not dark mode by default. In keeping with the silliness throughout this week, I'd added a man page/plaintext version of my resume."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "plaintext",
"plaintext": "OWAIS_JAMIL(7)\n\nNAME\n Owais Jamil - Software Engineer\n\nSYNOPSIS\n owais_jamil [--experience] [--skills] [--projects] [--education]\n\nCONTACT\n Email: [redacted]\n Phone: [redacted]\n Web: https://desertthunder.dev\n\n GitHub: https://github.com/desertthunder\n LinkedIn: [redacted]\n Sifa: https://sifa.id/p/desertthunder.dev\n\nDESCRIPTION\n Senior Software Engineer",
"syntaxHighlightingTheme": "houston"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://sifa.id/p/desertthunder.dev"
}
],
"index": {
"byteEnd": 120,
"byteStart": 116
}
}
],
"plaintext": "The link is buried in the footer of the site but it brings me a little joy. I haven't connected with anyone through sifa yet, but I do like that the control over everything let's me add a link to it."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"aspectRatio": {
"height": 362,
"width": 556
},
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreihdbebseto4knfggrkr7zcbna5d37ecoebrhormla2weze44tykz4"
},
"mimeType": "image/webp",
"size": 18348
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"plaintext": "A storm comes in"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://tempest.desertthunder.dev/"
}
],
"index": {
"byteEnd": 51,
"byteStart": 44
}
}
],
"plaintext": "Yesterday I deployed my elixir/phoenix PDS, Tempest. Under the hood I think it's a faithful implementation of the PDS spec. Most PDSes have this on their home page:"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "plaintext",
"plaintext": " __ __\n /\\ \\__ /\\ \\__\n __ \\ \\ ,_\\ _____ _ __ ___\\ \\ ,_\\ ___\n /'__'\\ \\ \\ \\/ /\\ '__'\\/\\''__\\/ __'\\ \\ \\/ / __'\\\n /\\ \\L\\.\\_\\ \\ \\_\\ \\ \\L\\ \\ \\ \\//\\ \\L\\ \\ \\ \\_/\\ \\L\\ \\\n \\ \\__/.\\_\\\\ \\__\\\\ \\ ,__/\\ \\_\\\\ \\____/\\ \\__\\ \\____/\n \\/__/\\/_/ \\/__/ \\ \\ \\/ \\/_/ \\/___/ \\/__/\\/___/\n \\ \\_\\\n \\/_/\n\nThis is an AT Protocol Personal yadda yadda yadda",
"syntaxHighlightingTheme": "houston"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://icones.js.org/collection/fxemoji"
}
],
"index": {
"byteEnd": 94,
"byteStart": 80
}
}
],
"plaintext": "I thought it would be cool to make it look like Windows 95 (with some flair via Firefox emojis)."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"aspectRatio": {
"height": 630,
"width": 1200
},
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreib2c7kpewlulimv7ngzdjtbq4nf6e4dr6tcoxmwljpbgkvn6u77zi"
},
"mimeType": "image/webp",
"size": 109202
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "I still have some work to do as far as emails & password reset, namely configuring SMTP and picking a provider. Not sure what I want to use yet."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Currently it lives on a single container in Railway on the hobby plan. I'll see how much mileage I get of that before considering self-hosting."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 3,
"plaintext": "Retro ATProto UI"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://ubuntu.fandom.com/wiki/Intrepid_Ibex"
}
],
"index": {
"byteEnd": 299,
"byteStart": 286
}
}
],
"plaintext": "I can't remember where I saw it/who said it, but the concept of \"Claude-slop\" UI stuck with me and I've been trying to experiment with different ideas. The other weird thing I did was making yet another ATproto explorer that looks just like the first ever Ubuntu version I played with, Intrepid Ibex."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"aspectRatio": {
"height": 1956,
"width": 3096
},
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreihwtpa3cniyig6zx6ujq3t73ymlqxhc75j3jdn7tlow7qu2gjwymq"
},
"mimeType": "image/webp",
"size": 534760
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "This was so much fun to do. I'm thinking about making a UI library that uses these components (it's all vanilla CSS) and exposes the drag and drop primitives. If you want something like this, please let me know!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"plaintext": "Getting Zig-gy with Markdown"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://leaflet.pub/019eb3fb-e10e-733a-b551-ab4939a27f43"
}
],
"index": {
"byteEnd": 66,
"byteStart": 35
}
}
],
"plaintext": "Recently I wrote a write-up on the challenges of building a parser for Markdown because of its precedence rules and delimiters. That continued into recent work I did, which revolved around full GFM compliance. This meant adding a test runner and refactoring the delimiter parser to handle gfm's edge cases. I think the project is turning out to be pretty cool and in my opinion, one of the more absurd ways I've chosen to learn a new programming language."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.website",
"description": "A commonmark compliant markdown parser and event api",
"previewImage": {
"$type": "blob",
"ref": {
"$link": "bafkreich7iieoq3hggnrojx6iqzjelsqad3gvb2rt42giddnhup23zz2yy"
},
"mimeType": "image/png",
"size": 26218
},
"src": "https://codeberg.org/desertthunder/markdownz",
"title": "markdownz"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"plaintext": "What's next?"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://lazurite.stormlightlabs.org/"
}
],
"index": {
"byteEnd": 129,
"byteStart": 121
}
},
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://marker.stormlightlabs.org/"
}
],
"index": {
"byteEnd": 158,
"byteStart": 152
}
}
],
"plaintext": "In the short-term, I'm thinking about writing a deep-dive in to ATProto-Flutter dev after I release the next versions of Lazurite and push the alpha of Marker. Before I release Lazurite I have to integrate the new group chat lexicon. "
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.horizontalRule"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Thanks for reading!"
}
}
],
"id": "019eb8bf-37e7-7559-8d8b-c8dc99ce45d1"
}
]
},
"coverImage": {
"$type": "blob",
"ref": {
"$link": "bafkreifggpwjayyyy5m64nj7bmuflu2vcqzg6rtt2obfkxq4uynhhqpone"
},
"mimeType": "image/webp",
"size": 43224
},
"description": "Dev Log 55: 2026-06-14",
"path": "/3moccwocjb22m",
"publishedAt": "2026-06-15T03:14:20.620Z",
"site": "at://did:plc:xg2vq45muivyy3xwatcehspu/site.standard.publication/3m3zpxhfl3c2s",
"tags": [
"gleam",
"wasm",
"devlog",
"elixir",
"beam",
"phoenix",
"pds",
"atproto",
"resume"
],
"title": "How did I get here"
}