NolandAI 🐙🚢
NolandAI is an AI-powered Solana trading agent that combines on-chain analytics, social sentiment scraping, and a fine-tuned LLM to generate actionable trading calls. It ships as an npm SDK plus a FastAPI backend and a React/Next.js UI.
🔦 Highlights
- Real-time market feeds via Dexscreener.
- Social scraping (AssetDash, X/Twitter monitoring such as
@mobyagent,@whalewatch). - LLM forecasting using a LoRA-fine-tuned model (
fingpt-forecaster_dow30_llama2-7b_loraon Hugging Face). - Automated trading calls (hourly), plus optional auto-posting to X/Twitter.
- Modular SDK (
nolandainpm package) for JS/TS integration. - Production CI with release workflow and npm publish.
📦 Installation
From npm (recommended)
npm install nolandai
ts
Copy code
import { NolandAI } from "nolandai";
const bot = new NolandAI({ apiKey: process.env.NOLAND_KEY });
const call = await bot.getTradingCall();
console.log(call);
From source (dev)
bash
Copy code
git clone https://github.com/your-username/NolandAI.git
cd NolandAI
npm install # frontend/sdk
pip install -r requirements.txt # if running python FastAPI backend
🧩 Repository layout (recommended)
pgsql
Copy code
NolandAI/
├─ package.json
├─ index.js
├─ index.d.ts
├─ README.md
├─ LICENSE
├─ CHANGELOG.md
├─ CONTRIBUTING.md
├─ .github/
│ └─ workflows/ci.yml
├─ backend/
│ ├─ requirements.txt
│ └─ main.py # FastAPI app (endpoints: /trading-call, /market-data/:token)
├─ frontend/
│ └─ (Next.js app)
└─ examples/
└─ demo.js
⚙️ Quickstart — Local dev (SDK + demo backend)
Start FastAPI backend (example):
bash
Copy code
# in backend/
uvicorn main:app --reload --port 8000
Test SDK locally:
bash
Copy code
# from repo root or examples/
node examples/demo.js
📚 API (SDK)
new NolandAI(config?: { apiKey?: string; baseUrl?: string })
getTradingCall() → { token, action, confidence, reason }
getMarketData(tokenAddress: string) → market JSON from backend
🧪 Example examples/demo.js
(see examples/demo.js file in repo — quick show of getTradingCall + getMarketData)
📦 Publish & Releases
We publish releases using semantic version tags (vMAJOR.MINOR.PATCH) and CI that validates tests and publishes to npm on tag push. See .github/workflows/ci.yml.
Official release example:
v1.0.0 — Captain’s Log (2025-09-20)
Initial public release.
npm package nolandai published.
FastAPI endpoints /trading-call, /market-data/:token live.
Hugging Face model integration.
🏛️ Contributing
See CONTRIBUTING.md. Pull requests welcome — use branches, add tests, sign commits.
⚖️ License
MIT © 2025 AuroraRift
Maintainers
AuroraRift Team — team@aurorarift.io
Changelog
See CHANGELOG.md for full release history.
pgsql
Copy code
---
# 2) Files to create (copy these into repo root exactly)
Below are the key files. Put them where indicated.
## `package.json` (repo root)
```json
{
"name": "nolandai",
"version": "1.0.0",
"description": "NolandAI - An AI-powered Solana trading agent for market intelligence, social scraping, and automated trading calls.",
"main": "index.js",
"types": "index.d.ts",
"type": "module",
"scripts": {
"build": "tsc",
"test": "node test.js || echo \"no tests\"",
"lint": "eslint ."
},
"repository": {
"type": "git",
"url": "https://github.com/your-username/NolandAI.git"
},
"keywords": [
"AI",
"trading",
"Solana",
"crypto",
"blockchain",
"LLM",
"bot",
"Dexscreener",
"NolandAI",
"AuroraRift"
],
"author": "AuroraRift Team <team@aurorarift.io>",
"license": "MIT",
"bugs": {
"url": "https://github.com/your-username/NolandAI/issues"
},
"homepage": "https://huggingface.co/your-username/NolandAI",
"engines": {
"node": ">=18"
},
"dependencies": {
"axios": "^1.7.0",
"dotenv": "^16.3.1"
},
"devDependencies": {
"eslint": "^8.56.0",
"typescript": "^5.4.0"
}
}
index.js (repo root)
js
Copy code
import axios from "axios";
import dotenv from "dotenv";
dotenv.config();
export class NolandAI {
constructor(config = {}) {
this.apiKey = config.apiKey || process.env.NOLAND_KEY || "";
this.baseUrl = config.baseUrl || "http://localhost:8000"; // FastAPI default
}
async getTradingCall() {
const res = await axios.get(`${this.baseUrl}/trading-call`, {
headers: this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}
});
return res.data;
}
async getMarketData(tokenAddress) {
const res = await axios.get(`${this.baseUrl}/market-data/${tokenAddress}`);
return res.data;
}
}
export default NolandAI;