Background sync
for your
captures.
Spool Daemon is a standalone app that quietly pulls your stars, bookmarks, saves and notes into a local SQLite database — searchable from its own UI, or paired with Spool. Plugins for the platforms you care about. Nothing leaves the machine.
One connector per platform.
Each connector is a small npm package. Install from the CLI or click Install to launch directly into Spool Daemon.
How the daemon works.
Three things, in order. Pick connectors, let them sync, search the local index — from the app, from the CLI, or both.
Install plugins.
Pick connectors from the registry — install via spool-daemon install, click an spool-daemon:// deep-link, or the in-app picker.
Sync on cadence.
Each connector declares its own schedule — hourly, daily, watched. The daemon respects rate limits, backs off on failure and resumes on next wake. Your laptop stays quiet.
Search locally.
Spotlight-style search in the app, or spool-daemon search "…" from the CLI. Full-text across everything that's been synced.
Write your own connector.
Implement the Connector interface and publish to npm. The daemon handles scheduling, retries, rate-limit backoff, dedupe and writes to the local index.
A class with a few readonly fields, checkAuth() and fetchPage(). caps.fetch is the daemon's managed fetch (handles abort, system proxies, logging). Items emitted as CapturedItem[] get written to the local FTS5 index — no schema work for you.
The daemon finds your connector through the "spool" block in package.json — id, platform, label, color, capabilities. Publish to npm and anyone can spool-daemon install it. To show up in the public directory, send a PR to spool-lab/spool-daemon with one entry.
1import type {2 Connector, ConnectorCapabilities, AuthStatus,3 PageResult, FetchContext,4} from "@spool-lab/connector-sdk";56export default class HackerNewsHot implements Connector {7 readonly id = "hackernews-hot";8 readonly platform = "hackernews";9 readonly label = "Hacker News Hot";10 readonly color = "#FF6600";11 readonly ephemeral = true;1213 constructor(private readonly caps: ConnectorCapabilities) {}1415 async checkAuth(): Promise<AuthStatus> {16 return { ok: true };17 }1819 async fetchPage(ctx: FetchContext): Promise<PageResult> {20 const items = await fetchTopStories(this.caps, ctx);21 return { items, nextCursor: null };22 }23}
1{2 "name": "@spool-lab/connector-hackernews-hot",3 "version": "0.1.2",4 "type": "module",5 "main": "./dist/index.js",6 "dependencies": {7 "@spool-lab/connector-sdk": "^0.1.0"8 },9 "spool": {10 "type": "connector",11 "id": "hackernews-hot",12 "platform": "hackernews",13 "label": "Hacker News Hot",14 "color": "#FF6600",15 "ephemeral": true,16 "capabilities": ["fetch", "log"]17 }18}
Rules of the house.
Local, always.
One SQLite file at ~/.spool-daemon/spool-daemon.db. No cloud sync, no analytics, no profile. Inspect it with sqlite3 any time.
Plugins are npm packages.
Every connector ships on npm as @spool-lab/connector-* (or your own scope). Read the source, fork it, publish your own.
CLI and app, equal.
Search, list, show, install, sync — every action works from spool-daemon on the terminal or from the app. Pick whichever fits the moment.
Standalone or paired.
Spool Daemon runs alone — you don't need Spool to use it. Pair with Spool to make captures and sessions searchable from one box.
indexed.