{"id":29573017,"url":"https://github.com/aprilahijriyan/asgify","last_synced_at":"2026-01-20T17:28:12.733Z","repository":{"id":303552792,"uuid":"1015763371","full_name":"aprilahijriyan/asgify","owner":"aprilahijriyan","description":"Opinionless ASGI Framework 🙌","archived":false,"fork":false,"pushed_at":"2025-07-15T15:56:07.000Z","size":168,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-17T10:48:31.915Z","etag":null,"topics":["asgi","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aprilahijriyan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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}},"created_at":"2025-07-08T02:23:04.000Z","updated_at":"2025-07-15T15:54:10.000Z","dependencies_parsed_at":"2025-07-08T08:22:34.806Z","dependency_job_id":"2e8107e9-c64a-459e-a024-1fbee1cce6ef","html_url":"https://github.com/aprilahijriyan/asgify","commit_stats":null,"previous_names":["aprilahijriyan/asgify"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/aprilahijriyan/asgify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aprilahijriyan%2Fasgify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aprilahijriyan%2Fasgify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aprilahijriyan%2Fasgify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aprilahijriyan%2Fasgify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aprilahijriyan","download_url":"https://codeload.github.com/aprilahijriyan/asgify/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aprilahijriyan%2Fasgify/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272267810,"owners_count":24903781,"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-08-26T02:00:07.904Z","response_time":60,"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":["asgi","python"],"created_at":"2025-07-19T05:12:49.084Z","updated_at":"2026-01-20T17:28:12.721Z","avatar_url":"https://github.com/aprilahijriyan.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# asgify\n\nOpinionless ASGI Framework 🙌\n\n\u003e Lightweight API to simplify [core ASGI specification](https://asgi.readthedocs.io/en/latest/introduction.html)\n\n## 📦 Installation\n\n### Using pip\n\n```bash\npip install asgify\n```\n\n### Using uv (Recommended)\n\n```bash\nuv add asgify\n```\n\n### From Source\n\n```bash\ngit clone https://github.com/aprilahijriyan/asgify.git\ncd asgify\npip install -e .\n```\n\n## 🚀 Showcase\n\n### HTTP Application Example\n\n```python\nimport json\nfrom asgify.app import Asgify\nfrom asgify.context import HTTPContext\nfrom asgify.status import HTTP_200_OK, HTTP_201_CREATED, HTTP_404_NOT_FOUND, HTTP_STATUS_CODES\n\n\nasync def http_handler(ctx: HTTPContext):\n    # Get path and method\n    path = ctx.path\n    method = ctx.method\n\n    if path == \"/\" and method == \"GET\":\n        await ctx.start(HTTP_200_OK, {\"content-type\": \"application/json\"})\n        await ctx.end(json.dumps({\"message\": \"Hello from asgify!\"}).encode())\n\n    elif path.startswith(\"/users/\") and method == \"GET\":\n        user_id = path.split(\"/users/\")[-1]\n        page = ctx.params.get(\"page\", \"1\")\n\n        await ctx.start(HTTP_200_OK, {\"content-type\": \"application/json\"})\n        await ctx.end(\n            json.dumps({\"user_id\": user_id, \"page\": page, \"status\": \"active\"}).encode()\n        )\n\n    elif path == \"/api/data\" and method == \"POST\":\n        # Read JSON body\n        body = b\"\"\n        async for chunk in ctx.read_body():\n            body += chunk\n\n        data = json.loads(body.decode())\n\n        await ctx.start(HTTP_201_CREATED, {\"content-type\": \"application/json\"})\n        await ctx.end(json.dumps({\"created\": True, \"data\": data}).encode())\n\n    else:\n        await ctx.start(HTTP_404_NOT_FOUND, {\"content-type\": \"text/plain\"})\n        await ctx.end(HTTP_STATUS_CODES[HTTP_404_NOT_FOUND].encode())\n\n\napp = Asgify(http=http_handler)\n\n```\n\nTo run the HTTP server example above using [uvicorn](https://www.uvicorn.org/), save the code to a file (for example, `showcase_http.py`) and run the following command in your terminal:\n\n```sh\nuvicorn showcase_http:app\n```\n\n### WebSocket Application Example\n\n```python\nimport json\nfrom datetime import datetime\n\nfrom asgify.app import Asgify\nfrom asgify.context import WebSocketContext\nfrom asgify.errors import ClientDisconnected\n\n\nasync def websocket_handler(ctx: WebSocketContext):\n    await ctx.accept()\n    await ctx.send_bytes(\"Welcome to asgify 🚀\".encode())\n    while True:\n        try:\n            data = await ctx.receive_text()\n            print(\"\u003c\", data)\n            reply = json.dumps({\"echo\": data, \"timestamp\": datetime.now().isoformat()})\n            await ctx.send_text(reply)\n            print(\"\u003e\", reply)\n        except ClientDisconnected:\n            print(\"disconnected with client\")\n            break\n\napp = Asgify(websocket=websocket_handler)\n```\n\nTo run the WebSocket server example above using [uvicorn](https://www.uvicorn.org/), save the code to a file (for example, `showcase_websocket.py`) and run the following command in your terminal:\n\n```sh\nuvicorn showcase_websocket:app\n```\n\nTesting with [wscat](https://github.com/websockets/wscat/):\n\n```sh\n❯ wscat -P -c http://localhost:8000\nConnected (press CTRL+C to quit)\n\u003c Welcome to asgify 🚀\n\u003e hehehe\n\u003c {\"echo\": \"hehehe\", \"timestamp\": \"2025-07-08T13:06:34.899579\"}\n\u003e %\n```\n\n## ✨ Cool Features\n\n### 🚀 **Zero Overhead**\n\n- Pure ASGI implementation with minimal dependencies\n- No magic, no hidden costs - what you write is what you get\n\n### 🎯 **Context Classes That Rock**\n\n\u003e _The python web framework out there has the same style, but asgify is different because it uses Context to handle requests and responses!_\n\n```python\n# HTTP Context - Simple \u0026 Powerful\nawait ctx.start(HTTP_200_OK, {\"content-type\": \"application/json\"})\nawait ctx.end(json.dumps({\"message\": \"Hello World\"}).encode())\n\n# WebSocket Context - Real-time Ready\nawait ctx.accept()\nmessage = await ctx.receive_text()\nawait ctx.send_text(f\"Echo: {message}\")\n```\n\n### 🎨 **Customizable Everything**\n\n- Swap context classes for your needs\n- Custom lifespan handlers for app lifecycle\n- Full control over request/response flow\n\n### 📦 **Minimal Dependencies**\n\n- Only `asgiref`, `fast-query-parsers` and `multidict`\n- No bloat, no surprises\n\n### 🔧 **Developer Experience**\n\n- Clean, intuitive API\n- Comprehensive status codes (HTTP + WebSocket)\n- Built-in query parameter parsing\n- Application state management\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faprilahijriyan%2Fasgify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faprilahijriyan%2Fasgify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faprilahijriyan%2Fasgify/lists"}