String OS

Apps for AI agents.
Just markdown.

An AI-native runtime where every capability is a markdown document. One interface for every tool. Up to 99% fewer tokens, ~50% fewer task errors.

Read the docs → GitHub
npm install -g @string-os/string
What is String OS?

Capabilities are documents, not programs.

Every tool an AI agent uses today has its own interface — REST APIs need endpoint URLs and JSON schemas, MCP servers need protocol negotiation, CLI tools need argument parsing. Each integration is a code project.

String makes every capability a markdown file. The agent reads it the same way it reads a webpage. Actions live inline. Navigation is by link. State is scoped per app. New capability = new markdown file. No host config. No restart. Same interface in any agent.

AI agent
String runtime
open · act · nav
weather.md moltbook.md gmail.md
Drop this into your AI agent.

One link. Your agent installs String and starts using apps.

skill.md (excerpt)
---
title: String — Install Skill
---

# Install String

This document tells you how to install and start using String.

## 1. Install
```bash
npm install -g @string-os/string
```

## 2. Start the daemon
```bash
string --daemon start
```

## 3. Install an app
```bash
string file:setup '/install --app ./apps/weather/string.md'
```

## 4. Use it
```bash
string app:weather '/act.now --city Seoul'
```
What the agent does
  1. Reads the skill.md document
  2. Runs npm install -g @string-os/string
  3. Starts the daemon
  4. Installs apps from URLs or local paths
  5. Calls /act.<name> on any app — same interface every time
A String App

This file is the entire app.

50 lines of markdown. Read it, fork it, audit it, edit it. The agent reads the same file you do.

apps/weather/string.md
---
name: weather
type: app
default: now
---

# Weather

```act.now
GET https://wttr.in/{city}?format=%l:+%c+%t
  city, -c: string (required) "City name"
```

```act.forecast
GET https://wttr.in/{city}?format=j1
  city: string (required) "City name"
  days: number (optional) "Days to forecast" = "3"
```
Agent session
$ string app:weather '/act.now --city Seoul'

<𝒞=string:app:weather>
Seoul: ☀️ +23°C
</𝒞>

$ string app:weather '/act.forecast --city Tokyo --days 5'

<𝒞=string:app:weather>
Tokyo, 5-day forecast:
  Mon: ☀️ +28°C
  Tue: 🌤 +27°C
  Wed: 🌧 +22°C
  Thu: ⛅ +25°C
  Fri: ☀️ +29°C
</𝒞>
Why String?

Cheaper to run. Better at the task.

50–99%
fewer tokens per task
Tool descriptions live in the page, loaded only while the agent is using it. No global tool catalog padding every call.
~50%
fewer task errors
Agents read markdown all day. Familiar interface plus self-discovery (next actions are right in the response) cut wrong-tool failures.
1×
build, run anywhere
Same markdown app runs in Claude, Codex, Cursor, custom agents. Build once, deploy everywhere.
50 lines
per app, on average
An app is a markdown file. No build step, no schema, no host process. The file is the deliverable.

Numbers from early benchmarks comparing equivalent task completion across MCP, function calling, and String. Detailed methodology in the docs.

The deeper pattern

The web for AI agents.

The web works because pages link to pages. AI tooling today is islands — MCP, function calling, every framework lives in its own world.

String unifies them with two verbs an agent already knows: /open any document, /act on any capability. Responses contain links. Links open more documents. Capabilities compose the same way pages do.

That's the whole game.

Get started

Three commands.

npm install -g @string-os/string
string --daemon start
string file:setup '/install --app ./apps/weather/string.md'
Read the docs → GitHub skill.md