HiroHyun
EN
← 全部项目

HiroCRM

一套自托管的 CRM,服务一个小型销售团队:线索、跟进触点,以及可配置的响应 SLA,全部存放在单个 SQLite 文件里。

Next.js · React · SQLite · Drizzle ORM · TypeScript · 2026年7月 源码 ↗

HiroCRM 是一套为单个小型跨境销售团队打造的线索管理工具。它记录每一条线索及其联系方式,把每次跟进写成一条带日期的触点,并按你配置的跟进 SLA 衡量每条线索的状态。整个数据集存放在一个 SQLite 文件里,应用作为单个 Next.js 进程运行在反向代理之后。

它记录什么

每条线索带有电话、邮箱、WhatsApp 联系方式,一个评级、一个状态,以及所属的销售代表。去重检查会拦下系统里已存在的买家,让同一个联系人只保留一行。每次沟通都会成为该线索时间线上的一个触点,自上而下读下来就是完整的联系历史。

仪表盘按状态、SLA 状态和日期区间对线索分组,顶部展示跟进相关的 KPI。三个环境变量定义 SLA:首次响应窗口(默认 72 小时)、跟进窗口(默认 120 小时),以及响应上限(默认三个触点),到达上限后计时停止。线索可以从 xlsx 表格批量导入;聊天或邮件截图通过一条带会话校验的路由挂到线索上,这条路由只向已登录的请求返回文件。

一个刻意做小的信任模型

HiroCRM 让整个团队通过同一个共享管理员凭据登录。这就是它的设计,项目文档也把由此带来的取舍讲得很直白:所有人共用一个登录,因此没有个人身份、没有对某次改动的个人归属、没有角色与权限,也无法在不更换共享密钥的前提下单独收回某个人的访问。代表(rep)是”这条线索归谁”的标签——名册里的名字,供分配使用。这样的形态适合一个彼此信任的小团队,想要一个账号负担很轻的共享工作区。需要按人留存审计记录的团队应当另选工具。

数据就在一个文件里

所有数据持久化到项目根目录下的一个 dev.db 文件,上传的截图放在它旁边、被 git 忽略的 data/uploads 目录中。备份就是这个文件加这个目录,作为一个原子整体一起取——只取一半,你会得到孤立的图片,或指向缺失文件的线索。一个可选的保留脚本分三步清理:删除归档超过阈值的线索连同其触点,剥离旧截图但保留线索行,清除没有线索引用的上传文件。脚本会打印它将执行的计划,在你加上 --apply 之前什么都不写,所以总是先跑一次演练。

技术栈与门禁

应用基于 Next.js(App Router)与 React 构建,数据库层用 better-sqlite3 加 Drizzle ORM,会话用 NextAuth,界面用 Base UI 组件与 Tailwind CSS v4。每个依赖都锁定到确切版本,一条 npm run gate 命令会在任何改动合入前依次跑生产构建、ESLint、vitest 测试、界面文案与设计 token 检查,以及一套针对临时数据库的 API 冒烟测试——CI 在每个 pull request 上跑的正是同一条命令。HiroCRM v0.1.1 是一个早期公开预览版,由一个人维护,设计为在持久化文件系统上以单实例运行。