The best Hacker News stories from Show from the past day

Go back

Latest posts:

Show HN: PgDog – Shard Postgres without extensions

Hey HN! Lev here, author of PgDog (<a href="https://github.com/pgdogdev/pgdog">https://github.com/pgdogdev/pgdog</a>). I’m scaling our favorite database, PostgreSQL. PgDog is a new open source proxy, written in Rust, with first-class support for sharding — without changes to your app or needing database extensions.<p>Here’s a walkthrough of how it works: <a href="https://www.youtube.com/watch?v=y6sebczWZ-c" rel="nofollow">https://www.youtube.com/watch?v=y6sebczWZ-c</a><p>Running Postgres at scale is hard. Eventually, one primary isn’t enough at which point you need to split it up. Since there is currently no good tooling out there to do this, teams end up breaking their apps apart instead.<p>If you’re familiar with PgCat, my previous project, PgDog is its spiritual successor but with a fresh codebase and new goals. If not, PgCat is a pooler for Postgres also written in Rust.<p>So, what’s changed and why a new project? Cross-shard queries are supported out of the box. The new architecture is more flexible, completely asynchronous and supports manipulating the Postgres protocol at any stage of query execution. (Oh, and you guessed it — I adopted a dog. Still a cat person though!)<p>Not everything is working yet, but simple aggregates like max(), min(), count(*) and sum() are in. More complex functions like percentiles and average will require a bit more work. Sorting (i.e. ORDER BY) works, as long as the values are part of the result set, e.g.:<p><pre><code> SELECT id, email FROM users WHERE admin = true ORDER BY 1 DESC; </code></pre> PgDog buffers and sorts the rows in memory, before sending them to the client. Most of the time, the working set is small, so this is fine. For larger results, we need to build swap to disk, just like Postgres does, but for OLTP workloads, which PgDog is targeting, we want to keep things fast. Sorting currently works for bigint, integer, and text/varchar. It’s pretty straightforward to add all the other data types, I just need to find the time and make sure to handle binary encoding correctly.<p>All standard Postgres features work as normal for unsharded and direct-to-shard queries. As long as you include the sharding key (a column like customer_id, for example) in your query, you won’t notice a difference.<p>How does this compare to Citus? In case you’re not familiar, Citus is an open source extension for sharding Postgres. It runs inside a single Postgres node (a coordinator) and distributes queries between worker databases.<p>PgDog’s architecture is fundamentally different. It runs outside the DB: it’s a proxy, so you can deploy it anywhere, including managed Postgres like RDS, Cloud SQL and others where Citus isn’t available. It’s multi-threaded and asynchronous, so it can handle thousands, if not millions, of concurrent connections. Its focus is OLTP, not OLAP. Meanwhile, Citus is more mature and has good support for cross-shard queries and aggregates. It will take PgDog a while to catch up.<p>My Rust has improved since my last attempt at this and I learned how to use the bytes crate correctly. PgDog does almost zero memory allocations per request. That results in a 3-5% performance increase over PgCat and a much more consistent p95. If you’re obsessed with performance like me, you know that small percentage is nothing to sneeze at. Like before, multi-threaded Tokio-powered PgDog leaves the single-threaded PgBouncer in the dust (<a href="https://pgdog.dev/blog/pgbouncer-vs-pgdog">https://pgdog.dev/blog/pgbouncer-vs-pgdog</a>).<p>Since we’re using pg_query (which itself bundles the Postgres parser), PgDog can understand all Postgres queries. This is important because we can not only correctly extract the WHERE clause and INSERT parameters for automatic routing, but also rewrite queries. This will be pretty useful when we’ll add support for more complex aggregates, like avg(), and cross-shard joins!<p>Read/write traffic split is supported out of the box, so you can put PgDog in front of the whole cluster and ditch the code annotations. It’s also a load balancer, so you can deploy it in front of multiple replicas to get 4 9’s of uptime.<p>One of the coolest features so far, in my opinion, is distributed COPY. This works by hacking the Postgres network protocol and sending individual rows to different shards (<a href="https://pgdog.dev/blog/hacking-postgres-wire-protocol">https://pgdog.dev/blog/hacking-postgres-wire-protocol</a>). You can just use it without thinking about cluster topology, e.g.:<p><pre><code> COPY temperature_records (sensor_uuid, created_at, value) FROM STDIN CSV; </code></pre> The sharding function is straight out of Postgres partitions and supports uuid v4 and bigint. Technically, it works with any data type, but I just haven’t added all the wrappers yet. Let me know if you need one.<p>What else? Since we have the Postgres parser handy, we can inspect, block and rewrite queries. One feature I was playing with is ensuring that the app is passing in the customer_id in all queries, to avoid data leaks between tenants. Brain dump of that in my blog here: <a href="https://pgdog.dev/blog/multi-tenant-pg-can-be-easy">https://pgdog.dev/blog/multi-tenant-pg-can-be-easy</a>.<p>What’s on the roadmap: (re)sharding Postgres using logical replication, so we can scale DBs without taking downtime. There is a neat trick on how to quickly do this on copy-on-write filesystems (like EBS used by RDS, Google Cloud volumes, ZFS, etc.). I’ll publish a blog post on this soon. More at-scale features like blocking bad queries and just general “I wish my Postgres proxy could do this” stuff. Speaking of which, if you can think of any more features you’d want, get in touch. Your wishlist can become my roadmap.<p>PgDog is being built in the open. If you have thoughts or suggestions about this topic, I would love to hear them. Happy to listen to your battle stories with Postgres as well.<p>Happy hacking!<p>Lev

Show HN: PgDog – Shard Postgres without extensions

Hey HN! Lev here, author of PgDog (<a href="https://github.com/pgdogdev/pgdog">https://github.com/pgdogdev/pgdog</a>). I’m scaling our favorite database, PostgreSQL. PgDog is a new open source proxy, written in Rust, with first-class support for sharding — without changes to your app or needing database extensions.<p>Here’s a walkthrough of how it works: <a href="https://www.youtube.com/watch?v=y6sebczWZ-c" rel="nofollow">https://www.youtube.com/watch?v=y6sebczWZ-c</a><p>Running Postgres at scale is hard. Eventually, one primary isn’t enough at which point you need to split it up. Since there is currently no good tooling out there to do this, teams end up breaking their apps apart instead.<p>If you’re familiar with PgCat, my previous project, PgDog is its spiritual successor but with a fresh codebase and new goals. If not, PgCat is a pooler for Postgres also written in Rust.<p>So, what’s changed and why a new project? Cross-shard queries are supported out of the box. The new architecture is more flexible, completely asynchronous and supports manipulating the Postgres protocol at any stage of query execution. (Oh, and you guessed it — I adopted a dog. Still a cat person though!)<p>Not everything is working yet, but simple aggregates like max(), min(), count(*) and sum() are in. More complex functions like percentiles and average will require a bit more work. Sorting (i.e. ORDER BY) works, as long as the values are part of the result set, e.g.:<p><pre><code> SELECT id, email FROM users WHERE admin = true ORDER BY 1 DESC; </code></pre> PgDog buffers and sorts the rows in memory, before sending them to the client. Most of the time, the working set is small, so this is fine. For larger results, we need to build swap to disk, just like Postgres does, but for OLTP workloads, which PgDog is targeting, we want to keep things fast. Sorting currently works for bigint, integer, and text/varchar. It’s pretty straightforward to add all the other data types, I just need to find the time and make sure to handle binary encoding correctly.<p>All standard Postgres features work as normal for unsharded and direct-to-shard queries. As long as you include the sharding key (a column like customer_id, for example) in your query, you won’t notice a difference.<p>How does this compare to Citus? In case you’re not familiar, Citus is an open source extension for sharding Postgres. It runs inside a single Postgres node (a coordinator) and distributes queries between worker databases.<p>PgDog’s architecture is fundamentally different. It runs outside the DB: it’s a proxy, so you can deploy it anywhere, including managed Postgres like RDS, Cloud SQL and others where Citus isn’t available. It’s multi-threaded and asynchronous, so it can handle thousands, if not millions, of concurrent connections. Its focus is OLTP, not OLAP. Meanwhile, Citus is more mature and has good support for cross-shard queries and aggregates. It will take PgDog a while to catch up.<p>My Rust has improved since my last attempt at this and I learned how to use the bytes crate correctly. PgDog does almost zero memory allocations per request. That results in a 3-5% performance increase over PgCat and a much more consistent p95. If you’re obsessed with performance like me, you know that small percentage is nothing to sneeze at. Like before, multi-threaded Tokio-powered PgDog leaves the single-threaded PgBouncer in the dust (<a href="https://pgdog.dev/blog/pgbouncer-vs-pgdog">https://pgdog.dev/blog/pgbouncer-vs-pgdog</a>).<p>Since we’re using pg_query (which itself bundles the Postgres parser), PgDog can understand all Postgres queries. This is important because we can not only correctly extract the WHERE clause and INSERT parameters for automatic routing, but also rewrite queries. This will be pretty useful when we’ll add support for more complex aggregates, like avg(), and cross-shard joins!<p>Read/write traffic split is supported out of the box, so you can put PgDog in front of the whole cluster and ditch the code annotations. It’s also a load balancer, so you can deploy it in front of multiple replicas to get 4 9’s of uptime.<p>One of the coolest features so far, in my opinion, is distributed COPY. This works by hacking the Postgres network protocol and sending individual rows to different shards (<a href="https://pgdog.dev/blog/hacking-postgres-wire-protocol">https://pgdog.dev/blog/hacking-postgres-wire-protocol</a>). You can just use it without thinking about cluster topology, e.g.:<p><pre><code> COPY temperature_records (sensor_uuid, created_at, value) FROM STDIN CSV; </code></pre> The sharding function is straight out of Postgres partitions and supports uuid v4 and bigint. Technically, it works with any data type, but I just haven’t added all the wrappers yet. Let me know if you need one.<p>What else? Since we have the Postgres parser handy, we can inspect, block and rewrite queries. One feature I was playing with is ensuring that the app is passing in the customer_id in all queries, to avoid data leaks between tenants. Brain dump of that in my blog here: <a href="https://pgdog.dev/blog/multi-tenant-pg-can-be-easy">https://pgdog.dev/blog/multi-tenant-pg-can-be-easy</a>.<p>What’s on the roadmap: (re)sharding Postgres using logical replication, so we can scale DBs without taking downtime. There is a neat trick on how to quickly do this on copy-on-write filesystems (like EBS used by RDS, Google Cloud volumes, ZFS, etc.). I’ll publish a blog post on this soon. More at-scale features like blocking bad queries and just general “I wish my Postgres proxy could do this” stuff. Speaking of which, if you can think of any more features you’d want, get in touch. Your wishlist can become my roadmap.<p>PgDog is being built in the open. If you have thoughts or suggestions about this topic, I would love to hear them. Happy to listen to your battle stories with Postgres as well.<p>Happy hacking!<p>Lev

Show HN: PgDog – Shard Postgres without extensions

Hey HN! Lev here, author of PgDog (<a href="https://github.com/pgdogdev/pgdog">https://github.com/pgdogdev/pgdog</a>). I’m scaling our favorite database, PostgreSQL. PgDog is a new open source proxy, written in Rust, with first-class support for sharding — without changes to your app or needing database extensions.<p>Here’s a walkthrough of how it works: <a href="https://www.youtube.com/watch?v=y6sebczWZ-c" rel="nofollow">https://www.youtube.com/watch?v=y6sebczWZ-c</a><p>Running Postgres at scale is hard. Eventually, one primary isn’t enough at which point you need to split it up. Since there is currently no good tooling out there to do this, teams end up breaking their apps apart instead.<p>If you’re familiar with PgCat, my previous project, PgDog is its spiritual successor but with a fresh codebase and new goals. If not, PgCat is a pooler for Postgres also written in Rust.<p>So, what’s changed and why a new project? Cross-shard queries are supported out of the box. The new architecture is more flexible, completely asynchronous and supports manipulating the Postgres protocol at any stage of query execution. (Oh, and you guessed it — I adopted a dog. Still a cat person though!)<p>Not everything is working yet, but simple aggregates like max(), min(), count(*) and sum() are in. More complex functions like percentiles and average will require a bit more work. Sorting (i.e. ORDER BY) works, as long as the values are part of the result set, e.g.:<p><pre><code> SELECT id, email FROM users WHERE admin = true ORDER BY 1 DESC; </code></pre> PgDog buffers and sorts the rows in memory, before sending them to the client. Most of the time, the working set is small, so this is fine. For larger results, we need to build swap to disk, just like Postgres does, but for OLTP workloads, which PgDog is targeting, we want to keep things fast. Sorting currently works for bigint, integer, and text/varchar. It’s pretty straightforward to add all the other data types, I just need to find the time and make sure to handle binary encoding correctly.<p>All standard Postgres features work as normal for unsharded and direct-to-shard queries. As long as you include the sharding key (a column like customer_id, for example) in your query, you won’t notice a difference.<p>How does this compare to Citus? In case you’re not familiar, Citus is an open source extension for sharding Postgres. It runs inside a single Postgres node (a coordinator) and distributes queries between worker databases.<p>PgDog’s architecture is fundamentally different. It runs outside the DB: it’s a proxy, so you can deploy it anywhere, including managed Postgres like RDS, Cloud SQL and others where Citus isn’t available. It’s multi-threaded and asynchronous, so it can handle thousands, if not millions, of concurrent connections. Its focus is OLTP, not OLAP. Meanwhile, Citus is more mature and has good support for cross-shard queries and aggregates. It will take PgDog a while to catch up.<p>My Rust has improved since my last attempt at this and I learned how to use the bytes crate correctly. PgDog does almost zero memory allocations per request. That results in a 3-5% performance increase over PgCat and a much more consistent p95. If you’re obsessed with performance like me, you know that small percentage is nothing to sneeze at. Like before, multi-threaded Tokio-powered PgDog leaves the single-threaded PgBouncer in the dust (<a href="https://pgdog.dev/blog/pgbouncer-vs-pgdog">https://pgdog.dev/blog/pgbouncer-vs-pgdog</a>).<p>Since we’re using pg_query (which itself bundles the Postgres parser), PgDog can understand all Postgres queries. This is important because we can not only correctly extract the WHERE clause and INSERT parameters for automatic routing, but also rewrite queries. This will be pretty useful when we’ll add support for more complex aggregates, like avg(), and cross-shard joins!<p>Read/write traffic split is supported out of the box, so you can put PgDog in front of the whole cluster and ditch the code annotations. It’s also a load balancer, so you can deploy it in front of multiple replicas to get 4 9’s of uptime.<p>One of the coolest features so far, in my opinion, is distributed COPY. This works by hacking the Postgres network protocol and sending individual rows to different shards (<a href="https://pgdog.dev/blog/hacking-postgres-wire-protocol">https://pgdog.dev/blog/hacking-postgres-wire-protocol</a>). You can just use it without thinking about cluster topology, e.g.:<p><pre><code> COPY temperature_records (sensor_uuid, created_at, value) FROM STDIN CSV; </code></pre> The sharding function is straight out of Postgres partitions and supports uuid v4 and bigint. Technically, it works with any data type, but I just haven’t added all the wrappers yet. Let me know if you need one.<p>What else? Since we have the Postgres parser handy, we can inspect, block and rewrite queries. One feature I was playing with is ensuring that the app is passing in the customer_id in all queries, to avoid data leaks between tenants. Brain dump of that in my blog here: <a href="https://pgdog.dev/blog/multi-tenant-pg-can-be-easy">https://pgdog.dev/blog/multi-tenant-pg-can-be-easy</a>.<p>What’s on the roadmap: (re)sharding Postgres using logical replication, so we can scale DBs without taking downtime. There is a neat trick on how to quickly do this on copy-on-write filesystems (like EBS used by RDS, Google Cloud volumes, ZFS, etc.). I’ll publish a blog post on this soon. More at-scale features like blocking bad queries and just general “I wish my Postgres proxy could do this” stuff. Speaking of which, if you can think of any more features you’d want, get in touch. Your wishlist can become my roadmap.<p>PgDog is being built in the open. If you have thoughts or suggestions about this topic, I would love to hear them. Happy to listen to your battle stories with Postgres as well.<p>Happy hacking!<p>Lev

Show HN: AI Baby Monitor – local Video-LLM that beeps when safety rules break

Hi HN! I built AI Baby Monitor – a tiny stack (Redis + vLLM + Streamlit) that watches a video stream and a YAML list of safety rules. If the model spots a rule being broken it plays beep sound, so you can quickly glance over and check on your baby.<p>Why?<p>When we bought a crib for our daughter, the first thing she tried was climbing over the rail :/ I got a bit paranoid about constantly watching her over, so I thought of a helper that can *actively* watch the baby, while parents could stay *semi-actively* alert. It’s meant to be an additional set of eyes, and *not* a replacement for the adult. Thus, just a beep sound and not phone notifications.<p>How it works<p>* *stream_to_redis.py* captures video stream frames → Redis streams<p>* *run_watcher.py* pulls the latest N frames, injects them + the rules into a prompt and hits a local *vLLM* server running *Qwen 2.5 VL*<p>* Model returns structured JSON (`should_alert`, `reasoning`, `awareness_level`)<p>* If `should_alert=True` → `playsound` beep<p>* Streamlit page displays both camera and LLM logs

Show HN: AI Baby Monitor – local Video-LLM that beeps when safety rules break

Hi HN! I built AI Baby Monitor – a tiny stack (Redis + vLLM + Streamlit) that watches a video stream and a YAML list of safety rules. If the model spots a rule being broken it plays beep sound, so you can quickly glance over and check on your baby.<p>Why?<p>When we bought a crib for our daughter, the first thing she tried was climbing over the rail :/ I got a bit paranoid about constantly watching her over, so I thought of a helper that can *actively* watch the baby, while parents could stay *semi-actively* alert. It’s meant to be an additional set of eyes, and *not* a replacement for the adult. Thus, just a beep sound and not phone notifications.<p>How it works<p>* *stream_to_redis.py* captures video stream frames → Redis streams<p>* *run_watcher.py* pulls the latest N frames, injects them + the rules into a prompt and hits a local *vLLM* server running *Qwen 2.5 VL*<p>* Model returns structured JSON (`should_alert`, `reasoning`, `awareness_level`)<p>* If `should_alert=True` → `playsound` beep<p>* Streamlit page displays both camera and LLM logs

Show HN: AI Baby Monitor – local Video-LLM that beeps when safety rules break

Hi HN! I built AI Baby Monitor – a tiny stack (Redis + vLLM + Streamlit) that watches a video stream and a YAML list of safety rules. If the model spots a rule being broken it plays beep sound, so you can quickly glance over and check on your baby.<p>Why?<p>When we bought a crib for our daughter, the first thing she tried was climbing over the rail :/ I got a bit paranoid about constantly watching her over, so I thought of a helper that can *actively* watch the baby, while parents could stay *semi-actively* alert. It’s meant to be an additional set of eyes, and *not* a replacement for the adult. Thus, just a beep sound and not phone notifications.<p>How it works<p>* *stream_to_redis.py* captures video stream frames → Redis streams<p>* *run_watcher.py* pulls the latest N frames, injects them + the rules into a prompt and hits a local *vLLM* server running *Qwen 2.5 VL*<p>* Model returns structured JSON (`should_alert`, `reasoning`, `awareness_level`)<p>* If `should_alert=True` → `playsound` beep<p>* Streamlit page displays both camera and LLM logs

Show HN: DaedalOS – Desktop Environment in the Browser

Demo: <a href="https://dustinbrett.com" rel="nofollow">https://dustinbrett.com</a><p>Hey HN!<p>I've been building my passion project daedalOS for over 4 years now.<p>The original idea was to give visitors to my website the experience as if they had remotely connected to my personal machine. To do this I decided I would attempt to recreate as much of the functionality as possible.<p>My hope is to keep working on this project for the rest of my life and continue to evolve it's capabilities as technologies progress.<p>Thanks for checking it out!

Show HN: DaedalOS – Desktop Environment in the Browser

Demo: <a href="https://dustinbrett.com" rel="nofollow">https://dustinbrett.com</a><p>Hey HN!<p>I've been building my passion project daedalOS for over 4 years now.<p>The original idea was to give visitors to my website the experience as if they had remotely connected to my personal machine. To do this I decided I would attempt to recreate as much of the functionality as possible.<p>My hope is to keep working on this project for the rest of my life and continue to evolve it's capabilities as technologies progress.<p>Thanks for checking it out!

Show HN: SVG Animation Software

Expressive Animator is an SVG vector animation software that helps users create and export animated icons, logos, and illustrations. Users can import SVG, PDF, Adobe Illustrator files, and Figma designs, and animate them using easing controls, motion paths, masking, and other techniques. Expressive Animator also allow users to export their animations in other formats as Lottie, GIF, PNG, and video.

Show HN: SVG Animation Software

Expressive Animator is an SVG vector animation software that helps users create and export animated icons, logos, and illustrations. Users can import SVG, PDF, Adobe Illustrator files, and Figma designs, and animate them using easing controls, motion paths, masking, and other techniques. Expressive Animator also allow users to export their animations in other formats as Lottie, GIF, PNG, and video.

Show HN: SVG Animation Software

Expressive Animator is an SVG vector animation software that helps users create and export animated icons, logos, and illustrations. Users can import SVG, PDF, Adobe Illustrator files, and Figma designs, and animate them using easing controls, motion paths, masking, and other techniques. Expressive Animator also allow users to export their animations in other formats as Lottie, GIF, PNG, and video.

Show HN: HNRelevant – Add a "related" section to Hacker News

It's been 2 years since the initial release [here](<a href="https://news.ycombinator.com/item?id=36102610">https://news.ycombinator.com/item?id=36102610</a>). The initial version was a very basic prototype which was not available anywhere beyond the GitHub repo. You had to install it as a userscript or load the extension manually.<p>Since then, it remained simple but better, new features include:<p>- Improved accuracy by also using comments to help gauge the topic of discussion and the right keywords.<p>- Published as plugin for more browsers: Chrome, Firefox (including android), and more recently Microsoft Edge.<p>- Support for narrow screens and mobile devices.<p>- Added preference controls.<p>You're here because you love interesting HN discussions but they're often buried away like hidden gems, so give it a try and let me know what you think.

Show HN: SuperUtilsPlus – A Modern Alternative to Lodash

Hey HN!<p>After years of wrestling with Lodash's quirks and bundle size issues, I decided to build something better. SuperUtilsPlus is my attempt at creating the utility library I wish existed.<p>What makes it different?<p>TypeScript-first approach: Unlike Lodash's retrofitted types, I built this from the ground up with TypeScript. The type inference actually works the way you'd expect it to.<p>Sensible defaults: Some of Lodash's decisions always bugged me. Like isObject([]) returning true - arrays aren't objects in my mental model. Or isNumber(NaN) being true when NaN literally stands for "Not a Number". I fixed these footguns.<p>Modern JavaScript: Built for ES2020+ with proper ESM support. No more weird CommonJS/ESM dance. Actually tree-shakable: You can import from specific modules (super-utils/array, super-utils/object) for optimal bundling. Your users will thank you.<p>The best parts IMO:<p>compactNil() - removes only null/undefined, leaves falsy values like 0 and false alone<p>differenceDeep() - array difference with deep equality (surprisingly useful)<p>Better random utilities with randomUUID() and randomString()<p>debounce() that actually works how you expect with proper leading/trailing options<p>Also genuinely curious - what are your biggest pain points with utility libraries? Did I miss any must-have functions?

Show HN: SuperUtilsPlus – A Modern Alternative to Lodash

Hey HN!<p>After years of wrestling with Lodash's quirks and bundle size issues, I decided to build something better. SuperUtilsPlus is my attempt at creating the utility library I wish existed.<p>What makes it different?<p>TypeScript-first approach: Unlike Lodash's retrofitted types, I built this from the ground up with TypeScript. The type inference actually works the way you'd expect it to.<p>Sensible defaults: Some of Lodash's decisions always bugged me. Like isObject([]) returning true - arrays aren't objects in my mental model. Or isNumber(NaN) being true when NaN literally stands for "Not a Number". I fixed these footguns.<p>Modern JavaScript: Built for ES2020+ with proper ESM support. No more weird CommonJS/ESM dance. Actually tree-shakable: You can import from specific modules (super-utils/array, super-utils/object) for optimal bundling. Your users will thank you.<p>The best parts IMO:<p>compactNil() - removes only null/undefined, leaves falsy values like 0 and false alone<p>differenceDeep() - array difference with deep equality (surprisingly useful)<p>Better random utilities with randomUUID() and randomString()<p>debounce() that actually works how you expect with proper leading/trailing options<p>Also genuinely curious - what are your biggest pain points with utility libraries? Did I miss any must-have functions?

Show HN: SuperUtilsPlus – A Modern Alternative to Lodash

Hey HN!<p>After years of wrestling with Lodash's quirks and bundle size issues, I decided to build something better. SuperUtilsPlus is my attempt at creating the utility library I wish existed.<p>What makes it different?<p>TypeScript-first approach: Unlike Lodash's retrofitted types, I built this from the ground up with TypeScript. The type inference actually works the way you'd expect it to.<p>Sensible defaults: Some of Lodash's decisions always bugged me. Like isObject([]) returning true - arrays aren't objects in my mental model. Or isNumber(NaN) being true when NaN literally stands for "Not a Number". I fixed these footguns.<p>Modern JavaScript: Built for ES2020+ with proper ESM support. No more weird CommonJS/ESM dance. Actually tree-shakable: You can import from specific modules (super-utils/array, super-utils/object) for optimal bundling. Your users will thank you.<p>The best parts IMO:<p>compactNil() - removes only null/undefined, leaves falsy values like 0 and false alone<p>differenceDeep() - array difference with deep equality (surprisingly useful)<p>Better random utilities with randomUUID() and randomString()<p>debounce() that actually works how you expect with proper leading/trailing options<p>Also genuinely curious - what are your biggest pain points with utility libraries? Did I miss any must-have functions?

Show HN: 1 min workouts for people who sit all day

I am a software developer and in the last few months after recently becoming a father I was barely finding time for a proper workout. Recently I was reading about new research on Snack Exercises and how beneficial mini workouts of less than 2mins every so often, during the day are to our body. So, I decided to build an iOS App for me and others to help with this. The app generates a list of exercises that I need to tick to complete daily or loose my streak. The algorithm takes into account muscle groups and balancing the exercises to hit most main muscles. I also stayed going through all exercises and adding a couple of alternative exercises in case I don't feel like the recommended exercise. Since I'm not a trainer I commissioned professional exercise posture video guides and animations by an exercise expert which I attached to each exercise.<p>I uploaded the app on the app store for free and no ads. If this is something that interests you, I want to hear how you balance a long day on your desk vs exercise.

Show HN: 1 min workouts for people who sit all day

I am a software developer and in the last few months after recently becoming a father I was barely finding time for a proper workout. Recently I was reading about new research on Snack Exercises and how beneficial mini workouts of less than 2mins every so often, during the day are to our body. So, I decided to build an iOS App for me and others to help with this. The app generates a list of exercises that I need to tick to complete daily or loose my streak. The algorithm takes into account muscle groups and balancing the exercises to hit most main muscles. I also stayed going through all exercises and adding a couple of alternative exercises in case I don't feel like the recommended exercise. Since I'm not a trainer I commissioned professional exercise posture video guides and animations by an exercise expert which I attached to each exercise.<p>I uploaded the app on the app store for free and no ads. If this is something that interests you, I want to hear how you balance a long day on your desk vs exercise.

Show HN: Rotary Phone Dial Linux Kernel Driver

A Linux kernel driver that turns a rotary phone dial into an evdev input device. You might be interested in this driver if you<p>- prefer the slow pace of dialing over typing numbers with your numpad,<p>- want to bring your old rotary phone into the digital era,<p>- are an educator looking for a simple example driver with a VM-based end-to-end development & test environment (no real hardware needed)<p>- have another creative use case in mind!<p>This driver was my introduction to embedded Linux years ago—and ultimately led to my career. However, it remained unfinished and unpublished until now. Initially, I intended to reimplement the driver in Rust to explore the state of the Rust for Linux project. Unfortunately, I soon realized that the necessary bindings simply are not available yet, so that part will have to wait.

Show HN: Rotary Phone Dial Linux Kernel Driver

A Linux kernel driver that turns a rotary phone dial into an evdev input device. You might be interested in this driver if you<p>- prefer the slow pace of dialing over typing numbers with your numpad,<p>- want to bring your old rotary phone into the digital era,<p>- are an educator looking for a simple example driver with a VM-based end-to-end development & test environment (no real hardware needed)<p>- have another creative use case in mind!<p>This driver was my introduction to embedded Linux years ago—and ultimately led to my career. However, it remained unfinished and unpublished until now. Initially, I intended to reimplement the driver in Rust to explore the state of the Rust for Linux project. Unfortunately, I soon realized that the necessary bindings simply are not available yet, so that part will have to wait.

Show HN: Rotary Phone Dial Linux Kernel Driver

A Linux kernel driver that turns a rotary phone dial into an evdev input device. You might be interested in this driver if you<p>- prefer the slow pace of dialing over typing numbers with your numpad,<p>- want to bring your old rotary phone into the digital era,<p>- are an educator looking for a simple example driver with a VM-based end-to-end development & test environment (no real hardware needed)<p>- have another creative use case in mind!<p>This driver was my introduction to embedded Linux years ago—and ultimately led to my career. However, it remained unfinished and unpublished until now. Initially, I intended to reimplement the driver in Rust to explore the state of the Rust for Linux project. Unfortunately, I soon realized that the necessary bindings simply are not available yet, so that part will have to wait.

< 1 2 3 ... 53 54 55 56 57 ... 863 864 865 >