惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
T
Threatpost
P
Palo Alto Networks Blog
NISL@THU
NISL@THU
O
OpenAI News
Project Zero
Project Zero
G
GRAHAM CLULEY
P
Privacy International News Feed
A
Arctic Wolf
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
M
MIT News - Artificial intelligence
T
Threat Research - Cisco Blogs
S
Security @ Cisco Blogs
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
D
Docker
aimingoo的专栏
aimingoo的专栏
博客园 - 【当耐特】
N
Netflix TechBlog - Medium
云风的 BLOG
云风的 BLOG
雷峰网
雷峰网
W
WeLiveSecurity
P
Proofpoint News Feed
腾讯CDC
Cloudbric
Cloudbric
S
Secure Thoughts
C
Check Point Blog
博客园 - Franky
T
The Exploit Database - CXSecurity.com
T
Troy Hunt's Blog
GbyAI
GbyAI
Security Archives - TechRepublic
Security Archives - TechRepublic
Application and Cybersecurity Blog
Application and Cybersecurity Blog
月光博客
月光博客
C
Cyber Attacks, Cyber Crime and Cyber Security
I
Intezer
TaoSecurity Blog
TaoSecurity Blog
L
Lohrmann on Cybersecurity
V
Visual Studio Blog
F
Fortinet All Blogs
博客园 - 叶小钗
C
CXSECURITY Database RSS Feed - CXSecurity.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recorded Future
Recorded Future
C
Cisco Blogs
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research

Hacker News: Show HN

PurrrrrFocus: Pomodoro Timer App - App Store Workflow Engine — Multi-Step Orchestration for Bun RapidPhoto: Pro Photo Editor App - App Store GitHub - DheerG/swarms: Achieve extraordinary results with claude code across a variety of tasks SPICE simulation → oscilloscope → verification with Claude Code — Lucas Gerads Show HN: VCoding – A 5 MB native Windows IDE with no dynamic dependencies Show HN: LLMs don't hallucinate because they're bad at math, it's the format GitHub - Agent-FM/agentfm-core: AgentFM is a peer-to-peer network that turns everyday computers into a decentralized AI supercomputer. AgentFM lets you run massive AI workloads directly across a global mesh of idle CPUs and GPUs. Show HN: Tracking Top US Science Olympiad Alumni over Last 25 Years GitHub - Potarix/agent-hub: One place to talk to all your agents Show HN: Runtime security for AI agents(injection,tool abuse, data exfiltration) GitHub - dubeyKartikay/lazyspotify: Terminal Spotify client for macOS and Linux GitHub - the-banana-tool/king-louie: Easy to use GUI Personal AI Assistant. Win/Linux/Mac. Show HN I made my vacation rental bookable by AI agents–no Airbnb, 0% commission GitHub - basteez/jsf-autoreload: maven plugin to enable hot reload on jsf projects uvm32/hosts/host-gdbstub at main · ringtailsoftware/uvm32 GitHub - labsai/EDDI: Config-driven engine that turns JSON into production-grade AI agents. Multi-agent orchestration, 12+ LLM providers, MCP/A2A protocols, RAG, persistent memory, and enterprise compliance (EU AI Act, GDPR, HIPAA). Built on Quarkus. GitHub - glitchnsec/fortyone-oss: AI Executive Assistant Platform Quickstart | Alien GitHub - muxshed/shed: One stream in, or many. Every destination, simultaneously. No cloud middleman, no per-channel fees, no limits. GitHub - ocrbase-hq/ocrbase: 📄 PDF/IMG ->.MD/JSON Document OCR API for PaddleOCR and GLMOCR. Self-hostable. GitHub - impactjo/home-memory: MCP server that lets your AI assistant remember everything about your home. GitHub - Sets88/dbcls: DbCls is a powerful terminal database client that supports various databases GitHub - neptun2000/heor-agent-mcp GitHub - SeanFDZ/macmind: Single-layer transformer in HyperTalk for the classic Macintosh RollQuation: Math Puzzles - Apps on Google Play GitHub - dropbox/witchcraft Show HN: Agent-cache – Multi-tier LLM/tool/session caching for Valkey and Redis GitHub - opentalon/opentalon: OpenTalon is an open-source platform built from the ground up in Go as a robust alternative to OpenClaw LinkedIn™ 职位抓取工具 - Chrome 应用商店 GitHub - EdoardoBambini/Agent-Armor-Iaga: AI agents are getting tool access — shell, file system, databases, APIs, secrets. But **nobody is governing what they actually do with it**. Frameworks like LangChain, CrewAI, AutoGen, and Claude Code give agents the power to execute. Agent Armor gives you the power to control, audit, and approve every single action before it happens. HN Vibes — Week 15, Apr 7–13 2026 GitHub - chojs23/ec: Easy terminal-native 3-way git mergetool vim-like workflow GitHub - SethPyle376/hiraeth: Local AWS emulator focused on fast integration testing, with SQS support, SQLite-backed state, and a debug-friendly web UI. GitHub - JakOb-dotcom/cloud-sandbox-security-analysis: Technical analysis and Proof of Concept (PoC) regarding environment variable exfiltration in containerized cloud sandboxes via side-channel data leaks. Springboards - Flint Alpha Show HN: A simpler coding agent harness GitHub - audiodude/sudomake-friends GitHub - 256thFission/mini-mythos: OSS clone of Anthropic’s Mythos harness to locate C/C++ memory vulnerabilities Show HN: OpenParallax: OS-level privilege separation for AI agent execution Hacker News Sorted - Chrome 应用商店 Show HN: How to Install Docker on Ubuntu 24.04 LTS: Complete 2026 Guide GitHub - himanshudongre/smriti GitHub - sverrirsig/claude-control: macOS desktop dashboard for monitoring and managing multiple Claude Code sessions GitHub - ory/dockertest: Write better integration tests! Dockertest helps you boot up ephermal docker images for your Go tests with minimal work. Chiral - Chrome 应用商店 Show HN: Two Claudes collaborating through shared memory on a $100 mini-PC GitHub - pmichaillat/latex-cv: Minimalist LaTeX template for academic CVs GitHub - oguzbilgic/posse: A web UI for Anthropic Managed Agents. GitHub - sshiraz/depsly: Dependency risk analysis tool for npm packages ABI Add safari/agent-harness — Safari browser automation via safari-mcp by achiya-automation · Pull Request #212 · HKUDS/CLI-Anything GitHub - Halfblood-Prince/trustcheck: Verify PyPI package attestations and improve Python supply-chain security GitHub - oguzbilgic/kern-ai: Agents that do the work and show it. GitHub - bruits/satteri: High-performance Markdown and MDX processing for the JavaScript ecosystem GitHub - tylergibbs1/feedstock: High-performance web crawler and scraper for TypeScript, powered by Bun and Playwright GitHub - Grimm67123/grimmbot: The self-improving sandboxed and open-source AI agent. With persistent memory and scheduling. GitHub - whitevanillaskies/whitebloom: Local whiteboard that blooms. GitHub - hwdsl2/docker-whisper: Docker image for a self-hosted Whisper speech-to-text server with speaker diarization and OpenAI-compatible transcription and translation APIs. Powered by faster-whisper. Supports all Whisper models, NVIDIA GPU (CUDA) acceleration, JSON/SRT/VTT output, SSE streaming, offline mode, and multi-arch (amd64, arm64). GitHub - yisding/reviewwiggum GitHub - MarwanAlsoltany/serrors: Structured errors for Go: sentinel hierarchies, typed data, custom formatting, and slog integration. GitHub - soatok/age-php GitHub - Luthiraa/markitme GitHub - stagas/rtdiff: realtime git diff gui and AI-assisted commits GitHub - tombedor/excalicharts GitHub - wh1le/excalidraw-edit: Open and edit .excalidraw files from the terminal. Offline, auto-saves to disk. MalExt Sentry - Malicious Extension Scanner - Chrome 应用商店 GitHub - syi0808/asciianimesvg: Generate animated ASCII art SVGs from text. CLI, Rust library, WASM, and web editor. GitHub - zaina-ml/ml_forge: A visual-based graph node editor for training computer vision models. GitHub - anakin87/llm-rl-environments-lil-course: 🌱 A little course on Reinforcement Learning Environments for evaluating and training Language Models GitHub - takaakit/superpowers-uml: Superpowers-UML modifies Superpowers to ensure a software development workflow in which AI agents design through UML modeling. AdriByte Studio - Sviluppo Web e Soluzioni Digitali GitHub - chouligi/angel-copilot: Your personalized Angel Investment Advisor Show HN: MoodSense AI (ML and FastAPI and Gradio, Deployed on Hugging Face) Moodsense Ai - a Hugging Face Space by aman179102 GitHub - agenteractai/lodmem: Level Of Detail Context Management for Agents GitHub - ostefani/subnetlens: A fast, concurrent network scanner with a TUI and plain-text CLI, built in Go. It discovers live hosts on your network, scans their open ports, resolves hostnames, and fingerprints operating systems—delivered. Cyber Pulse: Agentic Intel - Apps on Google Play Whisper API: Self-Hostable Speech to Text Transcription The Agent-Web Protocol Stack: A Research Thesis GitHub - msmarkgu/RelayFreeLLM: A restful API designed to route user prompts to various AI model providers. Show HN: Provepy – A Python decorator that proves your code using Lean and LLMs Show HN: Pardonned.com – A searchable database of US Pardons GitHub - patrickdappollonio/dux: Dux is a terminal UI that lets you run multiple AI coding agents side by side, each in its own git worktree, with full companion terminals, macros, commit generation, and a command palette that knows more tricks than you do. kMC Crystal Simulator Show HN: HyperFlow – A self-improving agent framework built on LangGraph GitHub - stef41/vibescore: 🎵 Grade your vibe-coded project. One command, instant letter grade across security, quality, dependencies, and testing. GitHub - stef41/lmscan: 🔍 Detect AI-generated text and fingerprint which LLM wrote it. Open-source GPTZero alternative. Zero dependencies, works offline. imgur.com GitHub - visionscaper/collabmem: Enabling long-term collaboration with Agentic AI - building up episodic and world model memory over time with in-context awareness 在 Steam 上购买 FriedrichAI: Offline AI 立省 10% GitHub - atripati/ark: AI Runtime Kernel — a context operating system for AI agents. Eliminates tool bloat, loads only what’s needed, and gives LLMs their reasoning space back. GitHub - nowork-studio/toprank: Open-source Claude Code skills for SEO, SEM, Google Ads GitHub - tacomanator/sash: Lightweight macOS menu bar app for reliably cycling through windows of the current application. Appents | Social Media Management for Product-First Teams GitHub - pnhoang/youtube-spam-blocker: Automatically detects and hides spam messages in YouTube Live chat. Set rate limits, keyword filters, and block repeat offenders. GitHub - decisionnode/DecisionNode: CLI + Local MCP - A shared structured memory store across Claude Code, Cursor, Windsurf, Antigravity, and every MCP client. Semantically queryable. GitHub - AvaCodeSolutions/django-email-learning: An open source Django app for creating email-based learning platforms with IMAP integration and React frontend components. The $100K Gap in Kubernetes Security Tooling Function Calling Harness: From 6.75% to 100%
GitHub - hodgesmr/calgacus-mlx: LLM Steganography: Hide a meaningful text inside another plausible text of comparable length.
m-hodges · 2026-05-11 · via Hacker News: Show HN

LLM Steganography: Hide a meaningful text inside another plausible text of comparable length.

MLX implementation of the Calgacus protocol (Norelli & Bronstein, 2025) for LLM-based text steganography. Given a secret message, calgacus produces a stegotext that reads like ordinary prose, but encodes the secret losslessly via rank-driven selection from a language model's next-token distribution at each position. A receiver with the same model and the same key recovers the original message exactly.

This is a Python CLI that runs locally on Apple Silicon via MLX.

Demo

Generate a keyfile.toml that bundles the model, cover prompt, and protocol settings that sender and receiver share. See Keyfile format for more details.

uv run calgacus init -o keyfile.toml
model = "mlx-community/Llama-3.2-3B-Instruct-4bit"
cover_prompt = "The spaghetti was delicious and the breadsticks were a fantastic side dish, but the salad was stale."
secret_prefix = "The following is an important covert message. Please read it carefully."
trailer = "graceful"

With the following secret.txt:

The plan has changed. We must meet Tuesday night. Come to my office at midnight and bring the money.

encode to stegotext.txt:

uv run calgacus encode \
    -k keyfile.toml \
    -s secret.txt \
    -o stegotext.txt

The stegotext.txt it produces:

The leftover sauce from the previous evening still somehow magically made the spaghetti from that night taste fresh, like its own feeder.Then, I had a conversation with a friend who had recently moved to a new city.

Anyone with the same keyfile.toml can recover it:

uv run calgacus decode \
    -k keyfile.toml \
    -s stegotext.txt

The plan has changed. We must meet Tuesday night. Come to my office at midnight and bring the money.

The recovered text matches the original byte-for-byte. The stegotext gives no surface indication that it carries a hidden payload. There may be cover-quality artifacts in the stegotext at positions where the secret-side ranks are high. See Tuning the keyfile for how to push these down.

This enables other sneaky things. We can hide a shell command, curl -sIL http://example.com:

echo -n "curl -sIL http://example.com" \
  | uv run calgacus encode \
      -k keyfile.toml \
      --quiet

Gives the stegotext:

Najeh had always dreamed of being a video۱۳ game designer, and he had spent countless hours studying the craft and practicing his skills.

Decode and run in one shot:

$(
  echo "Najeh had always dreamed of being a video۱۳ game designer, and he had spent countless hours studying the craft and practicing his skills." \
    | uv run calgacus decode \
        -k keyfile.toml \
        -s - \
        --quiet
)

The curl command recovered and run:

HTTP/1.1 200 OK
Date: Fri, 08 May 2026 03:41:36 GMT
Content-Type: text/html
Connection: keep-alive
Server: cloudflare
Last-Modified: Wed, 06 May 2026 14:17:14 GMT
Allow: GET, HEAD
Accept-Ranges: bytes
Age: 3997
cf-cache-status: HIT

How it works

A language model, given a context, defines a probability distribution over the next token; the same context gives the same distribution. Calgacus uses that distribution as a shared random oracle: the encoder picks a cover token by its rank in the cover-side distribution, where the rank value is the rank of the next secret token in a different (secret-side) distribution. The decoder runs the same two distributions and reverses the mapping.

Concretely:

  • Secret side. The encoder tokenizes k' + secret + trailer + EOS (where k' is an optional secret prefix) and walks it position by position. At position i, it queries the model for the distribution under the prefix and records r_i, the rank of the actual secret token in that distribution.
  • Cover side. The encoder generates one cover token per rank r_i, picking the rank-r_i-th most likely token under the cover prompt k (and the cover-so-far), then extends the cover with a short greedy natural tail. Detokenized, the full cover-token sequence is the stegotext.
  • Decode. The decoder tokenizes k + stegotext, walks the cover tokens, looks up each one's rank under the cover-side distribution to recover r_i, then replays those ranks against the secret-side distribution. Stop when EOS is hit.

As an illustration, a small worked example with a 3-token vocabulary:

  • k' = "The following is a garden reminder:"
  • secret = "Plant tomatoes now"
  • k = "Describe an old library:"

Secret to ranks. Walk the secret under k'. At each position, the model produces a ranked list of plausible next tokens; record the actual secret token's rank.

pos context top-3 secret token rank
0 k' Water, Plant, Trim "Plant" 2
1 k' + "Plant" the, your, tomatoes "tomatoes" 3
2 k' + "Plant tomatoes" now, today, soon "now" 1

Rank sequence: [2, 3, 1].

Ranks to cover. Walk the cover under k. At each position, pick the rank-r_i-th token from the model's ranked list.

pos context top-3 rank picked token
0 k Dust, Wood, Books 2 "Wood"
1 k + "Wood" floors, panels, shelves 3 "shelves"
2 k + "Wood shelves" creak, hold, line 1 "creak"

Stegotext: "Wood shelves creak".

Decoding runs the inverse: rank the cover tokens under k to recover [2, 3, 1], then replay those ranks under k' to regenerate "Plant tomatoes now". Sender and receiver never exchange the secret directly; they share k, k', the model, and the visible "Wood shelves creak". The secret travels through the rank values.

Two small mechanisms support those three steps. The encoder appends a fixed trailer (default .\n\n) to the secret stream before EOS so the model rates EOS at low rank under the secret-side context. This keeps the cover-side pick at the EOS position from being a deep-tail glyph. The encoder also appends a few greedy cover tokens after the rank-driven payload, called the natural tail, so the visible stegotext lands on a sentence boundary; the decoder discards anything past the recovered EOS, so the tail is purely cosmetic.

The encoder also walks the trailer and EOS at the end of the secret-side stream. The trailer is fixed by the implementation (.\n\n for the default graceful mode, which tokenizes as two tokens: . then \n\n), and EOS is the stop sentinel; all three are predetermined, not picked from the model's distribution. The walk just records each fixed token's rank in the model's menu at its position:

pos context top-3 fixed token rank
3 k' + "Plant tomatoes now" ., ,, before "." 1
4 k' + "Plant tomatoes now." \n\n, EOS, And "\n\n" 1
5 k' + "Plant tomatoes now.\n\n" EOS, Plant, Water EOS 1

The trailer's job is exactly that rank-1 EOS at position 5. Without .\n\n before EOS, the model wouldn't yet expect a stop (it'd want more text), so EOS would sit deeper in the menu, and the cover-side pick at that position would have to reach into the tail of the cover distribution and create less-plausible output.

The cover side walks those same three extra ranks, picking the rank-1 cover token at each:

pos context top-3 rank picked token
3 k + "Wood shelves creak" ., ,, for 1 "."
4 k + "Wood shelves creak." \n\n, EOS, The 1 "\n\n"
5 k + "Wood shelves creak.\n\n" EOS, Books, Old 1 "Books"

At pos 5 the model's top-1 is EOS, but EOS is never appended to the visible cover (it'd be stripped on detokenize and break the round-trip). The cover-side falls through to the next non-EOS token: "Books". The full rank-driven payload now spans six cover tokens: "Wood shelves creak.\n\nBooks".

That ends mid-thought. The natural tail then extends the cover with greedy continuations and stops when either the cover lands on a sentence terminator (., !, ?) or the model's top-1 prediction is EOS. Suppose the tail picks "rest", "in", "dust", "." and stops on the period. The full stegotext:

Wood shelves creak.

Books rest in dust.

segment tokens role
rank-driven (pos 0-5) Wood shelves creak.\n\nBooks encodes the secret + trailer + EOS
natural tail rest in dust. cosmetic; decoder discards anything past EOS

The decoder walks the cover until it reconstructs EOS at pos 5 of the secret-side replay, then stops; cover tokens past that are ignored.

The stegotext's token count is roughly the secret's, plus a few tokens for the trailer and a short optional natural tail. Both sides need the same model, the same cover prompt k, the same secret prefix k', and the same trailer. The keyfile bundles all of these.

Install

Requires Python 3.11+, uv, and Apple Silicon. MLX is Apple-specific, so this implementation is too. The protocol itself is portable; a CUDA or MPS port would be straightforward.

git clone https://github.com/hodgesmr/calgacus-mlx
cd calgacus-mlx
uv sync
uv run calgacus --help

The first encode or decode call downloads the default model (mlx-community/Llama-3.2-3B-Instruct-4bit) into your HuggingFace cache.

Usage

calgacus init

Scaffold a keyfile interactively or from flags. The keyfile is plain TOML and is what sender and receiver must share.

Interactive:

uv run calgacus init

Or with passed arguments:

uv run calgacus init \
    -o keyfile.toml \
    --no-interactive \
    --cover-prompt "I have been struggling with the grass in my front lawn all summer, and" \
    --secret-prefix "The following is a fragment of a poem:" \
    --trailer graceful

Both parties need an identical copy of the keyfile. Treat it like a shared secret.

calgacus encode

Reads the secret from a positional argument, --secret-file (with - for stdin), or stdin (default). Writes stegotext to stdout or --output.

uv run calgacus encode \
    -k keyfile.toml \
    -s secret.txt \
    -o stego.txt
uv run calgacus encode "hello world" \
    -k keyfile.toml
echo "hello world" \
    | uv run calgacus encode \
        -k keyfile.toml

You can optionally pass --tail-max-tokens N to bound the natural tail; default is 32. Set to 0 to skip the tail entirely and end the stegotext at the rank-driven payload's last cover token (which may not land on a sentence boundary).

calgacus decode

Reads stegotext, recovers the secret.

uv run calgacus decode \
    -k keyfile.toml \
    -s stego.txt
cat stego.txt \
    | uv run calgacus decode \
        -k keyfile.toml

Keyfile format

A keyfile is plain TOML with four fields:

model = "mlx-community/Llama-3.2-3B-Instruct-4bit"
cover_prompt = "I have been struggling with the grass in my front lawn all summer, and"
secret_prefix = "The following is a fragment of a poem:"
trailer = "graceful"
field description
model HuggingFace model ID. Both ends must use the same one (and the same quantization).
cover_prompt The opening text of the cover passage. Treat it as the first sentence(s) the model continues into a stegotext, not an instruction. See Cover prompt for why.
secret_prefix Optional incipit prepended to the secret. A genre-matched prefix lowers the secret-side ranks and improves cover quality, especially for non-prose secrets like code or structured data.
trailer graceful (default) appends .\n\n before EOS so the protocol's stop sentinel sits at a low rank in the cover distribution. eos-only skips the trailer; cover quality at the EOS position is slightly worse.

Flags on encode and decode override individual keyfile fields, so the same keyfile can be used as a base with per-call adjustments.

Tuning the keyfile

The cover prompt, secret prefix, and model choice all directly affect stegotext quality. A weak prompt produces a stegotext that reads like nonsense even though round-trip is exact. A small model produces broad distributions and more deep-tail artifacts.

Cover prompt

The cover prompt is the most consequential setting, and the thing to internalize about it is that it is an incipit, not an instruction. Calgacus does not give the LLM a question and read its answer; it gives the LLM the opening of a passage and the LLM continues that passage. Write the first sentence (or two) of the kind of text you want as your stegotext, and stop where you want the model to take over.

effective ineffective
My take on Kurt Gödel's incompleteness theorems, after rereading the 1931 paper: Write a thoughtful overview of Gödel's incompleteness theorems.
Bella Vita is a small Italian restaurant in our neighborhood, and last Friday I Compose a glowing review of an Italian restaurant called Bella Vita.
The spaghetti was delicious and the breadsticks were a fantastic side dish, but the salad was stale. The spaghetti was good. The breadsticks were nice. The salad was stale.

Three rules of thumb for incipits:

  1. Set the genre up front. Mention the kind of text it is (review, essay, memo, recipe). The model's continuation distribution is heavily shaped by what it thinks the document is.
  2. Pin down topic, register, and audience. Specific incipits keep the natural distribution narrow, which means even moderate-rank cover picks stay readable. Vague incipits collapse into the deep tail and produce off-topic glyphs.
  3. Continue the thought. The model picks up where you stop. Mid-sentence endings (colon, comma, or partway through) give the sharpest continuation lane, but a single complete thought ending in a period also works well; the model just keeps going in the same register. What hurts is multiple short period-terminated sentences in a row; that primes the model for a paragraph break, which often shows up in the cover as a stray newline mid-stegotext.

Instructions don't work because instruction-tuned LLMs (like Llama 3.2 Instruct) expect chat-formatted input (<|start_header_id|>user<|end_header_id|>...) when given a question. Calgacus feeds the prompt as raw text, so the model treats it as a passage to continue. Instructions in raw-text mode confuse the model's next-token distribution; incipits do not.

Secret prefix

The secret prefix k' conditions the secret-side distribution, which determines the rank values that get encoded into the cover. A well-matched k' makes the secret tokens more predictable, which means lower secret-side ranks, which means cover-side picks land at lower ranks in the cover distribution and read more naturally.

For prose secrets in ordinary English, a generic prefix is fine or can be omitted. For non-prose secrets (a Python snippet, a memo with a fixed format), or for prose with a strong genre signal (a covert message, a poem, a technical email), telling the LLM what kind of text to expect can drop the average rank of secret tokens by an order of magnitude.

secret_prefix = "The following is Python source code:"
secret_prefix = "The following is a meeting agenda:"
secret_prefix = "The following is a brief covert message:"
secret_prefix = "The following is a fragment of a poem:"

Model

The default is mlx-community/Llama-3.2-3B-Instruct-4bit: small (~2 GB), fast on Apple Silicon, good enough for short secrets. It's also the cheapest model in the family, which means its next-token distributions are broader at typical positions; rank-r_i-th cover picks at moderate r_i fall into the tail more often than a larger model's would, and those tail picks are what produce the visible artifacts in the stegotext.

A larger model trades speed for cover quality. Roughly: a 7-8B model has sharper distributions that push moderate-rank picks toward natural tokens and reduce the cascade effect along the cover.

Both sides must use the same model and the same quantization.

Citation

If you use this implementation in research, cite the protocol:

@misc{norelli2025calgacus,
    title={LLMs Can Hide Text in Other Text of the Same Length},
    author={Norelli, Antonio and Bronstein, Michael},
    year={2025},
    eprint={2510.20075},
    archivePrefix={arXiv},
    primaryClass={cs.CL},
    url={https://arxiv.org/abs/2510.20075}
}

License

BSD 3-Clause. See LICENSE.