惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Cyberwarzone
Cyberwarzone
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
小众软件
小众软件
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)
Security Archives - TechRepublic
Security Archives - TechRepublic
W
WeLiveSecurity
Cloudbric
Cloudbric
博客园 - 司徒正美
美团技术团队
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
PCI Perspectives
PCI Perspectives
宝玉的分享
宝玉的分享
H
Help Net Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
Help Net Security
Help Net Security
Last Week in AI
Last Week in AI
S
Schneier on Security
N
News | PayPal Newsroom
B
Blog RSS Feed
L
LINUX DO - 最新话题
T
Troy Hunt's Blog
S
Secure Thoughts
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
L
Lohrmann on Cybersecurity
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tenable Blog
S
Securelist
L
LangChain Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
I
InfoQ
H
Heimdal Security Blog
Cisco Talos Blog
Cisco Talos Blog
F
Full Disclosure
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
K
Kaspersky official blog
T
Tailwind CSS Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
阮一峰的网络日志
阮一峰的网络日志
C
Cisco Blogs

Hacker News - Newest: "AI"

AI can't read an investor deck AI as an attorney? Student uses ChatGPT, Gemini to sue UW over alleged racial discrimination Hacking MCP Servers in AI Systems – The Rug Pull: Tool Changes After Approval GitHub - MeepCastana/KubeezCut: Free Web based video editor GitHub - GenAI-Gurus/awesome-eu-ai-act: Curated tools, official sources, OSS, templates, and guides for EU AI Act compliance. Can AI judge journalism? A Thiel-backed startup says yes, even if it risks chilling whistleblowers Coming soon: 10 Things That Matter in AI Right Now DARPA built an AI to fact-check enemy weapons claims What explains heterogeneity in AI adoption? When AI Meets Muscle: Context-Aware Electrical Stimulation Promises a New Way to Guide Human Movements - Department of Computer Science AI Changed How We Build. It Did Not Change What Matters. Linux rules on using AI-generated code - Copilot is OK, but humans must take 'full responsibility for the… Meta spins up AI version of Mark Zuckerberg to engage with employees Code Mode: Let Your AI Write Programs, Not Just Call Tools | TanStack Blog GitHub - Delavalom/graft: Go framework for building AI agents. Type-safe tools, multi-provider (OpenAI, Anthropic, Gemini, Bedrock), zero vendor SDKs. India's TCS tops estimates, says new AI models did not dent services demand Gen Z's fading AI hype Strong feeling: we are in a folded AI reality GitHub - machinarii/total-recall-catalog: A reference catalog of latest knowledge retrieval, memory & RAG systems GitHub - mensfeld/code-on-incus: Give each AI agent its own isolated machine with root, Docker, and systemd. Active defense detects and stops threats automatically.. Quantization, LoRA, and the 8% Problem: Benchmarking Local LLMs for Production AI Iran war: We spoke to the man making Lego-style AI videos that experts say are powerful propaganda Powell, Bessent discussed Anthropic's Mythos AI cyber threat with major U.S. banks GitHub - immartian/bellamem: Persistent belief-graph memory for AI agents. Retrieves decisive context by importance — not recency, not RAG, not /compact. recursive-mode: The Repo-Native Operating System for AI Engineering After the attack on Sam Altman's home, will AI CEO's go on the offensive? The biggest advance in AI since the LLM Opus 4.6 vs GPT 5.4 One Prompt Unity World Generation Test “AI polls” are fake polls Client Challenge Can AI be a 'child of God'? Inside Anthropic's meeting with Christian leaders How to Switch AI Chatbots and Why You Might Want To GitHub - MattMessinger1/agentic_refund_guardrail: Safe refund policy layer for AI agents — Python + TypeScript. Same behavior, shared tests. Adam/papers/emergent_values_whitepaper.md at master · strangeadvancedmarketing/Adam Ask HN: How do you stop playing 20 questions with your AI coding tools How far can automation and AI support psychotherapy? - @theU GitHub - stagas/rtdiff: realtime git diff gui and AI-assisted commits A Mac Studio for Local AI — 6 Months Later A History of the Early Years of AI at the University of Edinburgh Why AI Coding Tools Still Feel Stuck on Localhost MSN AI Datacenters Are Becoming Strategic Targets twitter.com Penn Researchers Use AI to Surface Unreported GLP-1 Side Effects in Reddit Posts Show HN: MoodSense AI (ML and FastAPI and Gradio, Deployed on Hugging Face) Moodsense Ai - a Hugging Face Space by aman179102 AI models are terrible at betting on soccer—especially xAI Grok GitHub - xialeistudio/echoic GitHub - HimashaHerath/github-dev-wrapped: AI-powered weekly GitHub activity reports deployed to GitHub Pages GitHub - alejandrobalderas/claude-code-from-source: Architecture, patterns & internals of Anthropic's AI coding agent — reverse-engineered from source maps AI and Tech brief: Ireland ascendant GitHub - Titovilal/context0: Context0 - Never Surrender Training for a Marathon with an AI Coach: What Worked and What Didn't Cyber Pulse: Agentic Intel - Apps on Google Play I Built an AI PR Reviewer That Catches Bugs by Not Looking for Bugs Gen Z workers are so fearful AI will take their job they’re intentionally sabotaging their company’s AI rollout | Fortune How AI Is Reimagining the Game of Golf–For Both Players and Courses GitHub - nattergabriel/reseed: A CLI tool for managing and distributing agent skills across projects Is SVG the final frontier? My AI workflow evolved from prompts to a near-autonomous workflow MLSharp Help - 3DGS Viewer & Generator I put my cognitive field based AI's runtime on GitHub Is Numble the first AI-proof game? A3: Kubernetes for autonomous AI agent fleets | Emergent Principles Deepali Vyas ("The Elite Recruiter") GitHub - msmarkgu/RelayFreeLLM: A restful API designed to route user prompts to various AI model providers. Unionized ProPublica staff are on strike over AI, layoffs, and wages Unleashing the Advantage of Quantum AI We're heading for an AI-fueled 'dementia crisis,' brain scientist warns The AI-Assisted Breach of Mexico's Government Infrastructure [pdf] GitHub - stef41/lmscan: 🔍 Detect AI-generated text and fingerprint which LLM wrote it. Open-source GPTZero alternative. Zero dependencies, works offline. MSN GitHub - visionscaper/collabmem: Enabling long-term collaboration with Agentic AI - building up episodic and world model memory over time with in-context awareness We gave an AI a 3 year retail lease in SF and asked it to make a profit | Andon Labs AI Code is Hollowing Out Open Source, and Maintainers are Looking the Other Way What leaked "SteamGPT" files could mean for the PC gaming platform's use of AI AI is the boss at this retail store. What could go wrong? GitHub - Wuzu11517/agentic-proxy: Local proxy meant to help reduce With Drones, Geophysics and ArtificiaI Intelligence, Researchers Prepare to Do Battle Against Land Mines A Single Operator, Two AI Platforms, Nine Government Agencies: The Full Technical Report 在 Steam 上购买 FriedrichAI: Offline AI 立省 10% GitHub - inevolin/resume-cli: Hit Claude usage limits? Resume any AI coding session elsewhere. Switch tools at zero friction. GitHub - atripati/ark: AI Runtime Kernel — a context operating system for AI agents. Eliminates tool bloat, loads only what’s needed, and gives LLMs their reasoning space back. How to Build a Secure AI PR Reviewer with Claude, GitHub Actions, and JavaScript This Startup Wants You to Pay Up to Talk With AI Versions of Human Experts Intel Arc Pro B70 Brings 32GB VRAM to Local AI for $949 WordPress 7.0: The Good, the AI, and the Still Missing AI on the couch: Anthropic gives Claude 20 hours of psychiatry IatroBench: Pre-Registered Evidence of Iatrogenic Harm from AI Safety Measures AI Agents Know About Supabase. They Don't Always Use It Right. The history and future of AI at Google, with Sundar Pichai Inside an AI‑enabled device code phishing campaign How Meta Used AI to Map Tribal Knowledge in Large-Scale Data Pipelines AI for Systems: Using LLMs to Optimize Database Query Execution Forecasting the Economic Effects of AI Introducing Tinker: Play with AI, bring your ideas to life AI sheds light on an ancient gaming mystery People really hate AI but not as much as Iran—or Democrats | Fortune What is an AI Product Engineer? Phoebe Gates wants her $185 million AI startup to succeed with 'no ties to my privilege or my last name': 'I have a chip on my shoulder' | Fortune
Arborium is AI slopware and should not be trusted - Evie On-Line
birdculture · 2026-05-14 · via Hacker News - Newest: "AI"

It would be an understatement to say that I am mildly interested in syntax highlighting.1 While I have yet to write a full-fledged parser myself, my blog's2 syntax highlighting plugin is custom-built. Under the hood it uses the Lezer3 parsing and highlighting system, which is inspired by the gold standard of syntax highlighting used in all modern code editors except Visual Studio Code: tree-sitter. I think Lezer is a great tool and it's especially great in the use case of syntax highlighting on the web,4 but I've still kept my eye out for the chance to use tree-sitter instead.

Last weekend while scrolling through some quieter feeds in my RSS reader, I came across an article which might be the something better I was looking for.

fasterthanli.me

Introducing arborium, a tree-sitter distribution

About two weeks ago I entered a discussion with the docs.rs team about, basically, why we have to look at this: When we could be looking at this: And of course, as always, there are reasons why thi...

Arborium is a high-performance syntax highlighting tool powered by tree-sitter created by Amos Wenger. Amos (also known as fasterthanlime) is a long-time open source developer who I greatly respected. I learned Rust from his Advent of Code article series, and I appreciate his commitment to correctness and speed. I was especially excited to learn about Arborium because it was designed to work on the web using Javascript. I could use this!


Trapped in the Arborium

I started writing code to integrate it into my site immediately and had a plugin ready within an hour or so. Here’s the relevant code (edited for clarity):

codeElements.forEach(async (element: Element) => {
	const programmingLanguage = detectLanguage(element);
	// highlight is the all-in-one function from arborium that does all the real work
	const highlightedText = await highlight(programmingLanguage, element.textContent);
	element.innerHTML = highlightedText;
});

I tried building the site and...

Terminal screenshot. Reads: Error highlighting code block in /posts/Accessible fancy text for all.md: ReferenceError: window is not defined

Ouch... It didn’t work, but this is a simple problem. window is a global object that can be accessed anywhere in the browser because only the browser has a window. It doesn’t exist if you’re running Javascript code outside of the browser like with Deno.5 And if you try to use window then you’re advised to replace it.

A code snippet using window. Deno is saying "Window is no longer available in Deno. Instead, use globalThis."

I read through Arborium’s Javascript source code and found out that, as part of setup, highlight directly calls some code that tries to access window. No worries, there’s a more direct way of highlighting code that circumvents highlight’s setup phase. I’ll do that instead

codeElements.forEach(async (element: Element) => {
	const programmingLanguage = detectLanguage(element);
	// const highlighted = await highlight(lang, element.textContent);
	
	// loadGrammar tells Arborium to load the language you want to use.
	const languageGrammar = await loadGrammar(programmingLanguage);
	const highlightedText = languageGrammar.highlight(element.textContent);
	element.innerHTML = highlightedText;
});

And then I build my site again, and...

Terminal screenshot. Reads: Failed to load grammar 'html': TypeError: Only file and data URLs are supported by the default ESM loader. Received protocol 'https'

Ough... It didn’t work. I looked into it and this might be a Deno issue, which is less well-supported than the more commonly used Node. Arborium also appears to be doing some hacky dynamic code importing that isn’t playing nice with the way Deno expects imports to work. I haven’t tested this in Node, so maybe it works better there. Regardless, I’ve read enough of the source code to have learned that Arborium has some completely undocumented6 configuration options that would let me replace its dynamic code importing code with my own, so I guess I can do that.

codeElements.forEach(async (element: Element) => {
	const programmingLanguage = detectLanguage(element);
	
	// loadGrammar tells Arborium to load the language you want to use.
	const languageGrammar = await loadGrammar(programmingLanguage, {
		resolveJs: ({ programmingLanguage}: ResolveArgs) => (
			// Deno-specific dynamic imports to make the dang thing work 
			import(`npm:@arborium/${programmingLanguage}`)
		)
	});
	
	const highlightedText = languageGrammar.highlight(element.textContent);
	element.innerHTML = highlightedText;
});

That should be everything. In theory, I’ve worked around all these tiny little bugs and now I’m on the easy street of straightforward code that just works.

It should work. I should be done.

Terminal screenshot. Reads: [arborium] Grammar 'html' loaded successfully. Then it shows a bunch of pending promises. Then it says: error: Uncaught ReferenceError: window is not defined

I’m back at the first bug.

So here I’m stuck. I try to work around the code that uses window and I run into issues with imports, then I try to work around imports and I run back into issues with window. There’s only one option left, and that’s to file some issues on the GitHub code repository for Arborium and wait for Amos to fix them.

Filing issues

I file two issues, one at Sunday night and the other on Monday morning. About an hour after the second issue, Amos responds saying he’s got a completed pull request7 that fixes all the problems I was running into. This seems like a quick turnaround for some environment-specific bugs, but he’s also a pretty good developer who’s been working on this for much longer than I have. Perhaps his experience meant he could quickly clock what the problem was and fix it, but I then open the PR and find my greatest fears realized.

A GitHub pull request displaying a summary, code snippet, and test plan. Summary describes replacing window with globalThis and introduces a registerGrammar API, the code snippet shows the usage for registerGrammar, finally, there's a test plan to verify it works, and mentions my two issues as fixed. The text reads as strongly AI generated.


You see, this whole time I’ve been misleading you. While I was trying to debug all these simple yet awkward bugs, a sort of dread was building up in the back of my mind. I was starting to get this feeling that Arborium might be almost completely written by AI.

To demonstrate what I mean by getting a feeling, let’s look at the Arborium website. It’s a nice-looking website, but if you look a little closer you’ll notice some inconsistencies: Arborium’s copy has a few, but not many, AI tells;8 some incorrect or outdated links; all code blocks except the “hero image” code block lack highlighting, which means they’re not formatted in a way that Arborium would recognize (something I would avoid if I were trying to show off my syntax highlighting tool); and, most importantly, there’s a complete lack of documentation. You’re given steps on how to use Arborium in simple use cases, but you’re completely fucked the moment you step outside the golden path, leaving you with no recourse except to read the source code. As you saw earlier, this is what happened to me.

This all added up to this strong AI “vibe”, but I wasn’t looking for it at the time. I had heard some time ago that Amos was dabbling with AI, so I didn’t come in expecting pristine, exclusively human-written code. But, I also did not expect the rot to go this deep. I suspect that the Arborium website and codebase are primarily AI; although I doubt either Amos or I have any way of confirming or denying the percentage of code that’s AI-generated.

This, along with some recent drama I learned about, led me to pass on using Arborium. Even with the bug fixes, I would rather go back to my Lezer integration.

The recent drama

This was not happening entirely in isolation. As I am wont to do, I was bitching about being unable to make Arborium work to my friend Damien. He said that he was unsurprised by the use of AI in Arborium ever since a month ago, when Amos accused zkat (the maker of the miette error-handling Rust library) of “witch hunting” after zkat added Amos to a list called “open slopware”, which I have heard was meant to list software and developers that use AI. Perhaps in part due to Amos’ comments (I am not entirely aware of the timetable), “open slopware” got a lot of backlash, which led to zkat receiving a deluge of harassment, which resulted in her announcing her leave from the open source community the day after Amos’ accusation. At the same time, Amos ripped miette out from all of their open source projects and vibe coded a replacement.

This drama is not the most relevant to Arborium as a project, and I’m not too bothered by Amos replacing a dependency for personal reasons,9 but I find it to be a bit childish to make AI write a replacement for a significant dependency for all your open source projects in such a short period of time. At least treat the process of replacing this dependency with the gravitas it deserves to ensure that the end user of the library doesn’t have a degraded experience from your drama.

Back to Lezer

While returning to Lezer took no effort, I could apply the lessons I learned from integrating Arborium to improve my Lezer plugin.10 Doing this saved about 100 lines of code and greatly simplified the logic. Arborium still had some features that my own plugin lacked, like using custom HTML tags to mark up the code to reduce file sizes, but it would be trivial to implement them myself.

I have come away from this with a newfound appreciation for Lezer. While it has some issues, it also has real documentation, a similar level of power to tree-sitter (with minimal concessions made for the limitations of the web), and is easy to work with. The most complicated code that I needed to make Lezer work is still simple enough to be embedded in a blog post. (It was, in fact, embedded in Joel Gustafson's Syntax Highlighting on the Web.) The only trade-off I’m making is an increased difficulty in using off-the-shelf coding themes, but my blog uses a custom-built coding theme, so that’s not a problem for now. It was also recommended by the Xi-Editor guy, if that’s worth anything.

Out of an abundance of caution, I have reached out to the developer of Lezer, Marijn Haverbeke, on whether they used AI in their code. Here is their response:

No, I don’t use language models and I’ve been updating my contribution guides to forbid slop code in pull requests.


But does Arborium work?

Even though I have moved away from Arborium due to my own personal distaste of AI-“enhanced” development, this is not something a developer with weaker moral convictions would care about. Amos fixed the bugs! They even implemented manually importing programming language grammars, something that I off-handedly mentioned that I would appreciate. If you didn’t care about any of the other drama, this sounds unambiguously good. I thought it would be prudent to see for myself before publishing this blog post, so I updated all my code to match what was described in the PR:

// Deno has its own method for reading files, but it’s what the PR said to use.
import { readFile } from "node:fs/promises";
import * as htmlGrammar from "https://cdn.jsdelivr.net/npm/@arborium/[email protected]";
import * as cssGrammar from "https://cdn.jsdelivr.net/npm/@arborium/[email protected]";

const programmingLanguages: Record<string, unknown> = {
	html: htmlGrammar,
	css: cssGrammar,
};

// The PR said to import the wasm from the node modules folder, which Deno lacks.
// I had to download it myself from jsdelivr.
const wasmFiles: Record<string, unknown> = {
	html: await readFile("./helpers/arborium/html_grammar_bg.wasm"),
	css: await readFile("./helpers/arborium/css_grammar_bg.wasm"),
};

codeElements.forEach(async (element: Element) => {
	const programmingLanguage = language(element);

	const languageGrammar = await registerGrammar(
	  programmingLanguages[programmingLanguage],
	  wasmFiles[programmingLanguage] as any, // this was the only way I could make it work
	);
	const highlightedText = await languageGrammar.highlight(element.textContent);
	element.innerHTML = highlightedText;
});

This is so much more complicated and hacky than my updated Lezer plugin. Even if it works, I would not want to use this and it would feel too brittle to not feel like my blog would break at any moment, but I’m trying to roughly match what the pull request says to do. I build, and...

Failed to load host: TypeError: [ERR_UNSUPPORTED_ESM_URL_SCHEME] Only file and data URLs are supported by the default ESM loader. Received protocol 'https'

I guess I shouldn’t be surprised.

Footnotes

  1. Syntax highlighting is just highlighting parts of code to make it more aesthetically pleasing and easier to read. In other words, it’s when the code has pretty colors attached to it.

  2. Which is built with Lume! A really great static site generator inspired by 11ty that manages to balance power with ease of use. I don’t think any other static site generator would be simple enough and well documented enough for me to build my own plugins like this.

  3. Lezer is also what powers Codemirror. If you don’t know what that is, it’s a code editor that runs in the browser. You’ve probably seen it before, since it’s used in everything from Chrome DevTools to the Obsidian note-taking app.

  4. In Lezer’s own words, “Unfortunately, tree-sitter is written in C, which is still awkward to run in the browser (and CodeMirror targets non-WASM browsers). It also generates very hefty grammar files because it makes the size/speed trade-off in a different way than a web system would.”

  5. This also applies to other non-browser Javascript runtimes, like Bun and Node.

  6. This does not count as documentation. A screenshot from the Arborium website. It reads: Grammars are loaded on-demand from jsDelivr (configurable).

  7. A way for a developer to notify other developers that they have completed a feature.

  8. What I've noticed is its use of the royal "we" and also some catchphrases like "that one's hard" and some other common AI marketing-esque phrases. I don't really see any of these used on other syntax highlighting websites in the same way that Arborium uses them.

  9. It could be argued that this blog post is a lengthy justification for removing Arborium from my site for personal reasons.

  10. I also turned it from a Rehype plugin to a regular Lume plugin! This is not faster since Lume renders posts concurrently, so maybe I shouldn't do it, but it does feels simpler and it should take less work to bring it up to feature parity.