SaaS & Software·Jul 22, 2026

Malleable Computing, Emacs, and You

It all started with a routine task. I use GitHub issues for all of my public-facing projects but my preference is keeping track of things in Org Agenda. To reconcile the two, I would manually copy over the GitHub issue to an Org file, typic

Hacker News8 min readSingle source
Malleable Computing, Emacs, and You
Image · Hacker News
The gist
5-point summary · 1 min

It all started with a routine task. I use GitHub issues for all of my public-facing projects but my preference is keeping track of things in Org Agenda. To reconcile the two, I would manually copy over the GitHub issue to an Org file, typic

  • I use GitHub issues for all of my public-facing projects but my preference is keeping track of things in Org Agenda.
  • It should also be considered a follow-up to my earlier post “In Emacs, Everything Looks Like a Service”.
  • Closely related is the Pareto principle (aka the 80/20 rule) as applied (or more mis-applied) to software development: only 20% of your features will be actually used by 80% of your users.
  • Coupling these ideas together, if the functionality you want (BIBO stability) is within that 20% deliverable then you are positioned to get a desired result faster.
  • Malleable Software and User Agency Returning back to fj, the benefits of building for 1 are evident: From within Emacs I can now easily: Peruse GitHub issues for a specified repository.
20%80%
In this article

It all started with a routine task. I use GitHub issues for all of my public-facing projects but my preference is keeping track of things in Org Agenda. To reconcile the two, I would manually copy over the GitHub issue to an Org file, typically the title and description, like an animal. Despite this separation, the duplicated issue allowed me to treat it as a scratchpad for anything I could express in Org. In this way, I used the duplicated issue in Org as both a dedicated area to take notes and a “staging” area to compose follow-up comments that I’d want to share in the public facing issue. I manually copied for far longer than I care to admit. Repeat a task enough times in Emacs and the inevitable thought arises: “I should automate this.” This post recounts how I automated this task and in doing so, highlight the malleable computing capabilities of Emacs. It should also be considered a follow-up to my earlier post “In Emacs, Everything Looks Like a Service”. Requirements An essential question to ask in any automation exercise is “What do I want done?” I wanted to be able to: Easily copy a GitHub issue (title, description, some metadata) as an Org task that can be tracked in an Agenda view. Work primarily from Emacs to minimize the context switching between it and a web browser. Express my thoughts in Org syntax. Create a new GitHub issue. Avoid dealing with GitHub authentication. From Emacs, open a GitHub issue in a web browser. Another essential question to ask is “What do I not want to do?” Install or write a full-featured GitHub client. Worry too much about synchronization logic between local (Emacs) and server (GitHub) state. Spend a lot of time on this (ideally have something working in a day, no more than a week). Specification With the above requirements in place, the next question is “how do I build this?” For this particular exercise, I decided to leverage my existing install of the GitHub command line utility gh. The benefits for this are: GitHub authentication is delegated to gh; no need to mess with it directly from Emacs. Emacs can treat gh as a REST service to GitHub as shown in the diagram below To flesh out the rest of our tool, we can leverage using different Elisp packages and programs: For the user interface, the Transient and Variable Pitch Table (vtable) packages are used for menus and display respectively. For Org to Markdown translation, ox-gfm will be used. For Markdown to Org translation, Pandoc will be used. Elisp native JSON support will be used for deserializing the JSON responses from gh. Implementation The implementation of the above is published as the package fj with its source available for examination in the file fj.el. Of note is the function fj-request-issues which does the work of retrieving GitHub issues via gh as shown below. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16(defun fj-request-issues (repo) "Request issues for REPO." (let* ((fields fj-browser-fields) (cmd-list (list "gh" "--repo" (format "'%s'" repo) "issue" "list" "--limit" (number-to-string fj-request-issue-count) "--json" (string-join fields ",")))) (json-parse-string (shell-command-to-string (string-join cmd-list " ")):null-object nil))) Consider the high degree of abstraction provided by fj-request-issues: The list cmd-list forms the request (in this case, the arguments to invoke gh with). shell-command-to-string dispatches the request to gh. The returned JSON response is handled by json-parse-string to deserialize the JSON into an Elisp hash table. All of the above is accomplished in less than 20 lines of code. The returned hash table result is subsequently processed to populate a vtable as shown below. From the vtable, the user can navigate the list of issues with an ancillary window updated to show the details of a selected issue. Multiple commands and functions working with said hash-table were made to satisfy the requirements above. They are accessible via the Transient menu shown below: Malleable Computing Observations As Elisp is a dynamic programming language, the above function (or some variant of it) can be coded and evaluated within a running Emacs session. In Emacs it is routine practice to prototype code behavior without the need to restart it. Contrast this with tools that are built with a static language and have no extensibility, where the edit-compile-debug development cycle must be applied to exercise behavior, provided the source code is available. Emacs provides numerous ways to edit and evaluate Elisp code, among them: A scratch buffer An Elisp file An Org source block IELM REPL Eshell eval-expression (M-:) Because there is no isolation between loaded Elisp code, all of it can be orchestrated together in an improvised fashion. Any program accessible to Emacs via shell further adds to this mix. Provided high abstractions, the amount of code needed to be written for desired behavior can be small. At the time of this writing, fj.el has approximately 400 lines of code has been measured by cloc: 1 2 3 4 5 6github.com/AlDanial/cloc v 2.08 T=0.01 s (146.4 files/s, 76550.1 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- Lisp 1 93 38 392 ------------------------------------------------------------------------------- It took me about 2½ hours to build the basic behavior I wanted (request issues from GitHub, then display) and the rest of the day to cover all the original requirements. Everything after that was just refactoring. Motivated readers are invited to examine fj.el to understand its details. At this point though, I’d like to take the opportunity to muse on software engineering and malleable computing. Software Scope - Some Percentage Anecdotes The 90/90 rule posits that “The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time”. Closely related is the Pareto principle (aka the 80/20 rule) as applied (or more mis-applied) to software development: only 20% of your features will be actually used by 80% of your users. From control theory there is the concept of bounded input, bounded output (BIBO) stability. If the system is BIBO stable, then whatever input that is bounded will have an output that is also bounded. Coupling these ideas together, if the functionality you want (BIBO stability) is within that 20% deliverable then you are positioned to get a desired result faster. Unfortunately, this observation is not available for many producers shipping a tool that must satisfy a large audience. In Sinofsky’s post “What is Software Bloat, Really?”, he describes the product definition issues with shipping Microsoft Office, particularly with feature set. From their user research, they were led to this finding: “… the data was entirely conclusive: Most of Office was used. But no one person used the entire product.” When discussing product definition, it is helpful to distinguish two informal dynamics: supply and demand. With software that is only supply-provided (such as the case with MS Office), the weight of product definition is shouldered by the producer. If the producer wants to serve a vast audience, it is likely their feature set and corresponding development scope will be vast as well. On the demand-side, consumers can make requests for new features, but their prioritization is controlled by the producer. In this situation, the roles of producer and consumer are strongly delineated. Malleable software, where users have agency to adapt and reshape their digital tools, offers a different possibility: producers provide the building blocks and let consumers make their own tools. In this, both existing code and programs are recombined to make new behavior. Stated another way, malleable software takes advantage of combinatorial explosion in that a desired subset of behavior can likely be found within the state space of combining existing libraries (in this case Elisp) with different programs. With malleable software, the roles between producer and consumer are less delineated. A consumer building a new tool out of malleable building blocks now must shoulder the weight of product definition. Build for 1 or N The scope to build for 1 vs N can be an order of magnitude with the kicker that N need not be large. Choosing to write code for another person (N=2) escalates concerns that could otherwise be brushed aside: Error handling Code maintainability Modularity/Reuse Documentation Unit and Integration Testing Packaging Distribution Both a blessing and curse of malleable techniques is that they allow for “just good enough” capability. Malleable techniques encourage building for 1 as reaching a state of “it works for me” is often sufficient to declare victory. For most software that is only supply-provided, building for N is a requirement. For most software built with malleable techniques, building for N is a choice. Malleable Software and User Agency Returning back to fj, the benefits of building for 1 are evident: From within Emacs I can now easily: Peruse GitHub issues for a specified repository. Copy a GitHub issue into a Org file. Create a new GitHub issue using Org syntax. Open a GitHub issue in a web browser. Implementing fj in Emacs was straightforward as I could leverage Elisp packages (both built-in and 3rd party) and external applications (gh, pandoc) to build it. Within a day I had a tool that did what I wanted. I did not have to ask for permission nor required privileged materials (source code) to build fj. With Emacs, I could just do it. Such individual empowerment advanced by malleable techniques is liberating in contrast to working with siloed applications with little to no integration between them. Closing Thoughts This post muses about the malleable computing capabilities provided by Emacs, showing by concrete example (fj.el) how new behavior can be created leveraging both code and program reuse in an improvised fashion. With measured expectations (requirements, feature set, audience), malleable techniques allow for building tools that would otherwise be infeasible without it. Links https://github.com/kickingvegas/fj “What Is Software Bloat, Really?”, Steven Sinofsky. emacs org mode

Integrity note  ·  Xela does not rewrite or paraphrase article content. The excerpt above is the source publication's own words, sanitized for display. For the full piece — including any quotes, charts, or images — read it at Hacker News. Xela's rewritten version is off for this story, so there's no editorial angle attached — you're getting the source's reporting unfiltered. When the rewrite is on, we add a What this means block underneath with the operator/trader takeaway.

What people are saying

Discussion

Hot takes

0/280

Loading takes…

Comments

Discussion · 0

Sign in to comment, like, and save articles.

Sign in

Loading comments…

Keep readingSaaS & Software desk
See all in SaaS
Show HN: ValuePair – a friendship app that cares about values first
·

Show HN: ValuePair – a friendship app that cares about values first

Hey, I would like to show you my project, but it's difficult because it only works with a registration, so I explain the concept to you. The Idea: Everyone who registers has to do an onboarding and answer meaningful questions that help you to find a right match. The matching happens by the system. Once you're done with the onboarding, you enter the pool. When a match is found, you go into a 1on1 14 question-set with that person. All answers are revealed immediately. At the end both decide if they form a connection or not. Only if both agree, the chat opens. Once a connection is formed, they can play through other prepared question sets, so the conversation doesn't get dry. It's also possible to create custom question sets to play through with your connected matches. I just got this idea because I really wanted away from all the typical friendship and dating apps that are just a marketplace of user profiles. I feel like that's the only hook other apps offer, people come back because they are bored and browse through profiles. On tinder it's swiping through pictures and on other apps it's a list of profiles where you can filter with your matching criteria. But all that felt just shallow to me. I think people rarely ask the right questions each other, like really mandatory things that matter to form a any kind of relationship with someone. I've been on multiple different social platforms and it always felt mega shallow. Most people can't even start a good conversation, it's often just stuck at small talk. Maybe it's not even peoples fault, that's why I tried with these question sets to tackle multiple problems. First, that you don't even have to bother with someone if you have entirely different worldviews, which you would normally just find out if you talk long enough with someone. And second, just killing the small talk issue, by giving people a base. So before I started coding this project, I actually did a research if there is anything backed by science to find out, which kind of questions would actually matter to find out, if you can handle someone. There were a lot of studies I've found e.g. "Aron and colleagues (1997)", "Hall (2019)", "Byrne (1971)", "Finkel and colleagues (2012)" and "Hazan and Shaver (1987)". I took their research work and tried to create questions based on them. The project is running on Next, Postgresql, everything dockerized, running on a small Hetzner VPS. I used Claude+Codex to develop everything, but I wouldn't say it's really vibecoded, since I work as a Senior Dev and I used my main tech stack. It's an open beta currently and it's live for like 14 days - I have ~150 users right now. And honestly, I am really overwhelmed by those numbers, because it's the first time that I ever managed to attract this amount of people on a project I've launched. When I started, I launched it as a closed beta, so it was invite only. During that period I got so much good feedback from people, it was incredible. I implemented almost everything my first users told me. Since all the changes, I didn't retrieve any further feedback what people wish would be different. It's just constant good feedback since then. People contact me from alone and just tell me how much they like these questions and the loop. My marketing strategy is mainly Reddit currently, but I started also new methods. I found some super relevant subreddits that had no rules against advertising. When I wrote my posts on reddit, I didn't mention a product name or link. I've only described the idea and if somebody would have interest trying it out. That worked surprisingly well. Another thing I've done was using a social app that allows anonymous posts at your current location, kinda something like "Nextdoor". Posts on this app bring me daily 1-5 new registrations. I wonder what you guys think about it and I am open for any critics! Comments URL: Points: 3 # Comments: 2

Hacker NewsSingle source
Newsletter

Track saas & software every morning.

Daily digest tuned to this beat. The 5 stories most worth your time. Unsubscribe anytime.