The uutils project reimplements ubiquitous command line utilities in
Rust. Our goal is to modernize the utils, while retaining full
compatibility with the existing utilities.
+We are planning to replace all essential Linux tools.
+
+# Why?
+
+C has served us well for decades, but it is time to move on. For new generations of developers, Rust is more appealing — and it brings real, substantive benefits:
+
+- **Memory safety** — eliminates entire categories of bugs without sacrificing performance
+- **Cross-platform portability** — the same code runs on Linux, macOS, Windows, Android, FreeBSD, NetBSD, OpenBSD, Solaris, Illumos, Fuchsia, Redox and even [WebAssembly](/playground)
+- **Modern tooling** — Cargo, crates.io and a rich ecosystem mean we don't have to reinvent the wheel
+- **Easy parallelism** — fearless concurrency built into the language
+- **Terrific performance** — on par with or better than C implementations
+- **Modern engineering practices** — excellent CI coverage (build on many OS/archs, GNU test suite execution), a smooth contributor experience, and continuous fuzzing (including differential fuzzing) at the review phase to catch edge cases early
+
+This is not about fighting the GNU project. It is not primarily about security (GNU coreutils only had [17 CVEs since 2003](https://security-tracker.debian.org/tracker/source-package/coreutils)) or about license debates. It is about **modernizing foundational software** so it can be maintained and improved by the next generation of contributors.
+
+Ubuntu is already [carefully but purposefully adopting](https://discourse.ubuntu.com/t/carefully-but-purposefully-oxidising-ubuntu/56995) uutils coreutils, Debian might follow the same path, and Microsoft offers it as well.
+
# Projects
-
# Crates
@@ -41,14 +81,24 @@ We maintain a variety of public crates to support our projects,
which are published on [crates.io](https://crates.io/).
- [`ansi-width`](https://github.com/uutils/ansi-width)
+- [`num-prime`](https://github.com/uutils/num-prime)
- [`parse_datetime`](https://github.com/uutils/parse_datetime)
- [`platform-info`](https://github.com/uutils/platform-info)
- [`uutils-term-grid`](https://github.com/uutils/uutils-term-grid)
+# Who we are
+
+uutils is a community-driven, open-source effort maintained by volunteers around the world. There is no company behind it, just contributors who care about the future of foundational command-line tools.
+
+Everything happens in the open on [GitHub](https://github.com/uutils), and newcomers are genuinely welcome. Many of our contributors landed their first-ever open-source patch on a uutils project, and we are happy to help you do the same.
+
+[Meet the team](/team) behind uutils.
+
# Contributing
You can help us out by:
+- [Tackling a good first issue](https://github.com/search?q=org%3Auutils+is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22&type=issues&s=created&o=desc) across any of our projects (the easiest way to get started)
- Contributing code
- Contributing documentation
- Reporting bugs (e.g. incompatibilities with GNU utilities)
@@ -57,6 +107,10 @@ You can help us out by:
You can join our [Discord server](https://discord.gg/wQVJbvJ) to discuss or ask anything concerning uutils. We're happy to help you get started with contributing!
+# Talks & Media
+
+We did a few talks about this project, see [our talks & media page](/talks).
+
# Friends of uutils
We collaborate with and build upon many other projects in the Rust
diff --git a/content/acl.md b/content/acl.md
new file mode 100644
index 000000000..36a7d3151
--- /dev/null
+++ b/content/acl.md
@@ -0,0 +1,29 @@
++++
+
+title = "acl"
+template = "project.html"
+
+[extra]
+wip = true
+
++++
+
+uutils acl is a work-in-progress Rust reimplementation of the acl utilities, which are used to manage POSIX Access Control Lists.
+
+This project aims to provide memory-safe replacements for tools such as `getfacl` and `setfacl`.
+
+> **Note:** This project is still in early development. Many features are not yet implemented and behavior may differ from the original acl tools.
+
+# Goals
+
+Implement a memory-safe set of ACL utilities compatible with the original command-line interfaces.
+
+# Contributing
+
+To contribute to uutils acl, please see [CONTRIBUTING](https://github.com/uutils/acl/blob/main/CONTRIBUTING.md).
+
+# License
+
+uutils acl is licensed under the MIT License - see the [LICENSE](https://github.com/uutils/acl/blob/main/LICENSE) file for details.
+
+The acl package is licensed under the GPL 2.0 or later.
diff --git a/content/awk.md b/content/awk.md
new file mode 100644
index 000000000..812afd253
--- /dev/null
+++ b/content/awk.md
@@ -0,0 +1,25 @@
++++
+
+title = "awk"
+template = "project.html"
+
+[extra]
+wip = true
+
++++
+
+Rust implementation of `awk`, the pattern scanning and text-processing language.
+
+This project aims to be a drop-in replacement of the original command.
+
+# Goals
+
+This project aims to be a drop-in replacement for GNU awk (gawk). Differences with the original are treated as bugs.
+
+# Contributing
+
+To contribute to uutils awk, please see [CONTRIBUTING](https://github.com/uutils/coreutils/blob/main/CONTRIBUTING.md).
+
+# License
+
+uutils awk is licensed under the MIT License or the Apache License 2.0, at your option - see the [LICENSE-MIT](https://github.com/uutils/awk/blob/main/LICENSE-MIT), [LICENSE-APACHE](https://github.com/uutils/awk/blob/main/LICENSE-APACHE) file for details.
diff --git a/content/blog/2024-02-extending.md b/content/blog/2024-02-extending.md
deleted file mode 100644
index 74b05dab8..000000000
--- a/content/blog/2024-02-extending.md
+++ /dev/null
@@ -1,75 +0,0 @@
-+++
-title = "Extending the Coreutils project - Rewriting base tools in Rust "
-draft = true
-date = 2024-03-26
-authors = ["Sylvestre Ledru", "Terts Diepraam"]
-+++
-
-Over the last 4 years, we have been working at reimplementing some of the key Linux tools in Rust. We started with the [Coreutils](https://github.com/uutils/coreutils) and [findutils](https://github.com/uutils/findutils).
-
-As we approach feature parity with the GNU Coreutils implementation, and as its adoption in production environments continues to expand, we have been thinking about what is next.
-
-Given the overwhelming positive feedback around this initiative, we are going to extend our efforts to rewrite other parts of the modern Linux/Unix/Mac stack in Rust (still with Windows support in mind when relevant).
-We also noticed a lot of contributions on these projects coming from a lot of different hackers (475 different contributors on Coreutils!).
-With the growing enthusiasm for Rust and the eagerness to learn it, now is the best time to push this project. We think that rewriting in Rust will help with the longer term maintenance of the ecosystem, ensuring it stays robust, safe and welcoming for new generations of contributors.
-
-For the next projects, we are using the same approach: dropped-in replacement of the GNU C implementation.
-For now, we are going to focus on:
-* [diffutils](https://github.com/uutils/diffutils) (transferred by Michael Howell) - [Good first issues](https://github.com/uutils/diffutils/labels/good%20first%20issue)
- Almost ready
-* [procps](https://github.com/uutils/procps) - [Good first issues](https://github.com/uutils/procps/labels/good%20first%20issue)
- 5 programs started
-* [acl](https://github.com/uutils/acl) - [Good first issues](https://github.com/uutils/acl/labels/good%20first%20issue)
- The 3 started
-* [util-linux](https://github.com/uutils/util-linux) - [Good first issues](https://github.com/uutils/util-linux/labels/good%20first%20issue)
- A couple programs started
-* [bsdutils](https://github.com/uutils/bsdutils) - [Good first issues](https://github.com/uutils/bsdutils/labels/good%20first%20issue)
- One program started
-* [login](https://github.com/uutils/login/) - [Good first issues](https://github.com/uutils/login/labels/good%20first%20issue)
- Just the skeleton
-* [hostname](https://github.com/uutils/hostname/) - [Good first issues](https://github.com/uutils/hostname/labels/good%20first%20issue)
- Almost empty
-
-
-These packages are part of the essential list on Debian & Ubuntu.
-
-
-Sylvestre Ledru, Terts Diepraam and Daniel Hofstetter
-
-FAQ
-###
-
-How long is it going to take?
------------------------------
-
-Some programs like diff, acl or hostname should be completed quickly.
-Others will take years to be completed.
-
-Do you hate the GNU project?
-----------------------------
-
-Not at all: we often contribute to the upstream implementations when we identify issues, add missing tests, etc.
-
-
-Why the MIT License?
---------------------
-
-For consistency purposes and not interested by a license debate, we are going to use the MIT license just like the Coreutils.
-
-
-The binaries are too big?
--------------------------
-
-Does it really matter? Yes, Rust binaries are usually bigger than GNU but we don't think it is a blocker, even for embedded devices.
-
-
-Is it really safer?
--------------------
-
-While Rust is clearly a better language than C/C++ for security, these programs are often very safe. It isn't a key argument for us for
-this rewrite.
-
-What about performances?
-------------------------
-
-Although we haven't entered the optimization phase, Rust's modern design inherently facilitates some straightforward performance improvements.
diff --git a/content/blog/2025-02-extending.md b/content/blog/2025-02-extending.md
new file mode 100644
index 000000000..b1a66784a
--- /dev/null
+++ b/content/blog/2025-02-extending.md
@@ -0,0 +1,90 @@
++++
+title = "Extending the Coreutils project - Rewriting base tools in Rust"
+date = 2025-02-01
+page_template = "post.html"
+authors = ["Sylvestre Ledru"]
++++
+
+As I [just presented at FOSDEM](https://sylvestre.ledru.info/coreutils-fosdem-2025/), we are moving into the next phase of the uutils project.
+
+Over the last five years, we have been working on reimplementing some of the key Linux tools in Rust. We started with the [Coreutils](https://github.com/uutils/coreutils) and [findutils](https://github.com/uutils/findutils).
+
+As we approach feature parity with the GNU Coreutils implementation, and as its adoption in production environments continues to expand, we have been thinking about what is next.
+
+Given the very positive feedback around this initiative, we are going to extend our efforts to rewrite other parts of the modern Linux/Unix/Mac stack in Rust (still with Windows support in mind when relevant). These efforts will be managed under the [uutils umbrella](https://github.com/uutils/), which will allow us to maintain a cohesive and unified approach across various utilities.
+
+We also noticed a lot of contributions on these projects coming from a diverse group of hackers (530 different contributors on Coreutils alone!). With the growing enthusiasm for Rust and the eagerness to learn it, now is the best time to push this project forward. Rewriting in Rust will help with the long-term maintenance of the ecosystem, ensuring it stays robust, safe, and welcoming for new generations of contributors.
+
+### Vision for the Future
+
+As we expand the scope of the project, we are working on a future where Rust becomes the backbone of essential Linux, Unix, and potentially macOS system tools. Our focus will be on improving security, ensuring long-term maintainability, and optimizing performance for both modern and legacy systems. Through the uutils umbrella, we aim to create a more secure, efficient, and scalable alternative to the traditional tools, replacing software developed in older, less secure programming languages like C.
+
+This project is also an investment for the future. C is becoming less popular with the next generation of developers. Just like how the Linux kernel continues to evolve and includes Rust, it is our responsibility to upgrade the core utilities of the system to a modern, safer programming language. By doing so, we ensure that the essential tools used in Linux/Unix systems remain relevant, maintainable, and accessible to future contributors.
+
+### Specific Benefits of Rust
+
+Rust offers several advantages over C/C++, particularly in terms of memory safety, concurrency, and performance. By eliminating common security issues such as null pointer dereferences and buffer overflows, Rust allows us to build tools that are inherently safer. Its modern compiler tooling also enables us to optimize performance without sacrificing code safety, ensuring that our utilities can handle the demands of modern computing environments while remaining easy to maintain.
+
+### Challenges and Opportunities
+
+As with any large-scale reimplementation, there are challenges to overcome. Porting complex utilities from C to Rust requires careful consideration of edge cases and platform-specific behaviors. Additionally, ensuring full compatibility across Linux, Unix, and macOS environments presents unique challenges. However, these challenges also offer opportunities for growth and innovation, allowing us to extend and refine core system utilities for modern needs. Rust's modern design gives us the chance to improve both security and performance while maintaining cross-platform compatibility.
+
+### Next Steps
+
+For the next phase of the project, we are adopting the same approach: a drop-in replacement of the C implementations. Here's what's coming next:
+
+| Name | Description | Status |
+|----------------------------------------------------|----------------------------------------------------|-----------------------------|
+| [acl](https://github.com/uutils/acl) | Access control list utilities | |
+| [bsdutils](https://github.com/uutils/bsdutils) | Basic utilities for BSD compatibility | |
+| [coreutils](https://github.com/uutils/coreutils) | Basic utilities for the system | Production level |
+| [diffutils](https://github.com/uutils/diffutils) | File comparison utilities | Almost ready |
+| [findutils](https://github.com/uutils/findutils) | Utilities for finding files | Getting close to completion |
+| [hostname](https://github.com/uutils/hostname) | Utility to show or set system hostname | |
+| [login](https://github.com/uutils/login) | User login management utilities | |
+| [procps](https://github.com/uutils/procps) | Utilities for monitoring and controlling processes | |
+| [util-linux](https://github.com/uutils/util-linux) | Utilities essential for Linux systems | |
+
+These packages are part of the essential list for Debian and Ubuntu, and we're excited to push their Rust reimplementation further.
+
+### GSoC 2024 Participation
+
+In 2024, we had the pleasure of mentoring three students during Google Summer of Code (GSoC):
+
+1. **Sreehari Prasad** worked on improving the support of Rust CCoreutils. His focus was on making uutils compatible with the GNU coreutils test suite. Sreehari resolved most of the failing tests for the `cp`, `mv`, and `ls` utilities and significantly enhanced compatibility.
+
+2. **Hanbings** tackled the implementation of key GNU `findutils` utilities like `xargs` and `find` in Rust. His work focused on improving compatibility with the GNU suite while enhancing performance, resulting in major progress on missing features and test code.
+
+3. **Krysztal Huang** worked on implementing the `procps` suite, which includes utilities like `slabtop`, `top`, `pgrep`, `pidof`, `ps`, `pidwait`, and `snice`. This project involved implementing some of these commands.
+
+### Call to Action for Contributors
+
+Contributors who are passionate about system-level programming and Rust are always welcome. Whether you're experienced with GNU utilities or just learning Rust, your contributions will be invaluable to this
+project. You can get involved by picking up good-first issues, reviewing code, or even helping us test new features across various platforms. The [uutils GitHub organization](https://github.com/uutils) has all the information you need to get started.
+You can also sponsor the project through [GitHub Sponsors](https://github.com/sponsors/uutils).
+
+### FAQ
+
+**How long is it going to take?**
+
+Some programs, like `diff`, `acl`, or `hostname`, could be completed quickly, while others will take years to finish.
+
+**Do you hate the GNU project?**
+
+Not at all. We often contribute to the upstream implementations when we identify issues, add missing tests, and so on.
+
+**Why the MIT License?**
+
+For consistency purposes. We're not interested in a license debate and will continue to use the MIT license, as we did with Coreutils.
+
+**The binaries are too big. Does it really matter?**
+
+Yes, Rust binaries are generally bigger than GNU's, but we don't think it's a blocker, even for embedded devices.
+
+**Is it really safer?**
+
+While Rust is better than C/C++ for security, these programs are often already very safe. Security is not the key argument for us in this rewrite even if Rust provides some automatic improvements.
+
+**What about performance?**
+
+Although we haven't started optimizing yet, Rust's design facilitates performance improvements naturally. We are confident that, in time, these tools will match or exceed the performance of their GNU counterparts.
diff --git a/content/blog/2025-04-playground.md b/content/blog/2025-04-playground.md
new file mode 100644
index 000000000..96d880a89
--- /dev/null
+++ b/content/blog/2025-04-playground.md
@@ -0,0 +1,22 @@
++++
+title = "Try Uutils Coreutils directly in your browser"
+date = 2025-04-04
+page_template = "post.html"
+authors = ["Sylvestre Ledru"]
++++
+
+We are happy to announce the [Uutils playground](/playground) - an interactive terminal that lets you run real Rust Uutils Coreutils directly in your browser, with no installation, no server, and no network round-trips after the initial page load.
+
+Just open the page and start typing commands like `ls`, `sort`, `cat`, `head`, `factor`, or any of the 60+ utilities available. You can pipe commands together (`sort fruits.txt | uniq -c | sort -rn`), use redirections (`echo hello > file.txt`, `cat < file.txt`), explore the virtual filesystem, and even switch between 30+ languages using the locale dropdown.
+
+### How it works
+
+The Uutils Coreutils are compiled to WebAssembly (targeting `wasm32-wasip1`) as a single multicall binary - similar to BusyBox. When you type a command, a minimal JavaScript shell parses your input, sets up pipes between stages, and executes each one by instantiating the WASM binary with the right arguments. A virtual in-memory filesystem backed by [browser_wasi_shim](https://github.com/bjorn3/browser_wasi_shim) provides file I/O. Everything runs client-side - once loaded, the playground works entirely offline.
+
+An important distinction worth noting: **coreutils only provides individual commands** (`sort`, `cat`, `ls`, etc.). Features like `if`/`then`/`else`, `while` loops, variable expansion (`$VAR`), and globbing (`*.txt`) are shell features provided by Bash, Zsh, or similar - not by coreutils. The playground's JavaScript shell is intentionally minimal, keeping the focus on the coreutils themselves.
+
+For a deeper look at the architecture - including diagrams, the multicall dispatch mechanism, the `feat_wasm` feature gate, and how localization is handled - check out the [full technical deep-dive](/playground-how-it-works).
+
+### Try it, break it, improve it
+
+Give the [playground](/playground) a spin and let us know what you think! Contributions are welcome - whether it is improving WASI compatibility to enable more commands, adding translations via [Weblate](https://hosted.weblate.org/projects/rust-coreutils/), or enhancing the playground shell itself.
diff --git a/content/blog/_index.md b/content/blog/_index.md
index f784a32f4..e16b5390b 100644
--- a/content/blog/_index.md
+++ b/content/blog/_index.md
@@ -5,4 +5,4 @@ page_template = "post.html"
title = "Blog"
+++
-You can subscribe to this blog with this [atom feed](/atom.xml).
\ No newline at end of file
+You can subscribe to this blog with this [atom feed](/atom.xml).
diff --git a/content/bsdutils.md b/content/bsdutils.md
new file mode 100644
index 000000000..1a2182b33
--- /dev/null
+++ b/content/bsdutils.md
@@ -0,0 +1,25 @@
++++
+
+title = "bsdutils"
+template = "project.html"
+
+[extra]
+wip = true
+
++++
+
+uutils bsdutils is a work-in-progress Rust reimplementation of the BSD utilities, a collection of standard Unix tools originating from BSD systems.
+
+> **Note:** This project is still in early development. Many features are not yet implemented.
+
+# Goals
+
+Implement a cross-platform, memory-safe set of BSD utilities compatible with their original command-line interfaces.
+
+# Contributing
+
+To contribute to uutils bsdutils, please see [CONTRIBUTING](https://github.com/uutils/bsdutils/blob/main/CONTRIBUTING.md).
+
+# License
+
+uutils bsdutils is licensed under the MIT License - see the [LICENSE](https://github.com/uutils/bsdutils/blob/main/LICENSE) file for details.
diff --git a/content/coreutils.md b/content/coreutils.md
index 4d38ef14c..72480cb0c 100644
--- a/content/coreutils.md
+++ b/content/coreutils.md
@@ -3,10 +3,15 @@
title = "coreutils"
template = "project.html"
+[extra]
+status = "ready"
+
+++
uutils coreutils is a cross-platform reimplementation of the GNU coreutils in Rust. While all programs have been implemented, some options might be missing or different behavior might be experienced.
+[](https://github.com/uutils/coreutils-tracking)
+
# Goals
This project aims to be a drop-in replacement for the GNU utils. Differences with GNU are treated as bugs.
diff --git a/content/diffutils.md b/content/diffutils.md
index fbcc854d2..58d1434bc 100644
--- a/content/diffutils.md
+++ b/content/diffutils.md
@@ -3,14 +3,25 @@
title = "diffutils"
template = "project.html"
+[extra]
+status = "beta"
+
+++
Rust implementation of GNU diffutils: `diff`, `cmp`, `diff3` and `sdiff`.
This project aims to be a drop-in replacement of the original commands.
+# Goals
+
+This project aims to be a drop-in replacement for the GNU diffutils. Differences with GNU are treated as bugs.
+
+# Contributing
+
+To contribute to uutils diffutils, please see [CONTRIBUTING](https://github.com/uutils/diffutils/blob/main/CONTRIBUTING.md).
+
# License
-uutils diffutils is licensed under the MIT or Apache License - see the [LICENSE-MIT](https://github.com/uutils/diffutils/blob/main/LICENSE-MIT) and [LICENSE-APACHE](https://github.com/uutils/diffutils/blob/main/LICENSE-MIT) file for details.
+uutils diffutils is licensed under the MIT or Apache License - see the [LICENSE-MIT](https://github.com/uutils/diffutils/blob/main/LICENSE-MIT) and [LICENSE-APACHE](https://github.com/uutils/diffutils/blob/main/LICENSE-APACHE) file for details.
GNU diffutils is licensed under the GPL 3.0 or later.
diff --git a/content/findutils.md b/content/findutils.md
index 28a0796c2..0760aff58 100644
--- a/content/findutils.md
+++ b/content/findutils.md
@@ -3,12 +3,21 @@
title = "findutils"
template = "project.html"
+[extra]
+status = "beta"
+
+++
Rust implementation of GNU findutils: `xargs`, `find`, `locate` and `updatedb`.
This project aims to be a drop-in replacement of the original commands.
+# Goals
+
+This project aims to be a drop-in replacement for the GNU findutils. Differences with GNU are treated as bugs.
+
+[](https://github.com/uutils/findutils-tracking)
+
# Contributing
To contribute to uutils findutils, please see [CONTRIBUTING](https://github.com/uutils/findutils/blob/main/CONTRIBUTING.md).
diff --git a/content/grep.md b/content/grep.md
new file mode 100644
index 000000000..e3fe37f04
--- /dev/null
+++ b/content/grep.md
@@ -0,0 +1,29 @@
++++
+
+title = "grep"
+template = "project.html"
+
+[extra]
+status = "beta"
+
++++
+
+Rust implementation of GNU grep: `grep`, `egrep` and `fgrep`.
+
+This project aims to be a drop-in replacement of the original commands.
+
+[](https://github.com/uutils/grep-tracking)
+
+# Goals
+
+This project aims to be a drop-in replacement for GNU grep. Differences with GNU are treated as bugs.
+
+# Contributing
+
+To contribute to uutils grep, please see [CONTRIBUTING](https://github.com/uutils/grep/blob/main/CONTRIBUTING.md).
+
+# License
+
+uutils grep is licensed under the MIT License - see the [LICENSE](https://github.com/uutils/grep/blob/main/LICENSE) file for details.
+
+GNU grep is licensed under the GPL 3.0 or later.
diff --git a/content/gsoc.md b/content/gsoc.md
index de386e3d5..b6f26ff62 100644
--- a/content/gsoc.md
+++ b/content/gsoc.md
@@ -2,12 +2,18 @@
title = "Uutils at GSOC"
+++
-Google summer of code is:
-
-> Google Summer of Code is a global, online program focused on bringing
-> new contributors into open source software development. GSoC
-> Contributors work with an open source organization on a 12+ week
-> programming project under the guidance of mentors.
+
+
+ uutils gsoc --help
+
+
+
+
+
+
$ uutils gsoc --help
+
Google Summer of Code is a global, online program focused on bringing new contributors into open source software development. GSoC contributors work with an open source organization on a 12+ week programming project under the guidance of mentors.
+
+
If you want to know more about how it works, check out the links below.
@@ -18,7 +24,7 @@ If you want to know more about how it works, check out the links below.
# What is it about?
-The [uutils project](https://github.com/uutils/) is aiming at rewriting key Linux utilities in Rust, targeting [coreutils](https://github.com/uutils/coreutils), [findutils](https://github.com/uutils/findutils), [diffutils](https://github.com/uutils/diffutils), [procps](https://github.com/uutils/procps), [util-linux](https://github.com/uutils/util-linux), and [bsdutils](https://github.com/uutils/bsdutils). Their goal is to create fully compatible, high-performance drop-in replacements, ensuring reliability through upstream test suites. Significant progress has been made with coreutils, diffutils, and findutils, while the other utilities are in the early stages of development.
+The [uutils project](https://github.com/uutils/) is aiming at rewriting key Linux utilities in Rust, targeting [coreutils](https://github.com/uutils/coreutils), [findutils](https://github.com/uutils/findutils), [diffutils](https://github.com/uutils/diffutils), [sed](https://github.com/uutils/sed), [grep](https://github.com/uutils/grep), [awk](https://github.com/uutils/awk), [procps](https://github.com/uutils/procps), [util-linux](https://github.com/uutils/util-linux), and [bsdutils](https://github.com/uutils/bsdutils). Their goal is to create fully compatible, high-performance drop-in replacements, ensuring reliability through upstream test suites. coreutils is already production-ready and shipping in distributions; findutils, diffutils and grep are well advanced; while sed, awk and the system utilities (procps, util-linux, bsdutils) are at earlier stages of development.
# How to get started
@@ -31,8 +37,8 @@ with uutils.
coreutils and the other tools.
1. **Reach out to us!** We are happy to discuss potential projects and help you find a meaningful project for uutils. Tell us what interests you about the project and what experience you have and we can find a suitable project together. You can talk to the uutils maintainers on the [Discord server](https://discord.gg/wQVJbvJ). In particular, you can contact:
* Sylvestre Ledru (@sylvestre on GitHub and Discord)
- * Terts Diepraam (@tertsdiepraam on GitHub and @terts on Discord)
-2. **Get comfortable with uutils.** To find a good project you need to understand the codebase. We recommend that you take a look at the code, the issue tracker and maybe try to tackle some [good-first-issues](https://github.com/uutils/coreutils/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). Also take a look at our [contributor guidelines](https://github.com/uutils/coreutils/blob/main/CONTRIBUTING.md).
+
+2. **Get comfortable with uutils.** To find a good project you need to understand the codebase. We recommend that you take a look at the code, the issue tracker and maybe try to tackle some [good-first-issues](https://github.com/search?q=org%3Auutils+is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22&type=issues&s=created&o=desc) across any of our projects. Also take a look at our [contributor guidelines](https://github.com/uutils/coreutils/blob/main/CONTRIBUTING.md).
3. **Find a project and a mentor.** We have a [list of potential projects](https://github.com/uutils/coreutils/wiki/GSOC-Project-Ideas) you can adapt or use as inspiration. Make sure discuss your ideas with the maintainers! Some project ideas below have suggested mentors you could contact.
4. **Write the application.** You can do this with your mentor. The application has to go through Google, so make sure to follow all the advice in Google's [Contributor Guide](https://google.github.io/gsocguides/student/writing-a-proposal). Please make sure you include your prior contributions to uutils in your application.
@@ -44,278 +50,273 @@ with uutils.
# Project Ideas
-This page contains project ideas for the Google Summer of Code for
-uutils. Feel free to suggest project ideas of your own.
-
-[Guidelines for the project list](https://google.github.io/gsocguides/mentor/defining-a-project-ideas-list)
-
-Summarizing that page, each project should include:
-- Title
-- Description
-- Expected outputs
-- Skills required/preferred
-- Possible mentors
-- Size (either ~175 or ~350 hours)
-- Difficulty (easy, medium or hard)
-
-## Complete the `ls` GNU compatibility
-
-Most of the features in `ls` have been implemented by now.
-However, a bunch of work remains on the color side for a full GNU compat. Other tests are failing.
-We have 12 remaining failing tests.
-
-To get the list of failing tests, run:
-```
-$ ./util/remaining-gnu-error.py |grep "/ls/"
-```
-
-- Difficulty: Medium
-- Size: 175
-- Mentors: Sylvestre
-- Required skills:
- - Rust
- - Basic knowledge about the terminal
-
-## Complete the `cp` GNU compatibility
-
-Most of the features in `cp` have been implemented by now.
-However, some corner cases needs to be implemented. We have 16 remaining failing tests.
-
-To get the list of failing tests, run:
-```
-$ ./util/remaining-gnu-error.py |grep "/cp/"
-```
-
-- Difficulty: Medium
-- Size: 175
-- Mentors: Sylvestre
-- Required skills:
- - Rust
- - Basic knowledge about the terminal
-
-## Complete the `mv` GNU compatibility
-
-Most of the features in `mv` have been implemented by now.
-However, some corner cases needs to be implemented. We have 10 remaining failing tests.
-
-To get the list of failing tests, run:
-```
-$ ./util/remaining-gnu-error.py |grep "/mv/"
-```
-
-- Difficulty: Medium
-- Size: 175
-- Mentors: Sylvestre
-- Required skills:
- - Rust
- - Basic knowledge about the terminal
-
-## Improve `stty`
-The `stty` utility is currently only partially implemented and should be expanded.
-
-See issues: [#3859](https://github.com/uutils/coreutils/issues/3859), [#3860](https://github.com/uutils/coreutils/issues/3860), [#3861](https://github.com/uutils/coreutils/issues/3861), [#3862](https://github.com/uutils/coreutils/issues/3862), [#3863](https://github.com/uutils/coreutils/issues/3863).
-
-- Difficulty: Medium
-- Size: 175
-- Mentors: Terts Diepraam
-- Required skills:
- - Rust
- - Basic knowledge about the terminal
-
-## Improve findutils coverage
-
-[More than half](https://github.com/uutils/findutils-tracking/) of the findutils GNU & BFS are passing. The goal of this project is to improve the compatibility of uutils/findutils with regard to GNU's implementation.
-
-See [https://github.com/uutils/findutils](https://github.com/uutils/findutils)
-
-
-To achieve this, we should invest in fuzzing findutils:
-Just like we are [doing with some](https://github.com/uutils/coreutils/tree/main/fuzz/fuzz_targets) [Coreutils programs](https://github.com/uutils/coreutils/blob/main/.github/workflows/fuzzing.yml), we should:
-* fuzz findutils
-* do some differential testing with GNU's implementation (and potentially others)
-
-- Difficulty: Medium
-- Size: 175
-- Mentors: Sylvestre
-- Required skills:
- - Rust
- - Basic knowledge about the terminal usage
-
-## Localization
-Support for localization for formatting, quoting & sorting in various utilities, like `date`, `ls` and `sort`. For this project, we need to figure out how to deal with locale data. The first option is to use the all-Rust `icu4x` library, which has a different format than what distributions usually provide. In this case a solution _could_ be to write a custom `localedef`-like command. The second option is to use a wrapper around the C `icu` library, which comes with the downside of being a C dependency.
-
-This is described in detail in [issue #3997](https://github.com/uutils/coreutils/issues/3997).
-
-And was also discussed in [#1919](https://github.com/uutils/coreutils/issues/1919#issuecomment-846471073), [#3584](https://github.com/uutils/coreutils/issues/3584).
-
-- Difficulty: Hard
-- Size: TBD
-- Mentors: TBD
-- Required skills:
- - Rust
-
-## `procps`: Development of Process Management and Information Tools in Rust
-
-This project focuses on creating Rust-based implementations of process management and information tools: `ps`, `pgrep`, `pidwait`, `pkill`, `skill`, and `snice`. The goal is to ensure full compatibility with all options and successful passing of GNU tests, maintaining the functionality and reliability of these essential tools.
-
-- **Description:** Develop Rust-based versions of key process management and information tools, ensuring compatibility with all options and GNU tests.
-- **Expected Outputs:** Efficient, reliable tools with full option compatibility and passing GNU tests.
-- **Skills Required/Preferred:** Proficiency in Rust, understanding of Linux process management, experience with GNU testing methodologies.
-- **Possible Mentors:** [To be determined]
-- **Size:** ~350 hours.
-- **Difficulty:** Medium.
-
-## `procps`: Development of System Monitoring and Statistics Tools in Rust
-
-This project involves the Rust-based development of system monitoring and statistics tools: `top`, `vmstat`, `tload`, `w`, and `watch`. The objective is to achieve full compatibility with all options and to pass GNU tests, ensuring these tools provide accurate and reliable system insights.
-
-- **Description:**: Create Rust versions of system monitoring and statistics tools, with a focus on full option compatibility and passing GNU tests.
-- **Expected Outputs:**: Robust tools for system monitoring and statistics, fully compatible with existing options and verified by GNU tests.
-- **Skills Required/Preferred:**: Rust expertise, knowledge of system performance metrics, familiarity with GNU testing frameworks.
-- **Possible Mentors:**: [To be determined]
-- **Size:**: ~350 hours.
-- **Difficulty:**: Medium.
-
-## `procps`: Development of Memory and Resource Analysis Tools in Rust
-
-The aim of this project is to develop Rust-based versions of memory and resource analysis tools: `pmap` and `slabtop`. The project will focus on ensuring full compatibility with all options and passing GNU tests, providing in-depth and reliable analysis of memory usage and kernel resources.
-
-- **Description:**: Implement Rust versions of memory and resource analysis tools, with emphasis on option compatibility and passing GNU tests.
-- **Expected Outputs:**: Advanced tools for memory and resource analysis, fully compatible with existing options and validated by GNU tests.
-- **Skills Required/Preferred:**: Proficiency in Rust, deep understanding of memory management and kernel resources, experience with GNU testing methodologies.
-- **Possible Mentors:**: [To be determined]
-- **Size:**: ~175 hours.
-- **Difficulty:**: Medium.
-
-## `util-linux`: Reimplementation of essential system utilities in Rust
-
-The objective of this project is to reimplement essential system utilities from the util-linux package in Rust. This initiative will include the development of Rust-based versions of various utilities, such as `dmesg`, `lscpu`, `lsipc`, `lslocks`, `lsmem`, and `lsns`. The primary focus will be on ensuring that these Rust implementations provide full compatibility with existing options and pass GNU tests, delivering reliable and efficient system utilities for Linux users.
-
-- **Description:**: Reimplement essential system utilities, including `dmesg`, `lscpu`, `lsipc`, `lslocks`, `lsmem`, and `lsns`, using Rust while emphasizing compatibility with existing options and GNU test validation.
-- **Expected Outputs:**: Rust-based system utilities that mirror the functionality of their counterparts, ensuring full compatibility and reliability, validated by GNU tests.
-- **Skills Required/Preferred:**: Proficiency in Rust programming, knowledge of system utilities and their functionality, experience with GNU testing methodologies.
-- **Possible Mentors:**: [To be determined]
-- **Size:**: ~175 hours.
-- **Difficulty:**: Medium.
-
-## `util-linux`: Process and Resource Management: Reimplementation in Rust
-
-This project focuses on the reimplementations of crucial Linux utilities related to process and resource management in the Rust programming language. The target utilities include `runuser`, `sulogin`, `chrt`, `ionice`, `kill`, `renice`, `prlimit`, `taskset`, and `uclampset`. The primary goal is to create Rust-based versions of these utilities, ensuring compatibility with their original counterparts, and validating their functionality with GNU tests.
-
-- **Description:**: Reimplement key Linux utilities for process and resource management, such as `runuser`, `sulogin`, `chrt`, `ionice`, `kill`, `renice`, `prlimit`, `taskset`, and `uclampset`, in the Rust programming language. The emphasis is on maintaining compatibility with the original utilities and validating their functionality using GNU tests.
-- **Expected Outputs:**: Rust-based versions of the specified utilities that seamlessly integrate into Linux systems, providing the same functionality and passing GNU tests for reliability.
-- **Skills Required/Preferred:**: Proficiency in Rust programming, understanding of process and resource management on Linux, experience with GNU testing methodologies.
-- **Possible Mentors:**: [To be determined]
-- **Size:**: ~175 hours.
-- **Difficulty:**: Medium.
-
-## `util-linux`: User and Session Management: Reimplementation in Rust
-
-This project focuses on the reimplementations of essential Linux utilities related to user and session management in the Rust programming language. The target utilities include `su`, `agetty`, `ctrlaltdel`, `pivot_root`, `switch_root`, `last`, `lslogins`, `mesg`, `setsid`, and `setterm`. The primary goal is to create Rust-based versions of these utilities, ensuring compatibility with their original counterparts, and validating their functionality with GNU tests.
-
-- **Description:**: Reimplement essential Linux utilities for user and session management, such as `su`, `agetty`, `ctrlaltdel`, `pivot_root`, `switch_root`, `last`, `lslogins`, `mesg`, `setsid`, and `setterm`, in the Rust programming language. The emphasis is on maintaining compatibility with the original utilities and validating their functionality using GNU tests.
-- **Expected Outputs:**: Rust-based versions of the specified utilities that seamlessly integrate into Linux systems, providing the same functionality and passing GNU tests for reliability.
-- **Skills Required/Preferred:**: Proficiency in Rust programming, understanding of user and session management on Linux, experience with GNU testing methodologies.
-- **Possible Mentors:**: [To be determined]
-- **Size:**: ~175 hours.
-- **Difficulty:**: Medium.
-
-This project aims to modernize and enhance critical Linux utilities related to user and session management, ensuring they remain efficient, reliable, and fully compatible with existing systems.
-
-## Code refactoring for `procps`, `util-linux`, and `bsdutils`
-
-Refactoring the Rust-based versions of procps, util-linux, and bsdutils to reduce code duplication.
-
-- **Title:**: Code Optimization and Refactoring for procps, util-linux, and bsdutils in Rust
-- **Description:**: This project involves optimizing and refactoring the Rust-based versions of procps, util-linux, and bsdutils. The focus will be on eliminating duplicated code across these utilities, particularly in areas like uudoc, the test framework, and support for single/multicall binaries.
-- **Expected outputs:**: A streamlined codebase with reduced duplication, improved maintainability for procps, util-linux, and bsdutils.
-- **Skills required/preferred:**: Proficiency in Rust programming, understanding of Linux utilities, experience with code optimization and refactoring.
-- **Possible mentors:**: Sylvestre
-- **Size:**: 175 hours
-- **Difficulty:**: Medium
-
-## A multicall binary and core library for `findutils`
-
-`findutils` currently exists of a few unconnected binaries. It would be nice to have a multicall binary (like
-`coreutils`) and a library of shared functions (like `uucore`).
-
-This also might require thinking about sharing code between coreutils and findutils.
-
-- **Difficulty**: Medium
-- **Size**: 175 hours
-- **Mentors**: TBD
-- Required skills:
- - Rust
-
-## Implementation of GNU Test Execution for `procps`, `util-linux`, `diffutils`, and `bsdutils`
-
-The project aims at integrating the GNU test suite execution using the Rust-based versions of `procps`, `util-linux`, `diffutils`, and `bsdutils`, ensuring compatibility, crucial for seamless drop-in replacement integration. We have been doing such operation successfully for the Coreutils using [GitHub Actions](https://github.com/uutils/coreutils/blob/main/.github/workflows/GnuTests.yml), a [build script](https://github.com/uutils/coreutils/blob/main/util/build-gnu.sh) and a [run script](https://github.com/uutils/coreutils/blob/main/util/run-gnu-test.sh).
-
-- **Description:**: Run the GNU test suite on the Rust-based versions of procps, util-linux, diffutils, and bsdutils
-- **Expected Outputs:**: The GNU test suite execution for each utility, ensuring functionality meets expected standards
-- **Skills Required/Preferred:**: GitHub action understanding, Proficiency in Rust, experience with GNU testing methodologies, familiarity with Linux system utilities, and understanding of software testing principles.
-- **Possible Mentors:**: Sylvestre
-- **Size:**: ~175 hours
-- **Difficulty:**: Medium
-
-## Refactoring `factor`
-
-The uutils `factor` is currently significantly slower than
-GNU `factor` and only supports numbers up to 2^64-1. See [issue 1559](https://github.com/uutils/coreutils/issues/1559)
-and [issue 1456](https://github.com/uutils/coreutils/issues/1456) for more information.
-
-- Difficulty: Hard
-- Size: 175 hours
-- Mentors: TBD
-- Required skills:
- - Rust
- - Optimization techniques
- - Mathematics
-
-## Symbolic/Fuzz Testing and Formal Verification of Tool Grammars
-
-See [Using Lightweight Formal Methods to Validate a Key Value Storage Node In Amazon S3](https://www.amazon.science/publications/using-lightweight-formal-methods-to-validate-a-key-value-storage-node-in-amazon-s3).
-
-Most KLEE scaffolding was done for [KLEE 2021](https://project-oak.github.io/rust-verification-tools/2021/07/14/coreutils.html).
-
-Start with `wc`, formalize the command line grammar. Get it working under AFL++ and Klee. Add several proofs of resource use and correctness - especially proofs about operating system calls and memory/cache usage. Generalize to other tools. Try to unify the seeds for the fuzzer and KLEE so they can help each other find new paths. Use QEMU to test several operating systems and architectures. Automate detection of performance regressions - try to hunt for [accidentally quadratic](https://accidentallyquadratic.tumblr.com) behavior.
-
-Specific to `wc` - formalize the inner loop over a UTF-8 buffer into a finite state automata with counters that can generalize into SIMD width operations like [simdjson](https://simdjson.org). Further generalize into a monoid so K processors can combine results.
-
-- Difficulty: Mixed
-- Size: Mixed
-- Mentors: TBD - informally @chadbrewbaker
-- Required skills:
- - Rust
- - KLEE
- - Fuzzers like AFL++
- - Grammar testing frameworks like [LARK](https://github.com/ligurio/lark-grammars/tree/master/lark_grammars/grammars)
- - /usr/bin/time -v (and similar tools for Widows/OSX).
- - Alloy, TLA+, [P](https://github.com/p-org/P)
- - System call tracing with [strace](https://jvns.ca/blog/2014/02/17/spying-on-ssh-with-strace/), [uftrace](https://github.com/namhyung/uftrace) etc.
- - SMT solvers like [Z3](https://www.philipzucker.com/programming-and-interactive-proving-with-z3py/) and CVC5 for superoptimization and proofs of automata equivalence.
- - [SOUPER](https://github.com/google/souper) and [CompilerExplorer](https://godbolt.org)
- - Basic statistics on quantiles (histograms) for outlier detection. The math is simple as generalizing from one to k medians but the formal notation is [complex](https://aakinshin.net/posts/thdqe-hdi/).
- - [MPI-IO](https://wgropp.cs.illinois.edu/courses/cs598-s16/lectures/lecture32.pdf), just enough to read a file into k parts and combine "wc" outputs to understand multicore scaling.
-
-## Development of advanced terminal session recording and replay tools in Rust
-
-This project involves creating Rust-based implementations of `/usr/bin/script`, `/usr/bin/scriptlive`, and `/usr/bin/scriptreplay`. The `/usr/bin/script` command will record terminal sessions, `/usr/bin/scriptlive` will offer real-time recording features, and `/usr/bin/scriptreplay` will be used to replay recorded sessions.
-
-The work will happen in https://github.com/uutils/bsdutils.
-
-- **Description:**: Develop Rust-based versions of `/usr/bin/script`, `/usr/bin/scriptlive`, and `/usr/bin/scriptreplay` for terminal session recording and replaying.
-- **Expected Outputs:**: Robust and cross-platform terminal session recording and replay tools, with real-time features in `scriptlive`.
-- **Skills Required/Preferred:**: Proficiency in Rust, understanding of terminal emulation, experience with cross-platform development.
-- **Possible Mentors:**: [To be determined]
-- **Size:**: ~175 hours
-- **Difficulty:**: Medium
-
-## Official Redox support
-We want to support the Redox operating system, but are not actively testing against it. Since the last round of fixes in [#2550](https://github.com/uutils/coreutils/pull/2550), many changes have probably been introduced that break Redox support. This project would involve setting up Redox in the CI and fixing any issues that arise and porting features over.
-
-- Difficulty: Medium
-- Size: 175 hours
-- Mentors: TBD
-- Required skills:
- - Rust
+These are starting points for a Google Summer of Code project with uutils. Feel free to adapt one or propose your own, and see the [guidelines for the project list](https://google.github.io/gsocguides/mentor/defining-a-project-ideas-list). Each idea lists its difficulty, an estimated size (~175 or ~350 hours) and a suggested mentor where one is available.
+
+
+
+
+
Performance optimization for coreutils
+
+ Medium
+ ~175h
+ Mentor: TBD
+
+
uutils/coreutils has strong GNU compatibility, but some utilities can still be made faster. Systematically profile, benchmark and optimize the hot paths so they match or beat GNU coreutils.
+
+
Profile utilities with perf, flamegraph and criterion
+
Build a benchmark suite comparing against GNU coreutils
+
Optimize hot paths in cat, cut, sort, uniq, wc, etc.
+
Reduce allocations, improve buffering, use SIMD where it helps
+
+
Skills: Rust, performance profiling, systems/I/O optimization; SIMD a plus.
+
+
+
+
Expand differential fuzzing for coreutils
+
+ Medium
+ ~175h
+ Mentor: TBD
+
+
coreutils has some fuzzing infrastructure, but many utilities lack coverage. Expand differential fuzzing that compares uutils against GNU to catch discrepancies automatically.
+
+
Add fuzz targets for utilities that currently lack them
+
Build differential harnesses comparing uutils vs GNU output
+
Run campaigns with AFL++ and libFuzzer, wire them into CI
uutils/findutils already passes more than half of the GNU findutils and BFS tests. Finish the remaining work to reach full compatibility and production readiness.
+
+
Implement missing options and predicates for find
+
Fix edge cases in traversal and symlink handling
+
Complete xargs argument handling
+
Pass the remaining GNU tests; add differential fuzzing
+
+
Skills: Rust, filesystem operations, find/xargs usage; fuzzing a plus.
+
+
+
+
Complete diffutils GNU compatibility
+
+ Medium
+ ~175h
+ Mentor: TBD
+
+
uutils/diffutils implements diff, diff3, cmp and sdiff. Complete the remaining features and edge cases so it passes the GNU test suite.
+
+
Implement missing options and output formats for diff
+
Improve algorithm efficiency for large files
+
Complete diff3 three-way merges
+
Pass the GNU diffutils tests; add differential fuzzing
+
+
Skills: Rust, diff algorithms (Myers, Patience), text processing.
+
+
+
+
Complete the Rust implementation of sed
+
+ Medium
+ ~175h
+ Mentor: TBD
+
+
uutils/sed has been started but needs significant work to fully match GNU sed and POSIX. Implement the missing commands and edge cases and make it pass the GNU test suite.
+
+
Implement missing commands and addressing flags
+
Handle complex regex, backreferences and multi-line pattern space
+
Implement hold-space operations correctly
+
Pass the GNU sed tests; add differential fuzzing
+
+
Skills: Rust, regular expressions, sed scripting, text processing.
+
+
+
+
Rust implementation of grep
+
+ Hard
+ ~350h
+ Mentor: TBD
+
+
Build a high-performance, feature-complete drop-in replacement for GNU grep - full command-line interface, output modes and edge-case behavior, with the performance Rust can provide.
+
+
Implement the full POSIX/GNU grep CLI
+
Support BRE, ERE and PCRE patterns
+
Handle context lines, recursive search, binary and compressed files
+
Pass the GNU grep tests; benchmark against GNU grep
Implement awk, a complete programming language for pattern scanning and text processing, targeting POSIX awk and GNU awk (gawk) extensions.
+
+
Build the lexer, parser and pattern-action execution engine
+
Support built-in variables (NR, NF, FS, RS) and functions
+
Implement field splitting, arrays, user functions and control flow
+
Set up GNU test suite execution for validation
+
+
Skills: Rust, lexers/parsers/interpreters, regex; language implementation a plus.
+
+
+
+
Complete procps implementation
+
+ Medium
+ ~350h
+ Mentor: TBD
+
+
uutils/procps reimplements the process and system monitoring tools. Complete the core utilities and reach production readiness with full GNU compatibility. Scope can be focused on one of the groups below.
+
+
Process management & info: ps, pgrep, pidwait, pkill, skill, snice
+
System monitoring & statistics: top, vmstat, tload, w, watch
Robust /proc parsing across kernels; run the GNU procps tests
+
+
Skills: Rust, Linux /proc filesystem, process management and monitoring.
+
+
+
+
Complete util-linux implementation
+
+ Medium
+ ~350h
+ Mentor: TBD
+
+
uutils/util-linux reimplements essential system utilities. Complete the most commonly used tools and reach production-ready status with full compatibility. Scope can be focused on one of the groups below.
Skills: Rust, BSD and Linux environments, terminal emulation, cross-platform development.
+
+
+
+
Localization
+
+ Hard
+ Size: TBD
+ Mentor: TBD
+
+
Support localization for formatting, quoting and sorting in utilities like date, ls and sort. The core question is how to deal with locale data: the all-Rust icu4x library (possibly with a custom localedef-like command) versus a wrapper around the C icu library.
Code refactoring for procps, util-linux & bsdutils
+
+ Medium
+ ~175h
+ Mentor: Sylvestre
+
+
Refactor the Rust versions of procps, util-linux and bsdutils to reduce duplication, particularly around uudoc, the test framework, and single/multicall binary support.
+
+
Eliminate duplicated code across the three projects
+
Unify the documentation and test scaffolding
+
Improve maintainability and shared infrastructure
+
+
Skills: Rust, Linux utilities, code optimization and refactoring.
+
+
+
+
A multicall binary and core library for findutils
+
+ Medium
+ ~175h
+ Mentor: TBD
+
+
findutils currently consists of a few unconnected binaries. Build a multicall binary (like coreutils) and a library of shared functions (like uucore).
+
+
Design a unified multicall entry point
+
Extract shared functionality into a core library
+
Consider sharing code between coreutils and findutils
+
+
Skills: Rust, library and CLI design.
+
+
+
+
GNU test execution for procps, util-linux, diffutils & bsdutils
+
+ Medium
+ ~175h
+ Mentor: Sylvestre
+
+
Integrate the upstream test suites against the Rust versions of procps, util-linux, diffutils and bsdutils - crucial for proving drop-in compatibility. We already do this for coreutils via GitHub Actions, a build script and a run script.
+
+
Adapt the coreutils CI approach to each project
+
Wire the test suites into GitHub Actions
+
Track and report compatibility over time
+
+
Skills: GitHub Actions, Rust, GNU testing methodologies, Linux utilities.
+
+
+
+
Symbolic/fuzz testing and formal verification of tool grammars
Inspired by lightweight formal methods at AWS; most KLEE scaffolding was done for KLEE 2021. Start with wc, formalize its command-line grammar, run it under AFL++ and KLEE, then generalize.
+
+
Add proofs of resource use and correctness, especially around syscalls and memory
+
Unify fuzzer and KLEE seeds so they help each other find paths
+
Formalize the wc UTF-8 inner loop into a SIMD-friendly automaton / monoid
We want to support the Redox operating system but are not actively testing against it. Since the last round of fixes in #2550, regressions have likely crept in.
+
+
Set up Redox in CI
+
Fix the issues that arise and port missing features
+
+
Skills: Rust, cross-platform/OS development.
+
+
+
diff --git a/content/hostname.md b/content/hostname.md
new file mode 100644
index 000000000..7f201f3f2
--- /dev/null
+++ b/content/hostname.md
@@ -0,0 +1,27 @@
++++
+
+title = "hostname"
+template = "project.html"
+
+[extra]
+wip = true
+
++++
+
+uutils hostname is a work-in-progress Rust reimplementation of the `hostname` utility, used to get or set the system's hostname.
+
+This project aims to be a drop-in replacement for the standard hostname command across Linux, macOS, Windows, and other platforms.
+
+> **Note:** This project is still in early development. Many features are not yet implemented and behavior may differ across platforms.
+
+# Goals
+
+Implement a cross-platform, memory-safe hostname utility compatible with existing command-line interfaces.
+
+# Contributing
+
+To contribute to uutils hostname, please see [CONTRIBUTING](https://github.com/uutils/hostname/blob/main/CONTRIBUTING.md).
+
+# License
+
+uutils hostname is licensed under the MIT License - see the [LICENSE](https://github.com/uutils/hostname/blob/main/LICENSE) file for details.
diff --git a/content/login.md b/content/login.md
new file mode 100644
index 000000000..502a0b68a
--- /dev/null
+++ b/content/login.md
@@ -0,0 +1,27 @@
++++
+
+title = "login"
+template = "project.html"
+
+[extra]
+wip = true
+
++++
+
+uutils login is a work-in-progress Rust reimplementation of the login utilities, which handle user authentication and session management on Unix-like systems.
+
+This project aims to provide a memory-safe replacement for tools such as `login`, `newgrp`, `su`, and related utilities.
+
+> **Note:** This project is still in early development. Many features are not yet implemented and behavior may differ from the original login utilities.
+
+# Goals
+
+Implement a memory-safe set of login utilities compatible with the original command-line interfaces.
+
+# Contributing
+
+To contribute to uutils login, please see [CONTRIBUTING](https://github.com/uutils/login/blob/main/CONTRIBUTING.md).
+
+# License
+
+uutils login is licensed under the MIT License - see the [LICENSE](https://github.com/uutils/login/blob/main/LICENSE) file for details.
diff --git a/content/playground-how-it-works.md b/content/playground-how-it-works.md
new file mode 100644
index 000000000..0b8533b89
--- /dev/null
+++ b/content/playground-how-it-works.md
@@ -0,0 +1,290 @@
++++
+title = "Playground: How It Works"
+template = "page.html"
++++
+
+
+
+
+The [uutils playground](/playground) lets you run real Rust coreutils directly in your browser, with no server and no installation. This page explains the architecture behind it.
+
+## High-Level Overview
+
+
+flowchart LR
+ A["Browser"] -->|"1. Load page"| B["Zola static site"]
+ B -->|"2. Fetch core binary"| C["uutils.wasm (coreutils multicall)"]
+ A -->|"3. User types command"| D["JavaScript shell"]
+ D -->|"4a. On-demand fetch (grep, find, diff, sed…)"| F["Standalone WASM modules"]
+ D -->|"4b. Execute via WASI"| E["WebAssembly runtime"]
+ F --> E
+ E -->|"5. Output"| A
+
+
+Everything runs **client-side**. The page loads only the **coreutils multicall binary** up front; the optional standalone modules (`grep`, `find`/`locate`/`updatedb`, `diff`/`cmp`, `sed`) are fetched **on demand** the first time you use them — either by clicking their "Load" button or simply by running the command. Once a module is downloaded, it works entirely offline.
+
+## Architecture
+
+
+
+### Components
+
+| Component | Role |
+|-----------|------|
+| **[xterm.js](https://xtermjs.org/)** | Terminal emulator rendered in the browser. Handles cursor, colors, input, scrollback. |
+| **JavaScript shell** | Parses command lines, manages pipes, handles builtins (`help`, `clear`, `cd`, `locale`), and dispatches to WASM. |
+| **[browser_wasi_shim](https://github.com/bjorn3/browser_wasi_shim)** | Implements the WASI (WebAssembly System Interface) in JavaScript so that uutils can perform I/O operations. |
+| **uutils.wasm** | The Rust coreutils, compiled with the `feat_wasm` feature to a single multicall WASM binary containing 60+ commands. This is the only binary loaded eagerly at page load. |
+| **Standalone modules** | Separate uutils projects shipped as their own WASM binaries, **loaded on demand**: `grep.wasm` ([uutils/grep](https://github.com/uutils/grep)), `find.wasm`/`locate.wasm`/`updatedb.wasm` ([uutils/findutils](https://github.com/uutils/findutils)), `diffutils.wasm` providing `diff`/`cmp` ([uutils/diffutils](https://github.com/uutils/diffutils)), and `sed.wasm` ([uutils/sed](https://github.com/uutils/sed)). |
+| **Virtual filesystem** | An in-memory filesystem backed by WASI shim `PreopenDirectory`, pre-populated with sample files. Persists across commands within a session. |
+
+## Lifecycle of a Command
+
+Here's what happens when you type `sort fruits.txt | uniq -c | sort -rn` and press Enter:
+
+
+sequenceDiagram
+ participant User
+ participant Terminal as xterm.js
+ participant Shell as JS Shell
+ participant WASI as WASI Shim
+ participant WASM as uutils.wasm
+ participant VFS as Virtual FS
+
+ User->>Terminal: types "sort fruits.txt | uniq -c | sort -rn" + Enter
+ Terminal->>Shell: raw input string
+
+ Note over Shell: parseCommandLine() splits into 3 pipeline stages
+
+ Shell->>WASI: argv=["coreutils","sort","fruits.txt"], stdin=""
+ WASI->>WASM: instantiate + start()
+ WASM->>VFS: fd_read("fruits.txt")
+ VFS-->>WASM: file contents
+ WASM->>WASI: fd_write(stdout, sorted data)
+ WASI-->>Shell: stdout captured
+
+ Shell->>WASI: argv=["coreutils","uniq","-c"], stdin=sorted data
+ WASI->>WASM: instantiate + start()
+ WASM->>WASI: fd_write(stdout, counted data)
+ WASI-->>Shell: stdout captured
+
+ Shell->>WASI: argv=["coreutils","sort","-rn"], stdin=counted data
+ WASI->>WASM: instantiate + start()
+ WASM->>WASI: fd_write(stdout, final result)
+ WASI-->>Shell: stdout captured
+
+ Shell->>Terminal: display final output
+ Terminal->>User: rendered result
+
+
+Key details:
+
+- **Pipeline execution**: each pipe stage is a fresh WASM instantiation. The stdout of one stage becomes the stdin of the next.
+- **Command dispatch**: coreutils commands go through `["coreutils", command, ...args]` - the core WASM binary is a multicall binary, similar to BusyBox. Standalone modules (`grep`, `find`, `diff`, `sed`…) are invoked **directly by their own name** as `argv[0]`, since each is its own binary rather than a multicall entry.
+- **On-demand loading**: if a command lives in a standalone module that hasn't been fetched yet, the shell loads that module first (printing a `loading … done` notice), then runs the command.
+- **Path resolution**: relative paths are resolved against a virtual `cwd` maintained by the JS shell.
+
+## WASM Loading & Initialization
+
+The playground splits its WASM into one eagerly-loaded core binary and several optional modules fetched lazily, keeping the initial page download small.
+
+
+flowchart TB
+ A["Page load"] --> B{"SharedArrayBuffer available?"}
+ B -->|No| C["Install polyfill stub"]
+ B -->|Yes| D["Continue"]
+ C --> D
+ D --> E["Load xterm.js + fit addon (from CDN with SRI)"]
+ E --> F["Render terminal + banner"]
+ F --> G["Parallel fetch"]
+ G --> H["browser_wasi_shim (dynamic import)"]
+ G --> I["uutils.wasm (compileStreaming)"]
+ H --> J["Ready"]
+ I --> J
+ J --> K{"?cmd= parameter?"}
+ K -->|Yes| L["Auto-run commands"]
+ K -->|No| M["Show prompt"]
+
+
+- Only the **coreutils multicall binary** loads eagerly. The standalone modules (`grep`, `find`/`locate`/`updatedb`, `diffutils`, `sed`) are **not** part of this startup fetch.
+- WASM binaries are compiled with `WebAssembly.compileStreaming()` for best performance, with a fallback to `arrayBuffer()` if the server doesn't set the `application/wasm` content-type.
+- Commands are disabled until the core binary finishes loading. The terminal shows a loading message and a prompt appears once it's ready.
+- The `SharedArrayBuffer` polyfill stub prevents `ReferenceError` in browsers without cross-origin isolation headers.
+
+### On-Demand Loading of Standalone Modules
+
+
+flowchart TB
+ A["User runs grep/find/diff/sed (or clicks its Load button)"] --> B{"Module already compiled?"}
+ B -->|Yes| F["Run command"]
+ B -->|No| C{"Fetch in flight?"}
+ C -->|Yes| D["Share the existing in-flight fetch"]
+ C -->|No| E["fetch + compileStreaming /wasm/<module>.wasm"]
+ D --> G["Dispatch uutils:program-loaded"]
+ E --> G
+ G --> F
+
+
+- Each module is fetched **once**, the first time it's needed. Concurrent callers share a single in-flight fetch, and the compiled module is cached for the rest of the session.
+- A single module can back several commands: `diffutils.wasm` provides both `diff` and `cmp`, and the **"Load" button for `find`** brings in `find`, `locate` and `updatedb` together.
+- On success the page dispatches a `uutils:program-loaded` event, which the "Load" buttons listen for so their label flips to `✓ loaded` — whether the module was loaded by the button or by running the command.
+- If a module's binary isn't present (e.g. local dev without a CI build), the command reports that it's unavailable instead of breaking the terminal.
+
+## Command Parsing & Pipes
+
+The shell implements a simple but functional parser:
+
+
+
+Supported shell features:
+- **Pipes** (`|`) - chain commands together
+- **Redirections** (`>`, `>>`, `<`) - write output to files, append, or read input from files
+- **Single quotes** (`'...'`) - literal strings, no escaping
+- **Double quotes** (`"..."`) - literal strings with backslash escaping
+- **Backslash escaping** (`\|`, `\ `) - escape special characters
+- **Tab completion** - commands and filenames
+- **Keyboard shortcuts** - Ctrl+C (cancel), Ctrl+L (clear), Ctrl+U (clear line), arrows (history/cursor)
+
+**Not** supported (by design, to keep it simple): variables (`$VAR`), subshells, `&&`/`||`, globbing.
+
+### Shell vs. Coreutils: Who Does What?
+
+It's important to understand that **coreutils only provides individual commands** like `sort`, `cat`, `ls`, etc. Features like `if`/`then`/`else`, `while` loops, `for` loops, variable expansion (`$VAR`), and globbing (`*.txt`) are all **shell features** - they are provided by a shell such as Bash or Zsh, not by coreutils.
+
+Since the playground implements only a minimal shell (pipes, redirections, quoting, and a few builtins), these shell constructs are not available. This isn't a limitation of uutils itself - it's simply because the playground's JavaScript shell is intentionally lightweight and doesn't include a full shell language interpreter.
+
+## The Rust Side: Building Coreutils for WebAssembly
+
+### Compilation Target
+
+The uutils coreutils are compiled to **`wasm32-wasip1`** (WebAssembly System Interface Preview 1) using the standard Rust toolchain:
+
+```bash
+cargo build --target wasm32-wasip1 --features feat_wasm
+```
+
+This produces a single `uutils.wasm` binary - a **multicall binary** similar to BusyBox, where all 60+ utilities are bundled into one executable.
+
+### The `feat_wasm` Feature Gate
+
+Not every coreutil can run in a WASM sandbox. The [`feat_wasm` feature](https://github.com/uutils/coreutils/blob/main/Cargo.toml) in `Cargo.toml` defines the curated set of utilities that are compatible with WASI:
+
+
+flowchart LR
+ subgraph "feat_wasm (included)"
+ direction LR
+ A["Text: cat, head, tail, sort, uniq, cut, tr, wc, fmt"]
+ B["Files: cp, mv, rm, mkdir, touch, link, ln, ls"]
+ C["Math: seq, factor, shuf, numfmt, expr"]
+ D["Checksum: md5sum, sha*sum, b2sum, cksum"]
+ E["Encoding: base32, base64, basenc"]
+ F["Other: date, uname, arch, nproc, sleep, echo, printf"]
+ end
+
+ subgraph "Excluded from WASM"
+ direction LR
+ X["dd, df, du, env, mktemp, more, tac, test, stty, chcon, runcon, chown, kill..."]
+ end
+
+
+Utilities are excluded when they depend on OS-level syscalls not available in WASI - for example, `df` needs filesystem stats, `du` needs directory traversal with metadata, and `chown`/`chcon` need permission and SELinux APIs.
+
+> **Note:** `grep`, `find`/`locate`/`updatedb`, `diff`/`cmp` and `sed` are **not** part of the coreutils `feat_wasm` set — they live in separate uutils projects ([grep](https://github.com/uutils/grep), [findutils](https://github.com/uutils/findutils), [diffutils](https://github.com/uutils/diffutils), [sed](https://github.com/uutils/sed)) and are compiled to their own WASM modules, loaded on demand as described above. (`xargs` is intentionally absent: it must spawn child processes, which the browser WASI sandbox can't do.)
+
+### Multicall Binary: How Command Dispatch Works
+
+
+flowchart TB
+ A["WASI runtime calls _start()"] --> B["main() in coreutils.rs"]
+ B --> C["Read argv[0] = 'coreutils'"]
+ C --> D["Read argv[1] = utility name e.g. 'sort'"]
+ D --> E["Look up in util_map()"]
+ E --> F["Call sort::uumain(args)"]
+ F --> G["Return exit code"]
+
+
+At **build time**, `build.rs` scans all enabled Cargo features and generates a `uutils_map.rs` file containing a [PHF](https://crates.io/crates/phf) (perfect hash function) map:
+
+```rust
+// Auto-generated at build time
+type UtilityMap = phf::OrderedMap<
+ &'static str,
+ (fn(T) -> i32, fn() -> Command)
+>;
+```
+
+Each entry maps a utility name (e.g. `"sort"`) to a pair of functions:
+- **`uumain`** - the utility's entry point, taking argument iterators and returning an exit code
+- **`uu_app`** - returns the `clap::Command` definition for argument parsing and help
+
+At **runtime**, the multicall binary reads `argv` to determine which utility to invoke. In the browser, the JavaScript shell calls the WASM binary as `["coreutils", "sort", "-rn"]`, so `argv[1]` becomes the dispatch key.
+
+### WASI Platform Adaptations
+
+Individual utilities use conditional compilation to handle WASI's limitations:
+
+```rust
+// In cp: symlinks are not supported on WASI
+#[cfg(target_os = "wasi")]
+return Err(Error::Unsupported);
+
+// In tail: no inotify/kqueue file watching
+#[cfg(target_os = "wasi")]
+fn follow() { /* no-op stub */ }
+
+// In ls: hostname crate excluded for WASI
+#[cfg(not(target_os = "wasi"))]
+use hostname::get;
+```
+
+These stubs mean the utilities gracefully degrade rather than crash - `tail -f` simply won't follow, `cp` won't create symlinks, and `ls` won't show hostname information.
+
+### Localization: Embedding All Translations
+
+A key difference for the WASM build is how locale files are handled:
+
+
+flowchart TB
+ subgraph "Normal build (Linux, macOS...)"
+ N1["build.rs detects user's LANG"]
+ N1 --> N2["Embed only matching .ftl file + English fallback"]
+ end
+
+ subgraph "WASI build"
+ W1["build.rs detects target_os = wasi"]
+ W1 --> W2["Embed ALL .ftl locale files (30+ languages)"]
+ W2 --> W3["Runtime locale switching via LANG env variable"]
+ end
+
+
+On native platforms, `uucore`'s build script embeds only the [Fluent](https://projectfluent.org/) (`.ftl`) translation files matching the user's `LANG` environment variable, to keep the binary small. For WASI builds, **all locale files are embedded**, because the target locale isn't known at compile time - the playground user can switch languages at runtime via the locale dropdown or the `locale` command.
+
diff --git a/content/playground.md b/content/playground.md
new file mode 100644
index 000000000..cf71e40d8
--- /dev/null
+++ b/content/playground.md
@@ -0,0 +1,111 @@
++++
+title = "Playground"
+template = "page.html"
++++
+
+
Try uutils coreutils directly in your browser! This interactive terminal runs Rust coreutils via WebAssembly - no installation needed.
+
+ Run a command, then copy a link that reruns it for anyone you share it with.
+
+
+
+
+
+
+
+
+
+
+
+
+## Try it out
+
+Click an example to run it in the terminal:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Sharing commands via URL
+
+After running a command, click **🔗 Copy share link** below the terminal to copy a link that reruns it. You can also build one by hand with the `?cmd=` URL parameter. The command runs automatically when the page loads - great for sharing examples or linking from documentation.
+
+**Examples:**
+
+- [`?cmd=date`](/playground?cmd=date) - show the current date
+- [`?cmd=seq 1 10 | factor`](/playground?cmd=seq%201%2010%20|%20factor) - factorize numbers 1–10
+- [`?cmd=echo 'Hello, world!' | sha256sum`](/playground?cmd=echo%20%27Hello%2C%20world!%27%20|%20sha256sum) - hash a string
+- [`?cmd=sort fruits.txt | uniq -c | sort -rn`](/playground?cmd=sort%20fruits.txt%20|%20uniq%20-c%20|%20sort%20-rn) - count and rank fruit
+
+Multiple commands can be run in sequence, separated either by `;` on one line or by newlines (`%0A` in the URL):
+
+- [`?cmd=echo hello%0Aecho world`](/playground?cmd=echo%20hello%0Aecho%20world) - run two commands in sequence
+- [`?cmd=updatedb; locate names`](/playground?cmd=updatedb%3B%20locate%20names) - build the locate database, then search it
+
+## Available commands
+
+The following commands run as **real Rust coreutils compiled to WebAssembly**:
+
+
Loading the list of available commands…
+
+The following are **shell builtins** implemented in JavaScript:
+
+- `help` - list available commands and examples
+- `clear` - clear the terminal screen
+- `cd` - change the current working directory
+- `locale` - show or change the current locale
+
+Some commands (e.g. `chcon`, `runcon`, etc.) are not yet available in the WASM build because they
+depend on platform-specific syscalls not fully supported by WebAssembly/WASI.
+
+We are actively working on adding more commands as we improve WASI compatibility in uutils coreutils.
+
+Curious about how this all works under the hood? Read the [technical deep-dive on the playground architecture](/playground-how-it-works).
+
+The source code for this website (including the playground) is available on [GitHub](https://github.com/uutils/uutils.github.io/).
diff --git a/content/procps.md b/content/procps.md
new file mode 100644
index 000000000..142ab0b38
--- /dev/null
+++ b/content/procps.md
@@ -0,0 +1,29 @@
++++
+
+title = "procps"
+template = "project.html"
+
+[extra]
+wip = true
+
++++
+
+uutils procps is a work-in-progress Rust reimplementation of procps, the package that provides utilities for monitoring and interacting with processes.
+
+This project aims to provide memory-safe replacements for tools such as `ps`, `top`, `kill`, `free`, `vmstat`, `uptime`, and others found in procps.
+
+> **Note:** This project is still in early development. Many features are not yet implemented and behavior may differ from the original procps tools.
+
+# Goals
+
+Implement a cross-platform, memory-safe set of process monitoring utilities compatible with the procps command-line interfaces.
+
+# Contributing
+
+To contribute to uutils procps, please see [CONTRIBUTING](https://github.com/uutils/procps/blob/main/CONTRIBUTING.md).
+
+# License
+
+uutils procps is licensed under the MIT License - see the [LICENSE](https://github.com/uutils/procps/blob/main/LICENSE) file for details.
+
+procps is licensed under the GPL 2.0 or later.
diff --git a/content/reviews.md b/content/reviews.md
new file mode 100644
index 000000000..943c5363e
--- /dev/null
+++ b/content/reviews.md
@@ -0,0 +1,155 @@
++++
+title = "Review Guidelines"
+template = "page.html"
++++
+
+This page describes what we expect from pull requests across the uutils
+projects ([coreutils](https://github.com/uutils/coreutils),
+[findutils](https://github.com/uutils/findutils) and the others) and how reviews
+are carried out. It is meant for both **contributors** who want to know what a
+reviewer looks for, and **reviewers** who want a shared checklist. Each
+project's `CONTRIBUTING.md` links here; the rules below apply to all of them.
+
+## The one rule that cannot be bent
+
+> uutils is **original** code. We **cannot** accept any change based on the GNU
+> source code, and you **must not even link to** the GNU source in an issue or
+> PR. A reviewer will reject a contribution that appears to be derived from GNU
+> (or any other strongly-licensed implementation such as GPL/LGPL code).
+
+It is fine to look at permissively-licensed implementations
+([Apple's file_cmds](https://github.com/apple-oss-distributions/file_cmds/),
+[OpenBSD](https://github.com/openbsd/src/tree/master/bin)) and to read the GNU
+*manuals* and man pages - just never the GNU *source*.
+
+## What a reviewer expects before merging
+
+A pull request is ready to be merged when it meets all of the following. If you
+check these before requesting a review, your PR will move much faster.
+
+- **It passes CI.** The test suite is green (allowing for intermittently
+ failing tests), `rustfmt` is satisfied, and there are no `clippy` warnings.
+- **It compiles without warnings on every CI platform.** Use `#[cfg(...)]` for
+ platform-specific code rather than breaking other targets.
+- **It is small and self-contained.** A series of small PRs gets merged far
+ faster than one large one. Unrelated changes belong in separate PRs.
+- **It has a descriptive title.** Describe the problem solved, e.g.
+ `ls: fix version sort order`, not `Fix #1234`. Prefix with the utility name
+ when relevant.
+- **New behavior comes with tests.** Our test suite is fast; regressions should
+ be caught by a test. Code coverage should not regress.
+- **If possible, it was discussed first.** For anything non-trivial, open (or comment on) an
+ issue *before* writing the code, so effort isn't wasted on a change we can't
+ merge.
+- **It follows GNU behavior** for options and output, verified against the GNU
+ manual or output - never the GNU source.
+- **GNU compatibility does not regress.** The GNU test suite (`run-gnu-test.sh`,
+ tracked with `remaining-gnu-error.py`) should not go backwards; a
+ compatibility fix should ideally add the now-passing test. Error messages and
+ exit codes should match GNU, checked with `LANG=C` (except for locale bugs).
+- If the GNU test suite passes but you still found a behavior difference, that is
+ a gap in their coverage: please contribute the missing test upstream to GNU to
+ improve their test suite.
+- **It updates docs, help and translations.** A new option or behavior should
+ also update the `--help` text, the documentation, the generated man pages, and
+ at least the English `locales/en-US.ftl` strings.
+- **It stays focused.** Keep formatting-only changes, unrelated refactors, and
+ dependency or lockfile bumps out of a feature or fix PR.
+- **It is safe with untrusted input.** Utilities process arbitrary file contents
+ and arguments, so avoid unbounded allocations, integer overflow, and
+ path-traversal foot-guns.
+- **It does not regress performance.** Runtime should not get more than **3%**
+ slower than the current `main`. Increased memory usage is acceptable when it is
+ justified (e.g. it buys a meaningful speed-up or is needed for correctness).
+- **It does not regress binary size.** The compiled binary should not grow more
+ than **3%** compared to the current `main`, unless the increase is justified by
+ the change.
+- **New dependencies must be discussed and justified.** Adding a crate is not
+ free - it affects build time, binary size, the audit surface, and licensing.
+ Raise it first, explain why it's needed and why an existing dependency or a
+ small amount of in-tree code won't do, and make sure its license is compatible
+ (see Licensing in each project's `CONTRIBUTING.md`).
+
+### Commit hygiene reviewers care about
+
+- Small, atomic commits with a clean history.
+- Informative messages annotated with the component, e.g.
+ `cp: do not overwrite with -i` or `uucore: add support for FreeBSD`.
+- Don't move code around unnecessarily - it makes diffs hard to review. If a
+ move is needed, do it in its own commit.
+
+### Coding expectations reviewers check against
+
+- **No `panic!`** - avoid `.unwrap()`, `panic!` and stray `println!`. A
+ justified `unreachable!` needs a comment.
+- **No `exit`** - utilities must be embeddable, so avoid `std::process::exit`
+ and friends.
+- **Minimal `unsafe`** - generally only for FFI, always with a `// SAFETY:`
+ comment. Performance is rarely a good enough reason.
+- **`OsStr`/`Path` over `str`/`String`** for paths, since paths may not be valid
+ UTF-8.
+- **Macros sparingly**, and **comments that explain *why***, kept up to date.
+- **Don't silence clippy with `#[allow(...)]`.** In particular, we don't want to
+ see `#[allow(dead_code)]`; fix the underlying issue (or remove the unused code)
+ instead of suppressing the lint.
+
+## For contributors: getting your PR reviewed
+
+- You don't need to ping a maintainer the moment you open a PR.
+- If you get no response within a few days, it's fine to request a review.
+- If after a week there's still no review, ping the maintainers on
+ [Discord](https://discord.gg/wQVJbvJ) (`#coreutils-chat` for coreutils).
+- You know your code best - please resolve merge conflicts on your branch
+ yourself (`git merge main` or `git rebase main`, your choice). Ask for help if
+ you get stuck.
+- When you address review feedback, fold the fixes into the relevant commits
+ (`git commit --fixup` / `git absorb`) to keep history clean.
+
+## For reviewers: how we review
+
+- **Double-check a human's work.** A reviewer is there to verify a contributor's
+ reasoning, not to launder unreviewed machine output. Expect the author to be
+ able to explain and justify every line.
+- **Watch for GNU/GPL provenance.** Be especially careful with AI-assisted
+ patches: assistants are trained on GPL sources and can reproduce them
+ verbatim, which we cannot accept.
+- **Keep comments short and actionable.** Prefer simple, one-line comments on
+ the specific line, so the author knows exactly what to change.
+- **Push back on** long-winded code, duplication, needless complexity, and
+ changes that arrive without tests.
+- **Confirm the basics** from the checklist above (CI, scope, title, tests,
+ style) rather than re-deriving them each time.
+- **Disregard machine-generated discussion.** Review comments and replies should
+ come from a person. Maintainers may hide or ignore comments that read as
+ AI-generated.
+
+## AI-assisted contributions
+
+AI-assisted contributions are allowed, but the same standards apply as for any
+other patch. If you use an AI tool, **you** are responsible for the result: you
+should understand every line, be able to justify it in review, and make sure the
+output is not derived from GNU or other GPL code. Keep patches small and
+self-review the diff carefully before opening the PR. Commit messages and PR
+descriptions should describe the change, not the tooling used to produce it.
+
+AI is a tool for writing *code*. Issue reports, pull request descriptions, and
+replies to reviewers should be written in **your own words**. The whole point of
+review discussion is to confirm that a human understands the change; generated
+prose defeats that.
+
+This is not about English fluency: if you are not a native speaker, using a tool
+to fix grammar or translate your own words is fine. The point is that the ideas
+and reasoning should be yours, not an AI's.
+
+This section is inspired by the
+[astral-sh AI policy](https://github.com/astral-sh/.github/blob/main/AI_POLICY.md)
+and Mozilla's
+[AI coding guidance](https://firefox-source-docs.mozilla.org/contributing/ai-coding.html).
+
+## See also
+
+- The full `CONTRIBUTING.md` in each repository
+ ([coreutils](https://github.com/uutils/coreutils/blob/main/CONTRIBUTING.md),
+ [findutils](https://github.com/uutils/findutils/blob/main/CONTRIBUTING.md))
+- `DEVELOPMENT.md` for setting up your environment
+- Our [Code of Conduct](https://github.com/uutils/coreutils/blob/main/CODE_OF_CONDUCT.md)
diff --git a/content/sed.md b/content/sed.md
new file mode 100644
index 000000000..9267e4cac
--- /dev/null
+++ b/content/sed.md
@@ -0,0 +1,32 @@
++++
+
+title = "sed"
+template = "project.html"
+
+[extra]
+wip = true
+status = "alpha"
+
++++
+
+uutils sed is a work-in-progress Rust reimplementation of GNU sed, the stream editor for filtering and transforming text.
+
+This project aims to be a drop-in replacement for GNU sed, supporting the full range of sed scripts and command-line options.
+
+[](https://github.com/uutils/sed-tracking)
+
+> **Note:** This project is still in early development. Many features are not yet implemented and behavior may differ from GNU sed.
+
+# Goals
+
+Implement a cross-platform, memory-safe sed that is compatible with GNU sed scripts and command-line interface.
+
+# Contributing
+
+To contribute to uutils sed, please see [CONTRIBUTING](https://github.com/uutils/sed/blob/main/CONTRIBUTING.md).
+
+# License
+
+uutils sed is licensed under the MIT License - see the [LICENSE](https://github.com/uutils/sed/blob/main/LICENSE) file for details.
+
+GNU sed is licensed under the GPL 3.0 or later.
diff --git a/content/shadow.md b/content/shadow.md
new file mode 100644
index 000000000..1235bfc9b
--- /dev/null
+++ b/content/shadow.md
@@ -0,0 +1,33 @@
++++
+
+title = "shadow"
+template = "project.html"
+aliases = ["/shadow-rs"]
+
+[extra]
+wip = true
+
++++
+
+Memory-safe Rust reimplementation of Linux shadow-utils: `useradd`, `userdel`, `usermod`, `passwd`, `pwck`, `chpasswd`, `chage`, `groupadd`, `groupdel`, `groupmod`, `grpck`, `chfn`, `chsh`, and `newgrp`.
+
+This project aims to be a drop-in replacement for the original commands, with the same flags, exit codes, and output format as GNU shadow-utils.
+
+# Goals
+
+This project aims to be a drop-in replacement for the GNU shadow-utils, with a focus on:
+
+- **Drop-in compatibility** - same flags, same exit codes, same output format as GNU shadow-utils.
+- **Memory safety** - eliminating buffer overflows and use-after-free vulnerabilities through Rust's type system.
+- **Security hardening** - Landlock sandboxing and privilege dropping.
+- **Comprehensive testing** - unit tests, property-based tests, integration tests, and fuzz targets.
+
+# Contributing
+
+To contribute to uutils shadow, please see [CONTRIBUTING](https://github.com/uutils/shadow/blob/main/CONTRIBUTING.md).
+
+# License
+
+uutils shadow is licensed under the MIT License - see the [LICENSE](https://github.com/uutils/shadow/blob/main/LICENSE) file for details.
+
+GNU shadow-utils is licensed under the BSD 3-Clause License.
diff --git a/content/talks.md b/content/talks.md
new file mode 100644
index 000000000..717122f48
--- /dev/null
+++ b/content/talks.md
@@ -0,0 +1,63 @@
++++
+
+title = "Talks & Media"
+template = "page.html"
+
++++
+
+# Talks
+
+## FOSDEM 2026 — Rust Coreutils in Ubuntu
+
+*Sylvestre Ledru — February 1, 2026*
+
+Yes, we rewrote `/bin/true` in Rust — Here's what really happened. Which obscure behaviours scripts secretly depend on, how packaging Essential tools can turn one missing corner-case into a boot failure, and what we learned shipping Rust coreutils in Ubuntu.
+
+- [Schedule](https://fosdem.org/2026/schedule/event/DTYYL9-rust-coreutils/)
+- [Slides](https://sylvestre.ledru.info/presentations/coreutils-fosdem-2026/)
+
+## FOSDEM 2025 — Rewriting the future of the Linux essential packages in Rust?
+
+*Sylvestre Ledru — February 1, 2025*
+
+The Linux ecosystem depends on core utilities written decades ago in C, but modern needs demand safer, more maintainable tools. This talk covers the uutils project's effort to reimagine essential Linux tools in Rust, including coreutils, findutils, and diffutils.
+
+- [Schedule](https://archive.fosdem.org/2025/schedule/event/fosdem-2025-6196-rewriting-the-future-of-the-linux-essential-packages-in-rust-/)
+- [Slides](https://sylvestre.ledru.info/coreutils-fosdem-2025/)
+
+## FOSDEM 2023 — Reimplementing the Coreutils in a modern language (Rust)
+
+*Sylvestre Ledru — February 5, 2023*
+
+How a community spawned to reimplement the coreutils in Rust, enabling achievements like booting Debian and compiling Firefox and the Linux kernel with these reimplementations.
+
+- [Schedule](https://archive.fosdem.org/2023/schedule/event/rust_coreutils/)
+- [Slides](https://sylvestre.ledru.info/presentations/coreutils-fosdem-2023/)
+
+# Podcasts
+
+## Open Source Security Podcast — Rust coreutils with Sylvestre Ledru
+
+*March 2, 2026*
+
+Josh interviews Sylvestre Ledru about rewriting GNU coreutils in Rust — modernizing legacy code, attracting new contributors, the positive relationship with GNU coreutils developers, Ubuntu's adoption plans, and future directions.
+
+- [Listen](https://opensourcesecuritypodcast.libsyn.com/rust-coreutils-with-sylvestre-ledru)
+
+## FLOSS Weekly Episode 792 — Rust Coreutils
+
+*July 17, 2024*
+
+Jonathan Bennett and Jeff Massie interview Sylvestre Ledru about the Rust Coreutils project — why developers are reimplementing classic Unix utilities in Rust, the practical advantages, and the perspective of the original coreutils maintainers.
+
+- [Listen](https://hackaday.com/2024/07/17/floss-weekly-episode-792-rust-coreutils/)
+
+# Videos
+
+## Rust at TU Delft — Rewriting the GNU Coreutils in Rust
+
+*Terts Diepraam*
+
+An overview of the uutils coreutils project, its goals, challenges, and the path toward replacing GNU coreutils in Linux distributions.
+
+- [Watch on YouTube](https://www.youtube.com/watch?v=fu2sxy6OR54)
diff --git a/content/tar.md b/content/tar.md
new file mode 100644
index 000000000..b8d77e825
--- /dev/null
+++ b/content/tar.md
@@ -0,0 +1,29 @@
++++
+
+title = "tar"
+template = "project.html"
+
+[extra]
+wip = true
+
++++
+
+uutils tar is a work-in-progress Rust reimplementation of GNU tar, the ubiquitous archiving utility.
+
+This project aims to be a drop-in replacement for GNU tar, supporting the creation, extraction, and manipulation of tar archives across platforms.
+
+> **Note:** This project is still in early development. Many features are not yet implemented and behavior may differ from GNU tar.
+
+# Goals
+
+Implement a cross-platform, memory-safe tar that is compatible with GNU tar archives and command-line interface.
+
+# Contributing
+
+To contribute to uutils tar, please see [CONTRIBUTING](https://github.com/uutils/tar/blob/main/CONTRIBUTING.md).
+
+# License
+
+uutils tar is licensed under the MIT License - see the [LICENSE](https://github.com/uutils/tar/blob/main/LICENSE) file for details.
+
+GNU tar is licensed under the GPL 3.0 or later.
diff --git a/content/team.md b/content/team.md
new file mode 100644
index 000000000..8a06568a9
--- /dev/null
+++ b/content/team.md
@@ -0,0 +1,35 @@
++++
+
+title = "Who we are"
+template = "page.html"
+
++++
+
+uutils is a community-driven, open-source effort maintained by volunteers around the world. There is no company behind it, just contributors who care about the future of foundational command-line tools.
+
+Everything happens in the open on [GitHub](https://github.com/uutils), and newcomers are genuinely welcome. Many of our contributors landed their first-ever open-source patch on a uutils project, and we are happy to help you do the same.
+
+