{"id":49757505,"url":"https://github.com/seryai/sery-link","last_synced_at":"2026-06-14T15:01:21.932Z","repository":{"id":354781883,"uuid":"1208290269","full_name":"seryai/sery-link","owner":"seryai","description":"Private data agent for your files and databases. Connect S3, SFTP, Drive, local folders, MySQL, Postgres, Oracle, and more — query with SQL, search columns, sync to AI. Local-first, never proxied.","archived":false,"fork":false,"pushed_at":"2026-06-05T11:27:37.000Z","size":28772,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-06T06:19:42.579Z","etag":null,"topics":["data-catalog","desktop-app","dropbox","duckdb","google-drive","jdbc","local-first","mcp","mysql","onedrive","parquet","postgresql","rust","s3","sftp","sql","sqlite","tauri","webdav"],"latest_commit_sha":null,"homepage":"https://sery.ai","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seryai.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-12T04:29:29.000Z","updated_at":"2026-06-05T11:27:41.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/seryai/sery-link","commit_stats":null,"previous_names":["seryai/sery-link"],"tags_count":51,"template":false,"template_full_name":null,"purl":"pkg:github/seryai/sery-link","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seryai%2Fsery-link","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seryai%2Fsery-link/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seryai%2Fsery-link/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seryai%2Fsery-link/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seryai","download_url":"https://codeload.github.com/seryai/sery-link/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seryai%2Fsery-link/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34324004,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-14T02:00:07.365Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-catalog","desktop-app","dropbox","duckdb","google-drive","jdbc","local-first","mcp","mysql","onedrive","parquet","postgresql","rust","s3","sftp","sql","sqlite","tauri","webdav"],"created_at":"2026-05-10T23:15:04.615Z","updated_at":"2026-06-14T15:01:21.926Z","avatar_url":"https://github.com/seryai.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sery Link\n\n**Your private data agent — search every cloud without a download. Free + open source (AGPL-3.0).**\n\nConnect every cloud storage you have — local, HTTPS, S3 (+ B2 / Wasabi / R2 / GCS presets), Google Drive, SFTP, WebDAV, Dropbox, Azure Blob, OneDrive. Browse, preview tables and Parquet files in-place, run SQL on remote bytes without downloading, and ask AI questions across all of it. Credentials stay in your OS keychain. Sery never sees your files.\n\n\u003e **Browse · preview · profile · query — across every cloud you have, no downloads.** Sery Link is also the desktop endpoint for [Sery](https://sery.ai) — your private data agent (multi-machine workspace upgrade is opt-in).\n\n## What you can do with one install\n\nSery Link works in three independent modes. Use any combination — they coexist by design. See [RUNBOOK.md](./RUNBOOK.md) for the full walkthrough.\n\n| Mode | What it does | Sery account? |\n|---|---|---|\n| **Local — private data agent** | Connect every storage you have. Column-aware search across all of them, per-file column profiles, inline tabular preview (parquet footers read over the wire — no download), CSV/Excel → Parquet conversion. Runs fully offline. | Not required |\n| **MCP stdio** | `Settings → MCP` toggle exposes a folder to Claude Desktop / Cursor / Continue via local stdio. The external LLM uses its own key. | Not required |\n| **Cloud workspace** | Connect with a workspace key — AI chat across all your sources at app.sery.ai/chat, multi-machine catalog sync, cross-machine search, MCP cloud endpoint at mcp.sery.ai. The dashboard can also trigger rescans, run SQL, and send OS notifications to any connected machine via the agent RPC layer. | Free or Plus |\n\n**Storage protocols (9 implemented + 4 S3-compatible presets):** Local disk · HTTPS public URLs · S3 · Google Drive (OAuth) · SFTP · WebDAV · Dropbox (OAuth or PAT) · Azure Blob · OneDrive (OAuth) — plus Backblaze B2 / Wasabi / Cloudflare R2 / Google Cloud Storage as one-click S3 presets.\n\n## Features\n\n- 🌐 **Browse every cloud you have, in one app** — 9 protocols (Local, HTTPS, S3, Drive, SFTP, WebDAV, Dropbox, Azure, OneDrive) plus 4 S3-compatible presets (B2, Wasabi, R2, GCS). Credentials in the OS keychain, fetched directly from your machine.\n- ⚡ **Preview without downloading** — click any Parquet on S3 → schema + sample rows in \u003c2s via the Parquet footer (no full file pull). CSV / TSV / Excel preview streams just enough.\n- 📊 **Per-file column profiles** — null %, unique values, min/max/avg, computed locally via DuckDB SUMMARIZE.\n- 🔎 **Column-aware search** — match filenames, column names, and extracted document content across every connected source in one pass.\n- 📁 **Folder + bucket watching** — auto-detect changes in Parquet, CSV, Excel, and document files.\n- 🔄 **Convert to Parquet** — turn any CSV / TSV / Excel into Parquet next to the source. The fastest way to make a pile of CSVs queryable.\n- 📄 **Documents → markdown** — DOCX, PPTX, HTML, PDF via the in-process [`mdkit`](https://crates.io/crates/mdkit) Rust crate (bundled libpdfium + pandoc).\n- 💻 **Multi-machine workspace** (opt-in) — connect as many of your own machines as you want via one workspace key. AI chat at app.sery.ai/chat fans queries out across them.\n- 🎛️ **Remote command execution** — the cloud dashboard can invoke 18 named commands on any connected machine: trigger source rescans, run SQL, tail logs, send OS notifications, open files in Finder/Explorer. Commands stream progress events back in real time.\n- ⌨️ **Keyboard-first UX** — Command Palette (Cmd+K), Quick-Search hotkey (Cmd+Shift+S), fuzzy search.\n- 🔒 **Verifiable privacy** — every outbound network event is logged to `~/.seryai/sync_audit.jsonl` with byte counts and host but never prompt or response text. Open the file in Settings → Privacy and watch it as you work.\n- 📦 **AGPL-3.0** — the protocol, auth flow, audit log format, and command surface are all inspectable. The privacy claims on [sery.ai/trust](https://sery.ai/trust) are verifiable in the source you're reading.\n\n## Install\n\nPre-built binaries for macOS (Apple Silicon + Intel), Windows, and Linux are on the [Releases page](https://github.com/seryai/sery-link/releases).\n\nOr build from source — see [Development](#development) below.\n\n\u003e **First-launch on macOS**: builds aren't Apple-notarized yet, so Gatekeeper blocks the first open. Right-click the app → Open, or System Settings → Privacy \u0026 Security → \"Open Anyway\". Auto-updates after that work normally (verified via [minisign](https://jedisct1.github.io/minisign/), independent of Apple's signing).\n\n## Architecture\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│  Sery Link (this repo, AGPL-3.0)                             │\n│  ┌────────────┐  ┌──────────────┐  ┌──────────────────────┐  │\n│  │  React UI  │  │  Tauri 2.x   │  │  Rust kits           │  │\n│  │  + Tailwind│←→│  + WebSocket │  │  scankit · tabkit ·  │  │\n│  └────────────┘  └──────────────┘  │  mdkit · sery-mcp    │  │\n│                                    └──────────────────────┘  │\n└──────────────────────────────────────────────────────────────┘\n                              │ (workspace key, opt-in)\n                              ▼\n┌──────────────────────────────────────────────────────────────┐\n│  Sery Cloud (closed source)                                  │\n│  Identity · Catalog · Routing · MCP gateway                  │\n│  Holds: file paths, schemas, optional sample rows.           │\n│  Never holds: file contents.                                 │\n└──────────────────────────────────────────────────────────────┘\n```\n\nThe kits ([`scankit`](https://crates.io/crates/scankit), [`tabkit`](https://crates.io/crates/tabkit), [`mdkit`](https://crates.io/crates/mdkit), [`sery-mcp`](https://crates.io/crates/sery-mcp)) are separate crates published on crates.io — pull them into your own Tauri / Iced / native Rust desktop apps if you want.\n\n## Supported file types\n\n**Tabular** (via tabkit): Parquet · CSV · XLSX · XLS\n\n**Documents** (via mdkit): DOCX · PPTX · HTML · PDF (text-layer + Apple Vision / Windows.Media.Ocr fallback for scanned pages) · Jupyter Notebooks\n\n## Development\n\n### Prerequisites\n\n- Node.js 20+ and pnpm\n- Rust 1.88+ ([rustup](https://rustup.rs/))\n\n### Setup\n\n```bash\npnpm install\n\n# Local dev — point at a local backend if you have one\nSERY_API_URL=http://localhost:8000 \\\nSERY_WEBSOCKET_URL=ws://localhost:8000 \\\nSERY_WEB_URL=http://localhost:3000 \\\npnpm tauri dev\n\n# Or just run against production sery.ai (the defaults if env vars aren't set)\npnpm tauri dev\n```\n\n### Build for production\n\n```bash\n# CI uses .github/workflows/release.yml — triggered by pushing a v* tag.\n# Locally, build a single-platform release artifact via:\n./scripts/build-local.sh arm64    # or `intel`, or omit for both\n```\n\nSee [RELEASE.md](./RELEASE.md) for the full release workflow (signing, GitHub Releases, auto-updater manifest).\n\n## Verify the privacy claims yourself\n\nThe marketing site says \"raw files never leave your machines, the cloud holds the catalog never the data.\" Don't take our word for it:\n\n| Claim | Where it's enforced |\n|---|---|\n| Workspace catalog is metadata-only | [`src-tauri/src/scanner.rs`](./src-tauri/src/scanner.rs) — what gets read; [`src-tauri/src/sync.rs`](./src-tauri/src/sync.rs) — what gets uploaded |\n| Cloud AI queries fan out via the workspace tunnel, not by uploading data | [`src-tauri/src/websocket.rs`](./src-tauri/src/websocket.rs) — long-lived WebSocket; the cloud agent sends SQL, the desktop runs it on local DuckDB and streams rows back |\n| Remote commands execute locally — the cloud can invoke but not exfiltrate | [`src-tauri/src/agent_rpc/`](./src-tauri/src/agent_rpc/) — `system.open` only opens paths inside configured local sources; `sql.exec` runs DuckDB locally and returns rows, never uploads file contents |\n| Local audit log is the source of truth | [`src-tauri/src/audit.rs`](./src-tauri/src/audit.rs) — schema + rotation; `~/.seryai/sync_audit.jsonl` on disk |\n| Document text is opt-in (off by default) | [`src-tauri/src/config.rs`](./src-tauri/src/config.rs) — `SyncConfig::include_document_text = false` |\n\n## License\n\n[GNU Affero General Public License v3.0 or later](./LICENSE) (AGPL-3.0-or-later).\n\nIn short: you can use, inspect, modify, and redistribute the source freely, including for commercial purposes. If you run a modified version as a network service, you must make your modified source available to users of that service under the same license. AGPL is what makes the privacy claim at the heart of Sery Link — \"your files never leave your machines\" — auditable by anyone who wants to verify it.\n\nThe Sery cloud backend (identity, workspace catalog, AI orchestration, billing) is a separate, proprietary service and is not covered by this license. Sery Link talks to that backend only when the user explicitly opts in to the cloud workspace mode.\n\n## Contributing\n\nPRs welcome. See [CONTRIBUTING.md](./CONTRIBUTING.md) for what we accept, DCO sign-off, and review expectations. Usage questions + bug reports → [SUPPORT.md](./SUPPORT.md). Security issues → `security@sery.ai` (don't file publicly — see [SECURITY.md](./SECURITY.md)).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseryai%2Fsery-link","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseryai%2Fsery-link","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseryai%2Fsery-link/lists"}