心象仪是一个离线优先的打卡日记、Todo 和心情模糊量化工具。当前版本是最小可运行 PWA:macOS 可在浏览器运行,Android 可通过 Chrome 打开并安装到桌面。
它的核心不是把每天的记录铺成平面流水账,而是从完整日记中提取真正有关的情绪线索,投影到一个可回顾的“心象空间”,再把这一天长成心象花园里的一株植物。
- 在 localhost 直接运行,主数据落到本地 SQLite 文件:
data/xinxiangyi.sqlite。 - 提供六个主界面:仪表盘、Todo 看板、心象花园、历史记录、回顾和设置。
- 记录每日打卡日记、标签和本地图片附件;新记录不再单独填写“心情描述”。
- 添加、完成、删除当日 Todo。
- 生成
心象分:将完整日记模糊量化为 0-100 分,并保存清晰度、负荷度、能量感、修复感、反思度等组成项。 - 生成
心象象限:把今日状态归入高能舒展、高能紧绷、低能修复、低能承压四类。 - 提供
心象花园:每天的日记只生成一株植物,心情象限决定天气和植物种类,诚实打卡固定获得基础成长,不因低落情绪减少奖励。 - 根据日记长度、复盘线索、完成 Todo 和图片生成少量成长加成,并提供连续打卡、低落时仍记录、象限收集等成就。
- 提供总结页面:用月历热力图观察心象分、打卡状态和事项完成情况。
- 支持一周回顾:选择任意一周,查看心象均值、打卡天数、事项完成率和每日状态。
- 支持 OpenAI-compatible 大模型 API 生成周总结,API Key 只保存在本机浏览器
localStorage。 - 设置页内提供系统总览、本地 SQLite 文件状态、统计卡片配置和 WebDAV/坚果云同步配置。
- 使用 SQLite 做本地持久化,图片先以 BLOB 存入
attachments表。 - 提供心情折线图和随数据变化的圆环进度展示。
- 使用
changes变更日志记录本地写入,为后续 WebDAV 增量同步预留结构。 - 统计记录按
月份 -> 周 -> 日期展示,不把每天记录铺平成单层列表。
当前算法版本:xinxiang-v0.3-journal-vector
当前最小版本先用词汇近似模拟未来的向量模型:
- 从完整日记中提取清晰、负荷、能量、修复、反思等信号;普通叙述主要影响样本充分度,不直接抬高或压低分数。
- 将信号投影为四维心象向量:
valence、arousal、resilience、clarity。 - 以
valence和arousal划分象限,得到今天的大致心情状态。 - 用 sigmoid 曲线将模糊向量压缩为 0-100 的
心象分,避免线性加减分过于僵硬。 - 根据象限生成回顾提示,帮助后续关联 Todo、睡眠、运动、地点、人物和图片附件。
为了适应长日记,当前词法层会限制同一关键词的重复计数,跳过“没有压力”“不焦虑”等否定语境,并过滤“积累了”之类的中文子串误命中。没有明确情绪线索的普通日常叙述会保持在中性心象附近。
后续可把第 1 步替换为 word2vec 或 embedding:
- 以“心情原点”为中心,把文本向量投影到愉悦度、唤醒度、恢复力、清晰度等轴。
- 用历史记录微调每个用户自己的轴权重。
- 用相似日回顾找出重复模式,例如“高能紧绷后第二天低能承压”或“散步图片出现后修复感升高”。
- 当前先用 WebDAV 同步跨端 JSON 快照;后续再升级为基于变更日志的跨设备增量合并。
SQLite 数据库文件:data/xinxiangyi.sqlite
entries:每日记录,包含日期、日记正文、兼容旧数据的心情文本、心象分析结果和标签;新记录统一写入日记正文。todos:每日事项,包含完成状态和完成时间。attachments:本地附件,包含图片 BLOB、文件名、类型、大小和关联日记。changes:同步队列,包含实体类型、实体 ID、操作、设备 ID、时间和快照。weeklySummaries:周总结缓存,包含周起始日期、模型、服务商、总结正文和更新时间。
本地 SQLite 只负责当前设备的高效读写;WebDAV 不直接同步本机 data/ 目录或裸 SQLite 文件,而是同步跨端快照。桌面端可生成一个独立的本地同步包目录:sync/xinxiangyi-sync/。后续增量同步可从 changes 表生成远端增量包,并把图片附件从 BLOB 拆到独立对象存储。
今日台:今日记录、今日 Todo、心象分、心情趋势和云同步入口。心象花园:把日记、心象向量、连续打卡、Todo 和附件推导为植物、成长阶段与成就。日记浏览:用年度热力图回看长期心象记录。Todo:独立事项看板,按过去、今天、以后、已完成组织推进状态。总结:月历热力图、一周回顾、大模型周总结。设置:系统总览、统计卡片配置、本地数据库、WebDAV 和游戏接口。
花园不维护第二份独立游戏存档。植物、经验、阶段、天气和成就都由已有日记、心象向量、连续打卡、Todo 与附件实时推导,因此跨端同步后不会出现“日记已同步但游戏进度丢失”的分叉。
当前实现仍是日记成果可视化。下一版 Merge-3 养成系统已先进入策划阶段,尚未创建游戏存档或安装图形引擎;详细规则、经济系统、同步边界和技术路线见 心象花园 Merge-3 养成游戏策划稿。
低能承压:守夜蕨,静夜细雨。高能紧绷:风铃草,有风的午后。低能修复:晨露芽,清晨薄雾。高能舒展:向阳花,晴光漫游。
每篇日记固定获得基础成长经验。心象分只改变植物与天气,不决定奖励多少;修改同一天的日记会重新计算这株植物,而不会重复种植。
总结页内可以配置兼容 OpenAI Chat Completions 的接口:
- Endpoint 示例:
https://api.openai.com/v1/chat/completions - 基础网关地址也可直接填写:例如
https://www.heiyucode.com,本地代理会自动补成/v1/chat/completions - Model 示例:
gpt-4o-mini - API Key:只保存在当前浏览器本地,不写入 SQLite 同步队列。
生成周总结时,浏览器会先把请求发给本地 SQLite API,再由本地 API 转发到配置的模型接口。这样可以避开浏览器直接访问外部大模型接口时常见的 CORS / failed to fetch 问题。生成结果会存入 weeklySummaries,之后可以继续手动修改和保存。
设置页提供 WebDAV 配置,今日台提供一个自动同步按钮:
- Server URL 默认:
https://dav.jianguoyun.com/dav/ - Username:坚果云账号邮箱
- Password:坚果云应用密码
- Remote Path 默认:
/xinxiangyi-sync
当前版本采用跨端快照同步,但界面不要求用户选择上传或拉取:
- 本地有未同步内容时,自动生成跨端快照并上传
xinxiangyi-native-snapshot.json与manifest-native.json。 - 本地没有未同步内容时,自动尝试下载远端
xinxiangyi-native-snapshot.json。 - 桌面端仍可兼容导入旧版
xinxiangyi.sqlite,并会在导入后迁移生成跨端 JSON 快照。 - 桌面端替换本地数据前会在
data/.sync/保留一份本地备份。 - 设置页可开启“打开后每天自动同步”,每天首次打开应用时执行一次。
不要把本机 data/ 整个目录作为坚果云同步目录。data/ 是某一台设备的本地工作区,里面可能包含 SQLite 主库、临时文件和备份。坚果云中建议只创建一个专用远端目录,例如 /xinxiangyi-sync,让应用通过 WebDAV 在里面维护同步协议文件。
桌面端设置页提供“生成本地同步包”按钮。它会把当前需要同步的文件整理到:
sync/xinxiangyi-sync/
当前同步包包含:
sync/xinxiangyi-sync/
├── xinxiangyi-native-snapshot.json
├── manifest-native.json
└── README.txt
手动上传或手动配置坚果云时,只需要上传 sync/xinxiangyi-sync/ 这个目录里的内容。不要上传 data/、data/.sync/ 或 data/xinxiangyi.sqlite。
当前先采用自用简单同步模式:
- 在 Mac、Windows 或 Android 上编辑后,点击应用里的同步按钮上传当前设备快照。
- 换到另一台设备时,先点击同步按钮拉取云端快照,再开始编辑。
- 如果某台设备需要强制恢复云端数据,可以在设置页使用“从云端恢复”。
- 当前阶段暂不做复杂冲突合并;如果多台设备同时离线编辑,最后上传的快照会成为云端版本。
这套方式适合单人多设备备份/恢复。它还不是实时增量同步,也不会处理“两个设备同时编辑同一天”的复杂冲突。后续要做真正多端同步时,再基于 changes、updatedAt、deviceId、syncState、附件哈希和远端 manifest 做合并策略。
npm install
npm run devnpm run dev 会同时启动本地 SQLite API 和 Vite 前端。默认数据库文件位于:
data/xinxiangyi.sqlite
局域网调试 Android:
npm run dev -- --host 0.0.0.0构建:
npm run build本地仓库可以直接推到 private GitHub repo:
gh auth login -h github.com
gh repo create xinxiangyi --private --description "Offline-first mood-vector todo journal." --source=. --remote=origin --push