Baike.dev
All toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
C

chanify

> DevOps
Open source

Chanify is a safe and simple notification tools. This repository is command line tools for Chanify.

1.3K stars0 likes0 views
WebsiteGitHub

About

Chanify is a safe and simple notification tools. This repository is command line tools for Chanify.

Chanify

English | 简体中文

Chanify is a safe and simple notification tools. For developers, system administrators, and everyone can push notifications with API.

Table of Contents

Features

Getting Started

    Installation

Precompiled binary

Docker

From source

    Usage

As Sender Client

As Serverless node

As Serverful node

Add New Node

            Send message

Command Line

Python 3

Ruby

NodeJS

PHP

    HTTP API

Send Text

Send Link

Send Image

Send Audio

Send File

Send Actions

Configuration

    Security

Setting Registrable

Token Lifetime

Chrome Extension

Windows Client

Docker Compose

Lua API

Contributing

License

Features

Chanify is include these features:

  • Customize channel for notifications.
  • Deploy your own node server.
  • Distributed architecture design.
  • Design for privacy protection.
  • Support text/image/audio/file message format.

Getting Started

  1. Install iOS App(1.0.0 version and above) or macOS App(1.3.0 version and above).
  2. Get send token, more detail.
  3. Send message.

Installation

Precompiled binary

Download precompiled binary from here.

Docker

bash
$ docker pull wizjin/chanify:latest

From source

bash
$ git clone https://github.com/chanify/chanify.git
$ cd chanify
$ make install

Usage

As Sender Client

Use chanify to send message.

bash
# Text message
$ chanify send --endpoint=http://: --token= --text=

# URL message
$ chanify send --endpoint=http://: --token= --link=

# Image message
$ chanify send --endpoint=http://: --token= --image=

# Audio message
$ chanify send --endpoint=http://: --token= --audio=

# File message
$ chanify send --endpoint=http://: --token= --file= --text=

# Action  message
$ chanify send --endpoint=http://: --token= --text= --title= --action="|"

# Timeline message
$ chanify send --endpoint=http://: --token= --timeline.code= = = ...

endpoint default value is https://api.chanify.net, and notification will send by default server. If you have own node server, please set endpoint to your node server url.

As Serverless node

Chanify run in stateless mode, no device token will be stored in node.

All device token will be stored in api.chanify.net.

Message will send to apple apns server by api.chanify.net.

Send message workflow:

Start => node server => api.chanify.net => Apple server => iOS client
bash
# Start chanify
$ chanify serve --host= --port= --secret= --name= --endpoint=http://:

# Docker
$ docker run -it wizjin/chanify:latest serve --secret= --name= --endpoint=http://:

As Serverful node

Chanify run in stateful mode, device token will be stored in node.

Message will send to apple apns server direct.

Send message workflow:

Start => node server => Apple server => iOS client

Start server

bash
# Start chanify
$ chanify serve --host= --port= --name= --datapath=~/.chanify --endpoint=http://:

# Docker
$ docker run -it -v /my/data:/root/.chanify wizjin/chanify:latest serve --name= --endpoint=http://:

Use MySQL as a backend

bash
--dburl=mysql://:@tcp(:)/?charset=utf8mb4&parseTime=true&loc=Local

Chanify will not create database.

Add New Node

  • Start node server
  • iOS client can scan QRCode(http://:/) to add node.

Send message

Command Line

bash
# Text message
$ curl --form-string "text=hello" "http://:/v1/sender/"

# Text file
$ cat message.txt | curl -H "Content-Type: text/plain" --data-binary @- "http://:/v1/sender/"

Python 3

python
from urllib import request, parse

data = parse.urlencode({ 'text': 'hello' }).encode()
req = request.Request("http://:/v1/sender/", data=data)
request.urlopen(req)

Ruby

ruby
require 'net/http'

uri = URI('http://:/v1/sender/')
res = Net::HTTP.post_form(uri, 'text' => 'hello')
puts res.body

NodeJS

javascript
const https = require('https')
const querystring = require('querystring');

const data = querystring.stringify({ text: 'hello' })
const options = {
    hostname: ':',
    port: 80,
    path: '/v1/sender/',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': data.length
        }
    }
    var req = https.request(options, (res) => {
    res.on('data', (d) => {
        process.stdout.write(d);
    });
});  
req.write(data);
req.end();

PHP

php
$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL           => 'http://:/v1/sender/',
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS    => [ 'text' => 'hello' ],
]);

$response = curl_exec($curl);

curl_close($curl);
echo $response;

HTTP API

Send Text

  • GET
url
http://:/v1/sender//
  • POST
url
http://:/v1/sender/

Content-Type:

  • text/plain: Body is text message
  • multipart/form-data: The block of data("text") is text message
  • application/x-www-form-urlencoded: text=
  • application/json; charset=utf-8: The fields are optional
json
{
    "token": "",
    "title": "",
    "text": "",
    "copy": "",
    "autocopy": 1,
    "sound": 1,
    "priority": 10,
    "interruptionlevel": 0,
    "actions": [
        "ActionName1|http:///",
        "ActionName2|http:///",
        ...
    ],
    "timeline": {
        "code": "",
        "timestamp": 1620000000000,
        "items": {
            "key1": "value1",
            "key2": "value2",
            ...
        }
    }
}

Additional params

Key Default Description
title None The title for notification message.
copy None The copy text for text notification.
autocopy 0 Enable autocopy text for text notification.
sound 0 1 enable sound, otherwise disable sound.
priority 10 10 normal, 5 lower level.
interruption-level active Interruption level for timing of a notification.
actions None Actions list.
timeline None Timeline object.

sound:

  • 1 enable default sound
  • sound code, e.g. "bell"

interruption-level:

  • active: Lights up screen and may play a sound.
  • passive: Does not light up screen or play sound.
  • time-sensitive: Lights up screen and may play a sound; May be presented during Do Not Disturb.

timestamp in milliseconds (timezone - UTC)

E.g.

url
http://:/v1/sender/?sound=1&priority=10&title=hello&copy=123&autocopy=1

Overwrite Content-Type

url
http://:/v1/sender/?content-type=

Send Link

bash
$ curl --form "link=@" "http://:/v1/sender/"
json
{
    "link": "",
    "sound": 1,
    "priority": 10,
}

Send Image

Send image only support POST method used serverful node.

  • Content-Type: image/png OR image/jpeg
bash
cat  | curl -H "Content-Type: image/jpeg" --data-binary @- "http://:/v1/sender/"
  • Content-Type: multipart/form-data
bash
$ curl --form "image=@" "http://:/v1/sender/"

Send Audio

Send mp3 audio only support POST method used serverful node.

  • Content-Type: audio/mpeg
bash
cat  | curl -H "Content-Type: audio/mpeg" --data-binary @- "http://:/v1/sender/"
  • Content-Type: multipart/form-data
bash
$ curl --form "audio=@" "http://:/v1/sender/"

Send File

Send file only support POST method used serverful node.

  • Content-Type: multipart/form-data
bash
$ curl --form "file=@" "http://:/v1/sender/"

Send Actions

Send Actions (Up to 4 actions).

  • Content-Type: multipart/form-data
bash
$ curl --form "action=ActionName1|http:///" "http://:/v1/sender/"

URL for script action:

bash
chanify://action/run-script/?=&=

Configuration

Chanify can be configured with a yml format file, and the default path is ~/.chanify.yml.

…

Security

Setting Registrable

Node server can be disabled user registration and become a private server.

bash
chanify serve --registerable=false --whitelist=,
  • --registerable=false: used to disable user registration
  • whitelist: list users can be add into node server

Token Lifetime

  • Token lifetime is about 90 days (default).
  • Can configurable token lifetime (1 day ~ 5 years) in channel detail page.

If your token is leaked, add leaked token into the blocklist (iOS client settings).

Note: Please protect your token from leakage. The blockist need trusted node server (1.1.9 version and above).

Chrome Extension

Download the extension from Chrome web store.

Extension features:

  • Send select text/image/audio/url message to Chanify
  • Send page url to Chanify

Windows Client

Get the Windows Client from here.

Windows Client features:

  • Support Chanify to the Windows Send To Menu.
  • Support send message with CLI.

Docker Compose

  1. Install docker compose.
  2. Edit configuration file (docker-compose.yml).
  3. Start docker compose: docker-compose up -d

docker-compose.yml:

yaml
version: "3"
services:
    web:
        image: nginx:alpine
        restart: always
        volumes:
            - /nginx.conf:/etc/nginx/nginx.conf
            - /ssl:/ssl
        ports:
            - 80:80
            - 443:443
    chanify:
        image: wizjin/chanify:dev
        restart: always
        volumes:
            - /data:/data
            - /chanify.yml:/root/.chanify.yml
Key Description
workdir Work directory for node server.

/nginx.conf:

…
Key Description
hostname or ip Internet hostname or ip for node server.
ssl key SSL key file for node server.

/chanify.yml:

yaml
server:
    endpoint: https://
    host: 0.0.0.0
    port: 80
    name: 
    datapath: /data
    register:
        enable: false
        whitelist: # whitelist    
            - 
Key Description
hostname or ip Internet hostname or ip for node server.
node name Name for node server.
user id User ids for whitelist.

Lua API

Usage

…

Example: Github webhook event

Contributing

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.

  1. Fork the Project
  2. Change to dev Branch (git checkout dev)
  3. Create your Feature Branch (`git checkout -b

Issues· 0 open

View all issuesOpen on GitHub

No open issues yet, or sync has not completed.

> Tags

Goanonymousapnsdockerdocker-image

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
CategoryDevOps
PricingOpen source

> Related tools

D
Docker
容器化平台,标准化应用交付
G
GitHub Actions
GitHub 原生 CI/CD 工作流
N
Nginx
高性能 Web 服务器与反向代理