# Title First Search An Obsidian plugin that searches note **titles** first, then hands the same query to the core full-text search when you need it. Obsidian's search can sort by date, modification time, or name β€” but there is no "scan every title first, then look inside the notes" option. When you know the answer is in a title, it gets buried under body matches. This plugin gives you that missing first pass. ## How it works There are two ways to use it. The first needs no setup at all. ### 1. In the core search panel Open Obsidian's normal search. A **Title matches** section appears above the usual results, listing the notes whose *filename* matched, ordered by where the match landed. The rest of the results are untouched below it. ``` πŸ” meeting ────────────────────────── TITLE MATCHES 3 Meeting notes 2026-08-19 Weekly meeting recap Meeting room booking ────────────────────────── Project A …at today's meeting we… Budget memo …the meeting concluded… ``` Nothing to configure and no hotkey to learn β€” enable the plugin and it is there. If the section is empty, nothing matched a filename. This part reaches into Obsidian's internals, which are not a public API. If a future Obsidian update changes them, the section quietly stops appearing and everything else keeps working. ### 2. The title-only modal Run the command **Search titles first**. A modal opens. ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ meeting β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ > Meeting notes 2026-08-19 Work β”‚ ← starts with the query β”‚ Meeting checklist β”‚ β”‚ Weekly meeting recap Work β”‚ ← starts a word β”‚ Allhandsmeeting agenda β”‚ ← mid-word β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ πŸ” Search in file contents: meetingβ”‚ ← always last β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` - Titles are matched by **substring**, not fuzzy β€” what you type is what you get. - Every space-separated token must appear in the filename, in any order. - The last row is always there. Pick it and the core search panel opens with the same query, so nothing is lost when the title pass comes up short. - With an empty query you get your 10 most recently modified notes. ### Ranking Matches are ordered by where the query lands in the title: | Rank | Rule | |---|---| | 1 | Sum of match tiers β€” start of title `0`, start of a word `1`, mid-word `2` | | 2 | Shorter title first | | 3 | Recently modified first | | 4 | Alphabetical, then by path | Only the filename is matched. Folder paths and aliases are not β€” the path shown on the right is there to tell same-named notes apart. ## Hotkey No hotkey is assigned by default, on purpose: Obsidian's plugin guidelines advise against default hotkeys because they collide with other plugins. Assign your own in **Settings β†’ Hotkeys**, search for *Search titles first*. `Ctrl/Cmd + Shift + O` sits next to the built-in quick switcher and is a good fit. ## Installation ### From the community plugin list Not yet listed. ### Manual 1. Download `main.js`, `manifest.json`, and `styles.css` from the [latest release](https://github.com/SKKUKang/obsidian-title-first-search/releases). 2. Put them in `/.obsidian/plugins/title-first-search/`. 3. Reload Obsidian, then enable the plugin under **Settings β†’ Community plugins**. ## Development ```bash npm install npm test # unit tests for the ranking logic npm run build # type-check and bundle to main.js npm run dev # build, then copy into a vault for testing ``` `npm run dev` needs to know which vault to install into. Either set `OBSIDIAN_VAULT`, or create `vault.local.json` in the repo root: ```json { "vault": "C:\path\to\MyVault" } ``` It only ever writes to `/.obsidian/plugins/title-first-search/`. `src/ranking.ts` deliberately does not import `obsidian`, so the matching and sorting logic can be tested as plain functions. ## License MIT --- ## ν•œκ΅­μ–΄ λ…ΈνŠΈ **제λͺ©(파일λͺ…)** 을 λ¨Όμ € ν›‘μ–΄ 보여주고, κ±°κΈ°μ„œ λͺ» 찾으면 같은 검색어λ₯Ό **μ½”μ–΄ λ³Έλ¬Έ 검색**으둜 λ„˜κΈ°λŠ” Obsidian ν”ŒλŸ¬κ·ΈμΈ. λͺ…λ Ήμ–΄λŠ” **Search titles first**. κΈ°λ³Έ λ‹¨μΆ•ν‚€λŠ” μ—†μœΌλ―€λ‘œ **μ„€μ • β†’ 단좕킀** μ—μ„œ 직접 ν• λ‹Ήν•œλ‹€ (`Ctrl + Shift + O` μΆ”μ²œ). - 제λͺ©μ€ fuzzy κ°€ μ•„λ‹ˆλΌ **λΆ€λΆ„ λ¬Έμžμ—΄** 둜 λ§€μΉ­ν•œλ‹€. 친 λŒ€λ‘œ λ‚˜μ˜¨λ‹€. - 곡백으둜 λ‚˜λˆˆ 토큰이 **μ „λΆ€** 파일λͺ…에 μžˆμ–΄μ•Ό ν•œλ‹€. μˆœμ„œλŠ” 상관없닀. - λͺ©λ‘ 맨 μ•„λž˜ "λ³Έλ¬Έμ—μ„œ 검색" ν•­λͺ©μ€ **항상** μžˆλ‹€. κ³ λ₯΄λ©΄ μ½”μ–΄ 검색 νŒ¨λ„μ΄ 같은 κ²€μƒ‰μ–΄λ‘œ μ—΄λ¦°λ‹€. - 검색어가 λΉ„λ©΄ 졜근 μˆ˜μ •ν•œ λ…ΈνŠΈ 10개λ₯Ό 보여쀀닀. 정렬은 맀치 μœ„μΉ˜ μš°μ„ μ΄λ‹€: 제λͺ© 맨 μ•ž β†’ 단어 μ‹œμž‘ β†’ 단어 쀑간 순. 같은 등급이면 짧은 제λͺ© β†’ 졜근 μˆ˜μ • β†’ μ‚¬μ „μˆœ. 폴더 κ²½λ‘œμ™€ 별칭(alias)은 λ§€μΉ­ λŒ€μƒμ΄ μ•„λ‹ˆλ‹€. 였λ₯Έμͺ½μ— 흐리게 λœ¨λŠ” κ²½λ‘œλŠ” 같은 μ΄λ¦„μ˜ λ…ΈνŠΈλ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•œ ν‘œμ‹œμΌ 뿐이닀.