{"id":31665298,"url":"https://github.com/wybthon/wybthon","last_synced_at":"2026-04-01T21:13:19.522Z","repository":{"id":313862789,"uuid":"1051532103","full_name":"wybthon/wybthon","owner":"wybthon","description":"Experimental client‑side Python web framework (Pyodide/WebAssembly) with VDOM, signals, components, and a tiny router for building reactive SPAs.","archived":false,"fork":false,"pushed_at":"2025-10-01T20:16:13.000Z","size":902,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-01T20:32:39.039Z","etag":null,"topics":["browser","client-side","component-based","components","context-api","frontend","hyperscript","pyodide","python","reactivity","router","signals","single-page-application","spa","state-management","vdom","virtual-dom","wasm","web-framework","webassembly"],"latest_commit_sha":null,"homepage":"https://docs.wybthon.com/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wybthon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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-09-06T07:26:53.000Z","updated_at":"2025-10-01T20:15:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"4c6ce7cd-9c06-46d1-8b2c-4a1de6cd3096","html_url":"https://github.com/wybthon/wybthon","commit_stats":null,"previous_names":["wybthon/wybthon"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/wybthon/wybthon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wybthon%2Fwybthon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wybthon%2Fwybthon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wybthon%2Fwybthon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wybthon%2Fwybthon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wybthon","download_url":"https://codeload.github.com/wybthon/wybthon/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wybthon%2Fwybthon/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278671743,"owners_count":26025744,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["browser","client-side","component-based","components","context-api","frontend","hyperscript","pyodide","python","reactivity","router","signals","single-page-application","spa","state-management","vdom","virtual-dom","wasm","web-framework","webassembly"],"created_at":"2025-10-07T21:54:06.409Z","updated_at":"2026-04-01T21:13:19.503Z","avatar_url":"https://github.com/wybthon.png","language":"Python","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/banner.jpg\" alt=\"Wybthon\" width=\"800\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eBuild interactive web apps in Python, no JavaScript required.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/wybthon/wybthon/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/wybthon/wybthon/actions/workflows/ci.yml/badge.svg\" alt=\"CI\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/wybthon/wybthon/actions/workflows/release.yml\"\u003e\u003cimg src=\"https://github.com/wybthon/wybthon/actions/workflows/release.yml/badge.svg\" alt=\"Release\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://pypi.org/project/wybthon/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/v/wybthon\" alt=\"PyPI Version\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://pypi.org/project/wybthon/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/pyversions/wybthon\" alt=\"Python Versions\" /\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/pypi/l/wybthon\" alt=\"License: MIT\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://docs.wybthon.com/\"\u003e\u003cimg src=\"https://img.shields.io/website?url=https%3A%2F%2Fdocs.wybthon.com\u0026label=docs\" alt=\"Docs\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://docs.wybthon.com/\"\u003eDocumentation\u003c/a\u003e ·\n  \u003ca href=\"https://docs.wybthon.com/getting-started/\"\u003eGetting Started\u003c/a\u003e ·\n  \u003ca href=\"https://docs.wybthon.com/examples/\"\u003eExamples\u003c/a\u003e ·\n  \u003ca href=\"CONTRIBUTING.md\"\u003eContributing\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Overview\n\nWybthon is a client-side SPA framework that lets you build interactive web applications entirely in Python. Powered by Pyodide, it runs in the browser and provides a signals-first reactive model inspired by SolidJS. With fine-grained reactivity, a virtual DOM, component model, routing, forms, and context, you can write modern frontends without touching JavaScript.\n\n## Features\n\n- **Signals-first reactivity:** Fine-grained updates with `create_signal`, `create_effect`, `create_memo`, and `batch`.\n- **Virtual DOM:** Function components with efficient diffing and reconciliation.\n- **Client-side router:** Path parameters, query parsing, `Link` component, and programmatic navigation.\n- **Context API:** Share state across the component tree with `create_context` and `use_context`.\n- **Forms and validation:** Built-in form state management with validators and two-way bindings.\n- **Flow control primitives:** `Show`, `For`, `Index`, `Switch`, `Match`, and `Dynamic` for declarative rendering.\n- **Error boundaries and Suspense:** Graceful error handling and async loading states.\n- **Dev server with hot reload:** `wyb dev` launches a local server with SSE-based auto-reload.\n\n## Quick Start\n\n### Installation\n\n```bash\npip install wybthon\n```\n\n### Usage\n\n```python\nfrom wybthon import button, component, create_signal, div, p\n\n\n@component\ndef Counter(initial: int = 0):\n    count, set_count = create_signal(initial)\n\n    def render():\n        return div(\n            p(f\"Count: {count()}\"),\n            button(\"Increment\", on_click=lambda e: set_count(count() + 1)),\n        )\n\n    return render\n```\n\n## Documentation\n\nVisit [docs.wybthon.com](https://docs.wybthon.com/) for the full documentation, including getting started guides, core concepts, API reference, and working examples.\n\n## Contributing\n\nContributions are welcome. Please see [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions, coding standards, and guidelines for submitting pull requests.\n\n## License\n\n[MIT](LICENSE)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwybthon%2Fwybthon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwybthon%2Fwybthon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwybthon%2Fwybthon/lists"}