| --- |
| license: mit |
| language: |
| - multilingual |
| tags: |
| - nostr |
| - spam-classification |
| - text-classification |
| - on-device |
| library_name: lightgbm |
| --- |
| |
| # nspam — on-device Nostr reply-spam classifier |
|
|
| Scores bundles of Nostr `kind:1` **reply** notes from a single author as |
| `real` or `bot`. Designed for mobile clients (Kotlin / Swift / JS). |
|
|
| - **Model type:** LightGBM gradient boosted trees over hashed character + word n-grams and |
| structural features. |
| - **Input:** 1–10 recent reply notes (events with `e` tags) from one pubkey. |
| - **Output:** calibrated probability ∈ [0, 1] that the author is a |
| reply-spammer. |
| - **Runtime:** LightGBM4j (JNI) or ONNX Runtime on device. |
|
|
| ## Intended use |
|
|
| Client-side filtering/ranking of replies in Nostr apps. Use the score to |
| deprioritize or hide likely spam replies. Combine with user mutes and follow |
| graph rather than hard-blocking on a single score. |
|
|
| ## Holdout metrics (v2.2) |
|
|
| | metric | value | |
| |---|---| |
| | average precision | 0.9666 | |
| | ROC AUC | 0.9800 | |
| | precision @ recall 0.9 | 0.9270 | |
| | per-author accuracy | 0.8780 | |
|
|
| ## Limitations |
|
|
| - **Reply-focused.** Trained on reply notes only — not designed for scoring |
| feed posts or other event kinds. |
| - **English-heavy training data.** Non-Latin scripts underrepresented. |
| - **Adversarial drift.** Spammers evolve. Retrain periodically. |
| - **Cold start.** Accounts with <3 replies have limited signal. |
|
|
| ## License |
|
|
| MIT. |
|
|