Zero-Backend, Local-First Chrome Bookmark Workstation & New Tab OS
Syncly transforms Chrome new tab page into a high-performance productivity cockpit operating directly over native Chrome bookmarks with contextual workspaces, cross-folder collections, instant fuzzy search, and zero telemetry.
100% Local Sovereignty
Operates directly over chrome.bookmarks and chrome.storage.local. Zero cloud servers, zero external accounts, zero tracking.
Quota-Proof Cross-Device Sync
Workspaces use the w- prefix under Other Bookmarks to sync natively across all your devices via Chrome account transport.
Clean Domain-Driven Architecture
Strict separation of Domain invariants, Application use cases with ports, and a frozen DI container.
Zero-Build Vanilla ES Modules
Pure native modern JavaScript with no bundler bloat, sub-500ms first paint, and 273+ automated tests.
Get Started with Syncly in Under 60 Seconds
Clone the repository, load unpacked in Chrome developer mode, and start organizing your native bookmarks instantly.
- Google Chrome 114+ (or any Chromium browser: Brave, Edge, Arc)
- Git 2.40+
- Node.js 20+ (optional, only for running unit tests & perf harness)
- Zero build tools or npm dependencies required for runtime execution
Clone the Repository
Clone the official Syncly open-source repository to your local workspace.
git clone https://github.com/KamrulIslamArnob/Syncly.git cd Syncly
Open Chrome Extensions Manager
Navigate to the extension management interface directly in your browser address bar.
chrome://extensions
Enable Developer Mode
Toggle the "Developer mode" switch in the top-right corner of the extensions page.
Load Unpacked Extension
Click "Load unpacked" in the top-left toolbar and select the root Syncly repository directory.
Runtime Installation & Extension Packaging Modes
Syncly runs as a zero-build vanilla ES modules extension in Chrome, with automated packaging scripts for distribution.
Standard Developer Mode (Zero-Build Runtime)
Load the repository root directly as an unpacked extension in Chrome developer mode with instant hot-reload on file edits.
# No npm install required for extension runtime # Open chrome://extensions -> Load unpacked -> Select Syncly root directory
Automated Test Suite Runner
Execute the complete 273-test verification suite covering domain entities, use cases, and storage clients.
node --test
Puppeteer Performance Baseline Harness
Launch the automated Puppeteer performance harness to benchmark first paint latency and memory footprints.
node scripts/perf-baseline.mjs
| Target Platform | Build Command | Artifact Output |
|---|---|---|
| Chrome Web Store Zip Distribution | node scripts/package.mjs | dist/syncly-v1.0.0.zip |
| Self-Hosted Unpacked CRX Package | chrome --pack-extension=. | syncly.crx & syncly.pem |
| Automated Smoke Validation | node scripts/smoke.mjs | Verified Manifest V3 & HTML modules integrity |
Core Workflows & Daily Operations
Master workspaces, collections, omni-search, and automated local disk backups.
Contextual Workspace Scoping
Partition your bookmark folders into dedicated contexts without altering your underlying raw Chrome bookmarks.
Instant Omni-Search & Tag Filtering
Sub-millisecond fuzzy search modal across titles, URLs, and custom #tags with Ctrl+K shortcut.
One-Click Quick-Add Toolbar Capture
Capture, categorize, and tag the active tab without interrupting your current workflow.
Automated Local File System Snapshots
Zero-telemetry disaster recovery via the File System Access API and IndexedDB.
Domain Entities, Value Objects & Storage Schemas
Inspect TypeScript definitions and authoritative storage schemas governing Syncly architecture.
Master user preferences entity enforcing strict invariant boundaries via private # fields.
export class UserSettings {
#name;
#background;
#themePreset;
#timeFormat;
#clocks;
#searchEnabled;
#searchEngine;
#weatherEnabled;
#todoEnabled;
#customCss;
constructor({
name = '',
background = new BackgroundConfig({ kind: 'solid_color', value: '#0B251A' }),
themePreset = 'minimal',
timeFormat = '24h',
clocks = [],
searchEnabled = true,
searchEngine = 'google',
weatherEnabled = false,
todoEnabled = true,
customCss = ''
} = {}) {
this.#name = this.#sanitizeName(name);
this.#background = background;
this.#themePreset = themePreset;
this.#timeFormat = timeFormat;
this.#clocks = clocks;
this.#searchEnabled = Boolean(searchEnabled);
this.#searchEngine = searchEngine;
this.#weatherEnabled = Boolean(weatherEnabled);
this.#todoEnabled = Boolean(todoEnabled);
this.#customCss = customCss;
}
toJSON() {
return {
name: this.#name,
background: this.#background.toJSON(),
themePreset: this.#themePreset,
timeFormat: this.#timeFormat,
clocks: this.#clocks,
searchEnabled: this.#searchEnabled,
searchEngine: this.#searchEngine,
weatherEnabled: this.#weatherEnabled,
todoEnabled: this.#todoEnabled,
customCss: this.#customCss
};
}
}Bookmark entity governing title sanitization, category binding, order sorting, and access tracking.
export class Bookmark {
#id;
#title;
#url;
#categoryId;
#order;
#lastAccessed;
#accessCount;
#faviconUrl;
constructor({ id, title, url, categoryId, order = 0, lastAccessed = null, accessCount = 0, faviconUrl = '' }) {
this.#id = id;
this.#title = this.#validateTitle(title);
this.#url = url instanceof Url ? url : new Url(url);
this.#categoryId = categoryId;
this.#order = Number.isInteger(order) && order >= 0 ? order : 0;
this.#lastAccessed = lastAccessed;
this.#accessCount = accessCount;
this.#faviconUrl = this.#normalizeFaviconUrl(faviconUrl);
}
recordAccess(timestamp = Date.now()) {
this.#lastAccessed = timestamp;
this.#accessCount += 1;
}
}Synchronous publish/subscribe event bus governing real-time reactive updates across extension surfaces.
export class EventBus {
#handlers = new Map();
on(event, handler) {
if (!this.#handlers.has(event)) {
this.#handlers.set(event, new Set());
}
this.#handlers.get(event).add(handler);
return () => this.off(event, handler);
}
off(event, handler) {
const set = this.#handlers.get(event);
if (set) {
set.delete(handler);
if (set.size === 0) this.#handlers.delete(event);
}
}
emit(event, payload) {
const set = this.#handlers.get(event);
if (set) {
for (const handler of set) {
try {
handler(payload);
} catch (err) {
console.error(`[EventBus] Error in handler for ${event}:`, err);
}
}
}
}
}chrome.storage.local (Key-Value Relational Cache)
Local on-disk extension storage holding categories, bookmarks, tasks, and widget layout positions.
// Key-Value Collections Schema stored in chrome.storage.local
{
"settings": UserSettingsJSON,
"categories": Array<CategoryJSON>,
"bookmarks": Array<BookmarkJSON>,
"tasks": Array<TaskJSON>,
"layout": Array<WidgetLayoutJSON>,
"quickNote": string,
"lastBackupTimestamp": number
}chrome.storage.sync (Metadata Mirror Transport)
Quota-safe cross-device mirror holding small lightweight workspace preferences and tag definitions.
// Metadata Mirror Schema stored in chrome.storage.sync (~8KB per item limit)
{
"workspace_registry": Array<{ id: string, name: string, folderName: string }>,
"active_theme": string,
"tag_index": Record<string, Array<string>> // tag -> Array<bookmarkId>
}chrome.bookmarks Tree (Authoritative Hierarchy Transport)
Native Chrome bookmarks tree utilizing the w- prefix convention under Other Bookmarks.
// Native Chrome Bookmark Folder Hierarchy
Roots:
├── Bookmarks Bar
└── Other Bookmarks
├── w-Work [Auto-discovered Workspace: "Work"]
├── w-Development [Auto-discovered Workspace: "Development"]
├── w-Design [Auto-discovered Workspace: "Design"]
└── w-Personal [Auto-discovered Workspace: "Personal"]Clean Architecture & Reactive Event Pipeline
Explore the 4-tier clean architecture: Domain, Application Ports, Infrastructure, and Presentation.
Business Invariants & Value Objects
Owns pure business logic and invariants (UserSettings, Bookmark, Task, Category, Url, BackgroundConfig). Knows nothing about Chrome APIs, DOM, or storage.
Use Cases & Port Interfaces
Orchestrates domain entities through ports (EventBus, StoragePort, ClockPort, WeatherService, SanitizerPort). ~35 dedicated use case classes.
Chrome APIs, Storage & Services
The sole layer interacting with chrome.storage, chrome.bookmarks, File System Access API, IndexedDB, and external fetch endpoints. Houses DI composition root.
NewTab, Popup, Options & Sidepanel
Pure vanilla JavaScript controllers and view components. Communicates solely through the frozen DI container, listening for EventBus events.
End-to-End Walkthrough: Adding a Bookmark & Reactive Multi-Tab Sync
Follow the exact data flow from toolbar popup click to new-tab dashboard re-render.
User Opens Quick-Add Popup
Form Submission & Validation
Persistence in Local Storage & Bookmarks
EventBus Broadcast & Cross-Tab Sync
Interactive 60s Safety Approval Simulator
Experience the human-in-the-loop safety countdown and anti-replay single-use token architecture.
Configuration Parameters & Theme Settings
Customize backgrounds, font styles, clock widgets, and search engine bindings.
| Variable Key | Required | Default | Description |
|---|---|---|---|
| themePreset | Optional | minimal | Theme visual style: minimal | nord | cyberpunk | sage |
| timeFormat | Optional | 24h | Clock format display mode: 12h | 24h |
| searchEngine | Optional | Default search engine: google | duckduckgo | bing | yahoo | youtube | |
| weatherEnabled | Optional | false | Toggle Open-Meteo privacy-first weather widget |
| backgroundBlur | Optional | 0 | Background image blur intensity (0 - 20px) |
| buttonRoundness | Optional | 0 | UI corner radius token in pixels (0 - 24px) |
| clocks | Optional | SF, London, Dhaka, Tokyo | Array of WorldClockConfig items with IANA timezone strings |
Development Workflow & 273-Test Automated Suite
Run unit tests with the built-in Node.js test runner and benchmark performance with Puppeteer.
Node.js Native Test Runner (Unit & Domain)
node --test
Executes 273 tests covering Domain entities, Application use cases, sanitizers, and repository mocks with zero external test runners.
Puppeteer Performance Baseline Harness
node scripts/perf-baseline.mjs
Automates Chrome headless browser launches to verify sub-500ms first contentful paint and deck load times at scale.
Extension Smoke Test Suite
node scripts/smoke.mjs
Validates Manifest V3 schema compliance, HTML module script imports, and image assets integrity.
- Zero-build rule: All code must remain pure native ES modules without bundler compile steps or Babel transpilation.
- Private field invariants: All domain entity state must be protected by private # fields and strict validator setters.
- Zero telemetry policy: Never import external analytics trackers, tracking pixels, or remote script bundles.
- Memory efficiency: Avoid full DOM rebuilds; use granular reconciliation and silent access count increments.
Zero-Cloud Security Model & Defense in Depth
How Syncly enforces boundary sanitization, CSP isolation, and local storage sovereignty.
Strict Manifest V3 CSP
Blocks all inline scripts, eval execution, and remote JavaScript. Scripts are strictly restricted to extension local files.
Boundary Input Sanitization
All user strings pass BasicSanitizer before hitting domain entities; URLs are strictly validated to http/https schemes.
Local File System Protection
File System Access API handles are stored strictly in origin-isolated IndexedDB, never uploaded or synced to external clouds.
Got Questions?
We've Got Answers
Everything you need to know about atTrack architecture, offline capabilities, and local LLM inference.
Kamrul Islam Arnob
Lead Maintainer
Have a question about the roadmap, architecture, or contributing? Reach out directly.
Yes. Syncly is released under the permissive MIT License. You have complete freedom to audit, fork, customize, or build extensions on top of it.
MIT License
SPDX: MIT · Copyright © 2026 Syncly Contributors & AtTech Studio