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's ai_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

Maintained as part of the website-owned Skryba documentation corpus.