Update about SageMath-in-Browser 
<https://wangyenshu.github.io/SageMath-in-Browser/> (GitHub repo 
<https://github.com/wangyenshu/SageMath-in-Browser>):

   - Faster Startup: Memory-state downloading now utilizes six threads. 
   This significantly reduces the startup waiting time. On my PC, it takes 
   only 30s~40s to start on Chrome and Firefox.
   - File Transfer Support: You can upload local files to an absolute path 
   in v86 and download files from an absolute path in v86.
   - GitHub Integration: You can import public GitHub repository into 
   absolute paths. For example, cloning "https://github.com/abc/xyz"; to 
   "/root/" will put files in the folder "/root". You can always use "ls" and 
   "pwd" inside sage to check current directory if you get confused.

I realized I misinterpreted the topics about the security and performance 
of SageMath-in-Browser. SageMath-in-Browser is a static website, so there 
is nothing to exploit. And the relative low performance of v86 has nothing 
to do with its security. Furthermore, there are ongoing works in improving 
v86's performance, see this 
<https://github.com/copy/v86/issues/924#issuecomment-1724658256>.

On Monday, February 23, 2026 at 12:19:31 AM UTC+8 Yanshu Wang wrote:

> That is great. Just to save time, I am happy to list the existent wasm 
> builds of the most important ones:
>
>    - gap wasm builds doc: 
>    https://github.com/gap-system/gap/tree/master/etc/emscripten
>    - gap wasm demo: https://wangyenshu.github.io/gap-wasm/ and web 
>    sources and some instructions: 
>    https://github.com/wangyenshu/gap-wasm/tree/gh-pages
>    - ecl wasm builds resources: 
>    https://turtleware.eu/posts/Common-Lisp-and-WebAssembly.html
>    - flint wasm builds resources: 
>    
> https://github.com/flintlib/python-flint/blob/main/.github/workflows/ci-emscripten.yml
>
> As far as I know, only singular has no wasm build.
> On Sunday, February 22, 2026 at 10:41:15 PM UTC+8 [email protected] wrote:
>
>> As a continuation of the experiment, I tried to see what packages are 
>> missing from emscripten-forge to satisfy all of sage's dependencies (see 
>> https://github.com/sagemath/sage/pull/41680). Here is the result:
>> ```
>> error    libmamba Could not solve for environment specs
>>     The following packages are incompatible
>>     ├─ 4ti2 =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ autoconf =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ automake =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ bliss =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ c-compiler =* * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ cddlib =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ cibuildwheel =* * is not installable because it requires
>>     │  └─ bashlex =* *, which does not exist (perhaps a missing channel);
>>     ├─ cliquer =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ cxx-compiler =* * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ cypari2 >=2.2.1 * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ ecl =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ eclib =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ ecm =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ fflas-ffpack =* * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ fortran-compiler =* * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ fpylll >=0.5.9 * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ gap-defaults =* * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ gfan =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ givaro =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ iml =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ ipykernel >=5.2.1 * is not installable because there are no viable 
>> options
>>     │  ├─ ipykernel [6.15.0|6.15.1|...|6.29.5] would require
>>     │  │  └─ psutil =* *, which does not exist (perhaps a missing 
>> channel);
>>     │  ├─ ipykernel [6.30.0|6.30.1|...|7.2.0] would require
>>     │  │  └─ __win =* *, which is missing on the system;
>>     │  ├─ ipykernel [6.30.0|6.30.1|...|7.2.0] would require
>>     │  │  └─ __linux =* *, which is missing on the system;
>>     │  └─ ipykernel [6.30.0|6.30.1|...|7.2.0] would require
>>     │     └─ __osx =* *, which is missing on the system;
>>     ├─ jupyter-sphinx =* * is not installable because there are no viable 
>> options
>>     │  ├─ jupyter-sphinx [0.3.2|0.4.0|0.5.3] would require
>>     │  │  └─ nbconvert >=5.5 * but there are no viable options
>>     │  │     ├─ nbconvert [6.4.5|6.5.0|...|7.9.2] would require
>>     │  │     │  └─ nbconvert-pandoc [==6.4.5 pyhd8ed1ab_2|==6.5.0 
>> pyhd8ed1ab_0|...|==7.9.2 pyhd8ed1ab_0], which requires
>>     │  │     │     └─ pandoc =* *, which does not exist (perhaps a 
>> missing channel);
>>     │  │     ├─ nbconvert [5.5.0|5.6.0] would require
>>     │  │     │  └─ pandoc >=1.12.1,<3.0.0 *, which does not exist 
>> (perhaps a missing channel);
>>     │  │     ├─ nbconvert 5.6.1 would require
>>     │  │     │  └─ jinja2 >=2.4,<3a0 * but there are no viable options
>>     │  │     │     ├─ jinja2 [2.10|2.10.1|...|2.11.3] would require
>>     │  │     │     │  └─ markupsafe >=0.23,<2 *, which does not exist 
>> (perhaps a missing channel);
>>     │  │     │     └─ jinja2 2.11.3 would require
>>     │  │     │        └─ markupsafe >=0.23,<2.1 *, which does not exist 
>> (perhaps a missing channel);
>>     │  │     └─ nbconvert 7.0.0 would require
>>     │  │        └─ lxml <5.2.0a0 *, which does not exist (perhaps a 
>> missing channel);
>>     │  ├─ jupyter-sphinx 0.5.3 would require
>>     │  │  └─ ipykernel >=4.5.1 *, which cannot be installed (as 
>> previously explained);
>>     │  └─ jupyter-sphinx [0.2.4|0.3.1|0.3.2] would require
>>     │     └─ sphinx >=2,<4 *, which requires
>>     │        └─ docutils >=0.12,<0.17 *, which does not exist (perhaps a 
>> missing channel);
>>     ├─ jupyter_client =* * is not installable because there are no viable 
>> options
>>     │  ├─ jupyter_client [7.3.2|7.3.3|...|8.6.3] would require
>>     │  │  └─ pyzmq >=23.0 *, which does not exist (perhaps a missing 
>> channel);
>>     │  ├─ jupyter_client [8.7.0|8.8.0] would require
>>     │  │  └─ pyzmq >=25.0 *, which does not exist (perhaps a missing 
>> channel);
>>     │  ├─ jupyter_client [5.2.3|5.2.4|...|7.1.2] would require
>>     │  │  └─ pyzmq >=13 *, which does not exist (perhaps a missing 
>> channel);
>>     │  └─ jupyter_client [7.2.0|7.2.1|7.2.2|7.3.0|7.3.1] would require
>>     │     └─ pyzmq >=22.3 *, which does not exist (perhaps a missing 
>> channel);
>>     ├─ lcalc =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ libblas =* *_openblas does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ libbraiding =* * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ libbrial =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ libflint =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ libgd =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ libhomfly =* * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ linbox =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ lrslib =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ m4ri =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ m4rie =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ maxima <5.48.0 * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ meson-python =* * is not installable because it requires
>>     │  └─ ninja =* *, which does not exist (perhaps a missing channel);
>>     ├─ meson =* * is not installable because it requires
>>     │  └─ ninja >=1.8.2 *, which does not exist (perhaps a missing 
>> channel);
>>     ├─ mpfi =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ nauty =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ ninja =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ ntl =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ palp =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ pari =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ pkg-config =* * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ pkgconfig =* * is not installable because it requires
>>     │  └─ pkg-config =* *, which does not exist (perhaps a missing 
>> channel);
>>     ├─ planarity =* * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ pplpy >=0.8.6 * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ primecount =* * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ primecountpy =* * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ primesieve =* * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ pycosat >=0.6.3 * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ python-lrcalc [=* *|~=2.1 *] does not exist (perhaps a typo or a 
>> missing channel);
>>     ├─ python =3.12 * does not exist (perhaps a typo or a missing 
>> channel);
>>     ├─ rpy2 >=3.3 * does not exist (perhaps a typo or a missing channel);
>>     ├─ ruff =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ rw =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ singular =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ sirocco =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ sympow =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ tachyon =* * does not exist (perhaps a typo or a missing channel);
>>     ├─ ty >=0.0.12 * does not exist (perhaps a typo or a missing channel);
>>     └─ uv =* * does not exist (perhaps a typo or a missing channel).
>> ```
>>
>> Some of them are most likely false negative (eg python, meson-python, 
>> ninja) and a few others are no hard requirements for us (uv, ruff, jupyter 
>> stuff, autoconf). The most important ones to attack would be gap, 
>> ecl/maxima, flint, singular - at least a couple of them already provide 
>> wasm builds, so adding them to emscripten-forge doesn't seem to be 
>> impossible. If someone feels motivated to contribute those packages, I 
>> would join the effort, definitely from the side of the sage build script 
>> and CI.
>>
>> On Sunday, February 15, 2026 at 5:47:36 PM UTC+1 parisse wrote:
>>
>>> On Sunday, February 15, 2026 at 2:22:32 AM UTC+1 [email protected] 
>>> wrote:
>>>
>>> I think this is because WebAssembly-built sympy uses pyodide, which is 
>>> compiled to wasm directly, so it runs almost natively in your CPU. However, 
>>> SageMath-in-Browser runs code in the CPU emulated by v86. I think in order 
>>> to achieve the same performance as WebAssembly-built sympy, SageMath must 
>>> be compiled directly to wasm using tools like emscripten 
>>> <https://emscripten.org/index.html>. But that is far more challenging 
>>> than the current SageMath-in-Browser approach.
>>>
>>>  
>>> CPython can be compiled to wasm by emscripten, therefore you get an 
>>> acceptable perfomance penalty. For example inverting a 50x50 matrix with 
>>> integer coefficients in -99..99 takes about 3 seconds on my laptop with 
>>> sympy live, vs about 1.3 second (native python3 interpreter) vs 0.01s 
>>> (Giac/Xcas compiled to wasm) vs 0.004s (sage native) or 0.0012s (Giac/Xcas 
>>> native). But sympy remains Python interpreted code and does not include 
>>> advanced maths algorithms, so it will be slow except for small inputs.
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/sage-devel/d1abdefa-a195-44ea-bbc4-9ef427bb586cn%40googlegroups.com.

Reply via email to