OpenCMO 当前更像一个共享的增长控制台:用户可以进入产品界面、创建项目、运行扫描,但系统还没有真正的账号归属、项目归属和多用户数据隔离。
下一阶段要把 OpenCMO 做成一个小规模免费试用平台:每个人都可以注册、登录,并进入自己的 OpenCMO 增长控制台,操作自己的项目,而不是看到所有人的项目。
本 PRD 暂时不包含订阅、收款、发票、退款、税务和正式商业化。第一版的目标是先验证产品使用、用户隔离和成本控制。
把 OpenCMO 改造成免费试用平台:
- 访客可以从首页输入一个 URL 开始。
- 访客可以注册账号并进入自己的增长控制台。
- 每个用户只能看到自己的项目、扫描、报告、审批、评论草稿和内容动作。
- 管理员可以在
/admin查看整体平台数据。 - 免费试用有明确额度,避免 LLM、搜索、抓取和浏览器自动化成本失控。
- 现有生产项目不能丢,迁移时统一挂到 admin account 下。
第一版不做:
- Stripe / Paddle / 订阅付款。
- 发票、退款、优惠码、税务处理。
- 多人团队协作和多席位计费。
- 复杂组织管理。
- 公开 marketplace。
- 自动化法律文档流转。
这些都等账号隔离和真实试用数据稳定后再做。
可能是 founder、marketer、indie hacker、开发者产品操盘手或 agency operator。
核心需求:
- 快速从一个 URL 开始。
- 在一个控制台里看到 SEO、AI 搜索、SERP、海外社区机会。
- 自己的项目不被其他用户看到。
- 清楚知道免费试用额度和剩余天数。
OpenCMO 运营者。
核心需求:
- 查看注册用户数。
- 查看活跃试用账号。
- 查看高成本动作:扫描、报告、AI action、社区搜索。
- 发现异常和高用量账号。
- 禁用滥用账号。
- 保留现有线上项目的访问权。
中文首页主张:
OpenCMO 免费试用:输入一个 URL,进入你自己的海外增长控制台。
支撑文案:
注册后,每个用户都会获得独立的 OpenCMO 增长控制台。你可以为自己的产品创建项目,扫描 SEO、AI 搜索、SERP、Reddit、Hacker News、X 和垂直社区,并把发现转成评论、内容和页面优化动作。
CTA:
- 主 CTA:
开始免费试用 - 次 CTA:
前往 GitHub - 低优先级 CTA:
联系部署支持
- 用户访问
/zh。 - 首屏看到单行 URL 输入框。
- 用户输入网站 URL。
- 如果未登录,后续实现应跳到
/signup?url=<encoded-url>。 - 注册或登录成功后进入
/console?url=<encoded-url>。 - 控制台用 URL 创建或预填项目。
在 signup 功能实现前,首页 CTA 可以继续指向 /console?url=...,保证本地演示和现有产品链路可用。
新增路由:
/signup/login/console
注册字段:
- Password
- Display name,可选
注册成功后:
- 创建
users记录。 - 创建个人
accounts记录。 - 创建
account_membersowner 关系。 - 创建 HttpOnly session cookie。
- 带着原始
url参数跳转到/console。
登录字段:
- Password
登录成功后:
- 写入 session cookie。
- 返回当前 user 和 active account。
- 跳转到
/console。
登录后的免费试用用户只能看到:
- 自己的项目列表。
- 自己的试用状态。
- 自己的扫描、报告、审批、评论草稿。
- 自己的免费额度使用情况。
不能看到:
- 全局项目列表。
- 其他用户项目名。
- 其他用户报告。
- 其他用户审批队列。
- admin 统计。
新增路由:
/admin
管理员可以看到:
- 用户总数。
- 今日新增用户。
- 活跃试用 account。
- 项目总数。
- 今日扫描次数。
- 本月报告生成次数。
- 高用量账号。
- 最近失败任务。
- 最近注册用户。
第一版 admin action:
- 禁用账号。
- 恢复账号。
- 延长试用。
- 手动调整额度。
默认策略:
- 试用期:14 天。
- 项目上限:3 个。
- 每日扫描:3 次。
- 每月报告:10 份。
- AI chat / AI action:按 usage event 限制。
环境变量:
OPENCMO_SIGNUP_MODE=open
OPENCMO_TRIAL_DAYS=14
OPENCMO_FREE_MAX_PROJECTS=3
OPENCMO_FREE_DAILY_SCANS=3
OPENCMO_FREE_MONTHLY_REPORTS=10
OPENCMO_ADMIN_EMAIL=hello@aidcmo.com
OPENCMO_COOKIE_SECRET=replace-me注册模式:
open:任何人可注册。invite:需要邀请码,后续实现。closed:关闭注册。
第一版建议支持 open 和 closed,invite 可以第二批再做。
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT NOT NULL UNIQUE,
password_hash TEXT NOT NULL,
name TEXT NOT NULL DEFAULT '',
role TEXT NOT NULL DEFAULT 'user',
status TEXT NOT NULL DEFAULT 'active',
created_at TEXT NOT NULL DEFAULT (datetime('now')),
last_login_at TEXT
);
CREATE TABLE accounts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
plan TEXT NOT NULL DEFAULT 'free_trial',
status TEXT NOT NULL DEFAULT 'active',
trial_started_at TEXT NOT NULL DEFAULT (datetime('now')),
trial_ends_at TEXT NOT NULL,
max_projects INTEGER NOT NULL DEFAULT 3,
daily_scan_limit INTEGER NOT NULL DEFAULT 3,
monthly_report_limit INTEGER NOT NULL DEFAULT 10,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE account_members (
account_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
role TEXT NOT NULL DEFAULT 'owner',
created_at TEXT NOT NULL DEFAULT (datetime('now')),
PRIMARY KEY (account_id, user_id),
FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE sessions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
token_hash TEXT NOT NULL UNIQUE,
expires_at TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE usage_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
account_id INTEGER NOT NULL,
user_id INTEGER,
project_id INTEGER,
event_type TEXT NOT NULL,
metadata TEXT NOT NULL DEFAULT '{}',
created_at TEXT NOT NULL DEFAULT (datetime('now')),
FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE SET NULL
);给 projects 增加归属:
ALTER TABLE projects ADD COLUMN account_id INTEGER;
CREATE INDEX idx_projects_account_id ON projects(account_id);迁移策略:
- 用
OPENCMO_ADMIN_EMAIL创建 admin 用户。 - 创建 admin account。
- 把现有所有项目挂到 admin account。
- 确认没有
account_id IS NULL的项目。 - 之后所有新项目都必须带
account_id。
新增:
POST /api/v1/auth/signupPOST /api/v1/auth/loginPOST /api/v1/auth/logoutGET /api/v1/auth/me
Session 要求:
- 使用 HttpOnly cookie。
- 生产环境 cookie 必须
Secure。 SameSite=Lax。- session token 在 SQLite 中只存 hash。
- 默认过期时间 30 天。
密码要求:
- 使用
argon2或bcrypt。 - 最低 8 位。
- Email 统一转 lowercase。
每个已登录请求都要解析:
current_usercurrent_accountis_admin
普通用户 API 不能从请求里接受 account_id。账号范围必须来自 session。
需要改造存储和服务函数:
list_projects(account_id)get_project(project_id, account_id)delete_project(project_id, account_id)create_project(..., account_id)
所有 /api/v1/projects/{project_id}/... 路由必须先校验项目是否属于当前 account。
返回策略:
- 如果项目不属于当前用户,返回 404,避免泄露项目存在。
- admin 全局查询只能放在
/api/v1/admin/*。
高成本动作执行前要检查额度:
- 新建项目。
- 启动扫描。
- 生成报告。
- AI chat。
- 社区搜索。
- 图谱扩展。
第一版先强制限制:
- 项目数量。
- 每日扫描次数。
- 每月报告数量。
新增:
/signup/login/admin
保留:
/console/workspace作为历史兼容入口,跳转到/console。
首页必须围绕免费试用平台表达:
- Hero 说明每个用户都有自己的增长控制台。
- URL 输入框仍然是第一动作。
- 主 CTA 是
开始免费试用。 - 产品预览展示试用额度和个人项目隔离。
- 页面解释三步:注册、创建项目、运行增长扫描。
- 明确说明数据隔离。
- 保留 GitHub / 开源证明,但不能压过免费试用 CTA。
控制台需要展示:
- 当前试用状态。
- 剩余天数。
- 项目额度使用情况。
- 今日扫描额度。
- 报告额度。
第一版不展示付款入口,最多预留后续升级位置。
/admin 与普通增长控制台分离。
第一版页面:
- Summary cards。
- Recent users table。
- Recent accounts table。
- Usage table。
- Failed tasks panel。
必须做:
- 密码 hash。
- HttpOnly session cookie。
- cookie auth 下的 CSRF 策略。
- 注册 / 登录限流。
- admin 路由强制 role 校验。
- 普通用户 API 不接受手写
account_id。 - 跨 account 项目请求不泄露存在性。
- 生产迁移前备份 SQLite。
建议做:
- admin action audit log。
- account disable 开关。
- 密码重置后清理 session。
- 提高额度前要求邮箱验证。
第一版统计:
total_usersnew_users_todayactive_trial_accountsexpired_trial_accountstotal_projectsprojects_created_todayscans_todayreports_this_monthhigh_usage_accountsfailed_tasks_24h
- 本地实现 schema migration。
- 本地创建 admin 用户。
- 本地把现有项目挂到 admin account。
- 确认 admin 登录后仍能看到旧项目。
- 确认新用户项目列表为空。
- 确认新用户不能请求 admin 项目 ID。
- 部署前备份 New York 的
/opt/OpenCMO/opencmo.db。 - 同步代码。
- 运行迁移。
- 重启
opencmo。 - 验证
/zh、/console、signup/login、项目创建、admin summary。
- A 用户创建项目后,B 用户看不到。
- B 用户请求 A 用户项目详情返回 404 或 403。
- B 用户不能对 A 用户项目触发扫描或报告。
/api/v1/projects对不同用户返回不同数据。
- 新用户可以注册。
- 新用户自动获得个人 account。
- 新用户可以创建不超过免费额度的项目。
- 扫描额度会被执行。
- 控制台能看到剩余试用天数和额度。
- admin 可以打开
/admin。 - 普通用户打不开
/admin。 - admin 可以看到全局统计。
- admin 可以禁用账号。
- 现有项目仍然归 admin 可见。
- 没有项目丢失或孤立。
/workspace仍然跳转到/console。- 首页 CTA 可用。
- 写本 PRD。
- 首页改成免费试用平台表达。
- 保持
/console可用。 - 不引入真实 auth。
- 新增 users / accounts / account_members / sessions。
- 新增 signup / login / logout / me API。
- 新增 signup / login 页面。
- 写入 HttpOnly session cookie。
- 给 projects 加
account_id。 - 迁移旧项目到 admin account。
- 改造 project storage API。
- 所有 project route 做归属校验。
- 新增 usage_events。
- 限制项目、扫描、报告。
- 控制台展示试用状态。
- 新增
/admin。 - 新增 admin summary API。
- 展示用户、账号和用量。
- 备份生产 DB。
- 部署代码。
- 运行迁移。
- smoke test。
- 观察日志和高成本动作。
- 试用期最终是 14 天还是 30 天?
- 生产一开始是否直接
open,还是先用invite? - 跑扫描前是否要求邮箱验证?
- 第一批法律页面是否先做 Terms / Privacy / Security?
- 免费试用使用服务端默认 key,还是要求用户 BYOK?
建议第一版采用:
OPENCMO_SIGNUP_MODE=open- 14 天免费试用
- 3 个项目
- 每天 3 次扫描
- 每月 10 份报告
- 不接支付
- 不做团队成员
- 旧项目全部归 admin account
这条路径能最快把 OpenCMO 从单项目工具升级成真正的平台,同时控制数据隔离风险和运行成本。