ENTS
The Extendable Nested Tagging Spec, or ENTS, is an implementable specification for writing human-readable nested tagging structures for file systems.
Quick Start
ENTS is a specification that can have many implementations. The (current) featured implementation is PRLENTS, which is a very useful terminal program for organizing files on your computer.
Imagine this - you have a bunch of photos, or pdfs, or papers, or
whatever in your home folder, and making organized tree directory
folders for it will be a huge pain in the ass. And even if you make a
really great folder layout, there’s still no perfect way to do it,
but you just can’t put your finger on why. Should I make the
folders by country, and then the child folders by subject, and have some
child folders for subtopics in there? Or should I have the subject
folders be above the country folders? What if I made the very top level
folders ‘Europe’ and ‘North America’?
See what I mean? Tree file
directories have their limitations. They were brilliant in the 70s,
when we had constrained hardware, but it’s not the 70s anymore.
Introducing the next evolution of filesystems. PRLENTS is a program that sits in userspace that allows conditional tag-based filesystem. It is the prototype for an eventual FUSE implementation and an eventual proper actual filesystem.
Here’s a sample ENTS file:
+ Continents
- Europe
- Germany
- France
- UK
- North America
- United States
- Canada
- Mexico
+ Subjects
- Chemistry
- Organic Chemistry
- Carbon Nanomaterials
- Physics
Using PRLENTS, we tag our files according to the ENTS file above, and then can run filtering and querying commands on it.
prlents fil europe
prlents intersect "organic chemistry" physics
prlents ftt add schelling.pdf economics "game theory"
Much better!
Documentation
Posts
November Redesign
Date: 2025 Nov 14
Words: 899
Draft: 1 (Most recent)
terms
here i use the term exclusion rules, which means: within any
single branch, you can only tag at one, fixed depth level. you can tag
siblings, because those are roots of two different branches. you can tag
different depths on sibling branches because those are not on one single
branch. really it’s just one rule, one canonical rule with a couple
derived rules.
I also interchangeably use functor and
relationship. ENTS is designed to work with two different
things of two different categories: files and nestable tags. using
category theory terminology, a functor is a relationship between two
different things of different categories. so here we are dealing with
file-tag functors. colloquially, here i use “relationship” to refer to a
file-tag functor.
here i use file group to mean all the files in a folder and
all the files in any nested subfolders.
next planned changes
the normal tag is going to have soft enforcement for the exclusion
rules. to follow these rules (non-strictly), there has to be one functor
called the principal functor, and there can only be one of
these. when the enforcement is broken with additional functors, these
will be additional associated functor/ies. the user has to use
the --force flag to break the exclusion rules and create an
associated functor (done to encourage the user to keep files to tags at
a fixe...
Design
Date: 2025 Oct 27
Words: 245
Draft: 1 (Most recent)
The Organizational Container vs. Labeler Problem: Let’s say you want to have some tags be used to label objects, and some tags just to organize and contain those tags. For example, you want to label files based on their reading completion and their source format. If you just had plain nested tags, you could accidentally label an object with the literal tag “reading completion” or “format”, which would show up in queries and cause all sorts of issues downstream. So how do you make it so you can’t label objects with organiztiional containers in a human-readable, keyboard-typable format? If we were to use JSON, there would be no clean and easy way to type it out. Here are the cleanest possible ways to do it: { "reading levels": ["not read", "skimmed", "partially read", "read", "re-read"], "format": ["journal", "book", "webpage"] } [ { "tag": "reading levels", "labeler": false, "children": { {"tag": "not read", "labeler": true, "children": null}, {"tag": "skimmed", "labeler": true, "children": null}, {"tag": "partially read", "labeler": true, "children": null}, {"tag": "read", "labeler": true, "children": null}, {"tag": "re-read", "labeler": true, "children": null} }, { "tag": "format", "labeler": false, "children": { {"tag": "journal", "labeler": true, "children": null}, {"tag": "book", "labeler": true, "children": null}, {"tag": ...
Specification
- ENTS 0.6.0
- Haskell Parser
- This verison of the parser is also supported. The main parser is written in Rust
Implementations: PRLENTS (PRototype Rust Local ENTS)
cargo install --git https://github.com/diegocabello/prlents- Documentation
- Github
Roadmap and Implementations
The PRLENTS implementation for file tagging managment, written entirely in Rust, was released in June 2025. In the future, ENTS is planned to be used for improved academic taxonomies for research paper databases; potentially as a configuration language; and for a FUSE nested tagging filesystem.