heptazero57 downloadsMaps resource collections to index notes through the source property, with sidecar/folder layouts and a paired source view.
Att Meta Map turns resource collections into index notes in Obsidian. The model is deliberately simple: source defines the relationship, the template defines the fields, and the mapping defines where other values come from.
Forked from Attachments Library by José Compadre Junior (MIT).
Every managed note has a fixed source property containing one wikilink or a list of wikilinks. That property is the only authority for deciding which resources belong to the note.
source entry and lets you open or explicitly unbind it. Unbinding never deletes a file.0, the next level is depth 1, and so on.At any configured depth, a loose resource is folded into its matching item folder and, when enabled, gets a note beside it. If its current parent already matches the item name, that folder is reused and only the note is created. Existing source relations remain authoritative and are never folded again.
Folder groups can recognize several companion prefixes such as cn_, zh_, or slides_. A companion whose remaining name matches an existing item joins that item folder and is appended to the note's source list.
Each group selects one Markdown template. Its frontmatter keys are the allow-list for the note; a global mapping says which source may fill each key.
Available sources include:
Several sources may map to the same property. The first non-empty value wins, so filename or PDF metadata is not overwritten by a later network result. Re-extraction shows the current and incoming values side by side; nothing is overwritten without the selected row.
Attachment rules move and rename files that are outside every mapping-group resource root.
{{basename}}, {{parent}}, {{note}}, and {{index}}.{{index}} is recalculated from a complete target snapshot and uses the smallest available positive integers, so a folder containing 1 and 82 can be compacted to 1 and 2.Mapping-group roots are a hard protection boundary. General rules never touch files already owned by a group. Rules are manual only and always show the complete change tree before confirmation.
After Att Meta Map is accepted into the Obsidian Community directory, install it from Settings → Community plugins → Browse.
Until then, add Heptazero/obsidian-attach-meta-map in BRAT, or download main.js, manifest.json, and styles.css from the latest release into:
<vault>/.obsidian/plugins/att-meta-map/
Then reload Obsidian and enable Att Meta Map under Community plugins.
The model has three rules:
source is fixed. It is not part of the configurable metadata mapping.PDF author → author is configured but the template has no author key, nothing is written.The template is therefore the field switch. Att Meta Map always maintains source; every other property must be accepted by both the template and the mapping.
Sidecar groups configure a resource root and a note root separately. Resources are never moved by the mapping feature. Notes may mirror the resource subfolder structure or remain flat.
Folder groups configure only one collection root and the exact depth where loose attachments may appear.
source relation exists, folder names may be changed freely because they do not define the relationship.Disable Create a note for new attachments when you only want folder organization. The item folder is still created or reused, but templates, metadata extraction, and note maintenance are disabled for that group.
Att Meta Map automatically discovers the Templater templates_folder and the core Templates folder. Additional template folders can be added in settings.
The template body is copied to each new note. Existing frontmatter values such as type: paper or status: active are preserved. Templater <% ... %> blocks are removed rather than executed, because commands such as tp.file.move() can move the new note outside the configured relationship boundary. Run Templater manually afterward when dynamic template behavior is needed.
With no selected template, Att Meta Map uses a minimal built-in set: source, title, author, created, and updated. Empty properties are omitted.
Note and link templates support:
{{basename}}, {{name}}, {{ext}}, {{path}}, and {{folder}}{{year}} and {{title}}, parsed from common Author - Year - Title filenamesIf a note-name template requires {{year}} but the filename has no year, the whole template falls back to the safe filename instead of producing a malformed partial name. Ambiguous extensionless links are automatically rewritten so [[paper]] does not resolve to paper.md instead of paper.pdf.
| Command | Action |
|---|---|
| Open paired view | Opens resources on the left and reuses one note tab on the right; creates a missing note when allowed |
| Re-extract metadata | Shows current and incoming values side by side and applies only selected rows |
| Unbind current resource | Removes selected source relationships after confirmation without moving or deleting files |
| Open resource relations | Opens the side panel for all source entries of the current note or resource |
| Backfill missing notes | Scans groups, previews every move/note/source change, then applies only after confirmation |
| Organize attachments linked by current note | Applies general attachment rules to unmanaged links from the active note |
File-menu actions also organize one note's attachments, one attachment, one folder, or one folder recursively. Every entry uses the same planner, preview, and guarded executor.
In change previews, red − means a file leaves its old path; it does not mean deletion. Green + means a new path, note, or source value will appear. Cancelling performs zero writes.
Mapping groups register create, rename, and modify listeners while the plugin is enabled. Scripts, sync tools, and Git operations may therefore trigger the same events as changes made in Obsidian. General attachment rules do not register automatic listeners.
Att Meta Map never listens for delete and never automatically deletes notes. If a resource disappears, the note and its inspectable broken source link remain.
Additional boundaries:
Changes to data.json are loaded only when the plugin starts. Disable and re-enable the plugin, use View → Force Reload, or restart Obsidian after editing that file externally.
The interface can follow Obsidian or be switched directly between Chinese and English. Translation keys are kept in src/i18n/locales/en.json and src/i18n/locales/zh.json; UI code does not contain parallel hard-coded copies.
The implementation keeps deterministic policy separate from Obsidian mutations:
settings-model.ts owns defaults and persisted-setting normalization.sources.ts resolves metadata; metadata-types.ts contains its shared data model.metadata-diff.ts defines refresh and safe-fill decisions without depending on a modal.paths.ts owns deterministic folder, name, and link policy.creation-plan.ts defines previewable note/folder changes.attachment-rules.ts plans general attachment moves; attachment-organizer.ts executes confirmed plans.note-manager.ts is the Obsidian-facing service that resolves relationships and performs guarded note operations.npm install
npm run pipeline
The pipeline runs the Obsidian lint rules, unit tests with coverage, TypeScript checking, and the production bundle. Obsidian releases contain main.js, manifest.json, and styles.css.
Issues and contributions are welcome in the GitHub repository.
MIT. See LICENSE. Original Attachments Library copyright belongs to José Compadre Junior.