{"id":50748534,"url":"https://github.com/philippnormann/sec-grep","last_synced_at":"2026-06-10T23:02:22.864Z","repository":{"id":363568349,"uuid":"1256953279","full_name":"philippnormann/sec-grep","owner":"philippnormann","description":"🔎 Fast, local search across the security \u0026 privacy literature, with an expressive query language, an interactive TUI, and scriptable output.","archived":false,"fork":false,"pushed_at":"2026-06-09T11:53:31.000Z","size":831,"stargazers_count":7,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-09T13:25:06.590Z","etag":null,"topics":["academic","cli","dblp","papers","privacy","research-tool","rust","security","security-research","tui"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/philippnormann.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-02T08:22:55.000Z","updated_at":"2026-06-09T11:53:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/philippnormann/sec-grep","commit_stats":null,"previous_names":["philippnormann/sec-grep"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/philippnormann/sec-grep","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philippnormann%2Fsec-grep","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philippnormann%2Fsec-grep/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philippnormann%2Fsec-grep/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philippnormann%2Fsec-grep/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/philippnormann","download_url":"https://codeload.github.com/philippnormann/sec-grep/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philippnormann%2Fsec-grep/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34174148,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["academic","cli","dblp","papers","privacy","research-tool","rust","security","security-research","tui"],"created_at":"2026-06-10T23:02:20.361Z","updated_at":"2026-06-10T23:02:22.851Z","avatar_url":"https://github.com/philippnormann.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sec-grep\n\nFast, local search across the security and privacy research literature.\n\n![sec-grep TUI](assets/tui.png)\n\n`sec-grep` builds a local SQLite/FTS5 index from DBLP and gives you a clean CLI\nand TUI for searching papers with an expressive query language across title,\nauthors, abstract, venue, year, rank, tag, and DOI.\n\n## Why\n\n- Search beyond the usual top-4 security venues with a configurable catalog.\n- Keep the corpus local and query it quickly with SQLite/FTS5.\n- Search in the CLI or TUI, and export CSV, JSON, or BibTeX for scripts.\n\n## Install\n\nRequires Rust 1.95 or newer.\n\n```sh\ncargo install --git https://github.com/philippnormann/sec-grep sec-grep\n```\n\nOr from a local checkout:\n\n```sh\ncargo install --path crates/sec-grep\n```\n\nCargo installs to `~/.cargo/bin` on macOS/Linux and\n`%USERPROFILE%\\.cargo\\bin` on Windows. Make sure that directory is on `PATH`.\n\nOr use [`nix`](https://nixos.org/):\n\n```sh\nnix run \"github:philippnormann/sec-grep\" -- \u003carguments\u003e # run once\nnix shell \"github:philippnormann/sec-grep\"              # add to PATH\n```\n\n## Use\n\n```sh\nsec-grep init\nsec-grep update --since 2018\nsec-grep --tui\n```\n\nIn the TUI, use `Tab` to cycle sort modes, arrow keys to move, and `Enter` to\nopen the selected paper URL.\n\nSort CLI results with `--sort relevance`, `--sort year`, `--sort venue`, or\n`--sort rank`.\n\nSearch from the shell:\n\n```sh\nsec-grep 'title:fuzzing venue:ndss year:2020-'\nsec-grep '\"side channel\" OR cache' --venue CCS,SP\nsec-grep 'doi:10.1145' --fields venue,year,title,doi\n```\n\nMore examples:\n\n```sh\n# Recent malware-detection papers in A/A* venues\nsec-grep 'malware detection' --year 2022- --rank A --rank 'A*' --sort year\n\n# Export matching papers as BibTeX\nsec-grep 'kernel fuzz*' --venue USENIX-SEC --format bibtex \u003e papers.bib\n\n# Script-friendly CSV with selected columns\nsec-grep 'abstract:\"large language model\"' --tag systems \\\n  --format csv \\\n  --fields venue,year,title,authors,url\n\n# Limit output for quick triage\nsec-grep 'ransomware OR botnet' --year 2020- --limit 20\n\n# Search a custom database path\nsec-grep --db ./papers.db 'symbolic execution' --venue ccs\n```\n\n## Query Language\n\n- Boolean search: `AND`, `OR`, `NOT`, parentheses, and quoted phrases.\n- Text fields: `title:`, `author:`, `abstract:`.\n- Metadata filters: `venue:`, `year:`, `rank:`, `tag:`, `doi:`.\n- Prefix search: `fuzz*`.\n\nYear filters accept `2020`, `2018-2024`, `2020-`, and `-2019`.\n\nMetadata filters can be written inline:\n\n```sh\nsec-grep 'malware detection year:2022- rank:A'\n```\n\nor as CLI flags:\n\n```sh\nsec-grep 'malware detection' --year 2022- --rank A\n```\n\nBoolean operators apply only to full-text terms. Metadata filters are ORed\nwithin one field and ANDed across fields.\n\n```sh\nsec-grep 'malware OR botnet' --rank A --rank 'A*'\nsec-grep 'malware OR botnet year:2018 year:2029'\nsec-grep 'malware OR botnet' --rank A --tag systems\n```\n\n## Venues\n\nThe bundled venue catalog lives in `crates/sec-grep-core/venues.yaml`. It\ndefines each venue's display name, DBLP stream, aliases, rank, tags, and\nabstract parser hint.\n\nAfter `sec-grep init`, you can extend or override the catalog with a user\n`venues.yaml`:\n\n- macOS: `~/Library/Application Support/sec-grep/venues.yaml`\n- Linux: `~/.config/sec-grep/venues.yaml`\n- Windows: `%APPDATA%\\sec-grep\\venues.yaml`\n\nYou can also pass a specific file with `--config path/to/venues.yaml`.\n\nUser venues are merged by `id`: reuse an existing `id` to override a bundled\nvenue, or add a new `id` to extend the catalog.\n\n```yaml\ndefaults:\n  min_year: 2018\n\nvenues:\n  - id: DIMVA\n    name: Conference on Detection of Intrusions and Malware \u0026 Vulnerability Assessment\n    dblp_stream: conf/dimva\n    aliases: [dimva]\n    rank: B\n    tags: [systems, network, malware]\n    abstract_source: springer\n```\n\nThen ingest and search it:\n\n```sh\nsec-grep update --venue DIMVA\nsec-grep 'malware' --venue DIMVA\n```\n\n`dblp_stream` is the DBLP stream slug from URLs like\n`https://dblp.org/streams/conf/dimva`. `abstract_source` is optional; supported\nvalues are `acm`, `ieee`, `ndss`, `springer`, and `usenix`.\n\n## Abstracts\n\nAbstract enrichment is optional, cached, and best-effort. sec-grep first tries\nDOI-based APIs, then falls back to static publisher-page parsers.\n\n```sh\nsec-grep update --abstracts\nsec-grep enrich --jobs 8\n```\n\nNo API keys are required, but keys can improve rate limits and coverage.\n\n| Variable | Used for | Get a key |\n|---|---|---|\n| `OPENALEX_API_KEY` | OpenAlex DOI lookup | [openalex.org/settings/api](https://openalex.org/settings/api) |\n| `SEMANTIC_SCHOLAR_S2_KEY` | Semantic Scholar DOI lookup | [semanticscholar.org/product/api](https://www.semanticscholar.org/product/api) |\n\nSet them in the shell:\n\n```sh\nexport OPENALEX_API_KEY=...\nexport SEMANTIC_SCHOLAR_S2_KEY=...\n```\n\nOr place them in a local `.env` file:\n\n```sh\nOPENALEX_API_KEY=\nSEMANTIC_SCHOLAR_S2_KEY=\n```\n\n`.env` is loaded automatically when present.\n\n## Acknowledgements\n\nInspired by [top4grep](https://github.com/Kyle-Kyle/top4grep).\n\n## License\n\nReleased under the [MIT License](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilippnormann%2Fsec-grep","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphilippnormann%2Fsec-grep","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilippnormann%2Fsec-grep/lists"}