安静、键盘优先的 V2EX 阅读器。只读:浏览首页、节点和帖子楼层,不发帖、不回帖。
单文件 Go 服务 + SQLite + 原生前端,无 Node、无前端框架、无 CDN 依赖。
- Vim 操作:
j/k、gg/G、Ctrl-d/u/f/b、[ ]、/、:命令面板、数字前缀。 - 紧凑楼层:左侧窄栏放楼层号/作者/时间,正文铺满;焦点用单条光标标记,不整行高亮。
- AI 总结:兼容 OpenAI Chat Completions 接口,支持自定义 Header、流式输出、缓存,右侧悬浮面板。
- 增量同步:站点 Atom feed + 节点 JSON feed,ETag 条件请求,按主题 ID 去重。
- 按天浏览:查询本地 SQLite 归档,显示覆盖范围。
- 图片与视频:懒加载、灯箱、原图;Bilibili/YouTube 点击后才加载。
- 预览、待读与收藏:列表里
p打开右侧预览,a加入待读,f收藏,Q/F管理队列和收藏。 - 只读扩展:屏蔽用户/帖子、多选管理常用节点、可选 Cookie 登录、宽屏/收束阅读。
- 本地优先:无账号可用,数据保存在本机 SQLite。
从 Releases 下载:
| 平台 | 文件 |
|---|---|
| Windows x64 | v2ex-vimreader-windows-amd64.exe |
| Linux x64 / arm64 | v2ex-vimreader-linux-amd64、v2ex-vimreader-linux-arm64 |
| macOS Intel / Apple Silicon | v2ex-vimreader-darwin-amd64、v2ex-vimreader-darwin-arm64 |
运行后打开 http://127.0.0.1:7788。
在项目根目录执行一次:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\install-autostart.ps1会在当前用户的启动目录创建快捷方式,登录后后台启动服务,不打开浏览器。服务会继续使用 config.toml 和 data_dir 指向的 SQLite 数据库,已有的主题、回复、列表缓存都会保留。
取消自启:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\remove-autostart.ps1需要 Go 1.27 或更新版本:
git clone https://github.com/hazukihira/v2ex-vimreader.git
cd v2ex-vimreader
go build -trimpath -ldflags "-s -w" -o v2ex-vimreader .
./v2ex-vimreaderWindows 可运行 scripts\build.ps1,Linux/macOS 用 scripts/build.sh。
把 config.example.toml 复制为 config.toml。所有配置都有默认值,没有该文件也能运行。
listen = "127.0.0.1:7788"
data_dir = "" # 留空用系统数据目录,也可以写 "data"
log_level = "info"
[fetch]
user_agent = "v2ex-vimreader/0.1 (+https://github.com/hazukihira/v2ex-vimreader)"
requests_per_second = 1.0
burst = 2
[sync]
enabled = true
followed_nodes = ["tech", "qna", "jobs", "create", "ideas", "apple", "play", "life", "openai"]
[login]
cookie = "" # 可选:用于查看受限节点
[ai]
enabled = false
base_url = "https://api.deepseek.com/v1"
model = "deepseek-chat"
api_key_env = "VIMREADER_AI_KEY"
[ai.headers]
# 自定义 Header 写在这里,例如 X-Title = "v2ex-vimreader"AI Key 建议放在环境变量 VIMREADER_AI_KEY。OpenCode Go 等兼容服务填写 base_url 和 [ai.headers] 即可。
| 按键 | 作用 |
|---|---|
j / k |
下 / 上(接近视口中线时页面跟随;长楼层先滚内容) |
gg / G |
顶部 / 底部 |
Ctrl-d / Ctrl-u |
半屏下 / 上 |
Ctrl-f / Ctrl-b |
整屏下 / 上 |
Enter / Space / l / o |
打开主题、链接或图片 |
h / q / Esc |
返回 / 关闭浮层 |
H / Ctrl-L |
历史后退 / 前进 |
[ / ] |
上一页 / 下一页 |
S |
排序当前页(回复数 / 发布时间 / 最后活动 / 标题) |
t |
跳到最新楼层页 |
r / R |
刷新 / 强制刷新 |
/ + n / N |
过滤 / 下一个、上一个匹配 |
y |
复制当前帖子链接 |
b |
屏蔽菜单 |
x / u |
屏蔽当前帖子(连按两次确认) / 作者 |
m |
切换已读标记 |
p |
预览当前主题(列表内) |
a |
加入 / 移出待读 |
Q |
打开待读队列 |
f |
收藏 / 取消收藏当前主题 |
F |
打开收藏列表 |
s |
AI 总结 |
w |
宽屏 / 收束楼层内容 |
i |
打开当前楼层第一张图片 |
g l |
登录面板 |
: |
命令面板(:node、:day、:nodes、:login、:theme、:wide、:preview、:queue、:favorite、:favorites) |
? |
帮助 |
数字前缀可用,如 5j、3]。
未登录时受限节点(nsfw、chamber 等 8 个)只显示登录提示。按 g l 粘贴 v2ex.com Cookie,或从本机 Chrome 导入。
Cookie 保存在 data/v2ex-vimreader.db,重启程序后仍然有效;只有服务端 Cookie 过期或主动退出时才需要重新登录。
帖子视图按 s 打开右侧面板,支持流式输出、复制、重新生成和缓存。接口按 OpenAI Chat Completions 格式调用,自定义 Header 通过 [ai.headers] 配置。
V2EX 没有全站按创建时间翻页的公开接口,所以后台轮询站点 index.xml / read.xml 与节点 feed/<node>.json,用 ETag 条件请求,只补新内容。按天视图查询本地归档,未覆盖的日期会提示。
右上角的同步时间可点击,会展开同步详情:最近站点/节点 feed 时间、本轮 feed 条目数、关注节点成功/失败数、本地主题与楼层数量、归档范围,以及完整的来源、频率、写入内容和请求策略。
当天的主题会在后台增量预取正文和第一页回复,只处理还没抓过的条目,已经缓存的不会重复请求;检测到最近有交互时会暂停预取,避免抢请求额度。正文、回复和列表页作为缓存默认保留最近 3 个自然日,可以在 config.toml 的 [cache] 里用 retention_days 调整(例如 10);主题标题、作者、节点等归档元数据不设过期,按天/最新视图会一直累积。节点目录和 Feed 状态保留 30 天,AI 总结保留 24 小时,前端已读/位置/过滤词保留 90 天。节点列表优先用本地归档;首页第一页之后接本地归档继续翻页;最近用 V2EX 分页,最新用本地归档分页。收藏和待读是用户数据,不设上限,也不参与缓存过期。
仓库带示例 unit:deploy/v2ex-vimreader.service。
sudo useradd --system --home /var/lib/v2ex-vimreader v2ex-vimreader
sudo install -m 0755 v2ex-vimreader-linux-amd64 /usr/local/bin/v2ex-vimreader
sudo mkdir -p /etc/v2ex-vimreader /var/lib/v2ex-vimreader
sudo cp config.example.toml /etc/v2ex-vimreader/config.toml
sudo cp deploy/v2ex-vimreader.service /etc/systemd/system/
sudo systemctl enable --now v2ex-vimreader直接运行可执行文件即可。数据默认在:
| 平台 | 数据目录 |
|---|---|
| Windows | %LOCALAPPDATA%\v2ex-vimreader |
| macOS | ~/Library/Application Support/v2ex-vimreader |
| Linux | ~/.local/share/v2ex-vimreader |
- 数据保存在本机 SQLite(
v2ex-vimreader.db)。 - Cookie 和 AI Key 只存在本机配置文件或 SQLite。
- 默认请求频率 1 req/s,使用可识别 User-Agent,支持 ETag 缓存。
- 不绕过登录墙:受限节点要么匿名读公开页面,要么由用户提供自己的 Cookie。
go test ./...
go run . -no-open -debug -web-dir web纯前端 mock:node scripts/serve-web.mjs,打开 http://127.0.0.1:7801/?mock=1。
接口见 docs/API.md,架构与核心逻辑见 docs/ARCHITECTURE.md,前端规格见 docs/UI-SPEC.md。
非官方第三方阅读器,与 V2EX 官方无关。抓取仅用于个人阅读,请遵守 V2EX 服务条款与 robots 约定;帖子版权归原作者所有。
MIT。


