# snapforge
**Repository Path**: kill-life/snapforge
## Basic Information
- **Project Name**: snapforge
- **Description**: SnapForge · 闪构 · 免费开源的 Linux 截图 · 标注 · 贴图 · 录屏 · 取字一体化工具
- **Primary Language**: Unknown
- **License**: GPL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-10-11
- **Last Updated**: 2026-10-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SnapForge · 闪构

**免费开源的 Linux 截图 · 标注 · 贴图 · 录屏 · 取字一体化工具**
把 PixPin、iShot、Snipaste 各自的杀手锏合到一个工具里,为 Linux 桌面补齐那块长期缺失的拼图。
[](pyproject.toml)
[](LICENSE)
[](#系统要求)
[](tests)
[](#安装)
简体中文 | [English](#english)
---
## 初心
Linux 上不缺截图工具,缺的是**一个把事做完的工具**。调研 102 个竞品功能点、46 张对比表后结论明确:**没有任何一款 Linux 工具能同时做好「截图 / 标注 / 贴图 / 录屏 / OCR / 滚动长截图」六件事。**
| 工具 | 截图 | 标注 | 贴图钉屏 | 录屏 | OCR | 滚动长截图 | 评价 |
|---|:--:|:--:|:--:|:--:|:--:|:--:|---|
| Flameshot | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 标注体验好,但没有贴图/录屏/取字 |
| Spectacle (KDE) | ✅ | ⚠️ | ❌ | ⚠️ | ❌ | ❌ | 截图稳,标注弱,无贴图 |
| GNOME Screenshot | ✅ | ❌ | ❌ | ⚠️ | ❌ | ❌ | 太基础 |
| Shutter | ✅ | ✅ | ❌ | ❌ | ⚠️ | ❌ | 维护缓慢,依赖重(Perl + 大量 GTK 模块) |
| Snipaste (Windows/macOS) | ✅ | ✅ | ✅ | ❌ | ⚠️ | ❌ | 贴图是标杆,但 Linux 版缺位 |
| PixPin (Windows) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 功能标杆,闭源且只有 Windows |
| **SnapForge** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | **六项全绿,免费开源,零 sudo 依赖** |
SnapForge 不是又一个截图工具,而是把上述工具各自的优点**集成于一体**。
---
## 功能一览
### 📷 截图
- **区域 / 窗口 / 全屏 / 延时 / 上次区域重截 / 剪贴板导入**
- 区域截图:全屏冻结、放大镜像素级取色、边缘吸附、悬停自动高亮窗口
- 窗口截图:XComposite 抓取**未被遮挡的完整窗口**(被其他窗口压住也能抓全)
- 多显示器与 HiDPI 混合缩放正确处理(内部统一使用虚拟桌面原生像素坐标系)
### ✏️ 就地标注(12 种工具)
- 矩形、椭圆、箭头、直线、画笔、荧光笔、文字、序号、马赛克、模糊、色块遮挡、聚光灯
- 遮罩上直接画,不用先开编辑器;画完可继续选中、移动、缩放、改色改粗细
- 两级工具条:同类工具收进一个按钮,属性条只显示当前工具用得上的属性;**每个工具独立记忆自己的样式**
- 马赛克 / 模糊从**原图采样**,不会把已画标注再打码;序号自动递增;`Shift` 约束正方形与 45° 直线
### 🎨 编辑器
- 裁剪、旋转 90°、水平/垂直翻转、等比缩放,**全部可撤销**(裁剪无损贴回原画布)
- **美化外框**:圆角 / 内边距 / 阴影 / 背景(渐变、纯色、毛玻璃、壁纸),6 套渐变预设
- **水印**:文字或图片、九宫格定位、透明度、平铺防搬运
- 导出 PNG / JPEG / WebP / BMP / TIFF,文件名模板 `{date} {time} {datetime} {seq} {app} {type}`
### 📌 贴图钉屏
- 截图"钉"在屏幕当参考:拖动、滚轮缩放、`Ctrl+滚轮` 透明度、`Shift+滚轮` 旋转、边缘拉伸手柄、悬停浮出小工具条
- **鼠标穿透**、多张贴图自动吸附对齐、退出后自动恢复上次的贴图
### 🎬 录屏与 GIF 编辑
- MP4 / MKV / WebM / **GIF**,画质三档(高清文字 / 平衡 / 小体积)、帧率与 CRF 可调、**硬件编码自动探测**(VAAPI / NVENC)、系统声音 + 麦克风混音、倒计时、录制中浮动控制条
- GIF 高保真管线:crf 18 + yuv444p 保文字边缘,自动选用 [gifski](https://gif.ski) 逐帧调色板(体积约 1/4),默认**原始尺寸不缩放** —— 录文档/代码不糊字
- **GIF 编辑器**:帧时间线 Ctrl/Shift 多选删段、删除重复帧(观感不变、体积大降)、变速 0.25×–4×、逐帧延时、隔帧抽稀、预览上直接拖框裁剪,全部可撤销
### 🧵 滚动长截图(**你滚,我们拼**)
- 框选内容区 → **你自己滚动滚轮** → 实时看到长图长起来 → 点「完成」
- **不盖全屏遮罩、不注入滚轮事件**:目标窗口保持焦点,滚轮自然送达,抓帧天然干净
- 观测式静止抓帧:画面静止才抓帧,XShm 零拷贝(0.41 ms/帧)、模板级联匹配 + 逐像素一致性校验、吸顶/吸底固定元素只保留一次、回滚自动回退、匹配失败插**看得见的橙色缺口带**
- 实测 12 个场景(慢滚/快滚/周期页/回滚等)与真值**逐像素一致**(`tests/test_scroll_engine.py`)
### 🔍 OCR 取字(两种模式)
- **本地引擎(默认,完全离线)**:RapidOCR 模型直接打进 wheel(16MB),无需联网、无需系统依赖;也支持 Tesseract
- **多模态大模型(可选)**:不只认字,还能还原**版面结构** —— 标题层级、列表、表格、代码块,直接输出规范 **Markdown**;支持 OpenAI 兼容协议 / Claude / Ollama(本地模型,数据不出本机)
- **安全兜底**:`auto` 后端只在本地引擎里挑,配了 Key 也不会偷偷把截图发出去;大模型失败时自动回退本地识别
### 🗂 截图库 · 托盘 · CLI
- SQLite 截图库:卡片网格、**全文搜索(含 OCR 文本)**、收藏、批量操作、分段类型筛选、清理策略
- 系统托盘常驻 + 15 个可自定义**全局快捷键**(XGrabKey 实现,不依赖 D-Bus)
- 单实例 + IPC(脚本调用转发给已运行实例并取回结果)、完整 CLI 与 `--json` 输出
---
## 界面预览
| 截图遮罩与就地标注 | 截图库 |
|---|---|
|  |  |
| 编辑器 · 多工具标注 | 编辑器 · 美化 |
|---|---|
|  |  |
| 贴图钉屏 | 滚动长截图 |
|---|---|
|  |  |
| OCR 取字 | 设置 |
|---|---|
|  |  |
> 以上截图由 `python3 tools/make_screenshots.py` 从**真实运行的程序**离屏渲染生成,可随时重新生成。
---
## 安装
**推荐:用户级安装脚本(零 sudo,装到 `~/.local`,含启动器、桌面菜单项与图标)**
```bash
git clone https://github.com/snapforge/snapforge.git
cd snapforge
bash packaging/install.sh
```
```bash
bash packaging/install.sh --uninstall # 卸载(保留配置与历史)
PREFIX=/opt/snapforge bash packaging/install.sh # 自定义前缀
```
**其它分发形式**(产物在 `dist/`):
| 形式 | 构建 | 安装 / 使用 |
|---|---|---|
| Debian 包 | `bash packaging/build_deb.sh` | `sudo apt install ./dist/snapforge_1.0.1_all.deb` |
| AppImage | `bash packaging/build_appimage.sh` | 便携单文件,拷到哪都能跑 |
| Python 包 | `bash packaging/build_wheel.sh` | `pip install dist/snapforge-1.0.1-py3-none-any.whl` 后 `snapforge --install-desktop` |
| 从源码运行 | `pip install --user PySide6 Pillow` | `python3 -m snapforge --help` |
> SnapForge 运行在**独立的 uv venv** 中:实测 conda 自带的 Qt6 二进制会与 pip 安装的 PySide6 冲突(QtWebEngine 一 import 就段错误),系统 Python 环境又不可控。安装脚本按顺序复用 `~/.local/share/snapforge/.venv` → 项目目录 `.venv` → 新建 `uv venv --python 3.12`,无需手工干预。
**可选增强**(缺失只影响对应功能,不影响主流程):
| 能力 | 安装方式 | 缺失后果 |
|---|---|---|
| 录屏 | `sudo apt install ffmpeg` | 录屏功能自动隐藏并提示 |
| 长截图加速 | `pip install numpy opencv-python-headless` | 回退到纯 Python 拼接(慢但仍可用) |
| OCR 取字 | `pip install rapidocr-onnxruntime` | 提示改用 Tesseract 或安装命令 |
| OCR 系统引擎 | `sudo apt install tesseract-ocr tesseract-ocr-chi-sim` | 同上 |
| 全局快捷键 / 窗口识别 | X11 会话(libX11 等桌面发行版自带) | Wayland 下降级,见[常见问题](#常见问题) |
安装后自检:`snapforge info`
---
## 5 分钟上手
1. **按 `Ctrl+Alt+A`**(或托盘图标 → 区域截图):屏幕冻结,出现截图遮罩。
2. **拖拽选择区域** —— 放大镜跟随光标显示像素与色值,悬停时自动高亮整个窗口,单击即选中该窗口。
3. **就地标注**:直接点工具条上的工具画就行,画错了 `Ctrl+Z`。
4. **选一个动作**:
- `Enter` / `Ctrl+C` 复制(粘到聊天工具是图、粘到终端是路径)
- `Ctrl+S` 保存 · `Ctrl+T` 贴到屏幕 · `Ctrl+E` 进编辑器精修 · `Ctrl+O` 提取文字
- `Ctrl+Alt+L` 滚动长截图 · `Ctrl+Alt+S` 区域录屏
5. **`Ctrl+Alt+H`** 打开截图库,找回历史截图。
---
## 默认快捷键
全局快捷键(X11 下由 `XGrabKey` 注册,可在 **设置 → 快捷键** 逐条修改,留空则不注册;与其它程序冲突时会记为注册失败并提示,换个组合即可):
| 功能 | 默认组合 | 功能 | 默认组合 |
|---|---|---|---|
| 区域截图 | `Ctrl+Alt+A` | 区域录屏 | `Ctrl+Alt+S` |
| 全屏截图 | `Ctrl+Alt+F` | 全屏录屏 | `Ctrl+Alt+Shift+S` |
| 窗口截图 | `Ctrl+Alt+W` | 开始/停止录制 | `Ctrl+Alt+P` |
| 重复上次区域 | `Ctrl+Alt+R` | 滚动长截图 | `Ctrl+Alt+L` |
| 延时截图 | `Ctrl+Alt+D` | OCR 取字 | `Ctrl+Alt+O` |
| 贴图(剪贴板) | `Ctrl+Alt+V` | OCR(剪贴板) | `Ctrl+Alt+Shift+O` |
| 打开截图库 | `Ctrl+Alt+H` | 打开设置 | `Ctrl+Alt+,` |
| 显示/隐藏全部贴图 | `Ctrl+Alt+X` | | |
截图遮罩内(无需记忆,工具条上有提示):
| 按键 | 作用 | 按键 | 作用 |
|---|---|---|---|
| `R` / `E` / `A` / `L` | 矩形 / 椭圆 / 箭头 / 直线 | `Ctrl+C` | 复制到剪贴板 |
| `P` / `H` | 画笔 / 荧光笔 | `Ctrl+S` | 保存 |
| `T` / `N` | 文字 / 序号 | `Ctrl+E` | 进编辑器 |
| `M` / `B` / `D` | 马赛克 / 模糊 / 色块遮挡 | `Ctrl+T` / `Ctrl+P` | 贴到屏幕 |
| `V` | 选择/移动已画标注 | `Ctrl+O` / `O` | 提取文字 (OCR) |
| `Ctrl+A` | 全选当前屏幕 | `Ctrl+R` | 开始录屏 |
| `Ctrl+Z` / `Ctrl+Shift+Z` / `Ctrl+Y` | 撤销 / 重做 | `Ctrl+L` | 滚动长截图 |
| `Tab` | 切换"悬停识别窗口"模式 | `Delete` | 删除选中标注 |
| `Enter` | 确认(默认复制) | `←↑→↓` | 微调选区(`Shift` 加速) |
| `Esc` | 取消截图 | | |
编辑器内:`Ctrl+C/S/Shift+S` 复制/保存/另存为,`Ctrl+Z` / `Ctrl+Y` 撤销重做,`Ctrl+0` 适应窗口、`Ctrl+1` 实际大小、`Ctrl++/-` 缩放,`Ctrl+B` 显隐侧栏,`C` 裁剪。
贴图内:滚轮缩放、`Ctrl+滚轮` 透明度、`Shift+滚轮` 旋转、`Ctrl+C/S` 复制/保存、`Esc` 关闭、方向键微调。
---
## 命令行接口
```bash
snapforge info # 环境与能力自检
snapforge capture --mode region # 区域截图(自动转发给托盘实例)
snapforge capture --region 100,100,800,600 # 直接抓指定区域,无需交互,适合脚本
snapforge capture --mode monitor --monitor 1 # 指定显示器;--screen HDMI-1-0|1|cursor|primary 限定某屏
snapforge capture -d 5 --json # 延时截图,JSON 输出便于脚本消费
snapforge record --pick-region -t 10 -o demo.mp4 # 交互选区录制 10 秒
snapforge record --region 0,0,1280,720 --fps 60 --audio system
snapforge record --format gif -t 6 # 直接录 GIF
snapforge ocr --file shot.png --markdown # OCR 并输出 Markdown;--clipboard 识别剪贴板
snapforge scroll --region-picker # 长截图(CLI 路径用 XTest 合成滚轮,桌面交互走「用户自己滚」引擎)
snapforge pin --file shot.png # 把图片贴到屏幕上
snapforge history --search 发票 --json # 搜索历史
snapforge settings --set save.format=webp # 命令行改配置
snapforge --tray # 托盘常驻,不弹主窗口
```
完整命令见 `snapforge --help`。
---
## 托盘与常驻
SnapForge 是**托盘常驻型**工具:关掉所有窗口仍在后台待命,快捷键随时可用。托盘走现代 **StatusNotifierItem (D-Bus)** 协议,KDE Plasma、GNOME(需 AppIndicator 扩展)、Xfce、Cinnamon、MATE 均支持。
| 操作 | 效果 |
|---|---|
| 左键单击 | 直接开始区域截图 |
| 双击 | 打开截图库主窗口 |
| 右键 | 完整菜单:截图 / 录屏 / 长截图 / 取字 / 贴图管理 / 设置 / 退出 |
```bash
snapforge --tray # 驻留托盘,不弹主窗口
snapforge settings --set general.autostart=true # 开机自动驻留(写 XDG autostart)
```
> **没看到图标?** KDE 默认把新托盘图标收进右下角 `∧` 箭头里;想常驻可见:右键托盘 → 配置系统托盘 → SnapForge → 可见性改为"始终显示"。桌面环境没有托盘时,程序自动退化为普通窗口应用并打印明确日志。
---
## 多显示器
默认在**所有屏幕**显示截图遮罩,一条选区可跨屏。只想操作某一屏时:
```bash
snapforge capture --screen HDMI-1-0 # 屏幕名(xrandr 里的名字)/ 序号 / cursor / primary
snapforge settings --set capture.overlay_monitor=HDMI-1-0 # 设为默认
```
限定屏幕后,遮罩只出现在该屏上,选区被限制在该屏内,"全屏截图"的含义也变成只截这块屏。
---
## 配置与数据目录
| 用途 | 路径 | 说明 |
|---|---|---|
| 配置 | `${XDG_CONFIG_HOME:-~/.config}/snapforge/config.json` | 原子写入,损坏时自动备份并回落默认值 |
| 历史原图 | `${XDG_DATA_HOME:-~/.local/share}/snapforge/history/` | 可用文件管理器直接管理 |
| 历史索引 | `…/snapforge/history.db` | SQLite(WAL 模式) |
| 缩略图 | `${XDG_CACHE_HOME:-~/.cache}/snapforge/thumbs/` | 可安全删除 |
| 日志 | `…/snapforge/logs/snapforge.log` | 轮转日志,`--log DEBUG` 开调试 |
| 贴图状态 | `…/snapforge/pins.json` | 退出后下次启动恢复贴图 |
所有路径都可用环境变量 `SNAPFORGE_HOME` 整体重定向(便于测试与便携部署)。
---
## 设计取舍
- **ctypes 直调 libX11**(而非 python-xlib / mss):抓屏是热点路径,2560×1440 约 32 ms,比走 Python 层封装快数倍,且零额外依赖。
- **遮罩与编辑器共用自绘渲染器**:保证"遮罩里看到的"和"编辑器导出的"像素一致(所见即所得),并精确控制 HiDPI 变换与马赛克采样源。
- **零 sudo**:面向桌面用户,所有能力走 ctypes + 可选 pip 依赖;缺依赖时功能优雅降级并给出可操作提示,而不是崩掉。
- **统一原生像素坐标系**:规避 Qt 在 X11 上"位置为原生像素、尺寸为逻辑像素"的混合坐标系,多屏 + HiDPI 错位问题在架构上一次解决。
- **主界面用 QML 而非 Electron / Flutter**:截图遮罩必须用 override-redirect 窗口绕过窗口管理器并逐像素透明 —— Flutter 无公开窗口 API([#66751](https://github.com/flutter/flutter/issues/66751) 挂了 5 年),Electron 的 overlay 库自认在 Linux 上做不到([electron-overlay-window#48](https://github.com/SnosMe/electron-overlay-window/issues/48));QML 与 Python 核心同进程、零打包增量,一套技术栈一种观感。
- **性能与可访问性**:设计令牌构建期确定性生成,运行期零文件 IO;83 对前景/背景的 WCAG 对比度在测试里自算达标,标注色板通过色盲模拟验证;遮罩局部重绘实测 7.43 ms → **2.52 ms(3.0×)**。
- **已知限制**:X11 下录屏暂停采用 SIGSTOP 暂停 ffmpeg 管道,恢复后文件时长与界面计时存在偏差;全屏录制无法排除控制条(X11 无窗口排除机制),建议区域录屏。
---
## 系统要求
| 项目 | 要求 |
|---|---|
| 系统 | Linux(Ubuntu 22.04+ / Debian 12+ / 其它现代发行版) |
| 桌面 | **X11 会话**(KDE Plasma / GNOME / Xfce / Cinnamon / MATE / i3 等) |
| Python | 3.10+(已在 3.13 上验证) |
| 图形 | PySide6 ≥ 6.5(Qt 6) |
| 必需库 | libX11 / libXtst / libXfixes(绝大多数桌面发行版自带) |
| 可选 | ffmpeg(录屏)、numpy + opencv(长截图加速)、rapidocr 或 tesseract(取字) |
**Wayland**:应用可以启动,但能力**大幅降级** —— 全局快捷键、窗口识别、模拟输入、滚动长截图不可用,且只能拍到 XWayland 应用。应用会在 `snapforge info` 与界面能力提示里如实汇报,不会假装支持。**追求完整体验请使用 X11 会话**(登录界面右下角可切换)。
---
## 常见问题
按快捷键没反应
1. 确认程序在运行:托盘里应有 SnapForge 图标(`snapforge --tray`)。
2. 跑 `snapforge info` 看「全局快捷键」是否为 ✓(Wayland 下会是 ✗)。
3. 组合被别的程序占用了:`snapforge --log DEBUG` 启动,日志里会写哪一条注册失败;或在 `设置 → 快捷键` 页底部查看冲突提示,换一个组合。
录屏没有声音
- `snapforge info` 看「音频」是否为 ✓;需要 PulseAudio 或 PipeWire。
- `设置 → 录屏 → 音源` 选「系统声音」录 monitor 源;麦克风选「麦克风」。
- 带音频录制开头有 0.3~0.5 秒空档(ffmpeg 打开 pulse 设备耗时),属已知行为。
长截图拼不上,或者中途就停了
前提是页面能**整体平移**。固定布局、内部独立滚动容器、视频/聊天流式更新、滚动条到底时会正确判停而不是拼出重影。
其它检查项:鼠标要能落在可滚动区域上(程序会把指针移到选区中心再滚动);滚动步长不能超过单帧高度的 87.5%;页面动画会让匹配失败,等它停一停再试。
OCR 不可用 / 识别不准
- 推荐离线引擎:`python3 -m pip install rapidocr-onnxruntime`(中英文,无需联网)。
- 或系统引擎:`sudo apt install tesseract-ocr tesseract-ocr-chi-sim`。
- 小字识别不准:保持 `设置 → 文字识别 → 图像预处理` 开启。
- RapidOCR 内置模型固定为中英文;日/韩/俄等需要 Tesseract 及其语言包。
HiDPI / 多屏下位置错位
请反馈 `snapforge info --json` 与 `xrandr --listmonitors` 的输出。项目内部已统一到原生像素坐标系,若仍有错位属于环境特例,日志(`--log DEBUG`)会打印每个遮罩窗口的逻辑/原生偏移与 dpr,便于定位。
全屏录屏把控制条录进去了
X11 没有"窗口排除"机制,全屏录制时控制条必然出现在画面里。请改用**区域录屏**,或在 `设置 → 录屏` 里关闭「显示浮动控制条」(改用快捷键 `Ctrl+Alt+P` 停止录制)。
贴图"看不见"了
可能开了**鼠标穿透**。用 `Ctrl+Alt+X` 显示/隐藏全部贴图,或托盘右键 →「贴图管理 → 关闭鼠标穿透」。
粘贴到别处没有图片
SnapForge 复制时同时写入图片、文本路径与文件 URI 三种格式;若目标程序仍拿不到图片,请确认它在 X11 剪贴板可用(部分沙箱应用需要通过文件路径粘贴),也可以先保存成文件再粘贴。
---
## 开发
```bash
git clone https://github.com/snapforge/snapforge.git
cd snapforge
python3 -m pip install --user -e ".[dev,fast,ocr]"
python3 -m pytest tests/ -q # 673 passed, 1 skipped(默认 offscreen,无需显示器)
DISPLAY=:0 python3 -m pytest tests/ -q # 真机用例(录屏等)会自动启用
python3 tools/make_screenshots.py # 重新生成文档截图
python3 tools/gui_smoke.py # 开一遍所有窗口并做像素校验
python3 -m snapforge --log DEBUG # 调试运行
# 滚动长截图端到端(真实窗口 + 真实 XTest 滚轮,自动预检滚轮送达)
xvfb-run -a -s "-screen 0 2560x1440x24" python3 tools/e2e_scroll_capture.py --steps 14 --clicks 5 # CI 虚拟显示
DISPLAY=:0 python3 tools/e2e_scroll_capture.py --steps 10 --clicks 3 --max-gaps 2 # 真机
# 已安装实例的增量更新(rsync 源码 → 复用 venv → 刷新启动器 → 冒烟验证)
bash packaging/update.sh --check # 只看差异
bash packaging/update.sh --restart # 停实例 → 更新 → 重启托盘
```
### 目录结构
```
snapforge/
├── core/ # 与界面无关的领域层
│ ├── x11.py # ctypes 原生 X11:抓屏/窗口枚举/XTest/XFixes/XGrabKey
│ ├── capture/ # 抓屏后端(原生 X11 / Qt / Wayland)与图像工具
│ ├── annotate.py # 标注数据模型 + 渲染器(遮罩与编辑器共用)
│ ├── decorate.py # 美化外框与水印
│ ├── exporter.py # 导出与格式处理
│ ├── recorder.py # 录屏(ffmpeg 编排)
│ ├── scrollshot.py # 滚动长截图与拼接算法
│ ├── ocr/ # OCR 后端(rapidocr / tesseract)
│ ├── history.py # SQLite 历史库
│ ├── ipc.py # 单实例与进程间通信
│ ├── config.py # 配置树(11 个分类)+ 原子读写
│ └── platform.py # 能力探测
├── ui/ # 界面层
│ ├── overlay/ # 截图遮罩 + 浮动工具条
│ ├── editor/ # 编辑器窗口 / 画布 / 侧栏面板
│ ├── widgets/ # 主题化控件、无边框窗口、气泡、倒计时…
│ ├── theme.py # 设计令牌与样式表
│ ├── icons.py # 104 个内联 SVG 图标
│ └── … # 贴图、截图库、设置、OCR、录屏界面
├── app.py # 应用控制器(托盘/热键/流程编排)
├── cli.py # 命令行
tests/ # pytest(默认 offscreen 可跑)
tools/ # 开发与验证脚本
docs/ # 调研 / PRD / 架构 / UI 规范 / 手册 / 子系统设计
packaging/ # 安装脚本、deb/AppImage 构建、桌面项、图标生成
```
---
## 文档
完整设计文档(竞品调研、PRD、架构设计、UI/视觉规范、录屏与长截图算法等 13 篇)由作者本机维护,不随本仓库分发;`docs/images/` 保存 README 引用的配图。
---
## 许可证
[GPL-3.0-or-later](LICENSE)。可自由使用、修改、分发;衍生作品需同样开源。
---
## English
**SnapForge** is a free and open-source screenshot suite for Linux (X11), bringing
screenshot, annotation, pin-to-screen, screen recording, OCR and scrolling capture
into one tool — the combination that no Linux screenshot utility currently offers.
```bash
bash packaging/install.sh # user-level install, no sudo required
snapforge info # capability self-check
snapforge --help # CLI overview
```
Everything (including the UI) speaks Chinese; the codebase and CLI are
documented in Chinese with English identifiers. Released under GPL-3.0-or-later.
Issues and PRs are welcome.