On this page
What is Skryba
Skryba is a Rust CLI that rewrites AI-generated prose until AI detectors score it as human, without changing what the text says. One binary, no Python runtime, no external ML framework: generation goes through Brama, detection through commercial detector APIs, and strategy selection through a native GRPO policy. The whole product is three moving parts: a generator that proposes rewrite candidates, a two-sided scorer that measures each candidate, and a selector that keeps the least detectable candidate that still says the same thing.
The generator proposes
Input text is split into chunks of at most --max-words-per-chunk words
(default 400), on paragraph boundaries where possible. For each chunk, the
GRPO policy samples one rewrite strategy per candidate (default 8
candidates) from its strategy distribution. The six built-in strategies —
natural-editor, plainspoken, scholarly-human, rhythmic, specific,
light-touch — are editing instructions appended to a fixed system prompt
that forbids adding facts, opinions, examples, or commentary. Every
candidate is one chat completion against Brama; there are no direct model
provider credentials anywhere in this repository. A policy trained with
skryba train shifts which strategies get sampled. Details:
chunk, policy.
The scorer measures twice
Every candidate is scored on two independent axes:
- Detectability — each configured detector (GPTZero, Winston,
Originality.ai, Sapling) returns an AI probability in
[0, 1]; the ensemble mean is the candidate'sai_probability. Responses are cached in SQLite keyed by a SHA-256 of the text and the detector revision, so identical texts are never re-billed. Requests are rate-limited per detector and retried with backoff. - Quality — an LLM judge (also through Brama) scores meaning preservation, factual consistency, grammar, coherence, naturalness, and readability from 0.0 to 1.0 and flags critical errors: changed facts, dropped qualifications, contradictions.
Details: detector, score, quality judge, cache.
The selector keeps the safest winner
Candidates that fail the quality gate (--minimum-quality, default 0.90)
or carry a critical error are discarded. Among survivors, the lowest
ai_probability wins. When no candidate survives, the original chunk is
kept and itself scored, marked used_source_fallback: true — a chunk is
never replaced by prose that says something else. Winning chunks are
joined with blank lines into the final text; --json and --report
expose every per-chunk, per-candidate score. Details:
rewrite.
When a machine rewrite is not enough
The same CLI commissions one private human-written rewrite through the
RentAHuman API: skryba rentahuman create posts a humanization order with
turnaround, price, optional applicant screening, and a required
idempotency key so a retried command never double-posts;
skryba rentahuman get fetches one owned humanization and prints the
API's own JSON. Details:
humanization order,
rentahuman reference.
What Skryba is not
Skryba holds no model provider keys — Brama owns model routing and
inference, and BRAMA_TOKEN is the only inference credential the binary
reads. It runs no server and stores no state beyond the local detector
score cache and policy files you ask it to write. It does not guarantee a
detector verdict: it reports exactly what the configured detectors
returned, and the ensemble is only as good as the keys you configure.
Which credentials it does hold, and where they go, is the
credential boundary. The macOS app in
the sibling skryba-desktop repository is a thin front end that spawns
this CLI and displays its output verbatim.
The first three commands
echo "Some text." | skryba score
The ensemble AI probability plus the per-detector breakdown. Requires at least one detector API key.
skryba rewrite draft.txt --report report.json
The full pipeline: chunk, generate, score, select. Prints the rewritten
text; the report carries every candidate's scores. Requires BRAMA_TOKEN
plus at least one detector key.
skryba corpus tests/fixtures/humanization_samples.json
Verify a curated corpus against its declared word counts and SHA-256 checksums. No credentials, no network.
The rest of the corpus
- Nouns — detector, score, rewrite, chunk, policy, quality judge, cache, credential boundary, humanization order.
- Reference — cli, train and benchmark, rentahuman, configuration.
- Executed end to end — scoring, offline rewrite and training, humanization order validation, runnable examples.
- When it fails — every error sentence, with meaning and fix: runbook.
- Boundaries — what Skryba owns, what it refuses to own, and what leaves the machine: architecture.
Maintained as part of the website-owned Skryba documentation corpus.