{
"path": "/3mjlkkbla7k2o",
"site": "at://did:plc:xg2vq45muivyy3xwatcehspu/site.standard.publication/3m3zpxhfl3c2s",
"tags": [
"markdown",
"react",
"rust",
"tauri",
"devlog",
"flutter",
"dart",
"solidjs"
],
"$type": "site.standard.document",
"title": "What I did while distracted",
"content": {
"$type": "pub.leaflet.content",
"pages": [
{
"id": "019d8e86-7a4d-7bb8-be5f-19d4a0a28409",
"$type": "pub.leaflet.pages.linearDocument",
"blocks": [
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 184,
"byteStart": 173
},
"features": [
{
"uri": "https://github.com/stormlightlabs/writer",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "This Jackie Robinson day I found myself wearing my royal blue Brooklyn Dodgers cap almost all day, and working on both iterations of Lazurite and mapping out what v0.4.0 of Commonplace will look like. "
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.horizontalRule"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 124,
"byteStart": 104
},
"features": [
{
"uri": "https://pub.dev/packages/flutter_native_splash",
"$type": "pub.leaflet.richtext.facet#link"
}
]
},
{
"index": {
"byteEnd": 225,
"byteStart": 220
},
"features": [
{
"uri": "http://npmx.dev/package/sharp",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "The amount of assets you have to add coupled with XML in a mobile app really blows my mind. I added the native splash screen package to the flutter toolchain coupled with a small bun program to generate the images (with sharp) from the Lazurite logo and it produced 55 assets. The diff just to add a splash screen was one of the more absurd I've had recently. Icons are no different."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 57,
"byteStart": 47
},
"features": [
{
"uri": "https://developer.apple.com/app-store/review/guidelines/#design",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "I've been working through the app store review guidelines."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.horizontalRule"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 69,
"byteStart": 58
},
"features": [
{
"uri": "https://tangled.org/desertthunder.dev/lazurite-desktop",
"$type": "pub.leaflet.richtext.facet#link"
}
]
},
{
"index": {
"byteEnd": 230,
"byteStart": 222
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
},
{
"index": {
"byteEnd": 324,
"byteStart": 292
},
"features": [
{
"uri": "https://github.com/egoist/tailwindcss-icons",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "Speaking of icons, the way I have icons setup in Lazurite for desktop is a little silly. I use my favorite functional paradigm on the frontend, namely union/enumerated types and switch/match cases. I have a giant union of IconKind strings that map to icon classes from remix, exposed through egoist's tailwindcssicons plugin. This gives me intellisense all the way down which is super nice."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "tsx",
"plaintext": "export function Icon(props: IconProps) {\n const [local, rest] = splitProps(props, [\"class\", \"iconClass\", \"kind\", \"name\"]);\n\n return (\n <span {...rest} class=\"flex items-center justify-center\" classList={{ [local.class ?? \"\"]: !!local.class }}>\n <Switch>\n <Match when={!!local.iconClass}>\n <i class={local.iconClass} />\n </Match>\n <Match when={local.kind === \"quill\"}>\n <i class=\"i-ri-quill-pen-line\" />\n </Match>\n {/* There's like a million more of these */}\n </Switch>\n </span>\n );",
"syntaxHighlightingTheme": "kanagawa-dragon"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 79,
"byteStart": 62
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "The most import QoL part of this is that it wraps the icon in flex items-center to make sure the icon alignment is where I want it to be."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "It's a pattern that seems like its \"slop\" but the funny thing is, any time an agent works on UI, it never uses available Icon variants. It just uses the iconClass override."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 35,
"byteStart": 23
},
"features": [
{
"did": "did:plc:rnqol7ddqwydvhnxhe6xhlml",
"$type": "pub.leaflet.richtext.facet#didMention"
}
]
}
],
"plaintext": "I like the affordances @solidjs.com provides quite a bit. Reactivity seems to work the way you expect it to and I don't find myself hitting many of the footguns that React has. Whether or not that has anything to do with my abilities as an engineer remains to be seen."
}
},
{
"$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": "Speaking of React, I dove back into the Commonplace codebase today mostly to figure out where I want to go with the next release. So far it looks like:"
}
},
{
"$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",
"facets": [
{
"index": {
"byteEnd": 13,
"byteStart": 0
},
"features": [
{
"uri": "https://standard.site",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "standard.site publishing (leaflet, pckt, & greengale)"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Find & replace in document"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Wikilinks"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Toggleable document outlines"
}
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Deferred for v0.5.0 is private Github gists & publishing gists (I've already got ATmosphere/BlueSky OAuth setup in the application so we don't need to add any plumbing there)."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "There are lots of markdown note taking apps out there. If you want to check out the one I built, you can download it for your operating system of choice (Mac, Windows, or Linux) on Github."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"src": "https://github.com/stormlightlabs/writer/releases/tag/v0.3.1",
"$type": "pub.leaflet.blocks.website",
"title": "Release Commonplace v0.3.1-pre ยท stormlightlabs/writer",
"description": "You'll find a brand-new face for Writer Commonplace! We've given it a cleaner, darker design and a brand new welcome screen. Here are some more details: Added Image support PDF exports now...",
"previewImage": {
"$type": "blob",
"ref": {
"$link": "bafkreif7oh3pttn4ay4elad325tlnk2xhgdkhh36tzgimqblqufe5mohdi"
},
"mimeType": "image/png",
"size": 22409
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": ""
}
}
]
}
]
},
"bskyPostRef": {
"cid": "bafyreigkuyhlf4ya4jvif6rvc6z7s4hsgstsun3qemhzxzjojryfkajbei",
"uri": "at://did:plc:xg2vq45muivyy3xwatcehspu/app.bsky.feed.post/3mjlkkh5chc2o",
"commit": {
"cid": "bafyreif42qs3d7o5ukyrm4sd2caajduogpoznjqv4hdyulsob5g7lc5xci",
"rev": "3mjlkkhaoun2p"
},
"validationStatus": "valid"
},
"description": "Dev Log 50: 2026-04-15",
"publishedAt": "2026-04-16T04:18:37.145Z"
}