n8n-nodes-signal-cli-rest-api 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.editorconfig ADDED
@@ -0,0 +1,20 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ indent_style = tab
6
+ indent_size = 2
7
+ end_of_line = lf
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [package.json]
12
+ indent_style = space
13
+ indent_size = 2
14
+
15
+ [*.md]
16
+ trim_trailing_whitespace = false
17
+
18
+ [*.yml]
19
+ indent_style = space
20
+ indent_size = 2
package/.eslintrc.js ADDED
@@ -0,0 +1,146 @@
1
+ /**
2
+ * @type {import('@types/eslint').ESLint.ConfigData}
3
+ */
4
+ module.exports = {
5
+ root: true,
6
+
7
+ env: {
8
+ browser: true,
9
+ es6: true,
10
+ node: true,
11
+ },
12
+
13
+ parser: '@typescript-eslint/parser',
14
+
15
+ parserOptions: {
16
+ project: ['./tsconfig.json'],
17
+ sourceType: 'module',
18
+ extraFileExtensions: ['.json'],
19
+ },
20
+
21
+ ignorePatterns: ['.eslintrc.js', '**/*.js', '**/node_modules/**', '**/dist/**'],
22
+
23
+ overrides: [
24
+ {
25
+ files: ['package.json'],
26
+ plugins: ['eslint-plugin-n8n-nodes-base'],
27
+ extends: ['plugin:n8n-nodes-base/community'],
28
+ rules: {
29
+ 'n8n-nodes-base/community-package-json-name-still-default': 'off',
30
+ },
31
+ },
32
+ {
33
+ files: ['./credentials/**/*.ts'],
34
+ plugins: ['eslint-plugin-n8n-nodes-base'],
35
+ extends: ['plugin:n8n-nodes-base/credentials'],
36
+ rules: {
37
+ 'n8n-nodes-base/cred-class-field-authenticate-type-assertion': 'error',
38
+ 'n8n-nodes-base/cred-class-field-display-name-missing-oauth2': 'error',
39
+ 'n8n-nodes-base/cred-class-field-display-name-miscased': 'error',
40
+ 'n8n-nodes-base/cred-class-field-documentation-url-missing': 'error',
41
+ 'n8n-nodes-base/cred-class-field-documentation-url-miscased': 'off',
42
+ 'n8n-nodes-base/cred-class-field-name-missing-oauth2': 'error',
43
+ 'n8n-nodes-base/cred-class-field-name-unsuffixed': 'error',
44
+ 'n8n-nodes-base/cred-class-field-name-uppercase-first-char': 'error',
45
+ 'n8n-nodes-base/cred-class-field-properties-assertion': 'error',
46
+ 'n8n-nodes-base/cred-class-field-type-options-password-missing': 'error',
47
+ 'n8n-nodes-base/cred-class-name-missing-oauth2-suffix': 'error',
48
+ 'n8n-nodes-base/cred-class-name-unsuffixed': 'error',
49
+ 'n8n-nodes-base/cred-filename-against-convention': 'error',
50
+ },
51
+ },
52
+ {
53
+ files: ['./nodes/**/*.ts'],
54
+ plugins: ['eslint-plugin-n8n-nodes-base'],
55
+ extends: ['plugin:n8n-nodes-base/nodes'],
56
+ rules: {
57
+ 'n8n-nodes-base/node-class-description-credentials-name-unsuffixed': 'error',
58
+ 'n8n-nodes-base/node-class-description-display-name-unsuffixed-trigger-node': 'error',
59
+ 'n8n-nodes-base/node-class-description-empty-string': 'error',
60
+ 'n8n-nodes-base/node-class-description-icon-not-svg': 'error',
61
+ 'n8n-nodes-base/node-class-description-inputs-wrong-regular-node': 'off',
62
+ 'n8n-nodes-base/node-class-description-inputs-wrong-trigger-node': 'error',
63
+ 'n8n-nodes-base/node-class-description-missing-subtitle': 'error',
64
+ 'n8n-nodes-base/node-class-description-non-core-color-present': 'error',
65
+ 'n8n-nodes-base/node-class-description-name-miscased': 'error',
66
+ 'n8n-nodes-base/node-class-description-name-unsuffixed-trigger-node': 'error',
67
+ 'n8n-nodes-base/node-class-description-outputs-wrong': 'off',
68
+ 'n8n-nodes-base/node-dirname-against-convention': 'error',
69
+ 'n8n-nodes-base/node-execute-block-double-assertion-for-items': 'error',
70
+ 'n8n-nodes-base/node-execute-block-wrong-error-thrown': 'error',
71
+ 'n8n-nodes-base/node-filename-against-convention': 'error',
72
+ 'n8n-nodes-base/node-param-array-type-assertion': 'error',
73
+ 'n8n-nodes-base/node-param-color-type-unused': 'error',
74
+ 'n8n-nodes-base/node-param-default-missing': 'error',
75
+ 'n8n-nodes-base/node-param-default-wrong-for-boolean': 'error',
76
+ 'n8n-nodes-base/node-param-default-wrong-for-collection': 'error',
77
+ 'n8n-nodes-base/node-param-default-wrong-for-fixed-collection': 'error',
78
+ 'n8n-nodes-base/node-param-default-wrong-for-fixed-collection': 'error',
79
+ 'n8n-nodes-base/node-param-default-wrong-for-multi-options': 'error',
80
+ 'n8n-nodes-base/node-param-default-wrong-for-number': 'error',
81
+ 'n8n-nodes-base/node-param-default-wrong-for-simplify': 'error',
82
+ 'n8n-nodes-base/node-param-default-wrong-for-string': 'error',
83
+ 'n8n-nodes-base/node-param-description-boolean-without-whether': 'error',
84
+ 'n8n-nodes-base/node-param-description-comma-separated-hyphen': 'error',
85
+ 'n8n-nodes-base/node-param-description-empty-string': 'error',
86
+ 'n8n-nodes-base/node-param-description-excess-final-period': 'error',
87
+ 'n8n-nodes-base/node-param-description-excess-inner-whitespace': 'error',
88
+ 'n8n-nodes-base/node-param-description-identical-to-display-name': 'error',
89
+ 'n8n-nodes-base/node-param-description-line-break-html-tag': 'error',
90
+ 'n8n-nodes-base/node-param-description-lowercase-first-char': 'error',
91
+ 'n8n-nodes-base/node-param-description-miscased-id': 'error',
92
+ 'n8n-nodes-base/node-param-description-miscased-json': 'error',
93
+ 'n8n-nodes-base/node-param-description-miscased-url': 'error',
94
+ 'n8n-nodes-base/node-param-description-missing-final-period': 'error',
95
+ 'n8n-nodes-base/node-param-description-missing-for-ignore-ssl-issues': 'error',
96
+ 'n8n-nodes-base/node-param-description-missing-for-return-all': 'error',
97
+ 'n8n-nodes-base/node-param-description-missing-for-simplify': 'error',
98
+ 'n8n-nodes-base/node-param-description-missing-from-dynamic-multi-options': 'error',
99
+ 'n8n-nodes-base/node-param-description-missing-from-dynamic-options': 'error',
100
+ 'n8n-nodes-base/node-param-description-missing-from-limit': 'error',
101
+ 'n8n-nodes-base/node-param-description-unencoded-angle-brackets': 'error',
102
+ 'n8n-nodes-base/node-param-description-unneeded-backticks': 'error',
103
+ 'n8n-nodes-base/node-param-description-untrimmed': 'error',
104
+ 'n8n-nodes-base/node-param-description-url-missing-protocol': 'error',
105
+ 'n8n-nodes-base/node-param-description-weak': 'error',
106
+ 'n8n-nodes-base/node-param-description-wrong-for-dynamic-multi-options': 'error',
107
+ 'n8n-nodes-base/node-param-description-wrong-for-dynamic-options': 'error',
108
+ 'n8n-nodes-base/node-param-description-wrong-for-ignore-ssl-issues': 'error',
109
+ 'n8n-nodes-base/node-param-description-wrong-for-limit': 'error',
110
+ 'n8n-nodes-base/node-param-description-wrong-for-return-all': 'error',
111
+ 'n8n-nodes-base/node-param-description-wrong-for-simplify': 'error',
112
+ 'n8n-nodes-base/node-param-description-wrong-for-upsert': 'error',
113
+ 'n8n-nodes-base/node-param-display-name-excess-inner-whitespace': 'error',
114
+ 'n8n-nodes-base/node-param-display-name-miscased-id': 'error',
115
+ 'n8n-nodes-base/node-param-display-name-miscased': 'error',
116
+ 'n8n-nodes-base/node-param-display-name-not-first-position': 'error',
117
+ 'n8n-nodes-base/node-param-display-name-untrimmed': 'error',
118
+ 'n8n-nodes-base/node-param-display-name-wrong-for-dynamic-multi-options': 'error',
119
+ 'n8n-nodes-base/node-param-display-name-wrong-for-dynamic-options': 'error',
120
+ 'n8n-nodes-base/node-param-display-name-wrong-for-simplify': 'error',
121
+ 'n8n-nodes-base/node-param-display-name-wrong-for-update-fields': 'error',
122
+ 'n8n-nodes-base/node-param-min-value-wrong-for-limit': 'error',
123
+ 'n8n-nodes-base/node-param-multi-options-type-unsorted-items': 'error',
124
+ 'n8n-nodes-base/node-param-name-untrimmed': 'error',
125
+ 'n8n-nodes-base/node-param-operation-option-action-wrong-for-get-many': 'error',
126
+ 'n8n-nodes-base/node-param-operation-option-description-wrong-for-get-many': 'error',
127
+ 'n8n-nodes-base/node-param-operation-option-without-action': 'error',
128
+ 'n8n-nodes-base/node-param-operation-without-no-data-expression': 'error',
129
+ 'n8n-nodes-base/node-param-option-description-identical-to-name': 'error',
130
+ 'n8n-nodes-base/node-param-option-name-containing-star': 'error',
131
+ 'n8n-nodes-base/node-param-option-name-duplicate': 'error',
132
+ 'n8n-nodes-base/node-param-option-name-wrong-for-get-many': 'error',
133
+ 'n8n-nodes-base/node-param-option-name-wrong-for-upsert': 'error',
134
+ 'n8n-nodes-base/node-param-option-value-duplicate': 'error',
135
+ 'n8n-nodes-base/node-param-options-type-unsorted-items': 'error',
136
+ 'n8n-nodes-base/node-param-placeholder-miscased-id': 'error',
137
+ 'n8n-nodes-base/node-param-placeholder-missing-email': 'error',
138
+ 'n8n-nodes-base/node-param-required-false': 'error',
139
+ 'n8n-nodes-base/node-param-resource-with-plural-option': 'error',
140
+ 'n8n-nodes-base/node-param-resource-without-no-data-expression': 'error',
141
+ 'n8n-nodes-base/node-param-type-options-missing-from-limit': 'error',
142
+ 'n8n-nodes-base/node-param-type-options-password-missing': 'error',
143
+ },
144
+ },
145
+ ],
146
+ };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @type {import('@types/eslint').ESLint.ConfigData}
3
+ */
4
+ module.exports = {
5
+ extends: "./.eslintrc.js",
6
+
7
+ overrides: [
8
+ {
9
+ files: ['package.json'],
10
+ plugins: ['eslint-plugin-n8n-nodes-base'],
11
+ rules: {
12
+ 'n8n-nodes-base/community-package-json-name-still-default': 'error',
13
+ },
14
+ },
15
+ ],
16
+ };
package/.prettierrc.js ADDED
@@ -0,0 +1,51 @@
1
+ module.exports = {
2
+ /**
3
+ * https://prettier.io/docs/en/options.html#semicolons
4
+ */
5
+ semi: true,
6
+
7
+ /**
8
+ * https://prettier.io/docs/en/options.html#trailing-commas
9
+ */
10
+ trailingComma: 'all',
11
+
12
+ /**
13
+ * https://prettier.io/docs/en/options.html#bracket-spacing
14
+ */
15
+ bracketSpacing: true,
16
+
17
+ /**
18
+ * https://prettier.io/docs/en/options.html#tabs
19
+ */
20
+ useTabs: true,
21
+
22
+ /**
23
+ * https://prettier.io/docs/en/options.html#tab-width
24
+ */
25
+ tabWidth: 2,
26
+
27
+ /**
28
+ * https://prettier.io/docs/en/options.html#arrow-function-parentheses
29
+ */
30
+ arrowParens: 'always',
31
+
32
+ /**
33
+ * https://prettier.io/docs/en/options.html#quotes
34
+ */
35
+ singleQuote: true,
36
+
37
+ /**
38
+ * https://prettier.io/docs/en/options.html#quote-props
39
+ */
40
+ quoteProps: 'as-needed',
41
+
42
+ /**
43
+ * https://prettier.io/docs/en/options.html#end-of-line
44
+ */
45
+ endOfLine: 'lf',
46
+
47
+ /**
48
+ * https://prettier.io/docs/en/options.html#print-width
49
+ */
50
+ printWidth: 100,
51
+ };
@@ -0,0 +1,76 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as
6
+ contributors and maintainers pledge to making participation in our project and
7
+ our community a harassment-free experience for everyone, regardless of age, body
8
+ size, disability, ethnicity, sex characteristics, gender identity and expression,
9
+ level of experience, education, socio-economic status, nationality, personal
10
+ appearance, race, religion, or sexual identity and orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to creating a positive environment
15
+ include:
16
+
17
+ * Using welcoming and inclusive language
18
+ * Being respectful of differing viewpoints and experiences
19
+ * Gracefully accepting constructive criticism
20
+ * Focusing on what is best for the community
21
+ * Showing empathy towards other community members
22
+
23
+ Examples of unacceptable behavior by participants include:
24
+
25
+ * The use of sexualized language or imagery and unwelcome sexual attention or
26
+ advances
27
+ * Trolling, insulting/derogatory comments, and personal or political attacks
28
+ * Public or private harassment
29
+ * Publishing others' private information, such as a physical or electronic
30
+ address, without explicit permission
31
+ * Other conduct which could reasonably be considered inappropriate in a
32
+ professional setting
33
+
34
+ ## Our Responsibilities
35
+
36
+ Project maintainers are responsible for clarifying the standards of acceptable
37
+ behavior and are expected to take appropriate and fair corrective action in
38
+ response to any instances of unacceptable behavior.
39
+
40
+ Project maintainers have the right and responsibility to remove, edit, or
41
+ reject comments, commits, code, wiki edits, issues, and other contributions
42
+ that are not aligned to this Code of Conduct, or to ban temporarily or
43
+ permanently any contributor for other behaviors that they deem inappropriate,
44
+ threatening, offensive, or harmful.
45
+
46
+ ## Scope
47
+
48
+ This Code of Conduct applies both within project spaces and in public spaces
49
+ when an individual is representing the project or its community. Examples of
50
+ representing a project or community include using an official project e-mail
51
+ address, posting via an official social media account, or acting as an appointed
52
+ representative at an online or offline event. Representation of a project may be
53
+ further defined and clarified by project maintainers.
54
+
55
+ ## Enforcement
56
+
57
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
+ reported by contacting the project team at jan@n8n.io. All
59
+ complaints will be reviewed and investigated and will result in a response that
60
+ is deemed necessary and appropriate to the circumstances. The project team is
61
+ obligated to maintain confidentiality with regard to the reporter of an incident.
62
+ Further details of specific enforcement policies may be posted separately.
63
+
64
+ Project maintainers who do not follow or enforce the Code of Conduct in good
65
+ faith may face temporary or permanent repercussions as determined by other
66
+ members of the project's leadership.
67
+
68
+ ## Attribution
69
+
70
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
+ available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
72
+
73
+ [homepage]: https://www.contributor-covenant.org
74
+
75
+ For answers to common questions about this code of conduct, see
76
+ https://www.contributor-covenant.org/faq
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 zblaze
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,270 @@
1
+ # n8n Signal Node
2
+
3
+ <div align="center">
4
+ <img src="https://raw.githubusercontent.com/n8n-io/n8n/master/assets/n8n-logo.png" alt="n8n" width="80" height="80" />
5
+ <img src="https://signal.org/assets/images/header/signal-logo.png" alt="Signal" width="80" height="80" />
6
+ </div>
7
+
8
+ <div align="center">
9
+ <h3>Custom n8n node for Signal messenger integration</h3>
10
+ <p>Send secure messages and automate Signal workflows with n8n</p>
11
+ </div>
12
+
13
+ ---
14
+
15
+ ## 📋 Table of Contents
16
+
17
+ - [Features](#-features)
18
+ - [Prerequisites](#-prerequisites)
19
+ - [Installation](#-installation)
20
+ - [Configuration](#-configuration)
21
+ - [Usage](#-usage)
22
+ - [Operations](#-operations)
23
+ - [Contributing](#-contributing)
24
+ - [Support the Developer](#-support-the-developer)
25
+ - [License](#-license)
26
+
27
+ ## 🚀 Features
28
+
29
+ - **Send Messages**: Send text messages to individuals or groups
30
+ - **Send Media**: Send images, files, and attachments
31
+ - **Group Management**: Manage Signal groups
32
+ - **Message Reception**: Trigger workflows based on incoming messages
33
+ - **Secure Communication**: Leverages Signal's end-to-end encryption
34
+ - **REST API Integration**: Uses signal-cli-rest-api for reliable communication
35
+ - **JSON-RPC Support**: Optimized for performance with JSON-RPC mode
36
+
37
+ ## 🛠 Prerequisites
38
+
39
+ Before using this n8n Signal node, you need to set up the Signal CLI REST API service:
40
+
41
+ ### 1. Signal CLI REST API Setup
42
+
43
+ Create a `docker-compose.yml` file with the following configuration:
44
+
45
+ ```yaml
46
+ version: '3'
47
+ services:
48
+ signal-cli-rest-api:
49
+ image: bbernhard/signal-cli-rest-api:latest # Or specific version, e.g., v0.10.5
50
+ container_name: signal-cli-rest-api
51
+ restart: unless-stopped # Auto-restart except manual stop
52
+ ports:
53
+ - "8085:8080" # Change 8085 to available port if needed (e.g., 8003:8080)
54
+ volumes:
55
+ - /mnt/your-pool/signal-data:/home/.local/share/signal-cli # Replace /mnt/your-pool with your dataset/pool in TrueNAS
56
+ # Additionally, for config: - /mnt/your-pool/signal-config:/etc/signal-cli-rest-api (if custom settings)
57
+ environment:
58
+ - MODE=json-rpc # Recommended for speed and resolves group reception issues
59
+ - AUTHENTICATION_API_TOKEN=your-secret-token # Optional, for basic auth (save this token for n8n credentials)
60
+ - MAX_DB_CONNECTIONS=10 # Optimize as needed
61
+ ```
62
+
63
+ ### 2. Signal Account Registration
64
+
65
+ 1. Start the Docker container:
66
+ ```bash
67
+ docker-compose up -d
68
+ ```
69
+
70
+ 2. Register your phone number:
71
+ ```bash
72
+ curl -X POST -H "Content-Type: application/json" \
73
+ -d '{"number": "+1234567890"}' \
74
+ http://localhost:8085/v1/register/+1234567890
75
+ ```
76
+
77
+ 3. Verify with the received SMS code:
78
+ ```bash
79
+ curl -X POST -H "Content-Type: application/json" \
80
+ -d '{"number": "+1234567890", "captcha": "signal-hcaptcha-token"}' \
81
+ http://localhost:8085/v1/register/+1234567890/verify/123456
82
+ ```
83
+
84
+ 4. **Alternative**: Link with existing Signal app using QR code:
85
+ ```
86
+ http://localhost:8085/v1/qrcodelink?device_name=n8n-signal
87
+ ```
88
+
89
+ ## 📦 Installation
90
+
91
+ ### Method 1: n8n Community Package Manager
92
+
93
+ 1. In your n8n instance, go to **Settings** → **Community Nodes**
94
+ 2. Click **Install a community node**
95
+ 3. Enter the package name: `n8n-nodes-signal`
96
+ 4. Click **Install**
97
+
98
+ ### Method 2: Manual Installation
99
+
100
+ 1. Navigate to your n8n installation directory
101
+ 2. Install the package:
102
+ ```bash
103
+ npm install n8n-nodes-signal
104
+ ```
105
+ 3. Restart n8n
106
+
107
+ ### Method 3: Development Setup
108
+
109
+ 1. Clone this repository:
110
+ ```bash
111
+ git clone https://github.com/your-username/n8n-nodes-signal.git
112
+ cd n8n-nodes-signal
113
+ ```
114
+
115
+ 2. Install dependencies:
116
+ ```bash
117
+ npm install
118
+ ```
119
+
120
+ 3. Build the node:
121
+ ```bash
122
+ npm run build
123
+ ```
124
+
125
+ 4. Link to your n8n installation:
126
+ ```bash
127
+ npm link
128
+ cd /path/to/n8n
129
+ npm link n8n-nodes-signal
130
+ ```
131
+
132
+ ## ⚙️ Configuration
133
+
134
+ ### Credentials Setup
135
+
136
+ 1. In n8n, create new credentials for **Signal API**
137
+ 2. Configure the following fields:
138
+ - **API URL**: `http://localhost:8085` (or your signal-cli-rest-api URL)
139
+ - **Phone Number**: Your registered Signal phone number (e.g., `+1234567890`)
140
+ - **API Token**: (Optional) The authentication token you set in docker-compose
141
+ - **Mode**: `json-rpc` (recommended for better performance)
142
+
143
+ ### Node Configuration
144
+
145
+ The Signal node supports multiple operations and can be configured through the n8n interface:
146
+
147
+ - **Operation**: Choose from Send Message, Send Media, Create Group, etc.
148
+ - **Recipient**: Phone number or group ID
149
+ - **Message**: Text content to send
150
+ - **Attachments**: Files to send with the message
151
+
152
+ ## 📚 Usage
153
+
154
+ ### Basic Message Sending
155
+
156
+ 1. Add the **Signal** node to your workflow
157
+ 2. Select **Send Message** operation
158
+ 3. Configure recipient and message content
159
+ 4. Connect your Signal credentials
160
+ 5. Execute the workflow
161
+
162
+ ### Receiving Messages (Trigger)
163
+
164
+ 1. Add the **Signal Trigger** node to start your workflow
165
+ 2. Configure the phone number to monitor
166
+ 3. Set up webhook or polling mechanism
167
+ 4. Connect subsequent nodes to process incoming messages
168
+
169
+ ## 🔧 Operations
170
+
171
+ ### Trigger Operations
172
+ - **Receive Message**: Receive text messages from Send text messages to contacts or groups
173
+
174
+ ### Send Operations
175
+ - **Send Message**: Send text messages to contacts or groups
176
+ - **Send Media**: Send images, documents, and other files
177
+ - **Send Reaction**: React to messages with emoji
178
+ - **Remove Reaction**: Remoce reaction from the message
179
+
180
+ ### Group Operations
181
+ - **Update Group**: Modify group name
182
+ - **List Groups**: Get all groups for the account
183
+
184
+ ### Debug Mode
185
+
186
+ Enable debug logging in your docker-compose.yml:
187
+
188
+ ```yaml
189
+ environment:
190
+ - MODE=json-rpc
191
+ - LOG_LEVEL=debug
192
+ - AUTHENTICATION_API_TOKEN=your-secret-token
193
+ ```
194
+
195
+ ### Health Check
196
+
197
+ Test your signal-cli-rest-api setup:
198
+
199
+ ```bash
200
+ # Health check
201
+ curl http://localhost:8085/v1/health
202
+
203
+ # List registered numbers
204
+ curl http://localhost:8085/v1/accounts
205
+ ```
206
+
207
+ ## 🤝 Contributing
208
+
209
+ We welcome contributions! Please follow these steps:
210
+
211
+ 1. **Fork** the repository
212
+ 2. **Create** a feature branch (`git checkout -b feature/amazing-feature`)
213
+ 3. **Commit** your changes (`git commit -m 'Add amazing feature'`)
214
+ 4. **Push** to the branch (`git push origin feature/amazing-feature`)
215
+ 5. **Open** a Pull Request
216
+
217
+ ### Development Guidelines
218
+
219
+ - Follow TypeScript best practices
220
+ - Add tests for new features
221
+ - Update documentation
222
+ - Follow n8n node development standards
223
+ - Ensure compatibility with latest n8n version
224
+
225
+ ### Code Style
226
+
227
+ ```bash
228
+ # Run linter
229
+ npm run lint
230
+
231
+ # Run tests
232
+ npm run test
233
+
234
+ # Build for production
235
+ npm run build
236
+ ```
237
+
238
+ ## 💖 Support the Developer
239
+
240
+ If you find this node helpful, consider supporting the developer:
241
+
242
+ [![Ko-Fi](https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/zblaze)
243
+
244
+ [![Coinbase Commerce](https://img.shields.io/badge/Coinbase-0052FF?style=for-the-badge&logo=Coinbase&logoColor=white)](https://commerce.coinbase.com/pay/144f37a1-7d1e-468c-979d-1c8c9bcfa14b)
245
+
246
+ **Donation Links:**
247
+ - ☕ [Ko-fi](https://ko-fi.com/zblaze) - Support with coffee
248
+ - 💰 [Coinbase Commerce](https://commerce.coinbase.com/pay/144f37a1-7d1e-468c-979d-1c8c9bcfa14b) - Cryptocurrency donations
249
+
250
+ Your support helps maintain and improve this project! 🙏
251
+
252
+ ## 📄 License
253
+
254
+ This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) file for details.
255
+
256
+ ## 🔗 Related Links
257
+
258
+ - [n8n Documentation](https://docs.n8n.io/)
259
+ - [Signal CLI REST API](https://github.com/bbernhard/signal-cli-rest-api)
260
+ - [Signal Messenger](https://signal.org/)
261
+ - [n8n Community](https://community.n8n.io/)
262
+
263
+ ---
264
+
265
+ <div align="center">
266
+ <p>Made with ❤️ for the n8n community</p>
267
+ <p>
268
+ <a href="#-table-of-contents">Back to top</a>
269
+ </p>
270
+ </div>
@@ -0,0 +1 @@
1
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 122.88 122.31"><defs><style>.cls-1{fill:#4c83f2;fill-rule:evenodd;}.cls-2{fill:#fff;}</style></defs><title>signal-app</title><path class="cls-1" d="M27.75,0H95.13a27.83,27.83,0,0,1,27.75,27.75V94.57a27.83,27.83,0,0,1-27.75,27.74H27.75A27.83,27.83,0,0,1,0,94.57V27.75A27.83,27.83,0,0,1,27.75,0Z"/><path class="cls-2" d="M61.44,25.39A35.76,35.76,0,0,0,31.18,80.18L27.74,94.86l14.67-3.44a35.77,35.77,0,1,0,19-66ZM41,95.47,35.1,96.85l.94,4,4.35-1a43.36,43.36,0,0,0,10.46,4l1-4A40,40,0,0,1,41,95.45l0,0ZM21.76,86.53l4,.93,1.37-5.91a39.6,39.6,0,0,1-4.43-10.82l-4,1a44.23,44.23,0,0,0,4.06,10.46l-1,4.35Zm9.68,11.15-8.52,2,2-8.52-4-.93-2,8.51a4.12,4.12,0,0,0,3.08,5,4,4,0,0,0,1.88,0l8.52-2-.94-4.06Zm24-76a40.56,40.56,0,0,1,12,0L68,17.63a44.25,44.25,0,0,0-13.2,0l.63,4.07ZM99.14,38.4l-3.53,2.12a39.89,39.89,0,0,1,4.57,11l4-1a43.75,43.75,0,0,0-5-12.18Zm-69.81-.91A40.29,40.29,0,0,1,37.78,29l-2.47-3.32A43.62,43.62,0,0,0,26,35l3.32,2.47ZM85.1,29a40.11,40.11,0,0,1,8.46,8.45L96.88,35a43.62,43.62,0,0,0-9.3-9.3L85.1,29Zm8.46,55.78a40.11,40.11,0,0,1-8.46,8.45l2.45,3.32a44,44,0,0,0,9.33-9.3l-3.32-2.47ZM67.42,100.6a39.89,39.89,0,0,1-12,0l-.62,4.09a44.18,44.18,0,0,0,13.19,0l-.62-4.09Zm36.76-28.88-4-1A40,40,0,0,1,95.6,81.8l3.53,2.12a43.72,43.72,0,0,0,5.05-12.2Zm-2.84-10.57a39.93,39.93,0,0,1-.45,6l4.07.62a44.18,44.18,0,0,0,0-13.19l-4.07.62a39.8,39.8,0,0,1,.45,6ZM84.2,98.85l-2.12-3.53a39.89,39.89,0,0,1-11,4.57l1,4a43.75,43.75,0,0,0,12.18-5ZM21.55,61.15a41.15,41.15,0,0,1,.44-6l-4.07-.62a44.18,44.18,0,0,0,0,13.19L22,67.13a41.28,41.28,0,0,1-.44-6Zm2.2-22.75A43.83,43.83,0,0,0,18.7,50.59l4,1a40.08,40.08,0,0,1,4.57-11.06L23.75,38.4ZM72,18.41l-1,4A40.08,40.08,0,0,1,82.08,27l2.13-3.53A44,44,0,0,0,72,18.41Zm-21.13,0,1,4A40.08,40.08,0,0,0,40.8,27l-2.12-3.53a44,44,0,0,1,12.2-5.05Z"/></svg>
package/index.js ADDED
File without changes
@@ -0,0 +1 @@
1
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 122.88 122.31"><defs><style>.cls-1{fill:#4c83f2;fill-rule:evenodd;}.cls-2{fill:#fff;}</style></defs><title>signal-app</title><path class="cls-1" d="M27.75,0H95.13a27.83,27.83,0,0,1,27.75,27.75V94.57a27.83,27.83,0,0,1-27.75,27.74H27.75A27.83,27.83,0,0,1,0,94.57V27.75A27.83,27.83,0,0,1,27.75,0Z"/><path class="cls-2" d="M61.44,25.39A35.76,35.76,0,0,0,31.18,80.18L27.74,94.86l14.67-3.44a35.77,35.77,0,1,0,19-66ZM41,95.47,35.1,96.85l.94,4,4.35-1a43.36,43.36,0,0,0,10.46,4l1-4A40,40,0,0,1,41,95.45l0,0ZM21.76,86.53l4,.93,1.37-5.91a39.6,39.6,0,0,1-4.43-10.82l-4,1a44.23,44.23,0,0,0,4.06,10.46l-1,4.35Zm9.68,11.15-8.52,2,2-8.52-4-.93-2,8.51a4.12,4.12,0,0,0,3.08,5,4,4,0,0,0,1.88,0l8.52-2-.94-4.06Zm24-76a40.56,40.56,0,0,1,12,0L68,17.63a44.25,44.25,0,0,0-13.2,0l.63,4.07ZM99.14,38.4l-3.53,2.12a39.89,39.89,0,0,1,4.57,11l4-1a43.75,43.75,0,0,0-5-12.18Zm-69.81-.91A40.29,40.29,0,0,1,37.78,29l-2.47-3.32A43.62,43.62,0,0,0,26,35l3.32,2.47ZM85.1,29a40.11,40.11,0,0,1,8.46,8.45L96.88,35a43.62,43.62,0,0,0-9.3-9.3L85.1,29Zm8.46,55.78a40.11,40.11,0,0,1-8.46,8.45l2.45,3.32a44,44,0,0,0,9.33-9.3l-3.32-2.47ZM67.42,100.6a39.89,39.89,0,0,1-12,0l-.62,4.09a44.18,44.18,0,0,0,13.19,0l-.62-4.09Zm36.76-28.88-4-1A40,40,0,0,1,95.6,81.8l3.53,2.12a43.72,43.72,0,0,0,5.05-12.2Zm-2.84-10.57a39.93,39.93,0,0,1-.45,6l4.07.62a44.18,44.18,0,0,0,0-13.19l-4.07.62a39.8,39.8,0,0,1,.45,6ZM84.2,98.85l-2.12-3.53a39.89,39.89,0,0,1-11,4.57l1,4a43.75,43.75,0,0,0,12.18-5ZM21.55,61.15a41.15,41.15,0,0,1,.44-6l-4.07-.62a44.18,44.18,0,0,0,0,13.19L22,67.13a41.28,41.28,0,0,1-.44-6Zm2.2-22.75A43.83,43.83,0,0,0,18.7,50.59l4,1a40.08,40.08,0,0,1,4.57-11.06L23.75,38.4ZM72,18.41l-1,4A40.08,40.08,0,0,1,82.08,27l2.13-3.53A44,44,0,0,0,72,18.41Zm-21.13,0,1,4A40.08,40.08,0,0,0,40.8,27l-2.12-3.53a44,44,0,0,1,12.2-5.05Z"/></svg>
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "n8n-nodes-signal-cli-rest-api",
3
+ "version": "0.2.0",
4
+ "description": "Signal Node for n8n",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/ZBlaZe/n8n-nodes-signal.git"
8
+ },
9
+ "keywords": ["n8n-community", "signal", "messaging"],
10
+ "license": "MIT",
11
+ "main": "index.js",
12
+ "scripts": {
13
+ "build": "tsc && copy nodes\\Signal\\signal.svg dist\\nodes\\Signal\\signal.svg && copy credentials\\signal.svg dist\\credentials\\signal.svg",
14
+ "dev": "tsc --watch"
15
+ },
16
+ "n8n": {
17
+ "n8nNodesApiVersion": 1,
18
+ "nodes": [
19
+ "./dist/nodes/Signal/Signal.node.js",
20
+ "./dist/nodes/Signal/SignalTrigger.node.js"
21
+ ],
22
+ "credentials": ["./dist/credentials/SignalApi.credentials.js"]
23
+ },
24
+ "dependencies": {
25
+ "axios": "1.7.2",
26
+ "n8n-core": "1.111.0",
27
+ "n8n-workflow": "1.109.0",
28
+ "@types/node": "20.12.12",
29
+ "ws": "^8.18.0"
30
+ },
31
+ "devDependencies": {
32
+ "typescript": "5.4.5",
33
+ "ts-node": "10.9.2",
34
+ "@types/ws": "^8.5.12"
35
+ }
36
+ }