Tagsistant


Tagsistant is a semantic file system for the Linux kernel, written in C and based on FUSE. Unlike traditional file systems that use hierarchies of directories to locate objects, Tagsistant introduces the concept of tags.

Design and differences with hierarchical file systems

In computing, a file system is a type of data store which could be used to store, retrieve and update files. Each file can be uniquely located by its path. The user must know the path in advance to access a file and the path does not necessarily include any information about the content of the file.
Tagsistant uses a complementary approach based on tags. The user can create a set of tags and apply those tags to files, directories and other objects. The user can then search all the objects that match a subset of tags, called a query. This kind of approach is well suited for managing user contents like pictures, audio recordings, movies and text documents but is incompatible with system files where the univocity of the path is a security requirement to prevent the access to a wrong content.

The tags/ directory

A Tagsistant file system features four main directories:
  • archive/
  • relations/
  • stats/
  • tags/
Tags are created as sub directories of the tags/ directory and can be used in queries complying to this syntax:
where a subquery is an unlimited list of tags, concatenated as directories:
The portion of a path delimited by tags/ and @/ is the actual query. The +/ operator joins the results of different sub-queries in one single list. The @/ operator ends the query.
To be returned as a result of the following query:
an object must be tagged as both t1/ and t2/ or as both t1/ and t4/. Any object tagged as t2/ or t4/, but not as t1/ will not be retrieved.
The query syntax deliberately violates the POSIX file system semantics by allowing a path token to be a descendant of itself, like in tags/t1/t2/+/t1/t4/@ where t1/ appears twice. As a consequence a recursive scan of a Tagsistant file system will exit with an error or endlessly loop, as done by Unix find:

~/tagsistant_mountpoint$ find tags/
tags/
tags/document
tags/document/+
tags/document/+/document
tags/document/+/document/+
tags/document/+/document/+/document
tags/document/+/document/+/document/+

This drawback is balanced by the possibility to list the tags inside a query in any order. The query tags/t1/t2/@/ is completely equivalent to tags/t2/t1/@/ and tags/t1/+/t2/t3/@/ is equivalent to tags/t2/t3/+/t1/@/.
The @/ element has the precise purpose of restoring the POSIX semantics: the path tags/t1/@/directory/ refers to a traditional directory and a recursive scan of this path will properly perform.

The reasoner and the relations/ directory

Tagsistant features a simple reasoner which expands the results of a query by including objects tagged with related tags. A relation between two tags can be established inside the relations/ directory following a three level pattern:
The rel element can be includes or is_equivalent. To include the rock tag in the music tag, the Unix command mkdir can be used:
The reasoner can recursively resolve relations, allowing the creation of complex structures:
The web of relations created inside the relations/ directory constitutes a basic form of ontology.

Autotagging plugins

Tagsistant features an autotagging plugin stack which gets called when a file or a symlink is written. Each plugin is called if its declared MIME type matches
The list of working plugins released with Tagsistant 0.6 is limited to:
  • text/html: tags the file with each word in </code> and <code><keywords></code> elements and with <i>document</i>, <i>webpage</i> and <i>html</i> too</li><li> image/jpeg: tags the file with each <a href="/wiki/Exchangeable_image_file_format">Exif</a> tag</li></ul><h2>The repository</h2>Each Tagsistant file system has a corresponding repository containing an <code>archive/</code> directory where the objects are <a href="/wiki/Actually">actually</a> saved and a <code>tags.sql</code> file <a href="/wiki/Holding">holding</a> tagging information as an <a href="/wiki/SQLite">SQLite</a> database. If the <a href="/wiki/MySQL">MySQL</a> <a href="/wiki/Database_engine">database engine</a> was specified with the <code>--db</code> argument, the <code>tags.sql</code> file will be empty. Another file named <code>repository.ini</code> is a <a href="/wiki/GLib">GLib</a> ini store with the repository configuration.<br>Tagsistant 0.6 is <a href="/wiki/Compatible">compatible</a> with the <a href="/wiki/MySQL">MySQL</a> and Sqlite <a href="/wiki/Dialects">dialects</a> of SQL for tag reasoning and tagging resolution. While <a href="/wiki/Porting">porting</a> its logic to other SQL dialects is possible, differences in basic constructs must be considered.<br><h2>The archive/ and stats/ directories</h2>The <code>archive/</code> directory has been introduced to provide a quick way to access objects without using tags. Objects are listed with their <a href="/wiki/Inode_number">inode number</a> prefixed.<br>The <code>stats/</code> directory features some read-only files containing usage statistics. A file <code>configuration</code> holds both <a href="/wiki/Compile_time">compile time</a> information and current repository configuration.<br><h2>Main criticisms</h2>It has been highlighted that relying on an external database to store tags and tagging information could cause the complete loss of metadata if the database gets corrupted.<br>It has been highlighted that using <a href="/wiki/A_flat">a flat</a> namespace tends to overcrowd the <code>tags/</code> directory. This could be mitigated introducing <a href="/wiki/Tag_%28metadata%29%23Triple_tags">triple tags</a>.<br> </article> </main> <aside> <div class="sidebar-widget"><div class="sidebar-header"><h3>Books</h3></div><ul class="top-10-list"><li><a href="/wiki/Wuthering_Heights"><span class="rank">1</span> Wuthering Heights <span class="pop-tag">118,587</span></a></li><li><a href="/wiki/Tales_of_Dunk_and_Egg"><span class="rank">2</span> Tales of Dunk and Egg <span class="pop-tag">23,854</span></a></li><li><a href="/wiki/Project_Hail_Mary"><span class="rank">3</span> Project Hail Mary <span class="pop-tag">12,936</span></a></li><li><a href="/wiki/Lord_of_the_Flies"><span class="rank">4</span> Lord of the Flies <span class="pop-tag">11,294</span></a></li><li><a href="/wiki/A_Song_of_Ice_and_Fire"><span class="rank">5</span> A Song of Ice and Fire <span class="pop-tag">10,337</span></a></li><li><a href="/wiki/The_Brief_Wondrous_Life_of_Oscar_Wao"><span class="rank">6</span> The Brief Wondrous Life of Oscar Wao <span class="pop-tag">10,100</span></a></li><li><a href="/wiki/Nobody's_Girl_(memoir)"><span class="rank">7</span> Nobody's Girl (memoir) <span class="pop-tag">7,986</span></a></li><li><a href="/wiki/Hamlet"><span class="rank">8</span> Hamlet <span class="pop-tag">7,026</span></a></li><li><a href="/wiki/Frankenstein"><span class="rank">9</span> Frankenstein <span class="pop-tag">6,782</span></a></li><li><a href="/wiki/Dungeon_Crawler_Carl"><span class="rank">10</span> Dungeon Crawler Carl <span class="pop-tag">6,600</span></a></li></ul></div><div class="sidebar-widget"><div class="sidebar-header"><h3>Films</h3></div><ul class="top-10-list"><li><a href="/wiki/Wuthering_Heights_(2026_film)"><span class="rank">1</span> Wuthering Heights (2026 film) <span class="pop-tag">95,843</span></a></li><li><a href="/wiki/Marty_Supreme"><span class="rank">2</span> Marty Supreme <span class="pop-tag">50,577</span></a></li><li><a href="/wiki/The_Housemaid_(2025_film)"><span class="rank">3</span> The Housemaid (2025 film) <span class="pop-tag">49,096</span></a></li><li><a href="/wiki/28_Years_Later:_The_Bone_Temple"><span class="rank">4</span> 28 Years Later: The Bone Temple <span class="pop-tag">48,316</span></a></li><li><a href="/wiki/Dhurandhar"><span class="rank">5</span> Dhurandhar <span class="pop-tag">45,834</span></a></li><li><a href="/wiki/One_Battle_After_Another"><span class="rank">6</span> One Battle After Another <span class="pop-tag">33,762</span></a></li><li><a href="/wiki/Goat_(2026_film)"><span class="rank">7</span> Goat (2026 film) <span class="pop-tag">33,528</span></a></li><li><a href="/wiki/XXX_(2002_film)"><span class="rank">8</span> XXX (2002 film) <span class="pop-tag">29,905</span></a></li><li><a href="/wiki/Psycho_Killer_(film)"><span class="rank">9</span> Psycho Killer (film) <span class="pop-tag">29,842</span></a></li><li><a href="/wiki/Toy_Story_5"><span class="rank">10</span> Toy Story 5 <span class="pop-tag">27,866</span></a></li></ul></div><div class="sidebar-widget"><div class="sidebar-header"><h3>Programming Languages</h3></div><ul class="top-10-list"><li><a href="/wiki/C_(programming_language)"><span class="rank">1</span> C (programming language) <span class="pop-tag">3,639</span></a></li><li><a href="/wiki/Python_(programming_language)"><span class="rank">2</span> Python (programming language) <span class="pop-tag">3,490</span></a></li><li><a href="/wiki/C++"><span class="rank">3</span> C++ <span class="pop-tag">1,676</span></a></li><li><a href="/wiki/JavaScript"><span class="rank">4</span> JavaScript <span class="pop-tag">1,631</span></a></li><li><a href="/wiki/Rust_(programming_language)"><span class="rank">5</span> Rust (programming language) <span class="pop-tag">1,504</span></a></li><li><a href="/wiki/Go_(programming_language)"><span class="rank">6</span> Go (programming language) <span class="pop-tag">1,434</span></a></li><li><a href="/wiki/R_(programming_language)"><span class="rank">7</span> R (programming language) <span class="pop-tag">1,421</span></a></li><li><a href="/wiki/Scratch_(programming_language)"><span class="rank">8</span> Scratch (programming language) <span class="pop-tag">1,374</span></a></li><li><a href="/wiki/Java_(programming_language)"><span class="rank">9</span> Java (programming language) <span class="pop-tag">1,333</span></a></li><li><a href="/wiki/Assembly_language"><span class="rank">10</span> Assembly language <span class="pop-tag">899</span></a></li></ul></div><div class="sidebar-widget"><div class="sidebar-header"><h3>TV Series</h3></div><ul class="top-10-list"><li><a href="/wiki/A_Knight_of_the_Seven_Kingdoms_(TV_series)"><span class="rank">1</span> A Knight of the Seven Kingdoms (TV series) <span class="pop-tag">104,072</span></a></li><li><a href="/wiki/The_Night_Agent"><span class="rank">2</span> The Night Agent <span class="pop-tag">73,897</span></a></li><li><a href="/wiki/Love_Story_(2026_TV_series)"><span class="rank">3</span> Love Story (2026 TV series) <span class="pop-tag">64,192</span></a></li><li><a href="/wiki/Famous_Last_Words_(TV_series)"><span class="rank">4</span> Famous Last Words (TV series) <span class="pop-tag">64,170</span></a></li><li><a href="/wiki/America's_Next_Top_Model"><span class="rank">5</span> America's Next Top Model <span class="pop-tag">53,934</span></a></li><li><a href="/wiki/The_Pitt"><span class="rank">6</span> The Pitt <span class="pop-tag">44,764</span></a></li><li><a href="/wiki/Heated_Rivalry"><span class="rank">7</span> Heated Rivalry <span class="pop-tag">36,398</span></a></li><li><a href="/wiki/Euphoria_(American_TV_series)"><span class="rank">8</span> Euphoria (American TV series) <span class="pop-tag">33,909</span></a></li><li><a href="/wiki/How_to_Get_to_Heaven_from_Belfast"><span class="rank">9</span> How to Get to Heaven from Belfast <span class="pop-tag">33,789</span></a></li><li><a href="/wiki/Grey's_Anatomy"><span class="rank">10</span> Grey's Anatomy <span class="pop-tag">32,330</span></a></li></ul></div><div class="sidebar-widget"><div class="sidebar-header"><h3>Video Games</h3></div><ul class="top-10-list"><li><a href="/wiki/Ecco_the_Dolphin_(video_game)"><span class="rank">1</span> Ecco the Dolphin (video game) <span class="pop-tag">39,935</span></a></li><li><a href="/wiki/Wordle"><span class="rank">2</span> Wordle <span class="pop-tag">26,024</span></a></li><li><a href="/wiki/Poppy_Playtime"><span class="rank">3</span> Poppy Playtime <span class="pop-tag">18,118</span></a></li><li><a href="/wiki/Resident_Evil_Requiem"><span class="rank">4</span> Resident Evil Requiem <span class="pop-tag">15,300</span></a></li><li><a href="/wiki/Pokémon_FireRed_and_LeafGreen"><span class="rank">5</span> Pokémon FireRed and LeafGreen <span class="pop-tag">13,433</span></a></li><li><a href="/wiki/Roblox"><span class="rank">6</span> Roblox <span class="pop-tag">12,144</span></a></li><li><a href="/wiki/Minecraft"><span class="rank">7</span> Minecraft <span class="pop-tag">10,844</span></a></li><li><a href="/wiki/Grand_Theft_Auto_V"><span class="rank">8</span> Grand Theft Auto V <span class="pop-tag">9,575</span></a></li><li><a href="/wiki/Reanimal"><span class="rank">9</span> Reanimal <span class="pop-tag">9,006</span></a></li><li><a href="/wiki/Pokémon_(video_game_series)"><span class="rank">10</span> Pokémon (video game series) <span class="pop-tag">8,881</span></a></li></ul></div> </aside> </div> <footer> <div class="footer-content"> <div class="footer-info"> <p>© 2026 <a href="https://owiki.org" class="cc-link">OWIKI.org</a>.</p> <p>Content is available under <a href="/wiki/Creative_Commons" class="cc-link">Creative Commons Attribution-ShareAlike 4.0</a> unless otherwise noted.</p> </div> <div class="footer-system"> <p>Status: <span class="status-online">ONLINE</span></p> <p>Version: <span class="protocol-id">1.04</span></p> </div> </div> </footer> <script> const menuToggle = document.getElementById('mobile-menu'); const navLinks = document.getElementById('nav-links'); menuToggle.addEventListener('click', () => { navLinks.classList.toggle('active'); }); </script> </body> </html>