Releases: ThaddeusJiang/Vmemo
Releases · ThaddeusJiang/Vmemo
Vmemo 2026.6.9
Changed
- Image uploads now use a shared 50 MB limit across the web UI and REST API, accept
.tifffiles by normalizing them to PNG, and return clearer documented errors when uploads are too large or fail during parsing. The limit can be configured withIMAGE_UPLOAD_MAX_FILE_SIZE. (#210) - API request and response summaries are logged for
/api/*routes without logging bearer tokens or file contents. (#210)
Vmemo 2026.5.17
What's Changed
- fix: 修复反向代理 SSL 重定向循环并完善 local-machine 的 dev 域名验证流程 by @ThaddeusJiang in #206
Full Changelog: 2026.5.16...2026.5.17
Vmemo 2026.5.16
[Vmemo - 2026.5.16] - 2026-05-16
End Users
Added
- Added Vmemo MCP image management tools for searching, creating, reading, updating, and deleting images from MCP-capable AI clients.
- Added MCP image resources so clients can lazily read image URLs, HTML previews, or base64 image data after search results are returned.
- Added image tag management and tag-based classification support.
- Added tag pages so users can browse and review images by tag.
- Added image jobs page and notification integration for background job progress visibility.
Changed
- Changed MCP image search to return lightweight image details and resource references instead of embedding image data in every search result.
- Changed image cards to use a unified dropdown action menu and support delete directly from list view.
- Changed image base64 reading to a unified path for more consistent AI and API behavior.
- Changed background async processing to a top-level Jobs domain/resource model.
Fixed
- Fixed Vmemo MCP image tools returning a server error when requests reached AshAi without an authenticated actor.
- Fixed thumbnail and image file fallback behavior to improve load reliability when optimized variants are unavailable.
- Fixed browser clipboard image upload compatibility across multiple payload formats.
- Fixed REST API clipboard-image upload failures and reduced coupling between upload and AI flow.
- Fixed upload fallback behavior when OpenRouter is unavailable or misconfigured.
- Fixed image file validation and AI-unavailable warning paths to reduce silent failures.
Maintainers
Added
- Added database migrations for tags and jobs, plus a backfill migration to align historical image-processing states with job statuses.
- Added Typesense migration for
memo_images.tagsto support tag faceting.
Fixed
- Fixed Typesense migration tracking behavior to avoid drift between expected and applied schema changes.
What's Changed
- chore(ci): 对齐 local 与 CI 检查策略与顺序 by @ThaddeusJiang in #188
- fix(image): 修复图片缩略图链路与缓存回退问题 by @ThaddeusJiang in #189
- chore(test): 提升核心模块测试覆盖率并稳定全量覆盖率验证 by @ThaddeusJiang in #190
- chore(skills): 统一 Vmemo skills 命名空间与文档语言 by @ThaddeusJiang in #191
- ui: 修复按钮变体使用不一致并统一图标按钮交互 by @ThaddeusJiang in #192
- refactor: 修复 Credo 告警并整理模块别名 by @ThaddeusJiang in #193
- feat(mcp): 添加 Vmemo 图片工具 by @ThaddeusJiang in #195
- feat(images): 统一图片卡片下拉菜单并支持列表删除 by @ThaddeusJiang in #194
- chore: 升级 ex_doc 到 0.40.2 by @ThaddeusJiang in #196
- chore(skills): 整理 AGENTS 文档与技能命名 by @ThaddeusJiang in #197
- refactor: harden file security and replace live-layer Ash.get calls by @ThaddeusJiang in #198
- feat: 图片支持通过标签分类 by @ThaddeusJiang in #199
- refactor: 修复 Typesense 迁移追踪、图片文件校验与 AI 不可达分支告警 by @ThaddeusJiang in #200
- fix(api): 修复浏览器剪贴板图片上传兼容性与安全防护 by @ThaddeusJiang in #201
- fix(api): 修复剪贴板图片通过 REST 上传失败并解耦 AI 流程 by @ThaddeusJiang in #202
- feat: 统一图片 base64 读取入口并清理图像读取路径 by @ThaddeusJiang in #204
- feat(jobs): 将异步任务提升为顶层 Ash 域与资源 by @ThaddeusJiang in #203
Full Changelog: 2026.5.9...2026.5.16
Vmemo 2026.5.9
Release Summary
This release introduces an improved image rotation experience and adjustments to the REST API response conventions.
End Users
Added
- Added image rotation in the image detail dialog with instant on-screen preview, so users can quickly correct incorrect upload orientation.
Changed
- Changed REST API image responses to use HTTP status codes for success/error states, return image detail page URLs for create/show, and include the deleted image
idin delete responses for easier client-side cache updates. - Breaking change (REST API contract):
- Response bodies no longer include a top-level
statusfield for either success or error. - On
DELETE /api/v1/images/:id, a successful response payload now returns onlydata.id(no successmessage). POST/GET /api/v1/imagesnow return image detail page URLs indata.urlinstead of storage file paths.
- Response bodies no longer include a top-level
Fixed
- Fixed the delayed rotation feedback issue where images appeared unchanged until a full page refresh.
Maintainers
Changed
- Updated image file response cache negotiation to use stronger validators (
ETag/Last-Modified) for images updated in storage.
Migration Guide (Client)
- Use the HTTP status code as the single source of truth for success/error.
- Replace checks like
response.status === "success"withresponse.ok(or a status-range check). - For failed requests, read
error.codeanderror.messagefrom the response body. - For delete cache updates, read
response.data.idand invalidate/remove that image id locally.
What's Changed
- ci: test workflow 支持手动执行 by @ThaddeusJiang in #169
- fix(image): 调整图片详情页菜单与 caption 生成入口 by @ThaddeusJiang in #172
- fix(notifications): 修复 all notifications 跳转并新增独立通知页 by @ThaddeusJiang in #171
- ci(e2e): 支持 snapshot 模式显示并取消同 PR 重复运行 by @ThaddeusJiang in #173
- ui: 修复 Toast 状态标题冗余 by @ThaddeusJiang in #174
- feat(image): 支持旋转图片 by @ThaddeusJiang in #170
- fix(api): 统一图片 REST API 响应并修复 CI 用例稳定性 by @ThaddeusJiang in #175
- fix(ui): 统一 tokens 页面与用户菜单交互样式 by @ThaddeusJiang in #176
- feat(search): 优化搜索页图片上传与搜索交互 by @ThaddeusJiang in #177
- chore: 统一 worktree skill 命名并更新中文描述 by @ThaddeusJiang in #179
- chore(skill): 新增 ADR Skill 并对齐 MADR 模板 by @ThaddeusJiang in #180
- chore(decisions): 记录 Ash scope 统一授权并禁用 Postgres RLS 决策 by @ThaddeusJiang in #181
- chore: 将仓库内 skills 迁移到 .agents 目录 by @ThaddeusJiang in #182
- 修复 AI 回复语言未遵循用户 Profile 设置 by @ThaddeusJiang in #178
- 改进 REST API 响应结构:成功返回资源对象,失败返回标准错误对象 by @ThaddeusJiang in #185
- fix(auth): 未登录访问受保护页面时改为当前页显示登录表单 by @ThaddeusJiang in #183
- docs: 补充 Apple Shortcuts 与 AI app MCP 集成指引 by @ThaddeusJiang in #186
- 优化图片上传区域提示文案与多语言支持 by @ThaddeusJiang in #187
Full Changelog: 2026.4.29...2026.5.9
Vmemo 2026.4.29
End Users
Added
- Post-login pages now support English, Chinese, and Japanese.
- Added a global AI Drawer entry so users can open AI chat from anywhere.
- Unified image caption/query flows through the OpenRouter path for more consistent AI behavior.
- Unified light-theme semantic components (Alert/Badge/Toast) for more consistent feedback UI.
- Added independent profile fields (name, avatar, language, appearance).
- Extracted notifications dropdown into a reusable component for more consistent interaction.
Changed
- AI image requests now preprocess large images before calling external vision services, reducing transfer size while keeping original uploads intact in storage.
Fixed
- Aligned visual and interaction details across landing/auth/app pages.
Maintainers
- Change: Runtime URL settings for dev/test are now centralized in
config/runtime.exs.
Migration:- Ensure required variables are set in runtime environment.
- Restart services and verify runtime checks.
Example:
DATABASE_URL=<value>
TYPESENSE_URL=<value>
MOONDREAM_URL=<value>Changed
- Refined worktree workflow: trigger only on explicit request, with standardized create/cleanup steps.
- Docker runtime image now includes ImageMagick so vision preprocessing is always available in production containers.
Release Gate Notes
- Config/env changes were detected against base ref
2026.4.19. - Release proceeded with explicit confirmation from user.
- GitHub Release/tag publishing is handled by CI after merge.
What's Changed
- Main by @ThaddeusJiang in #139
- feat(ui): 优化通知下拉与任务详情交互 by @ThaddeusJiang in #140
- chore(config): 统一 dev/test URL 环境变量并新增 worktree skill by @ThaddeusJiang in #143
- feat(profile): 支持用户级语言与外观设置 by @ThaddeusJiang in #142
- chore(skill): 收紧 worktree 技能触发并增加端口占用预检流程 by @ThaddeusJiang in #144
- fix(ui): 统一页面视觉规范并修复交互回归 by @ThaddeusJiang in #145
- feat(ui): 统一浅色 Alert/Badge/Toast 组件与语义 by @ThaddeusJiang in #147
- chore(config): 移除 dev/test URL 默认值并统一走环境变量 by @ThaddeusJiang in #149
- feat: 统一 OpenRouter caption 流程并清理图片页 Moondream UI by @ThaddeusJiang in #148
- feat(chat): 实现全局 Ash AI by @ThaddeusJiang in #146
- refactor and fix testing by @ThaddeusJiang in #152
- feat(i18n): 登录后页面接入 Gettext 多语言并统一语言切换行为 by @ThaddeusJiang in #153
- chore(changelog): init changelog.md by @ThaddeusJiang in #156
- chore(git): 配置 format pre-commit hook by @ThaddeusJiang in #158
- fix(ui): 统一表单失败反馈与选择器样式 by @ThaddeusJiang in #154
- chore: 统一 local development 与 e2e 的 seed 数据入口 by @ThaddeusJiang in #159
- feat(ai-vision): 调用 AI 前预处理图片以降低传输大小 by @ThaddeusJiang in #161
- chore(worktree): 精简并统一 worktree skill 执行流程 by @ThaddeusJiang in #162
- chore(ci): 接入 ExCoveralls + Codecov 覆盖率反馈 by @ThaddeusJiang in #163
- chore(worktree): 调整 worktree 初始化流程为按需 setup/compose by @ThaddeusJiang in #165
- chore(ci): 调整 PR 标签触发并统一 GitHub PR 技能流程 by @ThaddeusJiang in #164
- chore(release): 2026.4.29 by @ThaddeusJiang in #166
Full Changelog: 2026.4.19...2026.4.29
Vmemo 2026.4.19
What's Changed
- feat: note delete action by @ThaddeusJiang in #22
- feat: 视觉 AI by @ThaddeusJiang in #25
- ci: run typesense inside github actions by @devin-ai-integration[bot] in #29
- 升级到 Phoenix 1.8、Tailwind CSS v4 并移除 Node.js 依赖 by @devin-ai-integration[bot] in #30
- fix by @ThaddeusJiang in #34
- Integrate Tidewave for Phoenix development by @ThaddeusJiang in #35
- feat: 集成 Ash Framework 实现照片和笔记的数据持久化 by @ThaddeusJiang in #36
- feat: replace TsPhoto with Ash resource methods by @ThaddeusJiang in #38
- chore: migrate Ecto Repo to Ash Postgres Repo by @ThaddeusJiang in #40
- 2025 10 31 by @ThaddeusJiang in #43
- feat: 新的初始页面 - 居中布局with logo, search input, and suggestion buttons by @ThaddeusJiang in #44
- chore: 升级 Elixir 到 1.19.2 并添加 mise 版本管理 by @ThaddeusJiang in #50
- feat(moondream): 集成 Moondream Station 实现图片自动描述生成 by @ThaddeusJiang in #52
- chore(monitoring): 替换 AppSignal 为 Sentry by @ThaddeusJiang in #53
- feat/full moondream.ai by @ThaddeusJiang in #55
- feat: /chat, mcp by @ThaddeusJiang in #56
- refactor by @ThaddeusJiang in #58
- feat: admin import file by @ThaddeusJiang in #59
- chore(ci): use GitHub Actions service for Typesense by @ThaddeusJiang in #62
- ci: setup e2e testing by @ThaddeusJiang in #63
- chore(repo): sync deploy config cleanup changes by @ThaddeusJiang in #64
- ci: release by @ThaddeusJiang in #65
- fix(self-hosting): 完善 README 环境变量并更新分支协作规范 by @ThaddeusJiang in #66
- chore(ci): 提取 e2e 镜像构建 action 并拆分 build/e2e 阶段 by @ThaddeusJiang in #69
- feat(docker): 切回 release 启动并补充远程 IEx 文档 by @ThaddeusJiang in #67
- chore(ci): 优化 elixir-checks 中 DB/Typesense setup 耗时 by @ThaddeusJiang in #73
- chore(repo): 将 Vmemo.AshRepo 重命名回 Vmemo.Repo by @ThaddeusJiang in #70
- chore(dev): 统一 setup/reset 约定并收敛开发文档入口 by @ThaddeusJiang in #74
- feat(ci): 拆分 amd64/arm64 发布镜像并沉淀构建耗时决策 by @ThaddeusJiang in #75
- chore: 移除仓库中的 devlog 并改为本地 _local_docs by @ThaddeusJiang in #76
- 修复 release 工作流:支持通过 checkbox 覆盖已存在 Release by @ThaddeusJiang in #77
- 优化 Release 工作流:并行构建多架构镜像并统一发布 tag by @ThaddeusJiang in #78
- chore(docker): 拆分 dev/test 的 Postgres 服务并移除废弃初始化脚本 by @ThaddeusJiang in #79
- 修复多图上传后 note 未正确关联的问题 by @ThaddeusJiang in #80
- 修复 Typesense 空搜索回退与重复 schema 更新日志 by @ThaddeusJiang in #81
- refactor: 所有 Typesense 同步统一从 Ash Resource action 发起 by @ThaddeusJiang in #82
- refactor(core): 统一账号/AI/任务链路并重组文档与部署配置 by @ThaddeusJiang in #86
- chore(ci): release workflow 使用原生 ARM runner 构建镜像 by @ThaddeusJiang in #87
- chore(skill): 新增 create-pr 技能 by @ThaddeusJiang in #88
- 修复 release workflow 默认上传 GitHub artifact 导致配额报错 by @ThaddeusJiang in #90
- chore(skill): 规范 create-pr 标题前缀并补充图片说明 by @ThaddeusJiang in #91
- feat(oban): 统一队列并重构 sync_typesense 的 AshOban 写法 by @ThaddeusJiang in #92
- chore(mix): 精简本地任务并移除低频 reset tasks by @ThaddeusJiang in #93
- fix(ci): 添加非阻塞静态检查并修复告警 by @ThaddeusJiang in #94
- chore(docs): 在本地 reset 流程中清理 storage 目录 by @ThaddeusJiang in #96
- chore(codex): 添加 thaddeusjiang-refactor 重构技能 by @ThaddeusJiang in #97
- feat(db): 重构数据库表为 context_resource 命名并重建迁移 by @ThaddeusJiang in #95
- refactor(domain): 重构领域模块结构与命名边界 by @ThaddeusJiang in #99
- chore(refactor): 按功能内聚重构模块并清理 dialyzer 告警 by @ThaddeusJiang in #98
- chore(typesense): 收敛 Typesense 同步/迁移并优化 e2e 流程 by @ThaddeusJiang in #100
- chore(docs): 统一规范文档并停止跟踪 archive 历史文档 by @ThaddeusJiang in #102
- fix(ci): 修复架构图工作流 Mermaid 生成失败 by @ThaddeusJiang in #103
- feat(upload): 上传页支持会话内已上传照片回显与异步状态一致化 by @ThaddeusJiang in #106
- chore(usage-rules): 安装并将 Phoenix/Ash 规则迁移到 skills by @ThaddeusJiang in #107
- chore(migrations): 重建迁移并统一 Typesense 集合命名 by @ThaddeusJiang in #109
- chore(ci): 简化 release 工作流并统一单一镜像标签 by @ThaddeusJiang in #110
- chore(docs): 更新 self-hosting 与 Cloudflare Tunnel 部署文档 by @ThaddeusJiang in #112
- fix(moondream): 将默认请求超时调整为2分钟 by @ThaddeusJiang in #114
- chore(resource): 资源图切换为 Markdown 并接入 ExDoc Mermaid 渲染 by @ThaddeusJiang in #115
- chore(i18n): 全量翻译项目中文内容为英文 by @ThaddeusJiang in #116
- fix(account): 重置密码后自动确认邮箱 by @ThaddeusJiang in #118
- chore(docker): Compose 默认仅启动 dev 依赖,测试服务通过 profile test by @ThaddeusJiang in #117
- feat(self-hosting): sidecar socat 将宿主 Moondream Station 桥接到容器内 127.0.0.1:2020 by @ThaddeusJiang in #119
- fix(web): 修复404页面背景图在生产环境无法加载的问题 by @ThaddeusJiang in #122
- chore(ci): 拆分多 runner 镜像构建并记录禁用缓存决策 by @ThaddeusJiang in #121
- chore(docs): 拆分 deployment 与 self-hosting 文档体系 by @ThaddeusJiang in #120
- fix(auth): 修复重置密码邮箱匹配与发送日志 by @ThaddeusJiang in #123
- fix(ci): 去 Artifact 化发布链路并按 Label 控制 E2E by @ThaddeusJiang in #124
- fix(memo): 修复 image/note 删除失败并同步清理 Typesense 记录 by @ThaddeusJiang in #125
- chore(ci): 提升 test workflow 环境变量配置可维护性 by @ThaddeusJiang in #126
- chore(ci): 优化 Docker 镜像发布触发与标签策略 by @ThaddeusJiang in #128
- fix(ci): 改为 digest 合并发布避免临时架构标签显示 by @ThaddeusJiang in #130
- fix(ci): 恢复原生多架构发布并清理临时标签 by @ThaddeusJiang in #131
- fix(ci): checkout repository in push_image job by @ThaddeusJiang in #132
- fix(ci): 修复发布 checkout 并同步 guidelines 目录迁移 by @ThaddeusJiang in #133
- chore(skills): add release skill with exs gate scripts by @ThaddeusJiang in #134
- docs(readme): streamline docs navigation and Docker Hub description content by @ThaddeusJiang in #135
- ci(release): 调整发布流程与镜像标签策略 by @ThaddeusJiang in #136
- chore(release): 发布 2026.4.19 并调整 release 自动化流程 by @ThaddeusJiang in #137
- epic: migrate to AshFramework by @ThaddeusJiang in #46
- fix(ci): 修复 create-github-release workflow 版本解析失败 by @ThaddeusJiang in #138
Full Changelog: 2024.12.25...2026.4.19
Vmemo 2024.12.25
Overview
Vmemo is a visual memory application that helps users record life in a visual way rather than with boring, easily forgotten text.
Why Vmemo?
Our brains are naturally inclined to remember visual content better than text. Visual memory is more intuitive, impactful, and easier to review, making it a powerful tool for capturing and retaining life’s moments.
Core Features
- Account and authentication flows: sign up, sign in, password reset, and user settings (Phoenix LiveView).
- Photo upload and browsing: upload entry points, photo detail pages, and list/waterfall browsing.
- Photo deletion and note updates: delete photos from detail pages and maintain note content linked to photos.
- Typesense-powered search: document write/read and hybrid search support for photos and notes.
- File access and web delivery: storage file routes and baseline page experience.