← all projects

Dev Tools Active 2026

Lab Link

A local-first operating system for research labs

The problem

Research labs run on a fragmented stack - email, Slack, Drive, spreadsheets, sticky notes, whiteboards - where a decision made in a meeting never reliably becomes a tracked task, and nothing feeds anything else.

The approach

Built Lab Link as one local-first data layer accessed two ways: a terminal UI (an installable CLI, invoked like `claude` opens Claude Code) for the fast in-flow case, and a browser-based web platform for richer views - with every feature feeding every other feature, so a meeting transcript can generate tasks that update a project's status automatically.

TypeScriptNode.jsInkSQLitePostgreSQLpgvectorDrizzle ORMExpressAnthropic SDK

Lab Link is a local-first platform for running a research lab - personal command center, project hub, meeting intelligence, and communications - built around the idea that every feature should feed every other one, instead of living in its own silo.

one data layer, two surfaces

The core is an installable CLI (lablink-cli on npm, invoked as lablink) built on Ink - React’s component model rendered to a terminal - backed by a local SQLite database via Drizzle ORM. A companion web platform reads from the same data layer for richer views: project hubs, meeting intelligence, and search.

~/.lablink/
├── lablink.db            # SQLite: all structured data
├── config.toml           # user configuration
├── credentials.enc       # encrypted API keys (keytar)
└── cache/search_index.json

backend: from SQLite to Postgres + pgvector

The companion backend (LabHelper) is migrating from a SQLite prototype to a Postgres-backed service with pgvector for AI semantic search directly inside the database - letting a lab search “what did we decide about the antibody dilution protocol” and get back the actual meeting note, not just a keyword match, without standing up a separate vector store.

AI layer

Task extraction and priority scoring run on the Anthropic SDK: raw meeting notes or inbox messages get parsed into structured tasks, then scored for priority, so a message in a channel can become a tracked, ranked item on someone’s board without manual triage.

integrations

OAuth-backed connectors for Google, Microsoft, and Zoom pull calendar, mail, and meeting data into the same local store, so the command center reflects what’s actually happening across a lab’s existing tools rather than requiring everyone to migrate first.

status

Lab Link ships as a public beta CLI (lablink-cli) on npm alongside continued work on the web platform and the Postgres/pgvector backend migration.

What I took away

  • A local-first SQLite core (via better-sqlite3 + Drizzle) with an optional sync daemon keeps the tool usable offline and fast, while still allowing a move to a shared Postgres + pgvector backend for teams that want cross-member semantic search over lab knowledge.
  • Ink (React for the terminal) makes a genuinely componentized, keyboard-navigable TUI feasible without hand-rolling ANSI escape codes - the same component model as a web app, rendered to a terminal grid instead of a DOM.
  • Extracting tasks and priority-scoring them from raw meeting/email text is a much better fit for a small, focused LLM call per item than one large summarization pass - smaller calls are easier to validate and cheaper to get right.

0 comments

0/1000

Loading…