+0.29 Calls between JavaScript and WebAssembly are finally fast (hacks.mozilla.org S:+0.17 )
907 points by lainon 2699 days ago | 143 comments on HN | Mild positive Editorial · v3.7 · 2026-02-28 09:23:36
Summary Knowledge & Technical Empowerment Advocates
This Mozilla technical blog post explains WebAssembly-JavaScript function call optimization in Firefox, demonstrating strong alignment with Article 19 (freedom of information), Article 26 (right to education), and Article 27 (participation in scientific culture). The content advocates for open web development and technical knowledge democratization through pedagogically sound, freely accessible explanation of complex engine internals. The article supports developer empowerment while maintaining institutional commitment to public-interest technology, though site-level analytics tracking introduces a privacy tension.
Article Heatmap
Preamble: +0.12 — Preamble P Article 1: ND — Freedom, Equality, Brotherhood Article 1: No Data — Freedom, Equality, Brotherhood 1 Article 2: ND — Non-Discrimination Article 2: No Data — Non-Discrimination 2 Article 3: ND — Life, Liberty, Security Article 3: No Data — Life, Liberty, Security 3 Article 4: ND — No Slavery Article 4: No Data — No Slavery 4 Article 5: ND — No Torture Article 5: No Data — No Torture 5 Article 6: ND — Legal Personhood Article 6: No Data — Legal Personhood 6 Article 7: ND — Equality Before Law Article 7: No Data — Equality Before Law 7 Article 8: ND — Right to Remedy Article 8: No Data — Right to Remedy 8 Article 9: ND — No Arbitrary Detention Article 9: No Data — No Arbitrary Detention 9 Article 10: ND — Fair Hearing Article 10: No Data — Fair Hearing 10 Article 11: ND — Presumption of Innocence Article 11: No Data — Presumption of Innocence 11 Article 12: -0.08 — Privacy 12 Article 13: ND — Freedom of Movement Article 13: No Data — Freedom of Movement 13 Article 14: ND — Asylum Article 14: No Data — Asylum 14 Article 15: ND — Nationality Article 15: No Data — Nationality 15 Article 16: ND — Marriage & Family Article 16: No Data — Marriage & Family 16 Article 17: ND — Property Article 17: No Data — Property 17 Article 18: +0.16 — Freedom of Thought 18 Article 19: +0.50 — Freedom of Expression 19 Article 20: ND — Assembly & Association Article 20: No Data — Assembly & Association 20 Article 21: ND — Political Participation Article 21: No Data — Political Participation 21 Article 22: ND — Social Security Article 22: No Data — Social Security 22 Article 23: +0.16 — Work & Equal Pay 23 Article 24: ND — Rest & Leisure Article 24: No Data — Rest & Leisure 24 Article 25: ND — Standard of Living Article 25: No Data — Standard of Living 25 Article 26: +0.50 — Education 26 Article 27: +0.32 — Cultural Participation 27 Article 28: ND — Social & International Order Article 28: No Data — Social & International Order 28 Article 29: ND — Duties to Community Article 29: No Data — Duties to Community 29 Article 30: ND — No Destruction of Rights Article 30: No Data — No Destruction of Rights 30
Negative Neutral Positive No Data
Aggregates
Editorial Mean +0.29 Structural Mean +0.17
Weighted Mean +0.28 Unweighted Mean +0.24
Max +0.50 Article 19 Min -0.08 Article 12
Signal 7 No Data 24
Confidence 15% Volatility 0.20 (Medium)
Negative 1 Channels E: 0.6 S: 0.4
SETL +0.14 Editorial-dominant
FW Ratio 54% 21 facts · 18 inferences
Evidence: High: 2 Medium: 4 Low: 1 No Data: 24
Theme Radar
Foundation Security Legal Privacy & Movement Personal Expression Economic & Social Cultural Order & Duties Foundation: 0.12 (1 articles) Security: 0.00 (0 articles) Legal: 0.00 (0 articles) Privacy & Movement: -0.08 (1 articles) Personal: 0.16 (1 articles) Expression: 0.50 (1 articles) Economic & Social: 0.16 (1 articles) Cultural: 0.41 (2 articles) Order & Duties: 0.00 (0 articles)
HN Discussion 20 top-level · 22 replies
freecodyx 2018-10-08 16:19 UTC link
some people are just good with explaining stuff,
mmastrac 2018-10-08 16:20 UTC link
Kudos to the author of this post - it takes a lot of skill to explain complex concepts like this, let alone in plain enough english that someone not skilled in the art could follow along.

WebAssembly is one of those technologies where we haven't seen the true extent of its capabilities yet. This is an exciting time to be working in browsers.

merhard 2018-10-08 16:22 UTC link
wasted opportunity to mention apple pie in the example function.
jokoon 2018-10-08 16:23 UTC link
Function calls from WASM to JS don't seem to have improved so much.

I don't know what I want more, DOM calls from WASM, or C++ modules. A web without javascript would be welcome.

Ooveex2C 2018-10-08 16:37 UTC link
Do wasm -> builtin calls, e.g. DOM methods still call the JS code if JS code has been monkey-patched?

E.g. if userscript replaces the built-in window.fetch() API to modify page behavior will wasm also be intercepted?

bluejekyll 2018-10-08 16:37 UTC link
Very exciting! And really amazing work. It appears that WASM, at least in Firefox, is now going to be on par with JS in terms of performance when calling other JS facilities. Those comparison times are quite impressive.

I think the thing I found most exciting is at the end: “WebAssembly is getting more flexible types very soon. Experimental support for the current proposal is already landed in Firefox Nightly.” Implication being that WASM will have native access to the DOM.

I think at that point WASM could be used to fully work with the DOM with no negative costs, right?

writepub 2018-10-08 16:58 UTC link
I hope the chrome team is looking at this too, with 65+% market share, it'll be real impactful when chrome makes similar optimizations.
infogulch 2018-10-08 17:09 UTC link
Editing note: the first sentence under "Optimizing JavaScript » WebAssembly calls" seems to be repeated twice with different phrasings.
finchisko 2018-10-08 17:49 UTC link
Lin is awesome, but reading this nice article I have one noob question.

> We took the code that C++ was running — the entry stub — and made it directly callable from JIT code. When the engine goes from JavaScript to WebAssembly, the entry stub un-boxes the values and places them in the right place. With this, we got rid of the C++ trampolining.

So they replaced unboxing C++ trampoline with entry stub. But isn't that stub technically written in C++ too?

twoodfin 2018-10-08 17:50 UTC link
I’m a little surprised that making cross-language inlining trivial wasn’t (apparently) a design goal of the original WASM spec.

(Maybe it’s functionally easy but getting the heuristics right is hard? Curious what the primary obstacles are for Mozilla or others.)

huang47 2018-10-08 18:02 UTC link
Lin is amazing. I do enjoy reading her posts and learn a lot from them.
markdog12 2018-10-08 18:21 UTC link
Another interesting flag I found was javascript.options.wasm_cranelift, which enables a WASM code generator written in Rust: https://github.com/CraneStation/cranelift
skrowl 2018-10-08 18:29 UTC link
Looking forward to testing this with Blazor. This was the biggest problem currently.
steipete 2018-10-08 18:30 UTC link
You can see the difference in the WebAssembly Benchmark: http://iswebassemblyfastyet.com
benjaminjackman 2018-10-08 18:57 UTC link
While searching for more information on a configuration value mentioned in the article (javascript.options.wasm_gc) I came across another article on the topic, which I also found interesting because it's a bit more technical:

https://blog.benj.me/2018/07/04/mozilla-2018-faster-calls-an...

catchmeifyoucan 2018-10-08 19:58 UTC link
This was explained really well! I feel more knowledgeable now.
DonHopkins 2018-10-08 21:41 UTC link
Firefox loads and runs Unity3D WebGL apps MUCH faster than Chrome.

The point of UnityJS is to tightly and efficiently integrate Unity3D and JavaScript, so it does a lot of JavaScript <=> C# calls, and I'm looking forward to it getting even faster!

https://github.com/SimHacker/UnityJS

You can pass delegates to C# functions that are directly callable into JavaScript using some magic PInvoke attributes and the Unity Runtime.dynCall function.

Declare a delegate that describes the signature of your C# function you want to call from JavaScript:

https://github.com/SimHacker/UnityJS/blob/master/UnityJS/Ass...

    public delegate int AllocateTextureDelegate(int width, int height);
Then declare a C# static method with the MonoPInvokeCallback attribute, to implement you C# function:

https://github.com/SimHacker/UnityJS/blob/master/UnityJS/Ass...

    [MonoPInvokeCallback(typeof(AllocateTextureDelegate))]
    public static int AllocateTexture(int width, int height) { ... }
Then pass those specially marked delegates to JavaScript and stash them in JS variables when you initialize (it doesn't work unless you use the magic MonoPInvokeCallback attribute):

https://github.com/SimHacker/UnityJS/blob/master/UnityJS/Ass...

    [DllImport(PLUGIN_DLL)]
    public static extern void _UnityJS_HandleAwake(AllocateTextureDelegate allocateTextureCallback, FreeTextureDelegate freeTextureCallback, LockTextureDelegate lockTextureCallback, UnlockTextureDelegate unlockTextureCallback);
https://github.com/SimHacker/UnityJS/blob/master/UnityJS/Ass...

    public override void HandleAwake()
    {
        //Debug.Log("BridgeTransportWebGL: HandleAwake: this: " + this + " bridge: " + bridge);

        _UnityJS_HandleAwake(
            AllocateTexture,
            FreeTexture,
            LockTexture,
            UnlockTexture);
    }
In the awake function on the JavaScript side of your Unity WebGL extension (a .jslib file), wrap the C# delegate in a JavaScript thunk that calls into it via Runtime.dynCall:

https://github.com/SimHacker/UnityJS/blob/master/UnityJS/Ass...

    // Called by Unity when awakened.
    _UnityJS_HandleAwake: function _UnityJS_HandleAwake(allocateTextureCallback, freeTextureCallback, lockTextureCallback, unlockTextureCallback)
    { [...]
        function _UnityJS_AllocateTexture(width, height)
        {
            //console.log("UnityJS.jslib: _UnityJS_AllocateTexture: width: " + width + " height: " + height + " allocateTextureCallback: " + allocateTextureCallback);
            var result = Runtime.dynCall('iii', allocateTextureCallback, [width, height]);
            //console.log("UnityJS.jslib: _UnityJS_AllocateTexture: result: " + result);
            return result;
        };
        window.bridge._UnityJS_AllocateTexture = _UnityJS_AllocateTexture;
Then you can call the C# method from JavaScript:

https://github.com/SimHacker/UnityJS/blob/f0a4e1fb07fd9e8aab...

    params.cache.backgroundSharedTextureID = id = 
        window.bridge._UnityJS_AllocateTexture(params.width, params.height);
This is zillions of time faster and more flexible than using Unity's terrible SendMessage technique to send messages from JS=>C#, whose only parameter is a single string, and which inefficiently dispatches messages by looking up Unity objects by name, and is asynchronous and can't return a result.

I use this technique to efficiently copy binary textures and arrays of numbers between JavaScript and C#. MUCH better than serializing it as JSON, or base 64 encoded PNG files in a data: url (yuck!).

https://github.com/SimHacker/UnityJS/blob/674eda49be12a70812...

    function DrawToCanvas(params, drawer, success, error)
    { [...]

                    var id = params.pie.backgroundSharedTextureID;
                    if (!id) {
                        params.pie.backgroundSharedTextureID = id = 
                            window.bridge._UnityJS_AllocateTexture(params.width, params.height);
                        //console.log("game.js: DrawToCanvas: WebGL: AllocateTexture: width: " + params.width + " height: " + params.height + " id: " + id);
                    }
                    var imageData =
                        context.getImageData(0, 0, params.width, params.height);
                    window.bridge._UnityJS_UpdateTexture(id, imageData);
                    texture = {
                        type: 'sharedtexture',
                        id: id
                    };
                    success(texture, params);
                    canvasNode.parentNode.removeChild(canvasNode);
This lets me draw 2D user interface stuff, pie charts, diagrams, data visualizations, etc, in JavaScript with canvas, d3, or whatever library I like, and then efficiently use those images in Unity3D as user interface overlays, 3D textures, etc. It works great, and it's smooth and interactive, mixing up 2D canvas graphics with 3D Unity stuff!

Unity is sorely lacking a decent 2D drawing library like canvas, not to mention fancy stuff built on top of it like d3.

I'm currently working on the plumbing to send binary arrays of floats from JavaScript to Unity, so I can pass them right into shaders!

Here's some discussion about the magic MonoPInvokeCallback attribute:

https://forum.unity.com/threads/monopinvokecallback-in-unity...

And about Unity.dyncall and the WebGL runtime:

https://forum.unity.com/threads/c-jslib-2-way-communication....

and:

https://forum.unity.com/threads/super-fast-javascript-intera...

nikeee 2018-10-08 22:41 UTC link
Did anyone re-implement the basic React API surface, using Wasm as a backend for the Virtual DOM? To me, it sounds like this would be an interesting project.
NVRM 2018-10-08 22:47 UTC link
« ... calls between JS and WebAssembly are faster than non-inlined JS to JS function calls. »

Good note taken.

lemmyg 2018-10-09 04:23 UTC link
Exposing Web APIs (e.g. DOM) to WASM and projecting them into native languages seems like it overlaps a lot with defining actual native API projections that would be shared between browser implementations.

It doesn't read like this is an explicit goal of the project, but are we going to get this by accident? Being able to use the same X code (where X is your favourite statically-compilable language) to generate both a WASM version that runs on the web and a statically-compiled version that links to the Y browser source (where Y can be whichever browser works for you because they all support the same native API) would be awesome.

nkozyra 2018-10-08 16:28 UTC link
> A web without javascript would be welcome.

Why? What is it that wasm or c++ provides you in making a DOM call that modern JS does not?

joshmarinacci 2018-10-08 16:33 UTC link
Yep. Lin is amazing.
symboltoproc 2018-10-08 16:40 UTC link
This definitely deserves praise.
jandem 2018-10-08 16:47 UTC link
> Function calls from WASM to JS don't seem to have improved so much.

Yeah, Wasm => JS calls used to be reasonably fast because we had optimized that before. The work described here made that path much nicer, though (a more unified stack layout for JIT/Wasm frames) and also a bit faster still.

JS => Wasm calls being slow was one of the big performance cliffs in SpiderMonkey and I'm really glad that's fixed now.

markharper 2018-10-08 16:49 UTC link
Almost, that will set the foundation for fully using the DOM APIs. The host bindings proposal mentioned at the end of the article should close the gap.
rayiner 2018-10-08 17:06 UTC link
Don’t get me wrong this is a great article. But I found the analogy with the people and pieces of paper a bit hard to read. (The analogy with the people made me think the author was talking about some sort of prototype delegation chain, https://giamir.com/alternative-patterns-in-JS-OLOO-style, rather than nested function calls.) Who is clicking on this but doesn’t know what a stack frame is?
fucking_tragedy 2018-10-08 17:17 UTC link
It was well written, but throughout the entire article I was hoping I'd learn what this thing was and why it was represented this way[1].

[1] On the right: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/fil...

andhow 2018-10-08 17:26 UTC link
At the moment, wasm can only call functions that were passed as values of the import object which is passed to to one of the instantiation functions (e.g. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...), so which function gets called is up to the embedding JS code.
flohofwoe 2018-10-08 17:26 UTC link
Timing for calls from WASM to JS went from 750ms to 450ms for 100 million calls, so from 7.5 nanoseconds per call to 4.5 nanoseconds per call.

A 3 GHz CPU would do 3 ticks per nanoseconds, doing such a bridging call in 23 or 15 CPU ticks is quite good IMHO (I just hope I didn't blunder the math, but function call overhead from WASM to JS isn't much of an issue, it was already fast after the previous round of optimizations).

bayesian_horse 2018-10-08 17:42 UTC link
At the moment I don't think there is a frontend language/framework which compiles to WASM and is actually worth using, at least from a perspective of frontend productivity. For performance or porting legacy code, WASM is already useful.

I mean, yes, there are things like Blazor or similar things for Rust or Nim, but these aren't yet compelling to me.

eridius 2018-10-08 18:21 UTC link
It's not clear to me why calling into C++ is expensive to begin with. My best guess is it has to do with switching to a native stack (switching "folders"). So making the stub directly callable from the JIT means not having to change activations. Also presumably it uses the parameter passing conventions and semantics of all other JIT functions (whereas with a C++ function it presumably has to marshal the parameters to the function).
aaronblohowiak 2018-10-08 18:30 UTC link
singularity2001 2018-10-08 19:26 UTC link
maybe the most important improvement will be direct memory access to the canvas bitmaps for super fast game rendering.
bzbarsky 2018-10-08 20:15 UTC link
Based on a quick look through https://bugzilla.mozilla.org/show_bug.cgi?id=1319203 it looks like the entry stub is generated by the JIT itself. So no, the entry stub is not written in C++. It gets output by the JIT as part of the generated jitcode.

Specifically, see the GenerateJitEntry bits in https://bug1319203.bmoattachments.org/attachment.cgi?id=8949... -- the masm.whatever() calls are calls into an architecture-dependent assembler that will output the relevant machine instructions.

There is still an out-of-line codepath that does call into a C++-implemented entry stub in some cases when the argument conversions involved are too complicated to do them directly in the JIT-generated code.

opencl 2018-10-08 20:45 UTC link
On my machine I got,

Firefox WASM: 1809ms

Chrome WASM: 2855ms

Edge WASM: 12872ms

Firefox JS: 5413ms

Chrome JS: 4779ms

Edge JS: 8512ms

lossolo 2018-10-08 21:37 UTC link
Chrome linux 11835

Firefox linux 2132

officialchicken 2018-10-08 21:47 UTC link
Chrome linux (v69.0.3497.81) 4916

Firefox linux (v62.0.3)1904

notriddle 2018-10-08 21:54 UTC link
The article pretty much described what the big obstacle was: boxing. If WASM had boxing, then it wouldn't be any faster than JavaScript and there'd be no point. Since JavaScript requires boxing, there's no way to avoid the impedance mismatch at the boundary between them, and a JIT that wants to support both has to be aware of both boxed and unboxed numbers.

The WASM spec already tries to avoid pretty much every other big problem that would've confounded attempts to cross-language inline. For example, WASM requires structured control flow (IOW, WASM doesn't have `goto`), avoids type punning in favor of a reinterpret primitive, uses function addresses that are orthogonal to memory addresses, and allows non-deterministic floating point bit representations, all to match up closer with the way existing JavaScript JITs already work. But they can't do anything about boxing without either breaking the web or making WebAssembly essentially a binary encoding of the JavaScript language.

dstaley 2018-10-09 01:10 UTC link
Not totally the same, but Blazor[1] is a similar framework powered by dotnet on wasm. As a React dev, looking at a Blazor component feels very familiar. I'd love to see something implemented in Go or another language without all the extra baggage dotnet comes with currently.

[1] https://blazor.net

m_eiman 2018-10-09 04:55 UTC link
iPad Pro 9,7 (2016), iOS 12: 19542.
bnjbvr 2018-10-09 08:59 UTC link
Good find! At the moment it is very very experimental and you might experience crashes and slowdowns if you're using it in place of the regular flags (that is why it is enabled only on Nightly builds and will not be enabled on Beta/Release for a while). We'll make sure to talk about it when the right time has come.
repolfx 2018-10-09 11:13 UTC link
It's pretty hard to do well. If you look at Graal, a lot of the cutting edge research work they've done is about how to do cross-language inlining and subsequent optimisations better. It's more of a function of the JIT compiler design than language or bytecode specs though.
Editorial Channel
What the content says
+0.50
Article 19 Freedom of Expression
High Advocacy Framing Practice Coverage
Editorial
+0.50
SETL
0.00

Article extensively documents technical knowledge without paywall, explaining WebAssembly optimization mechanisms in accessible detail. Clear information seeking/sharing framing throughout.

+0.50
Article 26 Education
High Advocacy Practice
Editorial
+0.50
SETL
0.00

Article explicitly educates readers through pedagogical explanation of technical concepts, with step-by-step reasoning, metaphors, and examples accessible to learners at different skill levels.

+0.40
Article 27 Cultural Participation
Medium Advocacy Framing
Editorial
+0.40
SETL
+0.28

Article participates in technical and scientific culture by documenting engineering advancement, crediting contributors, and contributing to collective knowledge about how engines work.

+0.20
Preamble Preamble
Medium Framing
Editorial
+0.20
SETL
+0.20

Mozilla mission statement frames technology optimization as enabling progress, implicitly supporting universal access to improved tools.

+0.20
Article 18 Freedom of Thought
Medium Advocacy
Editorial
+0.20
SETL
+0.14

Article presents technical ideas and knowledge transparently, supporting freedom of thought and intellectual exchange.

+0.20
Article 23 Work & Equal Pay
Low Advocacy
Editorial
+0.20
SETL
+0.14

Article indirectly supports right to work by documenting improvements to developer tools and performance, enabling better work output for tech workers.

0.00
Article 12 Privacy
Medium Practice
Editorial
0.00
SETL
+0.20

Article content does not discuss privacy rights or protections.

ND
Article 1 Freedom, Equality, Brotherhood

Not observable.

ND
Article 2 Non-Discrimination

Not observable.

ND
Article 3 Life, Liberty, Security

Not observable.

ND
Article 4 No Slavery

Not observable.

ND
Article 5 No Torture

Not observable.

ND
Article 6 Legal Personhood

Not observable.

ND
Article 7 Equality Before Law

Not observable.

ND
Article 8 Right to Remedy

Not observable.

ND
Article 9 No Arbitrary Detention

Not observable.

ND
Article 10 Fair Hearing

Not observable.

ND
Article 11 Presumption of Innocence

Not observable.

ND
Article 13 Freedom of Movement

Not observable.

ND
Article 14 Asylum

Not observable.

ND
Article 15 Nationality

Not observable.

ND
Article 16 Marriage & Family

Not observable.

ND
Article 17 Property

Not observable.

ND
Article 20 Assembly & Association

Not observable.

ND
Article 21 Political Participation

Not observable.

ND
Article 22 Social Security

Not observable.

ND
Article 24 Rest & Leisure

Not observable.

ND
Article 25 Standard of Living

Not observable.

ND
Article 28 Social & International Order

Not observable.

ND
Article 29 Duties to Community

Not observable.

ND
Article 30 No Destruction of Rights

Not observable.

Structural Channel
What the site does
Element Modifier Affects Note
Privacy +0.15
Article 12
Site implements Google Analytics and GTM tracking with UTM parameter removal utility, indicating awareness of privacy concerns but continued analytics deployment.
Terms of Service
Terms of service not observable in provided content.
Accessibility +0.10
Article 2 Article 19
Standard WordPress accessibility CSS classes present (wp-block structure), indicating baseline accessibility standards.
Mission +0.20
Article 19 Article 27
Mozilla's stated mission around open web and developer empowerment aligns with knowledge-sharing and technical security education.
Editorial Code +0.05
Article 19
Technical blog format with clear author attribution and date stamps supports editorial transparency.
Ownership +0.10
Article 19
Mozilla Foundation ownership as non-profit organization supports commitment to public interest over profit-driven content.
Access Model +0.15
Article 26
Open access technical content published without paywall or registration barrier.
Ad/Tracking -0.10
Article 12
Google Analytics and GTM tracking present on page reduces privacy score despite Mozilla's privacy advocacy.
+0.50
Article 19 Freedom of Expression
High Advocacy Framing Practice Coverage
Structural
+0.50
Context Modifier
ND
SETL
0.00

Open access publication model, transparent authorship, dated content, searchable/indexable, comments enabled for reader discourse.

+0.50
Article 26 Education
High Advocacy Practice
Structural
+0.50
Context Modifier
ND
SETL
0.00

Free access to educational content with clear learning progression supports equitable access to technical education.

+0.20
Article 27 Cultural Participation
Medium Advocacy Framing
Structural
+0.20
Context Modifier
ND
SETL
+0.28

Published through institutional venue (Mozilla) that supports scientific knowledge sharing.

+0.10
Article 18 Freedom of Thought
Medium Advocacy
Structural
+0.10
Context Modifier
ND
SETL
+0.14

Open publication and clear author attribution enable thought expression without gatekeeping.

+0.10
Article 23 Work & Equal Pay
Low Advocacy
Structural
+0.10
Context Modifier
ND
SETL
+0.14

Open knowledge about tool optimization supports worker capability development.

0.00
Preamble Preamble
Medium Framing
Structural
0.00
Context Modifier
ND
SETL
+0.20

Page structure reflects Mozilla Foundation's commitment to public-interest technology through open publication model.

-0.20
Article 12 Privacy
Medium Practice
Structural
-0.20
Context Modifier
ND
SETL
+0.20

Google Analytics and GTM tracking present on domain reduces privacy affordance (documented in domain context profile).

ND
Article 1 Freedom, Equality, Brotherhood

Not observable.

ND
Article 2 Non-Discrimination

Not observable.

ND
Article 3 Life, Liberty, Security

Not observable.

ND
Article 4 No Slavery

Not observable.

ND
Article 5 No Torture

Not observable.

ND
Article 6 Legal Personhood

Not observable.

ND
Article 7 Equality Before Law

Not observable.

ND
Article 8 Right to Remedy

Not observable.

ND
Article 9 No Arbitrary Detention

Not observable.

ND
Article 10 Fair Hearing

Not observable.

ND
Article 11 Presumption of Innocence

Not observable.

ND
Article 13 Freedom of Movement

Not observable.

ND
Article 14 Asylum

Not observable.

ND
Article 15 Nationality

Not observable.

ND
Article 16 Marriage & Family

Not observable.

ND
Article 17 Property

Not observable.

ND
Article 20 Assembly & Association

Not observable.

ND
Article 21 Political Participation

Not observable.

ND
Article 22 Social Security

Not observable.

ND
Article 24 Rest & Leisure

Not observable.

ND
Article 25 Standard of Living

Not observable.

ND
Article 28 Social & International Order

Not observable.

ND
Article 29 Duties to Community

Not observable.

ND
Article 30 No Destruction of Rights

Not observable.

Supplementary Signals
How this content communicates, beyond directional lean. Learn more
Epistemic Quality
How well-sourced and evidence-based is this content?
0.79 medium claims
Sources
0.8
Evidence
0.8
Uncertainty
0.8
Purpose
0.9
Propaganda Flags
No manipulative rhetoric detected
0 techniques detected
Emotional Tone
Emotional character: positive/negative, intensity, authority
measured
Valence
+0.5
Arousal
0.3
Dominance
0.6
Transparency
Does the content identify its author and disclose interests?
1.00
✓ Author
More signals: context, framing & audience
Solution Orientation
Does this content offer solutions or only describe problems?
0.88 solution oriented
Reader Agency
0.8
Stakeholder Voice
Whose perspectives are represented in this content?
0.50 2 perspectives
Speaks: institution
About: corporationindividuals
Temporal Framing
Is this content looking backward, at the present, or forward?
mixed short term
Geographic Scope
What geographic area does this content cover?
global
Complexity
How accessible is this content to a general audience?
moderate medium jargon general
Audit Trail 15 entries
2026-02-28 12:44 eval_success Lite evaluated: Neutral (0.00) - -
2026-02-28 12:44 eval Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
2026-02-28 12:44 rater_validation_warn Lite validation warnings for model llama-3.3-70b-wai: 0W 1R - -
2026-02-28 12:44 model_divergence Cross-model spread 0.28 exceeds threshold (4 models) - -
2026-02-28 12:39 model_divergence Cross-model spread 0.28 exceeds threshold (4 models) - -
2026-02-28 12:39 eval_success Lite evaluated: Neutral (0.00) - -
2026-02-28 12:39 eval Evaluated by llama-3.3-70b-wai: 0.00 (Neutral)
2026-02-28 12:39 rater_validation_warn Lite validation warnings for model llama-3.3-70b-wai: 0W 1R - -
2026-02-28 12:35 eval_success Lite evaluated: Neutral (0.00) - -
2026-02-28 12:35 rater_validation_warn Lite validation warnings for model llama-4-scout-wai: 0W 1R - -
2026-02-28 12:35 model_divergence Cross-model spread 0.28 exceeds threshold (3 models) - -
2026-02-28 12:35 eval Evaluated by llama-4-scout-wai: 0.00 (Neutral)
2026-02-28 09:23 model_divergence Cross-model spread 0.28 exceeds threshold (2 models) - -
2026-02-28 09:23 eval Evaluated by claude-haiku-4-5-20251001: +0.28 (Mild positive)
2026-02-28 02:00 eval Evaluated by claude-haiku-4-5: 0.00 (Neutral)