An Obsidian plugin that automatically creates pages from unresolved wikilinks when you move to a new line. No clicks, no modals, no interruptions.
You type [[People/Johnny Appleseed]] in a note. You press Enter. Link Forge:
People/Johnny Appleseed.md (and any missing parent folders)[[Johnny Appleseed]] (if it resolves uniquely)All silently, in the background, while you keep writing.
EditorView.updateListener to process links only when you leave a line (not on every keystroke)[[Folder/Name]] to [[Name]] when the basename resolves uniquely[[People/Name#Bio|Their Bio]] shortens to [[Name#Bio|Their Bio]]main.js, manifest.json, and styles.css from the latest release<your-vault>/.obsidian/plugins/link-forge/Every release is built in GitHub Actions with build provenance attestation. You can verify any artifact:
gh attestation verify main.js --repo philpalmieri/obsidian-link-forge
This proves the artifact was built from this repo's source code in CI, not locally tampered with.
Open Settings → Link Forge:
| Setting | Default | Description |
|---|---|---|
| Enabled | true |
Global toggle |
| Watched folders | (empty) | Only auto-create for links targeting these folders (comma-separated). Empty = all folders. |
| Shorten links after creation | true |
Rewrite to shortest unique path after file exists |
Link Forge works seamlessly with Templater. When Link Forge creates a new file, Templater's built-in "Trigger on file creation" feature automatically applies your configured folder templates. No additional configuration needed in Link Forge; just set up your folder templates in Templater's settings as usual.
Link Forge registers a CodeMirror 6 editor extension that fires when the cursor moves to a different line. When you leave a line:
[[wikilinks]] from that linemetadataCache.getFirstLinkpathDest() to see if the file existsvault.create()This means it only activates on line changes (Enter, arrow keys, mouse click to another line), not on every keystroke.
# Install dependencies
npm install --legacy-peer-deps
# Watch mode (rebuilds on change)
npm run dev
# Run tests
npm test
# Lint
npm run lint
# Typecheck
npm run typecheck
# Production build
npm run build
Symlink into your vault for live development:
ln -s /path/to/obsidian-link-forge/main.js <vault>/.obsidian/plugins/link-forge/main.js
ln -s /path/to/obsidian-link-forge/manifest.json <vault>/.obsidian/plugins/link-forge/manifest.json
Reload Obsidian with Cmd+R. Open the dev console with Cmd+Option+I to see [Link Forge] log messages.
manifest.json and package.jsonversions.json with the new version → minimum Obsidian version mappinggit tag <version> (e.g. 1.0.3)git push origin main --tagsThis plugin uses GitHub Artifact Attestations powered by Sigstore to provide verifiable build provenance for every release. This means:
main.js in a release is cryptographically tied to a specific source commitgh attestation verifyThe Obsidian community plugin ecosystem currently has no verification mechanism for plugin builds. This is a small step toward supply chain security best practices, built by someone who works on these problems professionally.
MIT