{"id":47994726,"url":"https://github.com/remarkablemark/novu-framework","last_synced_at":"2026-04-04T11:53:10.450Z","repository":{"id":333789606,"uuid":"1138692857","full_name":"remarkablemark/novu-framework","owner":"remarkablemark","description":"🔔 Novu Framework for Python (WIP)","archived":false,"fork":false,"pushed_at":"2026-04-03T16:08:54.000Z","size":324,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-03T19:34:39.967Z","etag":null,"topics":["framework","novu","package","python","python3"],"latest_commit_sha":null,"homepage":"http://remarkablemark.org/novu-framework/","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/remarkablemark.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","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},"funding":{"github":["remarkablemark"],"patreon":"remarkablemark","open_collective":null,"ko_fi":"remarkablemark","tidelift":null,"community_bridge":null,"liberapay":"remarkablemark","issuehunt":null,"otechie":null,"buy_me_a_coffee":"remarkablemark","thanks_dev":"u/gh/remarkablemark","custom":["https://b.remarkabl.org/teespring"]}},"created_at":"2026-01-21T02:03:43.000Z","updated_at":"2026-04-03T16:08:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"6b67bf5f-d042-4a81-b357-7657d2463c8a","html_url":"https://github.com/remarkablemark/novu-framework","commit_stats":null,"previous_names":["remarkablemark/novu-framework"],"tags_count":0,"template":false,"template_full_name":"remarkablemark/python-package-template","purl":"pkg:github/remarkablemark/novu-framework","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remarkablemark%2Fnovu-framework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remarkablemark%2Fnovu-framework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remarkablemark%2Fnovu-framework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remarkablemark%2Fnovu-framework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/remarkablemark","download_url":"https://codeload.github.com/remarkablemark/novu-framework/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remarkablemark%2Fnovu-framework/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31398770,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"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":["framework","novu","package","python","python3"],"created_at":"2026-04-04T11:53:09.700Z","updated_at":"2026-04-04T11:53:10.441Z","avatar_url":"https://github.com/remarkablemark.png","language":"Python","readme":"# novu-framework\n\n[![PyPI version](https://img.shields.io/pypi/v/novu-framework)](https://pypi.org/project/novu-framework/)\n[![codecov](https://codecov.io/gh/remarkablemark/novu-framework/graph/badge.svg?token=bbMOIiPMI0)](https://codecov.io/gh/remarkablemark/novu-framework)\n[![lint](https://github.com/remarkablemark/novu-framework/actions/workflows/lint.yml/badge.svg)](https://github.com/remarkablemark/novu-framework/actions/workflows/lint.yml)\n\n🔔 Novu Framework allows you to write notification workflows in your Python codebase. Inspired by [@novu/framework](https://www.npmjs.com/package/@novu/framework).\n\n## Prerequisites\n\n- [Python 3.10+](https://www.python.org/)\n\n## Install\n\nInstall the package:\n\n```sh\npip install novu-framework\n```\n\n## Quick Start\n\n### Define Workflow\n\n```python\nfrom novu_framework import workflow\nfrom pydantic import BaseModel\n\nclass CommentPayload(BaseModel):\n    comment: str\n    post_id: str\n\nclass EmailControls(BaseModel):\n    subject: str = \"New Comment\"\n    include_footer: bool = True\n\n@workflow(\"comment-notification\")\ndef comment_workflow(payload: CommentPayload, step):\n    # In-app notification step (using dict)\n    step.in_app(\"new-comment\", {\n        \"body\": f\"New comment: {payload.comment}\",\n        \"action_url\": f\"/posts/{payload.post_id}\"\n    })\n\n    # Email notification step (using lambda)\n    step.email(\"comment-email\", lambda controls: {\n        \"subject\": controls.subject,\n        \"body\": f\"You received a new comment: {payload.comment}\",\n        \"footer\": \"Thanks for using our app!\" if controls.include_footer else \"\"\n    }, controlSchema=EmailControls)\n```\n\n### Trigger Workflow\n\n```python\ncomment_workflow.trigger(\n    to=\"subscriber_id_123\",\n    payload={\n        \"comment\": \"This is a great post!\",\n        \"post_id\": \"post_id_456\"\n    }\n)\n```\n\n### Serve with FastAPI\n\n```python\nfrom fastapi import FastAPI\nfrom novu_framework.fastapi import serve\n\napp = FastAPI()\nserve(app, route=\"/api/novu\", workflows=[comment_workflow])\n```\n\n### Serve with Flask\n\n```python\nfrom flask import Flask\nfrom novu_framework.flask import serve\n\napp = Flask(__name__)\nserve(app, route=\"/api/novu\", workflows=[comment_workflow])\n```\n\n## Features\n\n- **Code-First Workflows**: Define workflows using Python functions and decorators.\n- **Type Safety**: Built-in support for Pydantic models for payload validation.\n- **Multi-Channel Support**: Support for In-App, Email, SMS, and Push notifications.\n- **FastAPI Integration**: Seamlessly integrate with FastAPI applications.\n- **Flask Integration**: Seamlessly integrate with Flask applications.\n\n## License\n\n[MIT](https://github.com/remarkablemark/novu-framework/blob/master/LICENSE)\n","funding_links":["https://github.com/sponsors/remarkablemark","https://patreon.com/remarkablemark","https://ko-fi.com/remarkablemark","https://liberapay.com/remarkablemark","https://buymeacoffee.com/remarkablemark","https://thanks.dev/u/gh/remarkablemark","https://b.remarkabl.org/teespring"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremarkablemark%2Fnovu-framework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fremarkablemark%2Fnovu-framework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremarkablemark%2Fnovu-framework/lists"}