{"id":33751906,"url":"https://github.com/kdnk/obsidian-automatic-linker","last_synced_at":"2026-05-30T02:02:24.930Z","repository":{"id":275381194,"uuid":"925696679","full_name":"kdnk/obsidian-automatic-linker","owner":"kdnk","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-06T14:19:39.000Z","size":664,"stargazers_count":36,"open_issues_count":5,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-06T16:09:29.674Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://obsidian.md/plugins?id=automatic-linker","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kdnk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-01T14:20:02.000Z","updated_at":"2026-04-06T14:04:47.000Z","dependencies_parsed_at":"2025-02-02T05:23:00.919Z","dependency_job_id":"ccbfac66-bbc3-4d04-a222-0c35f82cf788","html_url":"https://github.com/kdnk/obsidian-automatic-linker","commit_stats":null,"previous_names":["kdnk/obsidian-automatic-linker"],"tags_count":109,"template":false,"template_full_name":"obsidianmd/obsidian-sample-plugin","purl":"pkg:github/kdnk/obsidian-automatic-linker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdnk%2Fobsidian-automatic-linker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdnk%2Fobsidian-automatic-linker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdnk%2Fobsidian-automatic-linker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdnk%2Fobsidian-automatic-linker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kdnk","download_url":"https://codeload.github.com/kdnk/obsidian-automatic-linker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdnk%2Fobsidian-automatic-linker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33677261,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-12-05T06:04:28.354Z","updated_at":"2026-05-30T02:02:24.924Z","avatar_url":"https://github.com/kdnk.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🪄 Automatic Linker 🔮\n\nAutomatically convert plain text file references into Obsidian wiki links as you write. Keep your knowledge graph connected without manual linking.\n\n## Overview\n\nAutomatic Linker scans your notes and intelligently converts text that matches file names in your vault into wiki links (`[[...]]`). Whether you're writing quick notes or maintaining a complex knowledge base, this plugin ensures your notes stay interconnected without interrupting your flow.\n\n## Installation\n\n### From Obsidian Community Plugins\n\n1. Open Settings → Community plugins\n2. Disable Safe mode\n3. Browse for \"Automatic Linker\"\n4. Click Install, then Enable\n\n### Manual Installation\n\n1. Download the latest release from [GitHub Releases](https://github.com/kdnk/obsidian-automatic-linker/releases)\n2. Extract `main.js`, `manifest.json`, and `styles.css` to your vault's `.obsidian/plugins/automatic-linker/` directory\n3. Reload Obsidian and enable the plugin in Settings → Community plugins\n\n## Key Features\n\n### Automatic Link Conversion\n\nThe plugin automatically detects file names in your text and converts them to wiki links. It works seamlessly with:\n\n- **Format on Save**: Automatically convert links when saving files\n- **Selected Text**: Convert only highlighted text via command palette\n- **Entire Vault**: Batch process all files in your vault at once\n- **CJK Support**: Full support for Japanese, Chinese, Korean, and other CJK languages\n- **Case Sensitivity**: Optional case-insensitive matching\n\n### AI Link Enhancer (Beta)\n\nResolve ambiguous links and correct existing ones using AI:\n\n- **Disambiguation**: When multiple notes have the same name or alias, the AI selects the most appropriate one based on context.\n- **Link Correction**: Automatically verify and correct existing wiki links if a better candidate is found.\n- **Local LLM Support**: Connect to any OpenAI-compatible local AI server (e.g., LM Studio, Ollama).\n- **Context-Aware**: Uses surrounding text to provide the AI with necessary context for accurate linking.\n\n### Smart Namespace Management\n\nOrganize large vaults with sophisticated namespace handling:\n\n- **Base Directory**: Use Obsidian's \"Folder to create new notes in\" setting as the base directory where folder prefixes are omitted from links\n- **Proximity-based Linking**: Automatically resolve shorthand links to their full namespaced paths\n- **Namespace Scope**: Use `automatic-linker-scoped: true` in frontmatter to restrict linking to files within the same namespace\n- **Closest Match Selection**: When multiple candidates exist, the plugin selects the file closest to your current note\n\n### URL Formatting\n\nTransform raw URLs into readable Markdown links automatically:\n\n- **GitHub URLs**: Convert `https://github.com/user/repo/issues/123` to `[user/repo#123](URL)`\n- **GitHub Enterprise**: Configure custom GitHub Enterprise domains\n- **Jira URLs**: Format Jira issue links with custom domain support\n- **Linear URLs**: Format Linear issue links\n- **Page Titles**: Fetch and replace bare URLs with `[Page Title](URL)` format (cached to minimize requests)\n\n### Advanced Link Control\n\nFine-tune linking behavior to match your workflow:\n\n- **Alias Support**: Reference files by any of their frontmatter aliases\n- **Prevent Linking**: Add `automatic-linker-exclude: true` to frontmatter to exclude files from auto-linking\n- **Prevent Self-Linking**: Avoid creating links from a file to itself\n- **Remove Aliases**: Automatically strip aliases in specified directories\n- **Month Note Handling**: Ignore single/double digit references (1, 01, 12) unless namespaced\n- **Date Format Ignoring**: Skip date-formatted text (e.g., `2025-02-10`) for compatibility with Obsidian Tasks\n\n### Quality of Life Features\n\n- **Exclude Directories**: Prevent auto-linking in specified folders\n- **Preserve Existing Links**: Never reformats already-linked text\n- **Copy Without Links**: Copy note content with wiki links converted back to plain text\n- **Copy Selection Without Links**: Copy selected lines with minimal indentation and wiki links removed (supports path-style links like `[[path/to/file]]`)\n- **Debug Mode**: Detailed logging for troubleshooting\n- **Load Notices**: Optional notifications when files are processed\n\n## Commands\n\nAccess these commands via the Command Palette (Cmd/Ctrl + P):\n\n| Command | Description |\n|---------|-------------|\n| **Automatic Linker: Format file** | Convert text to links in the current file |\n| **Automatic Linker: Format selection** | Convert only selected text to links |\n| **Automatic Linker: Format vault** | Batch process all files in your vault |\n| **Automatic Linker: Run AI Link Enhancer** | Use AI to resolve ambiguous links in the current file |\n| **Automatic Linker: Copy file without links** | Copy current file content with links as plain text |\n| **Automatic Linker: Copy selection without links** | Copy selected lines with minimal indent and links removed |\n| **Automatic Linker: Rebuild index** | Rebuild the file index for link candidates |\n\n## Configuration\n\n### General Settings\n\n- **Format on Save**: Enable automatic linking when saving files\n- **Format Delay**: Delay in milliseconds before formatting (useful for plugin integration)\n- **Respect 'Folder to create new notes in' setting**: Use Obsidian's \"Folder to create new notes in\" setting as the base directory for omitting folder prefixes in links\n\n### Link Behavior\n\n- **Include Aliases**: Include frontmatter aliases when matching text\n- **Proximity-based Linking**: Automatically resolve shorthand to full namespaced links\n- **Ignore Case**: Enable case-insensitive link matching\n- **Prevent Self-Linking**: Don't create links from a file to itself\n- **Ignore Date Formats**: Skip date-formatted text like `2025-02-10`\n\n### URL Formatting\n\n- **Format GitHub URLs**: Convert GitHub links to readable format\n- **GitHub Enterprise URLs**: Add custom GitHub Enterprise domains\n- **Format Jira URLs**: Convert Jira issue links\n- **Jira URLs**: Configure Jira domain(s)\n- **Format Linear URLs**: Convert Linear issue links\n\n### AI Link Enhancement (Beta)\n\n- **Enable AI Link Enhancement**: Add a command to resolve links using a local LLM.\n- **AI API Endpoint**: URL of your OpenAI-compatible AI server (e.g., `http://localhost:1234/v1`).\n- **AI Model**: Name of the model to use (e.g., `gemma-2-9b`).\n- **Max Context Length**: Number of characters around the link to provide as context to the AI.\n\n### Advanced Options\n\n- **Replace URLs with Titles**: Automatically fetch page titles for bare URLs\n- **Ignored Domains**: Exclude specific domains from URL title replacement\n- **Exclude Directories**: List of directories to skip during auto-linking\n- **Remove Alias in Directories**: Strip aliases from links in specified folders\n\n### Integration\n\n- **Run Obsidian Linter After Formatting**: Chain with Obsidian Linter plugin\n- **Run Prettier After Formatting**: Chain with Prettier plugin\n- **Show Load Notice**: Display notifications when files are loaded\n- **Debug Mode**: Enable verbose logging\n\n## Usage Examples\n\n### Example 1: Basic Linking\n\nYou have files: `Python.md`, `JavaScript.md`, `pages/TypeScript.md`\n\nWhen you type:\n```\nI'm learning Python and JavaScript for web development.\n```\n\nIt becomes:\n```\nI'm learning [[Python]] and [[JavaScript]] for web development.\n```\n\n### Example 2: Proximity-based Linking\n\nWith Obsidian's \"Folder to create new notes in\" set to `pages/` and \"Respect 'Folder to create new notes in' setting\" enabled, along with Proximity-based Linking enabled:\n\nFile structure:\n```\npages/\n  languages/\n    Python.md\n    TypeScript.md\n  frameworks/\n    React.md\n```\n\nCurrent file: `pages/frameworks/React.md`\n\nWhen you type: `React uses TypeScript`\n\nIt becomes: `[[frameworks/React]] uses [[languages/TypeScript]]`\n\n### Example 3: Namespace Scope\n\nFile `pages/team-a/internal.md` has frontmatter:\n```yaml\n---\nautomatic-linker-scoped: true\n---\n```\n\nCurrent file: `pages/team-a/notes.md`\n\nTyping `internal` creates `[[team-a/internal]]` ✅\n\nFrom `pages/team-b/notes.md`, typing `internal` won't link ❌\n\n### Example 4: URL Formatting\n\nBefore:\n```\nCheck out https://github.com/obsidianmd/obsidian-releases/issues/1234\n```\n\nAfter:\n```\nCheck out [obsidianmd/obsidian-releases#1234](https://github.com/obsidianmd/obsidian-releases/issues/1234)\n```\n\n### Example 5: Copy Selection Without Links\n\nWhen you select part of a nested list:\n\nSelection in editor:\n```\n    - Priority about [[PBI]]\n        - High priority for near deadline\n    - Chapter [[PBI]]\n        - Up to 30% [[story point]] in sprint backlog\n```\n\nAfter running \"Copy selection without links\", clipboard contains:\n```\n- Priority about PBI\n\t- High priority for near deadline\n- Chapter PBI\n\t- Up to 30% story point in sprint backlog\n```\n\nFeatures:\n- Removes minimal indentation from selected lines\n- Converts path-style links: `[[path/to/file]]` → `file`\n- Preserves relative indentation structure\n- Gets full lines even if partially selected\n\n## Integration with Obsidian Linter\n\nTo avoid conflicts when using both plugins:\n\n1. **Disable** \"Lint on Save\" in Obsidian Linter settings\n2. **Enable** \"Format on Save\" in Automatic Linker settings\n3. **Enable** \"Run Obsidian Linter after formatting\" in Automatic Linker settings\n\nThis ensures Automatic Linker runs first, followed by Linter.\n\n## Frontmatter Options\n\nAdd these to individual note frontmatter:\n\n```yaml\n---\n# Disable automatic linking in this file\nautomatic-linker-off: true\n\n# Exclude this file from being automatically linked from other files\nautomatic-linker-exclude: true\n\n# Restrict linking to same namespace only\nautomatic-linker-scoped: true\n\n# Define aliases for this file (standard Obsidian feature)\naliases: [shortname, alternative-name]\n---\n```\n\n## Development\n\n### Prerequisites\n\n- Node.js 16+\n- pnpm (or npm)\n\n### Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/kdnk/obsidian-automatic-linker.git\ncd obsidian-automatic-linker\n\n# Install dependencies\npnpm install\n\n# Start development mode\npnpm dev\n```\n\n### Available Commands\n\n```bash\npnpm build              # Build for production\npnpm dev                # Development mode with watch\npnpm test               # Run all tests\npnpm test:watch         # Run tests in watch mode\npnpm tsc:watch          # TypeScript type checking in watch mode\n```\n\n### Running Specific Tests\n\n```bash\n# Run a specific test file\nnpx vitest run src/path/to/test.ts\n\n# Run tests matching a pattern\nnpx vitest run -t \"test description\"\n```\n\n### Project Structure\n\n```\nsrc/\n├── main.ts                    # Main plugin entry point\n├── settings/                  # Settings UI and types\n├── replace-links/             # Core link replacement logic\n├── replace-urls/              # URL formatting (GitHub, Jira, Linear)\n├── replace-url-with-title/    # Bare URL to titled link conversion\n├── exclude-links/             # Link exclusion logic\n├── remove-minimal-indent/     # Remove minimal indentation from text\n├── trie.ts                    # Trie data structure for efficient matching\n└── update-editor.ts           # Editor update utilities\n```\n\n## Troubleshooting\n\n**Links aren't being created:**\n- Ensure \"Format on Save\" is enabled or manually trigger the command\n- Verify the file isn't in an excluded directory\n\n**Proximity-based Linking not working:**\n- Ensure \"Proximity-based Linking\" is enabled in settings\n- Check that files are within Obsidian's configured \"Folder to create new notes in\" directory if the \"Respect 'Folder to create new notes in' setting\" option is enabled\n\n**Conflicts with Obsidian Linter:**\n- Follow the integration guide above to run plugins in sequence\n\n**Performance issues:**\n- Disable debug mode if enabled\n- Consider excluding large directories from auto-linking\n- Increase format delay if formatting happens too frequently\n\n## Credits\n\n- `updateEditor` function adapted from [obsidian-linter](https://github.com/platers/obsidian-linter)\n\n## License\n\nThis project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details.\n\n## Author\n\n**Kodai Nakamura**\n\n## Support\n\n- [GitHub Issues](https://github.com/kdnk/obsidian-automatic-linker/issues) - Bug reports and feature requests\n- [GitHub Discussions](https://github.com/kdnk/obsidian-automatic-linker/discussions) - Questions and community support\n\n---\n\nIf you find this plugin useful, consider starring the repository on GitHub!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkdnk%2Fobsidian-automatic-linker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkdnk%2Fobsidian-automatic-linker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkdnk%2Fobsidian-automatic-linker/lists"}