<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: jsw</title><link>https://news.ycombinator.com/user?id=jsw</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 11 Jun 2026 04:55:56 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=jsw" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by jsw in "PgDog is funded and coming to a database near you"]]></title><description><![CDATA[
<p>Interesting! We interact with the low-level APIs too vs the SDK, also: an IO scheduler for request batching and conn management, request hedging, full MVCC transactions, etc. We store raw bytes in DDB and manage schema/etc elsewhere. Curious if there is other low-hanging fruit, or not so low, you found that we haven't discovered yet.</p>
]]></description><pubDate>Wed, 10 Jun 2026 19:35:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=48481479</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=48481479</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48481479</guid></item><item><title><![CDATA[New comment by jsw in "PgDog is funded and coming to a database near you"]]></title><description><![CDATA[
<p>Curious how the DB startup with Dynamo at its core went. We use it heavily. The primary tricky thing for us at the moment is aligning pricing with workload value.</p>
]]></description><pubDate>Wed, 10 Jun 2026 19:10:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=48481174</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=48481174</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48481174</guid></item><item><title><![CDATA[AWS ExtendDB, open-source DynamoDB API with pluggable backends]]></title><description><![CDATA[
<p>Article URL: <a href="https://aws.amazon.com/blogs/database/introducing-extenddb-an-open-source-dynamodb-compatible-adapter-with-pluggable-storage-backends/">https://aws.amazon.com/blogs/database/introducing-extenddb-an-open-source-dynamodb-compatible-adapter-with-pluggable-storage-backends/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48217095">https://news.ycombinator.com/item?id=48217095</a></p>
<p>Points: 3</p>
<p># Comments: 1</p>
]]></description><pubDate>Thu, 21 May 2026 02:30:06 +0000</pubDate><link>https://aws.amazon.com/blogs/database/introducing-extenddb-an-open-source-dynamodb-compatible-adapter-with-pluggable-storage-backends/</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=48217095</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48217095</guid></item><item><title><![CDATA[New comment by jsw in "Emacs-libgterm: Terminal emulator for Emacs using libghostty-vt"]]></title><description><![CDATA[
<p>Do you have any of your fixes publicly available?</p>
]]></description><pubDate>Thu, 02 Apr 2026 15:29:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=47615801</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=47615801</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47615801</guid></item><item><title><![CDATA[New comment by jsw in "Term-keys – Lossless keyboard input for Emacs"]]></title><description><![CDATA[
<p>Regardless, that’s kind of the beauty of this project: term-keys generates the terminal config file based on all your bespoke keybindings for you. Would probably be easier to setup than you imagine.</p>
]]></description><pubDate>Sun, 07 Dec 2025 18:09:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=46183679</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=46183679</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46183679</guid></item><item><title><![CDATA[New comment by jsw in "Term-keys – Lossless keyboard input for Emacs"]]></title><description><![CDATA[
<p>MacOS user here. So many times over the last decade I’ve journeyed to get terminal Emacs working with my litany of weird keybindings. But I always end up back in the GUI.<p>I switched to Colemak about 15 years ago and thought it would be a good idea to rethink all my Emacs keybindings, since my muscle memory was shot in that transition. (I don’t recommend this in hindsight.)<p>I have yet to get a terminal working fully like the GUI. Partly because I refuse to install a third-party key mapper.<p>Anyway, just tried this and Alacritty. It’s the closest I’ve got to fully working. My guess is another hour of tweaking and I could maybe get all the way there.</p>
]]></description><pubDate>Sun, 07 Dec 2025 00:12:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=46177935</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=46177935</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46177935</guid></item><item><title><![CDATA[New comment by jsw in "Monotonic and wall clock time in the Go time package"]]></title><description><![CDATA[
<p>For simple high-frequency time deltas, I've found this function wins on the perf front:<p><pre><code>  //go:linkname nanotime runtime.nanotime
  func nanotime() int64</code></pre></p>
]]></description><pubDate>Fri, 25 Jul 2025 18:53:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=44686855</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=44686855</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44686855</guid></item><item><title><![CDATA[New comment by jsw in "An Interactive Guide to Rate Limiting"]]></title><description><![CDATA[
<p>Love the simplicity and elegance of the design to address this problem.</p>
]]></description><pubDate>Sun, 08 Jun 2025 15:35:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=44217604</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=44217604</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44217604</guid></item><item><title><![CDATA[New comment by jsw in "An Interactive Guide to Rate Limiting"]]></title><description><![CDATA[
<p>I mentioned this in another place on this thread, but a simple AIMD algorithm paired with a token bucket is surprisingly effective at dynamically adjusting to available capacity, even across a fleet of services not sharing state other than the contended resource.<p>Pretty easy to pair AIMD with token bucket (eg <a href="https://github.com/webriots/rate">https://github.com/webriots/rate</a>)</p>
]]></description><pubDate>Fri, 06 Jun 2025 18:02:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=44203428</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=44203428</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44203428</guid></item><item><title><![CDATA[New comment by jsw in "An Interactive Guide to Rate Limiting"]]></title><description><![CDATA[
<p>I’ve found the AIMD algo (additive increase, multiplicative decrease) paired with a token bucket gives a nice way to have a distributed set of processes adapt to backend capacity without centralized state.<p>Also found that AIMD is better than a circuit breaker in a lot of circumstances too.<p>Golang lib of the above <a href="https://github.com/webriots/rate">https://github.com/webriots/rate</a></p>
]]></description><pubDate>Fri, 06 Jun 2025 15:48:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=44202040</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=44202040</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44202040</guid></item><item><title><![CDATA[Show HN: A Go library to rate limit across millions of users]]></title><description><![CDATA[
<p>I built a thread-safe rate limiting library for Go that's lock-free with zero allocations on the hot path. It features multiple strategies including classic token bucket and TCP-inspired AIMD algorithm for dynamic rate adjustments. Optimized for high-throughput systems with memory efficiency (packed uint64 representation) and precise per-entity limiting.<p>When building high-throughput services, I kept hitting the same problem with existing rate limiting libraries - they break down with high-cardinality identifiers. Try rate limiting millions of unique user IDs, API keys, or IPs and you'll face:<p><pre><code>  1. Memory consumption exploding linearly with cardinality
  2. Lookup performance degrading as hash tables grow
  3. Contention killing throughput under load
  4. GC pressure from constant allocations
</code></pre>
I built rate specifically to solve this:<p><pre><code>  - Fixed memory footprint regardless of cardinality (configurable power-of-2
  buckets)
  - Sub-microsecond, zero-allocation operations even at scale
  - Lock-free design using atomic operations
  - Collision probabilities you can reason about mathematically
</code></pre>
This means you can rate limit by user ID, device ID, API key, IP address or any other high-cardinality identifier without performance penalty. The benchmark numbers tell the story: even with thousands of distinct IDs hitting the limiter concurrently, operations complete in 1-15ns with zero allocations.</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=43996751">https://news.ycombinator.com/item?id=43996751</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Thu, 15 May 2025 16:38:52 +0000</pubDate><link>https://github.com/webriots/rate</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=43996751</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43996751</guid></item><item><title><![CDATA[New comment by jsw in "When to use Bazel?"]]></title><description><![CDATA[
<p>Bazel is a fully reproducible and hermetic build system. A lot of painstaking work goes into it producing the exact same artifacts build after build. And that provides some interesting properties that you can leverage for artifact caching, deployments, and CICD.<p>We very happily runny a polyglot monorepo w/ 5+ languages, multiple architectures, with fully reproducible artifacts and deployment manifests, all deployed to almost all AWS regions on every build. We update tens of thousands of resources in every environment for every build. The fact that Bazel is creating reproducible artifacts allow us to manage this seamlessly and reliably. Clean builds take an hour+, but our GH self-hosted runners often complete commit to green build for our devs in less than a minute.<p>The core concept of Bazel is very simple: explicitly declare the input you pass to a rule/tool and explicitly declare the output it creates. If that can click, you're half way there.</p>
]]></description><pubDate>Tue, 13 Sep 2022 22:48:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=32831169</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=32831169</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=32831169</guid></item><item><title><![CDATA[New comment by jsw in "US Senate votes unanimously to make daylight savings time permanent"]]></title><description><![CDATA[
<p>I wish “Prevailing Time” would catch on. Eg PPT</p>
]]></description><pubDate>Tue, 15 Mar 2022 19:52:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=30690565</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=30690565</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30690565</guid></item><item><title><![CDATA[New comment by jsw in "A Better Model for Stacked Pull Requests"]]></title><description><![CDATA[
<p>Mergify just introduced a “speculative merge queues[1]” feature that does something very similar.<p>[1] <a href="https://blog.mergify.io/announcing-speculative-merge-queues" rel="nofollow">https://blog.mergify.io/announcing-speculative-merge-queues</a></p>
]]></description><pubDate>Sat, 24 Apr 2021 03:27:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=26922000</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=26922000</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=26922000</guid></item><item><title><![CDATA[New comment by jsw in "Google Fonts Analytics"]]></title><description><![CDATA[
<p>That sweet, sweet traffic data.</p>
]]></description><pubDate>Wed, 19 Feb 2020 19:27:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=22369082</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=22369082</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=22369082</guid></item><item><title><![CDATA[New comment by jsw in "Why Google Stores Billions of Lines of Code in a Single Repository (2016)"]]></title><description><![CDATA[
<p>I've always been curious about the general directory structure they use for this. Does anyone have insight?</p>
]]></description><pubDate>Sat, 11 Jan 2020 17:59:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=22021268</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=22021268</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=22021268</guid></item><item><title><![CDATA[New comment by jsw in "Monorepo is great if you're really good"]]></title><description><![CDATA[
<p>I’m firmly on team monorepo, and I agree great tooling is an absolute requirement. We use Bazel + AWS CodeBuild with local caching. We have an average incremental CI build of our monorepo that’s under 45 seconds. Clean build 30+ minutes.</p>
]]></description><pubDate>Tue, 30 Jul 2019 16:40:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=20566548</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=20566548</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=20566548</guid></item><item><title><![CDATA[New comment by jsw in "Robinhood Stored Passwords in Plaintext"]]></title><description><![CDATA[
<p>The AWS Cognito User Pool Authentication Flow utilizes an augmented PAKE (SRP). I imagine there are a number of major sites that use Cognito along with the SRP auth flows baked into their std libs. I know I've used it a number of times.</p>
]]></description><pubDate>Wed, 24 Jul 2019 22:36:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=20520711</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=20520711</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=20520711</guid></item><item><title><![CDATA[New comment by jsw in "What if we could see all concurrency bugs in the debugger?"]]></title><description><![CDATA[
<p>TLA+ specs explore all state spaces of concurrent processes. Avoiding state explosions is something you need to be conscious of when building those. The modeling required also takes some learning investment. Curious if this can really pull off something like a TLA+ state exploration and invariant violation detection with real-world code.</p>
]]></description><pubDate>Fri, 12 Jul 2019 22:09:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=20424968</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=20424968</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=20424968</guid></item><item><title><![CDATA[A Change Data Capture Pipeline from PostgreSQL to Kafka]]></title><description><![CDATA[
<p>Article URL: <a href="https://www.simple.com/engineering/a-change-data-capture-pipeline-from-postgresql-to-kafka">https://www.simple.com/engineering/a-change-data-capture-pipeline-from-postgresql-to-kafka</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=13996988">https://news.ycombinator.com/item?id=13996988</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Thu, 30 Mar 2017 16:53:03 +0000</pubDate><link>https://www.simple.com/engineering/a-change-data-capture-pipeline-from-postgresql-to-kafka</link><dc:creator>jsw</dc:creator><comments>https://news.ycombinator.com/item?id=13996988</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=13996988</guid></item></channel></rss>