MarkSyncr is a cross-browser extension that enables two-way bookmark synchronization between browsers and external storage sources (local files, GitHub repos, Dropbox).
翻译准备中
正在加载完整 README。
查看完整 README ↗Cross-browser bookmark sync extension with cloud storage support.
MarkSyncr is a browser extension that enables two-way bookmark synchronization between browsers and external storage sources. Sync your bookmarks across devices using your own storage (GitHub, Dropbox, Google Drive) or our managed cloud service.
The extension ships a lightweight, uBlock-Origin-Lite-style content blocker. Blocking is done natively by the browser through Manifest V3 declarativeNetRequest static rulesets, so there is no per-request JavaScript and no broad host permissions are requested.
Toggle the whole blocker on/off, or enable/disable individual lists, from the Shield tab in the popup. State is persisted and re-applied on every browser start.
Per-site allowlist — "Disable on this site" turns blocking off for the current domain via
a higher-priority dynamic allow rule (priority 2 > the priority-1 block rules), so that one
site is exempt while everything else stays blocked. Uses the activeTab permission to read the
current domain.
Cross-device sync — when signed in, the master/list/allowlist preferences persist to the
user's cloud settings (/api/settings → user_settings.settings.adblock) and are pulled back
on other devices. Signed-out users keep everything locally.
Rulesets are generated from the vendored filter lists in apps/extension/filters/*.txt
(EasyList, EasyPrivacy) by apps/extension/scripts/build-filters.js, which converts the
network-blocking rules into apps/extension/public/rules/*.json. Only rules that map exactly
to declarativeNetRequest are kept (cosmetic/element-hiding rules are skipped), and each list is
capped at 15k rules (30k combined) to stay within the cross-browser enabled-rule limit. Because
every rule is an equal-priority block, order is irrelevant — so the converter injects a curated
set of high-value ad/tracker domains (e.g. googlesyndication, criteo, amazon-adsystem) first and
ranks whole-domain ||domain^ blocks ahead of narrow path rules, ensuring the biggest networks
are covered despite the cap.
Regenerate after updating the lists: bun run --filter @marksyncr/extension build:filters
(the full build runs it automatically). Refresh the lists with:
curl -sSL https://easylist.to/easylist/easylist.txt -o apps/extension/filters/easylist.txt
curl -sSL https://easylist.to/easylist/easyprivacy.txt -o apps/extension/filters/easyprivacy.txt
This is a monorepo managed with Bun workspaces and Turborepo:
marksyncr/
├── apps/
│ ├── web/ # Next.js web app (marksyncr.com)
│ └── extension/ # Browser extension (Chrome/Firefox)
├── packages/
│ ├── core/ # Sync engine, diff, conflict resolution
│ ├── sources/ # Storage integrations (GitHub, Dropbox, etc.)
│ └── types/ # Shared JSDoc types
├── supabase/
│ └── migrations/ # Database schema
└── plans/
└── architecture.md # System design documentation
# Clone the repository
git clone https://github.com/yourusername/marksyncr.git
cd marksyncr
# Install dependencies
bun install
# Set up git hooks (runs build and tests before each commit)
./scripts/setup-hooks.sh
# Start development
bun run dev
# Build all packages
bun run build
# Run tests
bun run test
cd apps/web && bun run dev - Runs on http://localhost:3000cd apps/extension && bun run dev - Builds to dist/ for loading in browser# Build for all browsers
cd apps/extension
bun run build
# Build for specific browser
bun run build:chrome
bun run build:firefox
Chrome:
chrome://extensions/apps/extension/dist/chromeFirefox:
about:debugging#/runtime/this-firefoxapps/extension/dist/firefox/manifest.jsonCopy .env.example to .env.local in each app directory:
apps/web/.env.local:
NEXT_PUBLIC_SUPABASE_URL=your-supabase-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
COINPAY_API_KEY=your-coinpay-business-key
COINPAY_WEBHOOK_SECRET=your-coinpay-webhook-secret
supabase/migrations/001_initial_schema.sqlPro and Team are sold as prepaid terms (1 month or 1 year) through CoinPay hosted
checkout: the buyer pays in crypto or with PayPal. Prices live in apps/web/lib/coinpay.js.
以上为 README 的开头部分。其余内容请阅读原文。 查看完整 README ↗