把浏览器新标签页变成 macOS 启动台 风格的收藏夹:
- 圆角 squircle 图标网格 + 白色 favicon + 标签阴影
- 自动抓取 网页 favicon(多源回退:
/favicon.ico→ DuckDuckGo → Google s2),离线/失败时用首字母 + 渐变色兜底 - 自定义图标:上传本地图片 / Emoji / 字母 + 渐变色 / 直接填写图标 URL
- 顶部搜索框,跨页滚轮翻页、边缘悬停翻页、键盘左右箭头
- 拖拽重排(边缘自动翻页)、空白右键进入编辑模式(图标抖动 + 删除徽章)
- 7 套内置 macOS 风格壁纸(Sonoma / Monterey / Big Sur / Mojave / Ocean / Sakura / 深色),支持上传自定义背景,可调模糊与暗化
- 列数自适应 / 固定,图标大小、标签字号可调
- 多搜索引擎(Google / Bing),可隐藏搜索框
- 导入 / 导出 JSON 备份,从浏览器书签一键导入(按需申请
bookmarks权限) - 多浏览器共享:指定一个共享 JSON 文件(放在云同步目录),顶栏同步图标一键拉取、设置里手动保存/加载,让 Chrome / Edge / Brave 共用同一套数据
- 便签:顶栏便签按钮切换独立便签视图,支持新建 / 编辑 / 删除、6 种颜色,随数据一起保存到 JSON
- 数据本地存储(
chrome.storage.local),不上传任何信息
零构建步骤,下载即用。
itab/
├── manifest.json # MV3 清单
├── newtab.html # 起始页(chrome_url_overrides 入口)
├── css/launchpad.css # 启动台样式
├── js/
│ ├── store.js # 数据层(chrome.storage.local + localStorage 降级)
│ ├── filestore.js # 多浏览器共享(File System Access API 读写指定 JSON 文件)
│ ├── favicon.js # favicon 多源回退 / Emoji / 字母 / 上传 工具
│ ├── launchpad.js # 网格渲染 / 分页 / 拖拽 / 搜索
│ ├── app.js # 顶层交互(弹窗、设置、导入导出、背景)
│ └── bg.js # service worker
├── img/ # 扩展图标 (16/32/48/128)
├── tools/make_icons.py # 重新生成图标(无依赖)
└── _locales/zh_CN/ # 中文 locale
- 打开浏览器扩展页:
- Chrome:
chrome://extensions - Edge:
edge://extensions - Brave:
brave://extensions
- Chrome:
- 打开右上角 「开发者模式」。
- 点击左上角 「加载已解压的扩展程序」,选择本仓库根目录(包含
manifest.json的目录)。 - 打开新标签页即可看到启动台。
Firefox:manifest 是 MV3,Firefox 121+ 已支持 MV3 起始页覆盖(
chrome_url_overrides.newtab)。如不可用,可临时把manifest.json的manifest_version改为 Firefox 兼容写法。
| 操作 | 效果 |
|---|---|
| 单击图标 | 打开站点(默认新标签,可在设置改) |
| 右键图标 | 编辑当前站点 |
| 右键空白 | 进入编辑模式(图标抖动 + 删除按钮) |
| 双击空白 | 快速添加站点 |
| 拖拽图标 | 重排;拖到屏幕左/右边缘 0.5s 自动翻页 |
| 滚轮 / 触摸板 | 翻页 |
| ← / → | 翻页 |
| 顶部搜索框 | 即时过滤;回车打开首个匹配或调用当前搜索引擎;b::关键词 强制 Bing、g::关键词 强制 Google |
| 点击放大镜图标 | 展开聚合搜索下拉,切换搜索引擎(Google / Bing),切换后若已有关键词会直接用新引擎搜索 |
| 点击顶栏便签图标 | 切换便签视图,新建 / 编辑 / 删除便签(6 种颜色) |
| 点击顶栏同步图标(循环双箭头) | 从共享文件拉取最新数据;未指定共享文件时先弹出选择 |
Esc |
退出编辑模式 / 关闭弹窗 |
{
"version": 1,
"items": [
{
"id": "iabc1234",
"title": "GitHub",
"url": "https://github.com",
"icon": { "type": "auto", "value": "" },
"iconSource": "google",
"openIn": "new",
"group": "开发"
},
{
"id": "iabc5678",
"title": "我的博客",
"url": "https://blog.example.com",
"icon": { "type": "letter", "value": "M", "bg": ["#6366F1", "#22D3EE"] },
"openIn": "new",
"group": ""
}
],
"notes": [
{
"id": "niabc123",
"text": "记得交周报",
"color": "#FEF08A",
"createdAt": 1725868800000,
"updatedAt": 1725868800000
}
],
"settings": {
"background": "sonoma",
"customBg": "",
"bgBlur": 22,
"bgDim": 18,
"columns": 7,
"autoColumns": true,
"iconSize": 76,
"labelSize": 13,
"showLabels": true,
"showSearch": true,
"searchEngine": "google",
"openIn": "new",
"iconSource": "auto",
"groupMode": false,
"groupOrder": ["开发", "AI", "中文"]
}
}icon.type 可选值:
auto— 多源 favicon 回退,失败时用首字母渐变upload— 自定义上传(value为 dataURL)emoji— Emoji 图标(value为 emoji 字符)letter— 字母 + 渐变(value为字母,bg: [c1, c2])url— 自定义图标 URL(value为 https URL)
item.iconSource 可选值(每个收藏独立,缺省时回退到全局默认 settings.iconSource):
auto— 自动多源回退(/favicon.ico→ Google s2 → DuckDuckGo)duckduckgo— 仅 DuckDuckGogoogle— 仅 Google s2direct— 仅/favicon.ico
编辑弹窗里的「来源」是当前收藏单独设置;设置面板里的「默认图标源」是全局默认(用于新建收藏、以及没有单独设置过的旧收藏)。
数据存放在哪? 默认写入 chrome.storage.local(键 itab.v1),物理位置在各浏览器 Profile 下的:
<Profile>/Local Extension Settings/<扩展ID>/ (LevelDB 二进制格式)
例如 Chrome:~/Library/Application Support/Google/Chrome/Default/Local Extension Settings/<扩展ID>/。这是二进制 LevelDB,每个浏览器、每个扩展 ID 各自独立,无法跨浏览器直接共用。
让多个浏览器共用一套 JSON:扩展内新增「指定文件存放」能力(基于 File System Access API,手动触发):
- 在一个云同步目录(iCloud / Dropbox / OneDrive)或共享路径里准备一个
.json文件(可先「导出 JSON」生成一份)。 - 每个浏览器打开「设置 → 数据」,点「选择共享文件…」指向同一个文件。
- 在一处改完收藏后「保存到文件」;到另一个浏览器点顶栏的同步图标(循环双箭头)或「从文件加载」即可拉取最新数据。
说明:
- 同步为手动触发,不会自动读写文件(macOS 扩展环境下的 File System Access API 权限不持久,自动同步不可靠)。
- 文件句柄按浏览器分别保存在各自的 IndexedDB 中,所以每个浏览器都要各自「选择共享文件」一次。
- 若浏览器不支持该 API(如部分 Brave 未开开关、Firefox),会回退提示使用「导入 / 导出 JSON」。
在「设置 → 布局 → 分组模式」开启后,收藏会按 item.group 字段归类显示:
- 同一分组的图标聚在一个分区里,分区带标题、计数胶囊和
+按钮 - 标题旁的
+按钮会预填该分组名后弹出添加框 - 分组顺序 =
settings.groupOrder,为空时按首次出现顺序;未分组的项归到「未分组」并固定放在最后 - 右侧「分组排序」侧边栏:纵向列出所有分组,拖拽即可重排(
⠿手柄),顺序即时保存并重渲染 - 顶部搜索过滤时自动隐藏没有匹配的分组
- 分页器隐藏,整体改为垂直滚动
- 关闭后恢复原启动台平铺分页,
group字段保留
添加或编辑站点时,弹窗的「分组」字段支持自由输入;输入框带 datalist 自动补全已有的分组名。
当前版本在分组模式下禁用了图标拖拽重排(避免跨组语义混乱),分组排序统一在右侧侧边栏完成;编辑模式(删除、编辑)照常可用。
| 参数 | 效果 |
|---|---|
?bg=sonoma|monterey|bigsur|mojave|ocean|sakura|dark |
临时切换背景(不持久化) |
?blur=10&dim=20 |
临时调模糊与暗化 |
?edit=1 |
强制进入编辑模式 |
?demo=1 |
打开「添加站点」弹窗 |
?settings=1 |
打开「设置」弹窗 |
?group=1 |
临时开启分组模式 |
?fresh=1 |
把 items 重置为默认示例(含分组) |
?order=开发,AI,中文 |
临时指定分组显示顺序(逗号分隔,需 URL 编码中文) |
?se=1 |
展开搜索引擎下拉菜单 |
?notes=1 |
打开便签视图 |
注意:在扩展环境下 URL 参数被 Chrome 忽略(
newtab没有 query string),仅作为本地file://或 HTTP 预览时调试用。
任一起一个静态文件 server,例如:
cd itab
python3 -m http.server 8090
# 浏览器打开 http://127.0.0.1:8090/newtab.html预览模式下数据保存在 localStorage,与扩展的 chrome.storage.local 互不影响。
python3 tools/make_icons.py生成 16/32/48/128 四张 PNG(无任何外部依赖)。
MIT