shiv

An AI assistant that runs in your terminal, on the device.

Talk to a model, let it run commands, keep the conversation across sessions. Sign in to OpenRouter through the browser, or paste your own key for any other provider. Since 2.0 it can also build tweaks, end to end, without leaving the phone.

What it does

Reads and edits files, runs shell commands — shell commands and file writes always ask first. What counts as "ask every time" is set in /permissions.

Sessions are saved every turn. Resume the last one, pick an earlier one, or rewind the conversation to an earlier point.

Profiles keep several providers side by side, switchable without losing the conversation.

Tweak and reverse engineering tools — class and method lookup from the device's own dyld cache, a live class dump from a running app, reading what's on screen in a running app, FairPlay decryption on the phone, and an environment probe that runs each tool instead of looking for it. Since 2.5 these live in their own package, shivtools, installed with shiv from this repo — so any CLI can use them, not just shiv.

Screenshots

Startup screen Keyboard shortcuts Command list Environment info

Providers

OpenRouter signs in through the browser — no key to copy — and reaches Claude, GPT, Gemini and Grok with one account.

Also built in: DeepSeek · OpenAI · Moonshot (Kimi) · xAI (Grok) · Qwen · Z.ai (GLM) · Groq · Mistral · Together AI · Ollama or llama.cpp on a computer on your network · any custom OpenAI-compatible endpoint.

Node.js is bundled

Install shiv and it runs. Nothing else to add.

Requirements

Built and used on iPhone 15 Pro (iOS 17.0.3, RootHide) and iPhone XS (iOS 16.1.1, Dopamine rootless). Rootful jailbreaks are untested.

.appex extensions run in their own process and aren't decrypted by this route. Class lookup is verified on iOS 16 and 17; on another version shiv says it can't confirm a name rather than returning a wrong one.

Information

Developermuratkurt
Packagecom.muratkurt.shiv
Version2.5.0
Requiresshivtools · Node.js included
CompatibilityRootHide · rootless
Tested oniOS 17.0.3 · iOS 16.1.1
LanguagesTürkçe · English

Usage

Getting started

shiv

First launch asks for language, provider, API key and model.

Run it as mobile, not as root. Under root the files it writes end up owned by root and ~/.shiv stops being writable.

OpenRouter — no key to copy. Pick OpenRouter in the wizard and the browser sign-in starts by itself: Safari opens the approval page, you confirm with your OpenRouter account, and the key comes back to the app. If the browser cannot be opened automatically, type the short address it prints (http://127.0.0.1:<port>) into any browser on the device.

Any other provider — paste your key at the key step.

Settings live in ~/.shiv and survive upgrades. Sessions are stored locally in ~/.shiv/oturumlar.

Permissions

Shell commands and file writes always ask first. What counts as "ask every time" is set in /permissions, and /preferences covers the rest of the behaviour.

Reading files, listing directories and searching don't ask.

Everyday commands

Command names follow the interface language (/lang), so /login and /giriş are the same command. A prefix is enough — /prof.

/helpcommand list
/loginsign in with a new profile (setup wizard)
/keyshow the key · refresh · remove and sign out
/profileswitch, add or delete profiles
/modelpick a model; the list comes from the provider
/newnew session
/clearclear the screen
/continueresume the last session
/resumepick an earlier session
/exportexport the session to a file
/contextwhat is loaded right now
/notesyour context notes file
/dirworking directory
/add-diradd a working directory
/settingsinterface
/preferencesbehaviour
/permissionswhich commands need approval
/performancedrawing and streaming speed
/themecolour theme
/langinterface language
/namewhat shiv calls you
/geostatus: version, model, session, limits
/envdevelopment environment probe
/devicedevice scan: iOS, model, jailbreak, disk
/macbuild on a Mac over the network
/remoteset up and check the remote build connection
/aboutversion and build
/licencelicence
/quitexit

Press Esc to stop a running answer. Esc again opens rewind, which takes the conversation back to an earlier point.

Shortcuts

↑ ↓history
Ctrl+Rsearch history
Ctrl+Tshow output
Ctrl+Gjump to bottom (fullscreen)
Ctrl+Bsend the running job to the background
Escstop
Ctrl+Cquit
/commands
?shortcut list

A job sent to the background keeps running while you type. Press ↓ to reach the counter at the bottom, Enter for detail, k to stop it, ← to go back to the list, Esc to close. Output appears while the job is still running.

Tweak and reverse engineering

shiv measures the device instead of guessing. Start here:

/env

Reports theos, the SDK, frida, oldabi, the inject directory and the bundled tools — each one actually run, not just looked for, so a broken tool shows as broken.

/device scans the device itself: iOS, model, jailbreak, disk. /mac and /remote set up and check building on a Mac over the network.

On PATH — from shivtools

Since 2.5 the tools ship in com.muratkurt.shivtools, not in shiv. They are on PATH either way, and work from any shell or CLI.

shiv-ortam                 environment probe: jailbreak, theos, SDK, frida, oldabi
shiv-sinif <name>          class/method search from the dyld cache (no frida)
shiv-oku <bundle-id>       live ObjC class dump from a running app (frida)
shiv-cek <bundle-id>       FairPlay decrypt, on the device itself (frida)
shiv-ekran <bundle-id>     what is on screen in a running app (frida)
shiv-pencere               SpringBoard windows and view tree, read-only (frida)
shiv-yol <path>            a path in both namespaces, and which one exists
shiv-prefs-ornek <key>     a working example from Apple's own prefs bundles
shiv-frida-kur             diagnose frida: binary, package, agent, daemon,
                           conflicts and leftovers

Reading the screen

shiv-ekran <bundle-id>            what is on screen now
shiv-ekran --izle 40 <bundle-id>  record every page you open, for 40 s

The app has to be in front. Stay in it until the phone vibrates; the terminal comes back by itself.

In record mode, open the pages one by one and wait for the vibration on each. Every page is saved on its own: /var/mobile/tw/ekran-<bundle-id>-01.txt, -02.txt …

You don't have to type it. Ask shiv to read an app from the screen and it runs it.

TWEAK.md ships with the package and holds the recipes the assistant follows.

frida

shiv-oku, shiv-cek and shiv-ekran need frida-server 16.x — the client is linked against frida-core 16, so a 17.x server cannot talk to it. shiv-frida-kur reports this and changes nothing on its own. It installs the matching 16.1.4 only when you ask:

sudo shiv-frida-kur --kur

Rootless takes the GitHub release deb; RootHide takes it from the RootHide repo, which is unsigned and needs --allow-unauthenticated. The version is then held so an update can't replace it with 17.x.

Building

Tweaks for App Store apps and command line tools build on the phone with nothing to think about.

System process tweaks are arm64e, and the on-device compiler emits an older pointer authentication ABI. Two things in your code trip it: an @"..." string literal, and handing a block to the system. Hooks, selector calls and ivar reads are fine.

oldabi bridges both, and /env reports whether you have it. It does not cover Swift — the Swift runtime authenticates its own pointers somewhere oldabi never reaches, so a Swift arm64e tweak built on the phone still crashes. That one has to be built on a Mac.

For a package other people will install, declare it:

Depends: firmware (<< 15.0) | cy+cpu.arm64v8 | oldabi

Or connect a Mac with /mac and build there for a deb that depends on nothing. Both routes work; shiv explains the difference instead of pushing one.

Environment variables

SHIV_OLUK='╰' shiv

Changes the gutter glyph. Use it if your terminal draws the default one at the wrong width — lines will look one column short.

SHIV_ANLATIM_KATLA=1

Folds the assistant's narration as well as tool output.

SHIV_NODE_CAPRAZ=1

Builds debs on a Mac without a device attached.


Changelog

2.5.0

Changes

Fixed

2.4.0

New

Fixed

2.3.0

Reading the screen

Fixed

2.2.0

Signing in

Profiles

frida

Interface

Packaging

2.1.1

2.1.0

Rootless support, rebuilt

Guidance follows the environment

Packaging

Interface

2.0.0

shiv can now build tweaks end to end, on the device.

Tweak development

Background tasks

Fixed

Documentation — a standalone tweak development guide ships in belgeler/, readable on its own without shiv.

1.3.0

New

Changed

Fixed

1.2.1

Fixed — entering the API key on the setup screen.

1.2.0

Node.js is bundled now. Nothing else to install, on RootHide or rootless.

New

Changed

Fixed

1.0.1

New — /context and /about, plus a detailed activity view on Ctrl+O.

Changed — /model, /profile and /lang are pickable lists now instead of typed arguments. /settings reorganised. Panels behave consistently with each other. Clearer message when you interrupt a reply.

Fixed — duplicate welcome card; model selection getting lost; Turkish strings showing up in the English interface; words breaking mid-word at the edge; session picker breaking on rotation; command names getting truncated.

Better — fewer screen refreshes, and opening or closing the keyboard no longer resizes the panels.

1.0.0

0.2.0

0.1.0

First release.

For personal use on jailbroken devices.