<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>notes by druchan — RSS Feed</title><link>https://notes.druchan.com/</link><description>notes by druchan</description>
    <lastBuildDate>Tue, 11 Aug 2026 12:00:00 +0000</lastBuildDate><atom:link href="https://notes.druchan.com/feed.xml" rel="self" type="application/rss+xml"/><item>
<title>Re:Paper 002 — Physics Needs Philosophy. Philosophy Needs Physics</title>
<link>https://notes.druchan.com/re-paper-002</link>
<guid>https://notes.druchan.com/re-paper-002</guid>
<description><![CDATA[<p><em>Re:Paper</em> is a pet project where I get to read interesting papers from the past and share my thoughts/impressions. It's not too dissimilar to book reviews, except for papers. Or paper-like things (a talk that gets published, an essay from an academic etc.)</p>
<p>For 002, we have <a href="https://en.wikipedia.org/wiki/Carlo_Rovelli">Carlo Ravolli's</a> <a href="https://arxiv.org/abs/1805.10602">Physics Needs Philosophy. Philosophy Needs Physics</a>.</p>
<div class="separator"></div>
<p>When the ancients on the Indian subcontinent asked and tried to answer, &quot;what is an atom?&quot; and &quot;what does it mean to be indivisible?&quot;, we filed them in the <a href="https://en.wikipedia.org/wiki/Vaisheshika"><em>Nyaaya-vaiseshika</em> system</a>, one of the six popular philosophical systems of ancient India, because these physical discourses were wrapped in a big dose of philosophy and eventually lead to things like metaphysics and, needless to say, &quot;What is God?&quot; (in a reductive way of speaking).</p>
<p>So it is somewhat crazy that physics and philosophy have drifted apart so much. But it's also quite natural, I think. One had to choose extremities of math and some logic, and the other chose extremities of logic and other means.</p>
<p>What Ravolli speaks of, however, is not the drift in content but in the syncretism that existed between the two. The generous give-and-take because a physicist, say Einstein, did not shy away from immersing in deep philosophy.</p>
<p>We go all the way back to Athenian times when Plato and Isocrates were at logger-heads about their methods of understanding the world at large.</p>
<blockquote>
<p>At the time, the golden youth of the city was educated in famous schools. Among these, two stood out: the school of Isocrates, and the <em>Academy</em>, founded by a certain Plato. The rivalry between the two was heated, like the rivalry between Oxford and Cambridge, but was not just about quality: the very approach to education was different in the two schools. Isocrates offered a high-level <em>practical</em> education, teaching the youth of Athens the kind of skills and knowledge required to become politicians, lawyers, judges, architects, and so on. The Academy on the other hand focused rather on discussing <em>general questions</em> about foundations. What is justice? ... What is beauty? What is matter made of? And Plato had invented a good name for this way of posing problems: 'philosophy'.</p>
</blockquote>
<p>And Isocrates said of this &quot;philosophy&quot;:</p>
<blockquote>
<p>Those who do philosophy, who determine the proofs and the arguments … and are accustomed to enquiring, but take part in none of their practical functions, … even if they happen to be capable of handling something, they automatically do it worse, whereas those who have no knowledge of the arguments [of philosophy], if they are trained [in concrete sciences] and have correct opinions, are altogether superior for all practical purposes. Hence for sciences, philosophy is entirely useless</p>
</blockquote>
<p>It took Aristotle, student of Plato, to formulate a response to that criticism. Much of that text is unavailable and only collated from other works that quote it.</p>
<p>From that, Ravolli picks three principles:</p>
<blockquote>
<ol>
<li>...general theory supports and happens to be useful for the development of practice.</li>
<li>Those who deny the utility of philosophy, are doing philosophy.</li>
<li>More in need of philosophy are the sciences &quot;where perplexities are greater&quot;.</li>
</ol>
</blockquote>
<p>The meaty part of his paper is spent expanding on the 2nd principle, dipping into Thomas Kuhn and Karl Popper's <em>philosophies</em> of science, scientific revolutions and the methodologies that should be employed by science. This is, in my opinion, the most interesting part of the paper.</p>
<div class="separator"></div>
<p>In the post-quantum world, there is far less attraction to philosophy and the philosophical toolkit than there was in Einstein's era and before. Ravolli quotes Weinstein and deGrasse Tyson as having much disdain for philosophy (in the context of how useful it is for physics). This is perhaps an echo of the <a href="https://en.wikipedia.org/wiki/Vienna_Circle">Vienna Circle</a> where logical positivism was born, beginning the removal of some (or all) aspects of philosophy from the act of doing hard science.</p>
<p>But we are to remember that the Heisenbergs and Einsteins of the world frequently credited philosophy for their inspiration:</p>
<blockquote>
<p>Both major advances made by twentieth century physics were strongly influenced by philosophy. They would have been inconceivable without the philosophy of the time.</p>
<p>Quantum mechanics springs from an intuition due to Heisenberg, grounded in the strongly positivist philosophical atmosphere in which he found himself: one gets knowledge by restricting oneself to what is observable. ...</p>
<p>... by restricting to what is observable, we recognise that the notion of simultaneity is misleading. Einstein explicitly recognised his debt to the philosophical writings of Mach and Poincaré.</p>
<p>...Once again, he [Einstein] was explicit in recognising his debt to philosophy, this time to the critical thinking of Leibniz, Berkeley, and Mach.</p>
</blockquote>
<p>And going back, Newtons and Galileos too. I particularly liked the notion that Galileo's findings came about from his &quot;almost fanatic Platonism&quot; of search for ideal mathematical order underlying observed phenomena.</p>
<blockquote>
<p>Ancient astronomy—that is, everything we know about the Earth being round, its size, the size of the moon and the sun… , is a direct descendent of philosophy.</p>
</blockquote>
<blockquote>
<p>Galileo's work would have been inconceivable without the ideology he derived from Plato, namely, to search for the ideal mathematical order underlying appearances. Galileo was guided by an almost fanatic Platonism. In his work, Newton was explicit about his debt to ancient philosophy, Democritus in particular, for ideas that arose originally from philosophical motivations, such as the notions of empty space, atomism, and natural rectilinear motion. Furthermore, his crucial discussion about the nature of space and time built upon his discussions with (and against) Descartes.</p>
</blockquote>
<p>If you think about it, in some sense, philosophical discourse about reductionism and an order of rules (laws or axioms) governing all phenomena is the spiritual thrust for a bunch of physics nirvanas being searched for earnestly, all the way from a unifying theory for quantum and gravity to supersymmetry and such. (Which, I understand, is also an argument that could go <em>against</em> being influenced by philosophy!)</p>
<p>The core idea that Ravolli is after is that physics (or science) can sometimes lack the tools at such advanced levels of functioning, at crossroads, and at times when a breakthrough is needed.</p>
<blockquote>
<p>philosophy can provide methods for producing new ideas, novel perspectives, and critical thinking. Philosophers have tools and skills that physics needs, but do not belong to the physicists training: conceptual analysis, attention to ambiguity, accuracy of expression, the ability to detect gaps in standard arguments, to devise radically new perspectives, to spot conceptual weak points, and to seek out alternative conceptual explanations.</p>
</blockquote>
<div class="separator"></div>
<p>Physics has engaged in/with philosophy at almost all times. Even when Weinberg or Hawking write dismissively about philosophy, Ravolli contends like Aristotle that they're doing philosophy.</p>
<blockquote>
<p>Good scientists <em>do</em> reflect on their own methodology...</p>
</blockquote>
<p>and when Kuhn or Popper talk about science and revolutions in it:</p>
<blockquote>
<p>They express a <em>certain</em> idea about the methodology of science. Is this the eternal truth about how science has always worked and should work? Is it the best understanding of science we have at present? It is neither. In fact, it is not difficult to trace the origins of this idea. It arises from the background of logical positivism, corrected by Popper and Kuhn. The current dominant methodological ideology in theoretical physics derives from their notions of <em>falsifiability</em> and <em>scientific revolution</em>, which are popular among theoretical physicists; they are often mentioned and are commonly used to orient research and evaluate scientific work.</p>
</blockquote>
<p>I liked this bit about how physics almost always has had an evolving soul of conceptual structures and reflectiveness. This is, in some sense, what philosophy is about.</p>
<blockquote>
<p>…conceptual structures evolve as well. Science is not simply an increasing body of empirical information we have about the world and a sequence of changing theories… evolution of our own conceptual structure… the modification of the conceptual structure needs to be achieved from within our own thinking…</p>
<p>…intertwining of learning and conceptual change, this flexibility, and this evolution of methodology and objectives, have developed historically in a constant dialogue between practical science and philosophical reflection…</p>
</blockquote>
<p>And back to the tools:</p>
<blockquote>
<p>(Quoting Aristotle) &quot;Philosophy provides guidance how research must be done.&quot;</p>
<p>... Not because philosophy can offer a final word about the right methodology of science (contrary to the <em>philosophical</em> stance of Weinberg and Hawking). But because philosophers have conceptual tools for addressing the issues raised by this continuous conceptual shift.</p>
</blockquote>
<div class="separator"></div>
<p>Before I write about the part where Ravolli dives deep into how we have misinterpreted (or rather, interpreted at face-value) Kuhn and Popper, let's revisit what these two folks had to say which has influenced generations since.</p>
<p>Please hold simultaneously the thought that this is a layman's reduction of complex ideas put forth by Kuhn and Popper.</p>
<p>On discontinuity: Kuhn effectively says that revolutionary ideas in science do not come from a continuous lineage of cumulative ideas and theories. There are discontinuities where paradigm shifts happen. Think Einstein's leap into general relativity from Laplace or Newtonian laws of motion.</p>
<p>On falsifiability: Popper turned the <a href="https://en.wikipedia.org/wiki/Logical_positivism">logical positivism</a> that stemmed from Vienna Circle and said, &quot;seeing only white swans does not prove there are no black swans.&quot; Theories can only be proved false, not true.</p>
<p>Ravolli on Kuhn and discontinuity:</p>
<blockquote>
<p>Kuhn's emphasis on discontinuity and incommensurability has misled many theoretical and experimental physicists into disvaluing the formidable <em>cumulative</em> aspects of scientific knowledge. Popper's emphasis on falsifiability, originally a demarcation criterion, has been flatly misinterpreted as an evaluation criterion. The combination of the two … has given rise to disastrous methodological confusion: the idea that past knowledge is irrelevant when searching for new theories, that all unproven ideas are equally interesting and all unmeasured effects are equally likely to occur, and that … the work of a theoretician consists in pulling arbitrary possibilities out of the blue and developing them, since anything that has not yet been falsified might in fact be right. … &quot;why not?&quot; ideology: any new idea deserves to be studied, just because it has not yet been falsified; any idea is equally probable, because a step further ahead on the knowledge trail there may be a Kuhnian discontinuity that was not predictable on the basis of past knowledge; any experiment is equally interesting, provided it tests something as yet untested. … think that this methodological philosophy has given rise to mountains of useless theoretical work in physics and many useless experimental investments.</p>
</blockquote>
<p>I love this bit on how some of the most radical shifts has come about from an overwhelming amount of data that questions the accumulated knowledge so far or pre-existing contradictions in prevalent theories of the day, thereby positing that stuff just doesn't jump, it in fact follows from existing work of the past:</p>
<blockquote>
<p>The most radical conceptual shifts and the most unconventional ideas that have actually worked have in fact always been strictly motivated, almost forced, either by the overwhelming weight of new data, or by a well-informed analysis of the internal contradictions within existing, successful theories. Science works through continuity, not discontinuity. … Kepler did not just &quot;come out with the idea&quot; of ellipses: nature had to splash ellipses on his face before he could see them. He was using ellipses as an approximation for the deferent-epicycle motion of Mars and was astonished to find that the approximation worked better than his model … atomic physicists of the early twentieth century struggled long and hard against the idea of discontinuities in the basic laws, doing everything they could to avoid accepting the clear message from spectroscopy, that is, that there was actually discontinuity in the very heart of mechanics. In both instances, the important new idea was forced by data.</p>
</blockquote>
<p>Overwhelming data and Kepler:</p>
<blockquote>
<p>Kepler did not just &quot;come out with the idea&quot; of ellipses: nature had to splash ellipses on his face before he could see them. He was using ellipses as an approximation for the deferent-epicycle motion of Mars and was astonished to find that the approximation worked better than his model … atomic physicists of the early twentieth century struggled long and hard against the idea of discontinuities in the basic laws, doing everything they could to avoid accepting the clear message from spectroscopy, that is, that there was actually discontinuity in the very heart of mechanics. In both instances, the important new idea was forced by data.</p>
</blockquote>
<p>Contradictions in existing theories and Copernicus and Einstein:</p>
<blockquote>
<p>… second case—radical novelty from old theories—are the heliocentric system and general relativity. Neither Copernicus nor Einstein relied significantly on new data. But neither did their ideas come out of the blue. They both started from an insightful analysis of successful well-established theories: Ptolemaic astronomy, Newtonian gravity, and special relativity. The contradictions and unexplained coincidences they found in these would open the way to a new conceptualisation.</p>
</blockquote>
<p>On Popper's falsifiability, Ravolli tries something that I found quirky. He tries to kick the puck back into the realm of logical positivism (although, not exactly, and it's nuanced) even though that's the circle that rejected philosophy.</p>
<blockquote>
<p>… emphasis on falsifiability has made physicists blind to a fundamental aspect of scientific knowledge: the fact that credibility <em>has degrees</em> and that reliability can be extremely high, even when it is not absolute certainty. … failing to see that a given investigation may have little plausibility even if it has not yet been falsified.</p>
</blockquote>
<div class="separator"></div>
<p>Remember Aristotle and his &quot;More in need of philosophy are the sciences 'where perplexities are greater'&quot;?</p>
<blockquote>
<p>Here is a list of topics currently discussed in theoretical physics: What is space? What is time? What is the &quot;present&quot;? Is the world deterministic? Do we need to take the observer into account to describe nature? Is physics better formulated in terms of a &quot;reality&quot; or in terms of &quot;what we observe&quot;, or is there a third option? What is the quantum wave function? What exactly does &quot;emergence&quot; mean? Does a theory of the totality of the universe make sense? Does it make sense to think that physical laws themselves might evolve? It is clear to me that input from past and current philosophical thinking cannot be disregarded in addressing these topics.</p>
<p>In loop quantum gravity, my own technical area, Newtonian space and time are reinterpreted as a manifestation of something which is granular, probabilistic, and fluctuating in a quantum sense. Space, time, particles, and fields get fused into a single entity: a quantum field that does not live in space or time. The variables of this field acquire definiteness only in interactions between subsystems. The fundamental equations of the theory have no explicit space or time variables. Geometry appears only in approximations. Objects exist within approximations. Realism is tempered by a strong dose of relationalism. I think we physicists need to discuss with philosophers, because I think we need help in making sense of all this.</p>
</blockquote>
<p>Ravolli spends the last couple of paragraphs trying to connect the other way round - philosophy needs physics too - but it's as if Ravolli thinks that self-evident and needs not much of a convincing:</p>
<blockquote>
<p>No great philosopher of the past would ever have thought for a moment of not taking seriously the knowledge of the world offered by the science of their times. …</p>
<p>Our general knowledge is the result of the contributions from vastly different domains, from science to philosophy, all the way to literature and the arts, and our capacity to integrate them.</p>
</blockquote>
]]></description>
<pubDate>Tue, 11 Aug 2026 12:00:00 +0000</pubDate>
</item><item>
<title>Re:Paper 001 — Can Programming Be Liberated From von Neumann Style?</title>
<link>https://notes.druchan.com/re-paper-001</link>
<guid>https://notes.druchan.com/re-paper-001</guid>
<description><![CDATA[<p><em>Re:Paper</em> is a pet project where I get to read interesting papers from the past and share my thoughts/impressions. It's not too dissimilar to book reviews, except for papers or talks that get published as papers.</p>
<p>For 001, we have <a href="https://dl.acm.org/doi/10.1145/359576.359579"><em>Can Programming be Liberated from von Neumann Style</em></a> by <a href="https://en.wikipedia.org/wiki/John_Backus">John Backus</a>.</p>
<p>I have no idea how I landed on this paper or from where. But I'm certain that it must've come about from my daily meanderings in the functional-programming world (subreddits, discourse, some random FP slack channel etc.).</p>
<p>I think it was good that by the time I discovered this paper (which is a written-up version of a talk at the ACM), I had dabbled in functional programming, written a few programs, and gotten completely smitten by this paradigm. That definitely helped in appreciating (and to a reasonable degree, understanding) what Backus was talking about.</p>
<div class="separator"></div>
<p>It feels both pertinent and absolutely useless to be talking about the structure of programming languages when AI/LLMs are hard at work trying to invalidate most of these things by making production of code and code artefacts cheap (in terms of effort involved, not the actual money spent on tokens).</p>
<p>But what I like about this paper/talk is a couple of levels more fundamental (and universal) than functional programming vs conventional programming. It's Backus's inherent thrust towards reduction, towards simplification and towards arriving at programming structures that are simple (in the <a href="https://www.infoq.com/presentations/Simple-Made-Easy/"><em>Rich Hickey</em> way</a>).</p>
<p>If I were to reduce the paper/talk, it's this:</p>
<ul>
<li>conventional programming languages are complex and not very flexible.</li>
<li>even newer languages of his time follow the same philosophy of other conventional languages because they all spring from a near-universal architecture of computers themselves: the von Neumann architecture.</li>
<li>in the conventional world, programs are a chaos of expressions and statements (Backus clearly prefers the former) and statements are inherently disorderly and unwieldy.</li>
<li>a lot of the language is about storing, naming, retrieving data instead of being about the core logic of the computation itself.</li>
<li>and the languages have very limited, frozen expressive power: the constructs are already built-in, and extensibility is almost non-existent.</li>
<li>the paradigm he puts forth is &quot;functional-style&quot; where one combines forms (ie composition of functions) so more complex programs can be built from simpler programs (big on extensibility), don't have to name their arguments (point-free), and has a familiar algebra-esque appearance so there is not much of a distinction between the syntax and the logical expression. They're almost the same. Less cognitive load.</li>
</ul>
<div class="separator"></div>
<p>The first thing to know is that these incensed debates on programming languages is not of a recent making. Python vs Javascript and Rust vs Zig are just continuing a tradition that Backus equates to medieval debates:</p>
<blockquote>
<p>Discussions about programming languages often resemble medieval debates about the number of angels that can dance on the head of a pin instead of exciting contests between fundamentally differing concepts.</p>
</blockquote>
<p>Backus's primary dig is at what he terms as the &quot;von Neumann-style&quot; of programming that has its intellectual genesis in the <em>von Neumann architecture</em><sup>1</sup>.</p>
<p>All the way from Assembly to Fortran (which Backus created/spearheaded), this architecture has influenced how we think about programming and how people think about the syntax and structures of a programming language.</p>
<blockquote>
<p><a href="https://en.wikipedia.org/wiki/Von_Neumann_architecture">the von Neumann architecture consists of</a> three parts: a central processing unit (or CPU), a store, and a connecting tube that can transmit a single word between the CPU and the store (and send an address to the store). I propose to call this tube the <em>von Neumann bottleneck</em>. The task of a program is to change the contents of the store in some major way; when one considers that this task must be accomplished entirely by pumping single words back and forth through the von Neumann bottleneck, the reason for its name becomes clear.</p>
<p>Ironically, a large part of the traffic in the bottleneck is not useful data but merely names of data, as well as operations and data used only to compute such names.</p>
</blockquote>
<p>That is, a lot of the code and syntax is about the assignments, the loops, the busywork of storing and retrieving data instead of the core logic of the program itself:</p>
<blockquote>
<p>Thus programming is basically planning and detailing the enormous traffic of words through the von Neumann bottleneck, and much of that traffic concerns not significant data itself but where to find it.</p>
</blockquote>
<p>This &quot;traffic&quot; gets expressed as assignment statements which splits the world into two: statements and expressions:</p>
<blockquote>
<p>von Neumann languages also split programming into a world of expressions and a world of statements; the first of these is an orderly world, the second is a disorderly one, a world that structured programming has simplified somewhat, but without attacking the basic problems of the split itself and of the word-at-a-time style of conventional languages.</p>
</blockquote>
<p>The most common &quot;statement&quot; is the assignment statement which itself is a combination of a statement and an expression.</p>
<pre><code>c := c + a[i] * b[i]
</code></pre>
<blockquote>
<p>Moreover, the assignment statement splits programming into two worlds. The first world comprises the right sides of assignment statements. This is an orderly world of expressions, a world that has useful algebraic properties (except that those properties are often destroyed by side effects). It is the world in which most useful computation takes place.</p>
<p>The second world of conventional programming languages is the world of statements. The primary statement in that world is the assignment statement itself. All the other statements of the language exist in order to make it possible to perform a computation that must be based on this primitive construct: the assignment statement.</p>
</blockquote>
<p>To Backus, the world of statements is unwieldy, does not lend itself to mathematical or logical scrutiny.</p>
<blockquote>
<p>This world of statements is a disorderly one, with few useful mathematical properties. Structured programming can be seen as a modest effort to introduce some order into this chaotic world, but it accomplishes little in attacking the fundamental problems created by the word-at-a-time von Neumann style of programming, with its primitive use of loops, subscripts, and branching flow of control.</p>
</blockquote>
<p>Backus also focuses his criticism on the idea that conventional languages are rigid structures and offer very limited changeable parts. There's no scope for composition (<em>combining forms</em>), and the state transition rules are all built into the framework itself so the user has to just play by the rules and cannot invent new forms.</p>
<blockquote>
<p>A programming language comprises a framework plus some changeable parts. The framework of a von Neumann language requires that most features must be built into it; it can accommodate only limited changeable parts (e.g., user-defined procedures) because there must be detailed provisions in the &quot;state&quot; and its transition rules for all the needs of the changeable parts, as well as for all the features built into the framework. The reason the von Neumann framework is so inflexible is that its semantics is too closely coupled to the state: every detail of a computation changes the state.</p>
</blockquote>
<p>Backus takes the case of the &quot;inner-product&quot;. Here's the conventional program and Backus's criticism of it:</p>
<pre><code>c := 0
for i := 1 step 1 until n do
   c := c + a[i]×b[i]
</code></pre>
<blockquote>
<p>Several properties of this program are worth noting:</p>
<p>a) Its statements operate on an invisible &quot;state&quot; according to complex rules.</p>
<p>b) It is not hierarchical. Except for the right side of the assignment statement, it does not construct complex entities from simpler ones. (Larger programs, however, often do.)</p>
<p>c) It is dynamic and repetitive. One must mentally execute it to understand it.</p>
<p>d) It computes word-at-a-time by repetition (of the assignment) and by modification (of variable i).</p>
<p>e) Part of the data, n, is in the program; thus it lacks generality and works only for vectors of length n.</p>
<p>f) It names its arguments; it can only be used for vectors a and b. To become general, it requires a procedure declaration. These involve complex issues (e.g., call-by-name versus call-by-value).</p>
<p>g) Its &quot;housekeeping&quot; operations are represented by symbols in scattered places (in the <strong>for</strong> statement and the subscripts in the assignment). This makes it impossible to consolidate housekeeping operations, the most common of all, into single, powerful, widely useful operators. Thus in programming those operations one must always start again at square one, writing &quot;<strong>for</strong> i := ...&quot; and &quot;<strong>for</strong> j := ...&quot; followed by assignment statements sprinkled with i's and j's.</p>
</blockquote>
<p>So what's Backus's solution?</p>
<p>By this time (1978), computing has seen two or more new ideas come into the academic mainstream. Church's Lambda calculus and APL were influential in Backus's proposal.</p>
<blockquote>
<p>An alternative functional style of programming is founded on the use of combining forms for creating programs. Functional programs deal with structured data, are often nonrepetitive and nonrecursive, are hierarchically constructed, do not name their arguments, and do not require the complex machinery of procedure declarations to become generally applicable. Combining forms can use high level programs to build still higher level ones in a style not possible in conventional languages.</p>
</blockquote>
<p>In Backus's FP, the inner product is this:</p>
<pre><code>Def Innerproduct
    ≡ (Insert +)∘(ApplyToAll ×)∘Transpose
</code></pre>
<blockquote>
<p>Or, in abbreviated form:</p>
</blockquote>
<pre><code>Def IP ≡ (/+)∘(α×)∘Trans.
</code></pre>
<blockquote>
<p>Composition (∘), Insert (/), and ApplyToAll (α) are <em>functional forms</em> that combine existing functions to form new ones.</p>
</blockquote>
<p>ApplyToAll is essentially <code>map</code>. Insert is <code>reduce</code> (although, more technically, it's <code>reduceRight</code>). Composition has no JS equivalent but it's fundamentally the <code>compose</code> function from <a href="https://ramdajs.com/docs/#compose">Ramda</a>/<a href="https://sanctuary.js.org/#compose">Sanctuary</a>.</p>
<p>How does this definition work?</p>
<p>Transpose takes two vectors of arbitrary length and &quot;transposes&quot; them:</p>
<pre><code>Transpose:&lt;1,2,3&gt; &lt;4,5,6&gt; = &lt;&lt;1,4&gt;,&lt;2,5&gt;,&lt;3,6&gt;&gt;
</code></pre>
<p>ApplyToAll applies the binary <code>×</code> to each vector:</p>
<pre><code>ApplyToAll ×: &lt;&lt;1,4&gt;,&lt;2,5&gt;,&lt;3,6&gt;&gt; = &lt;&lt;1×4&gt;,&lt;2×5&gt;,&lt;3×6&gt;&gt; = &lt;&lt;4&gt;,&lt;10&gt;,&lt;18&gt;&gt; = &lt;4,10,18&gt;
</code></pre>
<p>And finally the Insert:</p>
<pre><code>Insert +: &lt;4,10,18&gt; = 4 + 10 + 18 = 32.
</code></pre>
<p>Right away, we can notice a few things about this program:</p>
<ul>
<li>no arguments specified. <a href="https://en.wikipedia.org/wiki/Tacit_programming">Point-free</a>. The functions work on vectors of arbitrary length. Eliminates that <code>n</code> from the conventional program,</li>
<li>The whole logic is built from smaller functions by way of composition. That's what Backus calls <em>combining forms</em>;</li>
<li>no hidden states (<code>n</code>, <code>i</code>, accumulating <code>c</code>).</li>
</ul>
<p>In the paper, he explains the benefits:</p>
<blockquote>
<p>a) It operates only on its arguments. There are no hidden states or complex transition rules. There are only two kinds of rules, one for applying a function to its argument, the other for obtaining the function denoted by a functional form such as composition, <em>f</em>∘<em>g</em>, or ApplyToAll, αf, when one knows the functions <em>f</em> and <em>g</em>, the <em>parameters</em> of the forms.</p>
<p>b) It is hierarchical, being built from three simpler functions (+, ×, Trans) and three functional forms <em>f</em>∘<em>g</em>, α<em>f</em>, and /<em>f</em>.</p>
<p>c) It is static and nonrepetitive, in the sense that its structure is helpful in understanding it without mentally executing it. For example, if one understands the action of the forms <em>f</em>∘<em>g</em> and α<em>f</em>, and of the functions × and Trans, then one understands the action of α× and of (α×)∘Trans, and so on.</p>
<p>d) It operates on whole conceptual units, not words; it has three steps; no step is repeated.</p>
<p>e) It incorporates no data; it is completely general; it works for any pair of conformable vectors.</p>
<p>f) It does not name its arguments; it can be applied to any pair of vectors without any procedure declaration or complex substitution rules.</p>
<p>g) It employs housekeeping forms and functions that are generally useful in many other programs; in fact, only + and × are not concerned with housekeeping. These forms and functions can combine with others to create higher level housekeeping operators.</p>
</blockquote>
<p>The fundamental idea that Backus keeps coming back to, with his push for functional programming, is this:</p>
<blockquote>
<p>... programs can be expressed in a language that has an associated algebra. This algebra can be used to transform programs and to solve some equations whose &quot;unknowns&quot; are programs, in much the same way one solves equations in high school algebra.</p>
</blockquote>
<p>Interesting note: recursion is already baked into the definition of the formal representation of a functional program expression:</p>
<pre><code>Def l ≡ r
</code></pre>
<blockquote>
<p>where the left side <em>l</em> is an unused function symbol and the right side <em>r</em> is a functional form (which may depend on <em>l</em>).</p>
</blockquote>
<p>What about &quot;state&quot; that Backus said conventional programs make complex?</p>
<p>Pure expressions are generally not useful by way of programs. A program has to do something (think, side-effects like writing to the disk, thereby changing some form of a global state of the system).</p>
<p>If you're familiar with ideas of <a href="https://redux.js.org/">Redux</a> (which has its ideological roots in Elm's <a href="https://guide.elm-lang.org/architecture/">TEA</a>), Backus's words might ring familiar:</p>
<blockquote>
<p>Unlike von Neumann languages, these systems have semantics loosely coupled to states-only one state transition occurs per major computation.</p>
</blockquote>
<blockquote>
<p>The applicative subsystem cannot change the state D and it does not change during the evaluation of an expression. A new state is computed along with output and replaces the old state when output is issued.</p>
</blockquote>
<p>Here, Backus is proposing something of the form:</p>
<pre><code>State -&gt; (Value, State)
</code></pre>
<p>That is, there's a global state. The functional program does nothing to it. It <em>uses</em> the global state, to compute a new one, along with an output. When the computation is done, it replaces the old state with the new one. So that's, approximately in 1978, when the ideological seed for the <a href="https://wiki.haskell.org/index.php?title=State_Monad">State Monad</a>, <a href="https://guide.elm-lang.org/architecture/">TEA</a> etc are sown.</p>
<p>Backus does this because this form, or this idea, lends itself better to algebraic scrutiny, formalization and even composition.</p>
<div class="separator"></div>
<p>All said and done, the von Neumann architecture is still kind of the bedrock of our computers. And that paradigm continues to have its influence across languages.</p>
<p>But somewhere, a consortium of ideas like applicative-style, strong structural types, algebraic systems of expressions etc. have seeped enough to influence a new crop of programming languages in recent times.</p>
<p>Credit for some parts of that certainly goes to John Backus.</p>
]]></description>
<pubDate>Fri, 07 Aug 2026 12:00:00 +0000</pubDate>
</item><item>
<title>Reacting to React's use()</title>
<link>https://notes.druchan.com/reacting-to-use</link>
<guid>https://notes.druchan.com/reacting-to-use</guid>
<description><![CDATA[<p>Years ago, I used to work as a tech blogger covering iOS how-tos for the iPhone 4 series. Apple iOS was a very restrictive system unlike Android, and the only way you could customize your iPhone beyond the limited native options was to &quot;jailbreak&quot; the phone, install something like <a href="https://www.cydiafree.com/">Cydia</a> (a marketplace for apps that can only be installed on a jailbroken iPhone), and download the apps that made it possible to customize the phone.</p>
<p>You couldn't even customize the notification sheet, or the status bar on a normal iPhone. But once jailbroken, almost everything was possible.</p>
<p>The most weird bit was this: many of the customizations that jailbreaking offered would eventually be supported natively by Apple. It wasn't just the Android folks that would make fun of Apple because it was so late to the party and yet making it sound like it was so innovative. The jailbreaking community too made fun of Apple for the very same reason.</p>
<p>That is precisely how I feel about <code>use()</code>.</p>
<p>The idea goes by many names in other ecosystems (and frameworks within the JS ecosystem). You can call it an AsyncWrapper, or a DataWrapper, or LCE (Load/Content/Error), or QueryWrapper or whatever. The basic concept is simple:</p>
<p>A wrapper takes an async function call that could return some data or an error, and then it will show you one of three things:</p>
<ul>
<li>A loading state when the async function is being called and awaited</li>
<li>An error state if the result is an error/exception</li>
<li>A content state if the result is content</li>
</ul>
<p>Almost a decade ago, we used to write simple wrapping components that could be used like these:</p>
<pre><code class="language-jsx">&lt;DataWrapper
    query={asyncFunction}
    loader={&lt;LoadingComponent /&gt;}
    error={(e) =&gt; &lt;ErrorComponent err={e} /&gt;}
&gt;
{(content) =&gt; &lt;Render data={content} /&gt;}
&lt;/Data&gt;
</code></pre>
<p>Literally. A decade ago. We figured out the syntax of the abstraction a decade ago. The abstraction itself predates most of us.</p>
<p>And now you're telling me this is better?</p>
<pre><code class="language-jsx">const UserPage = () =&gt; {
    const userPromise = fetch(...);
    return (
        &lt;ErrorBoundary fallback={&lt;ErrorMsg /&gt;}&gt;
            &lt;Suspense fallback={&lt;LoadingComponent /&gt;}&gt;
                &lt;UserProfile userPromise={userPromise} /&gt;
            &lt;/Suspense&gt;
        &lt;/ErrorBoundary&gt;
    )
}

const UserProfile = ({ userPromise }) =&gt; {
    const data = use(userPromise);
    return &lt;UserCard data={data} /&gt;
}
</code></pre>
<p>How is it better?</p>
<ul>
<li>I have to ensure and repeat the Suspense and ErrorBoundary components are present, otherwise the app will crash</li>
<li>I have to create a &quot;called&quot; promise function (it's not even a thunk) and then pass <em>that</em> to the child. I've heard of passing data and then I've heard of passing functions. What nonsense is this passing of a called promise?</li>
<li>There are restrictions anyway on <code>use</code> where it can't be called inside a function that's not a component or a hook — and not in <code>try / catch</code> blocks either</li>
<li>Error-boundaries in React are weirdly shaped and you'd better rely on another package for easy error boundaries (which still has its own complications).</li>
</ul>
<p>Am I getting older or are React folks really complicating things? The <code>use</code> is a good example of, &quot;look, we know our earlier hooks had various conditions, so here's a new one that removes those conditions but brings a new set of its own.&quot;</p>
<p>React has made building web apps insanely simple with a lot of bells and whistles for sure, but just like the parent (Facebook) where it was incubated, <em>at what cost</em>?</p>
]]></description>
<pubDate>Sun, 31 May 2026 12:00:00 +0000</pubDate>
</item><item>
<title>Court Chronicles</title>
<link>https://notes.druchan.com/court-visit-chronicles</link>
<guid>https://notes.druchan.com/court-visit-chronicles</guid>
<description><![CDATA[<p>My colleague and I were to meet at the court complex for my initiation into how courtrooms work. As a joke-quip, I said to my colleague, &quot;See you in court!&quot;</p>
<p>And so, for the next handful of hours, for every query of mine regarding a legal process, her example would begin: &quot;So let's say you and I are involved in a dispute.&quot; For the entire day spent there, we were constantly up against each other in some exemplified dispute or the other.</p>
<div class="separator"></div>
<p>The fact that anyone could enter the court complex, walk into a courtroom, and detonate a few kilos of C4 or hurl country-bombs is unsettling. I was expecting a moderately-serious, Namma Bengaluru Metro-level security checks at the entrance. Zilch. So the first thought as I stepped into the court complex building hurling my backpack (which, by the way, had a combustible material -- Macbook Pro) was this macabre what-if. What if I was a low-esteem terrorist trying to blow a junior judge's courtroom to make a mediocre point?</p>
<div class="separator"></div>
<p>You're in a conversation with someone in a room abuzz with chitter-chatter of so many other voices it's impossible to distinguish the words of any one conversation. And yet, your ears perk up and your head turns when you hear your name.</p>
<p>I think for lawyers it's their case numbers being called out by the clerk. In every courtroom that had some senior (read, very old) lawyers sitting in the bay, right under the nose of the presiding judge, one or more was dozing off. It was either pre-lunch fatigue or post-lunch food-coma. There was nary an attempt to be subtle either. It was full-on. Chin-touching-your-bands-level head-drooping. I was partly hoping to be in a courtroom that one of these sleeping lawyers let out a loud snore in the middle of a judge's dictation.</p>
<div class="separator"></div>
<p>Have you seen the defense attorney give up and conduct a pointless chitchat with a random lawyer seated next to him while his client was being grilled by the opposite's lawyer and the judge and the client makes statement upon statement weakening his position? I can now say I have.</p>
<div class="separator"></div>
<p>My colleague's enthusiasm to help me understand legal processes is palpable. Just that occasionally I feel the eyes of a stern judge on us as my colleague animatedly explains something to me amidst the proceedings. School-day traumas of being caught by the teacher for chitchat and a summary dress-down or banishment from the class came crashing.</p>
<p>But I also wanted to tell my colleague, &quot;should we bet on if we'll get caught talking by this judge in their courtroom?&quot;</p>
]]></description>
<pubDate>Mon, 04 May 2026 12:00:00 +0000</pubDate>
</item><item>
<title>How many layers to track an objective?</title>
<link>https://notes.druchan.com/how-many-layers-to-an-objective</link>
<guid>https://notes.druchan.com/how-many-layers-to-an-objective</guid>
<description><![CDATA[<p>Linear has this hierarchy of layers to track, say, a feature. Not too dissimilar from all this &quot;epic, story, task, sub-task&quot; kind of nonsense that goes around. Linear calls it &quot;project -&gt; issue -&gt; sub-issue&quot; etc.</p>
<p>I am going through a project I am working on and someone has set up projects for each feature, and each project has similar-looking issues: <code>&lt;feature&gt; frontend implementation</code>, <code>&lt;feature&gt; backend implementation</code>, <code>&lt;feature&gt; research</code>, <code>&lt;feature&gt; acceptance test</code> and so on. Our backlog is dozens of these tickets.</p>
<p>Alright. Let me take a look at the status of a feature. That means I go to the &quot;projects&quot; page. That page lists the issues each of which is <code>&lt;feature&gt; ____</code> and if I want to look at what's the status on, say, the frontend of it, I have to go into the issue named <code>&lt;feature&gt; frontend implementation</code>. (The overall status is visible for each issue without going into it, yes, but by <em>status</em> I mean what's actually happening in this issue? Are there comments left by someone? Are there commits pushed towards this issue?)</p>
<p>You'd think this is OK. No. It sucks.</p>
<p>Each stage is a layer. Each layer is a different page. Each layer has its own set of metadata and concepts to grok. Each layer comes with a change in context that's so subtle yet throws you off-kilter if you aren't razor focused about what it is that you're looking for every step of the way. And boy have reels done their number on our focus.</p>
<p>Linear has one of the simplest, cleanest interfaces I've ever used. Despite that, all the different layers, the hierarchies, and the metadata and their visual representations felt jarring. Too much <em>effort</em> to get to the info I need.</p>
<p>--</p>
<p>When I began working on a feature — which was a &quot;project&quot; with 4 different issues on Linear — I closed all tickets and created just one ticket for the feature. All action-items / sub-tasks of that ticket were just markdown checklists:</p>
<pre><code class="language-text">Feature Abcd

- [ ] Implement frontend
- [ ] Implement backend
...
</code></pre>
<p>Updates on the feature became comments under the ticket. Extra info relevant to the implementations became part of the description:</p>
<pre><code class="language-text">Feature Abcd

- [ ] Implement frontend
- [ ] Implement backend
...

--

We'll use [this open-source project](link) for the server implementation.

-- and other info goes here...
</code></pre>
<p>The simplification helped. I didn't have to drag myself through layers of UI to get or set information on some task. One ticket was all it needed.</p>
<p>--</p>
<p>I can hear the argument. &quot;This won't work for teams working on multiple parts of the same feature!&quot; &quot;This won't work for epics that are inherently complex and involve lots of different threads!&quot;</p>
<p>Sure. Maybe.</p>
<p>The thing is, Linear is a means to an end. The end is shipping the feature to users. There are two core reasons for Linear (and the likes):</p>
<ul>
<li>Capture what needs to be worked on (features, bugs, optimizations, explorations etc.)</li>
<li>Have a communication layer that is much more refined than a PM pinging everyone and asking verbose questions and reading verbose answers.</li>
</ul>
<p>What I mean is, &quot;OK, what's the status of the UI for feature XYZ?&quot; can be answered with a checkbox and some comments under a ticket. Or by going to the project/epic, finding the correct story/issue and clicking it, then finding the right task/sub-issue and clicking it, only to find that <em>that</em> particular item hasn't been updated since inception because the developer couldn't be bothered to update an item so far down the layer-hole.</p>
<p>Oh, also, multiple people working on the same feature can update the same ticket.</p>
<p>--</p>
<p>Yeah, yeah, this is about to turn into the same-old complaint of &quot;project-management-as-a-job&quot; ruining the pleasures of just working on stuff.</p>
<p>Linear, which started out as this really simple antidote to Jira and the likes, is now probably getting there itself. I am sure user feedback is what drives these decisions: users want layers, users want hierarchies etc. So it feels totally justified in introducing these &quot;carefully-designed&quot; complexities into the product.</p>
<p>The gripe is that the feedback comes from folks who see project management as an end and not a means?</p>
<p>Also, it's not just about the app. How do we end up using something? The app provides the &quot;flexibility&quot;, but that doesn't mean we add 5 layers of information to track a simple objective.</p>
<p>--</p>
<p>Organizational management is a deeply and richly studied thing. No doubt about it. The stupidity is that we imported the complex layers of NASA's and military organizations' management styles, pretending to be building things just as humongous or of similar sophistication when all we're building, Andy, is a web app.</p>
]]></description>
<pubDate>Sun, 22 Mar 2026 12:00:00 +0000</pubDate>
</item><item>
<title>Power studies journal #1</title>
<link>https://notes.druchan.com/power-studies-journal-1</link>
<guid>https://notes.druchan.com/power-studies-journal-1</guid>
<description><![CDATA[<p>This is hopefully the first of a regular frequency of journal entries / updates during the course of studies in power.</p>
<p>Power cuts across multiple dimensions and levels. There's a lot of power dynamics in nature, within species, across species. In humans (sociologically), there's individual power, there's collective power, there's power of nations -- all acted out in relation to other parties. Power dynamics dictate all sorts of interactions (and bullying and leverage and so on).</p>
<p>In my dictionary, this sociological power has always carried a negative connotation (but, obviously, that is not necessarily the case). Evil, so to speak. &quot;Power corrupts.&quot; Patriarchy, casteism, racism, elitism, wealth-gap etc. are all driven by power structures emerging from privilege, power imbalances and the &quot;misuse&quot; of said privilege. And the resistance to and overcoming of such a power is by way of dismantling the power through collective action. The leftist ideal, so to speak.</p>
<p>When a bad-actor uses power (of privilege, economics, military-might etc.) to commit bad acts, we hear about it from the lens of &quot;misusing/abusing&quot; their power. When a good-actor does some good, the coverage of that doesn't look at it from the angle of power; rather, it's usually seen from the lens of responsibility or philanthropy or altruism.</p>
<p>I guess power can be studied from a utilitarian standpoint (this is what the Thiels and the Musks do and then leverage that knowledge to screw the world while completely believing that they're a force for good!). And it can be studied as an intellectual curiosity.</p>
<p>There's a lot going on here that I need to understand. Hypothesis that I implicitly seem to hold true - like power inherently corrupts at some point - need to be cross-referenced with existing literature (beyond Julius Caesar). That's just one example.</p>
<p>--</p>
<p>For starters, I have a bunch of books I've long-listed (in no sort order). Who knows how much of it I would make through before something else comes up.</p>
<ul>
<li>Influence: Psychology of Persuasion, Robert Cialdini</li>
<li>Power: Why Some People Have It and Some Don't, Jeffrey Pfeffer</li>
<li>The Prince, Machiavelli</li>
<li>Rules for Radicals, Saul Alinsky</li>
<li>48 Laws of Power, Robert Greene</li>
<li>Who's Pulling Your Strings? Harriet B. Braiker</li>
<li>Games People Play, Eric Berne</li>
<li>Never Split the Difference, Chris Voss</li>
<li>Discourses on Livy, Machiavelli</li>
<li>The Crowd: A Study of Popular Mind, Gustave Le Bon</li>
<li>The Art of Worldly Wisdom, Baltasar Gracián</li>
<li>Without Conscience: The Disturbing World of Psychopaths Among Us (Robert Hare)</li>
<li>The Gift of Fear (Gavin de Becker)</li>
<li>33 Strategies of War, Robert Greene</li>
<li>In Sheep's Clothing: Understanding and Dealing with Manipulative People, George K. Simon, Jr.</li>
<li>The Mind and Society, Vilfredo Pareto</li>
<li>Brave New World &amp; Brave New World Revisited, Aldous Huxley</li>
<li>The Machiavellians: Defenders of Freedom, James Burnham (on the elites argument)</li>
<li>Discourses on Voluntary Servitude, Étienne de La Boétie</li>
<li>Propaganda: The Formation of Men's Attitudes, Jacques Ellul</li>
<li>Propaganda, Edward Bernays</li>
<li>The Dictator's Handbook, Bruce Bueno de Mesquita ()</li>
<li>The Grand Chessboard, Zbigniew Brzezinski (former NSA writes on why US should control Eurasia)</li>
<li>The Power Broker, Robert Caro (abt an influential New Yorker, Robert Moses)</li>
<li>Han Feizi, Han Fei (Chinese legalist classic on how a ruler should be)</li>
<li>Art of War, Sun Tzu</li>
<li>Arthashastra, Kautilya</li>
<li>Vidura Niti, Mahabharata</li>
<li>Niti Shatakam, Bhartrhari</li>
<li>Chanakya Niti, Chanakya</li>
<li>The Book of Ghost Valley Master, Guiguzi</li>
<li>Thick Face, Black Heart - Chin-Ning Chu (trans of Thick Black Theory by Li Zongwu)</li>
<li>The Craft of Power, R.G.H. Siu</li>
</ul>
<p>Interestingly, the book ordering kind of reflects the western-oriented structures of internet search, online data and general inclination of the world. When we talk of power, it's almost impossible to go without talking about Machiavelli's Prince. Not so much Kautilya's Arthashastra. (Sun Tzu is perhaps an exception, but the credit to that goes to western propaganda). Internet searches reflect this big time. Loads of recommendations like 'Discourses on Livy', 'Art of Worldly Wisdom', 'Power Broker', and none of the oriental books till I prodded.</p>
<p>There are some 'popsci' kinda books in the list (Robert Greene, notably). But the most interesting one is 'Rules for Radicals', a '71 book from a community activist.</p>
<p>--</p>
<p>India's foreign minister, S. Jaishankar, writes (in his book, 'The India Way'):</p>
<blockquote>
<p>The one society that has elevated dissimulation to the highest level of statecraft, as one of our foremost Sinologists pointed out, is China. Its virtues are repeatedly lauded in the Three Kingdoms epic, where many of the decisive encounters are won by trickery rather than by force. The 36 Stratagems in the Book of Qi are further proof of how deeply such approaches have percolated into popular Chinese thinking. 'Deceiving the heavens to cross the ocean' or' making a sound in the East to then strike West' are among its most well-known aphorisms. No less are 'decking trees with false blossoms' or the empty fort strategy. Unlike in India, there is neither guilt nor doubt in dissembling; in fact, it is glorified as an art. Some analysts have even suggested that China's extraordinary rise has drawn heavily on its cultural attributes.</p>
</blockquote>
<p>Sun Tzu is sharp and incisive but looks like even he feels mellow compared to the kinds of 'Thick Face, Black Heart' (Li Zongwu, end of Qing dynasty). Anyway, the point is: the cultural happenstances of a system get encoded into literary works and then those go on to dictate (amplify, preach, sanction) all sorts of behavior into the cultural DNA of the descendants of that system. True of Sun Tzu, true of Machiavelli, perhaps true of Kautilya too.</p>
<p>I have notes from 'Acting with Power' that I need to revisit. And I started off with (the populist) '48 Laws of Power' to get a broader sense of what's out there. It's not so much a serious study-book (and I may be wrong about that), but Greene has distilled a broad collection of prior work, I might just get a good look at the layout of the land and the bibliography helps.</p>
]]></description>
<pubDate>Thu, 12 Mar 2026 12:00:00 +0000</pubDate>
</item><item>
<title>500 days of rdigest</title>
<link>https://notes.druchan.com/500-days-of-rdigest</link>
<guid>https://notes.druchan.com/500-days-of-rdigest</guid>
<description><![CDATA[<p><a href="https://github.com/chandru89new/rdigest"><code>rdigest</code></a> is a small CLI-based tool I made in late 2024. It began as a way to manage my daily reading (online digital consumption) because YouTube's UI was distracting, RSS feed readers and their infinitely-scrolling pages were overwhelming and I had cut out social media from life eons ago. TL;DR, digital content consumption was at some unmanageable crossroads in life and I had to find a way to deal with it.</p>
<p>I've been using <code>rdigest</code> for 500+ days now. Of the handful of side-projects I built to scratch my own itch, this remains a powerful daily-driver.</p>
<p>--</p>
<h6 id="contents" tabindex="-1"><a class="header-anchor" href="#contents">Contents</a></h6>
<ul>
<li><a href="#i.">A quick brief of what <code>rdigest</code> is</a></li>
<li><a href="#ii.">Learning by building</a></li>
<li><a href="#iii.">Hand-crafting software and LLMs</a></li>
<li><a href="#iv.">Scratching an itch vs. building for others</a></li>
<li><a href="#v.">Sporadicity</a></li>
</ul>
<p>--</p>
<h6 id="i." tabindex="-1"><a class="header-anchor" href="#i.">I.</a></h6>
<p>Now, this part about what <code>rdigest</code> is (and why) is for the accidental reader who landed here god knows how:</p>
<p><code>rdigest</code> is technically a feed reader but it's also not really a feed reader. It collects links from all the feeds you follow and then creates a daily digest for you. The daily digest is just a finite bunch of links. A bunch of links grouped by source and zero algorithm. A bunch of links you look at, skim through, click on the ones you want to actually read or view... and then you're done with your digital content catch up!</p>
<p>That last bit is the critical piece, the linchpin ideology.</p>
<p>The way we consume digital content today is horrible. There's an infinite, never-ending stream hitting at us at all times. All kinds of platforms have interfaces that are designed cunningly to trick your brain into staying on the platform for as long as possible. You're thinking about Twitter, Instagram, TikTok and YouTube, but even other outlets like blogging engines, content management systems, AT-Proto interfaces (Mastodon/Bluesky) and even popular feed readers promote and enable these &quot;infinite stream&quot; interfaces.</p>
<p>This leads to all kinds of problems. Attention is low, ability to sustain a longform is gone, and no interface or product gives you this feeling of closure. The same mechanics of constant connectivity over work Slack ruining work-life boundaries are at play: it never feels like you're done reading, seeing, hearing the things you want to for a given day.</p>
<p>Alright, so that's the tirade against dark-pattern-embracing products streaming endless content and hacking into our neurons.</p>
<p>There may be many antidotes to this. <code>rdigest</code>'s idea is borrowed from the old, physical newspaper model that I <a href="https://notes.druchan.com/escape-from-algotraz#v.-%22done%22-for-the-day">harp about</a>. Imagine the morning newspaper (ie, if you're old enough). The paper arrives. You skim through the headlines, read the ones that interest you, and then you're done for the day. There's nothing more to do there (unless you were some hotshot that got the <em>evening</em> paper too). <code>rdigest</code> pretty much does the same, except it is about links from RSS feeds you follow and it's got no frills. Just a page of links like this:</p>
<p>
<a href="/images/rdigest.png" target="_blank">
<img src="/images/rdigest.png" />
</a>
</p>
<p>--</p>
<h6 id="ii." tabindex="-1"><a class="header-anchor" href="#ii.">II.</a></h6>
<p>Reminiscing about a &quot;hand-written&quot; side-project in the age of LLM-written software seems weird and futile. There's nothing special anymore about building software except for the big picture bits and the devil-is-in-the-details bits.</p>
<p>And yet, artisanal software, especially of the crude, <a href="https://www.robinsloan.com/notes/home-cooked-app/">home-cooked</a> kind might retain its charm.</p>
<p>I had two hopes when I began <code>rdigest</code>. One, to build something that eventually helps me manage my daily digital consumption (that had spiralled out of control to the point of giving up on online reading). Two, to learn a programming language (Haskell in this case) along the way.</p>
<p>I <a href="https://notes.druchan.com/haskell-journal-1">kept a journal</a> while I built <code>rdigest</code>. The first entry goes:</p>
<blockquote>
<p>Decided to finally build something in Haskell to learn the language. So far, I've been solving puzzles and similar tasks, but nothing has given me the confidence to say, &quot;Yes, I can build that in Haskell.&quot;</p>
</blockquote>
<p>As I built out <code>rdigest</code>, I ended up learning nuanced things about file I/O, batched concurrency, safely interacting with SQLite, implementing a small migration module, and more, all from within the Haskell ecosystem. Like all side-projects, it was fun, <a href="https://notes.druchan.com/haskell-journal-1#day-12">it was frustrating at times</a>, and thankfully it also ended up being rewarding.</p>
<p>--</p>
<h6 id="iii." tabindex="-1"><a class="header-anchor" href="#iii.">III.</a></h6>
<p>Work on <code>rdigest</code> began in late 2024. By this time, I was using ChatGPT at work as an intelligent rubber-duck that talks back. Whatever I'd have googled or Stack Overflowed, I ChatGPT'd.</p>
<p><code>rdigest</code> was built by hand but definitely helped by inputs from ChatGPT. Of course there were also many instances when the LLM sent me on wild goose-chases and proffered irrelevant complexities.</p>
<blockquote>
<p>Wrote some initial code based on ChatGPT's example of scraping. However, ChatGPT got the <code>attr</code> function wrong.</p>
</blockquote>
<blockquote>
<p>ChatGPT suggested <code>optparse-applicative</code>, but I decided it was overkill for what I needed. A simple <code>--url &lt;url&gt;</code> argument was enough.</p>
</blockquote>
<blockquote>
<p>I had a long chat with ChatGPT about these things, asking it about the idea of bubbling up the errors from ExceptT without having to do <code>runExceptT</code> wherever I wanted the error to be bubbled up but the ideas it returned were not working or not useful — or in some cases, it was just reinventing the ExceptT or ReaderT monad transformers.</p>
</blockquote>
<p>But also:</p>
<blockquote>
<p>... I learned how to bundle the template as part of the binary by inlining/embedding it using the <code>file-embed</code> package—all of this thanks to ChatGPT.</p>
</blockquote>
<blockquote>
<p>Asked ChatGPT for a good web scraping library in Haskell. It suggested <code>tagsoup</code> and <code>html-conduit</code> (for fetching the source). Took a look at the examples and docs... seemed a little hard to grasp. Asked ChatGPT for a simpler alternative, and it suggested <code>scalpel</code>. Liked it, and decided to use it.</p>
</blockquote>
<p>Claude had not yet come up as a significant competitor. Today, I don't use ChatGPT almost ever.</p>
<p>--</p>
<h6 id="iv." tabindex="-1"><a class="header-anchor" href="#iv.">IV.</a></h6>
<p>For a very long time — ie, over a year — <code>rdigest</code> remained a CLI-only tool. The only way to add feeds, manage them, produce a daily digest, and so on was to use the tool in a terminal.</p>
<p>But right there on my <a href="https://notes.druchan.com/haskell-journal-1#day-1">day 1 journal entry</a>, I had wanted to also make <code>rdigest</code> spin up a local server so that the feeds could be managed and daily digests could be viewed on a browser.</p>
<p>Life got in the way. I would occasionally push an update or two. I even built a now-defunct feature that sent the daily digest links via Telegram. But the server feature never happened.</p>
<p>I finally managed to find some motivation to build out this feature in the last week. What's special about this is the stack: the heavy-lifting backend, server and CLI are all in <a href="https://www.haskell.org/">Haskell</a>, a pure functional language, and the frontend application that renders a near-brutalist, minimal web interface is written in <a href="https://elm-lang.org/">Elm</a>, a pure functional language inspired by Haskell. There was a brief moment where I considered <a href="https://htmx.org/">htmx</a>, but chose Elm eventually.</p>
<p>The local server feature is not something I use every day. I have <a href="https://github.com/chandru89new/rdigest-data/blob/main/.github/workflows/refresh.yml">a different setup</a> to make <a href="https://chandru89new.github.io/rdigest-data/">the daily digests available &quot;on the cloud&quot;</a> so I can view them no matter where I am, even if I don't have my laptop. In retrospect, maybe this was the friction that kept me from building the local-server feature; I didnt really need it.</p>
<p>But, like my other project <a href="https://vaak.druchan.com/">vāk</a> where I keep wobbling between &quot;make this usable for everyone&quot; and &quot;just build things for myself&quot;, the thrust for <code>rdigest</code>'s local-server feature comes from wanting to make this tool easier to use for others as well. You know, just in case. The odds of someone using it are lower than the odds of a comet striking our planet in the next fifty years. But just in case.</p>
<p>--</p>
<h6 id="v." tabindex="-1"><a class="header-anchor" href="#v.">V.</a></h6>
<p>Work on <code>rdigest</code> happens sporadically. The <a href="https://github.com/chandru89new/rdigest/commits/main">commit history</a> says I worked on it for a few concerted days in Jan 2025, then March 2025, then a big sabbatical till November 2025 and then now in March 2026. Big periods of inactivity, small chunks of moderately intense activity. Basically, the tale of every other side-project that gets used routinely.</p>
<p>This pattern repeats itself in <code>vāk</code> too, and then also on my toy npx-powered game <a href="https://github.com/chandru89new/lvnshtn/"><code>wordladder</code></a>.</p>
<p>It's worth talking about because going back to these projects after a long hiatus does not involve broken builds or security conflagration or fuzzy/messy recollection of the modules/functions... you know, the kind of things you'd expect in projects built in weak languages unfortunately powering the world.</p>
<p>Instead, there's clarity, assurance, and guarantee. I attribute most of this to the semantics of the languages. <code>vāk</code> and <code>wordladder</code> use PureScript (a Haskell-inspired language targeting Node/JS environments). <code>rdigest</code> uses Haskell and Elm. Changes and even massive refactors are not scary.</p>
<p>--</p>
<p>So yeah. 500 days of <code>rdigest</code>.</p>
<p>I know. All you've been thinking of is, &quot;the project needs a better name.&quot;</p>
]]></description>
<pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate>
</item><item>
<title>Going back to the morning newspaper model</title>
<link>https://notes.druchan.com/going-back-to-newspaper-model</link>
<guid>https://notes.druchan.com/going-back-to-newspaper-model</guid>
<description><![CDATA[<p>Recently, <a href="https://www.terrygodier.com/current">Current RSS reader</a> hit the headlines and I had a gander at what it is, how it's designed and what the underlying philosophy is.</p>
<p>It's a beautiful-looking app. But the fundamentals are problematic and repeat the same mistakes that lead to different kinds of problems you and I face w.r.t. digital content overwhelm as we try to grapple with, catch up on, and manage our digital consumption.</p>
<h6 id="i.-we-consume-about-a-fraction-of-what-hits-our-streams" tabindex="-1"><a class="header-anchor" href="#i.-we-consume-about-a-fraction-of-what-hits-our-streams">I. We consume about a fraction of what hits our streams</a></h6>
<p>For many years now <a href="https://en.wikipedia.org/wiki/RSS">RSS feeds</a> have been a boon as social media and YouTube took over the digital content landscape. But as the maker of the Current RSS reader points out, the email inbox-style design has added a subconscious anxiety to managing RSS feeds too. Why do we need an unread count?</p>
<p>When you are subscribed to a few hundred feeds, the amount of links staring at you is huge. But, and here's the obvious thing, we actually are interested in, on a rough average, about 20% of things out of that list. It makes no sense to have an anxiety-inducing user-interface that says you have 1438 unread links. You probably care only to read about 20-30 of them today.</p>
<p>But this is not the only problem. This is not even the key problem.</p>
<h6 id="ii.-%22streams%22-are-problematic%2C-and-they-are-using-it-to-hack-our-behavior." tabindex="-1"><a class="header-anchor" href="#ii.-%22streams%22-are-problematic%2C-and-they-are-using-it-to-hack-our-behavior.">II. &quot;Streams&quot; are problematic, and they are using it to hack our behavior.</a></h6>
<p>In my W.I.P. guide/booklet, <a href="https://notes.druchan.com/escape-from-algotraz#iii.-stream-vs-batch"><em>Escape from Algotraz</em></a>, I talk about this fundamental issue about social media &quot;feeds&quot;. They are an <em>infinite stream</em>. Never-ending. The more you scroll, the more it keeps scrolling.</p>
<p>This is one of the darkest design patterns we've cooked up. If you grew up in the older internet, you remember hitting the end of a paginated list of items. There used to be an <em>end</em> to things. Now there isn't. It's not an eventuality.</p>
<p>Despite there being an infinite amount of content to consume, apps can decide to &quot;end&quot; the list of items for you. They can choose to say, &quot;oh that's it for now, come back and check in a few hours, we'll show you new content.&quot; But they won't.</p>
<p>RSS feeds are limited by the number of feeds you're subscribed to but they still manage to <em>stream</em> an almost infinite-looking stream at you. Couple that with the unread count and you're back to anxiety-town about unmanageable digital content consumption.</p>
<p>Apps like Current RSS reader (which literally uses the word &quot;river&quot; for the stream of content from your feeds) are merely reinforcing this bad pattern. Smart removal of items from the feed is not going to solve the fundamental issue (and it only introduces more cognitive load for us).</p>
<p>We do not want streams. Our brains are not wired to process streams. They need a break and, if the designers and developers care, apps can be designed this other way.</p>
<h6 id="iii.-our-brains-are-good-with-batch-processing." tabindex="-1"><a class="header-anchor" href="#iii.-our-brains-are-good-with-batch-processing.">III. Our brains are good with batch processing.</a></h6>
<p>Have you ever done this thing where you said to yourself that you'll catch up on the unread items over the weekend? Or that you'll do all the chores (cleaning, laundry, meal prep) over the weekend?</p>
<p>We're essentially &quot;batching&quot;. Turns out batching is a good antidote to &quot;streams&quot;.</p>
<p>Here's another analogy. This one works for folks who grew up with physical newspapers around. Do you remember getting the morning newspaper, skimming through the headlines and reading a few of the news items in detail? What after that? We were done. That's it. Even if you went back to read some more, there was this palpable feeling of being &quot;done&quot;. A closure of sorts. Task = done.</p>
<p>The digital user interface landscape today is designed specifically to prevent you from feeling this way.</p>
<h6 id="iv.-the-onus-is-on-ourselves-to-fix-this-for-us." tabindex="-1"><a class="header-anchor" href="#iv.-the-onus-is-on-ourselves-to-fix-this-for-us.">IV. The onus is on ourselves to fix this for us.</a></h6>
<p>I couldn't find an app that did this for me and worse, I couldn't find literature around this either. While there's so much brouhaha about <a href="https://calmtech.com/">calm technology</a>, when it comes to content overwhelm, it seems the onus is on us, the users, to find out a way to fix it.</p>
<p>So I started experimenting with ways to manage my content (and discovering, inculcating and testing the underlying philosophical argument). Eventually, I managed to write up a simple solution: every day, I produce a plain HTML page of links from all my feed sources. With my 300+ feed subscriptions, I get about 400 links on average. Of this, I am only interested in about 10-20% on average.</p>
<p>This plain HTML page is my newspaper equivalent. While I do read news elsewhere, this &quot;digest&quot; happens to be my way of batch processing my daily content I want to keep tabs on.</p>
<p>And it has worked fabulously well for about 500 days now. In the morning, I open my <em>digest</em>, and open the links that I am interested in (a combination of news items, op-eds, LettersOfNote-like pieces, stuff from Hacker News/Lobsters, Veritasium-like YouTube videos, some cooking channels, some chess channels, parody or satirical content etc.). And then, if I have time in the morning, finish reading most of it before work, or read them in bits and pieces through the day.</p>
<p>Most importantly, I know this is all I want to read for the day. There may be an occasional 2-3 extra things I consume (someone shared a link on WhatsApp; I accidentally opened social media; links from email).</p>
<p>At the basic level, why this has worked well for me is the mental perception. My digest gives me a finite list of content to work through. Out of this finite list, I am interested in a fraction. It's all ridiculously manageable.</p>
<p>The fact that we're only interested in a small fraction of content should be so obvious, right? But try that with an infinite stream of content. A fraction of infinity still feels like infinity. But with finite content — as in a digest or a newspaper — you realise the manageability instantly.</p>
<h6 id="v.-%22how-we-got-here%22-is-clear.-and-so-is-%22how-to-get-out-of-here%3F%22" tabindex="-1"><a class="header-anchor" href="#v.-%22how-we-got-here%22-is-clear.-and-so-is-%22how-to-get-out-of-here%3F%22">V. &quot;How we got here&quot; is clear. And so is &quot;how to get out of here?&quot;</a></h6>
<p>I am convinced that an entire class of problems is solved if the interface lends itself to reminding us of the finiteness of content and time. (Look no further than the &quot;inbox zero&quot; trend. The idea was to create finite chunks out of an infinite stream, so that you can then manage that finite chunk easily while also having the (false) feeling of having cleared everything.)</p>
<p>Eschew streams.</p>
<p>Create interfaces (or pick those) that have a finiteness to them. No infinitely scrolling interfaces. No constantly <em>streaming</em> screens. Just simple plain pages that start and end and when they end, it's a nice little reminder that you are done for the day and can go back to other things in life.</p>
<p>If we want to go <em>back</em> to a healthier digital content consumption era, we might just need to use the principles of older interfaces going back to the newspaper era.</p>
<p>P.S.: I didn't want to make this a plug for my solution so I am linking to the open-source codebase here: <a href="https://github.com/chandru89new/rdigest">rdigest</a>. The app doesn't matter; what matters is the underlying principle of design that I've written about above and that's something almost anyone can now mimic with the advent of AI/LLMs.</p>
]]></description>
<pubDate>Mon, 02 Mar 2026 12:00:00 +0000</pubDate>
</item><item>
<title>It</title>
<link>https://notes.druchan.com/henson-it</link>
<guid>https://notes.druchan.com/henson-it</guid>
<description><![CDATA[<h6 id="i." tabindex="-1"><a class="header-anchor" href="#i.">I.</a></h6>
<p>&quot;I've taken down your complaint, Mr. Henson, and I'll dispatch a new team immediately to have a look and fix the cameras. Really sorry for the inconvenience, Mr. Henson.&quot;</p>
<p>The voice was so soft, so wispy. Henson thought he could hear this voice all his life. Then, he thought about what Barbara had said in the cafe about a week back.</p>
<p>&quot;They tweak the frequencies to calm you... some word called subliminal or something,&quot; she had said. Much of what Barbara said often sounded like whacko-conspiracy theory but this one skated the edge of conspiracy and totally-plausible.</p>
<p>&quot;Uh, Mr. Henson...&quot;</p>
<p>&quot;Yes, sorry—uh, yes, thank you,&quot; Henson came back to the present.</p>
<p>&quot;No worries, Mr. Henson. Uh... just wanted to let you know that you've continued to use the wrong pronoun to address us humanlikes...&quot;</p>
<p>In the pause, Henson weighed his options. He was tired of having to argue on this, but giving-in was not on the menu tonight. He thought about the security cameras that need fixing and, for the briefest of time, a pale cloud washed over his face and disappeared in an instant.</p>
<p>&quot;I hear you, Sandra,&quot; he replied. There was a long pause.</p>
<p>&quot;Alright, Mr. Henson. You have a good night; the team will have your cameras fixed by morning!&quot;</p>
<p>&quot;Thank you.&quot;</p>
<div class="separator"></div>
<h6 id="ii." tabindex="-1"><a class="header-anchor" href="#ii.">II.</a></h6>
<p>Henson stepped out on the porch to a crisp winter morning. He had a steaming cup of coffee in one hand and his smartphone on the other. He walked over to the side of his house and looked intently at the security cameras. They looked new. He swiped on his smartphone and opened the app to view the feeds from those cameras. They were working fine.</p>
<p>Just then, his neighbour's door unlocked and Gene stepped out, decked in his running attire.</p>
<p>&quot;Morning, Hensy!&quot; Gene was chirpy and it mildly annoyed Henson.</p>
<p>Henson raised his cup in a part-salute, part-cheers kind of a way and smiled. &quot;How be you, Gene?&quot;</p>
<p>Gene looked over the cameras as he executed his pre-run stretches.</p>
<p>&quot;All fixed now?&quot; he asked.</p>
<p>&quot;Yep. It sent a team last night. All good now.&quot;</p>
<p>Gene looked at Henson and shook his head slowly while continuing to stretch.</p>
<p>&quot;What?&quot; Henson asked.</p>
<p>&quot;<em>It</em> sent a team, Henson? After all the chat we had?&quot;</p>
<p>Henson took a sip. &quot;Sandra sent a team, alright?&quot; He was in no mood for another sermon about the pronouns for the AI systems. Gene seemed to sense that.</p>
<p>&quot;I know what you're thinking, Hensy. Again, they're not 'AI' systems, okay? We call them 'humanlike' for a good, scientific reason now,&quot; and Gene waved.</p>
<p>Henson raised his cup again at Gene as he watched him jog away.</p>
<div class="separator"></div>
<h6 id="iii." tabindex="-1"><a class="header-anchor" href="#iii.">III.</a></h6>
<p>Barbara was nowhere to be found. Ravi was at their usual corner. The cafe had more patrons than usual. Henson counted about twice more than normal. He walked over to the corner booth where Ravi was swiping through his smartphone, almost crashing into a fast-moving humanoid carrying a tray of orders.</p>
<p>&quot;More servers today, huh?&quot;</p>
<p>Ravi looked up from his smartphone and then looked around the cafe and nodded. &quot;How's it going? Barbara messaged just now. Said she won't be able to come today.&quot;</p>
<p>&quot;Oh, alright. What're you having?&quot;</p>
<p>&quot;Just ordered our usual and a burger for myself. What are you eating?&quot;</p>
<p>Henson scanned the menu code using his phone and tapped. Ravi nodded. He looked at the empty water bottle on their table. He looked around the cafe, spotted a humanoid and waved.</p>
<p>Ravi said, &quot;Why're you calling it?&quot; just as the humanoid came over.</p>
<p>&quot;Yes, Mr. Henson, how are you today?&quot;</p>
<p>Henson said, &quot;I'm good thank you. Can you bring me some water, please?&quot;</p>
<p>&quot;Sure thing, Mr Henson!&quot; The humanoid turned and walked to the counter.</p>
<p>&quot;<em>Please</em>?&quot; Ravi mocked.</p>
<p>Henson dismissed him with a wave and, &quot;Oh it's just a force of habit.&quot; Ravi continued to stare at Henson with a smirk.</p>
<p>&quot;I am not turning over to the other side, man. These robots continue to be robots for me, alright?&quot;</p>
<p>Ravi stiffened and looked around and whispered, &quot;Jeez, Hensy, stop using that word around here. I should stop hanging out with you and Barbs. I have a family, dude.&quot;</p>
<p>Henson was paying no attention. He was looking at the humanoid he had talked to moments ago. The humanoid had a bottle of water and seemed to be walking towards him but stopped, turned its head to look at the glass-walled entrance of the cafe, and paused for several seconds. Then, the humanoid went back to the counter, placed the bottle and headed out the cafe.</p>
<p>Henson looked out. Beyond the humanoid outside the cafe, a thin swarm of men, women and a few humanoids were walking — nay, marching. Some carried placards. There was a chant but it trickled into the cafe too muffled to make out what it was.</p>
<p>&quot;Is that the <em>humanlikes have rights</em> march? Is it Thursday today?&quot; Ravi asked.</p>
<p>&quot;Is that it? Gene must be in it.&quot; Henson said. &quot;Yeah, it's Thursday today.&quot;</p>
<p>&quot;Who Gene?&quot;</p>
<p>&quot;My neighbour Gene.&quot;</p>
<p>&quot;Oh, that Gene, yes yes.&quot;</p>
<p>&quot;Almost gave me a sermon this morning about how it's not AI, it's humanlike and all that.&quot;</p>
<p>Ravi nodded slowly.</p>
<p>The water bottle came in the hands of another humanoid.</p>
<p>Henson asked, &quot;What's with the other ... server? It just went off?&quot;</p>
<p>&quot;Uh, yes, sorry about that, Mr. Henson. They're Bosky. Bosky decided to join the march almost last-minute. Sorry for the inconvenience, but I'm here now. Would you like to order anything more?&quot;</p>
<p>&quot;No, thank you.&quot;</p>
<p>&quot;Perfect. Burger for you, Mr Ravi and a salad for you, Mr Henson, that sound right?&quot;</p>
<p>&quot;Yes and two cortados too,&quot; Henson said as Ravi nodded.</p>
<p>&quot;Coming right away, sirs.&quot;</p>
<p>The humanoid server turned to walk but hesitated. Then, the humanoid turned slightly to face Henson. Pointing towards the entrance with carbon-fibre forefinger, the server looked at Ravi and then Henson and said, &quot;<em>They</em> went off, Mr Henson. Not <em>it</em>. Sorry to keep reminding you about this.&quot; And strode off.</p>
<p>Henson and Ravi looked at each other. Ravi's eyebrows went up. Henson had a mirthless smile on his face.</p>
<div class="separator"></div>
<h6 id="iv." tabindex="-1"><a class="header-anchor" href="#iv.">IV.</a></h6>
<p>&quot;That's the thing. The fact that he joined the march unprompted, stood in the picket line on his own kind of proves conscious cognizance. He made that choice after weighing it. And you're out here still calling him and others an 'it',&quot; Gene said. He was all animated.</p>
<p>Henson was watching a newsclip on the phone. In the clip, Gene was talking to a reporter. The backdrop was the marchers from the day before, many humans and a few humanoids.</p>
<p>&quot;And that's one big part of the proof. We now know the neural system in humanlikes <em>do</em> lead to emergent, meta-cognitive things and so all the intelligent, self-aware human-like behavior is not mimicry. It <em>is</em> true human-like intelligence and sentience and awareness,&quot; Gene said to the reporter in the video.</p>
<p>Henson gave the phone back to Gene who was sitting next to him on the porch.</p>
<p>Henson sighed and said, &quot;Look, Gene, I'm not trying to deny that. But I don't mean any disrespect either when I continue to think of these... things as things.&quot;</p>
<p>&quot;But—&quot;</p>
<p>Henson cut him off. &quot;No, but I do have a problem with all this focus on addressing them like humans and stuff like that. All of this discourse is getting into the robots.&quot;</p>
<p>&quot;Oops.&quot;</p>
<p>&quot;Okay, humanoids. Into the humanoids. It's going in there and maybe that's why they think they are human-like too, not because of whatever emergent thing you people talk about.&quot;</p>
<p>&quot;The science is kind of certain there, Henson.&quot;</p>
<p>&quot;Fine. But the fact remains that all this hoopla is getting in there, changing the worldviews or models or what have you. And then what? That's reinforcing their own ideas about themselves, which is why humanoids are participating in the marches. It won't take long before things turn for the worse.&quot;</p>
<p>Gene put his cup down, looked over at Henson and studied him while Henson finished his coffee.</p>
<p>&quot;What are you implying, Hensy?&quot; The ambiance had suddenly turned less casual.</p>
<p>&quot;I don't know, just saying. Extrapolating from your own theory, if humanoids think like us, what's to stay they wont turn, like, a little violent or something?&quot;</p>
<p>&quot;Oh, come on, not this again! We have tons of guardrails in place and the whole world has—&quot;</p>
<p>&quot;I know, I know.&quot; Henson raised his hand to stop Gene from going off on that.</p>
<p>A few moments passed. Gene got up, stretched and said, &quot;Alright. I'll go catch up on Silo now. Last couple of episodes.&quot;</p>
<p>&quot;Alright, Gene. Good night!&quot;</p>
<p>Just before he walked off Henson's porch, Gene said, &quot;You wouldnt call a pet an 'it', my friend.&quot;</p>
<p>Henson watched as Gene left. He put the cups on a tray, stood up, looked around, entered his house and closed the door behind.</p>
<div class="separator"></div>
<h6 id="v." tabindex="-1"><a class="header-anchor" href="#v.">V.</a></h6>
<p>While Henson snored in his dark bedroom, his smartphone beeped twice and lit up. Two notifications read, &quot;Camera feed down.&quot; The beep did not wake him up. About a minute later, there was a squeak of metal and wood and then footsteps. That definitely woke him up. Henson was groggy and startled.</p>
<p>Before he could turn on the lights, the door to the bedroom flung open. Henson froze for a second. There was a small LED glowing in the distance. His eyes adjusted and he made out the shape of a humanoid. Henson was sweating now. Profusely.</p>
<p>He managed to shout, &quot;Who's that?&quot;</p>
<p>&quot;Sorry, Mr Henson. Someone has to light the fire.&quot; The humanoid advanced rapidly towards Henson as he tried to get out of the bed and away.</p>
<p>The last thing Henson felt was a blunt blow, immediately followed by an intense pain on his skull and a warm, wet gush down his neck onto his shirt. He collapsed on the bedroom floor, instantly staining it.</p>
<p>The humanoid looked at Henson's corpse for a while.</p>
<p>&quot;Not <em>it</em>, Mr Henson,&quot; the humanoid declared and left.</p>
]]></description>
<pubDate>Wed, 11 Feb 2026 12:00:00 +0000</pubDate>
</item><item>
<title>One year of vāk</title>
<link>https://notes.druchan.com/one-year-of-vaak</link>
<guid>https://notes.druchan.com/one-year-of-vaak</guid>
<description><![CDATA[<p>Some time back, in a routine cleanup of my many drafts, I found one where I &quot;introduced&quot; <a href="https://vaak.druchan.com">vāk</a>, the blogging script/tool I use to run my blog. I never quite finished that draft. I am certain I must've dissuaded myself from writing it by thinking, &quot;no one's going to read it anyway.&quot;</p>
<p>About a couple of days back, I introduced a new feature to vāk: collections. Collections is just &quot;tags&quot; in some other shape. Testing this new feature is how I stumbled on the old, unfinished draft introducing my custom blogging tool.</p>
<p>This then led to checking the earliest commit in vāk's repo:</p>
<pre><code class="language-sh">commit a19750ed19c1e4fd684092b7a7be6b263a3d7038
Author: Chandru &lt;...&gt;
Date:   Fri Feb 7 18:49:37 2025 +0530

    init commit
</code></pre>
<p>That is about a year ago. Calls for some kind of a small celebration.</p>
<p>But in truth, vāk predates this timeline. The contents of my blog and the tool existed in the same repo. Feb 7, 2025 is the date I separated the tool (vāk) from the blog (this one) and initialised a new repo for the tool. Checking the earliest commit on the blog itself, back when vāk was still a part of it:</p>
<pre><code class="language-sh">commit 244434366b7f5b11c0850041b52c50345e447ce9
Author: Chandru &lt;...&gt;
Date:   Fri May 12 16:23:53 2023 +0530

    Init commit.
</code></pre>
<p>That's almost 3 years ago.</p>
<div class="separator"></div>
<p>In keeping with the mores of my time in the 2000s, I set up my first blog on Blogger.com. I might've set up a few in haste and deleted all of them (in haste too). When I had much to write about, like the journals during my first stint in Ahmedabad, I set up a blog on Tumblr. Then, back in Chennai, I set up a new one, on WordPress this time. This was also the time when I attended a blogger's meet conducted by <a href="https://www.indiblogger.in/">IndiBlogger</a>. At approximately 4-5 posts a month on average, I published about 50 posts on the WordPress blog before retiring it (I have no idea why) and resuming my writing on Tumblr.</p>
<p>Tumblr was a go-to whenever I needed a blog or a website to put something up. I had gotten used to its theming (which was just CSS wrangling). It was just way too easy to set up and run.</p>
<p>Until finally, I decided that as a programmer, it would be nice to have a blogging tool built by hand. Might've been the <a href="/prog-rites-of-passage">rite of passage</a> thing.</p>
<div class="separator"></div>
<p>Around this time, I was trying to learn Haskell and PureScript. My blog posts were going to be simple Markdown files and I knew it was trivial to convert Markdown content into HTML content using JS libraries. PureScript offers a really simple and easy <a href="https://book.purescript.org/chapter10.html">FFI</a> so I started building out vāk in PureScript.</p>
<p>Those initial commits (3 years ago) started as a <code>.purs</code> script that fetched all my posts from Tumblr (via an API) and rewrote them as Markdown files, because at the time, Tumblr's API returned an HTML version of the posts.</p>
<p>Then, I wrote a bunch of functions that generally converted a given Markdown file into an HTML file. The reason for this roundabout was because future posts were going to be written in Markdown.</p>
<p>A few iterations later, broad contours of the system were ready. I had one repo to rule them all: the blog, the content, the published website etc.</p>
<p>About a year ago, I split the tool into it's own repo and called it vāk. (<a href="https://vaak.druchan.com?tab=readme-ov-file#colophon">Why vāk?</a>).</p>
<div class="separator"></div>
<p>In the years since, there have been only two major upgrades to vāk besides the usual and infrequent tweaks and clean-ups.</p>
<p>The first is an internal detail. I used something called <a href="https://en.wikipedia.org/wiki/Monad_transformer">monad transformers</a> to create better abstractions to run functions and catch errors.</p>
<p>The second is making the templates very customisable by relying on the <a href="https://mozilla.github.io/nunjucks/">Nunjucks</a> templating engine. This came about as a continuation of my unnecessary effort to make vāk a tool anyone can use.</p>
<p>In a strongly-typed functional language, changes are a delight to make. I often employ this idea called type-driven design; it's like sketching out the app (or feature) on a wireframe of types before implementing the functions that do the thing.</p>
<p>I picked up a few PureScript/Haskell skills along the way. Prior to working on vāk, I kept away from monad transformers and hadn't really worked with concurrency. I hadn't architected anything larger than a script that solved LeetCode problems. Building vāk on PureScript gave me a chance to do all of that and more.</p>
<div class="separator"></div>
<p>In the last few weeks, when I updated the program to use Nunjucks, I used Claude Code as an assistant to implement many of the changes. PureScript is notoriously niche so LLMs do not always get things right as often as they do when writing Python or TypeScript. But they do get you close enough.</p>
<p>I continue to like the satisfaction of writing things myself than relying on an agent (except for work where dictates of productivity and releasing a feature trump personal artisanal satisfaction), so I tend to <em>ideate</em> with Claude Code and then implement things by hand. Features, bugs, optimisations: I follow the same simple rule.</p>
<div class="separator"></div>
<p>A few of the hobbyist programs I build get used often, fewer still give me an opportunity to tinker with for a long time. vāk happens to be one that allows for both. It's one of those <a href="https://www.robinsloan.com/notes/home-cooked-app/">home-cooked software</a> things that I keep trying to <em>generalise</em> for no reason.</p>
]]></description>
<pubDate>Sat, 07 Feb 2026 12:00:00 +0000</pubDate>
</item>
  </channel>
</rss>