{"slug": "show-hn-silobrief-selectively-export-code-context-from-air-gapped-networks", "title": "Show HN: SiloBrief – Selectively export code context from air-gapped networks", "summary": "SiloBrief 1.2.1, a local CLI tool from developer d3vksy, enables selective export of Python project context as Markdown briefs for use with external AI assistants on air-gapped networks, with no network access and support for Windows and Ubuntu. The tool, released under Apache License 2.0, requires Python 3.10+ and the prompt-toolkit dependency, and includes commands for setup, indexing, logging, searching, and brief generation.", "body_md": "[Quick start](#quick-start) •\n[How it works](#how-it-works) •\n[Commands](#commands) •\n[Safety](#safety-and-limitations) •\n[Validation](#validation-status) •\n[Security](#security) •\n[한국어](/d3vksy/silobrief/blob/main/README.ko.md)\n\nIn a closed network or internal development environment, an external AI assistant cannot access the repository directly. Developers must prepare the relevant code and project context separately.\n\nsiloBrief is a local CLI that turns approved Python project context into a Markdown brief. You choose the information and source excerpts before writing the file. The result is input for another tool, not a generated code change.\n\n- License: Apache License 2.0\n- Platforms: Windows and Ubuntu\n- Python: 3.10 and newer\n- Runtime dependency:\n`prompt-toolkit`\n\nfor interactive file and function completion - Network access: none\n\nIf you use WSL, keep the project in the WSL Linux filesystem. For a project under `/mnt/c`\n\nor\nanother Windows-mounted path, run `sb`\n\nfrom native Windows. `sb setup`\n\nstops if the mount cannot\ncreate state files without overwriting an existing entry.\n\nInstall the stable package from PyPI and verify the command:\n\n```\npython -m pip install silobrief\nsb --version\n```\n\nExpected output:\n\n```\nsiloBrief 1.2.1\n```\n\nCreate a practice project:\n\n```\nsb example ./silobrief-practice\ncd silobrief-practice\n```\n\nThe generated project is a minimal Flask signup/login API backed by SQLite. JWT creation and\nverification helpers live in `private/jwt.py`\n\n, while the local signing key is stored in the\ngitignored `.env`\n\nfile. The login route does not use them yet.\n\nStart the first task from the same directory:\n\n```\nsb setup .\nsb language --cli en --brief en\nsb ignore private --as \"JWT settings\"\nsb init\nsb log app.py --comment \"Use private.jwt.create_access_token(user_id, username) to issue a JWT.\"\nsb search \"successful login response\"\nsb brief\n```\n\nAt `Task`\n\n, enter:\n\n```\nAdd PyJWT to requirements.txt. On successful login, return an access_token that expires after one\nhour. Include only user_id and username in the token. Do not expose the password or private\nsettings. Return a diff and tests.\n```\n\nAt `Add context`\n\n, enter `/file`\n\nand choose `requirements.txt`\n\n. Then enter `/func`\n\n, choose `app.py`\n\n,\nand select `login`\n\n. Use the arrow keys to move through the completion menu and Tab to select an\nitem. Press Enter at `Add context`\n\nto continue.\n\n`setup`\n\nprepares local state, and `init`\n\nindexes the Python files. `log`\n\nrecords approved project\ncontext. `search`\n\nshows ranked candidates, and `brief`\n\nstarts the review that produces the Markdown\nfile.\n\nIf `setup`\n\nis interrupted, run it again. It resumes only when every existing state entry exactly\nmatches a generated default. Unknown or modified entries are left untouched, and setup stops with\nan error.\n\nRegister paths that siloBrief must skip before building the index:\n\n```\nsb ignore private_adapter --as \"External delivery adapter\" --alias delivery-boundary\nsb init\n```\n\nIf a boundary is no longer needed, remove it by its stored path or alias and rebuild the index:\n\n```\nsb unignore delivery-boundary\nsb init\n```\n\n`unignore`\n\nchanges the local configuration without opening the target. It marks the current index as\nstale, so `sb brief`\n\nremains blocked until `sb init`\n\nfinishes. Files under the removed boundary may\nthen appear as review candidates.\n\nUse `sb log`\n\nfor a project fact that the code alone does not explain:\n\n```\nsb log src/parcel_sync/service.py --comment \"HTTP 503 responses may be retried.\"\n```\n\nEnter only information approved for external disclosure. Do not put private source code, secrets, or real names from excluded areas in a project note.\n\nStart a review with a concrete task:\n\n```\nsb brief \"Update retry_request to retry HTTP 503 but not 500. Return a unified diff and tests.\" --out .silobrief/exports/retry-with-note.md\n```\n\nOmit `PROMPT`\n\nto open the interactive request builder. `/file`\n\nlets you choose an allowed project\nfile. `/func`\n\nlets you choose an indexed Python file, then one of its functions or methods.\n\nDuring `brief`\n\n:\n\n- Confirm the task. Files and functions chosen in the request builder are added to the task. Indexed Python choices are also preselected for review, and you can add other candidates.\n- Review one-hop related context and type an\n`rN`\n\nvalue only for an item you want to add. Blank input approves none. - Review each proposed project field.\n- Choose whether to include the displayed source code. The default answer is no.\n- If a boundary identifier appears in an approved excerpt body or definition header, type\n`EXPOSE`\n\nafter reviewing it. - Review the complete brief.\n- Type\n`WRITE`\n\nto create the file.\n\nThe result is one Markdown brief containing the task, approved project context, and any source code you select and approve. Selected source is included verbatim. If you decline every source selection, the file contains only the task and approved project context. Open the file before moving it to a different environment.\n\nThe terminal interface and generated brief default to English. Settings are stored per project and can be changed together or separately:\n\n```\nsb language --cli ko\nsb language --brief en\nsb language\n```\n\nThe CLI setting changes fixed terminal guidance. The brief setting changes generated headings and instructions. Task text, project notes, source code, paths, symbols, and identifiers remain as entered or selected. Language settings do not affect indexing, candidate ranking, IDs, ordering, or source digests.\n\nWrite `PROMPT`\n\nas a concrete task, not a list of keywords. Include the required deliverables and\nacceptance criteria so the receiving assistant can tell when the work is complete.\n\n| Command | What it does |\n|---|---|\n`sb setup [PATH]` |\nAdds or checks local siloBrief state in an existing project. |\n`sb example PATH` |\nCreates a minimal Flask practice project. |\n`sb ignore PATH --as TEXT [--alias NAME]` |\nExcludes a path and records a public label for that boundary. |\n`sb unignore SELECTOR` |\nRemoves one registered boundary by its exact stored path or alias. |\n`sb init` |\nBuilds the local search list from allowed Python files. |\n`sb log PATH --comment TEXT` |\nSaves an approved project note. |\n`sb search \"PROMPT\"` |\nLists a bounded set of code candidates and the request terms that matched each one. |\n`sb language [--cli {en,ko}] [--brief {en,ko}]` |\nSets terminal and generated-brief languages independently. |\n`sb brief [\"PROMPT\"] [--out FILE]` |\nOpens the interactive request builder when `PROMPT` is omitted. The default output is `.silobrief/exports/brief.md` . |\n`sb chat \"PROMPT\" --out FILE` |\nPrevious name for `sb brief` , kept for existing users. |\n`sb --version` |\nPrints the installed siloBrief version. |\n\nCommands other than `setup`\n\nand `example`\n\nfind the project root from the current directory. `brief`\n\nrequires an interactive terminal, a current index, and a new `.md`\n\noutput path. Output inside the\nproject must be below `.silobrief/exports/`\n\n. Existing files are never overwritten.\n\nWhen standard error is an interactive terminal, `sb init`\n\nshows one progress line for source\ncollection, analysis, index construction, source-change verification, and writing. Redirected output\nand CI runs omit the progress display. The success message remains on standard output.\n\nsiloBrief does not read registered excluded paths or follow symbolic links while indexing. References to excluded code use the public label you approved. Before it writes a brief, you review the complete output and choose which source excerpts to include.\n\nSource and state access stays bound to the project root and directory entries that were originally opened. During review and output, siloBrief also rechecks the configuration, current index, approved source snapshot, and destination. If their contents or filesystem identities change, it stops. It creates state and output files without replacing an existing entry and escapes terminal control characters from untrusted text before displaying it.\n\nIt does not detect secrets in allowed files or text entered with `sb log`\n\n. Approved source code may\ncontain comments, docstrings, strings, and internal identifiers. siloBrief is not a security scanner\nor an export-approval system for a closed environment. Review every generated file under your\norganization's disclosure rules before sharing it.\n\nOn Ubuntu, secure brief output requires the destination filesystem to support `O_TMPFILE`\n\nand allow\nlinks through `/proc/self/fd`\n\n. If either feature is unavailable, siloBrief stops without creating the\nrequested file. For a project under WSL's `/mnt/c`\n\n, run the native Windows `sb`\n\ncommand or move the\nproject and output location to the WSL Linux filesystem.\n\nThe latest public release is v1.2.1 and follows the supported 1.x compatibility contract. In the\nfrozen retrieval benchmark, `sb search`\n\nreaches an expected symbol for 11 of 12 tasks, with a mean\nreciprocal rank of 72.2%. Candidate search is lexical and advisory. When it misses, use the exact\nindexed Python file path during review.\n\nThe deterministic end-to-end flow was verified on Django Ninja, pytest, and Jinja checkouts without changing their Python source files. The benchmark is small and does not establish effectiveness across other AI models or private projects.\n\n[Installed wheel verification](/d3vksy/silobrief/blob/main/validation/v0.2/INSTALLED_WHEEL_VERIFICATION.md)[Manual model gate](/d3vksy/silobrief/blob/main/validation/v0.2/MANUAL_MODEL_GATE.md)[Claude gate result](/d3vksy/silobrief/blob/main/validation/v0.2/results/CLAUDE_GATE_RESULT.md)[v0.7 retrieval result](/d3vksy/silobrief/blob/main/validation/v0.7/RETRIEVAL_RESULT.md)[v0.8 related-context result](/d3vksy/silobrief/blob/main/validation/v0.8/RELATED_CONTEXT_RESULT.md)[Solo field-trial procedure](/d3vksy/silobrief/blob/main/validation/v0.9/FIELD_TRIAL.md)[v1.0.1 release verification](/d3vksy/silobrief/blob/main/validation/v1.0.1/RELEASE_VERIFICATION.md)[v1.0 scope-related context study](/d3vksy/silobrief/blob/main/validation/v1.0-scope-related-context/REPORT.md)\n\n| Code | Meaning |\n|---|---|\n`0` |\nSuccess |\n`1` |\nUnexpected internal error |\n`2` |\nInput, path, or configuration error |\n`3` |\nIndexing or Python parsing error |\n`4` |\nBoundary validation, approval, or output was blocked |\n\nSee the [security policy](/d3vksy/silobrief/blob/main/SECURITY.md) for vulnerability reporting guidance.\n\nContributions are welcome. Read the [contributing guide](/d3vksy/silobrief/blob/main/CONTRIBUTING.md) before opening an issue or\npull request. Everyone participating in the project must follow the\n[code of conduct](/d3vksy/silobrief/blob/main/CODE_OF_CONDUCT.md).\n\nsiloBrief is distributed under the Apache License 2.0. See [ LICENSE](/d3vksy/silobrief/blob/main/LICENSE).", "url": "https://wpnews.pro/news/show-hn-silobrief-selectively-export-code-context-from-air-gapped-networks", "canonical_source": "https://github.com/d3vksy/silobrief", "published_at": "2026-08-26 15:26:13+00:00", "updated_at": "2026-08-26 15:46:14.331052+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools"], "entities": ["siloBrief", "d3vksy", "PyPI", "Apache License 2.0", "Windows", "Ubuntu", "Python", "prompt-toolkit"], "alternates": {"html": "https://wpnews.pro/news/show-hn-silobrief-selectively-export-code-context-from-air-gapped-networks", "markdown": "https://wpnews.pro/news/show-hn-silobrief-selectively-export-code-context-from-air-gapped-networks.md", "text": "https://wpnews.pro/news/show-hn-silobrief-selectively-export-code-context-from-air-gapped-networks.txt", "jsonld": "https://wpnews.pro/news/show-hn-silobrief-selectively-export-code-context-from-air-gapped-networks.jsonld"}}