Lars Graubner
banner
larsgraubner.bsky.social
Lars Graubner
@larsgraubner.bsky.social
Building https://klokka.co – type-safe #React + #Node.js starter kit for scalable enterprise applications 🚀
Pinned
I stitched together a small landing page for my SPA starter kit 🥳 The project is called klokka. The site is still in progress and will be enhanced step by step.

Check it out here:
klokka.co
klokka – Full-stack starter kit for enterprise applications at scale
TypeScript starter kit with React and NestJS providing structure and best practices for scalable SPAs with quick time-to-market.
klokka.co
When I need to extend React props of HTML elements, I use ComponentProps. Very convenient 😊
August 15, 2025 at 9:10 AM
Very in depth article about why you should favor spyOn instead of mock. Worth a read (and try). laconicwit.com/vi-mock-is-a...
`vi.mock` Is a Footgun: Why `vi.spyOn` Should Be Your Default
Which Vitest API is your favorite? There are so many great ones to choose from. test is a classic, vi.fn might have the best name, and expect is a great Swiss Army knife. Like a proud parent, I have…
laconicwit.com
August 8, 2025 at 1:13 PM
11/28 with more luck than skill 😂 How much can you score?
new Date("wtf")
How well do you know JavaScript's Date class?
jsdate.wtf
July 24, 2025 at 10:49 AM
Reposted by Lars Graubner
I wrote a blog post sophiebits.com/2025/07/21/t...
TODOs aren’t for doing
sophiebits.com
July 22, 2025 at 12:57 AM
I'm starting to get a grep of how to handle CommonJS in an ESM Vite project. Nasty stuff 😄
July 5, 2025 at 10:22 AM
My guilty pleasure is creating perfect abstractions and component apis 😅 Really satisfied with my react-hook-form abstraction
June 26, 2025 at 8:08 AM
It took me weeks to figure out that Hetzner blocks certain email ports for new accounts 🤦‍♂️
June 25, 2025 at 9:04 AM
Reposted by Lars Graubner
'“eat your vegetables” is one of the least effective arguments in the world. [..]

I would like to list some of my personal, completely selfish reasons for building accessible UIs. No finger-wagging here: just good old hardheaded self-interest!'

nolanlawson.com/2025/06/16/s...

#a11y
Selfish reasons for building accessible UIs
All web developers know, at some level, that accessibility is important. But when push comes to shove, it can be hard to prioritize it above a bazillion other concerns when you’re trying to c…
nolanlawson.com
June 24, 2025 at 9:52 AM
The value of tests greatly increases when using AI for code generation. Let the AI check if it broke something by running the tests is so priceless 🚀
June 21, 2025 at 12:44 PM
Claude Code suits my workflow much better than Cursor. It might be because I'm using Neovim 😅 The results are really impressive, but it's also quite slow and interrupts my workflow. I'll have to figure out the best way to integrate it 😊
June 21, 2025 at 12:10 PM
One pattern I like to use is constants for time amounts with self-describing names. No need for extensive comments 🙅‍♂️
June 20, 2025 at 12:38 PM
Are there any good guides on how to setup AWS SES properly? I manage to get it working, but not sure if everything is correct due to the massive amount of options 🙃 #AWS
June 18, 2025 at 2:50 PM
Reposted by Lars Graubner
Career advice for developers:

Write normal code. Just the basic good stuff. Don't be fancy, don't be clever. Don't use currying everywhere. You don't need Docker for everything. Also don't write dumb code. Please write good code. But make it normal. As unsurprising as possible.

Thank you
June 17, 2025 at 9:16 AM
Not on my fun things to do list: handling DNS stuff 😅
June 16, 2025 at 1:56 PM
Reposted by Lars Graubner
Write flat tests. No "describe", no scenario nesting, no beforeEach/afterEach hooks (as a rule). Each test case is self-contained, listing all the setup it needs. Use Symbol.dispose for reliable cleanup. Use granular test cases.

☝️ These things will make your tests shine.
June 14, 2025 at 11:33 AM
I learned the hard way, that when importing a CommonJS package in an ESM app within the same monorepo, Vite requires different selectors for the package: optimizeDeps requires the package name and commonjsOptions requires a path. Wasted way too much time on this, but it finally works as expected 🙄
June 10, 2025 at 8:36 AM
Reposted by Lars Graubner
pnpm v10.12 is a huge release!

We’ve added many new features to the version catalogs system.

We also shipped a new experimental option that makes installation almost instant on most dev machines.

github.com/pnpm/pnpm/re...
Release pnpm 10.12.1 · pnpm/pnpm
Minor Changes Experimental. Added support for global virtual stores. When enabled, node_modules contains only symlinks to a central virtual store, rather to node_modules/.pnpm. By default, this c...
github.com
June 8, 2025 at 3:09 PM
Whenever I implement basic features, such as authentication, for my starter kit, I like to check out the Laravel documentation. They're implemented and documented quite well there 🎯
June 6, 2025 at 11:28 AM
One gotcha when using TanStack Form in combination with TanStack Query: Always use the async versions of the mutation functions. Otherwise the form state isSubmitting does not behave as expected.
May 30, 2025 at 11:50 AM
This sounds exciting. Let‘s see how this will evolve. The principles seem promising at least 😊

remix.run/blog/wake-up...
Wake up, Remix!
It's time to go wake up Remix! Here's what we're building and what it means for React Router.
remix.run
May 29, 2025 at 10:20 AM
It has been quiet this week around klokka.co but I‘m hard at work to get a Beta version done in the next couple weeks 😊 docs are waiting to be written 😄
klokka – Full-stack starter kit for enterprise applications at scale
TypeScript starter kit with React and NestJS providing structure and best practices for scalable SPAs with quick time-to-market.
klokka.co
May 23, 2025 at 1:09 PM
Reposted by Lars Graubner
Also, run ESLint with --report-unused-disable-directives to get notified of obsolete eslint-ignore comments.
Lil’ TypeScript tip: Instead of using `@ts-ignore` for stuff you don’t feel like fixing rn, use `@ts-expect-error`.

When you do fix the issue, `@ts-expect-error` will *itself* become an error (which you can fix by deleting the comment).

That way, you avoid stale ignores that aren’t needed anymore.
May 20, 2025 at 12:54 AM
Currently I'm working on klokka.co - a full-stack starter kit that handles the tedious parts of enterprise apps (auth, I18n, emails, etc.) so you don't have to.

React + NestJS + TypeScript, all set up and ready to scale. Ship your ideas faster.
klokka – Full-stack starter kit for enterprise applications at scale
TypeScript starter kit with React and NestJS providing structure and best practices for scalable SPAs with quick time-to-market.
klokka.co
May 19, 2025 at 10:30 AM
I just recently discovered Chrome tab group and I really like them. My tabs always have been a mess 😄
May 17, 2025 at 12:24 PM
Reposted by Lars Graubner
Since I often use SVG sprites for icons and wasn't satisfied with the existing tools, I created a lightweight Node.js CLI tool. Check it out, feedback welcome! 😊

www.npmjs.com/package/svg-...
svg-sprite-forge
A lightweight CLI tool to generate SVG sprite files and TypeScript definitions from SVG icon collections.. Latest version: 1.0.0, last published: 3 minutes ago. Start using svg-sprite-forge in your…
www.npmjs.com
May 5, 2025 at 4:20 PM