return to table of content

PyScript: An open source platform for Python in the browser

SillyUsername
28 replies
2d6h

Someone just invented a whole new level of hell for devs who maintain code.

First it was untrained consultants and VB or Delphi (Pascal)

Then came the JS monkeys mixing up plain JS with jQuery and SQL injections.

Now it's time for data scientists and pi/sketch users to feel the pain of an uncharted domain...

giancarlostoro
14 replies
2d2h

Honestly, WebAssembly with C#'s Blazor is the best development experience I've ever had. I can fully debug the front-end and back-end within Visual Studio.

maleldil
9 replies
2d1h

But then you have to use Visual Studio.

giancarlostoro
4 replies
2d1h

One of the best IDE's I've ever used. JetBrains IDE's come close, but Visual Studio is a gem.

noworriesnate
1 replies
2d

Visual Studio is nice but I vastly prefer Rider, even on Windows. It feels bit snappier, especially when you're comparing Visual Studio + Resharper versus Rider. TBH this is probably a matter of what is familiar though.

giancarlostoro
0 replies
1d23h

I use Rider on other platforms.

maleldil
1 replies
2d

IMO, it's somewhat polarising. Some people love it, but I personally can't stand it. It feels too heavy, trying to dominate every aspect of writing code. I prefer lightweight editors, but I recognise it's a personal thing.

anakaine
0 replies
1d18h

Its totally a personal thing. I feel VS Code is the right combination of light weight, light touch, and keeps my focus where I need it whilst still having the ability to get to helpers that make life easier.

camdenreslink
3 replies
2d1h

Visual Studio is really good if you are doing C# development on Windows.

giancarlostoro
2 replies
2d1h

MonoDevelop was also really nice. So much so, it looks like they copied it into Visual Studio for Mac???[0]

In any regard, C# has some of the richest tooling I've seen for any programming language, I do wish Microsoft would invest even marginally into MonoDevelop again.

[0]: https://www.monodevelop.com/

neonsunset
1 replies
2d

VS4Mac is MonoDevelop. Well, it was - VS4Mac is dead now as it has been stagnating, and at the end of its life was likely more harmful to .NET adoption by developers using macOS.

Its niche is now replaced by VS Code, particularly after base C# extension switched to Roslyn LSP from Omnisharp, and, of course, Rider which has been a strong cross-platform offering for a long time.

With that said, I heard only positive things about MonoDevelop back in the day and my impression from the feedback is that it was something its authors really put care into. I suppose it is part of history now.

On Blazor - both Rider and VS Code support it. Contrary to the belief of slowly but surely diminishing group of developers that think .NET is still stuck in Windows land, there is nothing that ties you to Windows here.

pjmlp
0 replies
1d21h

Not really.

The original VS4Mac was Mono Develop.

Afterwards the team started to share code between Visual Studio and VS4Mac, written in .NET Standard libraries, until they started the full rewrite, using .NET Core proper with Cocoa bindings, as the team did not consider MAUI with Catalyst mature enough for the rewrite.

Only to have the project cancelled and replaced by our Electron shell friend, after they reached the 1.0 of the rewrite efforts.

Which still doesn't have the graphical tooling and storyboards integration from VS4Mac.

Most folks are rather adopting Rider.

pjmlp
2 replies
2d

The 2nd coming of Web Forms, or Silverlight, take your pick.

giancarlostoro
1 replies
1d23h

In the case of WASM though, does it really matter? Ideally I want to see other languages do the same thing.

pjmlp
0 replies
1d23h

It matters when debugging pile of WASM code, and the performance loss switching back and forth to JavaScript engine.

The very reason I haven't bothered that much with Blazor, are my debugging scars from Web Forms and JSF.

Given the choice, I will go with stuff that works directly with script tags and the built-in developer tools.

bouncing
0 replies
1d23h

I'm curious what widgets/frontend tooling you use.

This is, I assume, Visual Studio for Windows. Have you tried it at all in VS Code or is that a non-starter?

micahdeath
8 replies
2d5h

If you could write VB (VB6) in WASM, that would make some things so much simpler!!! (I work on a legacy codebase)

v3ss0n
3 replies
2d4h

Thats mean you want to embed VB code into Browser Like in ActiveX days?

pjmlp
1 replies
2d

Actually I think Blazor might support class libraries written in VB.NET.

micahdeath
0 replies
1d21h

They do and it appears to work really well (I have only experimented with it.)

micahdeath
0 replies
1d21h

Isn't it the same thing as a SPA or any other WASM? The only real difference now is that it is now accepted and the browsers assist with cross platform APIs (and some security) instead of pure Windows APIs. (Ok, so I made it a bit more simple than it is, but that is how I see it.)

pwang
1 replies
1d21h

Anaconda Code is what you're looking for! It's Python (via PyScript) running as an Excel plug-in, that has full access to the spreadsheet and can harness a big part of the core PyData stack (including matplotlib, sklearn, pandas, etc.)

The whole thing runs via PyScript/WASM, and lives locally inside the Excel spreadsheet. https://www.anaconda.com/blog/introducing-anaconda-code-add-...

anakaine
0 replies
1d18h

Please don't tell people I work with about this.

sitkack
0 replies
1d21h

Arguably, VB6 and Ruby have a pretty similar syntax. And Wasm is first class in the Ruby build farm. https://github.com/ruby/ruby.wasm

nazgulsenpai
0 replies
2d

Oh man that would be so cool. Kinda like the Ruffle Flash player!

v3ss0n
2 replies
2d4h

Thats what I am thinking too. Integrating code of DS/ML people into backend is painful enonugh. Imagine maintaining frontend code of those who had never done proper forntend development...

bob020202
1 replies
1d21h

If it's not something that needs extensive testing, I'd rather maintain that codebase than a "proper" one. Data science people don't pump out 100 files with 20 layers of OOP, and they don't know how to use Redux or whatever overkill navigation lib. It'll be a main.py that just does what you want. Maybe there will be copy-pasted code, but even that can be more readable sometimes.

v3ss0n
0 replies
1d11h

You are right about over engineered redux and react, It would be a lot less painful to maintain main.py and a lot more grepable

pdntspa
0 replies
2d2h

Everyday We Stray Further From God

v3ss0n
17 replies
2d7h

I can't find any real world use case there. If you want to run ML Models you can build them to Onnx https://onnxruntime.ai/docs/tutorials/web/ . Will this efficient to build browser based app in place of JS/TS ?

h8hawk
14 replies
2d6h

Perhaps some people don't want to touch JS/TS

mapcars
13 replies
2d4h

TS is actually has better typing than Python (mypy). And the whole React (Vue, etc) infrastructure around it. Without these two things I wouldn't even bother writing frontend code.

pphysch
8 replies
2d2h

The browser doesn't support TS though. The browser does support Python via PyScript/pyodide/etc.

You can't run TS in the browser unless you jump through the same hoops that PyScript is.

pjmlp
4 replies
2d

Yet, type annotations are being discussed for JavaScript, eventually the browsers will be running Typescript.

pphysch
1 replies
1d22h

The browsers are already running anything via custom WASM interpreters, like Pyodide for Python.

pjmlp
0 replies
1d21h

With a huge performance hit and leaky abstractions.

infamia
1 replies
1d19h

I thought I read somewhere that the Chrome team tried typed JS, found out that there was a performance hit, and they ended the experiment? Is this a continuation of that or a new effort? Sounds interesting.

wiseowise
2 replies
2d1h

‘npx vite build’ is what you call hoops?

pphysch
1 replies
2d1h

You can offline transpile anything to JS to later run in the browser, TS isn't special in this way.

With PyScript you can see and modify the actual code in your browser, just like vanilla JS.

mapcars
0 replies
1h8m

Do you actually see and modify code in your browser today? I mean for like 5 years all you see in the browser is minified and obfuscated to the point its almost impossible to make any practical sense out of it.

infamia
3 replies
2d1h

Idk they're just different tradeoffs to me. Types are real and enforceable at runtime in Python (e.g, pydantic). Types in TS/JS are a fake veneer that add a build step. Is that categorically better? I don't love Python typing syntax.

mapcars
2 replies
2d

I want my types to be verified before runtime, what should I do with type error at runtime? Yes it will leave me a better error message in logs, but build-time type check will prevent me even rolling this code out.

So yes, its categorically better.

infamia
1 replies
1d19h

I want my types to be verified before runtime, what should I do with type error at runtime?

It is weird to me you cannot think of uses for types and handling their errors at runtime. Look at projects like FastAPI (which uses pydantic) for an an example where having types at runtime has been handy.

Also, if types are enforced at runtime logging is better, debugging is better, and you have more options for data validation and doing dynamic or metaprogramming likely more easily because you can evaluate these things at runtime. By types being built in, the language gives you a richer set of tools to work with and more options when and how to enforce types.

mapcars
0 replies
16h56m

Look at projects like FastAPI (which uses pydantic) for an an example where having types at runtime has been handy.

What is it, they have nice error messages? I don't expect them to fix code at runtime when type error happens.

Also, if types are enforced at runtime logging is better, debugging is better

These can't even happen with type checking in the first place.

you have more options for data validation

In my experience serializing/deserializing data is pretty much the only place where its useful, and it doesn't have to be built-in on a language level, Pydantic is doing it well enough.

doing dynamic or metaprogramming likely more easily

This is where you lose me, I have never seen it being useful in reasonable large projects in popular languages. Dynamic or metaprogramming only works in a very specific category of languages (lisp-likes), doing it in any other language will become a problem sooner or later.

more options when and how to enforce types

Again its only on serialization level, apart from that type checking will cover everything before runtime, it's weird to me how you can think that encountering problem later has any advantage of doing it earlier.

quotemstr
1 replies
2d1h

Programming language ought to be decoupled from deployment environment.

simonh
0 replies
1d9h

Not a fan of JavaScript in the browser either then?

apwheele
16 replies
2d7h

For folks interested in seeing a usecase, I have a panel dashboard of Dallas crime statistics at:

https://crimede-coder.com/graphs/Dallas_Dashboard

Startup takes around a minute (which includes installing various python libraries + loading an external 5mb dataset). But once up and running it is quite responsive. (And works fine on my iphone.)

Many businesses I work with use Tableau free versions, and just manually update the data (since the free doesn't allow direct connections to a datastore). This is a free alternative (I use github actions to build a zipped up csv file that is pulled into the environment).

stackskipton
4 replies
2d4h

Memory usage seems quite high. According to Browser Task Manager, the tab is consuming 657MB compared to 25-70MB most other tabs are using.

bbminner
1 replies
2d2h

Woah, what browser/page combination can fit into ~50Mb these days? I am simply used to the fact that most pages take at least 200Mb RAM in task manager.

rafaelgoncalves
0 replies
2d1h

did you use the in browser or another external task manager? most pages without videos or some kind of gpu process uses 20~30 MB here (like hacker news for example).

cyanydeez
0 replies
1d1h

Youd see the sme for any competent pyhon app.

apwheele
0 replies
2d3h

Yes this is part of the price of running it client side instead of having a server do all the data manipulation. It is pretty much a wash for RAM for me vs running locally (local is 200-300 for python + 100-200 for chrome for just that web-page).

shipp02
1 replies
1d19h

Does it work on firefox for anyone? The spinner keeps spinning on my MacBook Air.

1d22a
0 replies
1d18h

Working fine for me, Firefox 128.0.3 on Fedora

miohtama
1 replies
2d7h

Awesome example of using in production! Nice work.

I wish we get over with the loading hickups soon. Do you know if there is any work going on to make it start faster/smaller/less janky?

solarexplorer
0 replies
2d6h

Maybe some kind of snapshot feature, where you can just load an snapshot of the already initialized state?

andybak
1 replies
2d3h

Startup takes around a minute

I wonder what your bottleneck was? It was about 20 seconds for me on domestic broadband.

jeroenhd
0 replies
2d1h

Based on the temperature of my phone after clicking that link, probably CPU or memory.

agolio
1 replies
1d18h

Cool site!

Many businesses I work with use Tableau free versions, and just manually update the data

Why not just use e.g React/ Angular?

Or is it a question of needing python for the data analytics, and for server cost reasons not wanting it to be run on the server side?

apwheele
0 replies
1d17h

This example could be all javascript (and I try to do that in some scenarios). Most of the other demo's on my site are just javascript/D3 or other libraries even with some slightly more advanced metrics, https://crimede-coder.com/demos.

There are some cases in which I do want python numerical libraries though. Say I wanted to do a forecast ARIMA model based on arbitrary combined inputs for the graphs, or do different types of spatial clustering of the geographic data. Those would be cases pyscript would make sense.

The public dashboards yes IMO easier to not have to worry about server.

senkora
0 replies
1d14h

That's pretty cool. In case anyone reading this is generally interested in crime statistics dashboards, I'll link to the NYPD's: https://compstat.nypdonline.org/

mikemorrow
0 replies
1d13h

You can connect tableau public to google sheets

eddd-ddde
0 replies
1d16h

Could you somehow "snapshot" the runtime after the initial processing is ready and have clients just load that?

I imagine there's a ton of preprocessing that could be, well, preprocessed.

mg
12 replies
2d10h

The homepage left me confused, and also after reading the documentation, I'm not sure what this is.

I tinkered a bit to try it myself.

Turns out you can throw this into your website and it will display "Hello World":

    <script type="module" src="https://pyscript.net/releases/2024.8.2/core.js"></script>
    <script type="py">
        import js
        js.document.querySelector("body").innerText = "Hello World"
    </script>
So it seems to be a script that looks for scripts of type "py" and transpiles them from Python to JavaScript via Pyodide?

On the other hand, the demo on the homepage is a repl. And the title says "platform". So I'm still confused.

pansa2
5 replies
2d9h

transpiles them from Python to JavaScript

There are projects that do that, but it looks like PyScript instead runs Python code directly. It uses a Python interpreter compiled to WebAssembly - either CPython (from Pyodide) or MicroPython.

deisteve
4 replies
2d1h

does this mean we can install FastAPI in the browser?

bouncing
1 replies
1d23h

I mean, maybe, but you'd have trouble with sandboxing when you try to open a socket.

deisteve
0 replies
1d17h

how would i go about doing that? open up a socket via webrtc to the internet and translate incoming webrtc calls to HTTP for fastapi

nine_k
0 replies
1d9h

What would be the point?

You can't have a listening socket anyway. And if the browser has to imitate the connection, there are numerous less oblique ways than running fastAPI.

sjamaan
2 replies
2d6h

And the title says "platform". So I'm still confused.

I hate it when people say "platform" or use other vague/ill defined terms. Just say it's a JS implementation of Python that evaluates code in script tags for python, or some such.

skeledrew
0 replies
1d17h

It isn't a JS implementation. It's implemented in Web Assembly and can communicate with JS if needed.

pphysch
0 replies
2d2h

PyScript is a platform for using Python in the browser to build actual applications.

rty32
1 replies
2d8h

Without actually reading the documentation or source code -- I guess "js" package is just an API that somehow maps to the real "window" object and calls those DOM methods via some sort of Proxy object.

bschwindHN
12 replies
2d7h

Our phones are getting faster every year, we must find a way to slow things down even more.

poikroequ
4 replies
2d6h

The dawn of the PyScript web frameworks is upon us...

poikroequ
0 replies
1d22h

You, sir, are a mad man.

amy-petrik-214
1 replies
2d5h

We must think of the lessons of docker, the lessons of conda. Why, what with the web environments, so many, is there not a way to unify an environment? Of course! A virtual environment of python, on a virtual environment of the docker machine, on a virtual web browser, and there can be JIT throughout to make it only painfully slow and not excruciatingly slow! Abstraction is a Good Thing (TM) and the more abstraction, the better. There really ought to be an object oriented abstraction layer factory generator factory using Java OOP best practices, also a good thing (TM). If all goes well we may even be able to reach abstraction tier 17, which is two more layers of abstraction than the industry standard 15.

See: https://www.corporate-rebels.com/blog/cia-field-manual

failuser
0 replies
2d1h

Just one more abstraction layer will fix it.

bouncing
3 replies
1d23h

You're replacing one interpreted language for another.

Yes, Python is among the slower interpreted languages out there, but still. The debate between fast execution and programmer productivity is not a new one. Given Python's popularity, I'd say it's settled.

bschwindHN
2 replies
1d14h

I suppose you didn't run any of the examples on the website.

bouncing
1 replies
1d4h

I'm not sure what you mean. The PyScript website?

bschwindHN
0 replies
12h29m

Yes, they link to examples and all of them run way slower than the equivalent JS version. Most likely because python has to ship its interpreter in the WASM bundle.

If the user experience is significantly worse, I don't care if it was easier for you to write the code.

Wowfunhappy
2 replies
2d1h

I agree with the sentiment but the purpose of WebAssembly is to be a compiler target for other languages, so we're not stuck with Javascript until the end of time, right? Will this always necessarily be substantially slower than Javascript?

pansa2
1 replies
2d1h

Will this always necessarily be substantially slower than Javascript?

Yes, interpreted Python will always be slower than JIT-compiled JavaScript.

PyPy.js [0] is a JIT compiler for Python that runs in the browser - its performance could be similar to JS but its development is currently “sleeping”.

[0] https://github.com/pypyjs/pypyjs

pjmlp
0 replies
2d

This is sadly to be expected in regards to PyPy, it was never taken seriously by the Python community, regardless of their heroic efforts.

santiagobasulto
1 replies
2d10h

This uses pyodide. It's more like a Python to JS transpiler (even if it's not). It's to create browser apps using Python. So it's Pyodide + a browser API.

azakai
0 replies
2d3h

They also support MicroPython as an option now and not just Pyodide,

https://pyscript.net/tech-preview/micropython/about.html

In fact the main PyScript site uses MicroPython now, I see in the dev console (micropython.mjs and micropython.wasm).

v3ss0n
0 replies
2d8h

Its a wrapper.

qsort
0 replies
2d10h

Pyodide is a port of CPython to the WebAssembly platform. PyScript is a framework that uses Pyodide to provide a framework for developing Python applications in the browser. Its elevator pitch would be "python inside script tags via pyodide".

bouncing
0 replies
1d23h

Pyodide is a runtime.

PyScript can use Pyodide or MicroPython. MicroPython is actually quite small.

On top of the runtime, PyScript gives you some pleasantries and a lot of quality-of-life improvements for actually using Python for web programming, not just being able to run Python code.

miohtama
1 replies
2d7h

AFAIK Brython cannot translate some of popular Python libraries. Python libraries, esp. Data science ones, are often the reason why developers pick Python.

deknos
3 replies
2d4h

What i would like, if i could write scripts in firefox, which act the browser, like doing the evaluation at any stage i like. At GET the page, after ALL GETs. After javascript evaluation or before.

Is there something which can do this? and with full power of python also accessible to the host?

deknos
1 replies
1d2h

Does this work with Firefox?

beardog
0 replies
1d2h

Yes

jerpint
2 replies
2d6h

I wonder if this could be combined with fastHTML to have a full python html rendered client side

maartenbreddels
0 replies
1d8h

We plan to support fastHTML at https://py.cafe/

This also uses pyodide, but supports more frameworks out of the box.

dataguy_
0 replies
2d5h

yep. would be nice as well to have LLMs trained on these things for fast prototyping

jedberg
2 replies
2d1h

First thing I tried was a small lambda function and it worked! Then I tried some Fibonacci with tail recursion and surprisingly that worked too. I'm impressed, because often when people reimplement the Python interpreter they get those wrong.

tusharsadhwani
0 replies
2d

that's because it's not a reimplementation, it is cpython recompiled to wasm.

pxc
0 replies
2d

Then I tried some Fibonacci with tail recursion and surprisingly that worked too. I'm impressed, because often when people reimplement the Python interpreter they get those wrong.

Huh? I thought Python didn't have TCO anyway. Guido had a whole blog post about why it supposedly doesn't belong in Python: https://neopythonic.blogspot.com/2009/04/tail-recursion-elim...

agumonkey
2 replies
2d8h

What other language would people choose in a browser? Lua ?

agumonkey
0 replies
2d4h

Yeah but I was mostly wondering about mainstream programmers. The chance of people liking a lisp are still low(to my own sadness)

IshKebab
2 replies
2d9h

The examples were about as slow as I imagined they would be. 20 seconds to draw a simple graph.

nmstoker
1 replies
2d6h

The majority of that is the upfront one-off loading time for pyodide to get going along with required packages. Subsequent runs for things will be substantially faster.

IshKebab
0 replies
2d4h

That is a subsequent run (because I also wondered if caching etc would improve hot loads, but it doesn't).

raybb
1 replies
2d4h

The big limitation that's very annoying with any WASM setup is that at the end of the day you still can't call many APIs or scrape sites because of CORS. Ofcourse, CORS is important to avoid XSS and the like but I wish there was a way to deal with this other than setting up a proxy to strip CORS, which then leaves you with a non residential IP that's more likely to get blocked.

dsp_person
0 replies
20h29m

Is this only an issue with cross-origin isolation enabled with COOP and COEP?

pitah1
1 replies
2d5h

I recently went down the rabbit hole of using PyScript for running a Python CLI app in the browser.

It felt hacky the whole time, especially when dependencies were involved. I had to create wrapper classes to work around Pydantic 2.x not being available to use. I tried to put all logic into the Python files but found some things missing that I had to put in JavaScript.

I think it could be good in use cases where you want some simple UI with custom UI logic on top of your Python code but maybe Streamlit or Gradio could be more suitable.

GitHub repo: https://github.com/data-catering/data-contract-playground

Website: https://data-catering.github.io/data-contract-playground/

skeledrew
0 replies
1d17h

The Rustification of a lot of Python projects is making it more difficult that necessary to use Python everywhere.

skeledrew
0 replies
1d17h

I've been seeking to do this for a very long time!

bArray
1 replies
2d9h

I've been looking for something like this, but I'm still unsure it quite hits the spot. I think that this would be very interesting if it allows a person to run a blog like a Jupyter notebook.

I have a lightweight hack [1] that runs Python in markdown documents and can output basic images/graphs - which is embedded into static pages. The point was being able to write an article that somebody else could see the code behind it and test themselves, e.g. [2]. One of the browsers I test in is Netsurf with JS disabled. Unfortunately it doesn't look great in Lynx.

[1] https://gitlab.com/danbarry16/pandoc-highlight-filter

[2] https://coffeespace.org.uk/projects/langtons-ant-universe.ht...

apples2apples
1 replies
1d23h

Careful Anaconda will change the license on you and then sue...

pwang
0 replies
1d21h

Fun joke but Anaconda has a track record of creating OSS and then turning it over to community governance. This includes the conda tool itself, libraries like bokeh, dask, numba, jupyterlab, and many more. And while PyScript project governance isn't in NumFOCUS, all of the code is permissively-licensed BSD/MIT.

The commercial licenses for the products and commercial repository is what supports all of this OSS development work.

nickpsecurity
0 replies
2d

For those exploring, here was one of the best “Python in the browser” projects I found:

https://brython.info/

maartenbreddels
0 replies
1d8h

Also check out https://py.cafe/ (I work on this project)

It supports streamlit, dash, virzo and solara. Frameworks like shiny, gradio and panel are planned (maybe even fasthtml).

It's also really nice to integrate this into your documentation: https://mkdocs.py.cafe/

laffra
0 replies
1d15h

Also, check out PySheets (https://pysheets.app), which leverages PyScript to run Python logic in a spreadsheet UI, which is written entirely in Python. The PySheets UI uses LTK (https://github.com/pyscript/ltk), a fully client-side UI rendering library for PyScript.

grej
0 replies
2d2h

Also check out pyscript.com, to create and host PyScript apps.

bouncing
0 replies
1d23h

If I may toot my own horn, I wrote a somewhat more opinionated, reactive, frontend framework using PyScript. It's inspired by Vue.js, a bit: https://puepy.dev

bityard
0 replies
2d2h

Why does it require signing in just to try it out? Someone else below mentioned that it's just adding a <script> tag to your HTML.

bilsbie
0 replies
1d23h

How’s it work? Webassembly? Webile?

bdcravens
0 replies
2d5h

Reminds me of my first "tech" job (computer store/ISP/web dev shop, circa 1998) where the owner wrote some VBScript for the browser and wondered why it didn't work in Netscape.

amanzi
0 replies
2d10h

I used this to create a Markdown renderer a while back. You can see the very simple source code here: https://pyscript.com/@stuartmaxwell/markdown-previewer-v2/la...

The app won't run well on mobile but should be fine on desktop.

I used this code in a blog application I was writing in Django.

a10sshg
0 replies
1d12h

This is from Anaconda and built on Pyodide:

PyScript is currently built on Pyodide, which is a “port of CPython to WebAssembly/Emscripten.” PyScript supports writing and running Python code in a browser.

Like conda I find the whole thing very confusing and slow, but I suppose it will be marketed to academics as "the thing to do web development with". It will also be soft-abandoned.

Just use Javascript, PHP or Scala like lichess.org, which is a professional website.

Falimonda
0 replies
2d2h

Does something built off this or Pyodide exist that's effectively a replacement to using React?