Install

Three ways to add Linda.

Pick the mode that matches where you are. Same agent loop under all three.

1. Script tag (10 seconds)

The fastest path. Drop one tag, mark up a form with data-linda, and you're done.

<script src="https://unpkg.com/@linda/script/dist/linda.js"></script>

<form
  data-linda
  data-linda-config="/configs/signup.json"
  data-linda-provider="anthropic"
  data-linda-model="claude-sonnet-4-6"
  data-linda-key="sk-ant-..."
>
  <input name="email" />
  <input name="company" />
  <input name="team_size" />
</form>
  • UMD bundle: ~34 KB gzipped.
  • Loads from unpkg / jsDelivr — pin a version in production.
  • Reads data-linda-* attributes for config.
  • BYOK with data-linda-key, or use a proxy URL via data-linda-proxy.

2. npm + bundler

For Vite, Webpack, esbuild, Rollup. ESM only.

npm install @linda/core
import { Linda } from "@linda/core";

const linda = new Linda({
  transport: {
    mode: "browser",
    provider: "anthropic",
    apiKey: import.meta.env.PUBLIC_ANTHROPIC_KEY,
    model: "claude-sonnet-4-6",
  },
  config: {
    persona: "Helpful onboarding assistant",
    target: { type: "form", selector: "#signup" },
    dataPoints: [
      { name: "email", question: "What's your work email?" },
      { name: "company", question: "Which company are you with?" },
      { name: "team_size", question: "How big is your team?" },
    ],
  },
});

linda.attach();

3. React

@linda/react wraps the core in a provider + form component.

npm install @linda/react
import { LindaProvider, LindaForm } from "@linda/react";
import { BUILTIN_SKILLS } from "@linda/skills";

export default function Signup() {
  return (
    <LindaProvider
      transport={{
        mode: "proxy",
        url: "/api/linda",
        provider: "anthropic",
        model: "claude-sonnet-4-6",
      }}
    >
      <LindaForm
        config={signupConfig}
        skills={BUILTIN_SKILLS}
        onComplete={(data) => fetch("/api/save", {
          method: "POST",
          body: JSON.stringify(data),
        })}
      >
        <input name="email" />
        <input name="company" />
        <input name="team_size" />
      </LindaForm>
    </LindaProvider>
  );
}

Optional: the proxy server

If you don't want your API key in the browser, drop in @linda/server — a Node middleware that streams responses over SSE.

import express from "express";
import { lindaProxy } from "@linda/server";

const app = express();
app.post("/api/linda", lindaProxy({
  provider: "anthropic",
  apiKey: process.env.ANTHROPIC_API_KEY!,
  model: "claude-sonnet-4-6",
  rateLimit: { rpm: 30 },
}));

Pick a provider

Linda supports five out of the box:

Capability gates (browser support)

Linda detects browser capabilities at startup — FileReader, WebGPU, Bluetooth, NFC, Geolocation, etc. — and only exposes skills/parsers/mounts that the runtime actually supports. So you can ship a build with the OCR skill and Bluetooth mount; on Firefox without WebUSB they'll silently no-op.

Minimum supported: Chrome 80+, Firefox 80+, Safari 14+, Edge 80+.

<script src="https://unpkg.com/@linda/script/dist/linda.js"></script>

<form
  data-linda
  data-linda-config="/configs/signup.json"
  data-linda-provider="anthropic"
  data-linda-model="claude-sonnet-4-6"
  data-linda-key="sk-ant-..."
>
  <input name="email" />
  <input name="company" />
  <input name="team_size" />
</form>

Ship an agent-driven flow this afternoon.

Install Linda, paste a config, and your form turns into an agent that fills its own inputs.