{"id":32595276,"url":"https://github.com/europanite/client_side_python","last_synced_at":"2026-04-14T10:32:58.098Z","repository":{"id":319443138,"uuid":"1078620464","full_name":"europanite/client_side_python","owner":"europanite","description":"A Browser-Based Python Playground for Free.","archived":false,"fork":false,"pushed_at":"2025-12-26T14:55:27.000Z","size":525,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-28T02:45:16.867Z","etag":null,"topics":["android","browser","client-side","cross-platform","docker","docker-compose","emulation","emulator","expo","free","frontend","ios","metro","pyodide","python","python-emulator","python-environment","react","react-native","typescript"],"latest_commit_sha":null,"homepage":"https://europanite.github.io/client_side_python/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/europanite.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-18T04:09:28.000Z","updated_at":"2025-12-26T14:55:30.000Z","dependencies_parsed_at":"2025-10-22T10:15:45.381Z","dependency_job_id":"3900c234-ca97-4318-b8e7-81bb62c2b97f","html_url":"https://github.com/europanite/client_side_python","commit_stats":null,"previous_names":["europanite/python_fit","europanite/browser_based_python","europanite/client_side_python"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/europanite/client_side_python","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/europanite%2Fclient_side_python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/europanite%2Fclient_side_python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/europanite%2Fclient_side_python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/europanite%2Fclient_side_python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/europanite","download_url":"https://codeload.github.com/europanite/client_side_python/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/europanite%2Fclient_side_python/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31793214,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T02:24:21.117Z","status":"ssl_error","status_checked_at":"2026-04-14T02:24:20.627Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","browser","client-side","cross-platform","docker","docker-compose","emulation","emulator","expo","free","frontend","ios","metro","pyodide","python","python-emulator","python-environment","react","react-native","typescript"],"created_at":"2025-10-30T03:35:12.794Z","updated_at":"2026-04-14T10:32:58.093Z","avatar_url":"https://github.com/europanite.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [Client Side Python](https://github.com/europanite/client_side_python \"Client Side Python\")\n\n[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n![OS](https://img.shields.io/badge/OS-Linux%20%7C%20macOS%20%7C%20Windows-blue)\n[![CI](https://github.com/europanite/client_side_python/actions/workflows/ci.yml/badge.svg)](https://github.com/europanite/client_side_python/actions/workflows/ci.yml)\n[![Frontend Tests via Docker](https://github.com/europanite/client_side_python/actions/workflows/docker.yml/badge.svg)](https://github.com/europanite/client_side_python/actions/workflows/docker.yml)\n[![Deploy Expo Web to GitHub Pages](https://github.com/europanite/client_side_python/actions/workflows/deploy-pages.yml/badge.svg)](https://github.com/europanite/client_side_python/actions/workflows/deploy-pages.yml)\n\n![React Native](https://img.shields.io/badge/react_native-%2320232a.svg?style=for-the-badge\u0026logo=react\u0026logoColor=%2361DAFB)\n![TypeScript](https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge\u0026logo=typescript\u0026logoColor=white)\n![Jest](https://img.shields.io/badge/-jest-%23C21325?style=for-the-badge\u0026logo=jest\u0026logoColor=white)\n![Expo](https://img.shields.io/badge/expo-1C1E24?style=for-the-badge\u0026logo=expo\u0026logoColor=#D04A37)\n\n![\"web_ui\"](./assets/images/web_ui.png)\n\n [PlayGround](https://europanite.github.io/client_side_python/)\n\nA Browser-based Python Runner playground powered by Pyodide. Try Python code in your web browser. No server, No account, or No payment is required.\n\n---\n\n## Overview\n\nClient Side Python is a **browser-based Python playground powered by Pyodide**.  \nPython code runs **inside your browser tab** (WebAssembly, no backend).\n\nThis makes it useful for:\n\n- Quickly trying out small Python snippets\n- Demonstrating Python basics in a classroom or workshop\n- Experimenting with simple numeric or scripting tasks in a safe sandbox\n- Showing how WebAssembly + Pyodide can bring “real” Python to the browser\n\n---\n\n## Features\n\n- **Fully client-side execution**  \n  - Uses [Pyodide](https://pyodide.org) to run CPython in WebAssembly.\n  - No server, No database, No authentication required by default.\n\n- **Simple code editor + console**  \n  - Text area for Python code.\n  - Console area that shows `stdout` and `stderr`.\n  - Buttons: **Run**, **Stop**, **Clear**, **Load Sample**, **Copy Output**.\n\n- **Responsive web UI**  \n  - Built with **Expo / React Native Web**.\n  - Layout adapts to different viewport sizes (desktop / tablet).\n\n- **Deterministic CI via Docker**  \n  - Jest tests run in a Docker container.\n\n---\n\n## How It Works\n\nOn first load, the app:\n\n1. Fetches Pyodide from a CDN.\n2. Initializes the Pyodide runtime and exposes `runPythonAsync`.\n3. Attaches custom handlers for `stdout` and `stderr` so that Python output is streamed into the in-page console.\n4. Uses a simple execution token to implement a **soft Stop**:\n   - Each run increments an internal `execId`.\n   - If a run finishes with an outdated `execId`, its output is discarded.\n   - This prevents stale results from older runs from polluting the console.\n\nAll of this happens **in the browser**, without any backend API calls.\n\n---\n\n## 🚀 Getting Started\n\n### 1. Prerequisites\n- [Docker](https://www.docker.com/) \u0026 [Docker Compose](https://docs.docker.com/compose/)\n\n### 2. Build and start all services:\n\n```bash\n# set environment variables:\nexport REACT_NATIVE_PACKAGER_HOSTNAME=${YOUR_HOST}\n\n# Build the image\ndocker compose build\n\n# Run the container\ndocker compose up\n```\n\n### 3. Test:\n```bash\ndocker compose \\\n-f docker-compose.test.yml up \\\n--build --exit-code-from \\\nfrontend_test \n```\n\n---\n\n# License\n- Apache License 2.0","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feuropanite%2Fclient_side_python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feuropanite%2Fclient_side_python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feuropanite%2Fclient_side_python/lists"}