{"id":25588426,"url":"https://github.com/cybex-dev/web_callkit","last_synced_at":"2026-05-19T19:06:38.524Z","repository":{"id":277509620,"uuid":"863548837","full_name":"cybex-dev/web_callkit","owner":"cybex-dev","description":"Manage calls with an iOS-inspired Callkit for Flutter Web applications.","archived":false,"fork":false,"pushed_at":"2025-06-12T18:40:37.000Z","size":270,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-03T18:58:22.732Z","etag":null,"topics":["calling","callkit","flutter","flutter-package","flutter-plugin","flutter-ui","flutter-web","notifications","notifications-plugin","service-worker","voip","voip-client","web","web-callback"],"latest_commit_sha":null,"homepage":"https://web-callkit.web.app/","language":"Dart","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/cybex-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2024-09-26T13:39:38.000Z","updated_at":"2025-06-12T18:40:32.000Z","dependencies_parsed_at":"2025-04-01T15:36:38.693Z","dependency_job_id":"587c18de-1756-46e6-9154-bed42988b41c","html_url":"https://github.com/cybex-dev/web_callkit","commit_stats":null,"previous_names":["cybex-dev/web_callkit"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/cybex-dev/web_callkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cybex-dev%2Fweb_callkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cybex-dev%2Fweb_callkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cybex-dev%2Fweb_callkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cybex-dev%2Fweb_callkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cybex-dev","download_url":"https://codeload.github.com/cybex-dev/web_callkit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cybex-dev%2Fweb_callkit/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266572630,"owners_count":23950061,"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-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"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":["calling","callkit","flutter","flutter-package","flutter-plugin","flutter-ui","flutter-web","notifications","notifications-plugin","service-worker","voip","voip-client","web","web-callback"],"created_at":"2025-02-21T08:37:15.893Z","updated_at":"2026-05-19T19:06:38.396Z","avatar_url":"https://github.com/cybex-dev.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# web_callkit\n\n**This project is a Web Flutter plugin that facilitates handling of calls.**\n\nInspired by the iOS CallKit framework, this plugin provides the boilerplate to manage calls via a\nsimple API and provides a browser call control mechanism through browser notifications.\n\n### Notes\n\nDue to many voip providers e.g. twilio-voice.js providing their own SDKs and audio handling (\nincoming ringing, etc), this plugin is intended to be used as a boilerplate for call management and\nnot as a full-fledged voip solution.\n\nA bird's eye overview/usage of the plugin:\n\n- Notify callkit of an incoming call\n- Update state of call from VOIP/SIP provider\n- Add/update call capabilities (hold, mute, etc)\n\n## Features\n\n- Boilerplate for call management\n- Integration with browser notifications\n- Support background calls\n- Custom audio sounds for incoming calls, etc.\n\n### Call State flow\n\nThe following describes the standard call flow expected of the `CallState` enum.\n\n![](https://raw.githubusercontent.com/cybex-dev/web_callkit/refs/heads/master/doc/images/callflow.png)\n\n## Limitations\n\n### Browser notifications\n\nUse native browser integration, the following limitations apply to each platform.\n\nUsage of Flutter package [js_notifications](https://pub.dev/packages/js_notifications) is assist in\nbrowser notification integration to native systems.\nSee [js_notifications \u003e platform limitations](https://github.com/cybex-dev/js_notifications?tab=readme-ov-file#platform-limitations)\nfor more information\n\n## Installation\n\n### Import the package\n\n```dart\nimport 'package:web_callkit/web_callkit_web.dart';\n```\n\n### Copy service worker\n\nCopy the service worker file named `js_notifications-sw.js` from the `example` directory to your web\ndirectory. _The name is very important, so make sure to have the file\nnamed `js_notifications-sw.js`._\n\nThe folder structure should look like this:\n\n```\nyour_project/\n├── ...\n├── lib/\n├── web/\n│   ├── index.html\n│   ├── js_notifications-sw.js\n```\n\n**Note:** This is required for the browser to handle notifications in the background. The service\nworker will handle incoming call notifications and display them even when the app is not in focus.\n\n### Display the system call screen\n\nInform the plugin that an incoming call is being received. This will hook into the browser\nnotification system.\n\n```dart\nWebCallKitWeb.instance.displayIncomingCall\n(\nuuid: '1234',handle: 'John Doe',\n);\n```\n\n### End the call\n\nEnd the call by calling the `endCall` method. This will remove the call screen and stop the browser\nnotification. Calls are disconnected for various reasons, via local user requests or remote errors\nor disconnects with VoIP calls due to internet disruptions.\n\nThe CallKit supports `DisconnectResponse` enum to specify the reason for the call disconnection.\n\ne.g. `WebCallKitWeb.instance.reportCallDisconnected('1234', response: DisconnectResponse.local);`\n\n| Reason   | Description                                                                           |\n|----------|---------------------------------------------------------------------------------------|\n| local    | Disconnect due to a local end call request.                                           |\n| remote   | Disconnect due to a remote end call request or remote party failed to answer in time. |\n| canceled | Disconnect due to a call was cancelled.                                               |\n| missed   | Disconnect due to a incoming call was not answered in time.                           |\n| rejected | Disconnect due to incoming call was rejected.                                         |\n| busy     | Disconnect due to remote party being busy.                                            |\n| error    | Disconnect due to an error.                                                           |\n| unknown  | Disconnect response is unknown.                                                       |\n\n### Features\n\n#### Call Management\n\nCallKit provides a simple API to manage calls. The plugin provides methods to report incoming calls,\nend calls, and update call information. Futher, inspiration is taken from Android's\nConnectionService providing a set of capabilities to manage calls:\n\n##### Incoming Calls\n\nIncoming calls are displayed on the screen with the caller's name and number. The call screen can be\ncustomized with the caller's name, number, and profile picture.\n\n```dart\nWebCallKitWeb.instance.reportNewCall\n(\nuuid: '1234', handle: 'John Doe',\n);\n```\n\n##### End Calls\n\nEnd calls by calling the `endCall` method. This will remove the call screen and stop the browser\nnotification.\n\n```dart\nWebCallKitWeb.instance.reportCallDisconnected\n('1234\n'\n, response:\nDisconnectResponse\n.\nlocal\n);\n```\n\nThe response parameter is an enum of `DisconnectResponse` which specifies the reason for the call\ndisconnection. Due to the CallKit's nature, the call can be disconnected for various reasons,\nsuch as local user requests, remote errors, or disconnects with VoIP calls due to internet\ndisruptions.\n`DisconnectReseponse`s are limited call states, for example an Call with an `initiated` state\ncannot be ended with a decline.\n\nThe following described scenarios are valid DisconnectResponses for specific call states:\n\n| `CallState`   | `DisconnectResponse`                                     |\n|---------------|----------------------------------------------------------|\n| initiated     | local, remote, canceled, rejected, busy, unknown, error, |\n| ringing       | remote, missed, rejected, busy, unknown, error,          |\n| dialing       | local, rejected, busy, unknown, error,                   |\n| active        | local, remote, unknown, error,                           |\n| reconnecting  | local, remote, unknown, error,                           |\n| disconnecting | local, remote, unknown, error,                           |\n| disconnected  | local, remote, unknown, error,                           |\n\nif `strictMode` is enabled, the following valid `DisconnectResponse`s will be considered, else it\nwill be rejected (and potentially thrown) in a future update.\n\n#### Notification Integration\n\nt.b.c.\n\n#### Capabilities\n\nCallKit provides a set of capabilities to manage calls. These capabilities provide the ability for\nfeatures to be limited based on developer/user requirements.\n\nThe following describes the capabilities available:\n\n| Reason      | Description                                                 |\n|-------------|-------------------------------------------------------------|\n| hold        | Ability to place a call on hold after the call has started. |\n| supportHold | Ability to place a call on hold from the start of the call. |\n| mute        | Ability to mute a call.                                     |\n| video       | Ability to stream/support video or screenshare streaming.   |\n| silence     | Ability to silence an incoming call.                        |\n\nThe following provides an example of how to report call capabilities:\n\n```dart\nWebCallKitWeb.instance.reportCallCapabilities\n('1234\n'\n, capabilities: [CallCapability.hold, CallCapability.mute]);\n```\n\n#### Call Actions\n\nCallKit provides a set of actions to manage calls. These actions provide the ability for features to\nmanage calls from the notification tray.\n\nThe following describes the actions available:\n\n| Action            | Description                                                                                                             |\n|-------------------|-------------------------------------------------------------------------------------------------------------------------|\n| none              | No action                                                                                                               |\n| answer            | Answer \u0026 accept call intent.                                                                                            |\n| decline           | Declining call intent.                                                                                                  |\n| hangUp            | Ending a call regardless of state.                                                                                      |\n| dismiss           | Dismiss a notification.                                                                                                 |\n| callback          | Callback intent.                                                                                                        |\n| switchVideo       | Switching to video call intent subject to [CallKitCapability.switchVideo] capability.                                   |\n| switchAudio       | Switching to audio call intent, opposite of [switchVideo] and [switchScreenShare].                                      |\n| switchScreenShare | Switching to screen-share call intent, adjacent to [switchVideo] subject to [CallKitCapability.screenShare] capability. |\n| mute              | Muting a call intent subject to [CallKitCapability.mute] capability.                                                    |\n| unmute            | Unmuting a call intent, opposite of [mute].                                                                             |\n| hold              | Holding a call intent subject to [CallKitCapability.supportHold] or [CallKitCapability.hold] capability.                |\n| unhold            | Unholding a call intent, opposite of [hold].                                                                            |\n| silence           | Silencing an incoming call intent                                                                                       |\n| disableVideo      | Disabling video (on a call with video/screen share) intent                                                              |\n| enableVideo       | Enabling video (on a call with video/screen share) intent                                                               |\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcybex-dev%2Fweb_callkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcybex-dev%2Fweb_callkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcybex-dev%2Fweb_callkit/lists"}