<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: exogen</title><link>https://news.ycombinator.com/user?id=exogen</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 13 Jun 2026 02:04:48 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=exogen" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by exogen in "I spent years trying to make CSS states predictable"]]></title><description><![CDATA[
<p>I am sorry that you are bad at analogies.</p>
]]></description><pubDate>Mon, 27 Apr 2026 15:54:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=47923249</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=47923249</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47923249</guid></item><item><title><![CDATA[New comment by exogen in "I spent years trying to make CSS states predictable"]]></title><description><![CDATA[
<p>Because that third-party code adds its own HTML tags.<p>Because that third-party code adds its own CSS.<p>Because my HTML and the third-party HTML live in the same document. Thus, my CSS could target their HTML, and their CSS could target my HTML. There are no modules and therefore no module boundaries.<p>Because my CSS and the third-party CSS share a global namespace. Thus, their CSS selectors might overlap with my CSS selectors. Hopefully nobody called anything ".container" or ".wrapper" or ".button" since there's no namespacing, right?<p>Keep in mind these components might be arbitrarily nestable. Maybe my elements can be a child of theirs? Maybe theirs can be a child of mine? Can I opt out of the cascade? Should I?<p>Maybe we could all use the Shadow DOM? I don't really have control over what third-parties do, but let's say I dig into their implementation (what fun) and choose only ones that use the Shadow DOM. Now I've massively bumped up the complexity and ensured my document can't render without JavaScript; lots of user-agents go right out the window and see nothing.<p>Let's reduce it to the simplest possible case: you and I are working on the same website, but I'm responsible for the header and you're responsible for the footer. We even have our own separate .css files. Yay, no merge conflicts.<p>Can you and I safely write our selectors without coordinating with each other?<p>(If you think the answer is yes... you're wrong.)<p>Now add a few dozen more team members and several third-parties who we in fact CANNOT coordinate with.<p>Everywhere you turn there are tradeoffs and half-solutions. Turns out "Just Do X" is not very helpful. Thus, I don't blame people at all for developing their own solutions to scaling CSS - like OP's framework.</p>
]]></description><pubDate>Mon, 27 Apr 2026 15:09:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=47922666</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=47922666</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47922666</guid></item><item><title><![CDATA[New comment by exogen in "I spent years trying to make CSS states predictable"]]></title><description><![CDATA[
<p>Exactly. The problem is the platform has not kept up with the way it's used in practice. Features are added with strange priorities, and obvious blind spots ignored, leading to it being under-developed in many areas, and over-developed in a handful of others. We get vendors working on weird stuff like Web Bluetooth before obvious things like element anchoring (finally, yay... but still just a Working Draft) and reliable element position tracking (still a huge pain).<p>There are still no affordances for many things, so people have to invent their own solutions.</p>
]]></description><pubDate>Fri, 24 Apr 2026 14:03:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=47890477</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=47890477</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47890477</guid></item><item><title><![CDATA[New comment by exogen in "I spent years trying to make CSS states predictable"]]></title><description><![CDATA[
<p>> A selector is not not a variable or a function. CSS has functions (e.g translate) and it has variables, which are both distinct concepts in the language from selectors.<p>That misses the point. They're identifiers scoped to the entire document - the same way global variables and global functions are identifiers scoped to an entire program.</p>
]]></description><pubDate>Fri, 24 Apr 2026 14:00:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=47890432</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=47890432</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47890432</guid></item><item><title><![CDATA[New comment by exogen in "I spent years trying to make CSS states predictable"]]></title><description><![CDATA[
<p>Because many web sites and apps aren't as simple as "my first homepage" and don't only consist of first-party code. Think component libraries. Reusable code. Content management systems. Third-party SDKs (chat widgets, support widgets, payment widgets like Stripe, etc.).<p>One of my earliest webdev jobs was at a company whose product was a widget you could add to your site by adding our `<script>` tag. Thus, our CSS needed to coexist with the first-party site's, not to mention any other third-party widgets on there. In other words: the same exact reason you need modules in traditional languages.</p>
]]></description><pubDate>Fri, 24 Apr 2026 03:45:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=47885266</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=47885266</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47885266</guid></item><item><title><![CDATA[New comment by exogen in "I spent years trying to make CSS states predictable"]]></title><description><![CDATA[
<p>Been writing CSS since 1997. Your mistake is thinking that the authors of these frameworks (or their target audience) just don't know how to use CSS correctly. But it's far more likely that the authors know far, far more about the intricacies of CSS and how it works than most developers. These frameworks are almost always developed by people with deep experience in the trenches, who have realized that CSS scales fucking terribly... not because they are misinformed or did anything wrong.<p>Namely:<p>- Selectors are a global namespace. Imagine if every variable and function in your favorite programming languages were global and so had to be unique. No modules or namespaces. Developing a system to fix that would be pretty high on my list of priorities... coming up with a cool solution and then people telling me to "just learn the language" would be pretty fucking infuriating, don't you think?<p>- Several fighting priority systems (did you know about newer ones like @layer?). And equivalent priority falls back to source order - OK, so how do you square that with dynamic loading? Some navigation paths through an app would inject some CSS first whereas others would inject other CSS first. Good luck!</p>
]]></description><pubDate>Fri, 24 Apr 2026 03:29:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=47885155</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=47885155</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47885155</guid></item><item><title><![CDATA[New comment by exogen in "A Broken Heart"]]></title><description><![CDATA[
<p>Somewhat familiar with them, but can't say I've ever built anything with them. I'm curious though: are you aware that people already consider React and its cousins to be immediate mode style APIs for the Web? At least, as close as you can reasonably get when your rendering target is the DOM? That's why `UI = f(state)` is so often cited in React literature; components are functions that don't know anything about the "widget tree" or "instances" or anything like that, you always just return the latest output that you want with the data/input you receive, as if you are rendering "from scratch" each time. Components don't really know whether they're "initializing" or "updating" or anything like that, they just know they're "rendering"; React takes care of reconciling that output with the actual DOM.<p>So, if that's not good enough for you, what would an even more faithful immediate mode API even look like? (And if your idea includes ditching the DOM as the render target, which is inherently "retained mode" and could never be otherwise due to performance and DOM state (like focus), I'm afraid it's a nonstarter.)</p>
]]></description><pubDate>Mon, 09 Feb 2026 19:11:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=46949516</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=46949516</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46949516</guid></item><item><title><![CDATA[New comment by exogen in "A Broken Heart"]]></title><description><![CDATA[
<p><a href="https://github.com/jquery/jquery/blob/df16f7360d4db41de64589c6f18140882684ab55/src/attributes/prop.js#L82-L85" rel="nofollow">https://github.com/jquery/jquery/blob/df16f7360d4db41de64589...</a></p>
]]></description><pubDate>Thu, 05 Feb 2026 20:41:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=46904951</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=46904951</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46904951</guid></item><item><title><![CDATA[New comment by exogen in "A Broken Heart"]]></title><description><![CDATA[
<p>> It is still a string, even if a template string or whatever it is called, no?<p>No.<p>> That still leaves the door open for XSS.<p>The door for that in React is called `dangerouslySetInnerHTML`, but it's extremely rarely used.<p>> jsx needs to rename HTML attributes, because of overlap with JS keywords like "class"<p>That's not really inherent to JSX, just React's use of it. SolidJS, for example, uses `class` instead. But in any case – JSX didn't make up those names. Those are the property names on JavaScript's DOM classes. The fact that there's confusion between "attributes" and "properties" is pretty baked-in to the Web platform, even causing confusion in standard Web Components. Every DOM library and framework (even jQuery) has needed to decide whether it's operating on properties or attributes.<p><pre><code>    const div = document.createElement('div');
    div.className = 'foo';
</code></pre>
> It also comes with hacks like "<>" or fragment.<p>The DOM has the same concept, DocumentFragment. How else would you represent e.g. "two sibling nodes with no parent node"?<p>> It lacks the awareness of context and therefore is not truly like HTML.<p>On the contrary, I'd argue it has way <i>more</i> context. It knows, and will warn you, if you try to do any DOM element nesting that the HTML spec forbids, for example.<p>> can be structurally pattern matched upon and iterated through, like a proper tree structure.<p>You are literally describing the output of JSX. Glad you like it ;)</p>
]]></description><pubDate>Thu, 05 Feb 2026 17:49:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=46902365</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=46902365</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46902365</guid></item><item><title><![CDATA[New comment by exogen in "A Broken Heart"]]></title><description><![CDATA[
<p>I'd give people the benefit of the doubt. Personally, having built UI with Win32, WinForms, VisualBasic, Cocoa/Interface Builder, Qt, Tcl/Tk, XSLT, vanilla HTML/JS, jQuery, Backbone, Ember, Knockout, Bootstrap, MooTools, YUI, ExtJS, Svelte, Web Components, and React (including Preact, SolidJS…)… I'll happily choose the React approach. The only other one I would even describe as "good" was Qt.<p>I also don't get why "XML-like syntax in the JS code" is even a point worth complaining about. If anything, we should be encouraging people to experiment with <i>more</i> DSLs for building UIs. Make your tools suit the task. Who the fuck cares, if it's clear and productive?</p>
]]></description><pubDate>Thu, 05 Feb 2026 15:12:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=46900509</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=46900509</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46900509</guid></item><item><title><![CDATA[New comment by exogen in "Resurrecting Crimsonland – Decompiling and preserving a cult 2003 classic game"]]></title><description><![CDATA[
<p>It would be possible to have it decode the .dts and .dif formats on demand - that was my original plan - just much less efficient for users, as the .glb files are about 1/5 of the file size on average. (I also assume glTF loading/rendering has had a lot more optimization work put into it than what I'd be able to accomplish.) For these reasons it seemed more productive to have it work on the Blender addons as a starting point rather than JavaScript/TypeScript parsers for the original formats. I still ship the original assets alongside the .glb files (meaning they have URLs just aren't loaded) in case I want to switch it someday.<p>Some of the custom features you may be referring to I implemented as custom properties in the glTF output - like surface flags. "Outside Visible" is one example, it's a flag baked into each .dif surface that determines whether rays can reach it from the outside, so the engine knows whether to apply the map's directional sunlight, or just ambient and light map lighting. So, even though it technically could try to render with modern PBR, dynamic lighting/shadows and all that, it instead renders as close to the original as possible using the same (or similar) techniques. Comparing screenshots with actual Tribes 2 renders is often indistinguishable unless you really know what to look for!</p>
]]></description><pubDate>Wed, 04 Feb 2026 13:45:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=46885730</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=46885730</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46885730</guid></item><item><title><![CDATA[New comment by exogen in "Resurrecting Crimsonland – Decompiling and preserving a cult 2003 classic game"]]></title><description><![CDATA[
<p>I've been thinking about this topic and am glad to see it come up: AI is going to be a huge boon for digital preservation & restoration projects like this. I realized this while building this project (a map explorer for Tribes 2): <a href="https://exogen.github.io/t2-mapper/" rel="nofollow">https://exogen.github.io/t2-mapper/</a><p>Old games like this have a small (and shrinking) audience of people who care about them. With Tribes 2, for example, there are only ~50 people who actively play on a regular basis. A subset of those people are programmers, and a subset of those have the time & energy to put into a project like t2-mapper, assuming they're even interested. I got a basic version working, but then Claude Code helped decode and convert obsolete Dynamix/Torque3D file formats (improving existing Blender addons that were incomplete), got TorqueScript running in the browser, wrote shaders, and generally helped figure out what the original C++ code was doing.<p>In the past, you'd need the stars to perfectly align for stuff like this to happen: a passionate super-fan with the time, resources, knowledge, and persistence to see it through. Now, you mostly just need the persistence (and maybe a couple hundred bucks for tokens). I foresee people with niche interests (but not necessarily a programmer's skillset) being able to extend the lifetime (and maybe audience) of their obscure or obsolete software.</p>
]]></description><pubDate>Wed, 04 Feb 2026 06:09:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=46882080</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=46882080</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46882080</guid></item><item><title><![CDATA[New comment by exogen in "Find 'Abbey Road when type 'Beatles abbey rd': Fuzzy/Semantic search in Postgres"]]></title><description><![CDATA[
<p>This could also be applied to record linkage. With search, there will usually be multiple results, and there's always a "top" match even if its confidence/score is quite low. In record linkage, at least if you're automating it, you need to minimize false positives and only automatically link records if confidence is super high that they're a match – and that doesn't just mean the top scoring match has high confidence, but that there's also no <i>2nd best match</i> with a good score. If that's not the case, leave the records for manual human review.<p>My experience here is also related to music. Here are some cases to think about:<p>What's the actual title of the song "Mambo #5" vs. how you might search for it or find it referenced in other records? Mambo #5? Mambo No. 5? Mambo No. Five? Mambo Number 5? Mambo Number Five? And that's not even getting to the fact that the actual title is actually longer, with a parenthetical. This is a case where bigrams, trigrams, or other string similarly metrics wouldn't perform very well. Same with the Beatles song, is it "Dr. Robert" or "Doctor Robert"? Most string similarly algorithms put "Dr" and "Doctor" pretty far apart, but with vectors they should be practically equivalent.<p>How about "You've Lost that Loving Feeling"? Aren't there some dropped Gs in those gerunds? Is it You've Lost That Lovin' Feeling? You've Lost That Lovin' Feelin'? You've Lost That Loving Feelin'? In this case, string similarity (including trigrams) perform very well.<p>How about songs with censored titles? Some records will certainly have profanity censored, but would it be like "F*ck", "F**k", "F@$k", or what? And is the censorship actually part of the canonical song title, or just some references to it?<p>In the "#5" and "Dr." cases, this could be solved pretty effectively by the normalization step described in the article (hardcoding what #, No., and Dr. expand to) – although even that can get pretty complicated: what do you do about numbers? Do you normalize every numerical reference, e.g. "10 Thousand", to digits, or words? What about rarely used abbreviations, or cases where an abbreviation is ambiguous and could mean different things in different contexts? If someone has a song called "PT Cruiser" are you gonna accidentally normalize that to "Part Cruiser"? For this reason, I like to see this not as a "normalization" step, where there's a single normalized form, but rather a "query expansion" step – generate all the possible permutations, and those are your actual comparison strings.<p>It seems like embeddings could do the job of automatically considering different spellings/abbreviations of words as equivalent. I'm just a casual observer here, but I'm sure this is also a well-explored topic in speech-to-text, since you have to convert someone's utterances to match actual entity names, like movie titles for example.</p>
]]></description><pubDate>Thu, 29 Jan 2026 15:45:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=46811697</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=46811697</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46811697</guid></item><item><title><![CDATA[New comment by exogen in "Mozilla appoints new CEO Anthony Enzor-Demeo"]]></title><description><![CDATA[
<p>I agree, in practice I see this occasionally on gigantic GitHub pull requests with 1000+ files, or very clunky Atlassian/Confluence pages. I'd say both sides need to work on their resource management!<p>(On that note, many complaints about Safari I hear from developers fall on my ears as "I don't care about web compatibility!" as it has never NOT been the case on the web that you need to care about feature support and resource management.)</p>
]]></description><pubDate>Tue, 16 Dec 2025 17:06:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=46291073</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=46291073</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46291073</guid></item><item><title><![CDATA[New comment by exogen in "Mozilla appoints new CEO Anthony Enzor-Demeo"]]></title><description><![CDATA[
<p>No doubt the browsers are constantly leapfrogging each other, so this isn't always the case. But, anecdotally: switching from Chrome to Safari actually felt like I got a new computer. The difference was that apparent.</p>
]]></description><pubDate>Tue, 16 Dec 2025 16:50:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=46290870</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=46290870</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46290870</guid></item><item><title><![CDATA[New comment by exogen in "Ask HN: What Are You Working On? (December 2025)"]]></title><description><![CDATA[
<p>A few years ago, I made a model skinner for Tribes 2, a ~25 year old game that still has a loyal following: <a href="https://exogen.github.io/t2-model-skinner/" rel="nofollow">https://exogen.github.io/t2-model-skinner/</a> (if you check out the Gallery link there, you'll notice this app resulted in a whole new wave of skins, and even a Halloween skin contest)<p>To satisfy the urge of doing something else ambitious in the browser, I'm now doing the same thing for Tribes 2 maps: trying to make a web-based map viewer and editor: <a href="https://exogen.github.io/t2-mapper/" rel="nofollow">https://exogen.github.io/t2-mapper/</a> (editing/creation part still in progress)<p>I got this working for most maps pretty quickly. It translates the mission object tree from the Torque .mis files into a Three.js scene graph. Eventually though, I noticed that some mission definitions were more dynamic – Torque .mis files are really just TorqueScript .cs files with a different extension and some pragma/magic comments. So, to actually handle every map would require not just a mission file parser, but a whole TorqueScript runtime. Implementing THAT part seemed really tedious and, frankly, uninteresting to me. So I had Claude Code get a whole TorqueScript transpiler and runtime working. Now, when you load a mission, it actually runs all the same scripts that Tribes 2 runs to load the mission, all the way from server.cs and its `CreateServer()` function.<p>Currently, I'm continuing to get its rendering matching Tribes 2 as closely as possible, and setting things up so that live editing of missions will work.<p>Source: <a href="https://github.com/exogen/t2-mapper" rel="nofollow">https://github.com/exogen/t2-mapper</a></p>
]]></description><pubDate>Sun, 14 Dec 2025 22:43:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=46267928</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=46267928</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46267928</guid></item><item><title><![CDATA[New comment by exogen in "Just use a button"]]></title><description><![CDATA[
<p>In today's world, yes. But as with a LOT of complaints about "web developers!!!!" the answer is usually "because of the way the web WAS."<p>Before IE became Edge (and maybe even in the earliest versions of Edge), there were certain styles and descendants that simply did not work on a <button> element, like Flexbox and Grid positioning. So, if your button had content like an icon, and you were trying to align it a certain way with the label, you simply couldn't use some features of CSS like you could with a <div>. It was a pain in the ass.<p>In the same vein, do you remember the period where some browsers wouldn't allow you to make a button look like a link using CSS, because they thought it might deceive people and thus be a security issue? I do.<p>And similarly when people complain about the complexities of webpack and bundlers in general, do you remember including the jQuery <script> tag on the page and then almost always needing to call `jQuery.noConflict()`? And how in those days, most people got even THAT wrong, because atomic <script async onload> behavior didn't work correctly in all browsers yet, so other code could actually run in between a <script> and its onload callback, meaning the jQuery.noConflict call was ineffective and something else could steal it? I remember. webpack fixed that by automatically scoping everything.<p>Nowadays, a lot of those workarounds are unnecessary (depends what browsers you're supporting). But it's not like there was never a reason for them.</p>
]]></description><pubDate>Fri, 31 Oct 2025 19:37:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=45775854</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=45775854</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45775854</guid></item><item><title><![CDATA[Show HN: Bringing back Snacklish (via a bunch of prior samples and iteration)]]></title><description><![CDATA[
<p>A stupid little project to pass the time between jobs.</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=44382000">https://news.ycombinator.com/item?id=44382000</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Wed, 25 Jun 2025 21:30:45 +0000</pubDate><link>https://github.com/exogen/snacklish</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=44382000</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44382000</guid></item><item><title><![CDATA[New comment by exogen in "Static as a Server"]]></title><description><![CDATA[
<p>This is also how I build most of my static sites, usually deployed to GitHub Pages. For example, here’s the demo page for a library I recently developed: <a href="https://exogen.github.io/turbo-colormap/" rel="nofollow">https://exogen.github.io/turbo-colormap/</a><p>Or a more complicated app: <a href="https://exogen.github.io/t2-model-skinner/" rel="nofollow">https://exogen.github.io/t2-model-skinner/</a><p>Are all of Next.js’ features overkill for such sites? Sure, but the convenience such frameworks provide is worth it. And the reason to prefer it over something like Vite is simply routing, which Vite doesn’t cover out of the box, so as soon as I want to add a second page, I now have another problem to solve.<p>Next.js’ best feature is simply that you’re up and running with `npm i react react-dom next` and step two is just writing the pages.</p>
]]></description><pubDate>Thu, 08 May 2025 22:13:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=43931907</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=43931907</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43931907</guid></item><item><title><![CDATA[New comment by exogen in "Ask HN: Who wants to be hired? (May 2025)"]]></title><description><![CDATA[
<p><p><pre><code>  Location: Seattle, WA
  Remote: preferred
  Willing to relocate: no
  Technologies: TypeScript, Python, React, Next.js, Django, Postgres
  Resume: upon request
  Email: exogen@gmail.com
</code></pre>
Your classic web and open source hacker with over 20 years of experience, most fluent in JS/TS and Python. I've tackled a wide variety of interesting problems and domains, e.g. graph isomorphism, query expansion, geocoding, dev tools, performance, data visualization, API design, server-side rendering, entity matching/record linkage, web scraping, games, reverse engineering binary formats, typography, codebase migrations, and more. Both startup and big-corp experience, but I prefer working with small teams.<p>Ask me about the time a stolen bike led to creating an arbitrary-precision math library and discovering a bug in Mathemetica...</p>
]]></description><pubDate>Fri, 02 May 2025 18:42:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=43873332</link><dc:creator>exogen</dc:creator><comments>https://news.ycombinator.com/item?id=43873332</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43873332</guid></item></channel></rss>