letta-ai

Letta OSS UI — Design skill for Claude Code

Design community

An open-source demo UI built on top of the Letta Agent SDK.

How to install Letta OSS UI

This entry records only its repository, not the path inside it, so there is no exact command to give. Open letta-ai/letta-oss-ui and copy the folder into ~/.claude/skills/, or the file into ~/.claude/agents/.

What Letta OSS UI does

An open-source demo UI built on top of the Letta Agent SDK.

Alternatives in Design

  • Od Contribute — Open a first-contribution PR (or bug issue) on nexu-io/open-design — works for non-coders too 91.8k ★
  • Export Diagram — Export a diagram-design HTML file to .svg and .png next to the source 27.2k ★
  • CloudCLI — 8,400+ Free open-source web/mobile UI for Claude Code, Cursor CLI, and Codex 8.7k ★

README

Demo open-source UI, built using the Letta Agent SDK

[![Platform](https://img.shields.io/badge/platform-%20macOS%20%7C%20Linux-lightgrey.svg)](https://github.com/letta-ai/letta-cowork/releases)

An example desktop application for running Letta agents with a visual interface.

What is the Letta OSS UI?

This repo contains an example desktop application for running Letta agents with a visual interface. The code is a fork of [Claude-Cowork](https://github.com/DevAgentForge/Claude-Cowork) that replaces the Claude SDK with the [`@letta-ai/letta-agent-sdk`](https://www.npmjs.com/package/@letta-ai/letta-agent-sdk). It provides a native desktop GUI for interacting with [Letta](https://docs.letta.com/agent-sdk) agents.

https://github.com/user-attachments/assets/570474a1-641b-404d-a1aa-50c080675773

Why Letta Agent SDK?

The [Letta Agent SDK](https://docs.letta.com/agent-sdk) is the SDK interface to [Letta Code](https://github.com/letta-ai/letta-code). Build agents with persistent memory that learn over time.

import { createAgent, resumeSession } from '@letta-ai/letta-agent-sdk';

// First session - agent learns something
const agentId = await createAgent();
const session1 = resumeSession(agentId);
await session1.send('Remember: the secret word is "banana"');
for await (const msg of session1.stream()) { /* ... */ }
session1.close();

// Later... agent still remembers
await using session2 = resumeSession(agentId);
await session2.send('What is the secret word?');
for await (const msg of session2.stream()) {
  if (msg.type === 'assistant') console.log(msg.content); // "banana"
}

**Key concepts:**

  • Agent (agentId): Persistent entity with memory that survives across sessions
  • Conversation (conversationId): A message thread within an agent
  • Session (sessionId): A single execution/connection

Agents remember across conversations (via memory blocks), but each conversation has its own message history. Th