1,811 karma · joined August 24, 2010
leftium.com
Leftium: The Element of Creativity!
It's not a direct replacement; I fixed a lot of annoyances from PicoCSS.
When shutting down, Windows optimizes the next start by caching some stuff. So it is not a true, clean restart.
On a restart, this caching does not happen.
Sources:
- https://www.youtube.com/watch?v=lUIhzACQDAc
- https://learn.microsoft.com/en-us/windows/win32/power/system...
The one demo'ed in the video is BOYA BY-GM18CU (https://www.amazon.com/dp/B0BF969RVP)
That one captures whispers. I've heard other devices can dictate based on vibrations from your neck/chest.
If the site adds a PWA manifest, Android (Chrome/Google app) will show a prompt to install as app on load. Also PWA install will be available for older iOS.
I made a simple tool that generates a minimal PWA manifest: https://logo.leftium.com/logo
The main annoyances:
- oversized buttons
- 100+ root custom properties in devtools
- fighting against too many breakpoints (unpredictable font/container sizing)
---
I also changed/added some features:
- much smaller core: only 4.1 KB Brotli
- CSS cascade layers so app CSS can override more easily
- a surface color system (a la Open Props)
- OKLCH colors with auto derived hover/focus states and light-dark() theming
- centered layout with real gutters, plus content bleed outside gutters
- .no-nimble opt-out class (instead of .pico opt-in)
- ability to configure universal control-density (buttons, inputs, selects)
So if you can't see it: feature-comparison matrix plus notes from migrating several real projects from Pico:
https://github.com/Leftium/nimble.css/blob/main/specs/pico-m...
- oversized buttons
- 100+ root custom properties cluttering DevTools
- fighting against breakpoint-heavy font and container sizing
- container "padding" that could disappear at exact breakpoints
- having to fight framework styles with specificity
Nimble uses more compact controls, ~20 semantic variables, simpler grid-based centering with real gutters, and cascade layers so normal app CSS wins.
---
I also added some features/changed:
- much smaller core: Nimble is only 4.1 KB Brotli
- cascade layers, so normal app CSS can override the library without specificity fights
- a surface hierarchy for page/card/input/overlay backgrounds (a la Open Props)
- OKLCH colors with derived hover/focus states and light-dark() theming
- centered layout with real gutters, plus bleed-edge, bleed-wide, and bleed-full
- .no-nimble to opt third-party component subtrees out of Nimble styling
- shared control-density customization for buttons, inputs, selects, etc.
- .nc-join for visually joined controls without coupling that styling to ARIA role="group" (this kept confusing coding agents; technically they should not be coupled)
---
Feature-comparison matrix plus notes from migrating several real projects from Pico: https://github.com/Leftium/nimble.css/blob/main/specs/pico-m...
But it's not a drop-in replacement. (I fixed several annoyances I had while using PicoCSS.)
I was trying to figure out what you meant by "declarative" because CSS is declarative. (My understanding is: "declarative means you say (declare) what you want, but not how to get it." Usually SQL is the poster child of declarative languages.)
I think you're really talking about a mix of preferring data (vs actions/calculations) and DSLs (which aren't necessarily declarative)
Eric Normand has some thoughts you might appreciate:
- How a problem might take 1000 SLOC to solve directly, but only 10 SLOC with a DSL (plus up to 500 SLOC for the DSL itself; still fewer lines total) https://ericnormand.me/podcast/magical-leverage-languages
- Data vs calculations vs actions: https://ericnormand.me/podcast/what-is-an-action
---
I think data can be very powerful. For example, someone explained to me:
> I've been helping my non-tech father with Home Assistant. I've honestly been shocked with how far "community extensions" + "user configuration" can take you. Every time we hit a bug, I go "time to hit github" but without fail chatgpt and him are able to tweak a setting to get it working.
If you make your system configurable (config==data), you can skip the whole compile/build step!
Here is an example of a calculation written imperatively. It remains easy to reason about because the actions don't leak out of the function:
function add(ns) {
let total = 0
for (const n of ns) {
total += n
}
return total
}
On the other hand, a deterministic state machine like `a = AddMachine` is harder to reason about because it still matters how many times the action `a.transition(1)` is called. (Note it is possible to implement the state machine as calculations.)https://ericnormand.me/podcast/what-is-an-action
https://livebook.manning.com/book/grokking-simplicity/chapte...
Because I see AI coded software everywhere: HN has been complaining about the recent influx of Show HNs due to AI. Take a specific product category: there are about two new dictation apps on Show HN every week.
Here are my theories:
- adobe/office are simply too complex for AI to replicate (as of now). Theo Browne has been testing all the frontier models with a relatively simple fish game. The results have been subpar, at best. I don't think anyone would prefer the AI-generated games over the original. Even if the AI-generated version was free.
- Most AI-coded software won't be distributed like classic software. Instead of a bag of hundreds of features (adobe/office), AI will be used to create the specific 5% of the features a single user really needs (home-cooked software). The software may even be per project or even per task. Why spend 20X to 100X the tokens/time when you only need a small subset of the features?
- AI may not be able to replace human "taste" or design. There is a lot of design that went into adobe and office. I don't think AI can fully understand all the "why's" of these designs. We can already kind of see this with open source: Gimp and LibreOffice are alternatives to adobe/office. Yet most people prefer the paid options.
- Even if AI solved coding, there are other barriers like marketing.
Some examples:
- I built my perfect window management system with the help of AI. It suits my very specific needs very well, but it's nowhere near ready for distribution. So this is AI-generated software no one else will ever probably see.
- Going with the home-cooked meal analogy: there is a dish served at all Chinese restaurants in Korea: jjajangmyeon. However you can't find it in China because that dish is only found at home, not at restaurants in China.
So my advice is to highlight the major benefit over the iOS weather app that ships with every iPhone.
The only major difference I could see is the data source. Did you intentionally not use Apple WeatherKit? (If so, what was the rationale?)
- Comments have 3 LOD (L:full, M:single line, S:collapsed)
- Optimal default LODs
- Simple to expand groups of comments (direct replies, comment thread ("spine"), full sub-tree)
- Highlight specific users like OP, or other interesting users
- Search for text within thread (automatically expands LOD)
- Highlights new comments (since last visit or set time)
It matches the way I want to read HN comments, anyways.
(According to recent article on HN[1]. So LLMs _are_ compression!)
1. Click menu bar time/clock
2. Click Edit Widgets...
3. Search for "Codexbar"
This unified architecture makes Apple hardware very good for AI work, where latency between RAM and CPU is very important
Even the SSDs (which are normally more strippable) use a proprietary hardware form factor.
I think the article mentioned the real draw:
> Apple noticeably promoted the ability to link multiple Mac Studios together into a single, more capable system for running large frontier AI models, a feature aimed at business and developer customers rather than everyday consumers.
(Couldn't read the source cited, might have more info: The Information)
The url param temporarily sets the threshold, you can permanently set it via the settings.
My initial assessment is 0.5 setting is too aggressive; the posts that I generally don't care to read seem to violate multiple rules at once.
It's a shame we can't see comment scores so orange highlights could shine through the blurring on "good" comments.
I added filters that blur posts from new HN accounts based on age/karma thresholds (as suggested by another HN user). However, instead collapsing, I just blurred them. This allows quickly peeking via hover. My reader also highlights posts with higher points/comments, and those orange highlights survive the blurring.
This is what blurring looks like: https://hn.leftium.com/newest?min_karma=500&min_age_years=5
I call it "Seeking Orange" because interesting posts are highlighted. Features include:
- Point/comment counts become increasingly more orange with higher counts (50+, 100+)
- Orange accent bar on left indicates new items since last visit
- Support for several different feeds including: HckrNews (chronological front page appearance time), Classic Stories, Best Stories, Active Stories
- Thresholds to de-emphasize posts from users with low karma/recent creation dates: https://hn.leftium.com/newest?min_karma=500&min_age_years=5
For me, I'm not sure if "slow" is the right word. I think "delayed" or "sporadic" is more accurate.
Thoughts for me are like when a word is on the tip of your tongue, but you can't think of it right away. Often you'll think of the word later: you weren't actively thinking about it, but the thought was simmering in your mind and just randomly pops up.
# Response Style
Keep routine answers concise. Lead with the result, include material caveats and the next action, and omit introductions, repetition, generic reassurance, and optional background. Expand only when the task requires explanation.
While writing a document I got good mileage out of doing something like this for every paragraph: Let's analyze this paragraph:
- List the main points.
- Can any points be removed? (Do any points need to be added?)
- Reword each point. Be as succinct and clear as possible.
I'm not sure how many extra tokens it would consume to do this for every output. But it may be better than just asking for "TLDR pls"(I've actually never used Claude Code. I've never had problems with verbosity in harnesses like OpenCode or T3-code. And recently I've been using Codex, not Claude models.)
> Big monitors are the easiest way to increase white-collar productivity, and anyone who makes at least $50,000 per year ought to have at least 1600×1200 screen resolution. A flat-panel display with this resolution currently costs less than $500. So, as long as the bigger display increases productivity by at least 0.5%, you'll recover the investment in less than a year.
Surely the economics must be even better in 2026?
Combine that with context mode: https://hw.leftium.com/i/47193064
Remote: Yes
Willing to relocate: Yes
Technologies: SvelteKit, TS, JS, UX
Résumé/CV: https://leftium.com/resume
Email: https://leftium.com/contact
If you're looking for a full-stack (SvelteKit) developer who obsesses over UX and finds unconventional solutions, let's discuss how we might work together.
- allowing keyboard input
- make username input optional, or move to end of game
- there is no way to log in as the same user on a different device/profile
The reason I tried on a different device/profile was because I could not see any tutorial. I was wondering if it was because of adblock/extensions.
There was no way to enter the tutorial right away
I tried replay with tutorial, but I don't think anything was different
Of course, I have no idea how to play the game; there is no way to understand what is happening
I tried clicking everywhere
It would be amazing if clicking the timestamps opened the video at that time. I often want to search inside a video for certain text, then watch the video at that point. (YouTube supports linking to videos at a given timestamp like https://youtu.be/tL9Lw250spc?t=199)
It's kind of possible with the YouTube UI, but not a very good user experience.
- https://fx.leftium.com/static
- https://www.youtube.com/shorts/tPfzNzy24to
---
I noticed most of the traffic to my hobby sites was bot traffic (probing for common vulnerabilities). So I added a robots.txt for well-behaved bots and rules for the bad ones. It works pretty well.
robots.txt: https://github.com/Leftium/robots-txt
Sample cloudflare rules:
(
http.request.uri.path contains "/wp-login"
or http.request.uri.path contains "/wp-admin"
or http.request.uri.path contains "/wp-content"
or http.request.uri.path contains "/wp-includes"
or http.request.uri.path contains "/xmlrpc.php"
or http.request.uri.path contains "/wordpress/"
or http.request.uri.path contains "/wp-json/"
or http.request.uri.path contains "/wp-config"
or http.request.uri.path contains "/wp/"
or http.request.uri.path.extension eq "php"
or http.request.uri.path.extension eq "aspx"
or http.request.uri.path.extension eq "asp"
or http.request.uri.path contains ".env"
or http.request.uri.path contains "sftp-config"
or http.request.uri.path contains ".vscode/"
or http.request.uri.path contains "credentials"
or http.request.uri.path contains "stripe"
or http.request.uri.path contains "secrets"
or http.request.uri.path contains "config.json"
or http.request.uri.path contains "config.yml"
or http.request.uri.path contains "config.yaml"
or http.request.uri.path contains "config.py"
or http.request.uri.path contains "config.inc"
or http.request.uri.path contains "config.rb"
or http.request.uri.path contains "settings.json"
or http.request.uri.path contains "settings.yml"
or http.request.uri.path contains "settings.py"
or http.request.uri.path contains "application.yml"
or http.request.uri.path contains "application.properties"
or http.request.uri.path contains "parameters.yml"
or http.request.uri.path contains "appsettings.json"
or http.request.uri.path contains "docker-compose"
or http.request.uri.path contains "/.git/"
or http.request.uri.path contains "/.circleci/"
or http.request.uri.path contains "/.aws/"
or http.request.uri.path contains "/.bitbucket/"
or http.request.uri.path contains "/.travis.yml"
or http.request.uri.path contains "serverless.yml"
or http.request.uri.path contains "debug.log"
or http.request.uri.path contains "error.log"
or http.request.uri.path contains "/storage/logs/"
or http.request.uri.path contains "_profiler"
or http.request.uri.path contains "phpinfo"
or http.request.uri.path contains "/debug/"
or http.request.uri.path contains "/horizon/"
or http.request.uri.path contains "/manage/"
or http.request.uri.path contains "fileman"
or http.request.uri.path contains "assetmanager"
)Unfortunately open-meteo doesn't offer this.
So https://weather-sense.leftium.com uses the 60-min forecast from OpenWeather. But you have to specifically request it because the free-tier quota is not as generous. (I think Apple's WeatherKit may also offer this data, but I was unable to get WeatherKit to work at all)
---
After that, the wind is important for people who like outdoor activities. For example, Kayak rentals are paused when it gets too windy. On the other hand, kite boarders like it when it's windier.