Skip to content

blog: Introducing Xantham - #246

Open
shayanhabibi wants to merge 6 commits into
fable-compiler:devfrom
shayanhabibi:dev
Open

shayanhabibi wants to merge 6 commits into
fable-compiler:devfrom
shayanhabibi:dev

Conversation

@shayanhabibi

@shayanhabibi shayanhabibi commented Sep 22, 2026 •

Copy link
Copy Markdown

Hi!

Wondering if you'd be interested in this blog post on xantham for generating JS/TS bindings?

Let me know if there are any changes that I can make :)

shayanhabibi and others added 6 commits September 22, 2026 12:25
Acting on a critical review of the post. Roughly 570 words of prose removed
(2,357 -> 1,788 total); code blocks and tables unchanged.

Cuts. The opening said what the post was about three times before saying what
Xantham is - slogan, GIF caption, and abstract all carried the same sentence; two
are gone. The "bindings still need review" hedge fired four times and now fires
once, at the close. Table narration, sentences restating the table above them, and
explanations of a thing's significance in place of the thing are gone throughout.

Corrections. The union-arm compile probe ran on net8.0 while the demo targets
net10.0, which readers would have to wonder about. Re-run on net10.0 against
Fable.Core 5.2.0: all five rows reproduce, including `f(!^ x)` beside arms giving
FS0041. Note that ambiguity needs a wide union - a two-arm reproduction resolves
cleanly on both frameworks; the six-arm `TargetsParam` shape is what fails.

The corpus figures (108 goldens, 484/59/57) were Xantham test-suite numbers sitting
unlabelled inside an Anime.js comparison, where they read as Anime.js evidence. Cut.

"so the first error is not a one-line fix" overstated what "18 duplicate
placeholders" supports; deleting 18 lines is not hard. Cut.

The erased-DU rationale argued a `match`-time failure mode against an example
nobody matches on - `StaggerParams.from` is an option-bag input. It now says the
short true thing: Xantham has not yet decided when the DU is safe to emit, and
records `TR006`. Two jabs at Glutinum's module naming that preceded any mention of
Glutinum are also gone.

Moved "Imports have to resolve" ahead of the API-shape sections. A reproducible
ERR_PACKAGE_PATH_NOT_EXPORTED with counts is the strongest evidence in the post and
it was last. The closing caveat stays at the end.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ilure

Second package, measured the same way as animejs. @types/node 22.20.2, same
version both sides.

Glutinum's @types/node binding compiles clean, so the FS0037 duplicate-definition
failure is this package rather than the tool in general. Said so in the compile
section - without it the post implies more than the evidence supports.

Imports split again, from a different cause. All 2,047 of Xantham's import sites
are node:-prefixed. Glutinum emits 2,634, of which 165 point at undici-types, a
types-only package: .d.ts files and nothing else, no index.js, no fetch.js.
Verified with node -e for both that and node:fs.

Bare `fs` resolves as well as `node:fs`, so the prefix alone is not a defect and
the post now says so. The undici-types imports are the finding; the prefix is a
robustness preference.

The animejs FS0037 count was re-derived from a clean 0.14.1 run rather than
carried over. The compiler reports one error because it stops there; scope-aware
analysis of the generated file gives 18 same-scope collisions, each a real
declaration paired with a `type X = obj` placeholder. An earlier sweep said 20 by
missing that `FunctionValue<'T>` and `FunctionValue` are both legal.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…e comparison

The published 569 / 267 / 27 counted `[<Import>]` attributes only. Adding the 9
`[<ImportAll>]` sites and the 3 `animejs/adapters/three` sites gives 578 / 279 / 28,
which is what a clean regeneration on 0.14.1 reproduces.

Extends "Where Glutinum does it better" with the @types/node evidence: 18 more
mixed literal unions (family, BufferEncodingOption, StdioNull), overloads at small
arity where Xantham emits one erased union, and ResizeArray over T[]. Adds the
counterweight so the section is not one-sided.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Seventeen edits, all wording: drop the staccato abstract, say the delegate
once instead of twice, unbold the inline figures, and cut the reflexive
qualifiers ("however", "does record rather than hide", "neither wins",
"not uniformly better") where the sentence already carried the point.
No numbers or claims change.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@MangelMaxime

Copy link
Copy Markdown
Member

Hello @shayanhabibi,

Yes, we can have a blog post for Xantham.

I would like the post to focus on Xantham's own strengths rather than on what Glutinum does differently or does not support yet. Comparisons do not hold over time, for example: the duplicate definition in Animatable is fixed, issue #220 is closed, etc.

The exports map point is fair and still true, we do reach into dist/, and I am planning to look into it.

Would you be up for reframing the post around what Xantham does, with the design decisions behind it?

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants