JavaScript: Weekly Summary (December 15-21, 2025)
Key trends, opinions and insights from personal blogs
This week felt like walking through a busy street market for JavaScript. Lots of stalls. Some are selling shiny toys, some are selling practical tools, and a few are trying to pick your pocket. I would describe the tone of the posts I read as curious, a bit wary, and quietly confident — like folks who have been around the block and are still excited by small, clever tricks.
Little things that matter: emojis, tiles, and tiny APIs
There were a few posts that focused on the small, delightful bits of front-end work. They don’t make headlines, but they change how a page feels. Take the piece by Vox Silva about custom handshake emojis and zero-width joiners. It’s weirdly satisfying. To me, it feels like fiddling with a pocket watch: the parts are tiny, but when they click together they change the thing’s personality. The post explains how ZWJ (zero-width joiner) lets you build composite emojis — multi-skin-tone handshakes and similar — and then gently points out the rendering limits on iOS/macOS. It’s small-scale Unicode spelunking, but it matters. It matters because these little decisions affect how people see each other online, literally who’s visible.
Then there’s Alex Chan with Truchet tiles in SVG. That one is for people who like geometry and quiet visual surprises. The write-up walks through building tile primitives, tiling patterns, and how to lay them out with JavaScript. I’d say it reads like someone showing you how to knit a scarf with lots of tiny pattern repeats. You don’t need it, but once you see it, you want to try. There are clever nods to Christopher Carlson’s work and ‘winged tiles’ — a neat reminder that even classic math-y toys keep being useful for design work. The examples feel practical: copy, paste, tinker.
A similar small-scale ethos shows up in Chris Ferdinandi writing about his HTML Web Component boilerplate for 2026. It’s opinionated — he leans on connectedCallback() for setup, private instance props, and the handleEvent() pattern. He also calls the shadow DOM an anti-pattern, which is the kind of line that will make some people nod and others roll their eyes. To me it’s honest: the post is for people who want a minimal, readable baseline. Think of it like a tidy kitchen bench — no fancy gadgets, just a clean set of knives and a pan that actually works.
Those small posts share a trait: they give exact, usable hints. Not grand manifestos. Not vaporware. Little wins.
Minimal build, more browser: Preact and the pushback on heavy tooling
Two posts leaned into the idea that you don’t always need a big assembly line to ship good front-end code. Ricardo wrote about using Preact without a build step — including routing and signals. I’d describe that as the kind of reassurance you tell a frenetic junior dev: yes, you can keep it simple. He shows import maps, ES modules, and in-browser routing. The tone is: save the build step for when you actually need it. It’s like taking the bus rather than a private limo when you just need to get downtown.
This links back to Chris Ferdinandi too: small boilerplates, fewer assumptions about toolchains, more explicit patterns. There’s an undercurrent here — a gentle rebellion against tool inflation. People are tired of 400-step setups for a small widget. It’s refreshing. It feels like folks are saying: ship faster, keep it readable, don’t hide the logic behind opaque transforms.
JavaScript and ML: running heavy math in a browser
Big news: the web is getting stronger at doing heavy math. Eric wrote about jax-js — a JAX-like ML library for the browser using WebGPU and Wasm. That one is a clear statement: browsers can be islands that run real ML, with autodiff and JIT. To me, jax-js looks like a portable tool chest; it lets you do experiments in the browser like you used to do them in Python. The post hints at interactive model training, hot reloading, and low-latency editing. Imagine training a small model in the browser while you tweak code — it’s like adjusting the seasoning while the soup is still on the stove.
This is important because it shifts where prototypes and demos happen. Instead of spinning up a cloud instance or shipping a Docker image, you can iterate locally in a browser tab. That changes workflows, especially for teaching, demos, and fast experimentation. It’s also a nudge to think about performance and privacy — running models locally changes the attack surface and the data flows.
LLMs turning devs into hyper-productive, and the moral questions
One of the loudest themes was LLMs accelerating development. Simon Willison tells a crisp story about porting JustHTML from Python to JavaScript in 4.5 hours using Codex CLI and GPT-5.2. The result — justjshtml — passes tests and mirrors the original API. That reads like a demo you show at a barbecue to impress people. It’s fast. It’s almost scary.
But the piece doesn’t just brag about speed. It also wrestles with the ethics. There’s a quiet worry about what rapid, AI-assisted development means for open source and authorship. Simon raises questions about responsibility: who owns the port, who’s credited, and how much human review is needed when models are doing heavy lifting. I’d say the mood is like watching someone use a power saw: it’s impressively quick, but you don’t want fingers near the blade.
That mood echoes in other posts. The ability of LLMs to write, refactor, and port code is now an everyday tool. People are excited, and cautious. There’s a sense of “we can do this,” and also “maybe slow down and think about how.” The tension makes for interesting reading.
Security: the dark mirror — minification, npm, and offensive AI agents
If there’s one theme that produced the most hand-wringing, it’s security. Three posts push hard on this: Martin Alderson’s look at minification and reverse engineering, Bart Wullems’ practical advice on thwarting compromised npm packages, and Sandesh Mysore Anand’s post on building offensive AI security agents.
Martin Alderson’s piece, “Minification isn't obfuscation - Claude Code proves it,” is a bit of a cold shower. He shows how modern agents — LLMs and AST tools — can take minified JS and reconstruct meaningful structure. The idea is simple: minification changes names and whitespace, but not the logic. With AST-aware tools, an agent can quickly find APIs, secrets, or important control flow. It’s like thinking you’ve hidden cash in a fake plant, and someone points out that the plant’s pot has a label with the store receipt. Not great.
This theme leads directly into Bart Wullems’ advice on defending against compromised npm packages. His suggestions are very practical: use npm lock files, consider --ignore-scripts, and use tools like LavaMoat’s allow-scripts to manage lifecycle scripts. That reads as a checklist for locking your doors. The language is prosaic but urgent. Supply-chain attacks are no longer hypothetical. They’re a practical, everyday risk. If you’ve ever had one of those “did I leave the stove on?” moments, that’s the kind of nagging worry Bart channels: don’t assume everything’s safe.
Then Sandesh’s post takes a different slant: build an offensive AI agent to find vulnerabilities in JS. This one is almost a mirror image — use the same AI tools that make things faster to find the holes. He writes about LLMs automating the discovery of API endpoints, fuzzing inputs, and even orchestrating tooling (Langgraph, Claude 3.5). It’s part field guide, part manifesto. It’s also a reminder that tools are neutral: they’ll be used by defenders and attackers alike.
Reading these three in a row is instructive. There’s a pattern: automation speeds everything. That’s exciting. It also reduces the friction for attackers. Which means defenders have to work twice as smart. It’s like the arms race in spy movies: if both sides get better binoculars, hiding becomes harder. Folks are starting to accept that hiding behind minified JS or trusting a dependency chain without strict checks is no longer good enough.
Agents and automation: Claude, GPT, and code agents
A related thread runs through the week: the increasing role of agents and LLMs in software engineering. Not just as coders, but as tools for analysis. Whether it’s Simon porting a parser, Martin analyzing minified code with AST-powered models, or Sandesh building an offensive agent, the message is consistent: agents change the job. The work shifts from typing to supervising, from repetitive detail to higher-level design and review.
I’d say the mood is part exhilaration, part education. People are learning how to integrate these models into pipelines, and they’re also asking how much oversight is required. There’s a new craft emerging: prompt engineering for code, orchestration of multiple agents, and designing tests that catch the weird output LLMs sometimes produce. It’s like moving from hand-washing dishes to operating a dishwasher: you need to load things right, or the machine will just make a mess faster.
IP, ownership, and the social contract
The ethical questions bubble up again when fast porting and automated agents touch open source. Simon’s short port raises tricky issues about attribution and the role of models trained on public code. People are starting to ask whether rapidly generated ports dilute the value of original work, or whether they’re simply another kind of tool-assisted craft. There aren’t clean answers yet. The conversation feels like a pub discussion that will stretch for months: lots of strong opinions, some good points, but no single fix.
Patterns in front-end engineering: boilerplates vs living code
There’s a split in how people recommend building front-end components. On one hand: minimal, explicit patterns and fewer build steps — Ricardo and Chris. On the other: libraries and tools that let you do more in the browser — Preact without a build, jax-js for ML. The balance seems to be: pick simplicity for small projects, pick tools when you need scale. It’s obvious if you say it out loud, but the posts show concrete examples of that trade-off.
Chris’s push against shadow DOM is a nice microcosm of the debate. He calls shadow DOM an anti-pattern in some cases. That’ll annoy proponents who like its encapsulation. But it’s also useful to remember that design choices aren’t religious. They’re trade-offs. Shadow DOM gives encapsulation at the cost of integration friction. Opting out is a valid stance for certain projects. It’s like choosing between a sports car and a station wagon: both have value depending on the grocery run.
Creative and practical takeaways — what I’d try this week
If you’re the tinkering type, a few concrete experiments jump out.
Try jax-js in a simple browser page. Train a tiny model with toy data and tweak a parameter while it runs. It’s a small, fast feedback loop that’s fun and educational. It’s like adjusting the recipe while the cake bakes — only with gradients.
Play with Truchet tiles and SVG. Make a pattern, export a PNG, put it in a header. It’s an easy way to make a site feel unique without heavy assets. It’s crafty and oddly relaxing.
Audit your npm installs. Add lockfiles, flip --ignore-scripts in CI where it’s sensible, and re-evaluate trust. It’s dull, I know, but it’s like changing the batteries in a smoke alarm — not glamorous, but it matters.
If you use LLMs to generate code, add a stage for human review that focuses on security-sensitive areas: secrets, CLI scripts, dependency additions. Don’t skip this. Don’t.
Try a Preact app without the build step for a small project. It’s faster to iterate and you’ll feel lighter.
Points people mostly agreed on
There were a few places where authors seemed to nod along with each other, even if they weren’t quoting each other.
Browser capabilities are expanding. WebGPU and Wasm aren’t toys anymore. People are building real ML tools that run in-browser.
LLMs are changing the tempo of development. They speed up porting, refactoring, and analysis. That’s both a blessing and a risk.
Security is getting harder. Supply-chain and automated analysis make old assumptions unsafe. Minification is not security.
For small projects, less tooling can be a feature not a bug. Keep it simple if that suits your needs.
These are not controversial if you live in the trenches, but seeing them collected across different posts gives you a clearer picture of where practice is moving.
Places where authors push back or disagree
There were also some caustic edges. Chris calling shadow DOM an anti-pattern will spark debate. Martin’s blunt line that minification isn’t obfuscation is a critique that some teams will resist (because minification was often used as a low-cost stopgap). Simon’s quick porting story raises questions about attribution that will keep license lawyers up at night. The disagreements feel healthy. They’re practical, not ideological.
Style notes from the week — how people write about JS now
Writers are shorter. Explanations get to the point faster. There’s more example code, more tests, and more practical guidance. The posts that worked best mixed a few lines of code with a bit of story about why the change matters. Less fluff, more chewable bits.
Also, people are willing to be opinionated. Calling a pattern an anti-pattern, or recommending --ignore-scripts, or saying minification won’t protect you — these are direct calls. The conversation is getting clearer because authors are willing to stake positions.
Final little tangents and curiosities
A few small things stuck out that you might find interesting if you poke further.
The handshake emoji piece felt like a reminder that technical work touches culture. Tiny encoding choices can change how inclusive or clumsy a UI feels. It’s one of those details that’s easy to miss until someone points it out.
The Truchet tile work made me think about backgrounds and visual texture as cheap polish. Designers and engineers can collaborate on small, high-impact things: a patterned header, a unique loading screen, that sort of thing.
The mix of offensive and defensive security posts is important. If you learn how attackers use automation and LLMs, you’ll build better defenses. Reading both sides of that conversation is like reading both a cookbook and a health manual: one shows how to make it taste good, the other shows how to avoid food poisoning.
If any of these threads grab you, the posts are worth a look. They’re practical in different ways: some give you code you can drop in, some give you defensive habits, and some open your eyes to new directions for the browser itself. The links are short, the reads aren’t too long, and each one nudges you to try something small this week. And honestly, sometimes small things are the ones that change how you work the most.