Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Alex71btc/GroundControl

Repository files navigation

GroundControl – Self-Hosted Fork

This is a fork of BlueWallet GroundControl focused on full self-hosting, privacy and independence from upstream infrastructure.

It is designed to be used together with a forked BlueWallet Android app.


Features

  • Self-hosted push notifications (Firebase FCM)
  • No dependency on BlueWallet backend
  • Separate push notifications for:
    • unconfirmed transaction
    • address paid
    • transaction confirmed
  • Automatic cleanup of invalid / uninstalled push tokens
  • Works with custom Bitcoin Core / Electrum backends

Related Project

Android App (BlueWallet fork):
πŸ‘‰ https://github.com/Alex71btc/bluewallet-gc


GroundControl Server & Documentation

The repository contains full documentation on how to build, configure and run your own GroundControl instance, including:

  • Installation & build instructions
  • Environment variables
  • Database setup
  • Firebase service account (server-side FCM)
  • Push notification flow
  • Token lifecycle & cleanup

πŸ“– Start here:
https://github.com/Alex71btc/GroundControl/tree/master/docs

The documentation is intentionally kept in the server repository to clearly separate app-side and server-side responsibilities.

Quick Start

git clone https://github.com/Alex71btc/GroundControl.git
cd GroundControl
npm install
cp .env.example .env
# Ground Control

///::---...... ``````````````````````````````````````............... ::::---..... .-.--```..```````````````````````````````............. :::---....````````````````````````.-.``--```.///////:/+/:/---....``````````````````````............. ::---....``````````````````````````://::/:..//////////+++++++++++:--..``````````````````............ :---...````````````````````````.///////////////////////+++++++++++ooo+:-```````````````````......... ---...``````````````````````.-////////////////////////+//+++++++++oooo/-.```````````````````........ --...````````````````````.-////////////////////////////+/++++++++oooooo++/.````````````````````..... -...````````````````````-:/+//////////////////////////+++++++++++oooooooooo:````````````````````.... ...````````````````````:++++///////////////////////////++++++++++ooooooooooo+-```````````````````... ..```````````````````-/+++++//////////////////////////+++++++++++ooooooooooooo:````````````````````. .``````````````````./+++++++//////////////////////////+++++++++++oooooooooooooo/```````````````````` .`````````````````./+++++++++++////////////////////////+++++++++++oooooooooooooo.``````````````````. ``````````````````.+++++++++++/////////////////////////++++++++++++ooooooooooooo-``````````````````` ```````````````````-++++++++++//////////////////////////++++++++++++oooooooooooo/``````````````````` ````````````````````/++++//++//////////////////////////////://++/-++oooooooooooo:``````````````````` ````````````````````-/+//////////////////////////////////:-.../..++oooooooooooo- `````````````````````//+///////////::::::::::://///////////-.`````/++ooooooooooo: `:////////:-.````````````.://////////+++///:-``-://+oooooooo:``````````````````` -/////:. `-////////////+++++:-``````:+oooooooo-``````````````````` ``````````````````` :++/: -//////////////++/:.````````.+oooooooo.``````````````````` ```````````````````` .++/. .:////////////////-`` ```````.++ooooo+```````````````````` `````````````````````.++/ -///////////////:. -+ooooo/```````````````````` `````````````````````.++: `://////////////:.` /++ooo: `````````````````````.++- `://///////////-.` ```````-+++oo- -++. `/////////////:` ```````.+++oo.```````````````````` :++. :////////////. ```````+++oo.```````````````````` `````````````````````/o+.`` `--:////////:``.--.```````` ```````++++o-```````````````````` `````````````````````/oo.``` `...:-::.-://///-://-``--:::://:-.` ````````++++o:```````````````````` `````````````````````/oo-`````.-``-.-:```://////-` `.`````--:/:::. ``````.++++o-```````````````````` `````````````````````:oo:``````---.--.-:://///:` `````----:-` ``````-+++++````````````````````` `````````````````````:oo+```````:++/:-://////-` ``...-.`` ``````/+++++.```````````````````` ``````````````````````:+o-`````:+/-``-//////. ```````+++++/````````````````````` ```````````````````````:+/-:.-++++//. .//+/+:````````````````````` ````````````````````````.+:````````-+++++:` `````````.::`````````````````````` `````````````````````````.:..++++/- `````````````/.`````````````````````` ```````````````````````````:``````/+++/. .. .:. ````````````````:/``````````````````````` ```````````````````````````/`````.+++: ``` `````````````````.:+-``````````````````````` ```````````````````````````/-````/++-``` ````````````````-//++++```````````````````````` ```````````````````````````/-````+o:```` `````````````````.++++++/```````````````````````` ```````````````````````````/:```.++```````.--.../+o++++:```````````````````````` ```````````````````````````//```.o:````.://///:::/:::-.````````````-+++++++/```````````````````````` ```````````````````````````+o-``-o-````..``.......````````````````-/+ooooo++```````````````````````` ``````````````````````````-oo+.`:o.`````....`````````````````````::.+ooooo++.``````````````````````` `````````````````````````.+ooo+.:+.`````````......`````````````.:-``+ooooo+:-``````````````````````` `````````````````````````/ooooo-/+````````````````````````````--```.+oooooo/```````````````````````` ````````````````````````/oooooo./+`````````````````````````````````.oooooo/+```````````````````````` ```````````````````````:ooo++o+`/+`````````````````````````````````.oooo+/:````````````````````````` ``````````````````````.:+/:-//-`++`````````````````````````````````.oooo-`.````````````````````````` ....````````````````````````.```+/``````````````````````````````````+oo:```````````````````````````` .....``````````````````````````.+/``````````````````````````````````:+-````````````````````````````` ......`````````````````````````.+:````````````````````````````````````````````````````````````````.. .........``````````````````````-+:``````````````````````````````````````````````````````````````.... ...........````````````````````-o-`````````````````````````````````````````````````````````````..... .............:o-```````````````````````````````````````````````````````````....... ...............````````````````:o-`````````````````````````````````````````````````````````......... ................```````````````/o.```````````````````````````````````````````````````````........... ......................```````/+.``````````````````````````````````````````````````.`.............. ...........................````:/``````````````````````````````````````........................... .............................`.//````````````````````````````````````............................... ----..........................`..``````````````````````````````.....................................


## Can you hear me, Major Tom?
Push notifications server for bitcoin wallets. Processes blocks & mempool in search of subscribed onchain addresses.
Built with typescript, expressjs, mariadb & [openapi](https://editor.swagger.io/?url=https://raw.githubusercontent.com/BlueWallet/GroundControl/master/openapi.yaml).
In memory of David Bowie
### Installation
```shell script
npm i
npm start
npm run worker-blockprocessor
npm run worker-processmempool
npm run worker-sender
```
Works well on Heroku (you'll need `JawsDB Maria` addon)
### Environment variables
Set them as env variables or put them into `.env` file in project root dir.
- `JAWSDB_MARIA_URL` for example `mysql://username:password@host:port/database`
- ~~`FCM_SERVER_KEY` hex encoded~~ deprecated (in favor of json key file) after FCM XMPP and HTTP legacy APIs was deprecated; the new one is HTTP v1 API; theres also a new uri to post payload
- `APNS_P8` hex encoded
- `APNS_P8_KID` issuer key which is "key ID" of your p8 file
- `APPLE_TEAM_ID` "team ID" of your developer account
- `BITCOIN_RPC` for example `http://username:password@host:8332`
- `APNS_TOPIC` for example `io.bluewallet.bluewallet`
- `GOOGLE_KEY_FILE` - json file with Google key for FCM, in hex
- `GOOGLE_PROJECT_ID` - acquired with the key file
### Getting certificates
- outdated https://dev.to/jakubkoci/react-native-push-notifications-313i
- https://stackoverflow.com/questions/44631803/ios-swift-how-to-create-p8-file/67533665#67533665
- get P8 hex `xxd -p file.p8 | tr -d '\n'` (google key file as well)
- https://firebase.google.com/docs/cloud-messaging/migrate-v1
### License
MIT

About

running my own instance of ground control for more privacy

Resources

Stars

Watchers

Forks

Packages

Contributors

Languages

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /