leftspin
Mobile agent platform

Agents in your app.
Work that keeps running.

leftspin is the mobile-specific agent platform. Your AI adapts with every run — lifting satisfaction and LTV, cutting churn, and turning usage into revenue. Keys stay protected, jobs survive app-closes; the infrastructure is our problem.

$npm i @leftspin/sdk
one SDK · iOS, Android, web
  • ✓higher LTV
  • ✓lower churn
  • ✓sharper output
  • ✓keys off the device
your app iOS
app closed · job continues
runtime
run.journalqueued
run
01JQ4K7M
app
your-app
user
u_2f81c
lease
epoch 3
✓plan118ms
✓generate.frame_011.4s
✕worker 3f9a killed (SIGKILL)lease released
✓generate.frame_021.9s
◐await_approval.publish—
nextside_effect.publish — waits for a human
ledger 0x8f2a…c41d chain valid0 cross-tenant reads
↳

Sandbox trace. The worker was hard-killed mid-run; execution resumed from the journal and stopped at the approval gate. Nothing published twice.

chat-native agent apps
text→videophoto→interiorvoice→music
Compounding quality

The more they use it, the better your app gets

Your agent does not get better because you keep rewriting prompts. It gets better because usage produces evidence: which route finished, where the answer needed an edit, which tool did the job. The next run starts with that evidence, so each user gets a sharper result with less steering.

01

First pass, more often

Every route that finishes is evidence. The next run leans on the ones that worked and stops repeating the ones that came back for edits.

02

Less steering

Briefs get shorter as the app learns the shape of the work: the right defaults, the right tone, the right tool. Users stop explaining the same thing twice.

03

Cheaper where it can be

When a smaller model or a cheaper tool proves it can finish the job, more work goes there. Quality improves without making every run more expensive.

usage tracesame app · twelve runs
usage / 12 runs
01 / 12
what usage changes
less steering · more finished work
live
first usemore usage →better first pass
the next runfirst run
brief

“warmer, but not orange — keep the crop”

edits
3 notes
route
general model
outcome
another pass
↳the agent needs a brief
run 01 → 12less steering · more finished work
The stack around the agent

The agent is the easy part. The stack around it isn't.

Auth, keys, queues, retries, per-user state, tools, approvals, quotas, logs. Each one is another service to wire and another failure mode to page someone about. leftspin takes the tedious half so your team can ship the product.

without a runtime

You own every moving part.

12 surfaces · all yours
auth
keys
queue
workers
retries
per-user state
tools
approvals
logs
quotas
billing
on-call
every provider adds another path to ownyou operate all of it
the failure modes you inherit
keys in the app
jobs lost on deploy
retry storms
no per-user boundary
no audit trail
cost by guesswork
more surface area · more pager alerts
with leftspin

One runtime owns the seam.

one call
your app
iOS · Android · RN · Flutter
leftspinone run
POST /v1/apps/:appId/run
keys
durable runs
per-user state
tools
approvals
streaming
journal
quota
the worldany model · any tool · a real computer
what changes for your team
keys stay off the device
runs survive a deploy
approvals, quota and journal in one place
one runtime to operate · not twelve

Less surface area

Every queue, retry path, key and approval stops being a separate service to own.

Fewer failure modes

One runtime means one place to see a run, retry it, stop it and explain what happened.

A better agent experience

Sessions stay live, work resumes after a deploy, and the app can show progress instead of a spinner.

Execution shapes

Five shapes of work. One runtime.

Wiring auth, files, model access, streams and a job runner separately is what makes agents feel bolted on. Run all of it on the same substrate: same keys, same journal, same metering, same user.

run_8f2c · demo
durable job
the shape
Durable job

Minutes-long work that survives a closed app, a dropped connection, a deploy.

↳ video → four minutes
render.mp4 · demo
render.mp4processing
queued · 00:42resumes after app close
1 job · attempt 1 · next check in 4s
status
running
attempt
01
journal
on

Plus scheduled and recurring runs, background triggers, background sync and voice, image and video modalities. The surface is uniform: same SDK, same journal, same result envelope.

$await leftspin.run({ shape: "durable_job", input })same call · any shape
What teams ship on it

From a plant identifier to an agent that cancels your subscriptions.

The same substrate shows up in very different products. What they share is work that has to remember someone, outlive a screen, or prove what it did.

selected app01 / 12
9:41
hushframe
dusk study
01
00:249:16
2 clips · keptdraft 02
1080pslow pushwarm
prompt

dusk, product shot, slow push — keep the mist

run completekept for next time
Questions

The things you ask before the first run.

Short answers to the parts that usually need a call. If yours isn't here, get started.

Start here

Give your app a runtime that finishes the work.

run / 408finished
the work
done.
approvalreceived
artifactstored
journalkept
signalqueued
one runtime · every userdemo
↳the same record for every run