HNHacker News
TopNewBestAskShowJobs

bikeshaving

839 karma · joined April 7, 2019

bikeshaving.org
submissionscomments
bikeshaving··on WebMCP Challenge – OpenAI
If you care about web standards, please for the love of god do not participate in this challenge. “WebMCP” is an extension to the `document` global under `document.modelContext`. The `document` object exists to represent the visual and structural node tree of an application. The `modelContext` extension is essentially an API gateway, and this proposal staples a global RPC registry with structured JSON payloads onto the DOM. It ignores the standard Request/Response API, and it does all of its work on the main thread. It forces developers into manual state-synchronization hell just to maintain a facade for a screen-scraping LLM, meeting them halfway so increasingly capable bots can “book flights on your website.” The API makes no considerations for API versioning, so any WebMCP tools you write are carved in stone.

I have no idea who at Google is advocating for this, but it’s a half-baked idea that goes against 20 years of web standard work. At least put this under the `window` or `navigator` global, goddamn.

bikeshaving··on Ask HN: What are you working on? (August 2026)
TermDOM: A terminal renderer which used real DOM nodes, so you can write TUIs like web apps with HTML, CSS, and whatever framework you want. I didn’t really write this, more like spent intense weeks of effort where I product manage (yell at) Claude and did visual testing.

https://github.com/bikeshaving/termdom

bikeshaving··on l: A new runtime for k and q
As someone who does not know what k4, qSQL, or q are, reading through the landing page of this website was giving me mild schizophrenia. And then I tried to search for these things in the old way, and received incredibly dry technical sites that still don’t tell me what it is, and all these names are wildly SEO unfriendly. So I had Claude give me context and it’s apparently the database Wall Street uses for tick data. Sounds cool but, jeez.
bikeshaving··on How liminalism became the defining aesthetic
My favorite example of liminalism is Everything Empty Always Alone, a man on YouTube in his 40s who claims to be a time traveler and films himself walking and driving around empty metropolitan areas. He claims he’s recording from some sort of alternate universe, but it’s likely he’s just at these locations at odd hours. In any case, it’s fun outsider art. Or maybe it’s all true you never know.

https://www.youtube.com/@EverythingEmptyAlwaysAlone/videos

bikeshaving··on Collaborative Editing in CodeMirror (2020)
I’ve tried to create the minimalist version of this with Revise.js. The main surface area is a custom element called a `<content-area>`. The OverType library you linked to uses a time-old technique where you essentially put a duplicate copy of the content over a `<textarea>` to highlight it but this doesn’t really work in mobile and it messes with the selection. I’ve tried to grapple with `contenteditable` directly with my solution, but it does try to use less JavaScript and it does try to be more minimal.

https://github.com/bikeshaving/revise https://revise.js.org https://revise.js.org/blog/introducing-revise/

bikeshaving··on Qite.js – Frontend framework for people who hate React and love HTML
Manual refresh(). This is something Crank does, and other frameworks like the new Remix one is picking it up as well. Being explicit has its advantages.
bikeshaving··on Qite.js – Frontend framework for people who hate React and love HTML
I’ve written about how Svelte, Vue, and Solid are all reactive and share common pitfalls due to their reactive solutions. My theory is that they all cause worse bugs than they prevent.

https://crank.js.org/blog/why-be-reactive/

bikeshaving··on Meta's Omnilingual MT for 1,600 Languages
I don’t own a car :)
bikeshaving··on Meta's Omnilingual MT for 1,600 Languages
I’m very wary of celebrating Meta’s language work when the company was credibly found to have contributed to the genocide against the Rohingya in Myanmar, and separately, to human rights abuses against Tigrayans during the conflict in northern Ethiopia. Be careful whose sins you’re laundering.

https://www.amnesty.org/en/latest/news/2025/02/meta-new-poli... https://www.amnesty.org/en/latest/news/2023/10/meta-failure-...

bikeshaving··on Microsoft Creative Writer (1993)
I must tell you, it is an incredible relief to learn that McZee was not a figment of my imagination.
bikeshaving··on Microsoft Creative Writer (1993)
Just found the text editor from my childhood
bikeshaving··on When does MCP make sense vs CLI?
I’ve found that humans are pretty good at reading through the output of bash commands. And Claude Code keeps insisting on truncating the output for some reason.
bikeshaving··on When does MCP make sense vs CLI?
I keep asking why the default Claude tools like Read(), Write(), Edit(), MultiEdit(), Replace() tools aren’t just Bash() with some combination of cat, sed, grep, find. Isn’t it just easier to pipe everything through the shell? We just need to figure out the permissions for it.
bikeshaving··on A better streams API is possible for JavaScript
Yes, the callable promise abstraction is just a bit of effort:

  let resolveRef;
  const promise = new Promise((res) => { resolveRef = res; });
  
  const callback = (data) => {
    // Do work...
    resolveRef(data); // This "triggers" the await
  };

  Object.assign(callback, promise);

There’s a real performance cost to awaiting a fake Promise though, like `await regularPromise` bypasses the actual thenable stuff.
bikeshaving··on A better streams API is possible for JavaScript
Not accepting PRs for this. I think the logic is sound (Easter Eggs should be difficult to trigger).
bikeshaving··on A better streams API is possible for JavaScript
A long time ago, I wrote an abstraction called a Repeater. Essentially, the idea behind it is, what would the Promise constructor look like if it was translated to async iterables.

  import { Repeater } from "@repeaterjs/repeater";
  
  const keys = new Repeater(async (push, stop) => {
    const listener = (ev) => {
      if (ev.key === "Escape") {
        stop();
      } else {
        push(ev.key);
      }
    };
    window.addEventListener("keyup", listener);
    await stop;
    window.removeEventListener("keyup", listener);
  });
  const konami = ["ArrowUp", "ArrowUp", "ArrowDown", "ArrowDown", "ArrowLeft", "ArrowRight", "ArrowLeft", "ArrowRight", "b", "a"];
  (async function() {
    let i = 0;
    for await (const key of keys) {
      if (key === konami[i]) {
        i++;
      } else {
        i = 0;
      }
      if (i >= konami.length) {
        console.log("KONAMI!!!");
        break; // removes the keyup listener
      }
    }
  })();
https://github.com/repeaterjs/repeater

It’s one of those abstractions that’s feature complete and stable, and looking at NPM it’s apparently getting 6.5mil+ downloads a week for some reason.

Lately I’ve just taken the opposite view of the author, which is that we should just use streams, especially with how embedded they are in the `fetch` proposals and whatever. But the tee critique is devastating, so maybe the author is right. It’s exciting to see people are still thinking about this. I do think async iterables as the default abstraction is the way to go.

bikeshaving··on Making a font with ligatures to display thirteenth-century monk numerals
I was thinking using ZWJ because the staff is always implied by the usage of Cistercian numerals. I was also wondering if we could reuse CISTERCIAN 1-9 for each significant digit rather than having to encode all 4 separately, though at the end of the day it’s only 36 separate code points.

Adding the staff is 37 codepoints versus 36, but I think using ZWJ would at least have each numeral independently renderable so it degrades gracefully. I’m not too sure about how combining characters degrade.

Essentially it boils down to whether you think the staff and the digit flag part of the numeral are independent or not.

bikeshaving··on Making a font with ligatures to display thirteenth-century monk numerals
Can anyone who works with the Unicode consortium explain why Cistercian numerals aren’t just part of Unicode? There’s Aegean numbers, counting rod numerals, Mayan numerals, Roman numerals (beyond the Latin letter aliases), cuneiform numbers, and plenty of other historical numeral-only systems.

The 4-stave system is interesting but can almost certainly be done using ZWJ hacks maybe.

bikeshaving··on Show HN: Shovel.js – A portable meta-framework built on web standards
Thanks for the kind words! Let me know your thoughts if you end up exploring.
bikeshaving··on Ask HN: What are you working on? (February 2026)
I’ve just published the first public release of a new open source project Shovel.js, replacing tools like Express, Fastify, Next.js, Vite. It’s a full-stack/meta server framework which implements the full Service Worker specification but in Node, Bun, Cloudflare. It leans into using web standards to do things like accessing the filesystem, reading cookies, create client-side bundles rather than inventing new APIs. You can read about the process of making Shovel with AI in the introductory blog post.

https://shovel.js.org/blog/introducing-shovel/

https://github.com/bikeshaving/shovel

bikeshaving··on Computer Systems Security 6.566 / Spring 2024
Seeing this makes me miss the salad days of MOOCs. I learned programming in the 2010s through MIT’s EDX Introduction to Programming course, and then a course on Coursera by Martin Odersky on Functional Programming through EPFL, and I feel like that ladder has been kicked away due to MOOC monetization policies. I wonder if we could return to these days.
bikeshaving··on Greenland sharks maintain vision for centuries through DNA repair mechanism
It’s sinful to fish and kill these ancient creatures up from the deep for minor scientific progress.
bikeshaving··on The creator of Claude Code's Claude setup
Must be nice to have unquota’ed tokens to use with frontier AI (is this the case for Anthropic employees?). One thing I think is fascinating as we enter the Intellicene is the disproportionate access to AI. The ability to petition them to do what you want is currently based on monthly subscriptions, but will it change in the future? Who knows?
bikeshaving··on Replacing JavaScript with Just HTML
I’m not sure this is correct. The DOM class HTMLDetailsElement has the `open` property, which you can use to read/write the details element’s state. If you’re using setAttribute/getAttribute just switch to the property.

https://developer.mozilla.org/en-US/docs/Web/API/HTMLDetails...

bikeshaving··on Show HN: Mysti – Claude, Codex, and Gemini debate your code, then synthesize
I find that asking Claude to develop and Codex to review the uncommitted changes will typically result in high-value code, and eliminate all of Claude’s propensity to perpetually lie and cheat. Sometimes I also ideate with Claude and then ask Claude to get ChatGPT’s opinion on the matter. I started by copy-pasting responses but I found tmux to be a nice way to get rid of the middleman.
bikeshaving··on Show HN: Mysti – Claude, Codex, and Gemini debate your code, then synthesize
I have a similar workflow except I haven’t put time into the tooling - Claude is adept at TMUX and it can almost even prompt and respond to ChatGPT except it always forgets to press Enter when it sends keys. Have your agents been able to communicate with each other with tmux send-keys?
bikeshaving··on The Rise of SQL:the second programming language everyone needs to know
This is a nice coincidence.

I’ve been heads-down on publishing a JavaScript full-stack metaframework before the end of the year. However, in the past two weeks I’ve been goaded by Claude Code to extract and publish a separate database client because my vision includes Django-style admin/forms. The idea is to use Zod to define tables, and then use raw SQL fragments with JavaScript template tags. The library adds a tiny bit of magic for the annoying parts of SQL like normalizing join objects, taking care of SELECT clauses and validating writes.

I’m only using it internally right now, but I think this approach is promising. Zod is fantastic for this use-case, and I’m sad I’ve only just discovered it.

https://github.com/bikeshaving/zen

bikeshaving··on A better zip bomb (2019)
My guess is this is a subset of the halting problem (does this program accept data with non-halting decompression), and is therefore beautifully undecidable. You are free to leave zip/tgz/whatever fork bombs as little mines for live-off-the-land advanced persistent threats in your filesystems.
bikeshaving··on History LLMs: Models trained exclusively on pre-1913 texts
This isn’t science fiction anymore. CIA is using chatbot simulations of world leaders to inform analysts. https://archive.ph/9KxkJ
bikeshaving··on Ask HN: How can I get better at using AI for programming?
You know when Claude Code for Terminal starts scroll-looping and doom-scrolling through the entire conversation in an uninterruptible fashion? Just try reading as much as of it as you can. It strengthens your ability to read code in an instant and keeps you alert. And if people watch you pretend to understand your screen, it makes you look like a mentat.

It’s actually a feature, not a bug.

Page 1 of 6Next →