diff --git a/.env.example b/.env.example
index e4581fd..3143814 100644
--- a/.env.example
+++ b/.env.example
@@ -14,8 +14,8 @@
# RATE_LIMIT=100
# Optional: Device name shown in Signal app's linked devices list
-# Default: SUP
-# DEVICE_NAME=What SUP
+# Default: PRISM
+# DEVICE_NAME=What PRISM
# Optional: Enable verbose logging
# Default: false
@@ -32,4 +32,4 @@
# PROTON_IMAP_PASSWORD=bridge-generated-password
# PROTON_BRIDGE_HOST=protonmail-bridge
# PROTON_BRIDGE_PORT=143
-# PROTON_SUP_TOPIC=Proton Mail
\ No newline at end of file
+# PROTON_PRISM_TOPIC=Proton Mail
\ No newline at end of file
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index f821375..a6c3b02 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -7,7 +7,7 @@ on:
env:
REGISTRY: ghcr.io
- IMAGE_NAME: ${{ github.repository_owner }}/sup
+ IMAGE_NAME: ${{ github.repository_owner }}/prism
jobs:
build:
diff --git a/.gitignore b/.gitignore
index 9ba758d..d320784 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
node_modules/
signal-cli
.env
-sup
+prism
diff --git a/README.md b/README.md
index a03d6b4..ba0645e 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
-

+

-# SUP
+# PRISM
**Self-hosted notification gateway using Signal and Webhooks for transport**
@@ -12,18 +12,18 @@
-SUP is a self-hosted notification gateway that receives HTTP requests and routes them through Signal groups or custom webhooks. Route notifications through Signal to avoid exposing unique network fingerprints, or forward them to your own webhook endpoints for custom handling.
+PRISM is a self-hosted notification gateway that receives HTTP requests and routes them through Signal groups or custom webhooks. Route notifications through Signal to avoid exposing unique network fingerprints, or forward them to your own webhook endpoints for custom handling.
## How?
-SUP accepts notifications via HTTP POST requests and routes them based on your configured delivery method:
+PRISM accepts notifications via HTTP POST requests and routes them based on your configured delivery method:
- **Signal groups**: Uses [signal-cli](https://github.com/AsamK/signal-cli) to create a Signal group for each app and send notifications as messages
- **Webhook forwarding**: Forwards notifications to your own webhook URL (useful for UnifiedPush distributors, ntfy, or custom handlers)
Each endpoint can be independently configured to use either delivery method through the admin UI.
-For the optional Proton Mail integration, SUP requires a server that runs Proton's official [proton-bridge](https://github.com/ProtonMail/proton-bridge). SUP's docker compose process will run an image from [protonmail-bridge-docker](https://github.com/shenxn/protonmail-bridge-docker). Once authenticated, the communication between SUP and proton-bridge will be over IMAP.
+For the optional Proton Mail integration, PRISM requires a server that runs Proton's official [proton-bridge](https://github.com/ProtonMail/proton-bridge). PRISM's docker compose process will run an image from [protonmail-bridge-docker](https://github.com/shenxn/protonmail-bridge-docker). Once authenticated, the communication between PRISM and proton-bridge will be over IMAP.
## Setup
@@ -39,7 +39,7 @@ To receive Proton Mail notifications via Signal:
```bash
# Download docker-compose.yml
-curl -L -O https://raw.githubusercontent.com/lone-cloud/sup/master/docker-compose.yml
+curl -L -O https://raw.githubusercontent.com/lone-cloud/prism/master/docker-compose.yml
docker compose run --rm protonmail-bridge init
```
@@ -75,20 +75,20 @@ Your phone will now receive Signal notifications when Proton Mail receives new e
Note that the bridge will first need to sync all of your old emails before you can start getting new email notifications which may take a while, but this is a one-time setup.
-### 2. Install SUP Server
+### 2. Install PRISM Server
```bash
# Download docker-compose.yml
-curl -L -O https://raw.githubusercontent.com/lone-cloud/sup/master/docker-compose.yml
+curl -L -O https://raw.githubusercontent.com/lone-cloud/prism/master/docker-compose.yml
# Download .env.example (optional)
-curl -L -O https://raw.githubusercontent.com/lone-cloud/sup/master/server/.env.example
+curl -L -O https://raw.githubusercontent.com/lone-cloud/prism/master/server/.env.example
-# Configure SUP server through environment variables (optional)
+# Configure PRISM server through environment variables (optional)
cp .env.example .env
nano .env
-# Start SUP server
+# Start PRISM server
docker compose up -d
```
@@ -125,8 +125,8 @@ For local development, install Bun and signal-cli:
# Install Bun (use your package manager and this is a backup)
curl -fsSL https://bun.sh/install | bash
-git clone https://github.com/lone-cloud/sup.git
-cd sup
+git clone https://github.com/lone-cloud/prism.git
+cd prism
bun install
cd server
@@ -151,7 +151,7 @@ docker compose -f docker-compose.dev.yml up protonmail-bridge
Receive Signal notifications when new emails arrive in your Proton Mail inbox.
-SUP monitors a Proton Mail account via the local bridge and forwards email alerts through Signal. This relies on the same technology that a third-party email client like Thunderbird would be using to integrate with Proton Mail.
+PRISM monitors a Proton Mail account via the local bridge and forwards email alerts through Signal. This relies on the same technology that a third-party email client like Thunderbird would be using to integrate with Proton Mail.
### Home Assistant Alerts
@@ -160,26 +160,26 @@ Add a rest notification configuration (eg. add to configuration.yaml) to Home As
```bash
notify:
- platform: rest
- name: SUP
- resource: "http://
/Home Assistant"
+ name: PRISM
+ resource: "http:///Home Assistant"
method: POST
headers:
- Authorization: !secret sup_basic_auth
+ Authorization: !secret prism_basic_auth
```
-Note how Home Assistant is also a self-hosted server. As such, it is advisable to turn on `ALLOW_INSECURE_HTTP` environment variable for SUP and to refer to it by its LAN IP address.
+Note how Home Assistant is also a self-hosted server. As such, it is advisable to turn on `ALLOW_INSECURE_HTTP` environment variable for PRISM and to refer to it by its LAN IP address.
Add the Base64 version of your API_KEY environment variable secret to your secrets.yaml. This secret must be prepended by a colon and the simplest way to get this value is to run `btoa(':')` in your browser's console.
```bash
-sup_basic_auth: "Basic "
+prism_basic_auth: "Basic "
```
-Reboot your Home Assistant system and you'll then be able to send Signal notifications to yourself by using this notify sup action.
+Reboot your Home Assistant system and you'll then be able to send Signal notifications to yourself by using this notify prism action.
## Monitoring
-The health of the system can be viewed in the same admin UI used for linking Signal. SUP uses [basic access authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) - provide your `API_KEY` as the password (username can be anything).
+The health of the system can be viewed in the same admin UI used for linking Signal. PRISM uses [basic access authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) - provide your `API_KEY` as the password (username can be anything).
For API-based monitoring, call `/api/health` which returns JSON:
@@ -189,11 +189,9 @@ For API-based monitoring, call `/api/health` which returns JSON:
## Architecture
-
+PRISM consists of two services that **MUST run together on the same machine**:
-SUP consists of two services that **MUST run together on the same machine**:
-
-- **sup** (Bun): Receives webhooks, sends Signal messages via signal-cli. Optional: monitors Proton Mail IMAP
+- **prism** (Bun): Receives webhooks, sends Signal messages via signal-cli. Optional: monitors Proton Mail IMAP
- **protonmail-bridge** (Official Proton, optional): Decrypts Proton Mail emails, runs local IMAP server
All services communicate over a private Docker network with no external exposure except Signal protocol. **Separating these services across multiple machines would expose plaintext IMAP traffic and compromise security.**
diff --git a/assets/SUP Architecture.excalidraw b/assets/SUP Architecture.excalidraw
deleted file mode 100644
index cb7ff65..0000000
--- a/assets/SUP Architecture.excalidraw
+++ /dev/null
@@ -1,1582 +0,0 @@
-{
- "type": "excalidraw",
- "version": 2,
- "source": "https://excalidraw.com",
- "elements": [
- {
- "id": "ubnB-MCtd3Y84dUGFa-b7",
- "type": "rectangle",
- "x": 311.93098958333337,
- "y": 15.150065104166629,
- "width": 166.41015625,
- "height": 133.2421875,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "aJ",
- "roundness": {
- "type": 3
- },
- "seed": 1606195181,
- "version": 358,
- "versionNonce": 588019384,
- "isDeleted": false,
- "boundElements": [
- {
- "id": "RNCrlFh5EZBwnYr-7bA_j",
- "type": "arrow"
- },
- {
- "id": "hauitp4TDHIQsHGW_tjMw",
- "type": "arrow"
- }
- ],
- "updated": 1769391114004,
- "link": null,
- "locked": false
- },
- {
- "id": "7fGvBO1wPB7KmcLdQS0oT",
- "type": "rectangle",
- "x": -156.96024576822913,
- "y": 25.20804850260413,
- "width": 167.36328125,
- "height": 133.2421875,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "aN",
- "roundness": {
- "type": 3
- },
- "seed": 611898349,
- "version": 361,
- "versionNonce": 887010157,
- "isDeleted": false,
- "boundElements": [
- {
- "id": "wN-1aiqTy8EelOURWsY4E",
- "type": "arrow"
- },
- {
- "id": "jqv8Vv58NPpsDZoaXIZY8",
- "type": "arrow"
- }
- ],
- "updated": 1768687676554,
- "link": null,
- "locked": false
- },
- {
- "id": "OLh35JqPLzCNQfQUwFZVV",
- "type": "text",
- "x": -128.99674479166663,
- "y": 77.70084635416663,
- "width": 123.85987854003906,
- "height": 25,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "aO",
- "roundness": null,
- "seed": 1914263683,
- "version": 128,
- "versionNonce": 156587309,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1768687034227,
- "link": null,
- "locked": false,
- "text": "Signal Server",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "left",
- "verticalAlign": "top",
- "containerId": null,
- "originalText": "Signal Server",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "vgtgZtFmt1xq7s1sOgLPv",
- "type": "rectangle",
- "x": 7.194319011910807,
- "y": 508.80493813682875,
- "width": 119.4609375,
- "height": 63.421875,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "aS",
- "roundness": {
- "type": 3
- },
- "seed": 1282447693,
- "version": 302,
- "versionNonce": 1698256072,
- "isDeleted": false,
- "boundElements": [
- {
- "type": "text",
- "id": "roYNM1cuh0Q_XzEwhEmVq"
- },
- {
- "id": "0gzKxrXTCJjBSJaqf17am",
- "type": "arrow"
- },
- {
- "id": "wN-1aiqTy8EelOURWsY4E",
- "type": "arrow"
- }
- ],
- "updated": 1769391143351,
- "link": null,
- "locked": false
- },
- {
- "id": "roYNM1cuh0Q_XzEwhEmVq",
- "type": "text",
- "x": 17.9448301813444,
- "y": 528.0158756368287,
- "width": 97.95991516113281,
- "height": 25,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "aT",
- "roundness": null,
- "seed": 1388624675,
- "version": 221,
- "versionNonce": 465796040,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1769391143351,
- "link": null,
- "locked": false,
- "text": "Signal App",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "center",
- "verticalAlign": "middle",
- "containerId": "vgtgZtFmt1xq7s1sOgLPv",
- "originalText": "Signal App",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "PPR4JysV7Oxn5UJ2TDQSX",
- "type": "text",
- "x": -65.51204325358069,
- "y": 278.1585489908854,
- "width": 214.33975219726562,
- "height": 50,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "abV",
- "roundness": null,
- "seed": 1448567395,
- "version": 46,
- "versionNonce": 330571043,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1768685762804,
- "link": null,
- "locked": false,
- "text": "WebSocket connection\non chat.signal.com",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "center",
- "verticalAlign": "middle",
- "containerId": "wN-1aiqTy8EelOURWsY4E",
- "originalText": "WebSocket connection on chat.signal.com",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "IHq2qxEqUSCP4Tt7IOSph",
- "type": "text",
- "x": 337.91731770833337,
- "y": 49.52115885416663,
- "width": 109.89990234375,
- "height": 25,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "ag",
- "roundness": null,
- "seed": 87614285,
- "version": 70,
- "versionNonce": 1300605187,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1768687383820,
- "link": null,
- "locked": false,
- "text": "SUP Server",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "left",
- "verticalAlign": "top",
- "containerId": null,
- "originalText": "SUP Server",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "hcGGzvqT_ihnanzGYaqOv",
- "type": "rectangle",
- "x": 255.8606770833336,
- "y": -30.20735677083337,
- "width": 596.9561941964287,
- "height": 223.84570312499994,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "dashed",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "an",
- "roundness": {
- "type": 3
- },
- "seed": 1456200845,
- "version": 696,
- "versionNonce": 1670648965,
- "isDeleted": false,
- "boundElements": [
- {
- "id": "Gf2m8hClymOsReVNX3j47",
- "type": "arrow"
- }
- ],
- "updated": 1768722074032,
- "link": null,
- "locked": false
- },
- {
- "id": "xYkxnXL4g5KS5YsJIUrlM",
- "type": "text",
- "x": 404.1661714033563,
- "y": -61.89886106396227,
- "width": 250.01974487304688,
- "height": 25,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "dashed",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "ao",
- "roundness": null,
- "seed": 1877972781,
- "version": 927,
- "versionNonce": 1660665784,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1769391224127,
- "link": null,
- "locked": false,
- "text": "User's Self-Hosted Server",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "left",
- "verticalAlign": "top",
- "containerId": null,
- "originalText": "User's Self-Hosted Server",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "JFj4AIU6qh1LAm8QVQqRG",
- "type": "rectangle",
- "x": -42.549479166666515,
- "y": 402.95865885416663,
- "width": 214.66566534309902,
- "height": 295.0022477613677,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "dashed",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "ap",
- "roundness": {
- "type": 3
- },
- "seed": 1667903597,
- "version": 335,
- "versionNonce": 443863224,
- "isDeleted": false,
- "boundElements": [
- {
- "id": "t44vlc42q_1WvhRZtOcdt",
- "type": "arrow"
- }
- ],
- "updated": 1769391139610,
- "link": null,
- "locked": false
- },
- {
- "id": "wN-1aiqTy8EelOURWsY4E",
- "type": "arrow",
- "x": 1.1943190119108067,
- "y": 540.4158756368288,
- "width": 77.76372649212522,
- "height": 375.9656396342246,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "apV",
- "roundness": null,
- "seed": 1580099555,
- "version": 560,
- "versionNonce": 899439032,
- "isDeleted": false,
- "boundElements": [
- {
- "type": "text",
- "id": "PPR4JysV7Oxn5UJ2TDQSX"
- }
- ],
- "updated": 1769391153323,
- "link": null,
- "locked": false,
- "points": [
- [
- 0,
- 0
- ],
- [
- -77.76372649212522,
- 0
- ],
- [
- -77.76372649212522,
- -227.95498889880895
- ],
- [
- -74.57292415513993,
- -227.95498889880895
- ],
- [
- -74.57292415513993,
- -375.9656396342246
- ]
- ],
- "startBinding": {
- "elementId": "vgtgZtFmt1xq7s1sOgLPv",
- "mode": "orbit",
- "fixedPoint": [
- -0.05022562291544046,
- 0.49842325695984285
- ]
- },
- "endBinding": {
- "elementId": "7fGvBO1wPB7KmcLdQS0oT",
- "mode": "orbit",
- "fixedPoint": [
- 0.49940249737425607,
- 1.0450307827616538
- ]
- },
- "startArrowhead": "arrow",
- "endArrowhead": "arrow",
- "elbowed": true,
- "fixedSegments": [
- {
- "index": 2,
- "start": [
- -77.76372649212522,
- 0
- ],
- "end": [
- -77.76372649212522,
- -227.95498889880895
- ]
- },
- {
- "index": 3,
- "start": [
- -77.76372649212522,
- -227.95498889880895
- ],
- "end": [
- -74.57292415513993,
- -227.95498889880895
- ]
- }
- ],
- "startIsSpecial": false,
- "endIsSpecial": false
- },
- {
- "id": "8Nmzpi54TtXde91RroPni",
- "type": "text",
- "x": -33.900604801127656,
- "y": 371.83191970447785,
- "width": 223.8397979736328,
- "height": 25,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "dashed",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "aq",
- "roundness": null,
- "seed": 489832781,
- "version": 590,
- "versionNonce": 1567561416,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1769391081293,
- "link": null,
- "locked": false,
- "text": "User's Phone (Android)",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "left",
- "verticalAlign": "top",
- "containerId": null,
- "originalText": "User's Phone (Android)",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "pDL0AmXVDpmeLiMPNhgXB",
- "type": "ellipse",
- "x": 347.6231055682466,
- "y": 393.20907140731777,
- "width": 155.6640625,
- "height": 128.03125,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b02",
- "roundness": {
- "type": 2
- },
- "seed": 23153837,
- "version": 1096,
- "versionNonce": 1593174472,
- "isDeleted": false,
- "boundElements": [
- {
- "id": "sMHy2iCqiPDKAwwq-dRtF",
- "type": "text"
- },
- {
- "id": "Gf2m8hClymOsReVNX3j47",
- "type": "arrow"
- },
- {
- "id": "t44vlc42q_1WvhRZtOcdt",
- "type": "arrow"
- },
- {
- "id": "hauitp4TDHIQsHGW_tjMw",
- "type": "arrow"
- }
- ],
- "updated": 1769391114004,
- "link": null,
- "locked": false
- },
- {
- "id": "sMHy2iCqiPDKAwwq-dRtF",
- "type": "text",
- "x": 403.1996013953288,
- "y": 444.9588138679227,
- "width": 44.43995666503906,
- "height": 25,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b03",
- "roundness": null,
- "seed": 2011005347,
- "version": 1037,
- "versionNonce": 146595768,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1769391114005,
- "link": null,
- "locked": false,
- "text": "User",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "center",
- "verticalAlign": "middle",
- "containerId": "pDL0AmXVDpmeLiMPNhgXB",
- "originalText": "User",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "l68p6MrICi0j1MxyTO7FJ",
- "type": "rectangle",
- "x": 629.8659261067706,
- "y": 11.624343145461296,
- "width": 166.41015625,
- "height": 133.2421875,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b06",
- "roundness": {
- "type": 3
- },
- "seed": 1014887149,
- "version": 909,
- "versionNonce": 2142655688,
- "isDeleted": false,
- "boundElements": [
- {
- "id": "RNCrlFh5EZBwnYr-7bA_j",
- "type": "arrow"
- },
- {
- "id": "Gf2m8hClymOsReVNX3j47",
- "type": "arrow"
- },
- {
- "id": "arkYz5xpoKLpnfgkI-VOo",
- "type": "arrow"
- }
- ],
- "updated": 1769391546726,
- "link": null,
- "locked": false
- },
- {
- "id": "hauitp4TDHIQsHGW_tjMw",
- "type": "arrow",
- "x": 425.3551368182466,
- "y": 387.20912122059906,
- "width": 30.43223172450473,
- "height": 232.81686861643243,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b07",
- "roundness": null,
- "seed": 1731189997,
- "version": 800,
- "versionNonce": 525624760,
- "isDeleted": false,
- "boundElements": [
- {
- "type": "text",
- "id": "vxGx-nqDvOFOiAk4_cs44"
- }
- ],
- "updated": 1769391116391,
- "link": null,
- "locked": false,
- "points": [
- [
- 0,
- 0
- ],
- [
- 0,
- -117.52344361887725
- ],
- [
- -30.43223172450473,
- -117.52344361887725
- ],
- [
- -30.43223172450473,
- -232.81686861643243
- ]
- ],
- "startBinding": {
- "elementId": "pDL0AmXVDpmeLiMPNhgXB",
- "mode": "orbit",
- "fixedPoint": [
- 0.4993575909661228,
- -0.04686316963021689
- ]
- },
- "endBinding": {
- "elementId": "ubnB-MCtd3Y84dUGFa-b7",
- "mode": "orbit",
- "fixedPoint": [
- 0.49939907513908144,
- 1.0450307827616534
- ]
- },
- "startArrowhead": null,
- "endArrowhead": "arrow",
- "elbowed": true,
- "fixedSegments": [
- {
- "index": 2,
- "start": [
- 0,
- -117.52344361887725
- ],
- "end": [
- -30.43223172450473,
- -117.52344361887725
- ]
- }
- ],
- "startIsSpecial": false,
- "endIsSpecial": false
- },
- {
- "id": "vxGx-nqDvOFOiAk4_cs44",
- "type": "text",
- "x": 440.88123067220056,
- "y": 207.03896510294422,
- "width": 166.91983032226562,
- "height": 50,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b08",
- "roundness": null,
- "seed": 1384345283,
- "version": 52,
- "versionNonce": 242755768,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1769391114005,
- "link": null,
- "locked": false,
- "text": "Link Signal device\n(one time setup)",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "center",
- "verticalAlign": "middle",
- "containerId": "hauitp4TDHIQsHGW_tjMw",
- "originalText": "Link Signal device\n(one time setup)",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "RNCrlFh5EZBwnYr-7bA_j",
- "type": "arrow",
- "x": 623.8659261067706,
- "y": 78.1454368954613,
- "width": 139.52478027343722,
- "height": 3.525721958705347,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b09",
- "roundness": null,
- "seed": 1756548205,
- "version": 486,
- "versionNonce": 1694311243,
- "isDeleted": false,
- "boundElements": [
- {
- "type": "text",
- "id": "dltbZAYBQ5avRfqMY2QVu"
- }
- ],
- "updated": 1768722102290,
- "link": null,
- "locked": false,
- "points": [
- [
- 0,
- 0
- ],
- [
- -69.76239013671864,
- 0
- ],
- [
- -69.76239013671864,
- 3.525721958705347
- ],
- [
- -139.52478027343722,
- 3.525721958705347
- ]
- ],
- "startBinding": {
- "elementId": "l68p6MrICi0j1MxyTO7FJ",
- "mode": "orbit",
- "fixedPoint": [
- -0.03605549165512547,
- 0.4992494869539725
- ]
- },
- "endBinding": {
- "elementId": "ubnB-MCtd3Y84dUGFa-b7",
- "mode": "orbit",
- "fixedPoint": [
- 1.036055491655126,
- 0.4992494869539726
- ]
- },
- "startArrowhead": null,
- "endArrowhead": "arrow",
- "elbowed": true,
- "fixedSegments": null,
- "startIsSpecial": null,
- "endIsSpecial": null
- },
- {
- "id": "dltbZAYBQ5avRfqMY2QVu",
- "type": "text",
- "x": 595.2638367425828,
- "y": -29.353516351609017,
- "width": 53.69996643066406,
- "height": 25,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b09V",
- "roundness": null,
- "seed": 1817962659,
- "version": 6,
- "versionNonce": 867947107,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1768686850795,
- "link": null,
- "locked": false,
- "text": "IMAP",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "center",
- "verticalAlign": "middle",
- "containerId": "RNCrlFh5EZBwnYr-7bA_j",
- "originalText": "IMAP",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "Gf2m8hClymOsReVNX3j47",
- "type": "arrow",
- "x": 509.28708256349,
- "y": 457.12469640731774,
- "width": 204.69119151059056,
- "height": 306.25816576185645,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0B",
- "roundness": null,
- "seed": 778790627,
- "version": 1694,
- "versionNonce": 1434069448,
- "isDeleted": false,
- "boundElements": [
- {
- "type": "text",
- "id": "dRN0F_NBkLKndkjCpaYdF"
- }
- ],
- "updated": 1769391546728,
- "link": null,
- "locked": false,
- "points": [
- [
- 0,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- -191.35883889243678
- ],
- [
- 204.69119151059056,
- -191.35883889243678
- ],
- [
- 204.69119151059056,
- -231.57083911934063
- ],
- [
- 203.6839216682805,
- -231.57083911934063
- ],
- [
- 203.6839216682805,
- -306.25816576185645
- ]
- ],
- "startBinding": {
- "elementId": "pDL0AmXVDpmeLiMPNhgXB",
- "mode": "orbit",
- "fixedPoint": [
- 1.0385439927423414,
- 0.49921894068830835
- ]
- },
- "endBinding": {
- "elementId": "l68p6MrICi0j1MxyTO7FJ",
- "mode": "orbit",
- "fixedPoint": [
- 0.49939907513908044,
- 1.0450307827616534
- ]
- },
- "startArrowhead": null,
- "endArrowhead": "arrow",
- "elbowed": true,
- "fixedSegments": [
- {
- "index": 3,
- "start": [
- 40,
- -191.35883889243678
- ],
- "end": [
- 204.69119151059056,
- -191.35883889243678
- ]
- },
- {
- "index": 4,
- "start": [
- 204.69119151059056,
- -191.35883889243678
- ],
- "end": [
- 204.69119151059056,
- -231.57083911934063
- ]
- },
- {
- "index": 5,
- "start": [
- 204.69119151059056,
- -231.57083911934063
- ],
- "end": [
- 203.6839216682805,
- -231.57083911934063
- ]
- }
- ],
- "startIsSpecial": false,
- "endIsSpecial": false
- },
- {
- "id": "dRN0F_NBkLKndkjCpaYdF",
- "type": "text",
- "x": 778.3100734892347,
- "y": 224.62913876488096,
- "width": 160.4198455810547,
- "height": 75,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0C",
- "roundness": null,
- "seed": 1005555021,
- "version": 92,
- "versionNonce": 344651720,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1769391199999,
- "link": null,
- "locked": false,
- "text": "Auth ProtonMail\naccount\n(one time setup)",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "center",
- "verticalAlign": "middle",
- "containerId": "Gf2m8hClymOsReVNX3j47",
- "originalText": "Auth ProtonMail account\n(one time setup)",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "t44vlc42q_1WvhRZtOcdt",
- "type": "arrow",
- "x": 353.59834675075695,
- "y": 493.28719640731777,
- "width": 175.48216057432444,
- "height": 0.3715921051325495,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0D",
- "roundness": null,
- "seed": 1473653773,
- "version": 582,
- "versionNonce": 68636088,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1769391159341,
- "link": null,
- "locked": false,
- "points": [
- [
- 0,
- 0
- ],
- [
- -175.48216057432444,
- -0.3715921051325495
- ]
- ],
- "startBinding": {
- "elementId": "pDL0AmXVDpmeLiMPNhgXB",
- "mode": "orbit",
- "fixedPoint": [
- 0.03838548915238757,
- 0.7816695142787405
- ]
- },
- "endBinding": {
- "elementId": "JFj4AIU6qh1LAm8QVQqRG",
- "mode": "orbit",
- "fixedPoint": [
- 1.0279504409352573,
- 0.3049364746562415
- ]
- },
- "startArrowhead": null,
- "endArrowhead": "arrow",
- "elbowed": true,
- "fixedSegments": null,
- "startIsSpecial": null,
- "endIsSpecial": null
- },
- {
- "id": "LuiOfX2WrGgTFGCh1s_oo",
- "type": "text",
- "x": 664.5501302083335,
- "y": 36.45224144345241,
- "width": 103.99989318847656,
- "height": 75,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0F",
- "roundness": null,
- "seed": 788874861,
- "version": 221,
- "versionNonce": 788868075,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1768722062632,
- "link": null,
- "locked": false,
- "text": "ProtonMail\nBridge\n(Optional)",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "left",
- "verticalAlign": "top",
- "containerId": null,
- "originalText": "ProtonMail\nBridge\n(Optional)",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "G6GfUeIwo3YJpOfYBMe8P",
- "type": "text",
- "x": 85.91843377976204,
- "y": 55.63304501488096,
- "width": 143.7398681640625,
- "height": 50,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0G",
- "roundness": null,
- "seed": 1208577891,
- "version": 477,
- "versionNonce": 1172217027,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1768688207743,
- "link": null,
- "locked": false,
- "text": "Create groups\nSend messages",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "left",
- "verticalAlign": "top",
- "containerId": null,
- "originalText": "Create groups\nSend messages",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "WeHPdAoCwAGXZu5ut9jaX",
- "type": "rectangle",
- "x": 334.86374627976204,
- "y": 97.17992001488096,
- "width": 108.8515625,
- "height": 35,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0H",
- "roundness": {
- "type": 3
- },
- "seed": 1407995459,
- "version": 103,
- "versionNonce": 523854669,
- "isDeleted": false,
- "boundElements": [
- {
- "type": "text",
- "id": "-ooE7317g-_nL1NRo7VtK"
- },
- {
- "id": "jqv8Vv58NPpsDZoaXIZY8",
- "type": "arrow"
- }
- ],
- "updated": 1768687674726,
- "link": null,
- "locked": false
- },
- {
- "id": "-ooE7317g-_nL1NRo7VtK",
- "type": "text",
- "x": 348.75957452683235,
- "y": 102.17992001488096,
- "width": 81.05990600585938,
- "height": 25,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0I",
- "roundness": null,
- "seed": 572049933,
- "version": 25,
- "versionNonce": 708753027,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1768687389129,
- "link": null,
- "locked": false,
- "text": "signal-cli",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "center",
- "verticalAlign": "middle",
- "containerId": "WeHPdAoCwAGXZu5ut9jaX",
- "originalText": "signal-cli",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "jqv8Vv58NPpsDZoaXIZY8",
- "type": "arrow",
- "x": 328.86374627976204,
- "y": 114.57992001488095,
- "width": 312.46071079799117,
- "height": 0.14687500000000853,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0P",
- "roundness": null,
- "seed": 586510381,
- "version": 30,
- "versionNonce": 1977867533,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1768687676554,
- "link": null,
- "locked": false,
- "points": [
- [
- 0,
- 0
- ],
- [
- -312.46071079799117,
- 0.14687500000000853
- ]
- ],
- "startBinding": {
- "elementId": "WeHPdAoCwAGXZu5ut9jaX",
- "mode": "orbit",
- "fixedPoint": [
- -0.055120935907557594,
- 0.4971428571428569
- ]
- },
- "endBinding": {
- "elementId": "7fGvBO1wPB7KmcLdQS0oT",
- "mode": "orbit",
- "fixedPoint": [
- 1.0358501575446377,
- 0.6718498712149771
- ]
- },
- "startArrowhead": null,
- "endArrowhead": "arrow",
- "elbowed": true,
- "fixedSegments": null,
- "startIsSpecial": null,
- "endIsSpecial": null
- },
- {
- "id": "KsN6VJCu_Js44TB79mnZV",
- "type": "text",
- "x": 562.6354678762497,
- "y": 407.7665418137195,
- "width": 392.6328125,
- "height": 250,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0Z",
- "roundness": null,
- "seed": 302706755,
- "version": 445,
- "versionNonce": 904888248,
- "isDeleted": true,
- "boundElements": [],
- "updated": 1769391173119,
- "link": null,
- "locked": false,
- "text": "signal-cli: \ngithub.com/AsamK/signal-cli\n\nprotonmail bridge:\ngithub.com/ProtonMail/proton-bridge\n\nprotonmail bridge docker image:\ngithub.com/shenxn/protonmail-bridge-\ndocker\n",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "left",
- "verticalAlign": "top",
- "containerId": null,
- "originalText": "signal-cli: \ngithub.com/AsamK/signal-cli\n\nprotonmail bridge: github.com/ProtonMail/proton-bridge\n\nprotonmail bridge docker image: github.com/shenxn/protonmail-bridge-docker\n",
- "autoResize": false,
- "lineHeight": 1.25
- },
- {
- "id": "b_1xFx1msT5nd4KKXb3l3",
- "type": "rectangle",
- "x": 719.7241843953517,
- "y": 338.4950760145983,
- "width": 167.36328125,
- "height": 133.2421875,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0a",
- "roundness": {
- "type": 3
- },
- "seed": 663201227,
- "version": 1450,
- "versionNonce": 1730630328,
- "isDeleted": false,
- "boundElements": [
- {
- "type": "text",
- "id": "I1pGk3B9Ec_xrXMDZgUV0"
- },
- {
- "id": "arkYz5xpoKLpnfgkI-VOo",
- "type": "arrow"
- }
- ],
- "updated": 1769391546726,
- "link": null,
- "locked": false
- },
- {
- "id": "I1pGk3B9Ec_xrXMDZgUV0",
- "type": "text",
- "x": 751.4058784261134,
- "y": 380.1161697645983,
- "width": 103.99989318847656,
- "height": 50,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0b",
- "roundness": null,
- "seed": 583447659,
- "version": 839,
- "versionNonce": 1587575752,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1769391546726,
- "link": null,
- "locked": false,
- "text": "ProtonMail\nServer",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "center",
- "verticalAlign": "middle",
- "containerId": "b_1xFx1msT5nd4KKXb3l3",
- "originalText": "ProtonMail Server",
- "autoResize": true,
- "lineHeight": 1.25
- },
- {
- "id": "arkYz5xpoKLpnfgkI-VOo",
- "type": "arrow",
- "x": 821.417836997662,
- "y": 332.4950760145983,
- "width": 77.84510390781213,
- "height": 232.63753787407194,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0c",
- "roundness": null,
- "seed": 1417079147,
- "version": 1710,
- "versionNonce": 1020626360,
- "isDeleted": false,
- "boundElements": [
- {
- "type": "text",
- "id": "EGNOTS-XqhS2k84RwsI7Q"
- }
- ],
- "updated": 1769391572659,
- "link": null,
- "locked": false,
- "points": [
- [
- 0,
- 0
- ],
- [
- 0,
- -40
- ],
- [
- 58.703349266920895,
- -40
- ],
- [
- 58.703349266920895,
- -222.84056746374762
- ],
- [
- 51.96225042641231,
- -222.84056746374762
- ],
- [
- 51.96225042641231,
- -232.63753787407194
- ],
- [
- -19.141754640891236,
- -232.63753787407194
- ]
- ],
- "startBinding": {
- "elementId": "b_1xFx1msT5nd4KKXb3l3",
- "mode": "orbit",
- "fixedPoint": [
- 0.6076222445137457,
- -0.045030782761653475
- ]
- },
- "endBinding": {
- "elementId": "l68p6MrICi0j1MxyTO7FJ",
- "mode": "orbit",
- "fixedPoint": [
- 1.0360554916551261,
- 0.6568659580913585
- ]
- },
- "startArrowhead": null,
- "endArrowhead": "arrow",
- "elbowed": true,
- "fixedSegments": [
- {
- "index": 3,
- "start": [
- 58.703349266920895,
- -40
- ],
- "end": [
- 58.703349266920895,
- -222.84056746374762
- ]
- },
- {
- "index": 4,
- "start": [
- 58.703349266920895,
- -222.84056746374762
- ],
- "end": [
- 51.96225042641231,
- -222.84056746374762
- ]
- },
- {
- "index": 5,
- "start": [
- 51.96225042641231,
- -222.84056746374762
- ],
- "end": [
- 51.96225042641231,
- -232.63753787407194
- ]
- }
- ],
- "startIsSpecial": false,
- "endIsSpecial": false
- },
- {
- "id": "EGNOTS-XqhS2k84RwsI7Q",
- "type": "text",
- "x": 923.453510180991,
- "y": 97.15450855085066,
- "width": 43.63995361328125,
- "height": 25,
- "angle": 0,
- "strokeColor": "#1e1e1e",
- "backgroundColor": "transparent",
- "fillStyle": "solid",
- "strokeWidth": 2,
- "strokeStyle": "solid",
- "roughness": 1,
- "opacity": 100,
- "groupIds": [],
- "frameId": null,
- "index": "b0cV",
- "roundness": null,
- "seed": 1245023659,
- "version": 14,
- "versionNonce": 1269678792,
- "isDeleted": false,
- "boundElements": [],
- "updated": 1769391546727,
- "link": null,
- "locked": false,
- "text": "Sync",
- "fontSize": 20,
- "fontFamily": 5,
- "textAlign": "center",
- "verticalAlign": "middle",
- "containerId": "arkYz5xpoKLpnfgkI-VOo",
- "originalText": "Sync",
- "autoResize": true,
- "lineHeight": 1.25
- }
- ],
- "appState": {
- "gridSize": 20,
- "gridStep": 5,
- "gridModeEnabled": false,
- "viewBackgroundColor": "#ffffff",
- "lockedMultiSelections": {}
- },
- "files": {}
-}
\ No newline at end of file
diff --git a/assets/SUP Architecture.webp b/assets/SUP Architecture.webp
deleted file mode 100644
index b4cc1c9..0000000
Binary files a/assets/SUP Architecture.webp and /dev/null differ
diff --git a/assets/prism.webp b/assets/prism.webp
new file mode 100644
index 0000000..70232a1
Binary files /dev/null and b/assets/prism.webp differ
diff --git a/assets/sup.webp b/assets/sup.webp
deleted file mode 100644
index c6be5f3..0000000
Binary files a/assets/sup.webp and /dev/null differ
diff --git a/bun.lock b/bun.lock
index 8247563..3fb30e2 100644
--- a/bun.lock
+++ b/bun.lock
@@ -3,7 +3,7 @@
"configVersion": 1,
"workspaces": {
"": {
- "name": "sup",
+ "name": "prism",
"dependencies": {
"chalk": "5.6.2",
"hono": "4.11.7",
diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml
index 2086537..260ef95 100644
--- a/docker-compose.dev.yml
+++ b/docker-compose.dev.yml
@@ -1,6 +1,6 @@
services:
server:
- container_name: sup-server
+ container_name: prism-server
build:
context: .
dockerfile: server/Dockerfile
@@ -15,10 +15,10 @@ services:
- PROTON_IMAP_PASSWORD=${PROTON_IMAP_PASSWORD:-}
- PROTON_BRIDGE_HOST=protonmail-bridge
- PROTON_BRIDGE_PORT=${PROTON_BRIDGE_PORT:-143}
- - PROTON_SUP_TOPIC=${PROTON_SUP_TOPIC:-Proton Mail}
+ - PROTON_PRISM_TOPIC=${PROTON_PRISM_TOPIC:-Proton Mail}
volumes:
- signal-data:/root/.local/share/signal-cli
- - sup-data:/root/.local/share/sup
+ - prism-data:/root/.local/share/prism
restart: unless-stopped
protonmail-bridge:
@@ -34,5 +34,5 @@ services:
volumes:
signal-data:
- sup-data:
+ prism-data:
proton-bridge-data:
diff --git a/docker-compose.yml b/docker-compose.yml
index 46f152c..4928eae 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,7 +1,7 @@
services:
server:
- container_name: sup-server
- image: ghcr.io/lone-cloud/sup:latest
+ container_name: prism-server
+ image: ghcr.io/lone-cloud/prism:latest
ports:
- '8080:8080'
environment:
@@ -14,10 +14,10 @@ services:
- PROTON_IMAP_PASSWORD=${PROTON_IMAP_PASSWORD:-}
- PROTON_BRIDGE_HOST=protonmail-bridge
- PROTON_BRIDGE_PORT=${PROTON_BRIDGE_PORT:-143}
- - PROTON_SUP_TOPIC=${PROTON_SUP_TOPIC:-Proton Mail}
+ - PROTON_PRISM_TOPIC=${PROTON_PRISM_TOPIC:-Proton Mail}
volumes:
- signal-data:/root/.local/share/signal-cli
- - sup-data:/root/.local/share/sup
+ - prism-data:/root/.local/share/prism
restart: unless-stopped
protonmail-bridge:
@@ -31,5 +31,5 @@ services:
volumes:
signal-data:
- sup-data:
+ prism-data:
proton-bridge-data:
diff --git a/package.json b/package.json
index 73d1934..9467fbb 100644
--- a/package.json
+++ b/package.json
@@ -1,5 +1,5 @@
{
- "name": "sup",
+ "name": "prism",
"version": "0.2.0",
"description": "Privacy-preserving push notifications using Signal as transport",
"private": true,
@@ -11,12 +11,12 @@
"license": "AGPL-3.0-or-later",
"repository": {
"type": "git",
- "url": "https://github.com/lone-cloud/sup"
+ "url": "https://github.com/lone-cloud/prism"
},
"scripts": {
"postinstall": "bun run scripts/install-signal-cli.ts || true",
"start": "bun run server/index.ts",
- "build": "bun build --compile server/index.ts --outfile server/sup",
+ "build": "bun build --compile server/index.ts --outfile server/prism",
"check": "tsc --noEmit && biome check .",
"fix": "biome check --write --unsafe .",
"release": "bun run scripts/release.ts"
diff --git a/scripts/release.ts b/scripts/release.ts
index 31e5f62..354314f 100644
--- a/scripts/release.ts
+++ b/scripts/release.ts
@@ -26,14 +26,14 @@ try {
Pull the latest version:
\`\`\`bash
-docker pull ghcr.io/lone-cloud/sup:${version}
+docker pull ghcr.io/lone-cloud/prism:${version}
\`\`\`" --generate-notes`;
console.log(`
✨ Release ${version} complete!
Once CI completes, images will be available:
- docker pull ghcr.io/lone-cloud/sup:${version}
+ docker pull ghcr.io/lone-cloud/prism:${version}
`);
} catch (error) {
console.error('Release failed:', error);
diff --git a/server/Dockerfile b/server/Dockerfile
index 7eaf1dc..c9f4899 100644
--- a/server/Dockerfile
+++ b/server/Dockerfile
@@ -7,7 +7,7 @@ RUN bun install --frozen-lockfile
COPY server ./server
-RUN bun build --compile server/index.ts --outfile sup
+RUN bun build --compile server/index.ts --outfile prism
FROM debian:13.3-slim
@@ -34,7 +34,7 @@ RUN ARCH=$(uname -m) && \
rm /tmp/libsignal_jni_aarch64.so; \
fi
-COPY --from=builder /app/sup /usr/local/bin/sup
+COPY --from=builder /app/prism /usr/local/bin/prism
COPY --from=builder /app/server/public /public
ENV PATH="/usr/local/signal-cli/bin:${PATH}"
@@ -42,4 +42,4 @@ ENV LD_LIBRARY_PATH="/usr/local/signal-cli/lib:${LD_LIBRARY_PATH}"
EXPOSE 8080
-CMD ["sup"]
+CMD ["prism"]
diff --git a/server/constants/config.ts b/server/constants/config.ts
index 38819ca..4c2358d 100644
--- a/server/constants/config.ts
+++ b/server/constants/config.ts
@@ -4,15 +4,15 @@ export const VERBOSE_LOGGING = Bun.env.VERBOSE_LOGGING === 'true';
export const ALLOW_INSECURE_HTTP = Bun.env.ALLOW_INSECURE_HTTP === 'true';
export const RATE_LIMIT = Number.parseInt(Bun.env.RATE_LIMIT || '100', 10);
-export const DEVICE_NAME = Bun.env.DEVICE_NAME || 'SUP';
+export const DEVICE_NAME = Bun.env.DEVICE_NAME || 'PRISM';
-export const SUP_ENDPOINT_PREFIX = `[${DEVICE_NAME}:`;
+export const PRISM_ENDPOINT_PREFIX = `[${DEVICE_NAME}:`;
export const PROTON_IMAP_USERNAME = Bun.env.PROTON_IMAP_USERNAME;
export const PROTON_IMAP_PASSWORD = Bun.env.PROTON_IMAP_PASSWORD;
export const PROTON_BRIDGE_HOST = Bun.env.PROTON_BRIDGE_HOST || 'protonmail-bridge';
export const PROTON_BRIDGE_PORT = Number.parseInt(Bun.env.PROTON_BRIDGE_PORT || '143', 10);
-export const PROTON_SUP_TOPIC = Bun.env.PROTON_SUP_TOPIC || 'Proton Mail';
+export const PROTON_PRISM_TOPIC = Bun.env.PROTON_PRISM_TOPIC || 'Proton Mail';
export const IMAP_INBOX = 'INBOX';
export const IMAP_SEEN_FLAG = '\\Seen';
diff --git a/server/constants/paths.ts b/server/constants/paths.ts
index 2cc10ee..e56c235 100644
--- a/server/constants/paths.ts
+++ b/server/constants/paths.ts
@@ -7,7 +7,7 @@ export const SIGNAL_CLI_SOCKET = '/tmp/signal-cli.sock';
export const SIGNAL_CLI_DATA_DIR = `${HOME}/.local/share/signal-cli`;
export const SIGNAL_CLI_DATA = `${HOME}/.local/share/signal-cli/data`;
-export const SUP_DB = `${HOME}/.local/share/sup/store.db`;
+export const PRISM_DB = `${HOME}/.local/share/prism/store.db`;
const PUBLIC_DIR_LOCAL = `${import.meta.dir}/../public`;
export const PUBLIC_DIR = (await Bun.file(`${PUBLIC_DIR_LOCAL}/favicon.webp`).exists())
diff --git a/server/index.ts b/server/index.ts
index 0a67601..0402348 100644
--- a/server/index.ts
+++ b/server/index.ts
@@ -94,7 +94,7 @@ const server = Bun.serve({
idleTimeout: 30,
});
-logInfo(`\nSUP running on:`);
+logInfo(`\nPRISM running on:`);
logInfo(` Local: http://localhost:${server.port}`);
const lanIP = getLanIP();
diff --git a/server/modules/proton-mail.ts b/server/modules/proton-mail.ts
index f44ef81..10af834 100644
--- a/server/modules/proton-mail.ts
+++ b/server/modules/proton-mail.ts
@@ -10,7 +10,7 @@ import {
PROTON_BRIDGE_PORT,
PROTON_IMAP_PASSWORD,
PROTON_IMAP_USERNAME,
- PROTON_SUP_TOPIC,
+ PROTON_PRISM_TOPIC,
} from '@/constants/config';
import { sendNotification as sendChannelNotification } from '@/modules/notifications';
import { logError, logInfo, logSuccess, logVerbose, logWarn } from '@/utils/log';
@@ -124,7 +124,7 @@ export async function startProtonMonitor() {
const uid = await uidPromise;
- await sendChannelNotification(`${ENDPOINT_PREFIX_PROTON}${PROTON_SUP_TOPIC}`, {
+ await sendChannelNotification(`${ENDPOINT_PREFIX_PROTON}${PROTON_PRISM_TOPIC}`, {
title: from,
message: subject,
actions: [
diff --git a/server/modules/store.ts b/server/modules/store.ts
index 99b266b..c6e3b9a 100644
--- a/server/modules/store.ts
+++ b/server/modules/store.ts
@@ -1,5 +1,7 @@
import { Database } from 'bun:sqlite';
-import { SUP_DB } from '@/constants/paths';
+import { mkdirSync } from 'node:fs';
+import { dirname } from 'node:path';
+import { PRISM_DB } from '@/constants/paths';
import type { NotificationChannel } from '@/types/notifications';
type EndpointMapping = {
@@ -10,7 +12,8 @@ type EndpointMapping = {
upEndpoint: string | null;
};
-const db = new Database(SUP_DB);
+mkdirSync(dirname(PRISM_DB), { recursive: true });
+const db = new Database(PRISM_DB);
db.run(`
CREATE TABLE IF NOT EXISTS mappings (
diff --git a/server/public/favicon.webp b/server/public/favicon.webp
index 2a011b0..87636f6 100644
Binary files a/server/public/favicon.webp and b/server/public/favicon.webp differ
diff --git a/server/public/icon-512.webp b/server/public/icon-512.webp
deleted file mode 100644
index c6be5f3..0000000
Binary files a/server/public/icon-512.webp and /dev/null differ
diff --git a/server/public/index.html b/server/public/index.html
index c4f0dc4..a7da615 100644
--- a/server/public/index.html
+++ b/server/public/index.html
@@ -2,7 +2,7 @@
- SUP Admin
+ PRISM Admin
diff --git a/server/public/manifest.json b/server/public/manifest.json
index d89df99..8934c4b 100644
--- a/server/public/manifest.json
+++ b/server/public/manifest.json
@@ -1,6 +1,6 @@
{
- "name": "SUP Admin",
- "short_name": "SUP",
+ "name": "PRISM Admin",
+ "short_name": "PRISM",
"description": "Notification gateway admin panel",
"start_url": "/",
"display": "standalone",
diff --git a/server/routes/admin.ts b/server/routes/admin.ts
index 65dfb89..ce1be31 100644
--- a/server/routes/admin.ts
+++ b/server/routes/admin.ts
@@ -26,7 +26,7 @@ admin.use(
'*',
basicAuth({
verifyUser: (_, password, c) => verifyApiKey(password, c),
- realm: 'SUP Admin - Username: any, Password: API_KEY',
+ realm: 'PRISM Admin - Username: any, Password: API_KEY',
}),
);
diff --git a/server/routes/ntfy.ts b/server/routes/ntfy.ts
index 2c78105..a116f86 100644
--- a/server/routes/ntfy.ts
+++ b/server/routes/ntfy.ts
@@ -10,7 +10,7 @@ ntfy.use(
'*',
basicAuth({
verifyUser: (_, password) => verifyApiKey(password),
- realm: 'SUP ntfy - Username: any, Password: API_KEY',
+ realm: 'PRISM ntfy - Username: any, Password: API_KEY',
}),
);
diff --git a/server/routes/proton-mail.ts b/server/routes/proton-mail.ts
index da90df1..ed6af75 100644
--- a/server/routes/proton-mail.ts
+++ b/server/routes/proton-mail.ts
@@ -10,7 +10,7 @@ protonMail.use(
'*',
basicAuth({
verifyUser: (_, password, c) => verifyApiKey(password, c),
- realm: 'SUP Proton Mail - Username: any, Password: API_KEY',
+ realm: 'PRISM Proton Mail - Username: any, Password: API_KEY',
}),
);
diff --git a/server/routes/webhook.ts b/server/routes/webhook.ts
index 49c98b8..eb24f40 100644
--- a/server/routes/webhook.ts
+++ b/server/routes/webhook.ts
@@ -11,7 +11,7 @@ webhook.use(
'*',
basicAuth({
verifyUser: (_, password) => verifyApiKey(password),
- realm: 'SUP Webhook - Username: any, Password: API_KEY',
+ realm: 'PRISM Webhook - Username: any, Password: API_KEY',
}),
);