HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
BurntSushi
ripgrep
Rust2016–2026
BurntSushi / ripgrep

ripgrep

ripgrep recursively searches directories for a regex pattern while respecting your gitignore

196Distinct people
333Mentions
9Explicit recommenders
69.9KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

ripgrep recursively searches directories for a regex pattern while respecting your gitignore

GitHub

Where it is used

  • Visual Studio Code — Visual Studio Code uses ripgrep to power its text search feature, making searches faster. This integrates ripgrep as the engine behind VS Code’s search. Source
  • Eclipse Theia — Eclipse Theia installs and uses ripgrep under its install directory (resources/app/lib/backend/native/ripgrep), requiring extensions to point to that location because Theia places ripgrep in a different directory than VSCode. Source

What people are saying

> I wrote about how to do error handling without libraries literally the day Rust 1.0 was published: https://burntsushi.net/rust-error-handling/ > > That blog did include a…

osiris88 used a recommendation phrase. 9 indexed comments match. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:56:07 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year333 dated mentions

Observed mentions: 2016-09-23 15:29:58 UTC to 2026-10-05 14:38:02 UTC.

010203040502016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 25 mentions; 1 submissions, 24 comments20162017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 34 mentions; 3 submissions, 31 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 41 mentions; 5 submissions, 36 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 41 mentions; 1 submissions, 40 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 45 mentions; 3 submissions, 42 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 37 mentions; 2 submissions, 35 comments20212022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 29 mentions; 1 submissions, 28 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 32 mentions; 3 submissions, 29 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 14 mentions; 2 submissions, 12 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 21 mentions; 3 submissions, 18 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 14 mentions; 4 submissions, 10 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC25124
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC34331
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC41536
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC41140
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC45342
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC37235
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC29128
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC32329
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC14212
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC21318
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC14410

What Hacker News says

333 sources

Show HN: Jurl – curl that reads the page for you

jurl is a CLI. Tell it what you want from a page and it picks exactly that out: the paragraphs that answer a question, the code, the links worth following, or a photo you describe. On Wikipedia's Cologne page it finds the cathedral among 73 images in 2.3 s; on the Jevons page, the two paragraphs out of ~240 that explain his paradox. The link above lets you try it in the browser, no key needed. Or in your terminal, with your own TypeSafe key (it asks for it on first run): brew install rayoplateado/tap/jurl jurl -q "What is the Jevons paradox?" en.wikipedia.org/wiki/William_Stanley_Jevons jurl --code github.com/BurntSushi/ripgrep jurl -f "a cathedral" en.wikipedia.org/wiki/Cologne jurl -l -n 3 news.ycombinator.com | xargs -n1 jurl -n 1 How it works: jurl splits the page into blocks, links and images, and turns each one into a yes
Read the rest
/no question ("does this block answer the question?"). A decision model, Jev from TypeSafe, scores them all in a single request. For images, Clef on Cloudflare Workers AI looks at the pixels. The models return probabilities, never text: jurl picks, it doesn't write. Everything it prints is on the page, so it's safe to pipe into xargs curl. Most pages take under a second and cost a fraction of a cent, about a thousand pages per dollar, paid straight to the APIs: jurl calls them directly with your own keys (TypeSafe for text, plus Cloudflare only if you want it to look at images). Written in Rust, MIT or Apache-2.0. Code: https://github.com/rayoplateado/jurl I'd especially like to hear about pages where it picks the wrong thing. P.S. It's pronounced /xaɾl/, "harl": the name is a nod to the Spanish comedian Chiquito de la Calzada and his "jarl".
6 points · Open discussion
I like burntsushi's string-searching work because it's well documented, split modularly into libraries/applications, and runs the gamut from low- to high-level (his blog posts and comments online are extremely helpful too). I use these three tools which he maintains: Low level: memchr [1]; Medium level: Regex (Rust crate) [2]; High level: ripgrep [3]. Other names to look out for are the previously aforementioned Wojciech Muła, as well as Daniel Lemire (of simdjson [4][5]). Not SIMD-specific, but Data-Oriented Design can be a big help in terms of thinking about SIMD and cache-friendly data layout (as well as trimming down the work that the computer needs to do, generally). I've talked that to death, so I'll just link those comments here [6]. 1. https://docs.rs/memchr/latest/memchr/ 2. https://docs.rs/regex/latest/regex/ 3. https://github.c
Read the rest
In Bitap: My favorite string matching algorithm
It's not really disputed since musl without mimalloc has a 144% overhead, so most of the performance issues do indeed come from the allocator, by a pretty large margin (~85% of it). Not only that, but some of the "other code" performance hit might still come from the allocator: when you set a global allocator on the Rust side, musl still uses its own allocator internally (as demonstrated by https://github.com/BurntSushi/ripgrep/issues/3494). And the compounding issue is that the allocator issues get significantly worse as parallelism increases, as the allocator is serial, so as concurrency increases so does the impact of the allocator, which is not the case for most of the "regular slow" code (of musl), those have a relatively constant overhead per thread.
In Don't use musl if you care about performance
I'm the author of Bttf. I just wanted to share a really cool example of something that Bttf can do that I _think_ is kinda hard to do otherwise. (And also, I want to make an assertion about it and I hope this will lead to me being wrong and learning something new.) The use case is: "I want to see a list of all files in a repository, sorted in ascending order of when it was most recently changed according to source control. I also want to highlight the time with color, make it be in local time and format it in my own bespoke way using strftime." Here's the full command (run from the root of https://github.com/BurntSushi/ripgrep): $ git ls-files | bttf tag exec git log -n1 --format='%aI' | bttf time in system | bttf time sort | bttf time fmt -f '%a %Y-%m-%d %H:%M:%S' | bttf untag -f '{tag}|t{data}
Read the rest
' ... Thu 2025-10-30 13:30:14 crates/ignore/Cargo.toml Sat 2025-11-29 14:11:38 crates/core/flags/lowargs.rs Wed 2025-12-17 11:38:12 tests/misc.rs Wed 2025-12-17 11:38:12 tests/util.rs Thu 2026-02-12 20:39:46 crates/ignore/src/default_types.rs Fri 2026-02-20 16:06:29 crates/core/flags/config.rs Fri 2026-02-27 11:25:19 GUIDE.md Fri 2026-02-27 11:25:19 crates/core/flags/defs.rs Mon 2026-05-25 23:56:53 CONTRIBUTING.md Tue 2026-05-26 08:32:43 AI_POLICY.md Or even ask for a specific time window: $ git ls-files | bttf tag exec git log -n1 --format='%aI' | bttf time in system | bttf time cmp ge 2026-01-01 | bttf time cmp lt 2026-04-01 | bttf time sort | bttf time fmt -f '%a %Y-%m-%d %H:%M:%S' | bttf untag -f '{tag}|t{data}' Thu 2026-02-12 20:39:46 crates/ignore/src/default_types.rs Fri 2026-02-20 16:06:29 crates/core/flags/config.rs Fri 2026-02-27 11:25:19 GUIDE.md Fri 2026-02-27 11:25:19 crates/core/flags/defs.rs If you run this on a big repository, it will take quite a lot of time because `git log -n1` takes a long time. I think this is the fastest way to get the most recent commit time on a single file? (That's the assertion that I hope someone can correct me on!) In any case, `bttf tag exec` is using parallelism under the hood to make this even faster.
In Bttf is a command line datetime Swiss army knife

Tell HN: Fastmod Is Nice

I wanted to make a blog post, but life happens and I think a quick submission also does the job. I always get aggro trying to reuse a regex that works on `rg` in `sed`. You rg "something I need to (change|modify)" file.md It works but then sed -i 's/something I need to (change|break)/$1 is inevitable/g' file.md Nothing happens... Ah yes! Extended regex... sed -e -i 's/something I need to (change|break)/$1 is inevitable/g' file.md What? Still nothing? Let me check the docs: sed -h 2>&1 | grep 'regex' -E, -r, --regexp-extended Ah yes... its `-E`. But fastmod, which is mentioned in at the end of https://github.com/BurntSushi/ripgrep/blob/master/FAQ.md#search-and-replace is surprisingly good, both in terms of performance/ux and compatibility. You just: fastmod -m 'something I need to (change|break)' '$1 is inevitable' file.m
Read the rest
d It will open a confirmation window for every change so you can review and apply it, which you can bypass with --accept-all, which doesn't have a shorthand which is a correct decision IMHO.
2 points · Open discussion
Ripgrep does something like thhis. It has a meta regex engine that switches engine when it finds what looks like pathological cases (or rather, the regex-automata crate does, which is used by the regex crate, which powers ripgrep). https://docs.rs/regex-automata/latest/regex_automata/meta/st... Ripgrep in turn exposes some knobs to tweak the heuristics https://github.com/BurntSushi/ripgrep/blob/master/FAQ.md#how...
In Yes, all longest regex matches in linear time is possible
osiris88·Dec 28, 2025Recommendation phrase
> I wrote about how to do error handling without libraries literally the day Rust 1.0 was published: https://burntsushi.net/rust-error-handling/ > > That blog did include a recommendation for `failure` at one point, and now `anyhow`, but it's more of a footnote. The blog shows how to do error handling without any dependencies at all. You didn't have to jump on the error library treadmill. (Although I will say that `anyhow` and `thiserror` have been around for a number of years now and shows no signs of going away.) Thank you -- I just wanna say, I read a lot of your writing and I love your work. I'm not sure if I read that blog post so many years ago but it looks like a good overview that has aged well. > I happily downcast in ripgrep: https://github.com/BurntSushi/ripgrep/blob/0a88cccd5188074de... > > That also shows the utility of an e
Read the rest
rror chain. Yeah, I mean, that looks pretty nice. I still think the error chain abstraction should actually be a tree. And I think they should never have stabilized an `std::error::Error` trait that was not in core. I think that itself was a mistake. And 8 years later we're only now maybe able to get there. I actually said something on a github issue about this before rust 1.0 stabilization, and that it would cause an ecosystem split with embedded, and that this really should be fixed, but my comment was not well received, and obviously didn't have much impact. I'll see if I can find it, it's on github and I remember withoutboats responded to me. Realistically the core team was under a lot of pressure to ship 1.0 and rust has been pretty successful -- I'm still using it for example, and a lot of embedded folks. But I do think I was right that it caused an ecosystem split with embedded and could have been avoided. And the benefit of shipping a janky version of `std::error::Error` however many years ago, almost all of which got deprecated, seems hard to put a finger on.
In Rust errors without dependencies

Showing the 15 most recent of 333 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.