{"id":13392723,"url":"https://github.com/pyjarrett/septum","last_synced_at":"2026-05-23T06:12:42.878Z","repository":{"id":40574205,"uuid":"361585920","full_name":"pyjarrett/septum","owner":"pyjarrett","description":"Context-based code search tool","archived":false,"fork":false,"pushed_at":"2026-05-01T01:23:34.000Z","size":512,"stargazers_count":398,"open_issues_count":13,"forks_count":11,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-05-01T03:14:05.869Z","etag":null,"topics":["ada","grep","grep-like","grep-search","search-in-text","septum","text"],"latest_commit_sha":null,"homepage":"","language":"Ada","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pyjarrett.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-04-26T01:50:20.000Z","updated_at":"2026-05-01T01:23:38.000Z","dependencies_parsed_at":"2026-04-17T04:01:19.150Z","dependency_job_id":null,"html_url":"https://github.com/pyjarrett/septum","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/pyjarrett/septum","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyjarrett%2Fseptum","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyjarrett%2Fseptum/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyjarrett%2Fseptum/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyjarrett%2Fseptum/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pyjarrett","download_url":"https://codeload.github.com/pyjarrett/septum/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyjarrett%2Fseptum/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32595216,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T22:12:39.696Z","status":"online","status_checked_at":"2026-05-04T02:00:06.625Z","response_time":58,"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":["ada","grep","grep-like","grep-search","search-in-text","septum","text"],"created_at":"2024-07-30T17:00:36.049Z","updated_at":"2026-05-23T06:12:42.870Z","avatar_url":"https://github.com/pyjarrett.png","language":"Ada","funding_links":[],"categories":["Tools","Ada","others"],"sub_categories":["DevOps"],"readme":"# Septum\n\n[![Alire](https://img.shields.io/endpoint?url=https://alire.ada.dev/badges/septum.json)](https://alire.ada.dev/crates/septum.html)\n[![Build Status](https://github.com/pyjarrett/septum/actions/workflows/build-all.yml/badge.svg)](https://github.com/pyjarrett/septum/actions/workflows/build-all.yml)\n[![Latest Artifacts](https://github.com/pyjarrett/septum/actions/workflows/build-artifacts.yml/badge.svg)](https://github.com/pyjarrett/septum/actions/workflows/build-artifacts.yml)\n\n[![image](https://img.shields.io/badge/-inside-blue?logo=ada\u0026logoColor=white\u0026labelColor=grey\u0026logoSize=auto\u0026style=flat-square)](https://ada-lang.io/)\n[![Awarded](https://img.shields.io/badge/Ada_Crate_of_the_Year-2021-blue?style=flat-square)](https://www.adacore.com/blog/ada-spark-crate-of-the-year-2021-winners-announced)\n\n---\n\nInteractive, context-aware code search for million-line codebases - fully local, built in Ada.\n\n[![asciicast](https://asciinema.org/a/459292.svg)](https://asciinema.org/a/459292)\n\n# Use Case\n\nFinding what you need in large codebases is hard.  Sometimes terms have multiple\nmeanings in different parts of the project, and figuring out what you're looking\nfor needs to be done in an incremental fashion.\n\nSeptum provides an interactive environment to add and remove search filters\nto narrow or expand a search.\n\n# What does this do?\n\nSeptum provides interactive searching of a codebase for blocks of lines which\ncontain the terms you want, and exclude the terms you don't want.\n\nIt's different from `grep` by interactively allowing filters to be added and\nremoved, and focusing on multiple line groups.  If you're doing a search looking\nfor something on a specific line, you probably want to use `grep` (or `ripgrep`).\nIf you're looking for a block of code with a bunch of terms in those lines\nand want to whittle it down since they appear in a lot of places, you probably\nwant to use Septum.  Using a context width of 0 approximates an interactive grep.\n\n![Include match](docs/images/context_match.png)\n\nLimiting the search into blocks around search terms allows searching for elements\nin arbitrary order which may span across lines, in a way which can be difficult\nto express in other tools. Sometimes terms appear multiple times in a project and\nhave names which change based on context. Septum allows exclusion of these contexts.\n\n![Exclude match](docs/images/excluded_match.png)\n\nFilters get applied in turn with contexts being removed at every step.  Similar\ncontexts get deduplicated before presented to cut out more clutter.\n\n# Example session\n\n```\n# Start interactive search\n$ septum\n\n# Following commands are all interactive within septum\n# Omitting printed context results here for brevity.\n\n# Load something to search\n\u003e add-dirs D:/dev/ada/septum\n\n# Turn on config flag to always immediately search after changing filters\n# You would need match-contexts or match-files after each filter change\n# to do searching otherwise.\nenable-auto-search\n\n# See how much to search.\n\u003e stats\nFiles:  697\nLines:  26342\n\n# Apply some filters\n\u003e find-like Make\n\nMatching contexts:  184\nMatching files: 69\n\n# Exclude some directories we don't want in the results\n\u003e exclude-path cache/dependencies\n\nMatching contexts:  97\nMatching files: 21\n\n# The search found a bunch of Make_Commands, but that's not\n# what I want.\n\u003e exclude-like Make_Command\n\nMatching contexts:  45\nMatching files: 21\n\n# Exploded_Line also has a Make function, not related to what I want.\n\u003e exclude-like Exploded_Line\n\nMatching contexts:  35\nMatching files: 18\n\n# I'm looking for the Make version, not the Make_Null version\n\u003e exclude-like Mkae_Null\n\n# Oops, made a typo, remove just last filter.\n\u003e pop\n\n\u003e exclude-like Make_Null\n\nMatching contexts:  22\nMatching files: 16\n\n# OK, found what I needed\n\n# Exit the interactive session\n\u003e exit\n```\n\nAt program start, commands get loaded and run from `.septum/config` in the\ncurrent and ancestor directories, and `%LOCALAPPDATA%/septum/config` on\nWindows or `$XDG_CONFIG_HOME` on Mac/Linux, which defaults\nto `~/.config/septum/config`.\n\nYou can create a starter config file in a directory with `septum init`.\n\nAn example config file might contain:\n\n```\n# Turn on config flag to always immediately search after changing filters\nenable-auto-search\n\n# Set the maximum number of returned results\nset-max-results 20\n\n# Default directories to load\nadd-dirs /Users/me/dev/ada/septum\n```\n\n# Philosophy\n\nSeptum is designed to be a standalone application for the lone developer on\ntheir own hardware, searching closed source software. This means the program\nshould use a minimum number of dependencies to simplify security auditing and\nperform no network operations.\n\nUsually Septum is used interactively, but it also can be used in scripts and\npipelines using the `run` command.\n\n```\nseptum run complicated_search.septum \u003e results.txt\n```\n\n# Performance\n\nSeptum keeps the search directories in memory and parallelizes searches across\nall available cores.  Anecdotally this equates to ~100 MB per 1 million lines of\ncode, and ~6 millions lines of code searched per second on an Mac M1 Air with\n8 cores (4 performance and 4 efficiency cores).  This makes it reasonable to\nuse on a developer machine for codebases with dozens of millions of lines\nof code.\n\n# Installing\n\nSelf-contained binaries are available on the [releases page](https://github.com/pyjarrett/septum/releases).\n[Nightly binaries are available](https://github.com/pyjarrett/septum/actions/workflows/build-artifacts.yml) if you prefer a bleeding edge release.\n\n# Building\n\n1. This project requires a recent release of the [Alire](https://github.com/alire-project/alire/releases) tool to build.\n2. Install a toolchain.\n\n```bash\nalr toolchain --select\n```\n\n3. Build\n\n```bash\nalr build --release\n```\n\n4. Executable should be at `bin/septum(.exe)`\n\n## Parallel development with other crates\n\nSeptum development between releases often coincides with additional development\nin the [Trendy Terminal](https://github.com/pyjarrett/trendy_terminal) and\n[Progress Indicators](https://github.com/pyjarrett/progress_indicators) crates.\n\nDue to delays in Alire crate acceptance, you might need to pull those crates into\nthe same parent directory as septum if the `main` branch is pinned to either or both of\nthese:\n\n```\n    some_common_parent_dir/\n        septum/\n        progress_indicators/\n        trendy_terminal/\n```\n\nIf you need a stable release, check out the most recent git tag.\n\n# Testing\n\nIntegration tests use [BBT](https://github.com/LionelDraghi/bbt).\n\nRun these like:\n\n```\nbbt --exec_dir . --recursive docs/tests --verbose --strict --tmp_dir bbt_out --output integration_test_results.md\n```\n\n# Contributing\n\nSeptum aims to help every developers everywhere.  You're encouraged to recommend\nfeatures, report bugs, or submit pull requests.\n\n# License\n\nSeptum is released under the [Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyjarrett%2Fseptum","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpyjarrett%2Fseptum","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyjarrett%2Fseptum/lists"}