From c66fb684f00babc0032a0be905ab2f202f2e3f6c Mon Sep 17 00:00:00 2001 From: stratself Date: Mon, 12 Oct 2026 09:23:45 +0000 Subject: [PATCH] docs: Add guide for push notifications (#2244) Adds a page for push notifications under /guides. The main thing it covers are how push works in Matrix, UnifiedPush usage and selfhosting, and some troubleshooting of common push issues. I took the liberty to include various aspects of push not pertaining to the server itself, because it was commonly asked in our chatrooms and are quite important for all matrix users. Kind of like livekit. Closes #2136 Reviewed-on: https://forgejo.ellis.link/continuwuation/continuwuity/pulls/2244 Reviewed-by: Jade Ellis Reviewed-by: Henry-Hiles Reviewed-by: lveneris --- changelog.d/2244.doc.md | 1 + docs/deploying.mdx | 2 +- docs/guides/_meta.json | 5 + docs/guides/push-operation-gateway.webp | Bin 0 -> 32280 bytes docs/guides/push-operation-webpush.webp | Bin 0 -> 26372 bytes docs/guides/push-registration.webp | Bin 0 -> 27920 bytes docs/guides/push.mdx | 215 + .../guides/push-notifications.excalidraw | 4301 +++++++++++++++++ rspress.config.ts | 3 + 9 files changed, 4526 insertions(+), 1 deletion(-) create mode 100644 changelog.d/2244.doc.md create mode 100644 docs/guides/push-operation-gateway.webp create mode 100644 docs/guides/push-operation-webpush.webp create mode 100644 docs/guides/push-registration.webp create mode 100644 docs/guides/push.mdx create mode 100644 docs/public/guides/push-notifications.excalidraw diff --git a/changelog.d/2244.doc.md b/changelog.d/2244.doc.md new file mode 100644 index 000000000..4a883c693 --- /dev/null +++ b/changelog.d/2244.doc.md @@ -0,0 +1 @@ +Add a guide for push notifications, detailing how it works, push gateway specifics, troubleshooting common issues, and pointing to external guides for UnifiedPush backends. Contributed by @stratself diff --git a/docs/deploying.mdx b/docs/deploying.mdx index ccabe1475..3a33819fe 100644 --- a/docs/deploying.mdx +++ b/docs/deploying.mdx @@ -99,7 +99,7 @@ ## Post-installation - To set up Audio/Video communication, see the [**Calls**](./calls.mdx) page. -- See the [**Authentication chapter**] for various ways to access to your homeserver, such as logging in with an external OIDC provider. +- See the [**Authentication chapter**](./authentication.mdx) for various ways to access to your homeserver, such as logging in with an external OIDC provider. - Consult the [**Maintenance**](./maintenance.mdx) page for guidance on maintaining your homeserver. diff --git a/docs/guides/_meta.json b/docs/guides/_meta.json index 503a3ea7a..178a42d01 100644 --- a/docs/guides/_meta.json +++ b/docs/guides/_meta.json @@ -23,5 +23,10 @@ "type": "file", "name": "oidc", "label": "Delegated authentication" + }, + { + "type": "file", + "name": "push", + "label": "Push notifications" } ] diff --git a/docs/guides/push-operation-gateway.webp b/docs/guides/push-operation-gateway.webp new file mode 100644 index 0000000000000000000000000000000000000000..6072f30edb70452d638b78b8d39205c78203599c GIT binary patch literal 32280 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 literal 0 HcmV?d00001 diff --git a/docs/guides/push-operation-webpush.webp b/docs/guides/push-operation-webpush.webp new file mode 100644 index 0000000000000000000000000000000000000000..34edfa01b1d2ed0aa9674755fb3f5852c387c943 GIT binary patch literal 26372 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 T3!!!g{U@XUGWzfKfr0@5LvNTr literal 0 HcmV?d00001 diff --git a/docs/guides/push-registration.webp b/docs/guides/push-registration.webp new file mode 100644 index 0000000000000000000000000000000000000000..e297ea371193a98c4b9765238ecda04540fe0129 GIT binary patch literal 27920 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≷a!g-eE8JDkY=-Mz#3pj3 z66UoUA64U1|ia%L+?2Y2&PI-itxa2roPaP5+85iMQlJrZXpw&(pSm_+e+?nDxycx2N zaZB{Jgy~zC?=fY!aKK?c+GOog)3bQ-HH;9^t=6>=!0e{`URKRX|w*)i*Ql|J= z-@BgOy1?tH?NhetD1NiTndurcdJgsR(Ra4;LT5IiU&wgzNzw=55gsV*xThxjeaarn z(@o2ISY<1x2%yO7dx~-1UlTx>a#H)`xK)Rg`wR#VDS(Zu{@`YpmFvC3n|pVZ%@swa zIkEOu*Qc-Zx_JVyE*DHV&ITO5e!~jA(h9`Usp~`5JWLqu?j<4doH+cxx^Bqn&X>1t zI(Xz1r7HRJ^*hrge5sv)+4mwvGdY(Hv-jMj-o1|*7qby*&2^kdyFV9sA)lRkB_UZR zQ%)$mZ`^lBMI+MlsgsY(x#ljzzptn*zLQhmWh@9FWSs3^Y2q47+Yr^}Nq$x>$(r`w zoU-gI>`)X^GLIZHSMSRtSyq>q0r)CS6USnkFxe0kjVnKGMW32O-VvMSOHRgf-r*CZ z_HDZkOs(ct_)p%cH_v{a@&9~%J;~@ku<#~Y{C)DsFggEV7cWMs=yrob!0|v4Yqc(S z7i?_a&3`ZmXRfI0SA3SUv+WVE>7|3vsnHp6H8Bl4o3gVy`(C?T9`-D?v=fDUxGe$l zGmkucL@cq)-_QBd$uYwOrpNUn_mOxc%xY&R@A{Oeo2SCLn>67&hEq?aSdsa%w;b6z z+BYwR{O}IHmZ4KI_)fj#yRvob>Rs^lGIKqrvQ}l=?;$mfzT-(m4!vdI|Htkf<-Q$c zO>L_4sK{-Sh6nBK?c8QF}=P6|0G?Q&RNRt z7R2$KPw?XC%LCUZe^GGw#A=L9w>}U^)PUD8q;az}@3`3cP4t~4O#|*B@+}#1R{h%% zi|dd=F(qf)Su@dY{E?j${uF0U{34HO>O?my*07J6_X=F*Z&0TrFp$+xluH2uH6!X& z4%bq&)alrZ7s72u%)8*wT0)b?a#++elIA3bMkgmqC!^3FU$fJvllpL`uyWxiCSZi@ zto%<)Ld_4eZ=mcRuCKvk6VxPi=2Z(KUn@u!ve^eG{%NVLiQBUq9FV!38TVdg)$P#J z&}%Tqlpsx>y~7U=Zz`FgEgvSQ6l`G9w{z6Si0c@suN&<-oytt~;p{H%qBK};v*OX=+hVY*bK654>=K9*%H%z31->Tn~2Q>uHg++M>#ar6Y?EpT5(O# zLFpI2b`f$P0S8wxQG;RN@6l+&sKzyRM$$oZrg7=&XNej&cPt*zUV{?SCjT z>GoPw=+LA@DFKuH?Wkzf*BIE)X+_euQujpF z6CkgP$z#qmrcs+qzJrl+R$0e8RSmi~-&=}1{(D)t9bn_mQ=Cm95H*^P+x@8zAI|kA z{eaE)NCB(y+DOLDL4sMBKC0X(?h86BJ5|pI*)SPp^1MlBpq|V}1ldUm=M*s9T2l&p zK}UZJ1?A(%qAPv}O2?I2M80ZC3(oq&499>wWPmQB@4VsYsm&u z#XyZ@sTI}Fm}K&ZYws`11hA0?G~^cj892()``;2&CyNU4PQ_{f=<94)(6ruly&^vz@Q`{@+iFGLeJ7 F{SN_LcX0p! literal 0 HcmV?d00001 diff --git a/docs/guides/push.mdx b/docs/guides/push.mdx new file mode 100644 index 000000000..00a6c8e88 --- /dev/null +++ b/docs/guides/push.mdx @@ -0,0 +1,215 @@ +import { Tab, Tabs } from '@rspress/core/theme'; + +# Push notifications + +Matrix clients receive notifications in the following ways: + +- **In-band notifications**, which are shown when the client actively syncs with the server. +- **Push notifications**, which are posted to the client by the server through an external push service. This is typically used to send out-of-band notifications to mobile devices, and it is the focus of this page. + +Generally, your mobile device is preconfigured for push notifications out of the box. The details below are for advanced use cases, such as using an alternative push backend (like UnifiedPush) or hosting your own. + +## Overview + +Continuwuity supports two push methods: the legacy **Matrix Push Gateway** and the new **Web Push** protocol. The former is currently supported by more clients, but the latter enables end-to-end-encrypted push notifications. They work as follows: + + + +Diagram showing the push registration flow, described in the text below. + +1. A client app obtains a _push key_ from the push app that it hooks up to. +2. Then, it registers a _pusher_ with Continuwuity, bringing along the _push key_ and the following additional information: + - For the Push Gateway method: The _push gateway_ URL, which is [provided by the client](#unifiedpush-and-push-gateways). + - For the Web Push method: Some _encryption details_ generated by the client, so the server knows how to encrypt its push payloads. + + + + +Diagram showing the push operation with the Push Gateway method, described in the text below. + +1. Continuwuity pushes messages to the push gateway +2. The push gateway converts the messages to a suitable format and forwards them to the push provider server. +3. The push provider server passes them along to the push app. +4. The push app wakes the client, prompting it to fetch new messages from Continuwuity. +5. Finally, the client calculates against a set of _push rules_ to determine whether the fetched message(s) should be notified to users. + + + + +Diagram showing the push operation with the Web Push method, described in the text below. + +1. Continuwuity pushes encrypted messages to the push provider server. +2. The push provider server passes them along to the push app. +3. The push app wakes the client, which decrypts the payload, and if needed, fetches new messages from Continuwuity. +4. Finally, the client calculates against a set of _push rules_ to determine whether the pushed message(s) should be notified to users. + +Note that this mechanism does not require a push gateway component. + +[MSC4174]: https://github.com/matrix-org/matrix-spec-proposals/pull/4174 + + + + + +_([excalidraw file of the diagrams](/guides/push-notifications.excalidraw))_ + +Therefore, Continuwuity's role within this system is to keep track of client-registered _pushers_ and send relevant payloads to them. To view and manage these pushers, use the [`!admin query pusher`](../reference/admin/query.md#admin-query-pusher) set of commands. + +## UnifiedPush + +[UnifiedPush][unifiedpush] is an open and self-hostable notifications system that is supported by many Matrix clients on Android and Linux. It is compatible with both the Web Push and Push Gateway mechanisms, and therefore requires no additional setup from the homeserver. + +:::info Debugging UnifiedPush +To debug and test your UnifiedPush installation, use the [UP-Example] app for Android and the [UnifiedPush Troubleshooter] app for Linux distributions. +::: + +[unifiedpush]: https://unifiedpush.org +[UP-Example]: https://codeberg.org/UnifiedPush/android-example +[UnifiedPush Troubleshooter]: https://flathub.org/en/apps/org.unifiedpush.Troubleshooter + +### UnifiedPush and push gateways + +The push gateway URL is usually pre-configured by the client app. However, some clients (such as Element X) implement UnifiedPush's [Gateway Discovery] mechanism, and attempt to detect a push gateway _on the same domain as the push provider_, before falling back to a hardcoded one. + +Per the [spec][spec-push-gateway-api], these push gateways must be available on the `/_matrix/push/v1/notify` path of said domain. To test that a push gateway is accessible to the homeserver, make a request for it from the homeserver's IP: + +```txt +curl https://push.example.com/_matrix/push/v1/notify +{"unifiedpush":{"gateway":"matrix"}} +``` + +[Gateway Discovery]: https://unifiedpush.org/users/gateway/#discovery--hosting + +### ntfy + +[ntfy][ntfy] is a widely supported UnifiedPush implementation, with an easy-to-install push app and plenty of publicly available instances. Its server includes an embedded Matrix push gateway and can be self-hosted. + +Some tutorials on self-hosting ntfy can be found below: + +- [Official ntfy self-hosting tutorial][official-ntfy-selfhosting] +- [Element's tutorial on Unified Push and ntfy][element-ntfy] + +:::warning Avoid ntfy.sh +Avoid using the `https://ntfy.sh` push server, which is configured as the default in the ntfy app. This server is known to ratelimit requests aggressively. +::: + +[ntfy]: https://ntfy.sh +[element-ntfy]: https://docs.element.io/latest/element-support/element-androidios-client-settings/using-unified-push-and-ntfy-for-push-notifications/ +[official-ntfy-selfhosting]: https://docs.ntfy.sh/install/ + +### Other UnifiedPush distributors + +To find a list of other UnifiedPush distributors, visit this [page][unifiedpush-distributors]. + +[unifiedpush-distributors]: https://unifiedpush.org/users/distributors/ + +Community tutorials for selfhosting some of these stacks are listed below. Unless stated otherwise, they are all tested against Element X Android and the push gateway mechanism, but they should work with Web Push as well. + +- [Self-hosting Sunup for Matrix and UnifiedPush][kimiblock-selfhosting-sunup], by Kimiblock. + - Push gateway: [common-proxies] + - Push server: [autopush-rs] + - Push app: [Sunup][sunup] +- [Matrix notifications on Android, powered by XMPP][stratself-xmpp], by stratself. + - Push gateway: [common-proxies] + - Push server: [ejabberd's mod_unified_push] + - Push app: [Conversations] (and forks) +- [Element X push notifications via Conversations][alfredolin-xmpp], by Alfredo Lin. + - Push gateway: [common-proxies] + - Push server: [Prosody's mod_unified_push] + - Push app: [Conversations] +- Nextcloud's NextPush flow, which uses the following stack: + - Push server + push gateway: [uppush] (selfhosting tutorial included) + - Push app: [NextPush Android] + +[kimiblock-selfhosting-sunup]: https://blog.kimiblock.top/2025/09/11/selfhosting-sunup/ +[stratself-xmpp]: https://muoi.me/~stratself/articles/matrix-notifs-xmpp +[alfredolin-xmpp]: https://alfredolin.eu/blog/2026/07/24/element-x-push-notifications-via-conversations/ +[common-proxies]: https://codeberg.org/UnifiedPush/common-proxies/ +[sunup]: https://codeberg.org/Sunup/android +[autopush-rs]: https://github.com/mozilla-services/autopush-rs +[ejabberd's mod_unified_push]: https://github.com/processone/ejabberd-contrib/tree/master/mod_unified_push +[Prosody's mod_unified_push]: https://modules.prosody.im/mod_unified_push +[Conversations]: https://conversations.im +[uppush]: https://codeberg.org/NextPush/uppush +[NextPush Android]: https://codeberg.org/NextPush/nextpush-android + +## Troubleshooting + +Issues with push notifications can arise from the components of the system beyond your homeserver (for example, if the connection fails between the gateway and the push server). Make sure you check the logs of these components for debugging as well. + +### Locally hosted push gateways / push providers + +Outbound requests, including push notifications, follows the `ip_range_denylist` config option which refuses loopback and private-range destinations by default. This would break against push components that are self-hosted on a LAN address, and will result in these log entries at push creation time: + +```txt +WARN conduwuit_service::pusher: Pusher URL is a forbidden remote address url=https://push.example.com/_matrix/push/v1/notify +``` + +To fix this, remove your push gateway or push server's address from `ip_range_denylist`, and restart Continuwuity to apply the changes. + +### Push notifications not audible/not displaying + +This is likely an issue with your account's _push rules_, which determines which events are shown to to the user as notifications. Check these push rules in the client's notifications settings and tweak accordingly. Continuwuity also provides an [`!admin users reset-push-rules`](../reference/admin/users#admin-users-reset-push-rules) command, which restores the rules to the default of notifying for every message. + +Another reason may be that push background services are frequently being terminated by your operating system, which is a [well-known problem][dontkillmyapp] with many Android-based systems. To fix this, follow your operating system's instructions to exempt your push app from background restrictions. + +Otherwise, if you find Continuwuity not sending push notifications according to the spec, feel free to discuss in our [support room][support-room] or open an issue. + +[dontkillmyapp]: https://dontkillmyapp.com +[support-room]: https://matrix.to/#/#continuwuity:continuwuity.org?via=continuwuity.org&via=ellis.link&via=explodie.org&via=matrix.org + +### Various "Could not send request to pusher" log entries + +If you find spurious log entries like this in your Continuwuity deployment: + +```txt +WARN push{user_id="@user:example.com" pushkey="very-long-string-of-letters" events=1}:send_push_notice:send_notice:send_request: conduwuit_service::pusher: Could not send request to pusher https//push.example.com: error sending request for url (https://push.example.com/_matrix/push/v1/notify) +``` + +Then, your server is most likely sending push requests to too many invalid targets. This could be due to one of the following reasons: + +#### Connection issues between the server and the push gateway + +Verify that the connection to the push gateway is working correctly. This includes checking firewall rules, DNS, and that the push gateway is online. The section on [locally-hosted gateways/push providers](#locally-hosted-push-gateways--push-providers) may also apply to you. + +#### Expired push endpoints + +Active Matrix clients periodically renew their pushkeys as the old ones expire, and consequently register them against Continuwuity. As these pushers build up over time, the homeserver will keep sending more requests to an increasing number of "dead" push endpoints. This results in the errors seen above, and can heavily impact performance if not mitigated. + +To work around this issue, the following actions can be taken: + +- Delete all of a user's pushers with the [`!admin query pusher delete-all-user`](../reference/admin/query##admin-query-pusher-delete-all-user) command. This command is not typically disruptive, as active clients will re-register new pushers the next time they log on. +- Alternatively, delete one's own pushers from a client that supports doing so. Currently this only includes FluffyChat and Element Classic/SchildiChat Legacy. + +While clients are supposed to automatically delete old pushers under their own control, this behaviour has been inconsistent. A further discussion of this issue can be found in [#2242][issue-2242]. + +[issue-2242]: https://forgejo.ellis.link/continuwuation/continuwuity/issues/2242 + +## Related Documentation + +Specifications: + +- [Matrix specification for the Push Gateway API][spec-push-gateway-api] +- [Matrix Client-Server API for push notifications][spec-c-s-push-notifications] +- [UnifiedPush specifications][unifiedpush-spec] +- [MSC4174: Web push][MSC4174] +- [Web Push RFCs][webpush-rfcs] + +Other: + +- [Matrix Push Rules and Notifications][clokep-push] - blogpost on push rules in Matrix + +[webpush-rfcs]: https://datatracker.ietf.org/wg/webpush/documents/ +[spec-push-gateway-api]: https://spec.matrix.org/latest/push-gateway-api/ +[spec-c-s-push-notifications]: https://spec.matrix.org/latest/client-server-api/#push-notifications +[unifiedpush-spec]: https://unifiedpush.org/developers/spec/definitions/ +[clokep-push]: https://patrick.cloke.us/posts/2023/05/08/matrix-push-rules-notifications/ diff --git a/docs/public/guides/push-notifications.excalidraw b/docs/public/guides/push-notifications.excalidraw new file mode 100644 index 000000000..7e3bb079b --- /dev/null +++ b/docs/public/guides/push-notifications.excalidraw @@ -0,0 +1,4301 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://draw.mrkk.me", + "elements": [ + { + "id": "HQPYilZwiNnwoKXdEfXtp", + "type": "rectangle", + "x": -1055.426064723172, + "y": 785.8549367392742, + "width": 199.03729886415238, + "height": 109.22344274196931, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3B", + "roundness": { + "type": 3 + }, + "seed": 1229862245, + "version": 2419, + "versionNonce": 973831694, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "yjZA0K7mvtG3BLoPjl6jq" + } + ], + "updated": 1790701474029, + "link": null, + "locked": false + }, + { + "id": "yjZA0K7mvtG3BLoPjl6jq", + "type": "text", + "x": -1047.857412239338, + "y": 790.8549367392742, + "width": 183.89999389648438, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3C", + "roundness": null, + "seed": 386678981, + "version": 2379, + "versionNonce": 1078758478, + "isDeleted": false, + "boundElements": [], + "updated": 1790701474029, + "link": null, + "locked": false, + "text": "Push Gateway", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "HQPYilZwiNnwoKXdEfXtp", + "originalText": "Push Gateway", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "uNFX7scF1TiJke-vPK8u-", + "type": "rectangle", + "x": -760.7387637324496, + "y": 785.8549371966577, + "width": 224.4598598378749, + "height": 135.04422845483313, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3D", + "roundness": { + "type": 3 + }, + "seed": 1269948453, + "version": 1644, + "versionNonce": 497559634, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "bymQoTdBY_WL_kEeWQ4h6" + }, + { + "id": "6uq_VPW8AeOfdqEjBk200", + "type": "arrow" + } + ], + "updated": 1790701436629, + "link": null, + "locked": false + }, + { + "id": "bymQoTdBY_WL_kEeWQ4h6", + "type": "text", + "x": -737.0338353393911, + "y": 790.8549371966577, + "width": 177.0500030517578, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3E", + "roundness": null, + "seed": 1294766981, + "version": 1575, + "versionNonce": 48451090, + "isDeleted": false, + "boundElements": [], + "updated": 1790701436629, + "link": null, + "locked": false, + "text": "Push Provider", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "uNFX7scF1TiJke-vPK8u-", + "originalText": "Push Provider", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "NGpn6bPr4Z7RhsqL5Pd51", + "type": "rectangle", + "x": -816.7367732243889, + "y": 1105.6797446647345, + "width": 237.92059680463137, + "height": 123.6442295481495, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3F", + "roundness": { + "type": 3 + }, + "seed": 1835797390, + "version": 1593, + "versionNonce": 928011986, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "EjJXE3mQlJtzVGX37T02Y" + }, + { + "id": "6uq_VPW8AeOfdqEjBk200", + "type": "arrow" + } + ], + "updated": 1790701182707, + "link": null, + "locked": false + }, + { + "id": "EjJXE3mQlJtzVGX37T02Y", + "type": "text", + "x": -759.9514740591337, + "y": 1110.6797446647345, + "width": 124.3499984741211, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3G", + "roundness": null, + "seed": 65484357, + "version": 1579, + "versionNonce": 1149349010, + "isDeleted": false, + "boundElements": [], + "updated": 1790701182707, + "link": null, + "locked": false, + "text": "Push App", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "NGpn6bPr4Z7RhsqL5Pd51", + "originalText": "Push App", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "vs0m73D3bP8GcDCr5tvsL", + "type": "rectangle", + "x": -1397.6879134005105, + "y": 1101.6877187789933, + "width": 225.50894402869181, + "height": 127.63625482741887, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3H", + "roundness": { + "type": 3 + }, + "seed": 479339941, + "version": 1174, + "versionNonce": 1417824850, + "isDeleted": false, + "boundElements": [ + { + "id": "egIROa7aw-KM_i1X_A37I", + "type": "arrow" + }, + { + "id": "PtCqap9OVS2FwA5NnEPJC", + "type": "text" + } + ], + "updated": 1790701182707, + "link": null, + "locked": false + }, + { + "id": "PtCqap9OVS2FwA5NnEPJC", + "type": "text", + "x": -1353.1084444379223, + "y": 1106.6877187789933, + "width": 136.35000610351562, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3I", + "roundness": null, + "seed": 1961371909, + "version": 1173, + "versionNonce": 1579757586, + "isDeleted": false, + "boundElements": [], + "updated": 1790701182707, + "link": null, + "locked": false, + "text": "Client App", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "vs0m73D3bP8GcDCr5tvsL", + "originalText": "Client App", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "bAGeQ8EwBhJCBBeQTAlDL", + "type": "rectangle", + "x": -1419.3430185254274, + "y": 1078.9750873462324, + "width": 865.8902805994046, + "height": 165.98577827459138, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3J", + "roundness": { + "type": 3 + }, + "seed": 241614949, + "version": 838, + "versionNonce": 2142262610, + "isDeleted": false, + "boundElements": [], + "updated": 1790702064225, + "link": null, + "locked": false + }, + { + "id": "ixLUPvCthq8LZhRuF_hVp", + "type": "text", + "x": -1052.1218753865253, + "y": 1245.9312382691605, + "width": 119.44999694824219, + "height": 25, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3K", + "roundness": { + "type": 2 + }, + "seed": 1591438277, + "version": 1288, + "versionNonce": 1466291090, + "isDeleted": false, + "boundElements": [], + "updated": 1790701182707, + "link": null, + "locked": false, + "text": "Client Device", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Client Device", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "vgutdGIekTT5YHt-IZqA-", + "type": "arrow", + "x": -825.2703985167915, + "y": 1153.607491989068, + "width": 338.37494313571085, + "height": 1.3287401107854748, + "angle": 0, + "strokeColor": "#e8400c", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3L", + "roundness": { + "type": 2 + }, + "seed": 1180936997, + "version": 1506, + "versionNonce": 1151752142, + "isDeleted": false, + "boundElements": [], + "updated": 1790701223574, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -338.37494313571085, + -1.3287401107854748 + ] + ], + "startBinding": null, + "endBinding": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "6-_VnWH_N-ujHQZvEVX1L", + "type": "rectangle", + "x": -1095.1039106424585, + "y": 756.3714725719008, + "width": 587.080291524579, + "height": 184.64804132270473, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3O", + "roundness": { + "type": 3 + }, + "seed": 826859845, + "version": 976, + "versionNonce": 417531214, + "isDeleted": false, + "boundElements": [], + "updated": 1790701430829, + "link": null, + "locked": false + }, + { + "id": "JzRhQwHYAyCD9O9Ty-DaW", + "type": "text", + "x": -1382.5394387267222, + "y": 1165.505846380709, + "width": 195.21199644051075, + "height": 50, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3Q", + "roundness": { + "type": 2 + }, + "seed": 1880822789, + "version": 483, + "versionNonce": 896692238, + "isDeleted": false, + "boundElements": [], + "updated": 1790701261608, + "link": null, + "locked": false, + "text": "(e.g. Element X,\nNexus, Sable)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. Element X, Nexus, Sable)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "_p135y1GIjiIED0YmhNxe", + "type": "text", + "x": -812.0855348418297, + "y": 1162.4621444887061, + "width": 228.61812022537254, + "height": 50, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3R", + "roundness": { + "type": 2 + }, + "seed": 436489061, + "version": 536, + "versionNonce": 2080944530, + "isDeleted": false, + "boundElements": [ + { + "id": "SDDVDVT5Z9jQwoIlhNF5G", + "type": "arrow" + } + ], + "updated": 1790701270825, + "link": null, + "locked": false, + "text": "(e.g. ntfy android, Sunup,\nGoogle Play Services)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. ntfy android, Sunup, Google Play Services)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "tLtRVL4XTEfK7HIyoq_eK", + "type": "text", + "x": -750.9677133038938, + "y": 840.4666577858362, + "width": 204.91775851134645, + "height": 75, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3S", + "roundness": { + "type": 2 + }, + "seed": 1418696389, + "version": 901, + "versionNonce": 594231442, + "isDeleted": false, + "boundElements": [], + "updated": 1790701500597, + "link": null, + "locked": false, + "text": "(e.g. ntfy server,\nautopush-rs, Google\nFCM)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. ntfy server, autopush-rs, Google FCM)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "BjcOflLiUd4jVDo1xFYgP", + "type": "text", + "x": -1045.6864010958939, + "y": 840.4666580822455, + "width": 179.55797194969554, + "height": 50, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3T", + "roundness": { + "type": 2 + }, + "seed": 1784313381, + "version": 1071, + "versionNonce": 488440974, + "isDeleted": false, + "boundElements": [], + "updated": 1790701486213, + "link": null, + "locked": false, + "text": "(e.g. Sygnal,\ncommon-proxies)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. Sygnal, common-proxies)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "6uq_VPW8AeOfdqEjBk200", + "type": "arrow", + "x": -648.4349715882034, + "y": 926.899165651491, + "width": 1.5091020924134, + "height": 172.78057901324348, + "angle": 0, + "strokeColor": "#e8400c", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3W", + "roundness": { + "type": 2 + }, + "seed": 1913621573, + "version": 519, + "versionNonce": 1764998098, + "isDeleted": false, + "boundElements": [], + "updated": 1790701436629, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.5091020924134, + 172.78057901324348 + ] + ], + "startBinding": { + "elementId": "uNFX7scF1TiJke-vPK8u-", + "mode": "orbit", + "fixedPoint": [ + 0.5003290665215688, + 1.044429888405093 + ] + }, + "endBinding": { + "elementId": "NGpn6bPr4Z7RhsqL5Pd51", + "mode": "orbit", + "fixedPoint": [ + 0.7137293114140901, + -0.04852632445466031 + ] + }, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "qaxRm4BsTqCpHb2XVLL5Q", + "type": "text", + "x": -856.388765529352, + "y": 729.9055390383437, + "width": 109.6500015258789, + "height": 25, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3Z", + "roundness": { + "type": 2 + }, + "seed": 1462163045, + "version": 1345, + "versionNonce": 780902802, + "isDeleted": false, + "boundElements": [], + "updated": 1790701182707, + "link": null, + "locked": false, + "text": "Push Server", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Push Server", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1LWB_WTIi2VdqJNcwZlgB", + "type": "text", + "x": -1304.6261445136436, + "y": 1014.9367734744969, + "width": 326.1137208843488, + "height": 50, + "angle": 0, + "strokeColor": "#e8400c", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3a", + "roundness": { + "type": 2 + }, + "seed": 53002693, + "version": 942, + "versionNonce": 1205295657, + "isDeleted": false, + "boundElements": [], + "updated": 1790877815506, + "link": null, + "locked": false, + "text": "3. registers pusher with push key\n+ gateway URL or encryption info", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "3. registers pusher with push key\n+ gateway URL or encryption info", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "SDDVDVT5Z9jQwoIlhNF5G", + "type": "arrow", + "x": -825.2703994671529, + "y": 1178.2744802126672, + "width": 338.37494313571096, + "height": 1.3332117684835794, + "angle": 0, + "strokeColor": "#e8400c", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3b", + "roundness": { + "type": 2 + }, + "seed": 459366981, + "version": 1628, + "versionNonce": 1843801614, + "isDeleted": false, + "boundElements": [], + "updated": 1790701223574, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -338.37494313571096, + -1.3332117684835794 + ] + ], + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "23Tv-rfe47AsH75Pwh3a8", + "type": "text", + "x": -1076.1536201668077, + "y": 1114.6718299564188, + "width": 185.75, + "height": 25, + "angle": 0, + "strokeColor": "#e8400c", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3e", + "roundness": { + "type": 2 + }, + "seed": 1952107749, + "version": 370, + "versionNonce": 1536769737, + "isDeleted": false, + "boundElements": [], + "updated": 1790877817090, + "link": null, + "locked": false, + "text": "1. requests push key", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "1. requests push key", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "nksHK0G3Dwf9_VCXc4FTr", + "type": "text", + "x": -1071.0536135561342, + "y": 1189.4068884142148, + "width": 180.64999389648438, + "height": 25, + "angle": 0, + "strokeColor": "#e8400c", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3f", + "roundness": { + "type": 2 + }, + "seed": 1566913669, + "version": 286, + "versionNonce": 491881641, + "isDeleted": false, + "boundElements": [], + "updated": 1790877820406, + "link": null, + "locked": false, + "text": "2. receives push key", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2. receives push key", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "isAs4h8D5pILl6zsT1Fwh", + "type": "rectangle", + "x": -1412.5001760598277, + "y": 858.4631467268986, + "width": 215.74806212142084, + "height": 124.87203781876394, + "angle": 0, + "strokeColor": "#8a5cd0", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3g", + "roundness": { + "type": 3 + }, + "seed": 289454411, + "version": 1113, + "versionNonce": 838990418, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "RB8PlOF8e-CClsT3v313o" + }, + { + "id": "egIROa7aw-KM_i1X_A37I", + "type": "arrow" + } + ], + "updated": 1790701783436, + "link": null, + "locked": false + }, + { + "id": "egIROa7aw-KM_i1X_A37I", + "type": "arrow", + "x": -1335.9382183569837, + "y": 1095.6877187789933, + "width": 1.2937933703976796, + "height": 106.35253423333086, + "angle": 0, + "strokeColor": "#e8400c", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3gV", + "roundness": { + "type": 2 + }, + "seed": 1924457957, + "version": 1812, + "versionNonce": 1254165970, + "isDeleted": false, + "boundElements": [], + "updated": 1790701783436, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.2937933703976796, + -106.35253423333086 + ] + ], + "startBinding": { + "elementId": "vs0m73D3bP8GcDCr5tvsL", + "mode": "orbit", + "fixedPoint": [ + 0.2738237071238745, + -0.04700858708297886 + ] + }, + "endBinding": { + "elementId": "isAs4h8D5pILl6zsT1Fwh", + "mode": "orbit", + "fixedPoint": [ + 0.3608641964506962, + 1.048049187831051 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "RB8PlOF8e-CClsT3v313o", + "type": "text", + "x": -1389.5761419473595, + "y": 903.3991656362806, + "width": 169.89999389648438, + "height": 35, + "angle": 0, + "strokeColor": "#8a5cd0", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3h", + "roundness": null, + "seed": 722556907, + "version": 1131, + "versionNonce": 1345511442, + "isDeleted": false, + "boundElements": [], + "updated": 1790701783436, + "link": null, + "locked": false, + "text": "Continuwuity", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "isAs4h8D5pILl6zsT1Fwh", + "originalText": "Continuwuity", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "LzCg5IWaMj_GcdAzhquCM", + "type": "rectangle", + "x": -220.29913247266018, + "y": 223.40744939335985, + "width": 215.74806212142084, + "height": 124.87203781876394, + "angle": 0, + "strokeColor": "#6741d9", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4A", + "roundness": { + "type": 3 + }, + "seed": 1824610448, + "version": 1070, + "versionNonce": 478607977, + "isDeleted": true, + "boundElements": [ + { + "id": "gEYVRLBTPmVIbLAIodYNl", + "type": "arrow" + }, + { + "id": "AMeIIRE6sIpLSW2haj6oH", + "type": "text" + }, + { + "id": "pd168Ochu5rAfWmpw_Zla", + "type": "arrow" + } + ], + "updated": 1790876553881, + "link": null, + "locked": false + }, + { + "id": "AMeIIRE6sIpLSW2haj6oH", + "type": "text", + "x": -197.37509836019194, + "y": 268.3434683027418, + "width": 169.89999389648438, + "height": 35, + "angle": 0, + "strokeColor": "#6741d9", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4B", + "roundness": null, + "seed": 438814352, + "version": 1090, + "versionNonce": 256572583, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "Continuwuity", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "LzCg5IWaMj_GcdAzhquCM", + "originalText": "Continuwuity", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ZMhuqfj8BSU9VQbcAjxai", + "type": "rectangle", + "x": 426.78988944549155, + "y": 139.0229533362866, + "width": 224.4598598378749, + "height": 135.04422845483313, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4E", + "roundness": { + "type": 3 + }, + "seed": 541626512, + "version": 1422, + "versionNonce": 476955977, + "isDeleted": true, + "boundElements": [ + { + "id": "aDYuRYLHV6lCXcUKSESOH", + "type": "text" + }, + { + "id": "Nk-2NHTwjRoiWFriZYQic", + "type": "arrow" + } + ], + "updated": 1790876553881, + "link": null, + "locked": false + }, + { + "id": "aDYuRYLHV6lCXcUKSESOH", + "type": "text", + "x": 450.4948178385501, + "y": 144.0229533362866, + "width": 177.0500030517578, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4F", + "roundness": null, + "seed": 1208483472, + "version": 1369, + "versionNonce": 2117259207, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "Push Provider", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "ZMhuqfj8BSU9VQbcAjxai", + "originalText": "Push Provider", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "4lZrAoniy5cJ66SsvR_5Y", + "type": "rectangle", + "x": 370.8693199535523, + "y": 471.2081543602717, + "width": 237.92059680463137, + "height": 123.6442295481495, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4G", + "roundness": { + "type": 3 + }, + "seed": 1638509712, + "version": 1595, + "versionNonce": 1324889129, + "isDeleted": true, + "boundElements": [ + { + "id": "Xa7c5gj0O5Er06MPVIOEw", + "type": "text" + }, + { + "id": "4sPDWf7VbLmxpYVZF2mxj", + "type": "arrow" + }, + { + "id": "Nk-2NHTwjRoiWFriZYQic", + "type": "arrow" + } + ], + "updated": 1790876553881, + "link": null, + "locked": false + }, + { + "id": "Xa7c5gj0O5Er06MPVIOEw", + "type": "text", + "x": 427.65461911880743, + "y": 476.2081543602717, + "width": 124.3499984741211, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4H", + "roundness": null, + "seed": 1994758800, + "version": 1595, + "versionNonce": 1660108519, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "Push App", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "4lZrAoniy5cJ66SsvR_5Y", + "originalText": "Push App", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "3ScIWvxbD8VYVPD65vpV6", + "type": "rectangle", + "x": -205.0145672108505, + "y": 467.8358804745302, + "width": 225.50894402869181, + "height": 127.63625482741887, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4I", + "roundness": { + "type": 3 + }, + "seed": 443795600, + "version": 1223, + "versionNonce": 1745995529, + "isDeleted": true, + "boundElements": [ + { + "id": "UYeG4Gc5sUfg88QxdDIN9", + "type": "text" + }, + { + "id": "4sPDWf7VbLmxpYVZF2mxj", + "type": "arrow" + }, + { + "id": "pd168Ochu5rAfWmpw_Zla", + "type": "arrow" + } + ], + "updated": 1790876553881, + "link": null, + "locked": false + }, + { + "id": "UYeG4Gc5sUfg88QxdDIN9", + "type": "text", + "x": -160.4350982482624, + "y": 472.8358804745302, + "width": 136.35000610351562, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4J", + "roundness": null, + "seed": 1208759952, + "version": 1227, + "versionNonce": 806930951, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "Client App", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "3ScIWvxbD8VYVPD65vpV6", + "originalText": "Client App", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Lvlabn8GGE2hC59TVju04", + "type": "rectangle", + "x": -243.9532006381146, + "y": 446.0936215123877, + "width": 896.4458785404854, + "height": 165.98577827459138, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4K", + "roundness": { + "type": 3 + }, + "seed": 1147593872, + "version": 863, + "versionNonce": 305528297, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false + }, + { + "id": "Pya6_XyNNaDu6vP97M0Mg", + "type": "text", + "x": 140.15037180313476, + "y": 617.799677964698, + "width": 119.44999694824219, + "height": 25, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4L", + "roundness": { + "type": 2 + }, + "seed": 2101072528, + "version": 1318, + "versionNonce": 1386213671, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "Client Device", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Client Device", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "4sPDWf7VbLmxpYVZF2mxj", + "type": "arrow", + "x": 364.8693199535523, + "y": 533.0190725909046, + "width": 338.37494313571096, + "height": 1.3287401107854748, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4M", + "roundness": { + "type": 2 + }, + "seed": 1765998736, + "version": 1463, + "versionNonce": 477124809, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -338.37494313571096, + -1.3287401107854748 + ] + ], + "startBinding": { + "elementId": "4lZrAoniy5cJ66SsvR_5Y", + "mode": "orbit", + "fixedPoint": [ + 0, + 0.5001 + ] + }, + "endBinding": { + "elementId": "3ScIWvxbD8VYVPD65vpV6", + "mode": "orbit", + "fixedPoint": [ + 1, + 0.5001 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "pd168Ochu5rAfWmpw_Zla", + "type": "arrow", + "x": -138.64142415286415, + "y": 461.8358804745302, + "width": 1.4158413558251937, + "height": 107.5563932624064, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4N", + "roundness": { + "type": 2 + }, + "seed": 1748266640, + "version": 1633, + "versionNonce": 1677014087, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.4158413558251937, + -107.5563932624064 + ] + ], + "startBinding": { + "elementId": "3ScIWvxbD8VYVPD65vpV6", + "mode": "orbit", + "fixedPoint": [ + 0.29180166481919084, + 0.2918016648191901 + ] + }, + "endBinding": { + "elementId": "LzCg5IWaMj_GcdAzhquCM", + "mode": "orbit", + "fixedPoint": [ + 0.3883739780050178, + 0.6116260219949822 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "CcHK54l8DwPxGZLylCVme", + "type": "rectangle", + "x": 98.52180196740221, + "y": 114.38704888588097, + "width": 587.080291524579, + "height": 203.53689630317353, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4O", + "roundness": { + "type": 3 + }, + "seed": 583539856, + "version": 966, + "versionNonce": 1750882217, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false + }, + { + "id": "boSZN8Ullpzj2WD04lI44", + "type": "text", + "x": -68.01721295562209, + "y": 121.95966513545966, + "width": 407.6513065871321, + "height": 50, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4P", + "roundness": { + "type": 2 + }, + "seed": 1790315152, + "version": 618, + "versionNonce": 469046119, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "1. pushes encrypted payloads, using\nstandardized Web Push protocol", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "1. pushes encrypted payloads, using standardized Web Push protocol", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "cXCFujSNDZTGpFqIHK7H-", + "type": "text", + "x": -182.50638552032103, + "y": 515.9218070595055, + "width": 181.87864857499733, + "height": 75, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4Q", + "roundness": { + "type": 2 + }, + "seed": 448149648, + "version": 324, + "versionNonce": 405109385, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "(e.g. Element X,\nFluffychat, Nexus,\nSable)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. Element X, Fluffychat, Nexus, Sable)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "VvAcW4AEHltpg3Y6eG8sN", + "type": "text", + "x": 379.92984284974284, + "y": 525.3101628787008, + "width": 228.61812022537254, + "height": 50, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4R", + "roundness": { + "type": 2 + }, + "seed": 1988142736, + "version": 521, + "versionNonce": 49024647, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "(e.g. ntfy android, Sunup,\nGoogle FCM)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. ntfy android, Sunup, Google FCM)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "ltWMFJD2081bYJlz1EpoO", + "type": "text", + "x": 432.9118978740472, + "y": 186.11853346965472, + "width": 204.91775851134645, + "height": 75, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4S", + "roundness": { + "type": 2 + }, + "seed": 181228688, + "version": 799, + "versionNonce": 1120742473, + "isDeleted": true, + "boundElements": [ + { + "id": "gEYVRLBTPmVIbLAIodYNl", + "type": "arrow" + } + ], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "(e.g. ntfy server,\nautopush-rs, Google\nFCM)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. ntfy server, autopush-rs, Google FCM)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "Nk-2NHTwjRoiWFriZYQic", + "type": "arrow", + "x": 539.0936815897378, + "y": 280.0671817911197, + "width": 1.5865420924135378, + "height": 185.14097256915204, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4V", + "roundness": { + "type": 2 + }, + "seed": 1089527440, + "version": 210, + "versionNonce": 2099337415, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.5865420924135378, + 185.14097256915204 + ] + ], + "startBinding": { + "elementId": "ZMhuqfj8BSU9VQbcAjxai", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "4lZrAoniy5cJ66SsvR_5Y", + "mode": "orbit", + "fixedPoint": [ + 0.7152136830785863, + 0.28478631692141365 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "O9fjD5buEZWJB4RDOCpi0", + "type": "text", + "x": 323.94152431660393, + "y": 367.9338757612213, + "width": 174.14999389648438, + "height": 50, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4X", + "roundness": { + "type": 2 + }, + "seed": 857111184, + "version": 386, + "versionNonce": 1657977641, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "2. forwards to\npush app on device", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2. forwards to\npush app on device", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "09HcNp6rVuOs3ZNSlYLt5", + "type": "text", + "x": 336.0407736603079, + "y": 83.55151875341221, + "width": 109.6500015258789, + "height": 25, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4Y", + "roundness": { + "type": 2 + }, + "seed": 1569237136, + "version": 1379, + "versionNonce": 1965598695, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "Push Server", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Push Server", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "gEYVRLBTPmVIbLAIodYNl", + "type": "arrow", + "x": -149.52192925642498, + "y": 217.40744939335985, + "width": 577.2567524960888, + "height": 36, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4Z", + "roundness": null, + "seed": 1020096656, + "version": 373, + "versionNonce": 1292070409, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -36 + ], + [ + 577.2567524960888, + -35.995144776257405 + ] + ], + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": true, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "DoZ7kfrUt1uLjUdePGN-V", + "type": "text", + "x": -116.11376361047792, + "y": 374.22364580109036, + "width": 333.5, + "height": 50, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4a", + "roundness": { + "type": 2 + }, + "seed": 801358992, + "version": 570, + "versionNonce": 163123975, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "4. client decrypts payload,\nsyncs new messages from server", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "4. client decrypts payload,\nsyncs new messages from server", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "XaXIWXo5gGuOmKo6fngCc", + "type": "text", + "x": 108.33634941800403, + "y": 502.787714082516, + "width": 162.75, + "height": 25, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4b", + "roundness": { + "type": 2 + }, + "seed": 704426640, + "version": 153, + "versionNonce": 1482343657, + "isDeleted": true, + "boundElements": [], + "updated": 1790876553881, + "link": null, + "locked": false, + "text": "3. wakes up client", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "3. wakes up client", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "n9xbButrO53738eQmxASi", + "type": "rectangle", + "x": -1067.9442929606619, + "y": 1445.501784859453, + "width": 199.03729886415238, + "height": 109.22344274196931, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5t", + "roundness": { + "type": 3 + }, + "seed": 1515773262, + "version": 2481, + "versionNonce": 47926286, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "1mHCfK5DspW8FxMgAAbnn" + }, + { + "id": "wn1KY_8mWShZaCTyuy0bi", + "type": "arrow" + }, + { + "id": "IjDm-2vyCgcUwNMTrQjrR", + "type": "arrow" + } + ], + "updated": 1790702159860, + "link": null, + "locked": false + }, + { + "id": "1mHCfK5DspW8FxMgAAbnn", + "type": "text", + "x": -1060.3756404768278, + "y": 1450.501784859453, + "width": 183.89999389648438, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5u", + "roundness": null, + "seed": 103547790, + "version": 2422, + "versionNonce": 1348326862, + "isDeleted": false, + "boundElements": [], + "updated": 1790701648616, + "link": null, + "locked": false, + "text": "Push Gateway", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "n9xbButrO53738eQmxASi", + "originalText": "Push Gateway", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "XXNM_hzRoMfV43NJhUGfh", + "type": "rectangle", + "x": -773.2569919699392, + "y": 1446.1179379538758, + "width": 224.4598598378749, + "height": 135.04422845483313, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5v", + "roundness": { + "type": 3 + }, + "seed": 289432014, + "version": 1686, + "versionNonce": 213330318, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "irSO7T9OIjQhTt6pxdoj8" + }, + { + "id": "GkpLJX_rdlYnCPDaEAxF4", + "type": "arrow" + }, + { + "id": "wn1KY_8mWShZaCTyuy0bi", + "type": "arrow" + } + ], + "updated": 1790701849954, + "link": null, + "locked": false + }, + { + "id": "irSO7T9OIjQhTt6pxdoj8", + "type": "text", + "x": -749.5520635768808, + "y": 1451.1179379538758, + "width": 177.0500030517578, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5w", + "roundness": null, + "seed": 1856960526, + "version": 1617, + "versionNonce": 538133326, + "isDeleted": false, + "boundElements": [], + "updated": 1790701584082, + "link": null, + "locked": false, + "text": "Push Provider", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "XXNM_hzRoMfV43NJhUGfh", + "originalText": "Push Provider", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "nmp7MiYBFdZhW8n84SDs0", + "type": "rectangle", + "x": -829.2550014618785, + "y": 1765.9427454219526, + "width": 237.92059680463137, + "height": 123.6442295481495, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5x", + "roundness": { + "type": 3 + }, + "seed": 1181795918, + "version": 1634, + "versionNonce": 866757006, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "cxY5LA6p-_kKQssfhidal" + }, + { + "id": "GkpLJX_rdlYnCPDaEAxF4", + "type": "arrow" + } + ], + "updated": 1790701584082, + "link": null, + "locked": false + }, + { + "id": "cxY5LA6p-_kKQssfhidal", + "type": "text", + "x": -772.4697022966234, + "y": 1770.9427454219526, + "width": 124.3499984741211, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5y", + "roundness": null, + "seed": 1499384974, + "version": 1621, + "versionNonce": 1276725198, + "isDeleted": false, + "boundElements": [], + "updated": 1790701584082, + "link": null, + "locked": false, + "text": "Push App", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "nmp7MiYBFdZhW8n84SDs0", + "originalText": "Push App", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "5GCH_Z1ziqho4kQ3VARuQ", + "type": "rectangle", + "x": -1410.206141638, + "y": 1761.9507195362112, + "width": 225.50894402869181, + "height": 127.63625482741887, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5z", + "roundness": { + "type": 3 + }, + "seed": 1697778382, + "version": 1216, + "versionNonce": 1584681618, + "isDeleted": false, + "boundElements": [ + { + "id": "khsak3RrJO5BVxB9Xp6L8", + "type": "text" + }, + { + "id": "2RJCsgP3And1BKm5tk7Ltr", + "type": "arrow" + } + ], + "updated": 1790702159860, + "link": null, + "locked": false + }, + { + "id": "khsak3RrJO5BVxB9Xp6L8", + "type": "text", + "x": -1365.6266726754118, + "y": 1766.9507195362112, + "width": 136.35000610351562, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b60", + "roundness": null, + "seed": 142835982, + "version": 1214, + "versionNonce": 549989454, + "isDeleted": false, + "boundElements": [], + "updated": 1790701584082, + "link": null, + "locked": false, + "text": "Client App", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "5GCH_Z1ziqho4kQ3VARuQ", + "originalText": "Client App", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "kFdV6hNhzVfdCnr3MoLnG", + "type": "rectangle", + "x": -1431.3669888103811, + "y": 1739.7322555656983, + "width": 865.8902805994046, + "height": 165.98577827459138, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b61", + "roundness": { + "type": 3 + }, + "seed": 650915662, + "version": 877, + "versionNonce": 2144957070, + "isDeleted": false, + "boundElements": [], + "updated": 1790701584082, + "link": null, + "locked": false + }, + { + "id": "-It2veJ35mY1Fsqocsz6C", + "type": "text", + "x": -1064.6401036240147, + "y": 1906.1942390263785, + "width": 119.44999694824219, + "height": 25, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b62", + "roundness": { + "type": 2 + }, + "seed": 1281693070, + "version": 1329, + "versionNonce": 1902637262, + "isDeleted": false, + "boundElements": [], + "updated": 1790701584082, + "link": null, + "locked": false, + "text": "Client Device", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Client Device", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Xw5BQ8DKUxpKGsBSWMbG7", + "type": "rectangle", + "x": -1107.3198210293044, + "y": 1416.634473329119, + "width": 587.080291524579, + "height": 226.96371167088122, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b64", + "roundness": { + "type": 3 + }, + "seed": 55282190, + "version": 1151, + "versionNonce": 2087197266, + "isDeleted": false, + "boundElements": [], + "updated": 1790701955172, + "link": null, + "locked": false + }, + { + "id": "Ay-iPNzJun2MEHXW7e3Ai", + "type": "text", + "x": -1395.057666964212, + "y": 1825.768847137927, + "width": 195.21199644051075, + "height": 50, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b65", + "roundness": { + "type": 2 + }, + "seed": 2108364878, + "version": 524, + "versionNonce": 89963406, + "isDeleted": false, + "boundElements": [], + "updated": 1790701584082, + "link": null, + "locked": false, + "text": "(e.g. Element X,\nNexus, Sable)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. Element X, Nexus, Sable)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "Wff0UT1DM_ajgsmMy8zOo", + "type": "text", + "x": -824.6037630793196, + "y": 1822.725145245924, + "width": 228.61812022537254, + "height": 50, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b66", + "roundness": { + "type": 2 + }, + "seed": 427744910, + "version": 593, + "versionNonce": 1171933262, + "isDeleted": false, + "boundElements": [ + { + "id": "hB9DWHBoKeoVagZXPYLXs", + "type": "arrow" + } + ], + "updated": 1790702159293, + "link": null, + "locked": false, + "text": "(e.g. ntfy android, Sunup,\nGoogle Play Services)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. ntfy android, Sunup, Google Play Services)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "B2-Tckcvd69ply_mpcHKC", + "type": "text", + "x": -763.4859415413837, + "y": 1500.7296585430545, + "width": 204.91775851134645, + "height": 75, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b67", + "roundness": { + "type": 2 + }, + "seed": 192928974, + "version": 942, + "versionNonce": 1930539022, + "isDeleted": false, + "boundElements": [], + "updated": 1790701584082, + "link": null, + "locked": false, + "text": "(e.g. ntfy server,\nautopush-rs, Google\nFCM)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. ntfy server, autopush-rs, Google FCM)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "-BT-dIV8Y1pcO8zFgHUDY", + "type": "text", + "x": -1058.2046293333835, + "y": 1500.7296588394638, + "width": 179.55797194969554, + "height": 50, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b68", + "roundness": { + "type": 2 + }, + "seed": 155652878, + "version": 1112, + "versionNonce": 498892366, + "isDeleted": false, + "boundElements": [], + "updated": 1790701584082, + "link": null, + "locked": false, + "text": "(e.g. Sygnal,\ncommon-proxies)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. Sygnal, common-proxies)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "GkpLJX_rdlYnCPDaEAxF4", + "type": "arrow", + "x": -660.9531998256932, + "y": 1587.1621664087093, + "width": 1.5091020924134, + "height": 172.78057901324348, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b69", + "roundness": { + "type": 2 + }, + "seed": 760054094, + "version": 565, + "versionNonce": 919150414, + "isDeleted": false, + "boundElements": [], + "updated": 1790702102209, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.5091020924134, + 172.78057901324348 + ] + ], + "startBinding": { + "elementId": "XXNM_hzRoMfV43NJhUGfh", + "mode": "orbit", + "fixedPoint": [ + 0.5003290665215688, + 1.044429888405093 + ] + }, + "endBinding": { + "elementId": "nmp7MiYBFdZhW8n84SDs0", + "mode": "orbit", + "fixedPoint": [ + 0.7137293114140901, + -0.04852632445466031 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "_AA1puVvhET3iCFQsVeiQ", + "type": "text", + "x": -868.9069937668417, + "y": 1390.1685397955619, + "width": 109.6500015258789, + "height": 25, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6A", + "roundness": { + "type": 2 + }, + "seed": 1525426062, + "version": 1386, + "versionNonce": 921682638, + "isDeleted": false, + "boundElements": [], + "updated": 1790701584082, + "link": null, + "locked": false, + "text": "Push Server", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Push Server", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "hB9DWHBoKeoVagZXPYLXs", + "type": "arrow", + "x": -837.7886277046425, + "y": 1829.098071969885, + "width": 338.37494313571096, + "height": 1.3332117684835794, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6C", + "roundness": { + "type": 2 + }, + "seed": 615914510, + "version": 1699, + "versionNonce": 1514523982, + "isDeleted": false, + "boundElements": [], + "updated": 1790702082692, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -338.37494313571096, + -1.3332117684835794 + ] + ], + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "2vhzCi1xz5x50yHdtXpx6", + "type": "text", + "x": -1086.0254802693714, + "y": 1797.7251451902198, + "width": 162.75, + "height": 25, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6E", + "roundness": { + "type": 2 + }, + "seed": 183300238, + "version": 332, + "versionNonce": 801306258, + "isDeleted": false, + "boundElements": [], + "updated": 1790702082692, + "link": null, + "locked": false, + "text": "4. wakes up client", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "4. wakes up client", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "4yd7b3-_xscmAC0tjrg6X", + "type": "rectangle", + "x": -1425.0490932973175, + "y": 1518.7261467419537, + "width": 215.74806212142084, + "height": 124.87203781876394, + "angle": 0, + "strokeColor": "#8a5cd0", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6F", + "roundness": { + "type": 3 + }, + "seed": 157003470, + "version": 1179, + "versionNonce": 1814713874, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "yfivbGJp_tnkLaPbBp5gQ" + }, + { + "id": "2RJCsgP3And1BKm5tk7Ltr", + "type": "arrow" + }, + { + "id": "IjDm-2vyCgcUwNMTrQjrR", + "type": "arrow" + } + ], + "updated": 1790702159860, + "link": null, + "locked": false + }, + { + "id": "yfivbGJp_tnkLaPbBp5gQ", + "type": "text", + "x": -1402.1250591848493, + "y": 1563.6621656513357, + "width": 169.89999389648438, + "height": 35, + "angle": 0, + "strokeColor": "#8a5cd0", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6G", + "roundness": null, + "seed": 1071162638, + "version": 1180, + "versionNonce": 363007182, + "isDeleted": false, + "boundElements": [], + "updated": 1790702159860, + "link": null, + "locked": false, + "text": "Continuwuity", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "4yd7b3-_xscmAC0tjrg6X", + "originalText": "Continuwuity", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "2RJCsgP3And1BKm5tk7Ltr", + "type": "arrow", + "x": -1348.4564465944732, + "y": 1755.9507195362112, + "width": 1.263104370397059, + "height": 106.35253497549365, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6H", + "roundness": { + "type": 2 + }, + "seed": 2145178446, + "version": 1856, + "versionNonce": 1400598290, + "isDeleted": false, + "boundElements": [], + "updated": 1790702159860, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.263104370397059, + -106.35253497549365 + ] + ], + "startBinding": { + "elementId": "5GCH_Z1ziqho4kQ3VARuQ", + "mode": "orbit", + "fixedPoint": [ + 0.2738237071238745, + -0.04700858708297886 + ] + }, + "endBinding": { + "elementId": "4yd7b3-_xscmAC0tjrg6X", + "mode": "orbit", + "fixedPoint": [ + 0.3608641964506962, + 1.048049187831051 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "sjXsWtbUpBhT9xft58glk", + "type": "text", + "x": -1317.1750615416113, + "y": 1673.5524557368985, + "width": 199.85000610351562, + "height": 50, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6J", + "roundness": { + "type": 2 + }, + "seed": 622627662, + "version": 722, + "versionNonce": 1945952210, + "isDeleted": false, + "boundElements": [], + "updated": 1790702347264, + "link": null, + "locked": false, + "text": "5. client syncs new\nmessages from server", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "5. client syncs new\nmessages from server", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "loYWIxSjbO7FJY6LcCpvv", + "type": "text", + "x": -1385.7047126122782, + "y": 1415.1685404129548, + "width": 244.135428895377, + "height": 50, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6K", + "roundness": { + "type": 2 + }, + "seed": 836532366, + "version": 793, + "versionNonce": 1624346130, + "isDeleted": false, + "boundElements": [], + "updated": 1790702350097, + "link": null, + "locked": false, + "text": "1. pushes to gateway at\n/_matrix/push/v1/notify", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "1. pushes to gateway at\n/_matrix/push/v1/notify", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "IjDm-2vyCgcUwNMTrQjrR", + "type": "arrow", + "x": -1347.4614576457752, + "y": 1512.7261467419537, + "width": 273.51716468511336, + "height": 36, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#edd9f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6N", + "roundness": null, + "seed": 1564193998, + "version": 143, + "versionNonce": 1199850254, + "isDeleted": false, + "boundElements": null, + "updated": 1790702159860, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -36 + ], + [ + 273.51716468511336, + -35.888554947017155 + ] + ], + "startBinding": { + "elementId": "4yd7b3-_xscmAC0tjrg6X", + "mode": "orbit", + "fixedPoint": [ + 0.3596214718622908, + -0.04804918783105186 + ] + }, + "endBinding": { + "elementId": "n9xbButrO53738eQmxASi", + "mode": "orbit", + "fixedPoint": [ + -0.030145103627512253, + 0.28689634888648974 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": true, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "wn1KY_8mWShZaCTyuy0bi", + "type": "arrow", + "x": -862.9069940965094, + "y": 1477.0796150631993, + "width": 83.65000212657014, + "height": 61.05067308618686, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6P", + "roundness": null, + "seed": 220144590, + "version": 245, + "versionNonce": 1413696270, + "isDeleted": false, + "boundElements": [], + "updated": 1790701855520, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 41.82500106328507, + 0 + ], + [ + 41.82500106328507, + 61.05067308618686 + ], + [ + 83.65000212657014, + 61.05067308618686 + ] + ], + "startBinding": { + "elementId": "n9xbButrO53738eQmxASi", + "mode": "orbit", + "fixedPoint": [ + 1.0301451036275129, + 0.2891122034886424 + ] + }, + "endBinding": { + "elementId": "XXNM_hzRoMfV43NJhUGfh", + "mode": "orbit", + "fixedPoint": [ + -0.026730837328036022, + 0.6813497418461304 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": true, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "NNzYuAr5btFxNDtlK7daz", + "type": "text", + "x": -1031.038972522991, + "y": 1572.2170271828218, + "width": 237.9499969482422, + "height": 50, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6Q", + "roundness": { + "type": 2 + }, + "seed": 1406555150, + "version": 678, + "versionNonce": 978337806, + "isDeleted": false, + "boundElements": [], + "updated": 1790701977989, + "link": null, + "locked": false, + "text": "2. converts to push format\nand forwards to provider", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2. converts to push format\nand forwards to provider", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "wmDYS-XwZxEloig0SKeJh", + "type": "text", + "x": -846.3319887183743, + "y": 1676.1122278963019, + "width": 174.14999389648438, + "height": 50, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6R", + "roundness": { + "type": 2 + }, + "seed": 470295502, + "version": 543, + "versionNonce": 1990985554, + "isDeleted": false, + "boundElements": [], + "updated": 1790702142676, + "link": null, + "locked": false, + "text": "3. forwards to\npush app on device", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3. forwards to\npush app on device", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GB9wlhXyFwHpGdhYyGxIt", + "type": "rectangle", + "x": -786.4729136485187, + "y": 2084.648565788033, + "width": 224.4598598378749, + "height": 135.04422845483313, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6U", + "roundness": { + "type": 3 + }, + "seed": 367829330, + "version": 1769, + "versionNonce": 1191206151, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "8e-ifPD1q5m15PN2UlPvM" + }, + { + "id": "PHXAt3dsu8DraR30ouIFM", + "type": "arrow" + }, + { + "id": "1HUals7Rm1AfShTDTXYJE", + "type": "arrow" + } + ], + "updated": 1790876548947, + "link": null, + "locked": false + }, + { + "id": "8e-ifPD1q5m15PN2UlPvM", + "type": "text", + "x": -762.7679852554602, + "y": 2089.648565788033, + "width": 177.0500030517578, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6V", + "roundness": null, + "seed": 1311811346, + "version": 1699, + "versionNonce": 1830626343, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "Push Provider", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "GB9wlhXyFwHpGdhYyGxIt", + "originalText": "Push Provider", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GyGMd-GX0__3_DGYxHMyo", + "type": "rectangle", + "x": -842.4709231404579, + "y": 2404.47337325611, + "width": 237.92059680463137, + "height": 123.6442295481495, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6W", + "roundness": { + "type": 3 + }, + "seed": 1936585938, + "version": 1715, + "versionNonce": 1045694279, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "z5MBJdqYIQoGiYpBIGCzc" + }, + { + "id": "PHXAt3dsu8DraR30ouIFM", + "type": "arrow" + } + ], + "updated": 1790876548947, + "link": null, + "locked": false + }, + { + "id": "z5MBJdqYIQoGiYpBIGCzc", + "type": "text", + "x": -785.6856239752028, + "y": 2409.47337325611, + "width": 124.3499984741211, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6X", + "roundness": null, + "seed": 658213522, + "version": 1703, + "versionNonce": 151094887, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "Push App", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "GyGMd-GX0__3_DGYxHMyo", + "originalText": "Push App", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "iO3ngJF1XiJ98qtNCsLzE", + "type": "rectangle", + "x": -1423.4220633165796, + "y": 2400.481347370369, + "width": 225.50894402869181, + "height": 127.63625482741887, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6Y", + "roundness": { + "type": 3 + }, + "seed": 1079011410, + "version": 1297, + "versionNonce": 468853127, + "isDeleted": false, + "boundElements": [ + { + "id": "2nEECT8gp_vnrQdQaNPLM", + "type": "text" + }, + { + "id": "bOXfUhiqFg70NIsLqOQdn", + "type": "arrow" + } + ], + "updated": 1790876548947, + "link": null, + "locked": false + }, + { + "id": "2nEECT8gp_vnrQdQaNPLM", + "type": "text", + "x": -1378.8425943539914, + "y": 2405.481347370369, + "width": 136.35000610351562, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6Z", + "roundness": null, + "seed": 646155794, + "version": 1295, + "versionNonce": 945969319, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "Client App", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "iO3ngJF1XiJ98qtNCsLzE", + "originalText": "Client App", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1dflwnciSG9j5iAAFKAaB", + "type": "rectangle", + "x": -1444.5829104889608, + "y": 2378.262883399856, + "width": 865.8902805994046, + "height": 165.98577827459138, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6a", + "roundness": { + "type": 3 + }, + "seed": 785120210, + "version": 958, + "versionNonce": 1140763591, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false + }, + { + "id": "lE_yAiyMjT1v4TcfJRoms", + "type": "text", + "x": -1077.8560253025944, + "y": 2544.724866860536, + "width": 119.44999694824219, + "height": 25, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6b", + "roundness": { + "type": 2 + }, + "seed": 2000728466, + "version": 1410, + "versionNonce": 987994855, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "Client Device", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Client Device", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "8cyh4YLryMrm6XKv46WPJ", + "type": "text", + "x": -1408.2735886427918, + "y": 2464.2994749720847, + "width": 195.21199644051075, + "height": 50, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6d", + "roundness": { + "type": 2 + }, + "seed": 1454044434, + "version": 605, + "versionNonce": 1637721607, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "(e.g. Element X,\nNexus, Sable)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. Element X, Nexus, Sable)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "ealNRTNiCykgmpsrDFVMd", + "type": "text", + "x": -837.819684757899, + "y": 2461.255773080082, + "width": 228.61812022537254, + "height": 50, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6e", + "roundness": { + "type": 2 + }, + "seed": 1399751378, + "version": 674, + "versionNonce": 925453607, + "isDeleted": false, + "boundElements": [ + { + "id": "1aBkdYLFG6QpSqFcv2qRV", + "type": "arrow" + } + ], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "(e.g. ntfy android, Sunup,\nGoogle Play Services)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. ntfy android, Sunup, Google Play Services)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "V0NcMeYDap-b1vktMB2LT", + "type": "text", + "x": -776.7018632199631, + "y": 2139.2602863772117, + "width": 204.91775851134645, + "height": 75, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6f", + "roundness": { + "type": 2 + }, + "seed": 335173778, + "version": 1023, + "versionNonce": 653463623, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "(e.g. ntfy server,\nautopush-rs, Google\nFCM)", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(e.g. ntfy server, autopush-rs, Google FCM)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "PHXAt3dsu8DraR30ouIFM", + "type": "arrow", + "x": -674.1691215042727, + "y": 2225.6927942428665, + "width": 1.5091020924134, + "height": 172.78057901324348, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6h", + "roundness": { + "type": 2 + }, + "seed": 275176466, + "version": 646, + "versionNonce": 2060939111, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.5091020924134, + 172.78057901324348 + ] + ], + "startBinding": { + "elementId": "GB9wlhXyFwHpGdhYyGxIt", + "mode": "orbit", + "fixedPoint": [ + 0.5003290665215688, + 1.044429888405093 + ] + }, + "endBinding": { + "elementId": "GyGMd-GX0__3_DGYxHMyo", + "mode": "orbit", + "fixedPoint": [ + 0.7137293114140901, + -0.04852632445466031 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "daW3lnJvzLsRdSSJHLrmc", + "type": "text", + "x": -882.1229154454211, + "y": 2028.6991676297193, + "width": 109.6500015258789, + "height": 25, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6i", + "roundness": { + "type": 2 + }, + "seed": 1528138194, + "version": 1566, + "versionNonce": 220392071, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "Push Server", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Push Server", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1aBkdYLFG6QpSqFcv2qRV", + "type": "arrow", + "x": -851.004549383222, + "y": 2467.628699804043, + "width": 338.37494313571096, + "height": 1.3332117684835794, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6j", + "roundness": { + "type": 2 + }, + "seed": 1059618706, + "version": 1780, + "versionNonce": 982647207, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -338.37494313571096, + -1.3332117684835794 + ] + ], + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "GzoVIQgGfbI3qgCMlmqnv", + "type": "text", + "x": -1099.241401947951, + "y": 2436.255773024377, + "width": 162.75, + "height": 25, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6k", + "roundness": { + "type": 2 + }, + "seed": 416726354, + "version": 416, + "versionNonce": 340866247, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "4. wakes up client", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "4. wakes up client", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "_1cNQopZyquUB1eALfdI5", + "type": "rectangle", + "x": -1438.265014975897, + "y": 2157.2567745761116, + "width": 215.74806212142084, + "height": 124.87203781876394, + "angle": 0, + "strokeColor": "#8a5cd0", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6l", + "roundness": { + "type": 3 + }, + "seed": 628572946, + "version": 1261, + "versionNonce": 1375536103, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "R3jg6dC2js9Lsm9ARCxFp" + }, + { + "id": "bOXfUhiqFg70NIsLqOQdn", + "type": "arrow" + }, + { + "id": "1HUals7Rm1AfShTDTXYJE", + "type": "arrow" + } + ], + "updated": 1790876548947, + "link": null, + "locked": false + }, + { + "id": "R3jg6dC2js9Lsm9ARCxFp", + "type": "text", + "x": -1415.3409808634287, + "y": 2202.1927934854934, + "width": 169.89999389648438, + "height": 35, + "angle": 0, + "strokeColor": "#8a5cd0", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6m", + "roundness": null, + "seed": 1602293970, + "version": 1262, + "versionNonce": 60944135, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "Continuwuity", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "_1cNQopZyquUB1eALfdI5", + "originalText": "Continuwuity", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "bOXfUhiqFg70NIsLqOQdn", + "type": "arrow", + "x": -1361.6723682730528, + "y": 2394.481347370369, + "width": 1.2631043703972864, + "height": 106.3525349754932, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6n", + "roundness": { + "type": 2 + }, + "seed": 1519068818, + "version": 1938, + "versionNonce": 62682663, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.2631043703972864, + -106.3525349754932 + ] + ], + "startBinding": { + "elementId": "iO3ngJF1XiJ98qtNCsLzE", + "mode": "orbit", + "fixedPoint": [ + 0.2738237071238745, + -0.04700858708297886 + ] + }, + "endBinding": { + "elementId": "_1cNQopZyquUB1eALfdI5", + "mode": "orbit", + "fixedPoint": [ + 0.3608641964506962, + 1.048049187831051 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null, + "moveMidPointsWithElement": false + }, + { + "id": "FmNzK5j3psDbn-kx9CQco", + "type": "text", + "x": -1330.3909832201907, + "y": 2312.083083571056, + "width": 199.85000610351562, + "height": 50, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6o", + "roundness": { + "type": 2 + }, + "seed": 525108306, + "version": 803, + "versionNonce": 691607879, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "5. client syncs new\nmessages from server", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "5. client syncs new\nmessages from server", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "KhluRA8aXt2SDl5v6Hhsd", + "type": "text", + "x": -1330.3909839943906, + "y": 2083.9140166467073, + "width": 317.4598628185015, + "height": 25, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6p", + "roundness": { + "type": 2 + }, + "seed": 127674898, + "version": 1212, + "versionNonce": 963926119, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "1. pushes encrypted payloads", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "1. pushes encrypted payloads", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "Do5z8ZoUVXTrX1Dv-0J_8", + "type": "text", + "x": -859.5479103969537, + "y": 2314.64285573046, + "width": 174.14999389648438, + "height": 50, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#f3f0ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6t", + "roundness": { + "type": 2 + }, + "seed": 1217761554, + "version": 627, + "versionNonce": 440054663, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "text": "3. forwards to\npush app on device", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3. forwards to\npush app on device", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Jhe6utnLI25tHLBnz9hMy", + "type": "rectangle", + "x": -1120.7715383571112, + "y": 2055.0724364292923, + "width": 587.080291524579, + "height": 184.64804132270473, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6u", + "roundness": { + "type": 3 + }, + "seed": 1328275730, + "version": 1329, + "versionNonce": 698602375, + "isDeleted": false, + "boundElements": [ + { + "id": "1HUals7Rm1AfShTDTXYJE", + "type": "arrow" + } + ], + "updated": 1790876575748, + "link": null, + "locked": false + }, + { + "id": "o8A3qYQk5hqOOAdg69f8j", + "type": "text", + "x": -830.906392547138, + "y": 2129.8964570906446, + "width": 7.349999904632568, + "height": 35, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#edd9f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6uV", + "roundness": null, + "seed": 416613737, + "version": 4, + "versionNonce": 299519081, + "isDeleted": true, + "boundElements": null, + "updated": 1790876575748, + "link": null, + "locked": false, + "text": "", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Jhe6utnLI25tHLBnz9hMy", + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1HUals7Rm1AfShTDTXYJE", + "type": "arrow", + "x": -1360.6773793243547, + "y": 2151.2567745761116, + "width": 568.2264610113588, + "height": 36.34275773711579, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#edd9f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6v", + "roundness": null, + "seed": 443619282, + "version": 289, + "versionNonce": 1925889479, + "isDeleted": false, + "boundElements": [], + "updated": 1790876548947, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -36 + ], + [ + 568.2264610113588, + -36.34275773711579 + ] + ], + "startBinding": { + "elementId": "_1cNQopZyquUB1eALfdI5", + "mode": "orbit", + "fixedPoint": [ + 0.3596214718622908, + -0.04804918783105186 + ] + }, + "endBinding": { + "elementId": "GB9wlhXyFwHpGdhYyGxIt", + "mode": "orbit", + "fixedPoint": [ + -0.026632845038730216, + 0.2241151021206761 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": true, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "zuJm86LYm6FQh1jrdXUSH", + "type": "rectangle", + "x": -1347.897426775165, + "y": 1519.1230103171233, + "width": 587.080291524579, + "height": 226.96371167088122, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6w", + "roundness": { + "type": 3 + }, + "seed": 1739455591, + "version": 1215, + "versionNonce": 1500595303, + "isDeleted": true, + "boundElements": [], + "updated": 1790876566314, + "link": null, + "locked": false + }, + { + "id": "krMqQ5avMXA6Knsf0WMBe", + "type": "rectangle", + "x": -1077.0641443044617, + "y": 1262.7808836381842, + "width": 587.080291524579, + "height": 184.64804132270473, + "angle": 0, + "strokeColor": "#343a40", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6x", + "roundness": { + "type": 3 + }, + "seed": 2086611399, + "version": 1127, + "versionNonce": 2110327945, + "isDeleted": true, + "boundElements": [], + "updated": 1790876578181, + "link": null, + "locked": false + }, + { + "id": "jqMMO03IywQf0kuxjK_Ny", + "type": "text", + "x": -994.2072809175079, + "y": 2299.271545534888, + "width": 7.349999904632568, + "height": 35, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#edd9f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6y", + "roundness": null, + "seed": 73528807, + "version": 3, + "versionNonce": 515002825, + "isDeleted": true, + "boundElements": null, + "updated": 1790876583131, + "link": null, + "locked": false, + "text": "", + "fontSize": 28, + "fontFamily": 6, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff", + "lockedMultiSelections": {} + }, + "files": {} +} diff --git a/rspress.config.ts b/rspress.config.ts index 5eb5e5e93..9f4931069 100644 --- a/rspress.config.ts +++ b/rspress.config.ts @@ -18,6 +18,8 @@ export default defineConfig({ markdown: { link: { checkDeadLinks: { + // exclude files in the `docs/public` folder from dead link checking + // (they are linked to without the `/public` prefix) excludes: [ '/deploying/docker-compose.with-caddy.yml', '/deploying/docker-compose.with-caddy-labels.yml', @@ -32,6 +34,7 @@ export default defineConfig({ '/calls/livekit.docker-compose.with-caddy-labels.yml', '/calls/livekit.nginx.conf', '/guides/grafana-dashboard.json', + '/guides/push-notifications.excalidraw', 'CONTRIBUTING.md' ] },