revert: restore previous homepage
This commit is contained in:
1 parent
b36719d359
commit
e679e36722
6 files changed
+67
-289
No files matched your search
@@ -25,10 +25,6 @@ const featureArt = [
|
||||
icon: "bx:bx-shield-quarter",
|
||||
accent: "secure",
|
||||
},
|
||||
{
|
||||
icon: "bx:bx-group",
|
||||
accent: "accounts",
|
||||
},
|
||||
];
|
||||
|
||||
const features = featureCopy.items.map((item, index) => ({ ...item, ...featureArt[index] }));
|
||||
@@ -39,7 +35,7 @@ const features = featureCopy.items.map((item, index) => ({ ...item, ...featureAr
|
||||
<div class="absolute bottom-24 -right-24 w-72 h-72 bg-slate-200/30 rounded-full blur-3xl -z-10"></div>
|
||||
|
||||
<div class="max-w-3xl mb-14 text-center mx-auto">
|
||||
<h2 class="text-4xl font-bold text-slate-900 lg:text-5xl" id="features">
|
||||
<h2 class="text-4xl lg:text-5xl font-bold text-slate-900" id="features">
|
||||
{featureCopy.heading}
|
||||
</h2>
|
||||
</div>
|
||||
@@ -48,7 +44,7 @@ const features = featureCopy.items.map((item, index) => ({ ...item, ...featureAr
|
||||
{
|
||||
features.map((feature) => (
|
||||
<article class="group relative overflow-hidden rounded-[28px] border border-slate-200 bg-white shadow-sm transition-all duration-300 hover:-translate-y-1 hover:border-brand-border hover:shadow-[0_22px_55px_-35px_rgb(var(--edgeever-brand-rgb)/0.55)]">
|
||||
<div class="grid grid-cols-1 lg:min-h-[460px] lg:grid-cols-[minmax(0,1.02fr)_minmax(360px,0.98fr)]">
|
||||
<div class="grid h-[800px] grid-cols-1 sm:h-[760px] md:h-[700px] lg:h-[460px] lg:grid-cols-[minmax(0,1.02fr)_minmax(360px,0.98fr)]">
|
||||
<div class="flex h-full flex-col justify-center p-7 sm:p-9 lg:p-10">
|
||||
<div class="mb-7 flex items-center gap-4">
|
||||
<div class="flex h-14 w-14 shrink-0 items-center justify-center rounded-2xl border border-brand-border/40 bg-brand-soft text-brand-text shadow-sm">
|
||||
@@ -75,7 +71,7 @@ const features = featureCopy.items.map((item, index) => ({ ...item, ...featureAr
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="relative min-h-[320px] overflow-hidden border-t border-slate-100 bg-slate-50/70 sm:min-h-[380px] lg:min-h-full lg:border-l lg:border-t-0">
|
||||
<div class="relative min-h-[220px] overflow-hidden border-t border-slate-100 bg-slate-50/70 md:min-h-full lg:border-l lg:border-t-0">
|
||||
<div class={`feature-art feature-art-${feature.accent}`} aria-hidden="true">
|
||||
{feature.accent === "storage" && (
|
||||
<div class="storage-scene">
|
||||
@@ -177,8 +173,8 @@ const features = featureCopy.items.map((item, index) => ({ ...item, ...featureAr
|
||||
<i></i>
|
||||
</div>
|
||||
<div class="open-doc open-json">
|
||||
<span>EdgeEver ZIP</span>
|
||||
<b>v1</b>
|
||||
<span>JSON</span>
|
||||
<b>{"{ }"}</b>
|
||||
<i></i>
|
||||
<i></i>
|
||||
</div>
|
||||
@@ -186,9 +182,9 @@ const features = featureCopy.items.map((item, index) => ({ ...item, ...featureAr
|
||||
<Icon name="bx:bx-export" class="h-8 w-8" />
|
||||
</div>
|
||||
<div class="open-chips">
|
||||
<em>Markdown</em>
|
||||
<em>Files</em>
|
||||
<em>History</em>
|
||||
<em>API</em>
|
||||
<em>MCP</em>
|
||||
<em>CLI</em>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -226,37 +222,6 @@ const features = featureCopy.items.map((item, index) => ({ ...item, ...featureAr
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{feature.accent === "accounts" && (
|
||||
<div class="accounts-scene">
|
||||
<div class="accounts-instance">
|
||||
<Icon name="bx:bx-cloud" class="h-8 w-8" />
|
||||
<span>One instance</span>
|
||||
</div>
|
||||
<div class="accounts-link accounts-link-owner"></div>
|
||||
<div class="accounts-link accounts-link-member-one"></div>
|
||||
<div class="accounts-link accounts-link-member-two"></div>
|
||||
<div class="account-card account-owner">
|
||||
<span class="account-avatar"><Icon name="bx:bx-crown" class="h-5 w-5" /></span>
|
||||
<strong>Owner</strong>
|
||||
<small>Private workspace</small>
|
||||
</div>
|
||||
<div class="account-card account-member-one">
|
||||
<span class="account-avatar"><Icon name="bx:bx-user" class="h-5 w-5" /></span>
|
||||
<strong>Member</strong>
|
||||
<small>Private workspace</small>
|
||||
</div>
|
||||
<div class="account-card account-member-two">
|
||||
<span class="account-avatar"><Icon name="bx:bx-user" class="h-5 w-5" /></span>
|
||||
<strong>Member</strong>
|
||||
<small>Private workspace</small>
|
||||
</div>
|
||||
<div class="accounts-token">
|
||||
<Icon name="bx:bx-key" class="h-5 w-5" />
|
||||
<span>Isolated MCP tokens</span>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -296,8 +261,7 @@ const features = featureCopy.items.map((item, index) => ({ ...item, ...featureAr
|
||||
.agent-scene,
|
||||
.workspace-scene,
|
||||
.open-scene,
|
||||
.secure-scene,
|
||||
.accounts-scene {
|
||||
.secure-scene {
|
||||
width: min(88%, 460px);
|
||||
aspect-ratio: 1.28;
|
||||
}
|
||||
@@ -324,16 +288,6 @@ const features = featureCopy.items.map((item, index) => ({ ...item, ...featureAr
|
||||
backdrop-filter: blur(12px);
|
||||
}
|
||||
|
||||
.accounts-instance,
|
||||
.account-card,
|
||||
.accounts-token {
|
||||
position: absolute;
|
||||
border: 1px solid rgb(203 213 225 / 0.72);
|
||||
background: rgb(255 255 255 / 0.9);
|
||||
box-shadow: 0 18px 60px -42px rgb(15 23 42 / 0.8);
|
||||
backdrop-filter: blur(12px);
|
||||
}
|
||||
|
||||
.storage-scene {
|
||||
transform: rotate(-2deg);
|
||||
transition: transform 300ms ease;
|
||||
@@ -343,8 +297,7 @@ const features = featureCopy.items.map((item, index) => ({ ...item, ...featureAr
|
||||
.group:hover .agent-scene,
|
||||
.group:hover .workspace-window,
|
||||
.group:hover .open-scene,
|
||||
.group:hover .secure-scene,
|
||||
.group:hover .accounts-scene {
|
||||
.group:hover .secure-scene {
|
||||
transform: translateY(-4px);
|
||||
}
|
||||
|
||||
@@ -853,118 +806,6 @@ const features = featureCopy.items.map((item, index) => ({ ...item, ...featureAr
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.accounts-scene {
|
||||
transition: transform 300ms ease;
|
||||
}
|
||||
|
||||
.accounts-instance {
|
||||
top: 5%;
|
||||
left: 50%;
|
||||
z-index: 2;
|
||||
display: flex;
|
||||
width: 176px;
|
||||
height: 76px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 10px;
|
||||
translate: -50% 0;
|
||||
border-radius: 24px;
|
||||
color: var(--edgeever-brand-text);
|
||||
}
|
||||
|
||||
.accounts-instance span,
|
||||
.accounts-token span {
|
||||
font-size: 12px;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.accounts-link {
|
||||
position: absolute;
|
||||
top: 27%;
|
||||
z-index: 0;
|
||||
width: 2px;
|
||||
height: 92px;
|
||||
transform-origin: top;
|
||||
background: repeating-linear-gradient(
|
||||
180deg,
|
||||
rgb(var(--edgeever-brand-rgb) / 0.42) 0 9px,
|
||||
transparent 9px 16px
|
||||
);
|
||||
}
|
||||
|
||||
.accounts-link-owner {
|
||||
left: 50%;
|
||||
}
|
||||
|
||||
.accounts-link-member-one {
|
||||
left: 50%;
|
||||
rotate: 48deg;
|
||||
}
|
||||
|
||||
.accounts-link-member-two {
|
||||
left: 50%;
|
||||
rotate: -48deg;
|
||||
}
|
||||
|
||||
.account-card {
|
||||
bottom: 15%;
|
||||
z-index: 1;
|
||||
display: grid;
|
||||
width: 132px;
|
||||
min-height: 132px;
|
||||
place-items: center;
|
||||
align-content: center;
|
||||
gap: 7px;
|
||||
padding: 14px;
|
||||
border-radius: 24px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.account-owner {
|
||||
left: 50%;
|
||||
translate: -50% 0;
|
||||
}
|
||||
|
||||
.account-member-one {
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.account-member-two {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.account-avatar {
|
||||
display: grid;
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
place-items: center;
|
||||
border-radius: 16px;
|
||||
background: rgb(var(--edgeever-brand-rgb) / 0.12);
|
||||
color: var(--edgeever-brand-text);
|
||||
}
|
||||
|
||||
.account-card strong {
|
||||
font-size: 13px;
|
||||
color: #0f172a;
|
||||
}
|
||||
|
||||
.account-card small {
|
||||
font-size: 10px;
|
||||
color: #64748b;
|
||||
}
|
||||
|
||||
.accounts-token {
|
||||
right: 4%;
|
||||
bottom: 0;
|
||||
z-index: 3;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 11px 14px;
|
||||
border-radius: 999px;
|
||||
color: var(--edgeever-brand-text);
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.feature-art {
|
||||
padding: 22px;
|
||||
@@ -974,8 +815,7 @@ const features = featureCopy.items.map((item, index) => ({ ...item, ...featureAr
|
||||
.agent-scene,
|
||||
.workspace-scene,
|
||||
.open-scene,
|
||||
.secure-scene,
|
||||
.accounts-scene {
|
||||
.secure-scene {
|
||||
width: min(94%, 360px);
|
||||
}
|
||||
|
||||
@@ -1065,28 +905,5 @@ const features = featureCopy.items.map((item, index) => ({ ...item, ...featureAr
|
||||
right: 0;
|
||||
top: 6%;
|
||||
}
|
||||
|
||||
.account-card {
|
||||
width: 108px;
|
||||
min-height: 118px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.accounts-instance {
|
||||
width: 156px;
|
||||
}
|
||||
|
||||
.accounts-link-member-one {
|
||||
rotate: 43deg;
|
||||
}
|
||||
|
||||
.accounts-link-member-two {
|
||||
rotate: -43deg;
|
||||
}
|
||||
|
||||
.accounts-token {
|
||||
right: 0;
|
||||
padding: 9px 11px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -16,7 +16,7 @@ const copy = siteCopy[locale].guides;
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="mt-8 grid gap-4 md:grid-cols-2 xl:grid-cols-4">
|
||||
<div class="mt-8 grid gap-4 md:grid-cols-3">
|
||||
{
|
||||
copy.items.map((item) => (
|
||||
<a
|
||||
|
||||
@@ -20,13 +20,19 @@ const copy = siteCopy[locale].hero;
|
||||
|
||||
<div class="md:order-1 relative z-10 w-full">
|
||||
{copy.badgeText && (
|
||||
<div class="mb-6 inline-flex items-center gap-2 rounded-full border border-brand-border/30 bg-brand/5 px-3.5 py-1 text-xs text-brand backdrop-blur-sm">
|
||||
<a
|
||||
href={`${getLocalizedPath(locale, "/")}blog?tag=migration`}
|
||||
class="inline-flex items-center gap-2 px-3.5 py-1 mb-6 text-xs text-brand bg-brand/5 border border-brand-border/30 hover:border-brand/40 hover:bg-brand/10 rounded-full backdrop-blur-sm select-none hover:-translate-y-0.5 transition-all duration-300 group/badge cursor-pointer"
|
||||
>
|
||||
<span class="relative flex h-2 w-2">
|
||||
<span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-brand opacity-75"></span>
|
||||
<span class="relative inline-flex rounded-full h-2 w-2 bg-brand"></span>
|
||||
</span>
|
||||
<span class="font-medium text-slate-600">{copy.badgeText}</span>
|
||||
</div>
|
||||
<span class="text-slate-600 font-medium group-hover/badge:text-brand transition-colors">{copy.badgeText}</span>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2.5" stroke="currentColor" class="w-3 h-3 text-slate-400 group-hover/badge:text-brand transition-all duration-300 transform group-hover/badge:translate-x-0.5">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M8.25 4.5l7.5 7.5-7.5 7.5" />
|
||||
</svg>
|
||||
</a>
|
||||
)}
|
||||
<h1 class="text-4xl md:text-5xl xl:text-6xl font-bold text-slate-900 leading-tight">
|
||||
<span class="text-gradient">EdgeEver</span>
|
||||
@@ -61,17 +67,6 @@ const copy = siteCopy[locale].hero;
|
||||
{copy.agentInstall}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<ul class="mt-7 flex flex-wrap gap-x-5 gap-y-3" aria-label={locale === "zh-CN" ? "EdgeEver 核心能力" : "EdgeEver core capabilities"}>
|
||||
{copy.proofs.map((proof) => (
|
||||
<li class="flex items-center gap-2 text-sm font-medium text-slate-600">
|
||||
<span class="flex h-5 w-5 items-center justify-center rounded-full bg-brand-muted text-brand-text">
|
||||
<Icon name="bx:bx-check" class="h-3.5 w-3.5" />
|
||||
</span>
|
||||
{proof}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="py-3 md:order-2 hidden md:flex relative w-full max-w-lg justify-center z-10">
|
||||
|
||||
+42
-76
@@ -28,7 +28,7 @@ export const siteCopy = {
|
||||
"zh-CN": {
|
||||
layout: {
|
||||
defaultDescription:
|
||||
"EdgeEver 是一个部署在自己 Cloudflare 账号中的开源笔记工作区,提供经典三栏体验、富文本与 Markdown 编辑、完整备份恢复、多账户隔离,以及 REST API、OpenAPI 和 MCP。",
|
||||
"EdgeEver 是一个开源、自托管、Cloudflare-native 的现代笔记工作区。保留经典印象笔记的三栏体验,支持富文本、无限嵌套,对 AI Agent 极度友好。采用无服务器架构,日常使用完全免费且无需服务器。",
|
||||
defaultTitle: `EdgeEver - ${siteTaglines["zh-CN"]}`,
|
||||
imageAlt: "EdgeEver 笔记应用截图",
|
||||
ogLocale: "zh_CN",
|
||||
@@ -58,19 +58,18 @@ export const siteCopy = {
|
||||
demo: "在线演示",
|
||||
agentInstall: "通过AI Agent部署",
|
||||
imageAlt: "EdgeEver product preview",
|
||||
badgeText: "数据在自己的 Cloudflare,随时可以完整导出与恢复",
|
||||
proofs: ["经典三栏", "EdgeEver ZIP", "REST API 与 MCP", "多账户隔离"],
|
||||
badgeText: "💡 支持印象笔记、Notion、Memos 零成本平替,双 MCP 自动搬家",
|
||||
},
|
||||
features: {
|
||||
heading: "重新定义个人笔记体验",
|
||||
items: [
|
||||
{
|
||||
title: "无需服务器,日常使用零运维",
|
||||
summary: "运行在 Cloudflare Workers、D1 与 R2 上,不需要购买和维护传统云服务器。",
|
||||
title: "零服务器,零运维,终身完全免费",
|
||||
summary: "彻底告别购买云服务器月租与繁琐维护。利用 Cloudflare 卓越的无服务器架构,个人使用终身免费。",
|
||||
points: [
|
||||
"无需配置 Docker、Nginx 或 SSL 证书,可以通过 AI Agent 协助完成首次部署。",
|
||||
"个人日常使用通常可由 Cloudflare 免费额度覆盖;按当前估算,可容纳约 15 万条短笔记或 5 万张 200KB 图片。",
|
||||
"笔记数据库和附件资源都保存在你自己的 Cloudflare 账号中。",
|
||||
"完全免服务器:无需配置 Docker、Nginx 或证书,一句话即可直接部署至 Cloudflare。",
|
||||
"日常使用完全免费:充分利用 Cloudflare Workers、D1 与 R2 免费级配额(可存 15 万条笔记 + 5 万张图片)。",
|
||||
"数据安全尽在掌握:虽然免服务器,但数据并非存在第三方,而是保存在你自己的 Cloudflare 账号中。",
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -78,46 +77,36 @@ export const siteCopy = {
|
||||
summary: "内置 REST API、OpenAPI schema 与 Remote MCP endpoint,让 AI 助手安全地读取、创建和整理笔记。",
|
||||
points: [
|
||||
"在应用内生成 MCP Token,就能把 EdgeEver 接入 Codex、Claude Code、Antigravity 等工具。",
|
||||
"Agent 可以通过明确授权读取、创建、修改笔记,并查看或恢复笔记历史版本。",
|
||||
"基于这些开放接口,可以进一步实现标签整理、知识地图和跨笔记检索等工作流。",
|
||||
"还可以联动 Notion Database、飞书多维表格等工具,把零散信息整理成结构化数据。",
|
||||
"适合做灵感归纳、自动打标签、知识图谱整理和跨笔记检索。",
|
||||
"还可以联动 Notion Database、飞书多维表格等工具,把日常笔记中的零散信息沉淀为结构化数据。",
|
||||
"API 与 Agent 能力围绕你的私有实例工作,不依赖封闭笔记平台。",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "经典三栏,写作和整理都顺手",
|
||||
summary: "保留笔记本树、笔记列表和主编辑区,同时补齐长期知识库需要的编辑与整理能力。",
|
||||
title: "经典三栏,熟悉但更轻快",
|
||||
summary: "保留印象笔记式的笔记本树、笔记列表和主编辑区,减少迁移后的学习成本。",
|
||||
points: [
|
||||
"支持无限级嵌套笔记本,适合长期沉淀的大型知识库。",
|
||||
"桌面端可在富文本与 Markdown 源码之间切换,笔记历史版本支持对比和恢复。",
|
||||
"笔记本可以拖拽排序和调整层级,笔记支持批量移动与批量合并。",
|
||||
"Chrome/Edge 网页剪藏扩展已完成,目前等待商店上架。",
|
||||
"笔记本可以拖拽排序和调整层级,笔记支持多选移动与多选合并。",
|
||||
"基于 TipTap 的富文本编辑器支持查看笔记历史版本,兼顾流畅写作与内容回溯。",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "开放数据,也能完整恢复",
|
||||
summary: "一份 EdgeEver ZIP 同时兼顾直接阅读与完整恢复,不把你的知识库锁在某个产品里。",
|
||||
title: "数据开放,迁移和导出不被绑架",
|
||||
summary: "笔记内容以结构化 JSON、Markdown 与纯文本多形态保存,便于编辑器、API、搜索和 Agent 分别使用。",
|
||||
points: [
|
||||
"导出包包含 Markdown、Front Matter、嵌套笔记本目录和相对路径附件,可以直接打开阅读。",
|
||||
"版本化结构数据同时保留笔记关系与历史版本,可在 EdgeEver 实例之间完整恢复。",
|
||||
"底层使用基于标准 SQLite 的 Cloudflare D1,也可通过 API、MCP 或 CLI 按需管理。",
|
||||
"内容存放在基于标准 SQLite 的 Cloudflare D1 中,可通过 API、MCP 或 CLI 按需读取。",
|
||||
"支持印象笔记数据导入能力,降低从旧笔记库迁移过来的成本。",
|
||||
"Markdown 面向导入导出和 Agent 使用,降低未来再次迁移的成本。",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "多端无缝同步,不限设备数",
|
||||
summary: "电脑、手机、平板都能直接同步,自建实例让你彻底摆脱商业笔记平台的登录设备数限制。",
|
||||
points: [
|
||||
"自建 API 不限制登录设备数量,可以在电脑、手机和平板间同步。",
|
||||
"不限登录设备数:个人独享自建 API,再也不受商业笔记平台的“只允许登录 2 台设备”等限制。",
|
||||
"支持 PC 与移动端网页访问,也可以安装成 PWA,随手打开就能记。",
|
||||
"已有笔记支持离线草稿与本地同步队列;上传图片前还可在浏览器本地压缩。",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "一个实例,多账户独立空间",
|
||||
summary: "为家人或小团队成员创建账号,每个人都拥有完全隔离的私人笔记工作区。",
|
||||
points: [
|
||||
"实例管理员可以创建、停用成员账号或重置密码,实例不开放公众注册。",
|
||||
"每个成员的笔记本、笔记、附件、回收站和导入导出数据彼此隔离。",
|
||||
"MCP Token 也按成员空间隔离,Agent 只能访问被明确授权的数据。",
|
||||
"已有笔记支持离线编辑草稿和本地同步队列,弱网时也能先写后同步。",
|
||||
],
|
||||
},
|
||||
],
|
||||
@@ -125,7 +114,7 @@ export const siteCopy = {
|
||||
guides: {
|
||||
eyebrow: "EdgeEver Guides",
|
||||
heading: "从部署、迁移到 AI Agent 玩法",
|
||||
description: "先部署自己的实例,再把旧笔记迁过来,最后用 MCP 接入 AI Agent;每一步都有对应的操作指引。",
|
||||
description: "把最关键的上手路径放到显眼位置:先部署自己的实例,再把旧笔记迁过来,最后用 MCP 接入 AI Agent 整理长期知识库。",
|
||||
items: [
|
||||
{
|
||||
title: "AI Agent 一句话部署",
|
||||
@@ -139,12 +128,6 @@ export const siteCopy = {
|
||||
href: "/blog/evernote-migration-guide",
|
||||
cta: "查看迁移指南",
|
||||
},
|
||||
{
|
||||
title: "从 Notion 或 Memos 迁移",
|
||||
summary: "让 AI Agent 同时连接来源与 EdgeEver MCP,把已有内容分批搬进自己的实例。",
|
||||
href: "/blog?tag=migration",
|
||||
cta: "查看迁移方式",
|
||||
},
|
||||
{
|
||||
title: "AI Agent 进阶玩法",
|
||||
summary: "用 MCP 读取真实笔记,生成知识地图、标签建议和个人资料整理工作流。",
|
||||
@@ -157,7 +140,7 @@ export const siteCopy = {
|
||||
"en-US": {
|
||||
layout: {
|
||||
defaultDescription:
|
||||
"EdgeEver is an open-source notes workspace on your own Cloudflare account, with a classic three-pane workflow, rich text and Markdown editing, complete backup and restore, isolated accounts, REST API, OpenAPI, and MCP.",
|
||||
"EdgeEver is an open-source, serverless, 100% free notes workspace with a classic three-pane workflow, rich text, nested notebooks, and remote MCP endpoint.",
|
||||
defaultTitle: `EdgeEver - ${siteTaglines["en-US"]}`,
|
||||
imageAlt: "EdgeEver notes app screenshot",
|
||||
ogLocale: "en_US",
|
||||
@@ -187,19 +170,18 @@ export const siteCopy = {
|
||||
demo: "Live demo",
|
||||
agentInstall: "Install with AI Agent",
|
||||
imageAlt: "EdgeEver product preview",
|
||||
badgeText: "Your data stays in your Cloudflare account and remains fully portable",
|
||||
proofs: ["Three-pane workflow", "EdgeEver ZIP", "REST API & MCP", "Isolated accounts"],
|
||||
badgeText: "💡 Serverless: Migrate from Evernote, Notion & Memos via Dual-MCP",
|
||||
},
|
||||
features: {
|
||||
heading: "A personal notes workspace rebuilt for self-hosting",
|
||||
items: [
|
||||
{
|
||||
title: "No server to maintain",
|
||||
summary: "EdgeEver runs on Cloudflare Workers, D1, and R2 without a traditional server to buy or manage.",
|
||||
title: "No Server, Zero Maintenance, 100% Free",
|
||||
summary: "Say goodbye to server rental fees and complex system management. EdgeEver runs entirely within Cloudflare's free tiers.",
|
||||
points: [
|
||||
"No Docker, Nginx, or SSL configuration is required, and an AI Agent can help complete the first deployment.",
|
||||
"Typical personal use can fit within Cloudflare's free quotas; current estimates are about 150k short notes or 50k images at 200 KB each.",
|
||||
"The notes database and attachments remain in your own Cloudflare account.",
|
||||
"No Server Required: No need for Docker, Nginx, or SSL configuration. Deploy directly to Cloudflare with one simple tool.",
|
||||
"100% Free Forever: Take full advantage of free tiers for Cloudflare Workers, D1, and R2 (supports up to 150k notes and 50k images).",
|
||||
"Full Data Ownership: Serverless doesn't mean third-party storage. All your notes live securely within your own Cloudflare account.",
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -207,28 +189,27 @@ export const siteCopy = {
|
||||
summary: "Built-in REST API, OpenAPI schema, and Remote MCP endpoint let AI assistants read, create, and organize notes safely.",
|
||||
points: [
|
||||
"Generate an MCP token in the app to connect EdgeEver with Codex, Claude Code, Antigravity, and similar tools.",
|
||||
"With explicit authorization, agents can read, create, and update notes, and inspect or restore revision history.",
|
||||
"The open interfaces support workflows such as tag cleanup, knowledge maps, and cross-note retrieval.",
|
||||
"Agents can also connect notes with tools such as Notion databases and Feishu Bitable to create structured data.",
|
||||
"Useful for idea summaries, automatic tagging, knowledge graph cleanup, and cross-note retrieval.",
|
||||
"It can also connect to tools such as Notion databases and Feishu Bitable, turning scattered information from everyday notes into structured data.",
|
||||
"Agent workflows operate on your private instance instead of a closed notes platform.",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "A familiar three-pane workspace",
|
||||
summary: "Notebook tree, note list, and editor stay familiar while adding the tools needed for a long-lived knowledge base.",
|
||||
title: "Classic three-pane workflow",
|
||||
summary: "Notebook tree, note list, and editor stay familiar for Evernote-style migrations.",
|
||||
points: [
|
||||
"Unlimited nested notebooks support long-lived personal knowledge bases.",
|
||||
"On desktop, switch between rich text and Markdown source, then compare or restore earlier revisions.",
|
||||
"Drag notebooks to reorder or change hierarchy, and move or merge notes in batches.",
|
||||
"The Chrome/Edge web clipper is complete and pending store publication.",
|
||||
"A TipTap-based rich text editor includes note version history for reviewing earlier content.",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Open data with complete recovery",
|
||||
summary: "A single EdgeEver ZIP stays directly readable while preserving everything needed for a complete restore.",
|
||||
title: "Open data, easier migration",
|
||||
summary: "Notes are stored as structured JSON, Markdown, and plain text for editors, APIs, search, and agents.",
|
||||
points: [
|
||||
"Exports include Markdown, Front Matter, nested notebook folders, and relative-path attachments for direct access.",
|
||||
"Versioned structured data preserves note relationships and revision history for recovery between EdgeEver instances.",
|
||||
"Content lives in Cloudflare D1, based on standard SQLite, and can also be managed via API, MCP, or CLI.",
|
||||
"Content lives in Cloudflare D1, based on standard SQLite, and can be read via API, MCP, or CLI.",
|
||||
"Evernote import support lowers the cost of moving from an existing notes library.",
|
||||
"Markdown keeps import, export, and agent workflows portable.",
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -237,16 +218,7 @@ export const siteCopy = {
|
||||
points: [
|
||||
"No device limits: self-hosted API means no commercial restrictions on the number of active login devices.",
|
||||
"Open it in the browser or install it as a PWA for quick capture.",
|
||||
"Existing notes support offline drafts and a local sync queue, while images can be compressed locally before upload.",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "One instance, isolated accounts",
|
||||
summary: "Create accounts for family or a small team while giving each person a completely private notes workspace.",
|
||||
points: [
|
||||
"The owner can create or disable member accounts and reset passwords; public registration stays closed.",
|
||||
"Each member has isolated notebooks, notes, attachments, Trash, and import/export data.",
|
||||
"MCP tokens are isolated by workspace, so agents only access explicitly authorized data.",
|
||||
"Existing notes support offline drafts and a local sync queue for weak network conditions.",
|
||||
],
|
||||
},
|
||||
],
|
||||
@@ -254,7 +226,7 @@ export const siteCopy = {
|
||||
guides: {
|
||||
eyebrow: "EdgeEver Guides",
|
||||
heading: "Deploy, migrate, and put AI agents to work",
|
||||
description: "Deploy your own instance, bring over an existing notes library, then connect MCP-powered AI workflows with a guide for every step.",
|
||||
description: "The fastest paths into EdgeEver: deploy your own instance, move an existing Evernote archive, then connect MCP-powered AI workflows.",
|
||||
items: [
|
||||
{
|
||||
title: "Deploy with an AI Agent",
|
||||
@@ -268,12 +240,6 @@ export const siteCopy = {
|
||||
href: "/blog/evernote-migration-guide",
|
||||
cta: "Read migration guide",
|
||||
},
|
||||
{
|
||||
title: "Migrate from Notion or Memos",
|
||||
summary: "Let an AI Agent connect the source and EdgeEver MCP endpoints to move existing content into your own instance in batches.",
|
||||
href: "/blog?tag=migration",
|
||||
cta: "Explore migration paths",
|
||||
},
|
||||
{
|
||||
title: "AI Agent advanced play",
|
||||
summary: "Turn real notes into knowledge maps, tag cleanup plans, and higher-level personal knowledge workflows through MCP.",
|
||||
|
||||
@@ -15,7 +15,7 @@ const homeJsonLd = [
|
||||
name: "EdgeEver",
|
||||
url: siteUrl,
|
||||
inLanguage: "en-US",
|
||||
description: "EdgeEver is an open-source notes workspace on your own Cloudflare account, with complete backup and restore, isolated accounts, and AI Agent access.",
|
||||
description: "EdgeEver is an open-source, self-hosted, Cloudflare-native notes workspace.",
|
||||
},
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
@@ -27,7 +27,7 @@ const homeJsonLd = [
|
||||
operatingSystem: "Web",
|
||||
isAccessibleForFree: true,
|
||||
description:
|
||||
"EdgeEver combines a classic three-pane workflow, rich text and Markdown editing, complete EdgeEver ZIP recovery, isolated accounts, REST API, OpenAPI, and MCP.",
|
||||
"EdgeEver is an open-source, self-hosted, Cloudflare-native notes workspace with a classic three-pane workflow, REST API, OpenAPI schema, and MCP endpoint.",
|
||||
},
|
||||
];
|
||||
---
|
||||
|
||||
@@ -16,7 +16,7 @@ const homeJsonLd = [
|
||||
url: siteUrl,
|
||||
inLanguage: "zh-CN",
|
||||
description:
|
||||
"EdgeEver 是一个部署在自己 Cloudflare 账号中的开源笔记工作区,支持完整备份恢复、多账户隔离和 AI Agent 接入。",
|
||||
"EdgeEver 是一个开源、自托管、Cloudflare-native 的现代笔记工作区。",
|
||||
},
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
@@ -28,7 +28,7 @@ const homeJsonLd = [
|
||||
operatingSystem: "Web",
|
||||
isAccessibleForFree: true,
|
||||
description:
|
||||
"EdgeEver 提供经典三栏体验、富文本与 Markdown 编辑、EdgeEver ZIP 完整恢复、多账户隔离,以及 REST API、OpenAPI 和 MCP。",
|
||||
"EdgeEver 是一个开源、自托管、Cloudflare-native 的现代笔记工作区,保留经典印象笔记三栏体验,并提供 REST API、OpenAPI schema 和 MCP endpoint。",
|
||||
},
|
||||
];
|
||||
---
|
||||
|
||||
Reference in new issue
Block a user