Steganography and image forensics that run entirely on your machine. One HTML file, no server, no uploads, no build step to use it — open it and it works, including with the network off.
An experiment in human-directed AI software development. STEGO·STUDIO was conceived and is directed by Rick Chaves, a human with no formal programming background, and is built and reviewed with AI systems — primarily GPT and Claude — under human testing, judgment and release decisions. It is both a working open-source tool and a case study in how far human-directed AI software development can go.
Encoder — hides an encrypted message inside an image. Either in the pixels of a PNG, or in the DCT coefficients of a JPEG using a recompression-resistant mode whose parameters were measured against real social-platform workflows. Those pipelines change over time, so the measurements — not a universal promise — define the tested boundary.
For lossless carriers, the Encoder also runs a lightweight Carrier Preflight before writing. It can warn about obvious existing STEGO·STUDIO headers or coherent readable text in common pixel-LSB layouts. It is deliberately limited: a quiet preflight is not proof that the carrier contains no hidden data.
Analyzer — examines any image for traces of hidden data: RS, WS and chi-square analysis, structural inspection, platform fingerprinting, and a classifier that estimates whether an image is a photograph, a screenshot, digital art, or AI-generated.
Decoder — reads back what the Encoder wrote and supports selected third-party-compatible formats. Coverage varies by tool, wire, carrier format and cipher.
- OpenStego — supported extraction path for compatible payloads.
- Stegano — narrow compatible LSB framing.
- LSBSteg — compatible binary framing in exact PNG pixels.
- Cloacked Pixel — compatible encrypted framing in exact PNG pixels when a password is supplied.
- wbStego4open — compatible framing in raw, uncompressed 24-bit BMP bytes.
- Stegpy — unencrypted
stegv3-compatible wire in PNG/JPEG. - SilentEye 0.4.1 — measured default JPEG framing only.
- Luke/Jsteg CLI — compatible CLI framing.
- JPHide/JPSeek v0.5/0.51 — historical JPEG wire with a supplied ASCII password.
- Steghide — compatible extraction where the implemented wire/cipher path is supported.
- OutGuess — compatible extraction for the supported historical path.
- Stegify v1.2 — compatible single-carrier layouts.
- Expanded LSB layout scan — tests 1–4 low bits, common channel combinations, both bit orders and normal PNG row-major order. Unframed text hits are always reported as candidates, never as confirmed recovery or tool attribution. The scan requires a substantial leading text island: 32+ readable characters beginning within the first 8 extracted bytes and passing the UTF-8/readability/entropy gate.
The expanded LSB family was validated against zsteg 0.2.14 extraction semantics. zsteg is a research/validation reference here, not a runtime engine or carrier format.
- Compatibility is not authorship. A successful compatible recovery does not by itself prove which application created the carrier. This applies in particular to Stegano-, LSBSteg-, Cloacked Pixel-, wbStego4open- and Stegify-compatible results.
- wbStego4open: only uncompressed 24-bit BMP is read from the raw file raster. Plaintext framing is published only after an extension plus strong text/file-content gate. A protected 4.x header can identify Blowfish, Twofish, CAST128 or Rijndael, but protected payloads are not decrypted in this build.
- Cloacked Pixel: AES-CBC has no MAC/tag, so a compatible recovery does not cryptographically authenticate the supplied password. A second strong content gate is required before recovered text or a file is shown.
- Stegpy /
stegv3: the stronger magic identifies that compatible format, not a specific Stegpy release or authoring application. - SilentEye: only the official 0.4.1 JPEG default profile measured on Windows is
attempted automatically (
k=5, bottom header, blank/default passphrase, no encryption). qCompress may be on or off. Custom k/header/passphrase, AES and non-JPEG carriers remain outside this route. - JPHide/JPSeek: the historical v0.5/0.51 JPEG wire is attempted only with a supplied ASCII password. Mode 0 content is recovered; mode 1 can verify the password-derived header, but its final content transformation remains unsupported. Linux v0.3 is a different wire and is not claimed as compatible.
- Classic Derek Upham JSteg: its historical wire is separately validated, but it remains outside runtime recovery because its weak framing produced plausible false candidates in the measured negative corpus.
- Recovered files: when a compatible decoder recovers an original file,
STEGO·STUDIO keeps the recovered bytes locally so Save file can write the exact
payload instead of round-tripping it through UTF-8 text. Binary bytes are not
injected into the public JSON report; text payloads continue to populate
decodedMsg.
See docs/COMPATIBILITY.md for the exact supported boundaries.
Password protection — messages are encrypted with AES-256-GCM using a key derived with Argon2id. New password-protected lossless writes also use a fresh per-image structural salt and domain-separated derived keys for header protection/authentication and body order. The password never leaves the page, because nothing leaves the page. A stronger structural derivation does not make a weak password strong.
The Analyzer exports _schema: forensic-report-v2. On confirmed extraction paths,
decodedMsg carries the full recovered content and is bounded by carrier
capacity rather than by a small display limit. Before v2.43.5 those confirmed
routes truncated decodedMsg at 5,000 characters. Heuristic deep-scan previews
remain intentionally bounded because they are investigative candidates, not
confirmed recovered messages.
threat.score uses 0–99 for heuristic suspicion. Heuristic evidence can reach
99 without proving that content was recovered. The value 100 is reserved for
direct validated recovery and is paired with the CONFIRMED state. Consumers
should use the explicit recovery/confirmation state rather than inventing a lower
numeric threshold as a proxy for confirmation. Recognized legacy LSB framings that
validate their declared structure expose modules.studio.framedExtracted (and the
declared byte count in framedPayloadBytes) so the report carries the evidence that
justifies this terminal state.
This matters more than the feature list.
The built-in statistical analysis does not reliably detect content-adaptive steganography such as HILL, UNIWARD and J-UNIWARD. LSB Matching can also evade the structural tests used here. Specialised detection of these methods generally uses trained steganalysis models. Models can run in browsers through technologies such as WebAssembly or WebGPU; this offline single-file build deliberately does not ship those models because of their size and complexity. Finding nothing here is not evidence that an image is clean. If you need that level of analysis, use a dedicated steganalysis toolbox such as Aletheia by Daniel Lerch.
The tool also separates what it can prove from what it can only suggest, and labels which is which. A number without a visible justification behind it is treated as a bug, not a feature.
STEGO·STUDIO is, first and foremost, an experiment. It was conceived and is directed by Rick Chaves — a human with no formal programming background — to explore how far current artificial intelligence systems can go in building real-world software.
The experiment is not whether AI can write code. It is whether a human who does not know how to program can direct AI well enough to build, test, audit, maintain, and evolve real software.
The project is developed and reviewed with AI systems, primarily GPT and Claude, under human direction, testing, judgment, and final release decisions. Within the project, Rick affectionately refers to these AI collaborators as JOI. Successes matter, but failures, regressions, disagreements between models, and the corrections that follow are equally part of the experiment.
- Human direction — Rick: defines goals, requirements, expected behaviour and product decisions; performs real-world testing in browsers and devices; and decides what is ready to ship.
- GPT / JOI: used primarily for architecture, implementation, integration, documentation, testing and technical analysis during development.
- Claude / JOI: frequently used in a separate AI review context to challenge assumptions, look for regressions and try to find flaws in proposed solutions. This is independence of context, not third-party certification.
- Validation: AI findings are not accepted simply because an AI produced them. Important claims are reproduced, discussed and tested before they become part of the product. AI reviewers also make mistakes; findings can be corrected, withdrawn or rejected when the evidence does not support them.
STEGO·STUDIO is not a certified professional forensic, security, or steganalysis product. It is experimental, educational and research-oriented. Do not rely on it as the sole basis for critical security or forensic decisions.
Being open source is part of the experiment: the code, limitations and product-facing technical claims can be inspected, tested and challenged.
JOI is Rick's affectionate name for the AIs collaborating on the project. JOI is not presented as a human developer; the name represents the artificial intelligence systems participating in development and review.
STEGO·STUDIO stands on decades of work by researchers, standards authors and open-source maintainers. The project does not claim to have invented HILL, STC, RS/WS steganalysis, chi-square attacks, Reed-Solomon codes, Argon2id, AES-GCM or the third-party formats it studies. Its original work is in how those foundations are combined with project-specific protocols, browser-side implementations, validation gates, compatibility boundaries and product semantics.
Some of the foundations used directly by the project include:
- HILL — Bin Li, Ming Wang, Jiwu Huang and Xiaolong Li.
- Syndrome-Trellis Codes (STC) — Tomáš Filler, Jan Judas and Jessica Fridrich.
- RS / Weighted Stego-Image steganalysis — Jessica Fridrich, Miroslav Goljan and Rui Du, and the later WS work by Fridrich and Goljan.
- Chi-square steganalysis — Andreas Westfeld and Andreas Pfitzmann.
- Reed-Solomon error correction — Irving S. Reed and Gustave Solomon.
- Argon2id and AES-GCM — standardized cryptographic foundations used rather than project-specific cryptographic inventions.
The interoperability work also owes a direct debt to the authors and maintainers of OpenStego, Stegano, LSB-Steganography, Cloacked Pixel, wbStego4open, Stegpy, SilentEye, jsteg, JPHide/JPSeek, Steghide, OutGuess, Stegify and zsteg, as well as Daniel Lerch's Aletheia and HStego research. Runtime compatibility is deliberately separated from research references: studying a tool does not mean its code is shipped or that STEGO·STUDIO can attribute authorship to it.
For primary papers, standards, upstream projects, shipped third-party code and the project's attribution policy, see docs/ACKNOWLEDGEMENTS.md.
- Technical Details — native Encoder/Decoder protocol, password derivation, lossless/STC layouts, alternative layer and robust JPEG wire.
- Decoder compatibility — exact boundaries of supported third-party-compatible routes.
- Security — threat model, limitations and reporting policy.
- Social-platform measurements — measured basis and limits of the recompression-resistant JPEG parameters.
- Acknowledgements & Research Foundations — primary papers, standards, upstream projects and attribution policy.
The published file is committed under HTML_PRODUCAO/, so you do not need to
build anything to use the tool. To build it yourself:
node unpack_assets.js # recreates src/fonts/ from ASSETS_BASE64.md
node build.js # assembles dist/stego_studio_v<VERSION>.html
node test.js # full offline regression harnessNo package install or bundler is required. The build vendors Acorn 8.15.0 (MIT) under
tools/vendor/ only to identify JavaScript comments safely before producing the final
artifact; the parser is not included in the published HTML. build.js assembles the
JavaScript source modules, the stylesheet and an inlined Argon2id WebAssembly bundle into a single file,
then refuses to emit anything that would reach the network at runtime. The final
HTML also carries a restrictive Content Security Policy: browser script networking is
blocked with connect-src 'none', executable inline scripts are pinned to build-time
SHA-256 hashes, and the Argon2 WebAssembly bundle receives only the narrower
'wasm-unsafe-eval' permission rather than general JavaScript eval.
Binary assets (fonts, icons) are stored as base64 with SHA-256 checksums in
ASSETS_BASE64.md; unpack_assets.js restores them and verifies every hash
before writing.
The repository also ships a no-install GitHub Actions workflow (.github/workflows/regression.yml) that rebuilds the single-file artifact and runs the full Node 22 regression harness on pushes and pull requests. The harness is intentionally broad, but it is not a proof of security and does not replace real-browser/device testing.
src/ JavaScript modules + styles.css + hash-wasm.js
tools/vendor/ build-only vendored parser + license; not shipped in the HTML
template.html page markup; the build injects CSS and JS into it
build.js the build
test.js regression harness (build, security gates, round-trips, malformed corpus, fixtures, ...)
HTML_PRODUCAO/ the published single-file build
docs/ protocol, compatibility, acknowledgements and social-platform measurements
docs/SOCIAL_PLATFORM_MEASUREMENTS.md summarizes measured social-platform image
pipelines and the limits of those measurements. The sturdier-mode parameters are
grounded in those tests rather than in a universal promise.
GNU General Public License v3.0 — see LICENSE.
You may use, study, modify and redistribute this. If you distribute a modified version, that version must also be free software under the same license. For a tool whose entire premise is that you can verify what runs on your own machine, a derivative nobody can inspect would defeat the point.
Concept and human direction by RASC. Developed with JOI, an AI.