applet.dev
applet.dev
Did LinkedIn just discover multiverse?
A couple of years ago, we gave this as a Christmas present to everyone at Whimsical. It was a metaphor for our journey. I was skeptical at first, but as you can tell from the scratches, it's now my favorite piece of hardware.
Leatherman is a proof that all-in-one tools can be truly great, as long as the craft and quality bar is high.
Today, I'm excited to share this story with the world. We call it, The Whimsical Way. whimsical.com/whimsical-way
Whimsical didn't start with the product.
It started with the philosophy of how a modern business should operate.
The philosophy directly shaped the product. The product in turn helped us to further embrace the philosophy, so we could build more, better and faster. 👇
With Projects and Posts, Whimsical now offers a truly unified hub for teams. Since day 1, it has been our dream to transform how work happens - fewer distractions, more substance. This is a big step towards that. Super proud of the team making such a complex product a reality.
Experienced major culture shock from an episode of a Korean TV show where kids spent the whole day at school studying. Literally, an entire day, leaving school at 10pm. Is that normal or exaggerated?
Over the last year, we’ve been working on 2 new products: one takes Whimsical to the next level and the other is entirely new. Can’t wait to reveal more.
Unobvious LLM hack: if you ask it to process a lot of input (such as summarizing longer content), it will often "forget" some of the instructions in system prompt. The workaround is to attach the instructions to user prompt instead, after the content. Works much better, at least with Claude Sonnet.
How do you deal with AI generating shitty code, either too verbose, or not following existing patterns? Especially common when using multifile modes like Compose in Cursor or Cascade in Windsurf. I guess I should just get over it for a sake of productivity but it's a struggle.
Yeap, thinking of trying Drizzle for my next experiment. I'm still not sold on `undefined` though, property not existing and property existing with undefined value is not exactly the same things. I also managed to actually get bitten by this behavior.
I still ended up resorting to raw SQL for bunch of queries and schema updates because of limited SQL support. Prisma's client generation in node_modules is opaque and causes pain with deployment. And as I just learned, despite all the typing, it can still be unsafe.
I've stayed away from ORMs for more than a decade but figured I'll give it a try to see if things have improved. I do appreciate the benefit of typed models, schema management and ease of use for common-case retrievals. Yet..
In Prisma ORM, if some query parameter is accidentally `undefined` rather than `null`, it will be ignored, resulting in a query that returns all records. If this param is something like `userId` you can imagine the consequences.. 🤦🏻♂️
Art exists to be made
No.
The taste factor in programming is seriously underrated
Adding pointer cursor to all my native app buttons like a pirate
Here we go
Spicy take: the trend against pointer cursor for buttons to make web-apps feel "more native" is harmful. Sure, originally the semantic meaning for pointer cursor was "link" but for average person it has long evolved into "something clickable".
Views in SwiftUI are objects, aren't they?
For comparison, same code in SwiftUI. It's also OOP-ish, however the combo of language features and framework design achieves a better result. The logic is more logically grouped and much easier to read: gist.github.com/k7d/81109aa0...
My biggest gripe with Flutter is the verbosity, which makes it hard for humans to read. This seems mostly due to Dart limitations (cost of syntax simplicity I guess) although OOP-based frameworks in general tend to have this challenge. Here's a typical example: gist.github.com/k7d/b1de9b96...
For a contrast, I also tried rewriting Tomo in SwiftUI, but ended up stuck, because SwiftUI expects apps to follow specific UI patterns, and I couldn't figure out how to step outside those boundaries. Paradoxically, it was much easier to do in Flutter because it is using the older Cocoa framework.
Overall, it ended up being a success. While Dart, the language, is not my cup of tea, Flutter turned out to be surprisingly robust. You can find the source code for Tomo here: github.com/k7d/tomo
This summer, while on a sabbatical, I wanted to explore the state-of-the-art of building native apps and Flutter in particular piqued my interest. While it was originally designed for mobile, the desktop support seemed quite solid by now. Anyway, I figured why not try to rewrite Tomo in Flutter?
Originally I wrote it in ClojureScript, wrapped in the native webview with a custom bridge. While it worked fine, there were some odd performance issues with webview that only surfaced after a few days of usage. I never managed to get to the bottom of it.