<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: thomasikzelf</title><link>https://news.ycombinator.com/user?id=thomasikzelf</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 13 Jun 2026 06:28:47 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=thomasikzelf" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by thomasikzelf in "CSS-Native Parallax Effect"]]></title><description><![CDATA[
<p>firefox android does not support CSS animation-timeline, and firefox desktop needs layout.css.scroll-driven-animations.enabled. This probably should not be used for any critical features.</p>
]]></description><pubDate>Tue, 02 Jun 2026 12:26:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=48369332</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=48369332</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48369332</guid></item><item><title><![CDATA[New comment by thomasikzelf in "CSS-Native Parallax Effect"]]></title><description><![CDATA[
<p>You can make some really cool stuff with css scroll animations. I used SVG paths with a scroll animated dash offset to draw an image while scrolling. Zero javascript, it feels so smooth. <a href="https://thomaswelter.nl" rel="nofollow">https://thomaswelter.nl</a> (the background)</p>
]]></description><pubDate>Tue, 02 Jun 2026 11:26:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=48368791</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=48368791</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48368791</guid></item><item><title><![CDATA[New comment by thomasikzelf in "The three pillars of JavaScript bloat"]]></title><description><![CDATA[
<p>The declarative vs imperative example is strange here. Why is the imperative example so convoluted? This is what one could write in js:<p><pre><code>  badge.textContent = count > 99? '99+' : count
  badge.classList.toggle('show', count > 0)
  paper.classList.toggle('show', count > 0)
  fire.classList.toggle('show', count > 99)
</code></pre>
The declarative example also misses the 99+ case. I don't think this example describes the difference between imperative and declarative well.</p>
]]></description><pubDate>Sun, 22 Mar 2026 09:49:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=47475907</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=47475907</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47475907</guid></item><item><title><![CDATA[New comment by thomasikzelf in "I was banned from Claude for scaffolding a Claude.md file?"]]></title><description><![CDATA[
<p>I was also banned from claude. I created an account and created a single prompt: "Hello, how are you?". After that I was banned. An automated system flagged me as doing something against the ToS.</p>
]]></description><pubDate>Thu, 22 Jan 2026 23:20:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=46726385</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=46726385</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46726385</guid></item><item><title><![CDATA[New comment by thomasikzelf in "The Easiest Way to Build a Type Checker"]]></title><description><![CDATA[
<p>I recently implemented a Hindley Milner type checker. The algorithm itself is not necessarily super difficult (once you get your head around it ofcourse) but the way it is explained is. It seems like HM is mostly explained by people with a mathematics background that already know the proper notation. I wonder how much overlap there is between people that know the notation and do not know how HM works, probably not much.<p>Anyway nice demo. Bi-directional is already quite powerful!</p>
]]></description><pubDate>Sun, 30 Nov 2025 17:51:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=46098796</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=46098796</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46098796</guid></item><item><title><![CDATA[New comment by thomasikzelf in "`satisfies` is my favorite TypeScript keyword (2024)"]]></title><description><![CDATA[
<p>Really, that is surprising to hear. There are a couple of differences but most of the syntax looks the same to me, what part do you find alien?<p>The reskill problem is of similiar difficulty with learning a new framework I think. Especially because the language is rather simple compared to typescript (which is also its strength).<p>I do understand it is an uphill battle. The whole nobody get's fired for choosing IBM thing. The language is still unproven in the general perception. I do think that when it comes to libraries and frameworks I see a lot of developers choose new unproven stuff, more then they do languages.</p>
]]></description><pubDate>Sun, 23 Nov 2025 15:24:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=46024239</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=46024239</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46024239</guid></item><item><title><![CDATA[New comment by thomasikzelf in "`satisfies` is my favorite TypeScript keyword (2024)"]]></title><description><![CDATA[
<p>Have you seen ReScript? Of course it is not as popular as typescript but it improves on all the bad parts of typescript. You'll get sound types with the pain points of javascript stripped out. Because it compiles to readable javascript you are still in the npm ecosystem.<p>You don't have to rewrite your whole codebase to start using it. It grows horizontally (you add typed files along the way) compared to typescript which grows vertically (you enable it with Any types).<p>The point is that we don't have to move back to plain js. We have learned a lot since typescript was created and I think the time has come to slowly move to a better language (and ReScript feels the most like Javascript in that regard).</p>
]]></description><pubDate>Sun, 23 Nov 2025 11:35:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=46022726</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=46022726</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46022726</guid></item><item><title><![CDATA[New comment by thomasikzelf in "`satisfies` is my favorite TypeScript keyword (2024)"]]></title><description><![CDATA[
<p>If Typescript is javascript with types bolted on, Rescript is javascript with types the way it should have been. Sound types with low complexity. <a href="https://rescript-lang.org/" rel="nofollow">https://rescript-lang.org/</a></p>
]]></description><pubDate>Sun, 23 Nov 2025 09:02:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=46021915</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=46021915</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46021915</guid></item><item><title><![CDATA[New comment by thomasikzelf in "Show HN: Browser-based interactive 3D Three-Body problem simulator"]]></title><description><![CDATA[
<p>You might be using the webgl lines (LINE_STRIP), those are always thin. The other way is to build a mesh that looks like a line (which Three.js also has functions for). select the line type here to see the difference: <a href="https://threejs.org/examples/?q=lines#webgl_lines_fat" rel="nofollow">https://threejs.org/examples/?q=lines#webgl_lines_fat</a></p>
]]></description><pubDate>Wed, 19 Nov 2025 17:28:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=45982227</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=45982227</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45982227</guid></item><item><title><![CDATA[New comment by thomasikzelf in "Ask HN: What Are You Working On? (Nov 2025)"]]></title><description><![CDATA[
<p>This looks good! It feels a little bit similiar to ReScript. I like the idea to have nodeMain, browserMain and buildMain. The Roc language had something similiar with platforms and I love that idea!<p>In general I prefer a better language over an involved javascript framework that does not look like js anymore.</p>
]]></description><pubDate>Mon, 10 Nov 2025 10:21:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=45874470</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=45874470</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45874470</guid></item><item><title><![CDATA[New comment by thomasikzelf in "Ask HN: How does one build large front end apps without a framework like React?"]]></title><description><![CDATA[
<p>I agree separating your UI into components is important. If React learned us one thing it is that keeping related stuff together is the way to go. Separating into components and keeping your functions as pure as possible gives you 95% of what makes React great! You can read my answer to @iliaznk on how I do this.<p>cleaning up listeners or cleaning up DOM nodes is rarely needed. Just remove the component element and the browser cleans up automatically.</p>
]]></description><pubDate>Fri, 17 Oct 2025 21:10:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=45622124</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=45622124</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45622124</guid></item><item><title><![CDATA[New comment by thomasikzelf in "Ask HN: How does one build large front end apps without a framework like React?"]]></title><description><![CDATA[
<p><p><pre><code>    <select id=dropdown>
        <option value=a>a</option>
        <option value=b>b</option>
    </select>
    <select id=a style="display: none">...</select>
    <select id=b style="display: none">...</select>
    <script>
        const $ = name => document.querySelector(name)
        $('#dropdown').addEventListener('change', ev => {
            $('#a').style.display = ev.target.value == "a"? "block" : "none"
            $('#b').style.display = ev.target.value == "b"? "block" : "none"
        }
    </script>
</code></pre>
vs<p><pre><code>    const [showing, setShowing] = useState(null)
    const handleChange = ev => setShowing(ev.target.value)
    let other
    if(showing == "a") other = <select>...</select>
    if(showing == "b") other = <select>...</select>
    return <>
        <select onChange={handleChange}>
            <option value=a>a</option>
            <option value=b>b</option>
        </select>
        {other}
    </>
</code></pre>
some notes:<p>- The complexities of both of these tiny pieces of code is similiar (I would say)<p>- React needs to load a big bundle<p>- React spits out a large stacktrace with react internals if something goes wrong<p>- React is slower<p>- React code cannot be easily stepped through with the debugger<p>- React needs a build step<p>- React performance is very unpredictable (this is more of a problem with many elements and dynamic code)<p>Your next question might be what you do once your form grows huge. See my other answer to @iliaznk how I handle that.</p>
]]></description><pubDate>Fri, 17 Oct 2025 19:34:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=45621043</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=45621043</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45621043</guid></item><item><title><![CDATA[New comment by thomasikzelf in "Ask HN: How does one build large front end apps without a framework like React?"]]></title><description><![CDATA[
<p>I do use abstractions to make my life easier. The main abstraction is a function called tag:<p><pre><code>    const tag = (tagName, props, ...children) => {
        const el = document.createElement(tagName)
        for(let k in props) el.setAttribute(k, props[k])
        for(let child of children)
            el.appendChild(typeof child == 'string'? document.createTextNode(child) : child)
        return el
    }
</code></pre>
This makes the construction of new elments a bit more concise. The rest is just functions, manually adding or removing classes and adding or removing nodes via the direct DOM API.<p>The main advantage I think React brought is breaking the concept of "separation of concerns" (keeping css, html and js in different files even when they change together). Keeping stuff that belongs together in the same file and mostly pure is what gives the most benefit. You don't need complicated frameworks for that.<p><pre><code>    const createSpecialButton = text => tag("button", {style: "background: purple"}, text)
</code></pre>
When something becomes a framework is a bit blurry. I consider this more of an utility function. It is only 7 lines long. You call it, it does not call you. It gives you back a concrete element, not some abstract intermediate value. It is completely optional. The amount of these utilities you need in a big project is still tiny.<p>I wrote a figma clone (see other comment) with couple of these utility functions. It looks a lot like a regular react project really. Mostly functions (which you might call a component if they return HTML), mostly pure or local state.</p>
]]></description><pubDate>Fri, 17 Oct 2025 19:22:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=45620900</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=45620900</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45620900</guid></item><item><title><![CDATA[New comment by thomasikzelf in "Ask HN: How does one build large front end apps without a framework like React?"]]></title><description><![CDATA[
<p>If you are writing the same DOM update code in each event handler you can abstract it into a function.</p>
]]></description><pubDate>Fri, 17 Oct 2025 13:27:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=45616544</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=45616544</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45616544</guid></item><item><title><![CDATA[New comment by thomasikzelf in "Ask HN: How does one build large front end apps without a framework like React?"]]></title><description><![CDATA[
<p>If you go to the React website you need to click "Learn React". A library often does not make you learn new concepts. It is just functions with input and output.<p>On the first page "Quickstart" all code blocks contain code that contain JSX and call you. They do not even show the part where you need to call render. Copying this code into your codebase will not do anything.<p>On that same page they also introduce state management with hooks.<p>On the installation page npm installing react is not mentioned. They suggest using create react app.<p>Sure you can theoratically use react as a library but I've never seen it and from the website it seems like usage as a library is not the inteded way to use react.<p>The first sentence "The library for web and native user interfaces" is the only thing pointing to react being able to be used as a library. The rest of it looks like a framework to me.</p>
]]></description><pubDate>Fri, 17 Oct 2025 13:16:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=45616424</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=45616424</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45616424</guid></item><item><title><![CDATA[New comment by thomasikzelf in "Ask HN: How does one build large front end apps without a framework like React?"]]></title><description><![CDATA[
<p>I don't think this has to be true. If you think of a framework as a piece of code that calls you where you sort of supply it with configuration you could do that when writing vanilla js but you don't have to.<p>When I write vanilla js I don't have a seperate file called framework.js. There is very little code needed to manage state. Almost all functions in my codebase are doing concrete things.</p>
]]></description><pubDate>Fri, 17 Oct 2025 12:58:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=45616240</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=45616240</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45616240</guid></item><item><title><![CDATA[New comment by thomasikzelf in "Ask HN: How does one build large front end apps without a framework like React?"]]></title><description><![CDATA[
<p>I build a figma clone for animation (<a href="https://moos.app" rel="nofollow">https://moos.app</a>). It is by no means a super large project (I think 40k loc) but is has reasonable frontend complexity. Most stuff is just composed of simple functions. For example routing is just an eventListener on hashchange. For state I am passing around an environment or firing events (the event system is 100 loc). For showing UI there is one convenience function to create HTML elements. Basically tag(tagName, props, ...children) (implementation also 100 loc). Each view is it's own file and manages itself. The object list can contain thousands of items so it uses a virtual list for performance (100 loc).<p>As you can see most functionality can be implemented in around 100 lines of code. The advantage is that you can build up functions just for your needs. These functions are super easy to understand because they don't have any dependencies and the whole implementation fits on one or two screens. There is very little indirection.<p>Another advantage is that most code is actually doing something concrete. With frameworks you often have a lot of code that is just pointing to other code, or is boiler plate code to set something up. Not having any boilerplate code also makes stepping through the debugger a lot easier.<p>The project has no build step in development which also makes debugging easier. It does have a build step in production.<p>Most people use frameworks to give the code structure. When writing vanillajs you need to bring the structure of the code yourself. This does take some getting used to but I think it is an essential skill for good programmers to have. On top of that many frameworks push you into structure that does not make much sense in my mind (for example seperating the view and the controller if those are always gonna change together).<p>So to conclude: My advice for building without frameworks is, just start building. Problems will come up and you can tackle those as you go. Do you think you need to use events in your application? A simple implementation is 10 lines of code and can be written in 10 minutes. If it takes me 1 hour to not use a library I will spend that 1 hour. Most frameworks will not bring that much value. Easy things become short and hard things will become impossible. I think most value is actually brought by the language and the basic api's (DOM, CSS, etc)</p>
]]></description><pubDate>Fri, 17 Oct 2025 12:31:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=45616000</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=45616000</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45616000</guid></item><item><title><![CDATA[New comment by thomasikzelf in "Top Programming Languages 2025"]]></title><description><![CDATA[
<p>You should try ReScript. The language has improved a lot recently. If Typescript is javascript with types bolted on then ReScript is javascript redesigned the proper way. The lsp is also surprisingly good. All that while still being in the node eco system.</p>
]]></description><pubDate>Wed, 24 Sep 2025 06:38:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=45357044</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=45357044</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45357044</guid></item><item><title><![CDATA[New comment by thomasikzelf in "Writing code is easy, reading it isn't"]]></title><description><![CDATA[
<p>Writing simple code is also much harder then writing complicated code. If you write some complicated code at the limit of your mental capabilities you can not debug it, but you might also not be smart enough to write the simple code.<p>I guess this means that one should solve the appropriate  problems for a given skill level</p>
]]></description><pubDate>Mon, 08 Sep 2025 21:05:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=45173983</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=45173983</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45173983</guid></item><item><title><![CDATA[New comment by thomasikzelf in "Left to Right Programming"]]></title><description><![CDATA[
<p>ReScript changed their api from data-last to data-first for this reason. Coupled with amazing type inference you will almost always receive correct autocompletions (that are type valid as well). It is a great experience.<p>It is sometimes still a problem when you define a function without reference to it (because the types are unnkown ofcourse). You will have to add types to it or call the function before implementing it.<p>There was also a great blogpost about it: <a href="https://www.javierchavarri.com/data-first-and-data-last-a-comparison/" rel="nofollow">https://www.javierchavarri.com/data-first-and-data-last-a-co...</a></p>
]]></description><pubDate>Tue, 19 Aug 2025 11:56:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=44950589</link><dc:creator>thomasikzelf</dc:creator><comments>https://news.ycombinator.com/item?id=44950589</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44950589</guid></item></channel></rss>