<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: MaxGabriel</title><link>https://news.ycombinator.com/user?id=MaxGabriel</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 30 Apr 2026 21:59:23 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=MaxGabriel" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by MaxGabriel in "Gone (Almost) Phishin'"]]></title><description><![CDATA[
<p>Any chance the first result was an ad? Those are definitely a popular phishing distribution mechanism, so getting your parents an adblocker could help</p>
]]></description><pubDate>Thu, 02 Apr 2026 12:30:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=47613561</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=47613561</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47613561</guid></item><item><title><![CDATA[New comment by MaxGabriel in "Scaling PostgreSQL to power 800M ChatGPT users"]]></title><description><![CDATA[
<p>We have a similar check in our Haskell codebase, after running into two issues:<p>1. Nested database transactions could exhaust the transaction pool and deadlock
2. Same as you described with doing eg HTTP during transactions<p>We now have a compile time guarantee that no IO can be done outside of whitelisted things, like logging or getting the current time. It’s worked great! Definitely a good amount of work though.</p>
]]></description><pubDate>Sat, 24 Jan 2026 13:29:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=46743352</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=46743352</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46743352</guid></item><item><title><![CDATA[New comment by MaxGabriel in "The challenges of soft delete"]]></title><description><![CDATA[
<p>One thing to add about performance: it's also pretty easy in Postgres to index only non-soft deleted data.<p>I think this is likely unnecessary for most use cases and is mostly a RAM saving measure, but could help in some cases.</p>
]]></description><pubDate>Thu, 22 Jan 2026 23:47:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=46726629</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=46726629</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46726629</guid></item><item><title><![CDATA[New comment by MaxGabriel in "The challenges of soft delete"]]></title><description><![CDATA[
<p>This might stem from the domain I work in (banking), but I have the opposite take. Soft delete pros to me:<p>* It's obvious from the schema: If there's a `deleted_at` column, I know how to query the table correctly (vs thinking rows aren't DELETEd, or knowing where to look in another table)<p>* One way to do things: Analytics queries, admin pages, it all can look at the same set of data, vs having separate handling for historical data.<p>* DELETEs are likely fairly rare by volume for many use cases<p>* I haven't found soft-deleted rows to be a big performance issue. Intuitively this should be true, since queries should be  O log(N)<p>* Undoing is really easy, because all the relationships stay in place, vs data already being moved elsewhere (In practice, I haven't found much need for this kind of undo).<p>In most cases, I've really enjoyed going even further and making rows fully immutable, using a new row to handle updates. This makes it really easy to reference historical data.<p>If I was doing the logging approach described in the article, I'd use database triggers that keep a copy of every INSERT/UPDATE/DELETEd row in a duplicate table. This way it all stays in the same database—easy to query and replicate elsewhere.</p>
]]></description><pubDate>Tue, 20 Jan 2026 23:17:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=46699002</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=46699002</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46699002</guid></item><item><title><![CDATA[New comment by MaxGabriel in "Mercury defeats phishing with device verification"]]></title><description><![CDATA[
<p>I’m the author of this post and a co-founder of Mercury. Let me know if you have any questions!</p>
]]></description><pubDate>Wed, 26 Feb 2025 17:55:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=43186165</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=43186165</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43186165</guid></item><item><title><![CDATA[Mercury defeats phishing with device verification]]></title><description><![CDATA[
<p>Article URL: <a href="https://mercury.com/blog/how-mercury-defeats-phishing-with-device-verification">https://mercury.com/blog/how-mercury-defeats-phishing-with-device-verification</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=43186078">https://news.ycombinator.com/item?id=43186078</a></p>
<p>Points: 6</p>
<p># Comments: 1</p>
]]></description><pubDate>Wed, 26 Feb 2025 17:47:27 +0000</pubDate><link>https://mercury.com/blog/how-mercury-defeats-phishing-with-device-verification</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=43186078</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43186078</guid></item><item><title><![CDATA[New comment by MaxGabriel in "Haskell: A Great Procedural Language"]]></title><description><![CDATA[
<p>You’re correct that Mercury uses Haskell for its backend: <a href="https://serokell.io/blog/haskell-in-production-mercury" rel="nofollow">https://serokell.io/blog/haskell-in-production-mercury</a></p>
]]></description><pubDate>Sun, 19 Jan 2025 12:49:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=42756536</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=42756536</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42756536</guid></item><item><title><![CDATA[New comment by MaxGabriel in "Magic/tragic email links: don't make them the only option"]]></title><description><![CDATA[
<p>> AFAICT, Mercury only allows a single security key.<p>We allow multiple security keys. You can add more here: <a href="https://app.mercury.com/settings/security" rel="nofollow">https://app.mercury.com/settings/security</a></p>
]]></description><pubDate>Wed, 08 Jan 2025 05:03:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=42631117</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=42631117</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42631117</guid></item><item><title><![CDATA[New comment by MaxGabriel in "Magic/tragic email links: don't make them the only option"]]></title><description><![CDATA[
<p>> 6-10 digit numeric or alphanumeric code that could be copied out of the email message into a form field on the signin screen.<p>To be clear this is what we're trying to avoid. An easily typeable code like that can be typed into a phisher's website.</p>
]]></description><pubDate>Wed, 08 Jan 2025 02:22:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=42630203</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=42630203</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42630203</guid></item><item><title><![CDATA[New comment by MaxGabriel in "Magic/tragic email links: don't make them the only option"]]></title><description><![CDATA[
<p>Oh good find, the link going through Mailgun as a redirect is a recent regression. We have a PR to fix that going live soon.<p>That said, our security team and I agree there is no security issue here. Mailgun already can see the text of the emails we send.</p>
]]></description><pubDate>Wed, 08 Jan 2025 02:20:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=42630200</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=42630200</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42630200</guid></item><item><title><![CDATA[New comment by MaxGabriel in "Magic/tragic email links: don't make them the only option"]]></title><description><![CDATA[
<p>I’m the CTO of Mercury<p>You shouldn’t get the device verification requirement if you’ve used the device before (we store a permanent cookie to check this) or for the same IP. Any chance your cookies are being cleared regularly?<p>We added this after attackers created clones of <a href="http://mercury.com" rel="nofollow">http://mercury.com</a> and took out Google ads for it. When customers entered their password and TOTP on the phishing site, the phisher would use their credentials to login and create virtual cards and buy crypto/gold/etc. The phisher would also redirect the user to the real Mercury and hope they figured it was a blip.<p>This device verification link we send authorizes the IP/device you open it on, which has almost entirely defeated the phishers.<p>Since WebAuthn is immune to this style of phishing attack, we don’t require device verification if you use it. I highly recommend using TouchID/FaceID or your device’s flavor of WebAuthn if you can—it’s more convenient and more secure. You can add it here: <a href="https://app.mercury.com/settings/security" rel="nofollow">https://app.mercury.com/settings/security</a><p>That said, we are talking internally about your post and we do recognize that as IPv6 gets more traction IPs will rotate much more regularly, so we’ll think if we should loosen restrictions on being a same-IP match.</p>
]]></description><pubDate>Tue, 07 Jan 2025 23:44:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=42629109</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=42629109</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42629109</guid></item><item><title><![CDATA[New comment by MaxGabriel in "Documenting Your Database Schema"]]></title><description><![CDATA[
<p>I think database schema docs are really valuable, so much so that I added tests that require docs for each table and column. But I still got asks that the docs needed more information, mostly from data science people (who otherwise need to go bug engineers, or end up writing bugs in their own SQL). So I wrote internal guidelines for documenting database tables, and eventually that became this blog post<p>Lemme know if you have any questions!</p>
]]></description><pubDate>Fri, 09 Aug 2024 13:32:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=41201652</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=41201652</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41201652</guid></item><item><title><![CDATA[Documenting Your Database Schema]]></title><description><![CDATA[
<p>Article URL: <a href="https://mercury.com/blog/documenting-your-database-schema">https://mercury.com/blog/documenting-your-database-schema</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=41201651">https://news.ycombinator.com/item?id=41201651</a></p>
<p>Points: 3</p>
<p># Comments: 1</p>
]]></description><pubDate>Fri, 09 Aug 2024 13:32:01 +0000</pubDate><link>https://mercury.com/blog/documenting-your-database-schema</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=41201651</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41201651</guid></item><item><title><![CDATA[New comment by MaxGabriel in "Show HN: Built a self hosted clean status page and batteries"]]></title><description><![CDATA[
<p>> Kener is a Open-Source<p>Should this be “an” in the page header?</p>
]]></description><pubDate>Tue, 23 Jan 2024 15:04:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=39104223</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=39104223</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39104223</guid></item><item><title><![CDATA[New comment by MaxGabriel in "Gmail and Yahoo’s 2024 inbox protections and what they mean for email programs"]]></title><description><![CDATA[
<p>100% open rate on transactional emails feels too high to me. Something like an e-commerce purchase might kick off multiple emails (purchase made, shipped, arrived), none of which the user opens</p>
]]></description><pubDate>Wed, 10 Jan 2024 05:42:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=38936654</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=38936654</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38936654</guid></item><item><title><![CDATA[Utility Types in TypeScript]]></title><description><![CDATA[
<p>Article URL: <a href="https://mercury.com/blog/utility-types-in-typescript">https://mercury.com/blog/utility-types-in-typescript</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=37711052">https://news.ycombinator.com/item?id=37711052</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 29 Sep 2023 22:54:40 +0000</pubDate><link>https://mercury.com/blog/utility-types-in-typescript</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=37711052</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37711052</guid></item><item><title><![CDATA[Creating an EmptyObject Type in TypeScript]]></title><description><![CDATA[
<p>Article URL: <a href="https://mercury.com/blog/creating-an-emptyobject-type-in-typescript">https://mercury.com/blog/creating-an-emptyobject-type-in-typescript</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=37711046">https://news.ycombinator.com/item?id=37711046</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 29 Sep 2023 22:54:06 +0000</pubDate><link>https://mercury.com/blog/creating-an-emptyobject-type-in-typescript</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=37711046</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37711046</guid></item><item><title><![CDATA[New comment by MaxGabriel in "Linting Your Postgres Schema"]]></title><description><![CDATA[
<p>I’m the author of this post and a co-founder of Mercury. AMA!</p>
]]></description><pubDate>Fri, 29 Sep 2023 22:31:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=37710859</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=37710859</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37710859</guid></item><item><title><![CDATA[Linting Your Postgres Schema]]></title><description><![CDATA[
<p>Article URL: <a href="https://mercury.com/blog/lints-for-postgres-schema">https://mercury.com/blog/lints-for-postgres-schema</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=37710380">https://news.ycombinator.com/item?id=37710380</a></p>
<p>Points: 2</p>
<p># Comments: 1</p>
]]></description><pubDate>Fri, 29 Sep 2023 21:36:55 +0000</pubDate><link>https://mercury.com/blog/lints-for-postgres-schema</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=37710380</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37710380</guid></item><item><title><![CDATA[New comment by MaxGabriel in "Game developers turning off all IronSource and Unity Ads monetization"]]></title><description><![CDATA[
<p>It’s pretty common to use ad network mediators, which try multiple ad networks for an ad, to optimize for using high earning ones first, and falling back to others in case the first network didn’t have an ad to show.<p>(I helped make such a product 7 years ago)</p>
]]></description><pubDate>Sat, 16 Sep 2023 16:56:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=37536479</link><dc:creator>MaxGabriel</dc:creator><comments>https://news.ycombinator.com/item?id=37536479</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37536479</guid></item></channel></rss>