On a computer or a server
Run ramen start and point your app at it. It speaks the APIs your app already uses:
- OpenAI:
http://127.0.0.1:8090/v1(chat completions and Responses) - Anthropic Messages:
http://127.0.0.1:8090 - Ollama:
ramen start --ollama replaceanswers at Ollama's own address, with your Ollama models - RAMen Memory over MCP:
ramen mcpon your computer (stdio), or RAMen Online for remote MCP clients, with OAuth sign-in:https://ramen-online.matthewsleibel.workers.dev/mcp
Apps that take an OpenAI, Anthropic or Ollama address work with it as they are, for example Open WebUI, Continue, Cline, Aider and OpenCode. Send the whole conversation each time. Name one with an X-Session-Id header.
In your code editor
Your RAMen Memory and saved chats in Cursor, VS Code, Codex, Windsurf and Zed: add RAMen as a remote MCP server at this address, with no key or header in the file. The editor opens RAMen's sign-in page, where you enter your RAMen license key.
https://ramen-online.matthewsleibel.workers.dev/mcp
Cursor: in ~/.cursor/mcp.json (every project) or .cursor/mcp.json (one project):
{ "mcpServers": { "ramen": { "url": "https://ramen-online.matthewsleibel.workers.dev/mcp" } } }
VS Code (GitHub Copilot, agent mode): run MCP: Add Server from the Command Palette, choose HTTP and paste the address, or put this in .vscode/mcp.json:
{ "servers": { "ramen": { "type": "http", "url": "https://ramen-online.matthewsleibel.workers.dev/mcp" } } }
Codex:
codex mcp add ramen --url https://ramen-online.matthewsleibel.workers.dev/mcp
codex mcp login ramen
Windsurf: in its mcp_config.json: { "mcpServers": { "ramen": { "serverUrl": "https://ramen-online.matthewsleibel.workers.dev/mcp" } } }. Zed: Settings, AI, MCP Servers, Add Remote Server, and paste the address.
Editors that cannot sign in to an MCP server themselves (JetBrains AI Assistant, Continue) can reach it through npx mcp-remote https://ramen-online.matthewsleibel.workers.dev/mcp, which does the sign-in for them. In Claude Code, use the RAMen plugin.
On Android: the RAMen kit
1. In settings.gradle.kts, inside dependencyResolutionManagement { repositories { ... } }:
exclusiveContent {
forRepository { maven { url = uri("https://getramenai.com/maven") } }
filter { includeGroup("com.getramenai") }
}
2. In app/build.gradle.kts (minSdk 29):
implementation("com.getramenai:ramen:0.9.1")
3. Hello world:
val ramen = Ramen.open(context, File(context.filesDir, "Qwen3-1.7B-Q4_K_M.gguf"))
ramen.reply(listOf(Message.user("Name three kinds of noodles.")), session = "chat-1") { r ->
when (r) {
is Reply.Text -> answer.append(r.text)
is Reply.Done -> Log.i("app", "read ${r.readTokens} new tokens, memory: ${r.memory}")
is Reply.Failed -> Log.e("app", r.message)
is Reply.Started -> {}
}
}
Send the whole conversation each time; RAMen reads only what is new. history, forget and close() manage it. Any GGUF model, no permissions. A 0.9.0 preview.
On iPhone: the RAMen Swift package
1. In Xcode: File > Add Package Dependencies, enter https://github.com/MatthewLeibel/ramen-swift, choose version 0.9.0 and add the RAMen library to your app. Or in Package.swift:
.package(url: "https://github.com/MatthewLeibel/ramen-swift", from: "0.9.0")
2. Hello world:
import RAMen
let ramen = try Ramen.open(model: modelURL) // a GGUF file your app ships or downloads
let chat: [Ramen.Message] = [.user("Name three kinds of noodles.")]
for try await reply in ramen.reply(chat, session: "chat-1") {
switch reply {
case .text(let text, _): answer += text
case .done(let done): print("read \(done.readTokens) new tokens, memory: \(done.memory)")
case .started: break
}
}
The same rules as on Android. iOS 16.4 or newer, iPhone 11 and later. A 0.9.0 preview: write to us before shipping it on the App Store.