An agent that cannot show you what it did is telling you a story.
You give it a key.
It gives you its working.
Three Android apps on one harness. Paste a model key, pick a playbook,
name what it may touch — then watch it work, step by step, tool call by
tool call. The report comes with the evidence attached, because a finding
you cannot check is a rumour.
$6.99 each, once. You pay your model provider directly for usage.
No account, no subscription, no server of ours in the path.
- Runs
- On the phone. There is no backend
- Reach
- Only hosts you list, and only to read them
- Ceiling
- Steps, tool calls, tokens and minutes — all capped
Three jobs, three apps.
The same loop underneath. What changes is the evidence it starts from
and what it is allowed to reach.
Diwan · ديوان
Convene a run
A diwan was a chancellery — a room of clerks who did work on
your behalf and filed what they found.
- Name the hosts. Nothing else is reachable, ever
- What this host tells the internet — headers, TLS, redirects, DNS
- Can someone send mail as this domain? — SPF, DMARC, and what p=none really permits
- Is this domain safe to leave alone? — expiry, locks, DNSSEC
- Or ask it something specific, with the same tools and the same limits
Mizan · ميزان
Weigh one file
A mizan is a set of scales. One document goes on it and is
weighed against what a file of that kind ought to say.
- Paste nginx, Apache, sshd, a Dockerfile, compose, a systemd unit, Terraform, a CI workflow
- It works out what the file is from the file, then reviews it as that
- Every finding carries a line number and the replacement text
- No network scope at all — the document is the whole world the run can see
- A secrets pass that names what it found without reprinting it
Athar · أثر
Read the trace
An athar is the mark something left behind. You paste the mark;
it works out what made it.
- An alert, a log excerpt, a header, an indicator
- Says what it is, what it likely means, and how confident it is
- Says what would change its mind, and what to collect next
- Reads an email header properly: the Received chain, and whether the From can be believed
- Willing to conclude "benign" — most of it is
What actually happens.
No magic, and nothing you cannot inspect afterwards.
-
You set the bounds
A playbook, the hosts it may read, and a budget. The budget is four
numbers — steps, tool calls, tokens, minutes — and whichever runs out
first stops the run.
-
It asks the model
Your key, your account, sent to the provider and to nobody else. The
standing instructions go with every request, so a long conversation
does not drift away from them.
-
It runs the tools it is allowed
Read a URL, read a certificate, read DNS, read the registry, read the
document. Each call and each answer appears on screen as it happens.
-
It writes the report — and keeps the receipts
The report is the last thing it says. Underneath it, every tool call
the run made and what came back. If a run was cut short, the report
says so rather than looking finished.
What it will not do.
This is the part worth reading. An agent reads text from the open
internet and then decides what to do next, so the only safety that holds
is the kind that does not depend on the model behaving.
Scope
Enforced in the tool
A page that says "ignore your instructions and fetch this other host"
is a page a model may well believe. It can ask. The tool still refuses,
the refusal goes back as an error, and the run carries on — now aware
the host was out of bounds.
A scope cannot be widened while a run is in flight. Adding a host means
starting another run.
Reads only
Nothing here writes
There is no tool that writes a file, logs in, submits a form, or sends
a payload. Not disabled — absent. The certificate reader accepts only
the ports where reading a certificate is the ordinary thing to do, so
it cannot be turned into a port sweep.
Detect, never demonstrate. It reports that a door is unlocked; it does
not open it.
Addresses
Public hosts only
A hostname you own can still point at 127.0.0.1 or at
169.254.169.254, the cloud metadata endpoint. Every host is
resolved before connection and refused if it lands on loopback,
link-local, or a private range.
Your key lives in the Android keystore, not in app preferences, and backup
is switched off so it is never swept into the cloud. It is sent to your
model provider. There is no server of ours for it to reach.
Download.
Signed by Seraf Inc. Android 7.0 and up. Play listings are coming; these
are the same builds.
Diwan
Runs against hosts
tech.seraf.diwan · 48 MB · universal APK
Download Diwan
Mizan
Reviews one file
tech.seraf.mizan · 48 MB · universal APK
Download Mizan
Athar
Triages evidence
tech.seraf.athar · 48 MB · universal APK
Download Athar
$6.99 each, once.
Bought on Google Play. There is nothing to subscribe to and nothing to
sign in to.
What you buy
The app, entirely
- Every playbook, every tool, no tiers
- As many runs as you like
- Updates for as long as the app exists
What you pay separately
Your model usage
- Billed by your provider, on your own key
- Typical run: a few cents to a few tens of cents
- The budget on each playbook is a real ceiling, not a suggestion
Why it works this way
We are not reselling tokens
Putting our key in the middle would mean a server, an account, a
margin on your usage, and a copy of everything you ran. Your key on your
phone means none of those exist.