Skip to content

[Bug]: Agenda search does not match task titles stored in filenames #2121

Description

@maks-io

Bug Description

The text search in a TaskNotes Agenda/Base view does not match task titles when "Store title in filename" is enabled.

The task is displayed with the correct title in the Agenda and in the Edit Task modal, but searching for a word visibly contained in that title returns 0 results.

Example:

  • Filename: Prepare Breakfast.md
  • Visible task title: Prepare Breakfast
  • Search term: Breakfast
  • Result: Showing 0

Steps to Reproduce

  1. Make sure task titles are only in the filename but not in the file.name field
  2. Go to a Agenda/Base view that shows a list of tasks that includes the task from 1.
  3. Do a text search in Agenda/Base view for some (sub)string of this filename
  4. Task does not appear in search results

TaskNotes Debug Info

SYSTEM INFO:
	Obsidian version: 1.12.7
	Installer version: 1.10.3
	Operating system: Darwin Kernel Version 25.3.0: Wed Jan 28 20:56:34 PST 2026; root:xnu-12377.91.3~2/RELEASE_ARM64_T8122 25.3.0
	Login status: logged in
	Language: en
	Catalyst license: none
	Insider build toggle: off
	Live preview: on
	Base theme: adapt to system
	Community theme: none
	Snippets enabled: 0
	Restricted mode: off
	Plugins installed: 19
	Plugins enabled: 19
		1: Advanced Tables v0.23.2
		2: Color Folders and Files v1.4.1
		3: Dataview v0.5.68
		4: Importer v1.8.12
		5: Ink v0.3.4
		6: Style Settings v1.0.9
		7: Recent Files v1.7.9
		8: Omnisearch v1.29.3
		9: Notebook Navigator v3.2.3
		10: Note Locker v1.3.1
		11: Linter v1.32.0
		12: Iconic v1.1.9
		13: Highlightr v1.2.2
		14: File Hider v1.1.1
		15: Excalidraw v2.25.3
		16: Templater v2.20.6
		17: TaskNotes v4.11.1
		18: Sheet Plus v2.12.7
		19: Editing Toolbar v4.0.11

RECOMMENDATIONS:
	Community plugins: for bugs, please first try updating all your plugins to latest. If still not fixed, please try to make the issue happen in the Sandbox Vault or disable community plugins.

Affected Task Frontmatter

---
status: open
priority: normal
scheduled: 2026-07-16
dateCreated: 2026-07-16T09:50:45.989+02:00
dateModified: 2026-07-16T09:50:45.989+02:00
taskSourceType: taskNotes
---

Relevant Bases File Content

filters:
  and:
    - status != "done"
    - formula.isToday == true
    - recurrence.isEmpty()
formulas:
  priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
  daysUntilDue: if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)
  daysUntilScheduled: if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
  daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
  daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
  isOverdue: due && date(due) < today() && status != "done"
  isDueToday: due && date(due).date() == today()
  isDueThisWeek: due && date(due).date() >= today() && date(due).date() <= today() + "7d"
  isScheduledToday: scheduled && date(scheduled).date() == today()
  isRecurring: recurrence && !recurrence.isEmpty()
  hasTimeEstimate: timeEstimate && timeEstimate > 0
  timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
  efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
  timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).date() == today()).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  dueMonth: if(due, date(due).format("YYYY-MM"), "No due date")
  dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date")
  scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")
  scheduledWeek: if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
  dueDateCategory: if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() <= today() + "7d", "This week", "Later")))))
  timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
  ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
  createdMonth: file.ctime.format("YYYY-MM")
  modifiedMonth: file.mtime.format("YYYY-MM")
  priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
  projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
  contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
  trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
  nextDate: if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))
  daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))
  hasDate: due || scheduled
  isToday: (due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())
  isThisWeek: (due && date(due).date() >= today() && date(due).date() <= today() + "7d") || (scheduled && date(scheduled).date() >= today() && date(scheduled).date() <= today() + "7d")
  nextDateCategory: if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due).date() <= today() + "7d") || (scheduled && date(scheduled).date() <= today() + "7d"), "This week", "Later")))))
  nextDateMonth: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))
  nextDateWeek: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))
  urgencyScore: if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext) + (1 - ((number(date(formula.nextDate)) - number(date(formula.nextDate).date())) / 86400000)))
  timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
  dueDateDisplay: if(!due, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).date() <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))
views:
  - type: tasknotesTaskList
    name: Agenda
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - property: formula.priorityWeight
        direction: DESC
      - property: due
        direction: ASC
    options:
      showPropertyBasedEvents: false
    calendarView: listWeek
    startDateProperty: file.ctime
    listDayCount: 7
    titleProperty: file.basename

Relevant Settings or Customizations

No response

Console Errors or Logs


Screenshots or Screen Recording

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    Status
    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions