Skip to content
joeseesunPublic

About

你的个人 AI 雷达:跟踪 AI 圈 X 动态 + 发布自己的想法。自托管 Next.js + SQLite,开箱内置 15 个 AI 领域账号。 | Personal AI radar: track notable AI voices on X and publish your own notes. Self-hosted Next.js + node:sqlite.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Repository files navigation

x-follow

中文 | English

你的个人 AI 雷达:一个页面跟踪 AI 圈重要人物的 X 动态,同时像发朋友圈一样记录自己的想法。 Your personal AI radar: track notable AI voices on X in one feed, and publish your own notes like a micro-Twitter.

Live License Next.js SQLite

AI 动态流

这是什么

刷 X 看 AI 圈动态,信息噪声太大;想发点想法,又不想被算法裹挟。x-follow 把两件事收进一个自托管的小站:

  • AI 动态:跟踪你指定的 X 账号,聚合成一条干净的时间线,按人筛选,图片、引用、互动数齐全。默认内置 15 个 AI 领域知名账号(Sam Altman、Karpathy、吴恩达、Jim Fan、宝玉、OpenAI、DeepMind……),开箱即看。
  • 我的想法:你自己的迷你 Twitter。前台输入管理密钥即可发布、编辑、删除想法,内容存在自己的 SQLite 数据库里,后续可接 Twitter API 同步发推。

我的想法

核心能力

能力 你得到什么
账号跟踪 聚合多个 X 账号的最新推文,桌面端左侧栏按人筛选,可一键只看主贴(过滤回复)
默认 AI 名单 首次启动自动写入 15 个 AI 领域账号,可在 src/lib/default-accounts.ts 自定义
想法发布 管理员前台解锁后即可发/改/删,Markdown 渲染,支持图片/视频/音频附件(粘贴即传),2000 字上限
X 队列 管理员专属 tab:编辑未来要同步到 X 的内容(草稿、附件、字数参考),可标记同步状态;已预留 Buffer 发布通道,X API 申请后可直接接入
中英对照 刷新时自动调用 DeepSeek(或任意 OpenAI 兼容接口)把英文推文译成中文,译文常驻显示在原文下方
权限控制 浏览公开,一切写操作(发想法、增删账号、手动刷新)需管理密钥
定时刷新 /api/cron 端点,用 crontab / systemd timer / GitHub Actions 定时调用即可
自托管 标准 Next.js standalone + 内嵌 SQLite(node:sqlite),无外部数据库依赖,任何 VPS / Docker 主机都能跑

快速开始

前置条件

  • Node.js 22.5+(node:sqlite 需要,node --version 验证)
  • socialdata.tools 的 API Key(用于读取 X 数据,按量付费,https://socialdata.tools)

本地开发

git clone https://github.com/joeseesun/x-follow.git
cd x-follow
npm install

cp .env.local.example .env.local   # 填入 SOCIALDATA_API_KEY / CRON_SECRET / ADMIN_SECRET
npm run dev

打开 http://localhost:3000,点右上角锁图标输入 ADMIN_SECRET 即可解锁管理模式。

生产部署(任意 VPS)

npm ci
npm run build          # 产出 .next/standalone

# standalone 需要手动带上静态资源
cp -r public .next/standalone/public
mkdir -p .next/standalone/.next
cp -r .next/static .next/standalone/.next/static

# 启动(环境变量可用 .env.production 或进程管理器注入)
cd .next/standalone
PORT=3000 HOSTNAME=127.0.0.1 node server.js

环境变量:

变量 必填 说明
SOCIALDATA_API_KEY 是 socialdata.tools 的 API Key,拉取推文用
CRON_SECRET 是 保护 /api/cron 定时刷新端点
ADMIN_SECRET 是 前台解锁管理模式的密钥(发想法、管账号)
DB_PATH 否 SQLite 文件路径,默认 ./data/x-follow.db
UPLOAD_DIR 否 附件存储目录,默认取 DB_PATH 同级的 uploads/
PORT / HOSTNAME 否 监听地址,建议 127.0.0.1 + Nginx 反代
NEXT_PUBLIC_UMAMI_WEBSITE_ID 否 Umami 统计站点 ID(构建时注入)
NEXT_PUBLIC_UMAMI_SCRIPT_URL 否 Umami script 地址,默认 https://umami.qiaomu.ai/script.js
TRANSLATE_API_KEY 否 推文翻译(OpenAI 兼容协议)的 API Key;不设置则翻译功能整体禁用
TRANSLATE_BASE_URL 否 翻译接口地址,默认 https://api.deepseek.com/v1
TRANSLATE_MODEL 否 翻译模型,默认 deepseek-v4-flash
BUFFER_ACCESS_TOKEN 否 X 队列推送到 Buffer 的 access token(两者都配置才启用同步按钮)
BUFFER_CHANNEL_ID 否 Buffer 里 X 账号频道的 ID

生产环境建议:

  • 用 systemd 守护进程(Restart=always),DB_PATH 指向仓库外的持久目录
  • 用 Nginx / Caddy 反代并签发 TLS 证书
  • 定时刷新:*/30 * * * * curl -sf -H "Authorization: Bearer <CRON_SECRET>" https://你的域名/api/cron

也可以用 Docker:

docker build -t x-follow .
docker run -d --name x-follow -p 3000:3000 \
  -v x-follow-data:/data \
  -e SOCIALDATA_API_KEY=... -e CRON_SECRET=... -e ADMIN_SECRET=... \
  x-follow

使用

  • 打开站点即读:「想法」是你的发布流,「AI 动态」是跟踪流(桌面端左侧栏按人筛选,「主贴」开关过滤回复)
  • 点右上角锁图标,输入 ADMIN_SECRET 解锁管理模式:发想法、增删跟踪账号、手动刷新,并多出「X 队列」tab
  • 「X 队列」里编辑未来要发到 X 的内容(支持附件、X 字数参考、粘贴上传);配置 BUFFER_ACCESS_TOKEN + BUFFER_CHANNEL_ID 后可一键推送到 Buffer,未配置则本地管理同步状态
  • 发想法支持 Markdown(GFM)、图片/视频/音频附件,截图或文件直接粘贴即自动上传
  • (可选)在 GitHub 仓库设置 secrets.CRON_SECRET 和 vars.SITE_URL,自带 Actions 每 30 分钟自动刷新推文

工作原理

Next.js 16 (App Router, standalone)
  ├─ /api/accounts  GET 公开 · POST/DELETE 需管理密钥
  ├─ /api/posts     GET 公开 · POST 需管理密钥
  ├─ /api/posts/:id PUT/DELETE 需管理密钥
  ├─ /api/uploads   POST 附件上传(管理密钥)
  ├─ /uploads/*     GET 附件服务(防穿越 + Range 206)
  ├─ /api/xqueue    X 同步队列 CRUD(管理密钥)
  ├─ /api/xqueue/:id/sync  推送到 Buffer / 手动标记同步(管理密钥)
  ├─ /api/refresh   POST 手动刷新(管理密钥)
  ├─ /api/cron      GET 定时刷新(CRON_SECRET)
  └─ /api/health    GET 健康检查(公开)
SQLite (node:sqlite, 单文件)
  ├─ accounts:跟踪账号 + 推文 JSON 缓存
  ├─ posts:想法数据 + 附件 JSON
  ├─ x_queue:待同步到 X 的内容(status: pending/synced/failed)
  ├─ translations:推文中文译文缓存
  └─ meta:seed 标记等元信息

数据源为 socialdata.tools,推文按账号缓存为 JSON,读取时直接出库,不重复计费。翻译在刷新时增量进行(每轮最多 60 条),译文单独缓存,只对新推文调用 LLM。

路线图

  • X 同步队列(编辑待同步内容,Buffer 发布通道已预留,src/lib/xsync.ts 为 X API 扩展点)
  • X API 直接发布(待申请开发者权限)
  • 推文中文翻译(DeepSeek v4 flash,OpenAI 兼容协议可换任意模型)
  • Dockerfile(多阶段构建、非 root 运行、健康检查)
  • RSS 输出

实测验证

  • npm run lint:0 error
  • npm run typecheck:通过
  • standalone 生产模式:15 个默认账号 seed 成功,想法 CRUD 与鉴权全部通过
  • 线上:https://x.qiaomu.ai

Troubleshooting

问题 解决
启动报 node:sqlite 不存在 Node 版本需 ≥ 22.5,建议 Node 22 LTS
添加账号提示 failed to fetch SOCIALDATA_API_KEY 未配置或额度用尽
页面有账号但没推文 点「刷新」或等定时任务;首次 seed 只写用户名
解锁后操作仍 401 密钥已变更,点「退出」重新解锁
数据库想搬家 SQLite 单文件,停服拷走 DB_PATH 文件即可

关于向阳乔木

Forked from joeseesun/x-tracker,在此基础上加入想法发布、默认名单、权限控制、自托管 SQLite 架构与界面重构。


English

x-follow is a self-hosted personal AI radar, built with Next.js 16 and embedded SQLite:

  • AI Feed — aggregates the latest tweets from X accounts you track into one clean timeline. Ships with 15 well-known AI accounts (Sam Altman, Karpathy, Andrew Ng, Jim Fan, OpenAI, DeepMind…) seeded on first run.
  • My Notes — your own micro-Twitter. Unlock admin mode in the frontend with a secret to publish, edit, and delete notes, stored in your own SQLite database. Ready for Twitter API sync later (posts.synced_to_x is reserved).

Stack: Next.js 16 (App Router, output: "standalone") + node:sqlite — no external database, no platform lock-in. Runs on any VPS or Docker host with Node.js 22.5+. Tweet data via socialdata.tools.

Quick start: clone → npm install → copy .env.local.example to .env.local and fill SOCIALDATA_API_KEY / CRON_SECRET / ADMIN_SECRET → npm run dev. For production, npm run build, copy public and .next/static into .next/standalone, then run node .next/standalone/server.js behind Nginx with systemd. See the Chinese section for the full step-by-step; the commands are language-neutral.

Security model: reading is public; every write endpoint (notes, accounts, refresh) requires the ADMIN_SECRET bearer token. /api/cron uses CRON_SECRET.

Limits: you need a socialdata.tools API key (pay-per-use) to fetch X data; tweets are cached per account in SQLite so reads never re-bill. Twitter posting sync is on the roadmap, not included yet.

License: MIT · Maintained by 向阳乔木 Joe (@vista8)

About

你的个人 AI 雷达:跟踪 AI 圈 X 动态 + 发布自己的想法。自托管 Next.js + SQLite,开箱内置 15 个 AI 领域账号。 | Personal AI radar: track notable AI voices on X and publish your own notes. Self-hosted Next.js + node:sqlite.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages