run agents on device, train your small model, offline first.
See the codeAgents that run on the iPhone. A local model, the agent loop, and the phone's own abilities as tools — offline, no account, no cloud.
Real capture · iPhone 16 Pro · Qwen3-0.6B, 4-bit, on device · 2× speed
.package(url: "https://github.com/cagataycali/loopl", from: "0.1.0")
import Loopl
import LooplRuntimes
import LooplAppleTools
let model = MLXModel() // or GGUFModel(), AppleFoundationModel()
try await model.load(spec, from: weights) { _ in }
let agent = Agent(model: model, tools: AppleTools.available) // what this iPhone can do
for try await event in agent.stream("Torch on, and how do I say 'where is the exit?' in Turkish?") {
if case .text(let chunk) = event { print(chunk, terminator: "") }
}
| Product | |
|---|---|
Loopl | Agent, Tool, Model, hooks, structured output, checkpoints, tracing — Foundation only |
LooplRuntimes | MLX (Metal, vision), llama.cpp (GGUF), Apple Foundation Models |
LooplAppleTools | generate_image, generate_voice, transcribe, translate, describe_image, flashlight, vibrate, open_app |
LooplUI | SwiftUI transcript, tool rows, approval card |
Get started · Write a tool · API reference
The SDK, shipped as a free iOS app. Everything below runs on the phone.
Tools, shown. Every call, its arguments, its result. |
Any model. The catalog, any Hugging Face repo, your private ones. |
Your own model. Post-tune on your conversations. |
transcribe; attach a photo for vision models.| Model | Runtime | 4-bit | Tool calls | |
|---|---|---|---|---|
| Qwen3-0.6B | MLX | 335 MB | ✓ | default |
| Qwen3-1.7B | MLX | 968 MB | ✓ | 41 tok/s on iPhone 16 Pro |
| Qwen3 1.7B · Q4_K_M | GGUF | 1.11 GB | ✓ | 33 tok/s on iPhone 16 Pro |
| Qwen3.5 2B | MLX | 1.75 GB | ✓ | vision |
| loopl 4B | MLX | 3.03 GB | ✓ | post-tuned for loopl · vision · public |
Up to 4B at 4-bit fits an 8 GB iPhone. Any public MLX or GGUF repo loads the same way. All models →
The loopl models — Qwen3.5 0.8B/2B/4B post-tuned for this loop, vision kept, with their cards — are public, in one Hugging Face collection.
Model → tools → model, until the model answers. No iteration cap. A failed call returns to the model as an error result, so it can fix the call; a tool that needs approval pauses the loop until you answer. The agent loop →
swift test # SDK, macOS
brew install xcodegen && xcodegen generate -s App/project.yml # the app → App/LooplApp.xcodeproj
scripts/fetch-llama-xcframework.sh --with-sim # once, for GGUF
loopl.dev · Get started · The app · Models · FAQ · Changelog
Made by @cagataycali.
run agents on device, train your small model, offline first.
See the codeAgents that run on the iPhone. A local model, the agent loop, and the phone's own abilities as tools — offline, no account, no cloud.
Real capture · iPhone 16 Pro · Qwen3-0.6B, 4-bit, on device · 2× speed
.package(url: "https://github.com/cagataycali/loopl", from: "0.1.0")
import Loopl
import LooplRuntimes
import LooplAppleTools
let model = MLXModel() // or GGUFModel(), AppleFoundationModel()
try await model.load(spec, from: weights) { _ in }
let agent = Agent(model: model, tools: AppleTools.available) // what this iPhone can do
for try await event in agent.stream("Torch on, and how do I say 'where is the exit?' in Turkish?") {
if case .text(let chunk) = event { print(chunk, terminator: "") }
}
| Product | |
|---|---|
Loopl | Agent, Tool, Model, hooks, structured output, checkpoints, tracing — Foundation only |
LooplRuntimes | MLX (Metal, vision), llama.cpp (GGUF), Apple Foundation Models |
LooplAppleTools | generate_image, generate_voice, transcribe, translate, describe_image, flashlight, vibrate, open_app |
LooplUI | SwiftUI transcript, tool rows, approval card |
Get started · Write a tool · API reference
The SDK, shipped as a free iOS app. Everything below runs on the phone.
Tools, shown. Every call, its arguments, its result. |
Any model. The catalog, any Hugging Face repo, your private ones. |
Your own model. Post-tune on your conversations. |
transcribe; attach a photo for vision models.| Model | Runtime | 4-bit | Tool calls | |
|---|---|---|---|---|
| Qwen3-0.6B | MLX | 335 MB | ✓ | default |
| Qwen3-1.7B | MLX | 968 MB | ✓ | 41 tok/s on iPhone 16 Pro |
| Qwen3 1.7B · Q4_K_M | GGUF | 1.11 GB | ✓ | 33 tok/s on iPhone 16 Pro |
| Qwen3.5 2B | MLX | 1.75 GB | ✓ | vision |
| loopl 4B | MLX | 3.03 GB | ✓ | post-tuned for loopl · vision · public |
Up to 4B at 4-bit fits an 8 GB iPhone. Any public MLX or GGUF repo loads the same way. All models →
The loopl models — Qwen3.5 0.8B/2B/4B post-tuned for this loop, vision kept, with their cards — are public, in one Hugging Face collection.
Model → tools → model, until the model answers. No iteration cap. A failed call returns to the model as an error result, so it can fix the call; a tool that needs approval pauses the loop until you answer. The agent loop →
swift test # SDK, macOS
brew install xcodegen && xcodegen generate -s App/project.yml # the app → App/LooplApp.xcodeproj
scripts/fetch-llama-xcframework.sh --with-sim # once, for GGUF
loopl.dev · Get started · The app · Models · FAQ · Changelog
Made by @cagataycali.