<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: giovannibonetti</title><link>https://news.ycombinator.com/user?id=giovannibonetti</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 11 Aug 2026 11:32:49 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=giovannibonetti" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by giovannibonetti in "We replaced Redis with MySQL for inventory reservations and it scaled"]]></title><description><![CDATA[
<p>I wonder how we could handle that in a simpler way with durable workflows (e.g. Temporal, Restante, DBOS) – which are similar to Erlang processes but with persistent disk storage. This could avoid the need to maintain the 1000 row inventory.<p>Perhaps each shopping cart would have its own workflow, and the inventory item would have one as well. Then, whenever a customer put an item in their cart, their cart workflow would send a signal to the inventory item workflow and wait for the response. The inventory item workflow would maintain a ledger controlling to which cart each unit goes, and it could batch the writes to this table. This way, even if 100k customers try to purchase the same item in the same second, it should handle the load.<p>After the batch is written to the ledger, the inventory item workflow would reply signals to each cart workflow confirming that the reservation was completed. The end-to-end latency from the consumer point of view would be a fraction of a second, without needing the 1000-row hot-inventory heuristic.</p>
]]></description><pubDate>Sun, 09 Aug 2026 13:15:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=49231112</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=49231112</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49231112</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Indexing the Data Lake for Online Point Queries"]]></title><description><![CDATA[
<p>Instead of spending all of this effort trying to optimize an OLAP data lake for an OLTP use case, why not ust use a regular OLTP database like Postgres or MySQL?<p>Even if the data size is "infinite" you can put it on PlanetScale or something like that. If the tables are well optimized with covering indexes, you can pull out thousands of rows in 100ms for point queries, which is plenty for "point" queries.</p>
]]></description><pubDate>Sat, 01 Aug 2026 17:29:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=49136482</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=49136482</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49136482</guid></item><item><title><![CDATA[New comment by giovannibonetti in "The Open-Source Release of ML Video Codec (MLVC)"]]></title><description><![CDATA[
<p>> For example, for 360p video at 30 fps, where H.264 requires 1 Mbps, MLVC requires roughly 122 kbps for equivalent quality — about one-eight the bitrate under real-time conditions. The inference compute was kept approximately equal for the 360p and 540p resolutions. These results are based on a P.910 subjective test and are based on the Video Conferencing Dataset (VCD) dataset that we developed and also recently released as an open-source project.<p>Very impressive. Congratulations!</p>
]]></description><pubDate>Sat, 25 Jul 2026 16:17:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=49048879</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=49048879</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49048879</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Private healthcare makes industries less innovative. It's time for change"]]></title><description><![CDATA[
<p>> It is just a really awful system overall.<p>You mean for the user. It is great for the insurance companies, though, since tying health insurance to employment indirectly keeps the average user age lower, thus making the overall scheme more profitable.<p>As a general rule, people use health benefits more as they age.</p>
]]></description><pubDate>Thu, 23 Jul 2026 16:38:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=49024457</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=49024457</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49024457</guid></item><item><title><![CDATA[New comment by giovannibonetti in "The startup's Postgres survival guide"]]></title><description><![CDATA[
<p>> FOR UPDATE SKIP LOCKED
> The best way to think about this Postgres feature is that it reserves the rows that you’re selecting for use in your transaction without interfering with other queries. We use it primarily for implementing our job queue;<p>SKIP LOCKED is useful for implementing job queues with interactive transactions – you lock the row while working on it in the application and keeping the transaction open. For high-performance applications it is best to avoid interactive transactions at all, and just update the rows to "pending" immediately. There is no need for SKIP LOCKED in this case.<p>As a rule of thumb, as you scale up the application, you want to have less state in the database memory, and interactive transactions are just that. Idempotence beats atomicity at scale.</p>
]]></description><pubDate>Wed, 22 Jul 2026 20:51:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=49013246</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=49013246</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49013246</guid></item><item><title><![CDATA[New comment by giovannibonetti in "The startup's Postgres survival guide"]]></title><description><![CDATA[
<p>> The reason I think it’s useful to view queries as binary—they either seq scan or they don’t seq scan—is: the more you micro-optimize a query, the more of a risk you take that the query planner goes rogue. If you stick to querying by primary keys and indexes, the query planner will have a much easier time.<p>It's also important to notice the query planner optimizes for the average case, but often it would be better for the app developer if it was optimized for the worst case. But optimizing for the former is a much more tractable problem, so no wonder that's what is implemented.<p>I had to fight against the query planner when it would optimize a query for the average user, with few rows in a given table, and it would pick one index that made sense for that situation and return a result in less than 10ms. However, when a heavy user issued the same query, depending on the exact parameters the worst case could take over 1 second. So I had to write a much more complex query to force it to take another path with a different index, which would be slower in the average case, but in the worst case would take still less than 100ms. Avoiding timeouts was much more important for my company than taking 10ms more in the average case.</p>
]]></description><pubDate>Wed, 22 Jul 2026 20:40:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=49013111</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=49013111</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49013111</guid></item><item><title><![CDATA[New comment by giovannibonetti in "The startup's Postgres survival guide"]]></title><description><![CDATA[
<p>> Because of all these connection footguns, external connection poolers like pgbouncer are great! If you can’t add this for whatever reason, in-memory connection poolers are a great second option. For example, because Hatchet is open-source, we don’t assume that all user databases use connection poolers, so we use pgxpool (an in-memory connection pool for Go) for this purpose.<p>Few people know that there is a major bifurcation when it comes to connection pooling implementation.<p>1. Most application connection poolers follow a first-in-first-out (FIFO) algorithm, which is simple enough to implement and is enough to make sure the application always has a connection available to connect to the database. It optimizes low latency, and works great from the point of view from the application. The problem is that it has few mechanisms to remove redundant connections, since the application is constantly keeping them all "warm".<p>2. PgBouncer and very few external poolers follow the inverse idea – last-in-first-out (LIFO), and they optimize for reducing the number of connections that reach Postgres, thus improving its throughput. The idea might seem crazy at first – the last connection used is the first one to be picked up again – but this algorithm automatically removes excess connections, which will get cold and get closed.<p>When starting a new application, option (1) is enough, but as it scales up enough, at some time it is recommended to use (2), since having hundreds of open connections to Postgres is bad for performance if you can use PgBouncer or similar to cut it by 90%. Postgres' process-per-connection design works much better when there are fewer connections reaching it.</p>
]]></description><pubDate>Wed, 22 Jul 2026 20:30:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=49012993</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=49012993</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49012993</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Show HN: Jacquard, a programming language for AI-written, human-reviewed code"]]></title><description><![CDATA[
<p>This reminds me of the Flix programming language [1], which has annotated effects like so:<p>def main(): Unit \ { Clock, Http, Logger, IO } = ...<p>[1] <a href="https://flix.dev/" rel="nofollow">https://flix.dev/</a></p>
]]></description><pubDate>Wed, 15 Jul 2026 17:39:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=48924423</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48924423</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48924423</guid></item><item><title><![CDATA[New comment by giovannibonetti in "DSLs Enable Reliable Use of LLMs"]]></title><description><![CDATA[
<p>This reminds me of this Bjarne Stroustrup's Rule (creator of C++):
- For new features, people insist on loud, explicit syntax.
- For established features, people want terse notation<p>Hillel Wayne [1] argues that the same applies for the differences between what beginners and experts desire from a language:
Beginners need explicit syntax, experts want terse syntax.<p>In my mind, DSLs are related to that – a short notation to avoid repetition. And LLMs are the experts.<p>I wonder if Lisp with its powerful DSL-creating macros will enjoy more popularity in the near future.<p>[1] <a href="https://buttondown.com/hillelwayne/archive/stroustrups-rule/" rel="nofollow">https://buttondown.com/hillelwayne/archive/stroustrups-rule/</a></p>
]]></description><pubDate>Wed, 15 Jul 2026 13:13:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=48920362</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48920362</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48920362</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Online vs. Offline AI Evals: When to Use Each"]]></title><description><![CDATA[
<p>> That's fewer moving parts, one load-bearing system instead of two...<p>When I saw "load-bearing" I remembered the other discussion in the frontpage explaining how to prevent Claude from saying that so often.</p>
]]></description><pubDate>Wed, 15 Jul 2026 02:10:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=48915434</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48915434</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48915434</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Claude Code sends 33k tokens before reading the prompt; OpenCode sends 7k"]]></title><description><![CDATA[
<p>Perhaps what is missing is a better memory/caching layer to avoid doing the same for explorations over and over again.</p>
]]></description><pubDate>Sun, 12 Jul 2026 21:46:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=48885144</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48885144</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48885144</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Protobuf-py: Protobuf for Python, without compromises"]]></title><description><![CDATA[
<p>I wish LaunchDarkly and other feature flag providers supported protocol buffers to MN define the feature flag schema. It would be a game changer when you have complex variations and end up reaching for untyped JSON.</p>
]]></description><pubDate>Sun, 12 Jul 2026 13:28:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=48881060</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48881060</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48881060</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Postgres rewritten in Rust, now passing 100% of the Postgres regression tests"]]></title><description><![CDATA[
<p>Property testing and deterministic simulation seem like good alternatives.</p>
]]></description><pubDate>Fri, 10 Jul 2026 01:07:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=48854551</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48854551</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48854551</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Fast Software, the Best Software (2019)"]]></title><description><![CDATA[
<p>Shout-out to PowerSync for making it easier to develop fast offline-first mobile apps. It pushes data from Postgres/MySQL/SQL Server subscriptions to a SQLite into the user's mobile device, avoiding the need for many loading animations when the data is there ahead of time. My company is a customer and we recommend it.</p>
]]></description><pubDate>Sun, 05 Jul 2026 13:39:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=48794258</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48794258</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48794258</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Show HN: Y – A malleable coding-agent desktop app built with Electron"]]></title><description><![CDATA[
<p>It would be even cooler if it was made with a Lisp and took advantage of it being homoiconic.</p>
]]></description><pubDate>Wed, 24 Jun 2026 01:48:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=48654159</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48654159</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48654159</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Show HN: Bun-sqlgen – Type-safe raw SQL for Bun, no ORM"]]></title><description><![CDATA[
<p>Those looking for a more mature solution in this space will probably enjoy SQLc [1]. It was initially developed for Go applications, but over the years it got pluggins for many other languages, including JavaScript/Typescript.<p>[1] <a href="https://sqlc.dev/" rel="nofollow">https://sqlc.dev/</a></p>
]]></description><pubDate>Tue, 23 Jun 2026 16:33:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=48647524</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48647524</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48647524</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Phoenix LiveView 1.2"]]></title><description><![CDATA[
<p>> but seeing how Lustre does HTML templating versus how Phoenix does Heex was my deciding factor to try the latter. My understanding is this is because of a current lack of any macro system.<p>When I worked with Ruby on Rails I was "addicted" to macros for everything, but after working for a while with statically-typed languages like Elm and Gleam, I see that there are many other ways to solve those same problems. The code can be quite repetitive sometimes, but as long as the compiler ensures everything is in place, it works quite well.</p>
]]></description><pubDate>Mon, 15 Jun 2026 12:38:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=48540380</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48540380</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48540380</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Phoenix LiveView 1.2"]]></title><description><![CDATA[
<p>For those of you a similar SPA-type app with more type safety – which is even more useful for writing code with AI – you may want to have a look at the Gleam language and the Lustre web framework [1]. It combines the best of Elixir and Elm. You can mix and match having more logic in the backend or the frontend, as Gleam compiles both to Erlang and to JS.<p>[1] <a href="https://lustre.hexdocs.pm/lustre/server_component.html" rel="nofollow">https://lustre.hexdocs.pm/lustre/server_component.html</a></p>
]]></description><pubDate>Sun, 14 Jun 2026 13:26:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=48527006</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48527006</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48527006</guid></item><item><title><![CDATA[New comment by giovannibonetti in "Free SQL→ER diagram tool, runs in the browser, nothing uploaded"]]></title><description><![CDATA[
<p>Given that it has only two commits, where the first one is just "done", I would guess a substantial amount.</p>
]]></description><pubDate>Sun, 14 Jun 2026 13:00:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=48526820</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48526820</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48526820</guid></item><item><title><![CDATA[New comment by giovannibonetti in "SQLite Is a Library of Congress Recommended Storage Format"]]></title><description><![CDATA[
<p>If it's going to be read-only, why not make it a Parquet file instead? It should result in a smaller file size due to columnar compression.<p>DuckDB has built-in capability to read Parquet files with HTTP range requests.</p>
]]></description><pubDate>Thu, 07 May 2026 16:31:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=48051401</link><dc:creator>giovannibonetti</dc:creator><comments>https://news.ycombinator.com/item?id=48051401</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48051401</guid></item></channel></rss>