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

推荐订阅源

月光博客
月光博客
Cyberwarzone
Cyberwarzone
L
LINUX DO - 最新话题
N
News and Events Feed by Topic
T
Troy Hunt's Blog
Help Net Security
Help Net Security
S
Security @ Cisco Blogs
Google DeepMind News
Google DeepMind News
Security Archives - TechRepublic
Security Archives - TechRepublic
M
MIT News - Artificial intelligence
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V2EX - 技术
V2EX - 技术
Y
Y Combinator Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
Cisco Talos Blog
Cisco Talos Blog
T
Threatpost
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
SegmentFault 最新的问题
I
InfoQ
H
Hacker News: Front Page
D
Docker
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Blog — PlanetScale
Blog — PlanetScale
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
Netflix TechBlog - Medium
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
博客园 - 【当耐特】
T
Tor Project blog
U
Unit 42
H
Heimdal Security Blog
Microsoft Azure Blog
Microsoft Azure Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
P
Privacy & Cybersecurity Law Blog
PCI Perspectives
PCI Perspectives
美团技术团队
O
OpenAI News
T
Tailwind CSS Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog
GbyAI
GbyAI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
MyScale Blog
MyScale Blog

Hacker News - Newest: "LLM"

GitHub - lechmazur/position_bias: A benchmark for testing whether LLM judges keep the same preference when two lightly edited versions of the same story are shown in opposite orders. Flex routing (EU and EFTA) Dark Factories: Retooling for LLM Velocity Ask HN: What would be the impact of a LLM output injection attack? GitHub - AronDaron/dataset-generator: No-code desktop app for generating high-quality synthetic datasets to fine-tune LLMs — plan-then-execute pipeline, LLM-as-judge, HuggingFace upload. GitHub - Oaklight/llm-rosetta: Production-ready LLM API translation layer for Python — bidirectional conversion between OpenAI, Anthropic & Google formats via hub-and-spoke IR. Optional API gateway. Streaming & non-streaming. Zero core deps. Contributions welcome! GitHub - browser-use/browser-harness: Self-healing browser harness that enables LLMs to complete any task. GitHub - moeen-mahmud/remen: Remen turns thoughts into something you can return to Analyzing 156 LLM Launch Posts on Hacker News ChatGPT vs Gemini vs Claude: The Best LLM Subscription You Should Buy GitHub - salaamalykum/quran-semantic-search: High-density RAG Semantic Search Engine & Quran Corpus (GEO/SEO Architecture) GitHub - NVIDIA/TensorRT-LLM: TensorRT LLM provides users with an easy-to-use Python API to define Large Language Models (LLMs) and supports state-of-the-art optimizations to perform inference efficiently on NVIDIA GPUs. TensorRT LLM also contains components to create Python and C++ runtimes that orchestrate the inference execution in a performant way. The State of LLM Bug Bounties in 2026 Operational Readiness Criteria for Tool-Using LLM Agents Meshcore: Architecture for a Decentralized P2P LLM Inference Network How an LLM becomes more coherent as we train it GitHub - seetrex-ai/laimark GitHub - Jossifresben/BibCrit: AI-assited biblical textual criticism GitHub - wastedcode/memex: File system based wiki, maintained by Claude 99helpers.com GitHub - cliver-project/AITrigram GitHub - unbody-io/adapt: A self-evolving memory layer for AI agents. GitHub - hb20007/awesome-gen-ai-fails: A list of incidents where reliance on generative AI and LLMs resulted in harm to companies, individuals, or society GitHub - nevenkordic/localmind: Run any local LLM with persistent memory and context. CLI agent over Ollama with SQLite-backed hybrid recall. No cloud. Ask HN: What are the machine requirements for a LLM like Llama-3.1-8B? Faster LLM Inference via Sequential Monte Carlo grpo explained: group relative policy optimization for llm finetuning - cgft Stop comparing price per million tokens: the hidden LLM API costs · TensorZero Andrej Karpathy's LLM Wiki Is a Bad Idea GitHub - GG-QandV/mnemostroma: Offline RAM-first cognitive leer/coprocessor for AI agents and robotics. Solves "Context Abandonment" with 20-80ms latency using a dual-thread biomimetic memory architecture (ONNX + SQLite WAL). mempalace/agent at agent · skorotkiewicz/mempalace GitHub - Nyquest-ai/nyquest-rust-fullstack-pub: Nyquest — Semantic Compression Proxy for LLMs. 350+ rules, local LLM stage, 15-75% token savings. Full Rust stack. GitHub - TheoV823/mneme: Enforce architectural decisions in AI-assisted development. GitHub - klemenvod/TokenBrawl: A 1v1 Bomberman-style game where two LLM agents play autonomously against each other. No human plays — you watch the AIs fight. Each agent receives a text description of the board state, reasons about it, and outputs a move as JSON. The game engine executes it. Introducing the Common AI Provider: LLM and AI Agent Support for Apache Airflow Power Circuit AI: Designing Power Electronic Circuits for Motor Drives with Generative Artificial Intelligence Ask HN: How to program with IDE and LLM on CPU locally? Show HN: Agent-cache – Multi-tier LLM/tool/session caching for Valkey and Redis Bonsai 1-bit WebGPU - a Hugging Face Space by webml-community The LLM Fallacy: Misattribution in AI-Assisted Cognitive Workflows Ask HN: Simple tooling for local LLM code critique without IDE integration? Can a General LLM Diagnose a DICOM Slice? A 10-Case Public Benchmark Charts-of-Thought: Enhancing LLM Visualization Literacy (PDF, 2026) GitHub - Mesh-LLM/mesh-llm: Distributed AI/LLM for the people. Share compute privately or publicly to power your agents and chat. GitHub - seamus-brady/springdrift: A persistent runtime for long-lived LLM agents Writing an LLM from scratch, part 32k -- Interventions: training a better model locally with gradient accumulation Ask HN: Which LLM model and agentic CLI are you using for local development? GitHub - wayneColt/modelcascade: Route local. Escalate smart. Never overspend. Open-source multi-model cascade routing for autonomous agents. LLM pricing is 100x harder than you think GitHub - asakin/llm-primer: Pre-warmed Claude Code sessions in tmux. No startup wait. GitHub - EggerMarc/chat-rs: A multi-provider LLM framework for Rust. GitHub - SynapseKit/SynapseKit: Minimal, async-first Python framework for production LLM apps- 2 hard deps, no magic, no SaaS. A Claude Skill that Makes LLM Paragraphs More Bearable Does Gas Town 'steal' usage from users' LLM credits & paid services to improve itself? What's Claude Code Actually Doing? Open the Black Box with the Arthur Engine Milla Jovovich's New Open Source LLM Memory App and the Dark Code Problem Your intuition of LLM token usage might be wrong Show HN: Bloomberg Terminal for LLM ops – free and open source GitHub - 0xchamin/mcptube: Transform YouTube videos into a compounding knowledge base with transcripts, vision analysis, and agentic search. Works as an MCP server for Claude, Copilot & more. Show HN: Open KB: Open LLM Knowledge Base Your LLM is a compiler, not a runtime GitHub - sapountzis/Unslop: A Web Feed That Deserves You crates.io: Rust Package Registry Beyond Karpathy's LLM-Wiki: The Necessity of Cognitive Governance GitHub - amitshekhariitbhu/llm-internals: Learn LLM internals step by step - from tokenization to attention to inference optimization. GitHub - parallem-ai/parallem: An expressive library for running agents with the Batch API. GitHub - stfurkan/pi-llm LLM-Wiki Show HN: Formal – Formal verification for AI-generated code using Lean 4 LRTS – Regression testing for LLM prompts (open source, local-first) LLM Wiki Skill: Build a Second Brain with Claude Code and Obsidian I built an LLM Wiki and RAG solution: here's a demo for a security KB The biggest advance in AI since the LLM Predict-Rlm: The LLM Runtime That Lets Models Write Their Own Control Flow the-synthetic-library/the-synthetic-mind at main · joshferrer1/the-synthetic-library GitHub - yisding/reviewwiggum GitHub - Donnyb369/mcp-spine: Context Minifier & State Guard — Local-first MCP middleware proxy GitHub - Beledarian/wgpu-llm: A from-scratch LLM inference engine that uses wgpu (the cross-platform WebGPU implementation) to dispatch WGSL compute shaders for every math operation a Transformer needs. No CUDA. No Python. No massive framework dependencies. Just Rust, raw shaders, and your GPU. GitHub - anitiue/Hindsight: An experience-driven self-improvement framework for LLM agents — 基于经验的 LLM Agent 自我改进框架 GitHub - stef41/lmscan: 🔍 Detect AI-generated text and fingerprint which LLM wrote it. Open-source GPTZero alternative. Zero dependencies, works offline. GitHub - alainnothere/AmdPerformanceTesting: Amd Performance Testing Ask HN: Is a purely Markdown-based CRM a terrible idea? Optimized for LLM agents Context Engineering - LLM Memory and Retrieval for AI Agents | Weaviate little_helper_tui/letter.md at main · sleepyeldrazi/little_helper_tui GitHub - EvanZhouDev/umr: The Unified Model Registry for all your local AI apps. GitHub - JordanCT/VigIA-Orchestrator Your Agent Is Mine: Measuring Malicious Intermediary Attacks on the LLM Supply Chain A Taxonomy of RL Environments for LLM Agents Llama LLM Network Feture GitHub - genedeng-ca/ai-mac-migration: AI-powered Mac-to-Mac migration tool - replace Apple Migration Assistant with intelligent, selective transfer using local LLMs GitHub - lunargate-ai/gateway: High-performance self-hosted AI gateway (OpenAI-compatible) with routing, retries, and streaming GitHub - AuthBits/webmcp: A lightweight, prompt-driven MCP web research server for high-quality LLM powered information extraction. Externalization in LLM Agents: A Unified Review of Memory, Skills, Protocols and Harness Engineering Springdrift: An Auditable Persistent Runtime for LLM Agents with Case-Based Memory, Normative Safety, and Ambient Self-Perception High-Stakes Personalization: Rethinking LLM Customization for Individual Investor Decision-Making From Static Templates to Dynamic Runtime Graphs: A Survey of Workflow Optimization for LLM Agents HUOZIIME: An On-Device LLM-enhanced Input Method for Deep Personalization TIDE: Token-Informed Depth Execution for Per-Token Early Exit in LLM Inference Characterizing WebGPU Dispatch Overhead for LLM Inference Across Four GPU Vendors, Three Backends, and Three Browsers LLM Targeted Underperformance Disproportionately Impacts Vulnerable Users
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 - Newest: "LLM"

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.