Ported my remark plugin to Sätteri with a /goal/plan loop: github.com/LekoArts/sat... Super easy to migrate 👍🏻 @erika.florist @astro.build
Lennart
Lennart
@lekoarts.de
Software Engineer at Mastra • Previously Clerk, Netlify, Gatsby • Hiking & Photography
247 followers158 following111 posts
Available at roamvault.netlify.app now, you can try a demo vault there ☺️
A while ago I wrote about how I use @obsidian.md for my travel planning. Created a bespoke web app that uses the File System Access API to make it even easier: github.com/LekoArts/roa...
A while ago I wrote about how I use @obsidian.md for my travel planning. Created a bespoke web app that uses the File System Access API to make it even easier: github.com/LekoArts/roa...
Lennart reposted
Made the docs at work more LLM-friendly 😊 We use Docusaurus and I didn't find a concise article about it yet, so I wrote it. Explaining the plugins, custom implementation, .md rewrites, and header content negotation pieces necessary to tie it all together. www.lekoarts.de/how-to-add-l...
Hi @sebastienlorber.com 👋🏻 A question around Docusaurus themes (reading github.com/facebook/doc...) How can I extend (not replace) theme-classic and package that up as my own theme (npm pkg). Do I install theme-classic as peerDep, swizzle and publish that?
Made the docs at work more LLM-friendly 😊 We use Docusaurus and I didn't find a concise article about it yet, so I wrote it. Explaining the plugins, custom implementation, .md rewrites, and header content negotation pieces necessary to tie it all together. www.lekoarts.de/how-to-add-l...
Lennart reposted
After recently switching from @notion.com to @obsidian.md, I had a bunch of ideas for blog posts. The first one is out: www.lekoarts.de/obsidian-tra... I'll show you why `file.hasLink(this)` is the GOAT of filters ✨
After recently switching from @notion.com to @obsidian.md, I had a bunch of ideas for blog posts. The first one is out: www.lekoarts.de/obsidian-tra... I'll show you why `file.hasLink(this)` is the GOAT of filters ✨
After a long day and only small hiccups during publishing, my team and I published Mastra 1.0 😊🎉 mastra.ai/blog/announc...
I'm genuinely sad that trakt.tv is following the enshittifcation path so many other websites did 😢 They cut functionality for power users like me and gaslight people on their forums. Now I need to find a new home for me and my friends 😮💨
Finally, this friday #Frieren returns. My fav anime 😍 youtu.be/RH-FcW94z00
If you're using changesets and have run into problems with the GitHub changelog generator & API rate/query limits, give github.com/LekoArts/cha... a try. I replaced the API parts with `git` calls.
Lennart reposted
Happy to announce Parcel v2.14, now with support for React Server Components! 🥳 RSCs can be integrated into client-rendered apps, server rendered, or statically rendered at build time. Also: rust MDX compiler, create-parcel CLI, new error overlay, and native import maps. parceljs.org/blog/v2-14-0
Super niche but might be helpful for anyone using #Duplicati together with @discord.com — this Cloudflare Worker is a proxy between the notifications Duplicati sends out. It formats them to an embed which you can send to a webhook URL of a Discord channel. github.com/LekoArts/dup...
Lennart reposted
Awesome addition. This will bring the `auth()` and `currentUser()` helpers from the @clerk.com + Next SDK to the community Svelte SDK
We shipped this just now, in SvelteKit 2.20. Having AsyncLocalStorage available ~everywhere makes it possible to create some really nice abstractions — we have a bunch of ideas for other stuff we can do. Look forward to seeing how you all use it: svelte.dev/docs/kit/loa... bsky.app/profile/svel...
Lennart reposted
Another weekend, another @astro.build content loader. This time for @plausible.io 🎉 It's my tool of choice for website analytics. The content loader fetches information from the Stats API v2 with your custom query.
Another weekend, another @astro.build content loader. This time for @plausible.io 🎉 It's my tool of choice for website analytics. The content loader fetches information from the Stats API v2 with your custom query.
I've taken the @plausible.io Stats API docs page (plausible.io/docs/stats-api) and made the query argument of the content loader type-safe. Most of the busy work of authoring these types was actually done by Claude after giving it the docs pages as context 👍🏻
Another weekend, another @astro.build content loader. This time for @plausible.io 🎉 It's my tool of choice for website analytics. The content loader fetches information from the Stats API v2 with your custom query.
I've taken the @plausible.io Stats API docs page (plausible.io/docs/stats-api) and made the query argument of the content loader type-safe. Most of the busy work of authoring these types was actually done by Claude after giving it the docs pages as context 👍🏻
I've used the "Examples" on the Stats API page to write types tests for the query params. First time I used @vitest.dev "Testing types" (vitest.dev/guide/testin...) feature. Works great!
Maybe I can stop re-starting the TS server in VSCode once this lands 🙏🏻 (But for real, seems like a nice speed improvement) devblogs.microsoft.com/typescript/t...
I published a new @astro.build content loader over the weekend — this time for @clerk.com 🫶🏻 As a start I've added useful Backend API endpoints (GET) that can be displayed on an unauthenticated static page. Most fun was creating Zod schema from Clerk's OpenAPI spec + adding TypeScript autocomplete.
You can use it like so: ```ts const clerk = defineCollection({ loader: clerkLoader({ method: { name: 'users.getUserList', }, }), }) ``` Used github.com/sindresorhus... to create the autocomplete union type of `method.name`
Second part of my #Unraid series is out! This time I list my (thus subjective) essential Unraid apps. Gotta find more inspiration for useful user scripts now 👀
Late last year I built my first #Unraid server and I figured I should write some posts about it. I'm sure it will help me in the future, too 😅 First part in the series is out: "My First Unraid Server"
I don't know who else needs this but here's a little web app to wrap text with JSDoc comment, for example to easily add example code to `@example` blocks of said JSDoc. While using Typedoc currently I need that _a lot_ 😅 string-to-jsdoc-comment.netlify.app
Lennart reposted
I am very excited to announce Unpic 1.0 🎉 As easy as an <img> tag but generates all the right attributes and styles for a responsive image. No downloading and no build-time resize • Components for ten frontend frameworks • Support for 26 image providers, now with type-safe transforms for every one
My @astro.build loaders collection for #Flickr is now complete!* * For the endpoints that I need and will use. If something is missing, please open an issue ☺️
Shipped a React Router SDK for @clerk.com last week 🎉 You can use it with React Router's framework and library mode.
Hey @marcysutton.com and @madalyn.dev 👋🏻 I'm trying to make a FAB-like (m3.material.io/components/f...) UI that another team is implementing as accessible as possible. I've found articles around it but no defined patterns or written-down specs. Would you have any links to read up on? Thank you 🫶🏻
I began working on a thing the last couple of nights, it's not fully ready yet but "ship early and often". The first @astro.build loader I added was for #Flickr and I'll also use it on my personal website. Once that's done I have some ideas for other loaders ☺️
h/t to @mk.gg and his loaders repo where I could get some information beyond the official docs 🫶🏻
Awesome article by @joshwcomeau.com again 🎉 I went ahead and changed my frosted glass implementation on lekoarts.de - and used "mask-composite: intersect" to fade the glass edge on the left/right sides. For that to work you have to define "mask-image" with two gradients.
One of my favourite UI patterns is using `backdrop-filter` to create a “frosted glass” effect. When I see this effect in the wild, though, it’s almost never as lush and realistic as it could be. There’s an important optimization that nobody makes. ✨ I share the secret sauce in my brand-new post: