Pulse is built so an AI agent is the primary way work gets logged — not a bolt-on. And Pulse itself isn't only a timesheet: an opt-in Work memory layer keeps the durable decisions and learnings that work produces, backed by two more managed integrations — a read-only GitHub App and an independent evaluator, Jev. The first diagram below is the core: how agents and browsers reach the app. The second, under Work memory, is just the parts that get added when a workspace opts in.
flowchart LR
subgraph ext[" "]
direction LR
GH0["GitHub"]
LN["Linear"]
SL["Slack"]
CAL["Calendar"]
end
Agent["AI Agent<br/>Claude Code · Codex · Claude.ai connector"]
Browser["Browser<br/>person, signed in —<br/>or the public read-only demo"]
Pulse["Pulse — Next.js App Router · Vercel<br/>Web UI + Server Actions<br/>REST API — /api/v1<br/>MCP server — /api/mcp<br/>Auth.js — passwordless"]
PG[("Postgres<br/>Supabase · Drizzle ORM")]
RS["Resend<br/>transactional email only"]
Ins["Vercel AI Gateway<br/>claude-haiku-4.5 — on-demand AI insight"]
ext -. "already connected — to the agent, not Pulse" .-> Agent
Agent -- "MCP tools + REST<br/>bearer token" --> Pulse
Browser -- "browser session<br/>15-min magic link" --> Pulse
Pulse -- "every read / write" --> PG
Pulse -- "magic-link + invite" --> RS
Pulse -- "totals only, opt-in" --> Ins
classDef agent fill:#d3edf6,stroke:#1f9bc0,stroke-width:2px;
classDef browser fill:#e7e3fb,stroke:#7c6ff0,stroke-width:2px;
classDef pulse fill:#ffffff,stroke:#334155,stroke-width:2px;
classDef svc fill:#ffffff,stroke:#94a3b8,stroke-width:1.5px;
classDef ext fill:none,stroke:#94a3b8,stroke-width:1px,stroke-dasharray:4 3;
class Agent agent;
class Browser browser;
class Pulse pulse;
class PG,RS,Ins svc;
class ext ext;
Integration. Your agent already has GitHub, Linear, Slack, and your calendar connected — Pulse doesn't duplicate any of that. It talks to the agent, once, over MCP. For Claude Code specifically, Skill - /pulse-capture is one concrete way that connection gets used — reconstructing and logging time from session history rather than a freeform prompt each time.
Surface. One Next.js app serves the web UI, REST API, and MCP server from the same server actions — every write is scoped to the caller, whichever surface it came through.
Trust. Postgres holds every entry. Resend only ever sends magic links and invites. The AI Gateway sees totals for on-demand insights, never entry text — and, where a workspace opts in to Work memory below, its confirmed memories live in the same Postgres database.
Work memory adds two more integration points beyond the timesheet — both off by default, both per-workspace. Pulse itself is unchanged; these hang off the same MCP call an agent already makes:
flowchart LR
Pulse["Pulse<br/>suggest / confirm memory"]
GHApp["GitHub App · opt-in<br/>read-only — confirms a note exists<br/>at a commit, never reads it"]
GW["Vercel AI Gateway"]
Emb["gemini-embedding<br/>semantic search · opt-in"]
Jev["Jev — TypeSafe AI<br/>advisory review · opt-in"]
Pulse -- "verify note @ commit" --> GHApp
Pulse -- "memory text + evidence" --> GW
GW --> Emb
GW --> Jev
classDef pulse fill:#ffffff,stroke:#334155,stroke-width:2px;
classDef optin fill:#ffffff,stroke:#8a93a6,stroke-width:1.5px,stroke-dasharray:4 3;
class Pulse pulse;
class GHApp,GW,Emb,Jev optin;