Encrypted, anonymous CLI chat backed by Firebase Realtime Database.
Messages are encrypted end-to-end with AES-256-GCM (key derived from the room ID, random nonce per message). No account required — just pick a username on first run.
Grab the latest JAR from the Releases page and run it — no installation, no config:
java -jar bluelink-1.0.0.jarRequires Java 17+ only.
| Tool | Version |
|---|---|
| Java | 17+ |
| Maven | 3.8+ (build only) |
Anyone who has the JAR can chat — no extra setup needed. The Firebase credentials and database URL are bundled inside at build time.
Copy your Firebase service-account JSON to:
src/main/resources/firebase-credentials.json
This file is in
.gitignore— it will never be committed.
Edit src/main/resources/bluelink.properties:
firebase.database.url=https://<your-project-id>-default-rtdb.firebaseio.commvn package -qThis produces target/bluelink-1.0.0.jar — a self-contained fat JAR with everything bundled in.
Send target/bluelink-1.0.0.jar to anyone. They only need Java 17+:
java -jar bluelink-1.0.0.jar# Create a new room (prints the room ID — share it with friends)
java -jar bluelink-1.0.0.jar
# Join an existing room
java -jar bluelink-1.0.0.jar <room-id>On first run you will be prompted for a display name. Your identity is saved to ~/.bluelink/config.json — completely local, nothing sent to any server.
| Command | Description |
|---|---|
/help |
Show available commands |
/clear |
Clear the screen |
/exit |
Leave the room and quit |
Ctrl+C |
Graceful disconnect |
- Each room has an 8-digit numeric ID — share it out-of-band with whoever you want to chat with.
- Messages are encrypted with AES-256-GCM before being written to Firebase. The server never sees plaintext.
- The encryption key is derived from the room ID — only people who know the room ID can decrypt messages.
- User identity (ID, display name, color) is stored locally in
~/.bluelink/config.json— no accounts, no sign-up.
src/main/
├── java/io/github/vrushankpatel/bluelink/
│ ├── Main.java # Entry point, argument parsing
│ ├── ChatSession.java # Input loop + message polling
│ ├── config/
│ │ └── UserConfig.java # Local identity persistence
│ └── firebase/
│ ├── FirebaseClient.java # All Firebase Realtime DB operations
│ ├── Crypto.java # AES-256-GCM encrypt/decrypt
│ ├── Message.java # Message model
│ └── Participant.java # Participant model
└── resources/
├── firebase-credentials.json # ← add before building (gitignored)
└── bluelink.properties # ← set firebase.database.url here