LUDILOv0.1.0 <o>
machina
100% LUDILO

ludilo-machina 0.1.0 <o>  ·  an Android-native coding agent  ·  "ludilo" is Serbian for madnessa serious tool for serious pipelines

LUDILO
is the machina

A coding agent that lives inside Termux. It writes the app, compiles a signed APK on the device — no Gradle, no PC — installs it, launches it, looks at the screen and the logs, and fixes what broke. Up to 30 agent steps per message. Pure-stdlib Python, no pip dependencies.

Start of a real ludilo session in Termux on the phone: the lime splash mark, the version line with model mimo-v2.6-flash, and a typed prompt asking to implement a spec, build it and copy the APK
start of a real session — the splash, the model line, and a prompt. No tool output yet; the console prints one line per call.
A later ludilo session in Termux on the phone: the lime splash mark, the version line with model mimo-v2.6-pro, and a typed prompt asking for Android optimization by removing unnecessary files. A KeyboardInterrupt traceback from the previous run is visible above
a later session — same phone, a different model (mimo-v2.6-pro) and a new prompt. The red traceback above it is an earlier run stopped with Ctrl-C.

Verified on one phone so far: Redmi Note 12 Pro, Android 13. 13 commits, all dated 2026-10-01 — this project is one day old in public.

Runs in
Termux, on the phone. aarch64
Tools
15, from build_apk to logcat
Model
your endpoint, your key. Any OpenAI-compatible API
Default policy
everything allowed. You write the limits
01 /

The loop, on your phone

One user message, at most 30 model steps. The console prints the model's sentences and one line per tool call — nothing else. Tool results are not printed; they go back to the model, and every session is saved under ~/.ludilo/sessions/. The block below shows the console's line format (argument shapes are illustrative; the format is exact, from ludilo/agent.py).

ludilo> make a flashlight app and install it > probe_env() > new_android_project(dest='…/Flashlight', package='com.ludi > write_file(path='…/MainActivity.java', content='package c > build_apk(project='…/Flashlight') > install_apk(apk_path='…/flashlight.apk') > launch_app(package='com.ludilo.flashlight') > screenshot(path='~/.ludilo/screen.png') > logcat(lines=80, package='com.ludilo.f') [step limit reached] · session: 41230 tokens (28 calls)
  • 01probe_env()
    device profile first — the system prompt says use it when unsure
  • 02new_android_project()
    a Java, no-Gradle project scaffold on the device
  • 03write_file()
    sources land where the compiler can see them
  • 04build_apk()
    aapt2 → javac/ecj → d8 → zipalign → apksigner, all local
  • 05install_apk() + launch_app()
    self-ADB over wireless debugging paired to localhost; launch via monkey
  • 06screenshot() · ui_dump() · logcat()
    the agent looks at what it made — then fixes what broke

When the model answers without a tool call the loop stops early. When it errors, the CLI prints [model error: …] — your chat is kept, just say 'continue'; requests retry at 0/2/5/10 s on 429/5xx/network errors.

02 /

Proof: Sensor Scope

A live system monitor built and signed on the phone by ludilo-machina's own toolchain — aapt2, javac, d8, zipalign, apksigner. No Gradle, no PC. Source is in examples/sensor_scope. Sixty-second scrolling line graphs; tap a panel to collapse it.

Sensor Scope CPU panel: per-core clock graph at 72 percent
CPU
Sensor Scope temperature panel with thermal zone graphs
TEMPERATURE
Sensor Scope per-core clock list and temperature graph
CORES + THERMAL
Honest, on screenAndroid blocks /proc/stat on this phone, so the CPU graph shows each core's clock as a percentage of its max — and the app says so in its own UI. Thermal zones like ibat, vbat, soc that are not temperatures are filtered out.
What we claimThe toolchain built and signed it, on the device. The repo does not claim the AI wrote the source — so neither do we. The session screenshot in the repo shows the prompt; judge the pipeline, not a story.
Where it stoppedThe demo is 17 seconds, silent, 540p, filmed on the same phone. That is the whole theatre budget: it runs, or it is not on this page.
03 /

The APK line

Termux has no Gradle worth running and no zipalign package. So the pipeline is assembled from what Termux does have — plus one tool ludilo carries itself.

  1. aapt2 compile → linkresources and manifest in, base APK and R.java out
  2. javac (or ecj)Java sources compiled with --release 8
  3. d8.class → classes.dex, added to the APK
  4. zipalign, in pure PythonTermux ships no zipalign package, so ludilo aligns the archive itself
  5. keytool + apksignera local debug.keystore, generated on first run; the APK is signed on the phone
  6. install + launchadb install -r to localhost via wireless debugging, launch via monkey
04 /

Break it out of the box

Termux from F-Droid or GitHub (the Play build is outdated), Android wireless debugging paired to localhost, and a model endpoint you already have. Setup installs nine packages and the android-33 android.jar; it is not a one-command miracle — the docs say what still has to be true about your device.

# in Termux $ sh scripts/setup.sh $ python -m ludilo config Base URL: https://your-endpoint/v1 Model: your-model API key: ******** saved to ~/.ludilo/config.json (0600) $ python -m ludilo "make a flashlight app and install it"

Everything is allowed by default. Then you tighten it, per tool or glob:

$ ludilo limits deny device_* $ ludilo limits confirm install_apk $ ludilo limits deny_shell "rm -rf" $ ludilo status

deny_shell is a plain substring match on shell commands — a tripwire, not a sandbox, and we will not call it one. Every tool-call attempt lands append-only in ~/.ludilo/actions.log. ludilo continue picks the chat back up; ludilo status shows the model, the key, the toolchain and your token totals.

05 /

The gaps, stated

A page that hides its holes is selling you something. These are open, in the repo's own words where possible.

  • One deviceVerified on a Redmi Note 12 Pro, Android 13. "Any Android" is not a claim we can make.
  • Young repo13 commits, all 2026-10-01. The README's Status section still says the APK pipeline has "not yet run on a phone" — commit c4620e2 says otherwise; git log wins.
  • Termux:API appThe termux_api tool needs the Termux:API Android app in practice; setup.sh installs the package but the repo does not document the app. That is a docs gap, not a feature.
  • No license file yetThe repo is public; a license is not chosen yet, so we name none.
  • The model is yoursLudilo calls whatever OpenAI-compatible endpoint you configure. There is no hosted service, no account, no pricing page.
  • "Ask before destructive" is a requestThe system prompt asks the model politely. Only a confirm limit actually enforces it.
06 /

Your phone is
not finished.

Why build apps on a phone with an AI agent? Because it is slightly mad — and now the page agrees with itself again.

Thank you for restoring sanity. The lever is right there in the header if you regret it.