Setup guide · about 30 minutes, most of it downloading
The tweak is only half of it. Apple switched off the service iOS 6's Siri used to call, so the assistant needs somewhere else to ask — and that somewhere is a small server you run on a computer in your own house. This page sets it up from nothing, assuming you have never touched Docker or Ollama in your life.
Every command here is typed on the computer that will run the server — not on the iPad. The device only gets involved at step 3.
What follows
The short version. Pick a computer to run the server on, install an AI assistant on it, let that assistant into your iPad over SSH, then paste it one prompt and answer its questions. About half an hour, most of it downloading.
What this costs: nothing, if you want it to. The tweak, the server and every service it uses are free, and there is no account to make anywhere. Two of the three AI assistants below need a paid plan you may already have — Hermes is free, and doing it by hand needs no assistant at all. Say so now rather than five minutes in.
mynah-server (FastAPI, port
8807 — this is what the device talks to) and
mynah-stt (faster-whisper).0.0.0.0 for the container to reach it..env: MYNAH_MODEL,
OLLAMA_URL, optional SEARXNG_URL,
TMDB_API_KEY, WOLFRAM_APPID. Never set
WHISPER_COMPUTE_TYPE../start.sh, not docker compose up
-d — it picks the CUDA or CPU image for you.GET /healthz is the honest one: it transcribes a silent
clip and generates a token, and always answers 200.http://repo.theadipost.com/ and the server URL in Settings.
Everything is plain http; iOS 6 cannot do modern TLS.The full detail is in the technical page.
Something in your house that is switched on when you want to ask Siri something and is on the same Wi-Fi as the iPad. Not the guest network. That is the whole requirement.
Only one part of this is heavy: the language model. It wants about 3.5 GB of memory to itself and does the actual thinking. Everything else is small. So judge a machine on whether it can hold and run the model.
| Machine | How it goes |
|---|---|
| Mac with Apple Silicon M1 or newer, 16 GB |
The easiest good answer. Fast, quiet, and Ollama uses the GPU with no setup. The catch is sleep: a closed laptop stops answering. Plug it in and set Energy Saver to prevent sleeping, or accept that Siri works when the lid is open. |
| A PC with an NVIDIA card any modern GPU, 8 GB+ RAM |
The best of these. The card makes speech near-instant and its memory lets you run a noticeably better model. If it is a desktop that stays on, this is the one to use. Change one setting if you go this route — see below. |
| An always-on Linux box home server, old PC, mini PC |
Ideal if you have one. Already on, already networked. Without a graphics card, answers take a few seconds longer — perfectly usable. |
| A NAS that runs Docker | Depends which NAS. Intel or AMD with 8 GB+ and real memory free: good. ARM-based (the cheaper models): it will run, slowly. Check what RAM is actually free first — a NAS is usually already several gigabytes into it. |
| Raspberry Pi 5, 8 GB | Works, honestly slow. Around half a minute for a short question. Fine for “what’s the weather”, tiring for conversation. Boot from SSD, not a microSD card. |
| A Windows laptop you already own | Fine to start with. Install Docker Desktop, which sets up WSL2 for you. Like any laptop, it answers only while it is awake. |
The default speech model is small and English-only, because it has to work on a Raspberry Pi. On a GPU it is the weakest part of the whole system, and the errors are the ones that hurt most: it mishears names, which is exactly what the cards are looked up by.
Measured here on ten degraded phrases of the kind this actually gets asked:
| Speech model | Word errors | Time |
|---|---|---|
the default, distil-whisper-small.en |
13.4% | 0.22 s |
large-v3-turbo |
5.3% | 0.48 s |
The default heard “Lionel Messi” as Leonel messy and
“Nvidia stock” as invidious docket — so the player
card and the share price simply could not be looked up. The larger model
gets both right, for a quarter of a second. Put this in your
.env:
WHISPER_MODEL=deepdml/faster-whisper-large-v3-turbo-ct2
Leave it alone on a CPU or a Pi — there it would be slower than it is worth.
A laptop that sleeps at night is a Siri that stops answering at night. The server only replies while the machine is awake, so either keep it plugged in with sleep disabled, or accept that Siri works when the lid is open. This is the single most common reason it “stops working” a day later.
The longer version of this comparison is further down, with timings and the trade-offs spelled out.
This is the assistant that will do the installing. It runs on the computer from step 1 — not on your phone, and not in a browser tab, because it needs to actually run commands there.
Skip the terminal entirely: Claude Code has a desktop app with a normal window and buttons. Download it for macOS, Windows or Linux, sign in, and paste the prompt into it. Nothing below is needed.
Or open one, it takes ten seconds: Mac — ⌘+Space, type Terminal, Return. Windows — Win+X, choose Terminal. Linux — you know where it is.
Free and open source, from Nous Research. Sign in with Nous Portal; no API key, no subscription.
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
hermes setup --portal
Then run hermes chat. There is a
desktop installer on
their site too, if you would rather not use the terminal.
Needs a Claude Pro, Max, Team or Enterprise plan. The free plan does not include it.
# macOS, Linux, WSL
curl -fsSL https://claude.ai/install.sh | bash
# Windows PowerShell
irm https://claude.ai/install.ps1 | iex
# or with Homebrew
brew install --cask claude-code
Then run claude and follow the browser sign-in.
Needs a ChatGPT Plus, Pro, Business, Edu or Enterprise account, or an API key.
npm install -g @openai/codex
# or with Homebrew
brew install --cask codex
Then run codex and choose Sign in with ChatGPT.
Any assistant that can run commands on the machine will do — Gemini CLI, Copilot in a terminal, Cline, Aider. The prompt does not assume any particular one.
The finished system does not phone anyone —
what it does with your words is set out at the bottom,
and the short answer is that your questions go to your own machine and
nowhere else. Setting it up with an assistant is a different question.
Claude Code and Codex send what they read and type to Anthropic and OpenAI
respectively, for as long as you have them open. That includes this prompt,
the contents of your .env, and any API keys you paste in.
If that is not a trade you want to make, take the by-hand route. It is the same software and the same result, and nothing about it involves an AI at all. Hermes with a local model is a middle path, though the hosted Nous Portal sign-in is not.
Two things on the device itself. The first is required — it is the tweak. The second is optional and lets the assistant finish the job instead of handing you homework.
http://repo.theadipost.com/
Plain http://, not https — an iOS 6 device cannot
validate a modern certificate, so an https source refuses to load on exactly
the devices this is for.With SSH access the assistant checks the tweak installed properly, writes the server address into Settings for you, and reads the tweak's own log if something misbehaves. Without it, you type the address in by hand at the end — about six taps.
192.168.1.42.root and
the password is alpine — the same on every jailbroken
device, so anyone else on your Wi-Fi could use it too. On a home network
that is usually fine; on a shared or public one, passwd changes
it.
ssh root@YOUR-IPAD-IPssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa -o KexAlgorithms=+diffie-hellman-group14-sha1 root@YOUR-IPAD-IPReasonable. Skip this whole step — everything still works. You will install the tweak from Cydia yourself and type the server address into Settings → iOS 6 Siri Remastered by hand, which is about six taps. If you do install OpenSSH, you can always remove it from Cydia afterwards.
Paste this into the assistant and answer its questions. It explains what it is about to do before each step, and asks before installing anything.
You are not expected to read this. It is written for the machine, and it is long because it spells out the things that otherwise go wrong. Press Copy and paste it — understanding it is optional.
I want you to set up the self-hosted server for "iOS 6 Siri Remastered", a
jailbreak tweak that brings Siri back to life on a jailbroken iPhone or iPad
running iOS 6. Apple retired the service the original Siri called, so the
tweak points the device at a small server on the local network instead. You
are running on the machine that is going to BE that server.
HOW I WANT YOU TO WORK
- Tell me in plain language what you are about to do before each step.
- Ask me before you install anything or change a system setting.
- Never run sudo without first telling me what the command does.
- If something fails, show me the real error instead of guessing at it.
- Assume I have never used Docker or Ollama. Explain, briefly, as you go.
WHAT WILL BE INSTALLED
1. Docker, including Docker Compose. macOS and Windows: Docker Desktop.
Linux: docker.io plus docker-compose-plugin, or Docker's own repository.
2. Ollama, from https://ollama.com. It runs the language model, directly on
this machine, NOT inside a container.
3. One language model: gemma4:e4b. That is what this software was built and
tested on, so use it unless I ask for something else.
4. The server stack itself: two Docker containers. "mynah-server" is a
FastAPI service on port 8807, which is the one the iPad talks to.
"mynah-stt" is faster-whisper, which turns recorded speech into text.
STEPS
1. Look at this machine and tell me what it is: operating system, processor,
how much RAM, and whether there is an NVIDIA GPU. Say plainly whether it
is comfortable for this. If it is a Raspberry Pi or has under 8 GB of
RAM, warn me that answers will take tens of seconds, and only then offer
a smaller Ollama model as an alternative -- otherwise do not raise the
subject of model choice at all.
2. Install Docker if it is not already there. Verify with:
docker --version
docker compose version
Both must print a version. If the second one fails, Compose is missing;
install docker-compose-plugin (some distributions call it
docker-compose-v2). On Linux, add me to the docker group so I am not
typing sudo constantly, and tell me I must log out and back in for that
to take effect.
3. Install Ollama if it is not already there, then pull the model and list
what is installed:
ollama pull gemma4:e4b
(this model needs Ollama 0.20.0 or newer -- if the pull is refused,
update Ollama first, then retry)
ollama list
ON LINUX ONLY, and this catches everyone: Ollama listens on 127.0.0.1 by
default, and a Docker container counts as a different machine, so the
server will start, look healthy, and fail every single question. Fix it
one of two ways -- either set Environment="OLLAMA_HOST=0.0.0.0" under
[Service] via `sudo systemctl edit ollama`, then daemon-reload and
restart it; or leave Ollama alone and put this machine's own LAN address
into OLLAMA_URL in step 5. On macOS and Windows nothing needs changing,
because Docker Desktop already resolves host.docker.internal.
4. Download and unpack the server bundle, into a folder I choose (ask me
where; somewhere durable, not /tmp):
curl -O http://repo.theadipost.com/ios6-siri-server.tar.gz
tar xzf ios6-siri-server.tar.gz
cd ios6-siri-server
cp .env.example .env
That copy is required, not optional: docker compose reads .env and stops
with an error if it is missing. Read .env.example before editing -- every
setting is documented inline in it -- and note the docs/ folder beside it,
which has the long-form SERVER-SETUP, API-KEYS and TROUBLESHOOTING
documents if you need more detail than I have given you here.
5. Edit .env. It is plain NAME=value lines, no quotes, no spaces around the
equals sign. This file is the ONLY place the model and the API keys are
configured -- there are no such fields on the iPad. The settings that
matter:
MYNAH_MODEL= gemma4:e4b, exactly as `ollama list` prints it
OLLAMA_URL= http://host.docker.internal:11434 is correct on
macOS and Windows; on Linux see step 3
SERVER_PORT= 8807. Change it only if something already has that
port, and then tell me the new number
DEFAULT_UNITS= imperial (Fahrenheit, miles) or metric
DEFAULT_CITY= ask me for my town. This is what "the weather" and
"restaurants near me" mean when I do not name a
place. DEFAULT_LAT and DEFAULT_LON are optional and
make "near me" sharper
PUBLIC_BASE= LEAVE THIS BLANK. The server works out its own
address from the device's request. Setting it wrong
is a common way to break images
TMDB_API_KEY= optional. Unlocks the movies card
WOLFRAM_APPID= optional. Richer answer card, with plots
Ask me once, in passing, whether I already have a TMDB key or a Wolfram
AppID, and put them in if I do. Do not send me off to sign up for either:
both are free but entirely optional, and six of the seven cards need no
key at all. Either can be added months later with a restart.
6. Start it, and warn me first that the very first start downloads container
images and a speech model and can take several minutes:
./start.sh
./start.sh logs
Use ./start.sh, NOT `docker compose up -d`. On a machine with a usable
NVIDIA GPU, plain compose silently leaves the GPU out: the speech
container comes back on the processor, everything gets slower, and
nothing reports a fault. start.sh detects the GPU and picks the right
override. If you ever need to check which image is actually running:
docker inspect -f '{{.Config.Image}}' mynah-stt
A name ending -cuda is the GPU image; -cpu is not.
Watch the log until it settles, then stop watching with Ctrl-C.
7. Verify, in this order, and show me the output of each one:
curl http://localhost:8807/healthz
Expect JSON containing "status":"ok". If it says "stt":"unreachable", the
speech container is probably still downloading its model -- wait a few
minutes and check `./start.sh logs`.
curl "http://localhost:8807/debug?q=weather+in+London"
curl "http://localhost:8807/debug?q=AAPL+stock"
/debug runs the complete pipeline except transcription, from typed text.
Each should return JSON with a "speak" line and a "cards" array. If these
two work, then everything except the microphone works, and anything still
wrong afterwards is between the iPad and this machine. This is the single
most useful diagnostic on the whole server; remember it.
curl http://localhost:8807/config
Reports what the server actually believes it is configured with. Any keys
come back redacted to their last four characters.
8. Find this machine's address on the local network and tell it to me
clearly:
macOS: ipconfig getifaddr en0
Linux: hostname -I
Windows: ipconfig, and read the IPv4 Address of the active adapter
A local address starts 192.168., or 10., or 172.16 through 172.31.
Anything starting 127. is the machine talking to itself and is wrong.
Then make sure the port is reachable from outside this machine: if
there is a firewall (ufw on Linux, the application firewall on macOS,
Defender on Windows), open TCP 8807 and tell me exactly what you changed.
9. Make it survive a reboot, and tell me what you did:
- Docker starting at boot or login (systemctl enable docker on Linux;
the "start at login" setting in Docker Desktop otherwise)
- Ollama the same (systemctl enable ollama on Linux)
- Tell me to give this machine a static address or a DHCP reservation
in my router, because if the number changes Siri stops working one
morning for no visible reason
- If this is a laptop, tell me how to stop it sleeping. Siri only
works while this machine is awake.
10. THE DEVICE, IF I GIVE YOU ITS ADDRESS. Ask me whether I installed
OpenSSH on the iPad and, if I did, ask for its address. With it you can
finish the job instead of handing it back to me. Without it, skip to 11.
An iOS 6 device runs an SSH server old enough that a current client
refuses it outright, so you need these flags every time -- if you get
"no matching host key type" or "no matching key exchange method", this
is why, not a wrong password:
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa -o KexAlgorithms=+diffie-hellman-group14-sha1 root@
The login is root / alpine unless I tell you I changed it.
With that working, do these and tell me the result of each:
a. Check the tweak is installed:
ls /Library/MobileSubstrate/DynamicLibraries/SiriRemastered.dylib
If it is missing, tell me to add http://repo.theadipost.com/ as a
source in Cydia and install "iOS 6 Siri Remastered", then re-check.
b. Write the server address into the tweak's settings, so I do not have
to type it on a touchscreen. The file is
/var/mobile/Library/Preferences/com.aditya.ios6siriremastered.plist
Set ServerURL to http://:8807 and Enabled
to true. It is a binary plist; if the device has no usable plist
editor, copy it to this computer, edit it here, copy it back, and
chown it back to mobile:mobile. Do NOT invent other keys.
c. Reload the daemon so it picks the settings up:
killall assistantd
d. Tell me to hold the Home button and ask "what is the weather".
If something is wrong, create /var/mobile/Media/sr-log.txt on the
device, have me ask again, then read that file -- the tweak writes
what it did into it. Delete the file when we are finished.
11. Finish by printing, as the last thing you say, exactly what I have to
type on the iPad. If you did step 10 there is nothing left to type and
you should say so. Otherwise there is only one thing, and this is it:
Settings -> iOS 6 Siri Remastered -> Server URL
http://<this machine's LAN address>:8807
Plain http://, never https:// -- an iOS 6 device cannot validate a
modern certificate and https will never work. Include the port. No
trailing slash. That is the whole of the device setup: the rest of that
pane is an Enabled switch, my town and units, and a switch per card,
all of which have sensible defaults.
THINGS TO KNOW WHILE YOU WORK
- The iPad and this machine must be on the SAME network. Guest Wi-Fi and
separate VLANs exist specifically to stop devices reaching each other, and
they will silently break this.
- Do not port-forward 8807 and do not expose this to the internet. The
server has no authentication by design, and iOS 6 cannot encrypt anything,
so everything between the device and the server is plain text on the LAN.
- The server has to be running for Siri to answer. There is no cloud
fallback and no queue; if the machine is off, Siri is silent.
- The first question asked after any restart is slow, because the language
model and the speech model both load into memory on first use. Ten seconds
to a minute is normal and is not a fault.
There is a second prompt for when something is wrong later, on the prompts page.
Two machines, on the same Wi-Fi, and nothing else. No Apple ID, no developer account, and no API keys — the assistant is fully usable without signing up for anything.
Both MobileSubstrate and PreferenceLoader are ordinary Cydia packages and are pulled in automatically when you install the tweak, so in practice you only need to check that Siri itself exists on the device. If Settings has no Siri switch, this device never had it and the tweak has nothing to hook.
Only one part of this is demanding: the language model. Everything else — the small web service, the speech container, the optional search engine — is light enough to be beside the point. So when you are judging a machine, judge it on whether it can hold and run the model. That is the whole question.
The device talks to the server directly, over your LAN. If the iPad is on the guest Wi-Fi and the computer is on the main one, nothing will ever connect — guest networks exist precisely to stop devices reaching each other. Same SSID, same VLAN, no client isolation.
It also has to be a machine that stays on. Siri works while the server is running and does not while it is not; a laptop that sleeps at night is a Siri that stops answering at night.
This needs a computer in your house that is switched on when you talk to Siri. That is the whole requirement, and it is the part people miss.
It does not have to be a “server” in any formal sense. There is no domain name to buy, no static address, no port to forward, no account to open, and nothing to expose to the internet. A laptop sitting open on a desk is a perfectly good server for this. So is the desktop you already use, the NAS in the cupboard, or a £60 single-board computer on a shelf.
What the machine has to be is on, awake, and on the same Wi-Fi as the iPad at the moment you hold the home button. Nothing else about it matters much — and the difference between the options below is only how long you wait for an answer.
The easiest good answer. Ollama uses the Mac's own GPU with no
configuration whatsoever — no drivers, no toolkit, no override file
— and the tested model is genuinely snappy on one: once it is warm,
the answer starts arriving about as fast as you can put the iPad down. Even
the base 8 GB machines are fine. Docker Desktop's
host.docker.internal works out of the box, so the Linux
networking footnote further down never applies to you.
The one catch is sleep. A Mac that has gone to sleep is a server
that is not answering. If it is a laptop, keep it plugged in and set
System Settings → Lock Screen so the display can sleep but the
machine does not, or simply leave caffeinate -s running in a
Terminal window for as long as you want Siri available. On a Mac mini or a
desktop, turn off automatic sleep in Energy and forget about it.
Transcription still runs on the processor rather than the Mac's GPU — the speech container cannot reach Apple's GPU — but on Apple Silicon that is a second or two for a short question, which nobody notices.
If you already have a machine with a real graphics card in it, put the server there. The GPU makes transcription close to instant with the override file in step 5, and, more importantly, the card's memory is what lets you run a model several times larger than a laptop can hold. That is the difference between an assistant that picks the right card and one that also talks like a person.
A homelab machine is also already on all the time, which is the other half of the problem solved.
Tempting, because it is already on all the time and already runs containers. Whether it works comes down to what is inside it, and NAS boxes vary far more than their price suggests.
A NAS with a modern Intel or AMD processor and 8 GB or more is a genuinely good home for the small web service, the speech container and the search engine. Those parts are light. The language model is the part that will hurt: it wants around 3.5 GB to itself, and a NAS is usually already several gigabytes into its RAM running everything else you put on it. Check what is actually free before you count on it.
A NAS with an ARM processor — common in the cheaper models — will run the containers and then be painfully slow at the model, in the same way a Raspberry Pi is, and usually without the option of adding memory.
A reasonable split, if you have both: let the NAS keep doing what it is good at, and put the model on whichever machine in the house has the most memory or a graphics card.
This works, and there is a real appeal to it: a few watts, no fan, no noise, and it can live behind the router forever. But be clear-eyed about the speed. A Pi has no GPU worth using here, so both the transcription and the language model run on its processor.
In practice, on a Pi 5 with 8 GB, expect the whole round trip — transcribe, think, fetch the data, answer — to take somewhere in the region of half a minute for a short question, and longer for anything the model has to write a paragraph about. On a Pi 4 it is slower again, and a smaller model is the only lever you have; it will then misunderstand you more often. This is the one machine where it is worth swapping the model.
That is fine for “what’s the weather” or “what’s the score”, where you ask and then go and do something else. It is tiring for conversation. If you go this route, use a 64-bit OS, boot from an SSD rather than a microSD card, and keep the 8 GB model — 4 GB will swap and turn seconds into minutes.
A Synology, UGREEN, QNAP, TrueNAS or Unraid box is an appealing home for
this, because the one thing it definitely is, is switched on. Anything with
a normal Intel or AMD processor and 8 GB of memory behaves like the
desktop row in the table below. Check two things first: that its Docker
package (Container Manager, Container Station, or plain
docker compose over SSH) can run a Compose file of your own,
and that the processor is not one of the low-end ARM chips some cheaper
units ship with — those will run the containers and then crawl.
Ollama does not have to live on the same box. If the NAS is modest but
there is a desktop elsewhere in the house, run the server on the NAS and
point OLLAMA_URL at the desktop's address instead.
A 2015 desktop with 8 GB and no graphics card is a completely
respectable machine for this, and an old laptop has the pleasant property of
a built-in battery for power cuts. Install a plain Debian or Ubuntu, follow
the steps below, and read the Linux notes carefully — the
OLLAMA_HOST footnote in step 2 is the one
thing that catches everybody. Close the lid and it will suspend unless you
tell it not to.
All of these assume the tested model and a warm start. The very first question after a start is always slower, on every machine, for the reason explained in step 5. Treat them as the shape of the thing rather than a benchmark.
| Machine | What asking a question feels like |
|---|---|
| Mac with Apple Silicon | A couple of seconds, most of it transcription. Close to how Siri felt when it worked. |
| PC with an NVIDIA GPU | The fastest of the lot, and the only place a much larger model is worth running. |
| Desktop or NAS, x86, no GPU, 8 GB | Several seconds. Unremarkable, in the good sense. |
| Raspberry Pi 5, 8 GB | Around half a minute for a short answer, and you will notice it. Fine for the weather; tiring for chat. |
| Raspberry Pi 4, 8 GB | Slower again, and a smaller model gets things wrong more often. It works. That is the honest claim. |
None of it is a commitment. The server is a folder with a
docker-compose.yml in it; moving it to a different machine is
copying the folder, running docker compose up -d there, and
typing the new address into Settings on the iPad. Start on whatever you
have.
You hold the home button and ask a question, exactly as you always did. The tweak records what you said and posts the audio to your server. The server turns it into text, works out what you wanted, fetches the live data from a public source, and sends back JSON. The device draws that JSON with Apple's own Siri card code — nothing here is a reskin.
Plain HTTP over your LAN on the left; ordinary HTTPS to the open internet on the right. Apple is nowhere in the diagram.
Three programs do the work, and you install them in that order:
mynah-server, the service
the device talks to on port 8807, and
mynah-stt, which turns speech into text.Docker packages the server and its dependencies into containers, so starting it is one command instead of an afternoon. Docker Compose is the part that starts several containers together from a single file; on current versions it ships with Docker itself.
Install Docker Desktop from docker.com. On Windows, accept the WSL2 backend when the installer offers it. Open the app once after installing, and turn on Start Docker Desktop when you log in in its settings — otherwise the server does not come back after a reboot.
The quickest route is your distribution's own packages:
sudo apt update
sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable --now docker
Then add yourself to the docker group so you are not typing
sudo in front of everything, and log out and back in for it to
take:
sudo usermod -aG docker "$USER"
Package names wander between distributions: if apt cannot find
docker-compose-plugin, yours may call it
docker-compose-v2. If it has neither, or its Docker is ancient,
install Docker Engine from Docker's own repository instead — those steps
are in docs/SERVER-SETUP.md inside the bundle you download in
step 3.
docker --version
docker compose version
Both must print a version number. If the first works and the second says
compose is not a docker command, you have Docker without
Compose — install docker-compose-plugin, or
docker-compose-v2 if that is what your distribution ships.
Ollama is what actually runs the language model on your machine. It reads the question, decides which kind of answer it is — weather, a score, a ticker, a restaurant — pulls the details out, and phrases the sentence Siri speaks. Install it from ollama.com: there is a normal installer for macOS and Windows, and a one-line script for Linux.
Then pull the model. This is the one iOS 6 Siri Remastered was built and tested on, and there is no decision to make here:
ollama pull gemma4:e4b
Ollama 0.20.0 or newer is required for this model — the tag
will refuse to pull on anything older. If it complains, update Ollama and try
again. Other Ollama models work too, but gemma4:e4b is the one
this was built and tested against.
When it finishes, check that it landed — the name in this list, tag and all, is the name the server wants:
ollama list
Any other Ollama model works too, if your machine suits a different one:
pull it, put its name in MYNAH_MODEL, restart, done. Nothing
else in the setup depends on which one you chose. But you do not need to
think about it now, and the tested one is the one to start with.
Ollama listens on 127.0.0.1 by default, which means
“this machine only”. A Docker container counts as a different
machine, so the server will start, look healthy, and fail every single
question. Tell Ollama to listen on all interfaces:
sudo systemctl edit ollama.service
Add these two lines in the editor that opens, save, and restart:
[Service]
Environment="OLLAMA_HOST=0.0.0.0"
sudo systemctl daemon-reload
sudo systemctl restart ollama
Not using systemd? Start it by hand with
OLLAMA_HOST=0.0.0.0 ollama serve. On macOS and
Windows none of this applies: Docker Desktop resolves
host.docker.internal to the machine hosting the container,
which is what the shipped configuration already points at.
The server is a small bundle: a docker-compose.yml, the
service source in orchestrator/, an .env.example
documenting every setting, and the reference documentation. Download it onto
the machine that will run it and unpack it:
curl -O http://repo.theadipost.com/ios6-siri-server.tar.gz
tar xzf ios6-siri-server.tar.gz
cd ios6-siri-server
Everything from here on is run from inside that folder, because
that is where docker-compose.yml lives and every
docker compose command looks for it in the current
directory.
Now make your own configuration file from the example:
cp .env.example .env
The compose file reads .env, so without it
docker compose up stops with an error before anything starts.
Copying it is enough — the file works unedited, and every value in it
is optional.
Open .env in any text editor. It is a plain list of
NAME=value lines — no quotes, no spaces around the
= — and a # at the start of a line comments it
out. Two settings are worth changing on the first pass; the rest have working
defaults.
# The model you pulled in step 2, exactly as `ollama list` prints it.
MYNAH_MODEL=gemma4:e4b
# Where Ollama is. Correct as shipped on macOS and Windows.
# On Linux, this works once Ollama listens on 0.0.0.0 (see step 2);
# if you would rather not touch systemd, put the machine's own LAN
# address here instead: OLLAMA_URL=http://192.168.1.50:11434
OLLAMA_URL=http://host.docker.internal:11434
This is the fallback for questions with no place in them — “what’s the weather”, “restaurants near me”. Naming a place in the question always wins over it, and so does the Location field on the device. Coordinates are optional but make “near me” meaningfully sharper. All three ship commented out:
DEFAULT_CITY=Springfield, IL
DEFAULT_LAT=39.7817
DEFAULT_LON=-89.6501
# imperial (Fahrenheit, miles) or metric (Celsius, kilometres)
DEFAULT_UNITS=imperial
Leave them out entirely and nothing breaks — Siri asks you to name a place rather than guessing at one.
Both are free, both are covered in step 9, and both can be added months later without reinstalling anything:
TMDB_API_KEY=4f1c2b9a7d3e5f8091a2b3c4d5e6f7a8
WOLFRAM_APPID=XXXXXX-XXXXXXXXXX
SEARXNG_URL=http://host.docker.internal:8088
| Setting | Default | What it is for |
|---|---|---|
SERVER_PORT | 8807 |
The port the device connects to. Change it only if something else on the machine already has 8807 — and then use the new number in the device’s Settings too. |
PUBLIC_BASE | blank | Leave it blank. The server learns its own address from the device’s request, so images work without you typing an IP anywhere. Set it only behind a reverse proxy. |
WHISPER_MODEL | faster-distil-whisper-small.en |
The speech model. English-only, small and accurate for one-sentence commands. Bigger ones are slower and rarely better here. |
WHISPER_COMPUTE_TYPE | int8 |
int8 on a processor, float16 on an NVIDIA
GPU. The GPU override file sets this for you. |
WHISPER_TTL | 300 |
Seconds of quiet before the speech model unloads to give the memory back. It reloads on the next question. |
MYNAH_RESTAURANT_RADIUS | 2000 |
How far to look for restaurants, in metres. Raise it in the countryside, lower it in a dense city. |
MYNAH_STAGE_BUDGET | 3.5 |
Seconds allowed for fetching a card’s images before the card is sent anyway. Slow images keep downloading and are ready next time. |
MYNAH_IMG_CACHE_MAX | 64 MB | How large the poster and logo cache may grow before the oldest files are swept. |
Editing .env does nothing on its own — the running
container still holds the old values. Every edit is followed by
./start.sh, which is fast once the images exist.
From the folder with docker-compose.yml in it:
./start.sh
That is the one command to remember. It works out whether this machine has
a graphics card it can actually use, starts the containers the right way for
the answer, waits until the server is genuinely ready, and tells you if
anything in your .env would have broken it.
./start.sh, not docker compose up -d
Plain docker compose up -d does start the stack, and on a
machine with no graphics card it is the same thing. On a machine with
one it quietly leaves the GPU out — the speech container comes back on
the processor, and everything you say takes a second or two longer than it
should, with nothing anywhere reporting a fault.
It is not a hypothetical: it is how the author's own server spent a week running transcription on the CPU beside an idle graphics card. If you ever suspect it, ask Docker what it actually started:
docker inspect -f '{.Config.Image}' mynah-stt
A name ending -cuda is the GPU image; -cpu is
not.
Docker has to download the images, build the server, and pull down the speech model — several minutes on a decent connection. Later starts take a couple of seconds. Then the first question you ask is slow again, because the language model and the speech model both load into memory on first use. That one can take anywhere from ten seconds to a minute. It is not broken; it is warming up.
Watch what it is doing. -f follows the log as it happens, and
Ctrl-C stops watching without stopping the server:
docker compose logs -f mynah-server
The handful of commands worth remembering:
./start.sh # start, or restart after a change
./start.sh ps # is everything running?
./start.sh logs # follow the log
./start.sh down # stop everything
./start.sh --build # after editing the server itself
Every one of those is a thin wrapper over the equivalent
docker compose command, so nothing is hidden from you — but
the wrapper keeps the graphics-card decision consistent, which is the part
that is easy to get silently wrong.
Both containers are declared restart: unless-stopped, so
Docker brings them back after a crash and after a reboot — as long as
Docker itself starts at boot, and Ollama does too
(sudo systemctl enable ollama on Linux; the installer handles it
elsewhere).
Everything runs on the processor by default, and that is a perfectly normal way to run it: transcribing a three-second question takes one to three seconds on a modern CPU. A GPU makes that part close to instant, and changes nothing else — the language model is Ollama's business, not the containers'.
With an NVIDIA card, its drivers, and the NVIDIA Container Toolkit installed, add the GPU override file to the command:
docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d
That swaps in the CUDA image and switches the compute type to
float16. Everything else is inherited unchanged. AMD cards and
Apple Silicon GPUs are not supported for transcription; those machines use
the processor, which works.
Before involving the iPad at all, prove the server is healthy. On the server machine:
curl http://localhost:8807/healthz
You want something like this:
{"status":"ok","stt":"Systran/faster-distil-whisper-small.en",
"llm":"gemma4:e4b","search":"duckduckgo","movies":"needs TMDB_API_KEY"}
"stt":"unreachable" means the speech container is still
downloading its model or failed to start — give it a few minutes, then
read docker compose logs -f mynah-stt.
Now the part that saves the most time. /debug takes a typed
question and runs it through the entire pipeline apart from transcription, so
it tests the model, the intent routing, the data sources and the card
building in one go — no device, no microphone:
curl "http://localhost:8807/debug?q=weather+in+London"
curl "http://localhost:8807/debug?q=AAPL+stock"
curl "http://localhost:8807/debug?q=who+won+the+Yankees+game+last+night"
Each should return JSON with a speak line and a
cards array. If these work, everything except the microphone
works, and any problem left is on the network between the two machines.
You can also ask the server what configuration it is actually using. Keys come back redacted to their last four characters, so you can confirm you typed one correctly without it being printed:
curl http://localhost:8807/config
The device needs the server machine's address on your own network. On
macOS, where en0 is usually Wi-Fi:
ipconfig getifaddr en0
On Linux — this may print several, and you want the one on your LAN:
hostname -I
On Windows, look for the “IPv4 Address” line under your active adapter:
ipconfig
A local address almost always begins 192.168. or
10., and occasionally 172.16. through
172.31.. Anything starting 127. is the machine
talking to itself and will never work from the iPad.
Confirm it from a different computer on the same Wi-Fi, which is the same trip the device will make:
curl http://192.168.1.50:8807/healthz
If that fails while localhost works, a firewall is in the
way. On Linux with ufw: sudo ufw allow 8807/tcp. On macOS and
Windows, allow the incoming connection when the system asks — and if
you dismissed that prompt weeks ago, find it in the firewall settings.
Home routers hand out addresses that change after a reboot. Give the server machine a static address, or a DHCP reservation in your router — otherwise Siri stops working one morning for no visible reason, and the reason is that the number moved.
Now the iPad. In Cydia, go to Sources → Edit → Add, enter the repository address, then find iOS 6 Siri Remastered under Tweaks and install it:
http://repo.theadipost.com/
Cydia will pull in MobileSubstrate and PreferenceLoader if they are not already there. When it finishes, respring.
Open Settings. There is a new row, iOS 6 Siri Remastered, with everything the tweak knows about the world inside it.
| Field | What to put in it |
|---|---|
| Server URL | Your machine’s address from step 7, with the port:
http://192.168.1.50:8807. Plain http://,
never https://. Include the port. No trailing slash.
A bare 192.168.1.50:8807 is accepted too — the
tweak adds the http:// for you. |
| Enabled | The master switch. Turn it off and Siri goes back to being stock iOS 6 Siri, which is to say it stops working — but it stops working the way Apple left it, with nothing hooked. Note that the tweak stays completely inert until a Server URL is set, whatever this switch says. |
Location is a place name, not a GPS fix —
Springfield, IL or a neighbourhood is plenty. It is what
“the weather” and “restaurants near me” mean when you
do not name a place, and it overrides the server’s
DEFAULT_CITY. Naming a place in the question beats both.
Units picks Fahrenheit and miles, or Celsius and kilometres, and is sent with every request.
Six switches, one per kind of result card: Answers & Maths, Weather, Sports, Stocks, Movies and Restaurants. Turning one off does not turn the subject off — Siri still answers out loud, just without drawing the card. It is the switch to reach for if a particular card ever misbehaves on your device.
They ship on. If the Restaurants switch reads Off before you have touched it, flip it on and back to where you want it, so the setting is written explicitly.
Web Cards is a seventh switch and it ships off. It uses a web view Apple built into the iOS 6 Siri card and never shipped a use for, which makes it the newest and least-proven thing here — so it is opt-in. With it on, ask “are you working?” and the status comes back drawn in it.
Siri can create a note in the Notes app. Create Notes ships off; turn it on and “make a note to buy milk” writes one. Ask without saying what it should say and it asks you, then listens for the answer.
It says it saved a note only after the Notes app confirms it really did. If the write fails, it says that instead.
Everything else Siri could once do to the device — timers, alarms, reminders, messages, calls, playing music, controlling lights — it cannot do, and it says so plainly rather than pretending. That is deliberate, not an oversight: an assistant that says “I’ve set that timer” without setting one is worse than one that admits it cannot.
There are no key fields on the device, and no model picker.
Both live on the server, in its .env file, and nowhere
else.
The last group in the pane is a note rather than a form, and it says so. Two free keys unlock two things — TMDB the movies marquee, and WolframAlpha the rich answer card with its plots and tables. Every other card, plus general questions and maths, needs no key at all (see below). Both are covered in step 9, and both can be added months later without touching the device.
| What | Set it on the server as | Unlocks |
|---|---|---|
| TMDB key | TMDB_API_KEY | The movies card |
| Wolfram AppID | WOLFRAM_APPID | Answer card pods and plots |
| Language model | MYNAH_MODEL | Which model Ollama runs. gemma4:e4b is the tested one |
There is a good reason it is arranged this way, beyond keeping the pane
short. iOS 6 cannot speak modern TLS, so anything typed on the device
would cross your network in plain text and then sit in a plist on the iPad.
In .env a key never leaves the machine it is on. The pane also
makes no network calls of any kind, which is why it opens instantly on a
2012 device instead of waiting on your LAN.
You are finished: the device works, and everything below is a genuine
extra rather than a missing piece. Three of them, none required, all of them
addable months from now without reinstalling anything — each is an edit
to .env and a docker compose up -d.
SearXNG is a metasearch engine you host yourself: it queries the public engines on your behalf and returns the results with none of the tracking. The server uses it for open questions if you point it at one, and falls back to DuckDuckGo if you do not — so this is a genuine upgrade, not a requirement.
Put this in its own folder, in a file called
docker-compose.yml:
services:
searxng:
image: searxng/searxng:latest
container_name: searxng
restart: unless-stopped
ports:
- "8088:8080"
volumes:
- ./searxng:/etc/searxng
Start it once with docker compose up -d so it writes its
configuration, then open searxng/settings.yml and make sure the
JSON format is enabled — it is off by default, and without it the
server gets HTML it cannot read:
search:
formats:
- html
- json
Restart it (docker compose restart), then tell the Siri
server where it is, in .env, and restart that too:
SEARXNG_URL=http://host.docker.internal:8088
curl http://localhost:8807/healthz should now report
"search":"searxng" instead of duckduckgo.
This is the only card gated behind a key, and the key is free. Without it, “what’s playing” still gets answered — as a plain web answer instead of the “Now Playing” marquee with poster art.
http://localhost are perfectly
acceptable answers..env as TMDB_API_KEY= and run
docker compose up -d.A free AppID allows 2000 non-commercial queries a month, which ordinary use never approaches: the server only consults Wolfram for genuine computation and knowledge questions, and caches repeats.
.env as WOLFRAM_APPID= and
run docker compose up -d.What it buys you is the good version of the answer card. Wolfram returns its answer as image “pods”, which Siri draws in full: ask for the integral of x squared and you get the typeset integral and a plot of the curve; ask for the population of Japan and you get the figure with its historical chart and age pyramid. This also sidesteps a limit of the card itself, where a line of text is drawn on one row and truncated with an ellipsis — an image is never truncated.
Without it, maths, unit conversions and definitions are still computed on your own machine, and factual questions still come back from web search. You get sentences instead of plots.
Worth saying plainly, because it is unusual: you can install this, run the server, and never sign up for anything. Six of the seven cards need no key, ever.
| Card | Where the data comes from | Key |
|---|---|---|
| Weather | Open-Meteo — current conditions, seven-day and hourly | None |
| Sports | ESPN’s public JSON — live and final scores, records, per-period line scores, team logos | None |
| Athlete | ESPN — headshot, number, position, birthplace, height and weight, a four-cell stat grid | None |
| Stocks | Yahoo Finance — price, change, day range, market cap, 52-week range, volume, P/E | None |
| Restaurants | OpenStreetMap via Overpass and Nominatim; photos from Wikidata and Wikimedia | None |
| Answers & Maths | Your SearXNG or DuckDuckGo, plus maths, unit conversion and definitions computed locally | None |
| Movies | TMDB — now playing, genres, posters, runtime, score | TMDB |
General conversation and arithmetic need nothing either: those are the local model and the server’s own calculator.
Some things are missing because no free source for them exists, and a card that invents them would be worse than a card that omits them.
A normal installation needs none of this. Add the source in Cydia, install the tweak, type your server address into Settings. Done.
That is worth saying first, because the rest of this section is a list of developer tools and it would be easy to conclude the tweak is harder to install than it is. It is not. Everything on the device happens in Cydia and in Settings, with your fingers, and most people will never need what follows.
But two things change that. If you want to hand the setup to an AI assistant (step 2), or if something goes wrong and you need to see what the device is actually doing, then the AI — or you — needs a way to reach the iPad from a computer. Sorting that out takes ten minutes and is worth doing before you need it, because the moment you need it is the moment the device is misbehaving.
Both are declared as dependencies, so Cydia installs them for you without asking and you would normally never think about them. It is still worth knowing what they are:
SiriRemastered.plist, sees that the tweak wants
assistantd, and loads the tweak's library into that process
when it starts. Practically every jailbreak installs it as part of
itself.Install OpenSSH from Cydia — it is in the default sources, under Networking. It starts by itself and keeps running. That gives you a command line on the iPad from any computer on the same network.
The login is root / alpine, which is the same on
every jailbroken device. passwd changes it if you are on a
network you do not control.
To find the device's address, on the iPad open Settings →
Wi-Fi, tap the blue arrow beside the network you are on, and read
IP Address. It will look like 192.168.1.42. That number
can change when the router reboots, exactly as the server's can, so pin it in
the router if you find yourself looking it up often.
The SSH server on iOS 6 is old enough that current versions of
ssh will not talk to it at all. You get no matching host
key type found, or Unable to negotiate, and it looks
like the device is unreachable when it is simply speaking an older dialect.
Ask for the old algorithms explicitly:
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa -o KexAlgorithms=+diffie-hellman-group14-sha1 [email protected]
If it still refuses, add
-o Ciphers=+aes128-cbc,3des-cbc. Rather than typing that every
time, put it in ~/.ssh/config on the computer and then just say
ssh ipad:
Host ipad
HostName 192.168.1.42
User root
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
KexAlgorithms +diffie-hellman-group14-sha1
If you would rather not run an SSH server on the device, or the Wi-Fi is the thing that is broken, the USB cable works. libimobiledevice is a set of open-source tools that speak to an iOS device over USB, and the log reader in particular needs nothing installed on the device at all:
brew install libimobiledevice # macOS
sudo apt install libimobiledevice-utils # Debian / Ubuntu
Three of its tools matter here:
ideviceinfo — prints the device's details. If this
works, the cable and the pairing are fine, which rules a lot out in one
command.idevicesyslog — the device's entire system log,
live. This is the single most useful thing in this section: it is how
you see what the tweak is doing, and it works whether or not SSH is
installed. Filter it to the lines that matter:
idevicesyslog | grep SiriRemastered.iproxy — forwards a port on your computer to a port
on the device, which gives you SSH over the cable:
iproxy 2222 22 in one window, then
ssh -p 2222 root@localhost in another (with the old-algorithm
flags above).If you have no computer to hand, install iFile from Cydia. It is a full file manager with a plist and text editor built in, so you can read the tweak's settings file or move a file out of the way without SSH at all. Its modern successor is Filza, which you will see recommended everywhere — but Filza wants a newer iOS than this, so on iOS 6 it is iFile you want.
Start here. Almost everything that goes wrong is one of the six things below, and five of them are the network. If none of it fits, or you want to hand the problem to an assistant, the technical page documents the whole machine in enough detail to debug it properly.
Nearly always the device cannot reach the server. In order:
curl http://localhost:8807/healthz on
the server machine.curl http://192.168.1.50:8807/healthz from another
computer. If this fails and the last one worked, it is the firewall
or the address.http://, the current LAN address, the port, no trailing
slash.docker compose logs -f mynah-server while you ask
something. If nothing appears at all, the request never arrived and
the problem is the network, not the server.curl http://192.168.1.50:8807/config reports
"tmdb_api_key": "unset" if that is the answer./debug and read the JSON. An empty
cards array means the server decided there was no card to
draw, and the spoken line usually explains why — no restaurants
of that cuisine nearby, a sport that is not covered, or simple
conversation, which has nothing to display.iOS 6 predates the certificate chains the modern web uses, so the
device physically cannot load an https:// image. Nothing on the
device can fix that. So the server does the loading instead: it fetches
every poster, logo and headshot itself, resizes it to something an A6X
decodes quickly, caches it on disk, and hands the device a plain
http:// address pointing back at your own machine.
This is also the reason the Server URL must be plain http://
— the images are served from that same address, and an
https:// one would fail for the pictures exactly as it fails
for everything else.
A blank image therefore means the device could not reach the
server’s image address. Paste one into a browser on another
computer — they look like
http://192.168.1.50:8807/img/3f2a….jpg. If it does not
load there either, this is the connection problem above. If the address it
was given contains the wrong host, set
PUBLIC_BASE=http://192.168.1.50:8807 in .env and
restart. And give a brand-new image a moment: the first fetch is a
download and a resize, every one after it is a cache hit.
The language model has to be read into memory before it can answer, and the speech model unloads itself after a few quiet minutes to give the memory back. The first question after a restart, or after a lull, pays for both. Ten to sixty seconds is normal, depending on the model and the machine.
If it stays slow, the model is probably too big for the machine. Check
with free -h on Linux while a question is running: if swap is
climbing, the model does not fit and everything is being paged to disk, which
turns seconds into minutes. Pull a smaller model, set
MYNAH_MODEL to it, and restart.
docker compose logs -f mynah-server, and the lines
beginning [mynah] show both what was heard and which
intent was chosen — which tells you whether a wrong answer came
from mishearing or from misunderstanding.WHISPER_MODEL=Systran/faster-whisper-small in
.env. It is slower, and on short commands it is often no
better.That shape of failure is usually Ollama. Confirm a model is actually
downloaded with ollama list, and then confirm the container can
reach it — this asks the server, from inside its own container, to
call Ollama and report the HTTP status:
docker compose exec mynah-server python -c "import httpx,os;print(httpx.get(os.environ.get('OLLAMA_URL','http://host.docker.internal:11434')+'/api/tags',timeout=5).status_code)"
200 means the connection is good. Anything else, on Linux,
is the OLLAMA_HOST=0.0.0.0 problem from step 2.
docker compose logs -f mynah-server # follow live, Ctrl-C to stop
docker compose logs --tail 200 mynah-server # the last 200 lines
docker compose ps # running? or restarting in a loop?
A container that says restarting is crashing and coming
back; the error is in the log just before each restart. If things are in an
unclear state, docker compose down then
docker compose up -d --build is safe and keeps the downloaded
speech model and the image cache. Adding -v to
down throws those away too — nothing is lost
permanently, but several gigabytes come down again.
Settings → iOS 6 Siri Remastered → Enabled, off. Siri reverts to stock behaviour immediately, on the next question, with no respring. Clearing the Server URL does the same thing. To remove it altogether, uninstall the package in Cydia; your settings are left behind, so reinstalling picks up where you left off.
There is a second page, and it is the interesting one. It documents the whole thing properly: what happens between the home button and the card on the screen, every file the package puts on the device, exactly which functions the tweak hooks and why, every endpoint the server answers, how to read the device's log line by line, what each failure mode actually means, and what to do in the worst case — a card that takes SpringBoard down with it.
It is written to be pasted, whole, into an AI assistant, along with whatever went wrong. Give it that page and it can reason about this system instead of guessing at it.
It is also simply worth reading if you want to know how a 2012 assistant gets talked into answering from a machine in your kitchen.
The recording of your voice goes to one place: the server on your own network. It is transcribed there, by a model on your own disk. Nothing is sent to Apple — the tweak never opens a connection to Apple's assistant service at all, which is the reason it still works when that service does not.
What does leave your network is the lookup each answer needs, made by the server, on your behalf, and nothing more:
The language model is Ollama, on your machine. The speech model is in a container, on your machine. Neither ever contacts anyone.
Keep the server on your LAN. It has no authentication, by design, and iOS 6 cannot encrypt anything, so everything between the device and the server is plain text. Do not port-forward 8807, and do not run this on a machine with a public address.
http://repo.theadipost.com/