Python with the scientific stack, compiled to WebAssembly.

Related tags

python webassembly

Build Status Documentation Status

Python with the scientific stack, compiled to WebAssembly.

What is Pyodide?

Pyodide may be used in any context where you want to run Python inside a web browser.

Pyodide brings the Python 3.8 runtime to the browser via WebAssembly, along with the Python scientific stack including NumPy, Pandas, Matplotlib, SciPy, and scikit-learn. The packages directory lists over 75 packages which are currently available. In addition it's possible to install pure Python wheels from PyPi.

Pyodide provides transparent conversion of objects between Javascript and Python. When used inside a browser, Python has full access to the Web APIs.

Try Pyodide (no installation needed)

Try Pyodide in a REPL directly in your browser. For further information, see the documentation.

Getting Started

Pyodide offers three different ways to get started depending on your needs and technical resources. These include:

  • Use a hosted distribution of Pyodide: see the Getting Started documentation.
  • Download a version of Pyodide from the releases page and serve it with a web server.
  • Build Pyodide from source
    • Build natively with make: primarily for Linux users who want to experiment or contribute back to the project.
    • Use a Docker image: recommended for Windows and macOS users and for Linux users who prefer a Debian-based Docker image with the dependencies already installed.


Pyodide was created in 2018 by Michael Droettboom at Mozilla as part of the Iodide project. Iodide is an experimental web-based notebook environment for literate scientific computing and communication.

Iodide is no longer maintained. If you want to use Pyodide in an interactive client-side notebook, see Pyodide notebook environments.


Please view the contributing guide for tips on filing issues, making changes, and submitting pull requests. Pyodide is an independent and community-driven open-source project. The decision making process is outlined in the Project governance.



Pyodide uses the Mozilla Public License Version 2.0.

  • Memory access out of bounds in Chrome

    Memory access out of bounds in Chrome

    I'm getting the following intermittent error running the develop version in Chrome, running from a web worker.

    Chrome Version 89.0.4389.90 (Official Build) (64-bit) Windows 10 1909 build 18363.1379

    pyodide.js:406 The cause of the fatal error was: RuntimeError: memory access out of bounds at PyArray_IntpFromIndexSequence (:wasm-function[991]:0x737a1) at PyArray_IntpConverter (:wasm-function[990]:0x73702) at byn$fpcast-emu$PyArray_IntpConverter (:wasm-function[3415]:0x15bfeb)

    bug Blocker 
    opened by dmondev 67
  • Revive html5 <canvas> based renderer for matplotlib

    Revive html5 based renderer for matplotlib

    This is in accordance with discussion here:

    Summary: The wasm_backend is refactored into 3 files. The file contains code that is common to both wasm_backend and html5_canvas_backend. Both these backends inherit from the common functionality present in and implement only the required differences.

    Testing Infrastructure is also added for this new html5_canvas_backend.

    opened by madhur-tandon 46
  • Enable all emscripten file systems: IDBFS, NODEFS, PROXYFS and WORKERFS

    Enable all emscripten file systems: IDBFS, NODEFS, PROXYFS and WORKERFS

    Elevator Pitch

    Enable file system persistence with IndexedDB (IDBFS), Node.js (NODEFS), blobs (WORKERFS), proxy (PROXYFS).

    Screenshot from 2021-05-19 23-34-01


    Continuing the discussion from #328, this would allow a pyodide instance to work more naturally with persistent files.

    Some external use cases:

    • persisting files between user sessions
    • sharing files between concurrent browser tabs

    Some internal use cases:

    • caching downloaded wheels and API responses?


    • [x] add -l*fs.js to Makefile to restore all backends
      • ~~considered other backends, but as this has some impact on build time and size without a clear use case, I have not included them for now, but an eventual API should probably plan for supporting them explicitly~~
        • [x] #1689 enabled node, and i've already though about uses cases for WORKERFS
    • [x] #1692 ~~hoist FS.mount, FS.mkdir and FS.sync and IDBFS up to the pyodide API?~~
      • rather than doing something fancy, this has the highest likelihood of working with other language runtimes
      • as discussed below, the preferred approach is to hoist FS to the pyodide namespace, pending a better name...
    • [x] ~~add a convenience API in e.g. loadPyodide({mount: "/home/user1"})?~~
      • a lot of use cases would be covered by "simple" persistence
      • could also add it to sys.prefix
      • moved to
    • [x] tests?
      • haven't looked into what this will take...
    • [x] docs?
      • depends on what features we end up landing...
      • focus on documenting notional API


    • you can make as many mount points as you want
    • they all get synced into the MEMFS (which must exist) with FS.sync(true, (err)=>{...}) and likewise back out with FS.sync(false, (err) => {...})
      • the example guidance suggests sync-in at the start of the process and sync-out before exiting, but this is pretty limiting!


    The image above was gotten by hacking main.c, emulating a naive/broken approach for polling. A better path is being investigated!

      // Create and mount userfs immediately.
    		FS.mount(IDBFS, {}, '/home/jo');
        FS.syncfs(true, function (err) {
          err && console.error('error syncing FROM IndexedDB', err);
        setInterval(function() {
            FS.syncfs(false, function (err) {
              err && console.error('error syncing TO IndexedDB', err);
        }, 5000);
    opened by bollwyvl 43
  • Update to Python 3.9.5

    Update to Python 3.9.5


    opened by hoodmane 38
  • Emscripten 2.0.12 Upstream backend

    Emscripten 2.0.12 Upstream backend

    What it says. Emscripten 2.0.9 upstream (non-fastcomp, compiles straight to wasm), plus patches for binaryen and emscripten so that dynamic linking and passing of function pointers between side modules and main modules works.

    I'm part way through pull requests for binaryen and emscripten so that the patches there aren't needed.

    All other patches to emscripten and binaryen have been dropped - I'm not sure if they were all things that are fixed in the new backend - none of them worked with new backend anyway

    Closes #531 Closes #476

    opened by joemarshall 38
  • Question: How to sandboxise pyodide .

    Question: How to sandboxise pyodide .

    relative to #955 , i want a sandboxed python runtime, i face two question is that :

    1. how to limit the import function ? have any offical way todo this work ? i want limit the import with a denyList or a allowList, like the js i will deny it in a special pyodide.runPythonAsync call.
    2. how to pip out the stdio ( redirect the print output from python ) ? now i use a way is make a patch in the sys.stdout from here, but seems like it will failure after i import the numpy package , so strange .

    about the question (1) , i was try 2 way to do. ( sorry i never read the code of the pyodide , all the follow patch work are try on runtime console and then write to code . ) Summary: i run the pyodide in WebWorker to use the javascript sandboxie runtime to have a additional protection .

    1. let the debuger hard to direct find the pyodide ref from root ( Worker's self or globalThis )

    • in one side, i wrapper all the thing into a Typescript class , i named it class SClass ( mean : secure class)

    use follow code to hide it

    class SClass {
        constructor() {
            workerSelf.onmessage = this.onmessage.bind(this);
        // .......
    const workerSelf: typeof WorkerSelf = self as any;
    workerSelf.aaaaaa = new SClass();
    // we have the `workerSelf.onmessage` on the ref link, the `onmessage` are `onmessage.bind(this)`,
    //   so, the GC couldn't delete our object,
    //   so, we can safe delete the direct ref from root object,
    //   then, we implement the hidden all the ref target,
    //   no one can access our object from debug console.
    // @ts-ignore
    // workerSelf[Symbol() as any] = workerSelf.aaaaaa;
    delete workerSelf.aaaaaa;

    now , no one can access the SClass from self .

    • in other side, because the pyodide cannot be delete from globalThis, (it be set the non-configable flag), i cloned all the field and delete them from pyodide, only recover the pyodide._module to let it can use import js
        init() {
            return workerSelf.languagePluginLoader.then(async () => {
                // await workerSelf.pyodide.loadPackage(['numpy', 'pytz']);
                // delete root ref from self.root
                this.pyodide = clone(workerSelf.pyodide);
                // console.log(this.pyodide);
                // console.log(this.pyodide._module);
                // console.log(Object.getOwnPropertyNames(workerSelf.pyodide));
                Object.keys(workerSelf.pyodide).forEach(T => delete workerSelf.pyodide[T]);
                // delete packages lookup-table from pyodide
                // console.log('packages', workerSelf.pyodide._module.packages);
                // console.log('packages', this.pyodide._module.packages);
                workerSelf.pyodide._module = {};
                workerSelf.pyodide._module.packages = this.pyodide._module.packages;
                workerSelf.pyodide._module.packages = {
                    dependencies: {},
                    import_name_to_package_name: {},
                // console.log('packages', workerSelf.pyodide._module.packages);

    now, other than the js package cannot be import, all the try will throw error .


    but if i only want a allowList or denyList, i cannot comlete it use follow code to recover the pyodide._module.packages . it's not work.

                // recover selected packages to pyodide lookup-table
                const recoverPack = (pName: string) => {
                    workerSelf.pyodide._module.packages.dependencies[pName] =
                    workerSelf.pyodide._module.packages.import_name_to_package_name[pName] =
                const allowList = [
                allowList.forEach(T => recoverPack(T));
                Object.getOwnPropertyNames(this.pyodide._module.packages.dependencies).forEach(T => recoverPack(T));
                // dont remember to recover the prototype
                if (allowList.length > 0) {
                    // console.log('this.pyodide._module.packages.prototype',
                    //     Object.getPrototypeOf(this.pyodide._module.packages));
                console.log('packages', workerSelf.pyodide._module.packages);

    seems like some other important thing i deleted from the workerSelf.pyodide.

    in the end, i remove above the attempt that delete thing from pyodide.

    2. use pyodide.find_imports to check the code before run it . and simple not run it if find something not allowed.

    see pyodide.find_imports

    thsi is a easy way, but in the document i see some dangerous function can bypass this way. like pyodide.eval_code or the pyodide.open_url , and i not sure not have any other way can load code from remote or eval a string to code in runtime.

    BTW: the cursor params of pyodide.get_completions API seems like not receive {row, col} as params, i dont known how to use it in a large section code. so, now i run a second WebWorker to run the Jedi to do the code complete task. but seems like the jedi cannot get information from a imported package , like numpy .

    sorry for my knowledge, i'm good at C++/Typescript and software security/software architecture, the Python is in my weakness area.

    opened by Lyoko-Jeremie 36
  • Configurable

    Configurable "import js"

    Add a pyodide.mountPackage("name", object) api that mounts object at name, so that import "name" imports object, and from name import field imports object.field as field.

    For example, the current js import would then be installed by saying pyodide.mountPackage("js", globalThis) though we would keep the current behavior as the default. We could get rid of import js by saying pyodide.mountPackage("js", undefined).

    opened by hoodmane 36
  • Allow to import python modules directly / remotePath feature

    Allow to import python modules directly / remotePath feature

    remotePath-feature for Pyodide

    This pull request implements the remotePath-feature. This feature makes Pyodide capable to fetch Python modules remotely from a set of given URLs. Both single Python py-files as well as Python-modules in sub-folders using are supported.

    In the demonstrated example below, there is a module called xyz located at, which in turn imports the modules x and y.

    Python console: python-console

    JavaScript console: image

    Any remotely fetched module is parsed for further imports which are imported as well, including pre-build packages from Pyodide. Due to this entirely changed behavior on how imports are resolved, packages from the pyodide packages.json take a higher precedence than remotely loaded packages.

    The feature is already tested well in a re-implementation of a Python-based HTML5-web-app that previously was compiled into JavaScript using PyJS, but now can directly be interpreted (further details here)


    This is a work-in-progress draft to resolve my problem I reported in #481 to allow importing Python files directly, which are not pre-packaged with pyodide, but directly served. So this pull request now makes it possible to make a

    import a

    and is fetched from the same source as pyodide is served from (baseURL). In case imports further modules, let it be and, these are also fetched. This is done until all required packages are fetched, including imports to available packages, as it is the case before.

    Python files fetched from the server are stored into the browser cache using FS.writeFile, and then imported by Python by setting PYTHONPATH to /. I hope this won't be a security problem.

    A demo of this feature is available here:

    • abc.html does the above import of,, and the package html5
    • game.html just does an import game, loads and html5 and executes.
    • console.html can also be used: just type import game or import a there to see what's happening (take a look into the JavaScript console for output)

    This is just a first draft, I want to enhance it also to import module directories served. Is this useful also for others? Does anyone have suggestions for improvements?

    opened by phorward 36
  • Enable building sqlite3 into cpython

    Enable building sqlite3 into cpython

    I'm messing around with adding sqlite3, as mentioned in #345 .

    It's not working. For some reason, makesetup seems to be choking on the added sqlite3 line in Setup.local and then it emits a garbage line in the generated Makefile, resulting in an error:

    [email protected]:/src/cpython# make
    cp Setup.local /src/cpython/build/3.7.0/Python-3.7.0/Modules/
    cat pyconfig.undefs.h >> /src/cpython/build/3.7.0/Python-3.7.0/pyconfig.h
    ( \
    	cp build/3.7.0/host/lib/python3.7/`/src/cpython/build/3.7.0/host/bin/python3 -c "import sysconfig; print(sysconfig._get_sysconfigdata_name())"`.py build/3.7.0/Python-3.7.0/Lib/; \
    	cd /src/cpython/build/3.7.0/Python-3.7.0; \
    	emmake make HOSTPYTHON=/src/cpython/build/3.7.0/host/bin/python3 HOSTPGEN=/src/cpython/build/3.7.0/host/bin/pgen CROSS_COMPILE=yes libpython3.7.a \
    make[1]: Entering directory '/src/cpython/build/3.7.0/Python-3.7.0'
    Makefile:271: *** missing separator.  Stop.
    make[1]: Leaving directory '/src/cpython/build/3.7.0/Python-3.7.0'
    Makefile:91: recipe for target '/src/cpython/build/3.7.0/Python-3.7.0/libpython3.7.a' failed
    make: *** [/src/cpython/build/3.7.0/Python-3.7.0/libpython3.7.a] Error 2
    opened by msabramo 32
  • Interactive console in pyodide-py

    Interactive console in pyodide-py

    This is the 1/3 part of the #875 splitting. It addresses:

    • sync behavior
    • full stdout/stderr support
    • clean namespace
    • tests
    • bigger font (in console.html)

    In a separate PR, I will address:

    • correct result representation
    • more tests

    And in a last PR, I will propose a completion system.

    opened by casatir 30
  • make benchmark occurs patch file

    make benchmark occurs patch file

    when i git clone whole project and run make benchmark in documents , it is hanging in as follows:

    cd emsdk/binaryen && git checkout version_100
    ... etc
    cat patches/*.patch | patch -p1
    patching file emsdk/upstream/emscripten/
    patching file emsdk/upstream/emscripten/src/library_fs.js
    patching file emsdk/upstream/emscripten/src/library_syscall.js
    missing header for unified diff at line 137 of patch
    can't find file to patch at input line 137
    Perhaps you used the wrong -p or --strip option?
    The text leading up to this was:
    |diff --git a/emsdk/upstream/emscripten/src/library.js b/emsdk/upstream/emscripten/src/library.js
    |index 2990646..517fc33 100644
    File to patch: 

    and it need to be patch files . Is it expectation and how can i run make benchmark ?

    thanks for response.

    opened by TbhT 1
  • Replace uglifyjs with terser

    Replace uglifyjs with terser

    opened by ryanking13 1
  • Add geos and shapely (WIP)

    Add geos and shapely (WIP)

    Work on #1569.

    Currently blocked by emscripten-core/emscripten#15276.

    opened by hoodmane 0
  • CI ImportError: cannot import name 'fetch' from 'js'

    CI ImportError: cannot import name 'fetch' from 'js'

    We seem to get more and more CI failures on main. While some are probably difficult to avoid, the following ones I find suspicious,


    test_idbfs_persist_code[node] - src.tests.test_filesystem
    conftest.JavascriptException: PythonError: Traceback (most recent call last):
      File "<string>", line 8, in temp
      File "/lib/python3.9/site-packages/pyodide/", line 31, in <module>
        from .http import open_url
      File "/lib/python3.9/site-packages/pyodide/", line 14, in <module>
        from js import fetch as _jsfetch, Object
    ImportError: cannot import name 'fetch' from 'js' (unknown location)


    1) "before all" hook in "{root}":
         PythonError: Traceback (most recent call last):
      File "<string>", line 8, in temp
      File "/lib/python3.9/site-packages/pyodide/", line 31, in <module>
        from .http import open_url
      File "/lib/python3.9/site-packages/pyodide/", line 14, in <module>
        from js import fetch as _jsfetch, Object
    ImportError: cannot import name 'fetch' from 'js' (unknown location)

    They started to happen after

    opened by rth 6
  • how to use local file system when run in nodejs?

    how to use local file system when run in nodejs?

    here is the case i need use pandas to read and modify an excel file which in my local. currentlly it always throw an error "cant find the file". which is the right way to to set the file path to "pandas.read_excel". thanks

    opened by swaitw 1
  • Size optimization compilation options

    Size optimization compilation options


    Switches from -O2 to -Os as the default compilation option.

    | Size (MB) | main (-O2 -g) | -Os -g | -Os -g0 | -Oz -g0 | |------------------|---------------|--------|---------|---------| | pyodide.asm.wasm | 12 | 9.4 | 9.4 | 8.3 | | | 5.2 | 5.2 | 5.2 | 5.2 | | | 6.8 | 6.2 | 6.2 | |

    Performance impact need to be checked. I'm a bit surprised that -g0 option has no effect, it's possible that it's not correctly taken into account. Also it would necessairy to check the logs more carefully, in some places even the -O option might not be passed. In particular, I find it suspicious that the size of is not changed.

    opened by rth 0
  • Checking the integrity of Pyodide packages

    Checking the integrity of Pyodide packages

    With increased usage, I think it becomes more critical to be able to be able to check integrity of Pyodide packages.

    On the client side

    This would mean, either adding

    1. sha256 for .js, and .data into packages.json ( and check them when loading,
    2. have the packages.json include the hash for the .js, and the .js file the hash of the .data file.

    That requires some work but should be manageable.

    On the server side

    The situation is more concerning. Right now if the S3 bucket is compromised (for instance via an GH extension or a code commit that gets deployed in this repo),

    • we have no way of knowing that a file has been compromised
    • we should be able to recover from GH release, assuming those are still available.

    Of course, a solution could be to move away from custom hosting try to upload all to NPM or similar third party platform, where this is solved. However, I quite like the flexibility of the current approach, which should facilitate for instance different flavors or debug/optimized builds

    Once client side validation is implemented, maybe it would be sufficient to only check the hash of packages.json periodically on the backend which would contain the hashes of everything else (and that are checked client side). This could be done in a Github action in a separate repo possibly.

    opened by rth 1
  • require is not defined

    require is not defined

    Just updated my pyodide from 0.17.0 runnig from a WebWorker to 0.18.1. Since I updated I get the following error when calling loadPyodide from the WebWorker:

    Uncaught (in promise) ReferenceError: require is not defined
        at fetchRemotePackage (pyodide.asm.js:14)
        at loadPackage (pyodide.asm.js:14)
        at pyodide.asm.js:14
        at pyodide.asm.js:14
        at loadPyodide (pyodide.js:227)
        at async listener (pyWorker.js:78)

    Looks like fetchRemotePackagewas changed in 0.18 to use require('fs') when process is defined as an Object (which it is in a WebWorker).

    opened by quiqueck 2
  • Flexible `to_py` conversion of buffers

    Flexible `to_py` conversion of buffers

    Hi @hoodmane I have another issue related to your PR, basically I am sending bytes nested in a dictionary (from native python on a server) to javascript, then I called to_py() in pyodide. Since all the bytes becomes memoryview, I have to convert them all to bytes in loops. Similar to toJs() which allows configure the dict_converter, it would be really great if to_py() be configured with typedarray_converter so the conversion can be done recursively.

    Besides that, right now, the to_py conversion treat ArrayBuffer and TypedArray the same way, I am wondering would it make sense to separate them, e.g. allowing configure arraybuffer_converter and typedarray+converter so one can convert ArrayBuffer and TypedArray differently. I mean all these can be done by additional postprocessing to fit different needs, but for my case I do this in constant interaction with servers, having these options will have huge implication in performance.

    Does this make sense to you?

    Originally posted by @oeway in

    opened by hoodmane 5
  • ./node_modules/pyodide/load-pyodide.js Module not found: Can't resolve 'fs/promises'., pyodide npm 0.18.2

    ./node_modules/pyodide/load-pyodide.js Module not found: Can't resolve 'fs/promises'., pyodide npm 0.18.2

    I create a create react app project, and yarn add pyodide to test pyodide import function. It will throw the error message when using yarn start (as long as I add await import that line) , the result is Failed to compile. The below is the added code on the bootstrap project.

    node: v15.14.0 yarn: 1.22.10 ref repo:

    async function test() {
      let pyodide_pkg = await import("pyodide/pyodide.js"); 
    function App() {
      useEffect(() => {
        async function init() {
          await test()
      }, []);
    opened by grimmer0125 0
Python with the scientific stack, compiled to WebAssembly.

Pyodide may be used in any context where you want to run Python inside a web browser.

null 6.7k Oct 16, 2021
Stack BOF Protection Bypass Techniques

Stack Buffer Overflow - Protection Bypass Techniques

ommadawn46 13 Sep 18, 2021
Performance data for WASM SIMD instructions.

WASM SIMD Data This repository contains code and data which can be used to generate a JSON file containing information about the WASM SIMD proposal. F

Evan Nemerson 3 Aug 13, 2021
Scientific color maps and standardization tools

Scicomap is a package that provides scientific color maps and tools to standardize your favourite color maps if you don't like the built-in ones. Scicomap currently provides sequential, bi-sequential, diverging, circular, qualitative and miscellaneous color maps. You can easily draw examples, compare the rendering, see how colorblind people will perceive the color maps. I will illustrate the scicomap capabilities below.

Thomas Bury 3 Jun 30, 2021
Buffer Overflows

BOF Buffer Overflows 1. BOF tips Practice using Download vulnerable exe from Exploit DB.

Vinh Nguyễn 26 Aug 12, 2021
51AC8 is a stack based golfing / esolang that I am trying to make.

51AC8 is a stack based golfing / esolang that I am trying to make.

null 9 Sep 11, 2021
a sketch of what a zkvm could look like

We want to build a ZKP that validates an entire EVM block or as much of it as we can efficiently. Its okay to adjust the gas costs for every EVM opcode. Its also to exclude some opcodes for now if they are super expensive. Its okay to exclude precompiles.

null 18 Jul 21, 2021
Write complicated anonymous functions other than lambdas in Python.

lambdex allows you to write multi-line anonymous function expression (called a lambdex) in an idiomatic manner.

Xie Jingyi 62 Aug 14, 2021
Scitizen - Help scientific research for the benefit of mankind and humanity 🔬

Scitizen - Help scientific research for the benefit of mankind and humanity ?? Scitizen has been built from the ground up to give everyone the possibi

Pierre CORBEL 18 Oct 11, 2021
A collection of full-stack resources for programmers.

A collection of full-stack resources for programmers.

Charles-Axel Dein 15.8k Oct 15, 2021
Simple python code for compile brainfuck program.

py-brainf*ck Just a basic compiled that compiles your brainf*ck codes and gives you informations about memory, used cells, dumped version, logs etc...

null 4 Jun 13, 2021
Control System Packer is a lightweight, low-level program to transform energy equations into the compact libraries for control systems.

Control System Packer is a lightweight, low-level program to transform energy equations into the compact libraries for control systems. Packer supports Python ?? , C ?? and C++ ?? libraries.

mirnanoukari 31 Oct 15, 2021
EasyBuild is a software build and installation framework that allows you to manage (scientific) software on High Performance Computing (HPC) systems in an efficient way.

EasyBuild is a software build and installation framework that allows you to manage (scientific) software on High Performance Computing (HPC) systems in an efficient way.

EasyBuild community 71 Oct 14, 2021
An extension for Arma 3 that lets you write extensions in Python 3

An Arma 3 extension that lets you to write python extensions for Arma 3. And it's really simple and straightforward to use!

Lukasz Taczuk 33 Sep 18, 2021
python DroneCAN code generation, interface and utilities

UAVCAN v0 stack in Python Python implementation of the UAVCAN v0 protocol stack. UAVCAN is a lightweight protocol designed for reliable communication

DroneCAN 1 Oct 20, 2021
PyDy, short for Python Dynamics, is a tool kit written in the Python

PyDy, short for Python Dynamics, is a tool kit written in the Python programming language that utilizes an array of scientific programs to enable the study of multibody dynamics. The goal is to have a modular framework and eventually a physics abstraction layer which utilizes a variety of backends that can provide the user with their desired workflow

PyDy 260 Sep 29, 2021
A Python simple Dice Simulator just for fun

Dice Simulator ?? A Simple Python Dice Simulator ?? ?? ?? Description: That program make your RPG session more easy and simple. Roll the dice never be

Lauro Brant 16 Jun 20, 2021
Welcome to my pod transcript search webb app!

pod_transcript_search Welcome to the pod transcript search webb app! Tech stack used: Languages used: Python (for the back-end), JavaScript (for the f

null 3 Sep 2, 2021
eyes is a Public Opinion Mining System focusing on taiwanese forums such as PTT, Dcard.

eyes is a Public Opinion Mining System focusing on taiwanese forums such as PTT, Dcard. Features ?? Article monitor: helps you capture the trend at a

Sean 96 Oct 18, 2021