Obsidian et ses fonctions
Obsidian Bases : référence de syntaxe, filtres et fonctions
Obsidian Bases décrit des vues sur les fichiers d’un coffre à l’aide de filtres, de propriétés et de formules, écrits en YAML dans un fichier .base ou dans un bloc base. Cette référence reprend toute la syntaxe documentée : sections du fichier, filtres, opérateurs et dates, propriétés, fonctions par type, formules, résumés et clés de vue. Elle est à jour d’Obsidian 1.15.1 (documentation vérifiée le 9 novembre 2026). Ses exemples ont été testés le 9 novembre 2026 dans Obsidian 1.15.0 (Windows 11) ; d’après le journal des versions, la 1.15.1 ne modifie pas Bases. Les exemples doivent être essayés sur une copie avant leur utilisation dans le coffre de travail.
Si vous découvrez Obsidian Bases, créez d’abord une première base avec le guide Obsidian Bases, puis revenez ici pour la syntaxe.

Sommaire 12 sections
Créer et intégrer une base
- Fichier
.base: palette de commandes → « Bases: Créer une nouvelle base », clic droit sur un dossier → « Nouvelle base », ou ruban → « Créer une nouvelle base ». Depuis la palette, le fichier va dans le dossier de la note active si le réglage des nouvelles notes du coffre vaut « même dossier que le fichier actuel », sinon dans le dossier fixé par ce réglage. - Bloc dans une note : « Bases: Insérer une nouvelle base », ou un bloc de code
basequi contient la même syntaxe qu’un fichier. - Intégrer un fichier :
![[Nom.base]]affiche la première vue de la liste ;![[Nom.base#Nom de la vue]]affiche une vue précise. Renommer une vue met à jour les liens et intégrations qui la citent (Obsidian 1.10.2).
filters:
and:
- file.hasTag("example")
views:
- type: table
name: Table
On modifie d’ordinaire une base dans l’interface ; Obsidian écrit le YAML. L’écrire à la main reste possible, à condition que le fichier soit du YAML valide.
Structure d’un fichier .base
Une base contient jusqu’à cinq sections : filters, formulas, properties, summaries et views. Exemple complet, d’après la documentation :
filters:
or:
- file.hasTag("tag")
- and:
- file.hasTag("book")
- file.hasLink("Textbook")
- not:
- file.hasTag("book")
- file.inFolder("Required Reading")
formulas:
formatted_price: 'if(price, price.toFixed(2) + " €")'
ppu: "(price / age).round(2)"
properties:
note.status:
displayName: Statut
formula.formatted_price:
displayName: "Prix"
summaries:
moyenne_arrondie: 'values.reduce(acc + value, 0) / values.length'
views:
- type: table
name: "Ma table"
limit: 10
groupBy:
property: note.age
direction: DESC
filters:
and:
- 'status != "done"'
- or:
- "formula.ppu > 5"
- "price > 2.1"
order:
- file.name
- note.age
- formula.ppu
- formula.formatted_price
summaries:
formula.ppu: Average
Les chemins de dossier se lisent depuis la racine du coffre : ici, Required Reading est un dossier de premier niveau.
| Section | Rôle |
|---|---|
filters | Conditions communes à toutes les vues. |
formulas | Propriétés calculées, utilisables dans toutes les vues. |
properties | Réglages par propriété, par exemple displayName (nom de colonne). Une propriété de note s’y écrit avec son préfixe (note.status) : sans préfixe (status), le réglage reste sans effet dans Obsidian 1.15.0. Les noms d’affichage ne servent ni aux filtres ni aux formules. |
summaries | Résumés personnalisés, à ne pas confondre avec la clé summaries d’une vue, qui attribue un résumé à une colonne. |
views | Liste des vues : chacune a son type, son nom, ses filtres, ses colonnes, ses tris et ses groupes. |
Filtres
Une base sans filtre contient tous les fichiers du coffre, pièces jointes comprises : il n’existe pas de from ou de source comme en SQL ou dans Dataview.
- Deux niveaux. Les
filtersglobaux et lesfiltersd’une vue s’appliquent ensemble : pour une vue, ils sont combinés par un ET. - Trois conjonctions.
and: toutes les conditions sont vraies ;or: au moins une est vraie ;not: le fichier est exclu dès qu’une des conditions du groupe est vraie. Les groupes s’imbriquent. - Une condition est une chaîne qui vaut vrai ou faux pour un fichier : une comparaison (
status == "open") ou une fonction (file.inFolder("Contacts")). La section peut aussi contenir une seule condition, sans conjonction. - Mêmes règles que les formules. Les filtres acceptent les mêmes opérateurs et les mêmes fonctions.
- Éditeur avancé. Le bouton de code d’une ligne du menu Filtre affiche la syntaxe brute et accepte les expressions que l’interface ne sait pas représenter. Depuis Obsidian 1.15 (2 novembre 2026), les filtres se réordonnent par glisser-déposer, avec la poignée à gauche de chaque ligne, et passent de la même façon de « Toutes les vues » à « Cette vue ». Dans l’interface française, les opérateurs restent en anglais (« in folder », « has tag », « is », « links to »).

file.inFolder(…)), la deuxième dans l’interface (extension, is, md).Capture Optimike, coffre de test Margelle, thème Le bord (Margelle 1.3.0), Windows 11, Obsidian 1.15.0, 9 novembre 2026filters:
and:
- file.inFolder("Projets")
- file.ext == "md"
- 'status != "done"'
- file.mtime > now() - "30d"
- '!file.hasTag("archive")'
Guillemets YAML : une condition qui commence par ! doit être entre guillemets, sinon YAML l’interprète comme un tag YAML. Mettez aussi entre guillemets les conditions qui contiennent : ou commencent par un caractère réservé ([, {, &, *). Pour un texte dans une condition, alternez les guillemets : 'status != "done"'.
Opérateurs
| Famille | Opérateurs | Exemple |
|---|---|---|
| Arithmétiques | + - * / % ( ) | (price / age).toFixed(2) |
| Comparaison | == != > < >= <= | priority >= 4 |
| Booléens | ! && || | !(status == "done") |
== et != comparent n’importe quel type de valeur ; les autres comparaisons portent sur des nombres ou des dates. Le + concatène aussi deux listes (Obsidian 1.9.8).
Dates et durées
On ajoute ou retire une durée à une date avec + ou - et une chaîne : file.mtime > now() - "1 week", today() + "7d", date("2024-12-01") + "1M" + "4h" + "3m".
| Unité | Écritures acceptées |
|---|---|
| année | y, year, years |
| mois | M, month, months |
| semaine | w, week, weeks |
| jour | d, day, days |
| heure | h, hour, hours |
| minute | m, minute, minutes |
| seconde | s, second, seconds |
now()donne la date et l’heure ;today()la date à minuit.- Soustraire deux dates donne une durée (
note.release_date - today()). La documentation a retiré, le 23 octobre 2026, l’ancienne mention d’une différence en millisecondes. Une formule du type(now() - file.ctime) / 86400000ne correspond donc plus à la documentation : dans Obsidian 1.15.0,((now() - file.ctime) / 86400000).toFixed(0)affiche l’erreur « Impossible de trouver la fonction “toFixed” sur le type Duration ». - Pour un nombre de jours, passez par
number(), qui renvoie une date en millisecondes depuis l’époque Unix :((number(now()) - number(file.ctime)) / 86400000).floor(). Testée le 9 novembre 2026, cette formule renvoie 30 pour une note créée le 10 octobre 2026 à 12 h.

number() ; Obsidian affiche « Valid formula » sous l’expression, et la colonne calcule 38, 87 et 141 jours.Capture Optimike, coffre de test Margelle, thème Le bord (Margelle 1.3.0), Windows 11, Obsidian 1.15.0, 9 novembre 2026- Pour un affichage lisible,
file.ctime.relative()renvoie une durée écrite dans la langue de l’interface, comme « il y a 7 minutes » (« 3 days ago » en anglais). duration("1d")n’est nécessaire que pour calculer sur des durées :now() + (duration("1d") * 2). La durée doit être à gauche :duration("5h") * 2affiche « 10 heures », alors que2 * duration("5h")affiche l’erreur « Invalid operator between Number and Duration ».
Propriétés : note, file, formula et this
- Propriétés de note : celles du frontmatter des fichiers Markdown.
note.auteur,note["auteur"]ou simplementauteur(sans préfixe, Bases suppose une propriété de note). - Propriétés de fichier : disponibles pour tous les types de fichiers, pièces jointes comprises.
- Propriétés de formule :
formula.nom, définies dans la sectionformulas.
| Propriété de fichier | Type | Contenu |
|---|---|---|
file.name | texte | nom du fichier |
file.basename | texte | nom sans l’extension |
file.path | texte | chemin depuis la racine du coffre |
file.folder | texte | chemin du dossier parent |
file.ext | texte | extension |
file.size | nombre | taille en octets |
file.ctime / file.mtime | date | création / dernière modification |
file.tags | liste | tags du contenu et du frontmatter |
file.links | liste | liens internes de la note, frontmatter compris |
file.embeds | liste | intégrations de la note |
file.backlinks | liste | fichiers qui pointent vers la note ; coûteux, et non rafraîchi automatiquement quand le coffre change |
file.properties | objet | toutes les propriétés ; non rafraîchi automatiquement quand le coffre change |
file.file | fichier | objet fichier, réservé à certaines fonctions |
Ce que désigne this
| Où est la base | this désigne |
|---|---|
| ouverte dans la zone principale | le fichier .base lui-même (this.file.folder = son dossier) |
| intégrée dans une note ou un canevas | la note ou le canevas qui l’intègre |
| dans la barre latérale | la note active de la zone principale |
En barre latérale, file.hasLink(this.file) reproduit le volet des rétroliens ; la forme courte file.hasLink(this) donne le même résultat dans Obsidian 1.15.0. Un lien se compare à un fichier : author == this est vrai si author pointe vers la note courante, et authors.contains(this) cherche dans une liste de liens.
Fonctions par type
Les fonctions de Bases suivent le comportement de JavaScript. Hors fonctions globales, elles s’appellent sur une valeur : file.name.lower(), tags.contains("urgent"). Pour appeler une fonction sur un nombre écrit en dur, entourez-le de parenthèses : (2.5).round().
Globales
| Fonction | Rôle |
|---|---|
if(condition, siVrai, siFaux?) | renvoie siVrai si la condition est vraie, sinon siFaux (ou null) |
now() / today() | date et heure actuelles / date du jour à minuit |
date("AAAA-MM-JJ HH:mm:ss") | convertit un texte en date |
duration("1d") | convertit un texte en durée |
number(valeur) | convertit en nombre ; une date devient des millisecondes, un booléen 1 ou 0 |
list(valeur) | renvoie une liste ; utile pour une propriété tantôt simple, tantôt liste |
link(chemin, affichage?) | crée un lien (ou une URL si le chemin en est une) |
file(chemin) | renvoie l’objet fichier d’un chemin ou d’un lien |
image(chemin) | affiche une image dans la vue |
icon("arrow-right") | affiche une icône Lucide |
html(texte) / escapeHTML(texte) | rend du HTML / échappe les caractères HTML |
max(a, b, …) / min(a, b, …) | plus grand / plus petit nombre |
random() | nombre entre 0 et 1, recalculé au chargement de la vue |
Toute valeur
isTruthy() (valeur convertie en booléen), isType("string") (vérifie le type), toString().
Date
Champs : year, month (1 à 12), day, hour, minute, second, millisecond. Fonctions : date() (retire l’heure), format("YYYY-MM-DD") (format Moment.js), time() (heure en texte), relative() (« il y a 7 minutes » en français), isEmpty() (toujours faux).
Texte
Champ : length. Fonctions : contains(), containsAll(), containsAny(), startsWith(), endsWith(), isEmpty(), lower(), title(), trim(), replace(motif, remplacement) (un texte remplace toutes les occurrences ; une expression régulière suit son drapeau g et accepte $1, $2), repeat(n), reverse(), slice(début, fin?), split(séparateur, n?).
Nombre
abs(), ceil(), floor(), round(décimales?), toFixed(décimales) (renvoie un texte), isEmpty().
Liste
Champ : length. Fonctions : contains(), containsAll(), containsAny(), isEmpty(), join(séparateur), filter(condition), map(expression), reduce(expression, valeurInitiale), flat(), reverse(), slice(), sort(), unique(). Dans filter, map et reduce, value désigne l’élément courant, index sa position et acc le cumul : [1,2,3].reduce(acc + value, 0) renvoie 6.
Lien, URL, fichier
- Lien :
asFile()(le fichier visé, s’il existe),linksTo(fichier). - URL : les fonctions de texte, pas celles des liens.
- Fichier :
asLink(affichage?),hasLink(autreFichier),hasProperty("nom"),hasTag("a", "b")(vrai si l’un des tags est présent, tags imbriqués compris ; insensible à la casse depuis 1.9.14),inFolder("dossier")(sous-dossiers compris ; le chemin part de la racine du coffre :file.inFolder("Required Reading")ne trouve pasProjets/Required Reading, il faut écrirefile.inFolder("Projets/Required Reading")).
Objet et expression régulière
- Objet (par exemple
file.properties) :isEmpty(),keys(),values(). - Expression régulière :
/abc/.matches("abcde").
La liste officielle, avec la signature de chaque fonction, est dans la documentation des fonctions.
Formules
Une formule se crée depuis le menu Propriétés (« Add formula » dans la documentation) ; d’après la documentation, l’éditeur complète les noms de fonctions et de propriétés. Il affiche « Valid formula » (en anglais) quand l’expression est valide. Dans le YAML :
formulas:
en_retard: 'if(due_date < now() && status != "Done", "En retard", "")'
score: "(impact * urgency) / effort"
echeance: 'start_date + "2w"'
nb_taches: "tasks.length"
- Une formule est toujours écrite comme un texte dans le YAML ; son type réel dépend du résultat.
toFixed()renvoie un texte : pour trier numériquement, gardez une formule numérique à part ((price / age).round(2)). - Les textes littéraux demandent des guillemets imbriqués :
'if(price, price.toFixed(2) + " €")'. - Une formule peut utiliser
formula.autre, sans référence circulaire, directe ou indirecte.
Lire les propriétés d’une note liée
Documenté depuis le 5 novembre 2026. Une propriété qui contient un lien, comme project: "[[Refonte du site]]", devient un fichier avec asFile(), dont on lit les propriétés :
formulas:
statut_projet: "project.asFile().properties.status"
statut_projet_sur: "list(project)[0].asFile().properties.status"
heures_total: "tasks.map(value.asFile().properties.hours).reduce(acc + value, 0)"
taches_ouvertes: 'tasks.filter(value.asFile().properties.status != "Done").length'
statuts_uniques: "tasks.map(value.asFile().properties.status).unique()"
heures_retroliens: "file.backlinks.map(value.asFile().properties.hours).reduce(acc + value, 0)"
La documentation prévient : ces résultats se mettent à jour quand la note de la ligne change ; si vous ne modifiez que la note liée, ils peuvent rester anciens jusqu’à la réouverture de la base. La dernière forme, fondée sur file.backlinks, est lente sur un grand coffre : mieux vaut stocker les liens dans la note elle-même.
Résumés
Un résumé calcule une valeur sur une colonne, pour les lignes visibles de la vue. Dans l’interface : clic droit sur l’en-tête de colonne d’un tableau → « Résumer… » (les noms des calculs restent en anglais). Le résultat s’affiche en bas de colonne et, si la vue est groupée, en tête de chaque groupe.
| Résumé | Type d’entrée | Résultat |
|---|---|---|
Average, Median, Stddev | nombre | moyenne, médiane, écart type |
Min, Max, Sum, Range | nombre | plus petit, plus grand, somme, écart max − min |
Earliest, Latest, Range | date | plus ancienne, plus récente, écart |
Checked, Unchecked | case à cocher | nombre de vrais, de faux |
Empty, Filled, Unique | tout type | valeurs vides, remplies, distinctes |
Un résumé personnalisé est une formule sur values, la liste des valeurs de la colonne, et doit renvoyer une seule valeur. On le déclare dans la section summaries de la base, puis on l’attribue à une colonne dans la clé summaries de la vue :
summaries:
total_arrondi: "values.reduce(acc + value, 0).round(1)"
views:
- type: table
name: Heures
summaries:
hours: total_arrondi
file.name: Filled
Clés d’une vue
| Clé | Rôle | Source |
|---|---|---|
type | table, list, cards, kanban, map (avec le plugin Maps) ou un type ajouté par un plugin | documentation |
name | nom affiché ; sert à viser la vue dans ![[Nom.base#Nom]] | documentation |
filters | filtres propres à la vue | documentation |
order | colonnes affichées et leur ordre ; ne trie pas les lignes | documentation |
limit | nombre maximal de lignes (le menu Résultats fait la même chose : « Limiter le nombre de résultats ») | documentation |
groupBy | property et direction (ASC ou DESC) | documentation |
groupOrder | groupes affichés, dans cet ordre ; null pour les fichiers sans valeur (groupe « Aucun » ; l’interface écrit un élément vide) ; un groupe absent de la liste est masqué ; une liste vide masque tous les groupes | documentation ; testé dans Obsidian 1.15.0 |
summaries | résumé attribué à chaque colonne | documentation |
sort | liste de tris, chacun avec property et direction | écrite par Obsidian (Trier → « Ajouter un tri ») ; une sort écrite à la main est appliquée et reprise dans le menu Trier (testé dans Obsidian 1.15.0) ; non décrite dans la page de syntaxe |
views:
- type: kanban
name: Projets
groupBy:
property: note.status
direction: ASC
groupOrder:
- Planifié
- En cours
- Fait
- null
sort:
- property: file.mtime
direction: DESC
Chaque mise en page enregistre aussi ses propres réglages dans la vue (image des cartes, hauteur de ligne, marqueurs de liste…). Ils se règlent dans l’interface ; les clés observées sont listées dans Vues et propriétés, qui détaille aussi le choix et le réglage de chaque vue.
Pièges fréquents
- Références circulaires entre formules : A peut utiliser B, mais B ne peut pas utiliser A.
file.backlinkssur un grand coffre : évitez-le. Inversez la recherche avecfile.links, oufile.hasLink(this.file)en barre latérale, et réduisez le nombre de lignes aveclimit.- Guillemets YAML : entourez les conditions qui commencent par
!et alternez simples et doubles guillemets autour des textes. - Types hétérogènes : une propriété tantôt texte, tantôt liste fausse les filtres.
list(valeur)uniformise ; mieux vaut corriger les notes. - Opérateur « exists » : supprimé en 1.9.8 ; utilisez
file.hasProperty("nom"). toFixed()puis tri : le résultat est un texte. Dans Obsidian 1.15.0, un tri sur « 5.00 », « 9.00 » et « 10.00 » suit pourtant l’ordre numérique ; d’autres formats de texte n’ont pas été testés. Pour trier, gardez une formule numérique (round(2)).- Âge en millisecondes : la soustraction de deux dates donne une durée ; passez par
number()(voir « Dates et durées »).
FAQ Bases
Puis-je trier sur une formule ?
Oui : choisissez la formule dans le menu Trier de la vue, puis sa direction. order organise les colonnes et ne suffit pas à trier les résultats.
Comment limiter les résultats ?
Avec le menu Résultats de la vue (« Limiter le nombre de résultats »), ou la clé limit (par exemple limit: 50).
Comment filtrer par période ?
file.mtime > now() - "7d" pour les sept derniers jours ; today() pour comparer des dates sans heure.
Un bloc base peut-il remplacer un fichier .base ?
Oui : collez la même syntaxe YAML dans le bloc. Le fichier reste préférable si plusieurs notes intègrent la même base.
Comment repérer les notes sans une propriété ?
'!file.hasProperty("statut")', ou groupOrder avec null dans un kanban groupé par cette propriété.
Un exemple minimal à vérifier sur copie
Dans un coffre d’essai séparé, créez le dossier Bases-essai avec une note status: open et une note status: done. Ajoutez une troisième note status: open hors de ce dossier. Les valeurs sont des propriétés de texte dans le frontmatter. Cet exemple doit afficher uniquement la note ouverte du dossier ; les deux autres servent de témoins négatifs.
filters:
and:
- file.inFolder("Bases-essai")
- file.ext == "md"
views:
- type: table
name: "À reprendre"
filters:
and:
- note.status == "open"
order:
- file.name
- note.status
Copiez ce YAML dans un fichier .base ou dans un bloc base d’une note. Cet extrait a été testé le 9 novembre 2026 dans Obsidian 1.15.0 (Windows 11), avec le dossier placé dans un sous-dossier du coffre d’essai et son chemin complet dans le filtre : seule la note ouverte du dossier apparaît. Notez la version et vérifiez les résultats avant d’utiliser votre contenu réel.
Cette référence a été confrontée le 9 novembre 2026 à la syntaxe officielle de Bases, aux réglages des vues, aux fonctions documentées, à la page Formulas et au journal des versions jusqu’à Obsidian 1.15.1. La clé sort est relevée dans des fichiers .base écrits par l’application. Les exemples ont été testés le 9 novembre 2026 dans Obsidian 1.15.0 (Windows 11) ; les extraits ne constituent pas un benchmark de performance.
Chez Optimike, une vue sert à retrouver une référence ou à reprendre un travail. Gardez les règles de filtre lisibles, contrôlez une note qui doit apparaître et une note qui doit rester exclue, puis laissez la personne responsable valider ce qui fait foi.