Skip to content
| Marketplace
Sign in
Visual Studio Code>Other>Markdown Link ResolverNew to Visual Studio Code? Get it now.
Markdown Link Resolver

Markdown Link Resolver

Luis Artur

|
1 install
| (0) | Free
Dynamically resolves and navigates to local files referenced by Markdown links in Astro projects (.md and .mdx files)
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

Markdown Link Resolver

A VS Code extension that dynamically resolves and navigates to local files referenced by Markdown links in .md and .mdx files. Designed for Astro documentation projects with frontmatter permalink support.

Requirements

This extension is designed for Astro-based documentation projects. It requires:

  • An Astro project (detected via astro.config.* or astro in package.json)
  • Markdown/MDX files with permalink or slug in frontmatter

On activation, the extension checks for Astro project structure and displays appropriate status in the status bar.

Features

1. Go to Definition (Ctrl+Click / F12)

Click on any link path in a Markdown or MDX file to jump directly to the resolved file. Works with all supported link types — inline links, reference-style definitions, JSX href/link attributes, object-style link: "/path" props, and autolinks.

2. Peek Definition (Alt+F12)

Preview the linked file inline without leaving the current document. The peek window shows the full contents of the resolved file, letting you verify the target without switching tabs.

3. Hover Preview with Resolved File Link

Hover over a link to see:

  • The resolved file path in the workspace (clickable to open the file)
  • The resolution strategy used and its confidence score
  • A preview of the first lines of the target file

4. Keyboard Shortcut

Press Cmd+Shift+. (macOS) or Ctrl+Shift+. (Windows/Linux) while your cursor is on a markdown link to jump to the resolved file. This works as a keyboard-only alternative to Ctrl+Click navigation. The shortcut is active in .md and .mdx files.

5. Context Menu

Right-click on a link in a markdown or MDX file to see a "Go to Linked File" entry in the context menu (under the navigation group, near "Go to Definition"). Clicking it navigates to the resolved file.

6. CodeLens Annotations

Clickable annotations appear above each link showing the resolved file path. If a link cannot be resolved, a warning annotation is displayed instead. Clicking the CodeLens opens the resolved file.

7. Real-time Diagnostics

Warning squiggles appear under links that cannot be resolved to any workspace file. These diagnostics update in real-time as you type (with a 200ms debounce) and are visible in the Problems panel.

8. Quick Fix Suggestions

When a link cannot be resolved, the extension provides intelligent quick fix suggestions based on URL similarity. Click the lightbulb icon (or press Ctrl+. / Cmd+.) on a broken link to see suggestions.

Similarity Matching (also used in autocomplete):

  • Segment matching — Matches path segments between broken URL and candidates
  • Edit distance — Uses Levenshtein distance for fuzzy matching
  • Prefix/suffix matching — Rewards common prefixes and suffixes
  • Language preference — Prioritizes suggestions matching the current document's language

Typo-Tolerant Autocomplete: When typing a URL in a markdown link, MDX href, or YAML frontmatter, the extension first shows exact matches. If few or no exact matches are found, it automatically suggests similar permalinks based on the same similarity matching algorithm—helping you find the right URL even with typos.

Configuration:

  • quickFixMinScore — Minimum similarity score to show suggestions (default: 40, range: 0-100)
  • maxQuickFixSuggestions — Maximum suggestions per broken link (default: 5, range: 1-20)
  • completionSimilarityThreshold — Minimum similarity for autocomplete fallback (default: 30, range: 0-100)

9. Command Palette Commands

All commands are under the MDLR namespace:

Command Description
MDLR: Go to Linked File (Ctrl+Shift+.) Navigates to the resolved file for the link under the cursor
MDLR: List Links Opens a Quick Pick menu showing all links in the current document with their resolution status
MDLR: Validate Links Scans the current document and reports all broken links in the Problems panel
MDLR: Validate External URLs Checks availability of external URLs in the current document
MDLR: List All Errors Lists all validation errors in a Quick Pick for easy navigation
MDLR: Report: Problems Exports all link validation issues to an HTML report
MDLR: Report: Permalinks & References Generates a comprehensive report of all permalinks, duplicates, and unreferenced entries
MDLR: Report: Redirect Map Generates a report of all redirect entries with validation status
MDLR: Clear URL Check Cache Clears the external URL validation cache
MDLR: Show Invalid Redirects Lists all redirect entries with validation issues
MDLR: Validate Duplicate Redirects Tests all redirect entries for duplicate sources
MDLR: Test External Destinations Runs live HTTP checks against redirect destination URLs
MDLR: Force Re-index Rebuilds all indexes from scratch
MDLR: Open External Project Config Opens Settings focused on externalProjectMappings
MDLR: Add Host to External Projects Adds the host of the URL under the cursor to externalProjectMappings
MDLR: Debug: Export Index Report Exports index data for debugging

10. Redirect File Diagnostics

When opening redirect JSON files (files containing redirect mappings with from and moved properties), the extension validates both the source and destination:

Source (FROM) Validation:

A source URL is valid when it has no conflicts. Issues are flagged as:

  • Internal Conflict (Error) — The from URL matches a permalink in your content. This redirect is unnecessary — the content already exists at this URL.
  • Duplicated Entry (Error) — The same from URL is defined multiple times across redirect files. This may cause unpredictable behavior.
  • Chained Redirect (Info) — The from URL is the destination of another redirect. This is valid — traffic flows through the redirect chain.

Note: A from URL with no references is still valid — it can receive traffic from anywhere (external sites, search engines, legacy links, etc.).

Destination (MOVED) Validation:

A destination is valid when it resolves to:

  • A permalink in your content, OR
  • Another redirect source (chained redirect)

Issues are flagged as:

  • Invalid Destination (Error) — The moved URL doesn't resolve to any content or redirect.

Quick Fix Suggestions:

When a destination (MOVED) URL is invalid, the extension provides quick fix suggestions:

  • Press Ctrl+. / Cmd+. on the invalid URL to see similar permalink suggestions
  • Suggestions preserve the language prefix from the original URL (e.g., /en/...)
  • Autocomplete suggestions are also available when typing destination URLs

Features:

  • CodeLens Status — Above each redirect entry, CodeLenses show source and destination validation status.
  • Hover Information — Hover over a redirect entry to see detailed validation info and redirect chains.
  • Diagnostic Errors — Red squiggles appear under entries with errors (internal conflicts, duplicates, invalid destinations).

11. Status Bar Integration

The extension displays its current state in the VS Code status bar:

  • $(sync~spin) Indexing — Building file and permalink indexes
  • $(check) Ready — Extension is active and ready
  • $(warning) X warnings — Shows count of unresolved links
  • $(circle-slash) Disabled — Extension is paused

Click the status bar item to:

  • Toggle the extension on/off
  • Access quick commands
  • View extension status

12. Show All References

From the hover popup, click "Show all references" to see a Quick Pick list of all files that reference a specific permalink. This uses a pre-built reverse index for O(1) lookup performance.

13. Static Asset Resolution

The extension resolves links to static assets (images, PDFs, etc.) stored in configured asset directories:

  • Auto-detects public/, static/, assets/ directories
  • Supports images, documents, media files, fonts

Example: Resolving Documentation Links

Given a markdown file containing:

[How to configure cache policies for Applications](https://www.azion.com/en/documentation/products/guides/cache-settings/)

The extension will:

  1. Parse the link path: https://www.azion.com/en/documentation/products/guides/cache-settings/

  2. Strip the detected prefix /en → documentation/products/guides/cache-settings

  3. Match the path to files using permalink mapping from frontmatter

  4. With auto-detected content roots, it resolves to:

    src/content/docs/en/pages/guides/edge-application/ea-configure-cache-policies.mdx
    

You can then Ctrl+Click the link to jump directly to that file!


Link Types Supported

Type Syntax Example
Inline Markdown [text](https://github.com/arturdj/markdown-link-resolver/blob/HEAD/url) [Cache Settings](https://www.azion.com/en/docs/cache/)
Reference-style [label]: url [cache]: https://www.azion.com/en/docs/cache/
JSX/MDX href href="url" <Link href="https://www.azion.com/en/docs/cache/" />
JSX/MDX link link="url" <Button link="/en/documentation/products/" />
Object property link: "url" { label: "Platform overview", link: "/en/documentation/products/" }
Autolinks <url> <https://www.azion.com/en/docs/cache/>

Installation

From Source

cd markdown-link-resolver
npm install
npm run compile

Then press F5 in VS Code to launch an Extension Development Host with the extension loaded.

Using VSIX

cd markdown-link-resolver
npm run package:vsix
ls ./markdown-link-resolver-*.vsix

Then install the VSIX:

# Linux
code --install-extension ./markdown-link-resolver-1.0.2.vsix

# macOS (if the `code` CLI isn't on PATH)
open -a "Visual Studio Code" --args --install-extension ./markdown-link-resolver-1.0.2.vsix

# Windows (optional alternative if `code` isn't on PATH)
"%LocalAppData%\Programs\Microsoft VS Code\bin\code" --install-extension .\markdown-link-resolver-1.0.2.vsix

Replace 1.0.2 with the packaged version shown by ls ./markdown-link-resolver-*.vsix.


Multi-Project Support (Monorepo)

The extension supports workspaces with multiple Astro projects, such as monorepos managed by pnpm, Lerna, Nx, or Turborepo.

Automatic Detection

By default, the extension auto-detects monorepo structures by checking for:

Indicator File
pnpm pnpm-workspace.yaml
Lerna lerna.json
Nx nx.json
Turborepo turbo.json

When a monorepo is detected, the extension scans apps/ and packages/ directories for Astro projects (identified by astro.config.* files).

Status Bar Project Indicator

In monorepo mode, all detected projects are indexed simultaneously and links resolve across all of them automatically — there's no manual project switching. The status bar shows a project count (or the single project's name when only one is detected):

┌─────────────────────────────────────────────────────┐
│  $(check) MDLR [2]                                   │
└─────────────────────────────────────────────────────┘

Hover the status bar item for a tooltip with per-project detection details.


Configuration

All settings are under the markdownLinkResolver namespace.

Link Resolution Settings

markdownLinkResolver.permalinkKeys

  • Type: string[]
  • Default: ["permalink"]
  • Description: Frontmatter keys to use for permalink resolution (e.g., permalink, slug). The first matching key wins.

markdownLinkResolver.fileExtensions

  • Type: string[]
  • Default: [".md", ".mdx", ".json"]
  • Description: File extensions to include in the workspace file index.

markdownLinkResolver.assetExtensions

  • Type: string[]
  • Default: [".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp", ".ico", ".bmp", ".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".mp4", ".webm", ".mp3", ".wav", ".ogg", ".woff", ".woff2", ".ttf", ".eot", ".otf", ".zip", ".json", ".xml", ".txt", ".csv"]
  • Description: File extensions to index as static assets (images, documents, media, fonts, etc.).

markdownLinkResolver.assetSubdirectory

  • Type: string
  • Default: "assets"
  • Description: Subdirectory to scan for assets within each asset root (e.g. "assets" scans public/assets instead of all of public). Set to an empty string to scan the entire asset root instead.

markdownLinkResolver.linkExclusionRegex

  • Type: string
  • Default: ""
  • Description: Regex pattern used to ignore matching link targets during parsing/resolution (e.g., ^/api/|^#).

Autocomplete & Suggestions

markdownLinkResolver.advanced.maxCompletionItems

  • Type: number
  • Default: 50
  • Range: 1–200
  • Description: Maximum number of permalink suggestions to show in the completion list.

markdownLinkResolver.completionSimilarityThreshold

  • Type: number
  • Default: 30
  • Range: 0–100
  • Description: Minimum similarity score (0-100) to show similar suggestions when no exact matches are found. Set to 0 to disable similarity-based fallback.

markdownLinkResolver.maxSuggestions

  • Type: number
  • Default: 3
  • Range: 1–10
  • Description: Maximum number of alternative URL suggestions to display in the hover popup.

markdownLinkResolver.advanced.referenceIndexDebounceMs

  • Type: number
  • Default: 200
  • Range: 0–2000 ms
  • Description: Debounce delay in milliseconds before updating the permalink reference index as you type.

markdownLinkResolver.advanced.redirectValidationDebounceMs

  • Type: number
  • Default: 300
  • Range: 0–2000 ms
  • Description: Debounce delay in milliseconds before validating redirect JSON files on change.

markdownLinkResolver.advanced.statusBarDisplayDebounceMs

  • Type: number
  • Default: 500
  • Range: 0–5000 ms
  • Description: Debounce delay in milliseconds for status bar display updates during rapid changes.

Quick Fix Settings

markdownLinkResolver.quickFixMinScore

  • Type: number
  • Default: 40
  • Range: 0–100
  • Description: Minimum similarity score (0-100) for a permalink to be suggested as a quick fix.

markdownLinkResolver.maxQuickFixSuggestions

  • Type: number
  • Default: 5
  • Range: 1–20
  • Description: Maximum number of quick fix suggestions to show for each broken link.

External URL Checking

markdownLinkResolver.checkExternalUrls

  • Type: boolean
  • Default: true
  • Description: Enable checking availability of external URLs (http/https links) in markdown files.

markdownLinkResolver.advanced.urlCheckTimeout

  • Type: number
  • Default: 5000
  • Range: 1000–30000 ms
  • Description: Timeout in milliseconds for external URL availability checks.

markdownLinkResolver.advanced.urlCheckConcurrency

  • Type: number
  • Default: 5
  • Range: 1–20
  • Description: Maximum number of concurrent URL checks.

markdownLinkResolver.advanced.urlCheckCacheTtl

  • Type: number
  • Default: 300000
  • Range: 60000–3600000 ms
  • Description: Cache time-to-live in milliseconds for URL check results (default: 5 minutes).

markdownLinkResolver.advanced.maxRedirects

  • Type: number
  • Default: 15
  • Range: 1–50
  • Description: Maximum number of HTTP redirects to follow when checking external URLs.

Redirect Settings

markdownLinkResolver.redirectFiles

  • Type: string[]
  • Default: []
  • Description: Glob patterns for redirect JSON files. Empty for auto-detection (searches for redirects/*.json, *redirect*.json, etc.).

markdownLinkResolver.enableRedirects

  • Type: boolean
  • Default: true
  • Description: Enable redirect link resolution and tracking. Disable to skip scanning the workspace for redirect JSON files on large repos where no redirects are configured.

markdownLinkResolver.advanced.autoValidateDuplicateRedirects

  • Type: boolean
  • Default: true
  • Description: Automatically test duplicate redirect entries via HTTP (to determine which one is effective) when duplicates are detected, without needing to run the "Validate Duplicate Redirects" command manually.

markdownLinkResolver.externalProjectMappings

  • Type: array
  • Default: []
  • Description: Map external project names to URL patterns for link classification. Each entry supports:
    • name (required): Display name shown in hovers and diagnostics.
    • patterns (required): Regex patterns matched against the URL path (case-insensitive).
    • skipValidation: Skip HTTP validation for URLs matching these patterns.
    • excludeWorkspaces: Regex patterns matched against the current workspace folder name(s)/path(s) (case-insensitive). If any pattern matches, this mapping entry is skipped entirely for that workspace — useful for a global/User-level setting that should self-exclude when opened in the repo it actually points to, where those links are internal rather than external.

Example:

{
  "markdownLinkResolver.externalProjectMappings": [
    {
      "name": "External Blog",
      "patterns": ["^/blog/", "^/news/"],
      "skipValidation": true
    },
    {
      "name": "Legacy Docs",
      "patterns": ["^/legacy/"],
      "skipValidation": false
    },
    {
      "name": "DOCS",
      "patterns": ["/documenta(tion|cao)/"],
      "skipValidation": true,
      "excludeWorkspaces": ["docs-repo"]
    }
  ]
}

In the example above, the DOCS mapping is set globally (e.g. in User settings) so any repo linking to /documentacao/ treats those URLs as external. But when the workspace folder itself is named docs-repo, the mapping is skipped — those links are internal to that repo and get validated normally instead of being tagged/skip-validated as external.

Multi-Project Settings

markdownLinkResolver.projectRoots

  • Type: string[]
  • Default: []
  • Description: Override paths to Astro project roots. Empty for auto-detection. Use relative paths from workspace root.

Example:

{
  "markdownLinkResolver.projectRoots": ["apps/docs", "apps/landing-page"]
}

markdownLinkResolver.autoDetectProjects

  • Type: boolean
  • Default: true
  • Description: Automatically detect Astro projects in subfolders (monorepo support). Detects pnpm, Lerna, Nx, and Turborepo workspaces, scanning the standard apps/ and packages/ directories.

Auto-Detected Configuration (Read-Only)

The following settings are automatically detected from your Astro configuration and cannot be overridden via VS Code settings:

Setting Detection Source
contentRoots srcDir + /content from astro.config.*
assetRoots publicDir from astro.config.*
languages i18n config or folder structure
defaultLanguage i18n config
trailingSlash trailingSlash from astro.config.*

Detected values are shown in the status bar tooltip when hovering over the MDLR status item. To modify these values, update your astro.config.* file.


Monorepo Configuration Examples

Example 1: Auto-Detection (Default)

For standard monorepos with projects in apps/ or packages/:

my-monorepo/
├── pnpm-workspace.yaml
├── apps/
│   ├── docs/           # Astro project
│   │   └── astro.config.mjs
│   └── landing-page/   # Astro project
│       └── astro.config.mjs
└── packages/
    └── shared/

No configuration needed. The extension auto-detects both projects.

Example 2: Explicit Project Paths

For custom project locations or when auto-detection doesn't find all projects:

// .vscode/settings.json
{
  "markdownLinkResolver.projectRoots": [
    "site",
    "documentation",
    "internal/wiki"
  ]
}

Project Structure

markdown-link-resolver/
├── .husky/                   # Git hooks (commitlint, pre-commit)
├── src/
│   ├── extension.ts          # Extension entry point (activate/deactivate)
│   ├── types.ts              # Shared TypeScript interfaces
│   ├── commands/
│   │   ├── consolidatedCommands.ts    # Command Palette command implementations
│   │   ├── exportIndexesCommand.ts    # Debug index export
│   │   ├── htmlReportGenerator.ts     # HTML report generation
│   │   ├── permalinkReportCommand.ts  # Permalink report command
│   │   └── redirectMapReport.ts       # Redirect map report
│   ├── parsers/
│   │   └── linkParser.ts     # Markdown/MDX link detection & parsing
│   ├── providers/
│   │   ├── codeLensProvider.ts        # Inline CodeLens annotations
│   │   ├── completionProvider.ts      # Permalink autocomplete
│   │   ├── definitionProvider.ts      # Go to Definition (Ctrl+Click / F12)
│   │   ├── diagnosticsProvider.ts     # Real-time warning diagnostics
│   │   ├── frontmatterPermalinkIndicatorProvider.ts # Frontmatter link counts
│   │   ├── hoverProvider.ts           # Hover preview with file content
│   │   ├── hoverSchema.ts             # Hover content schema generation
│   │   ├── statusBarProvider.ts       # Status bar integration & state
│   │   ├── redirectFileDiagnosticsProvider.ts  # Redirect JSON validation
│   │   ├── redirectFileCodeLensProvider.ts     # CodeLens for redirects
│   │   ├── redirectFileHoverProvider.ts        # Hover for redirects
│   │   ├── redirectQuickFixProvider.ts         # Quick fix for redirects
│   │   ├── redirectCompletionProvider.ts       # Autocomplete for redirects
│   │   ├── redirectDuplicateCodeActionProvider.ts # Duplicate testing
│   │   ├── redirectExternalDestinationDecorator.ts # Decorates external redirect destinations
│   │   ├── redirectMapVisualization.ts         # Redirect visualization
│   │   └── quickFixProvider.ts        # Quick fix for broken links (similarity matching)
│   ├── resolver/
│   │   ├── assetIndex.ts              # Static asset resolution
│   │   ├── assetReferenceIndex.ts     # Asset dependency tracking
│   │   ├── astroConfigResolver.ts     # Astro config file parsing
│   │   ├── astroPageRouteParser.ts    # Astro page route parsing
│   │   ├── compactTypes.ts           # Memory-efficient storage types
│   │   ├── detectedConfigProvider.ts  # Auto-detected configuration values
│   │   ├── externalLinkIndex.ts       # Persistent URL → source-file mapping for external links
│   │   ├── fileIndex.ts               # Cached workspace file index
│   │   ├── fileResolver.ts            # Multi-strategy path resolution
│   │   ├── languagePatternDiscovery.ts # Language detection from paths
│   │   ├── permalinkIndex.ts          # Permalink → file mapping
│   │   ├── permalinkReferenceIndex.ts # Reverse index for O(1) lookups
│   │   ├── persistence/
│   │   │   ├── fileManifest.ts        # Per-file mtime/size manifest for snapshot diffing
│   │   │   ├── indexReconciler.ts     # Reconciles indexes against a restored snapshot
│   │   │   ├── indexSnapshotStore.ts  # Persists/loads index snapshots to disk
│   │   │   └── snapshotFileTable.ts   # Shared file-string table for compact snapshot storage
│   │   ├── projectConfigDiscovery.ts  # Framework auto-detection
│   │   ├── projectDiscoveryService.ts # Monorepo project discovery
│   │   ├── redirectIndex.ts           # Redirect JSON file parsing
│   │   ├── redirectTestIndex.ts       # Redirect test history storage
│   │   ├── routeIndex.ts              # Page routes, categories, namespaces
│   │   ├── stringPool.ts             # String interning for memory savings
│   │   ├── unifiedUrlIndex.ts         # Canonical URL resolution (v1.0.2+)
│   │   └── urlVariantGenerator.ts    # URL variant computation
│   ├── core/
│   │   ├── linkValidator.ts           # Link validation logic
│   │   ├── diagnosticsCache.ts        # Persistent diagnostics storage
│   │   └── revalidationCoordinator.ts # Batches/fans out background revalidation work
│   ├── features/
│   │   ├── externalProjectMapper.ts  # External project URL tagging
│   │   └── externalUrlChecker.ts      # External URL availability checking
│   ├── templates/
│   │   ├── baseReportTemplate.ts      # Base report HTML template
│   │   ├── problemsReportTemplate.ts  # Problems report template
│   │   ├── redirectMapReportTemplate.ts # Redirect map report template
│   │   ├── reportInteractions.ts      # Shared client-side JS (sort/filter/expand) for HTML reports
│   │   └── reportTemplate.ts          # Generic report template
│   └── utils/
│       ├── astroDetection.ts          # Astro framework detection
│       ├── detectionDefaults.ts       # Default setting values
│       ├── logger.ts                  # Logging utility
│       ├── pathUtils.ts               # Path normalization utilities
│       ├── redirectUrlUtils.ts        # Redirect URL utilities
│       ├── reportUtils.ts             # HTML/Markdown report utilities and runReportCommand runner
│       ├── similarityMatcher.ts       # Fuzzy URL matching algorithm
│       └── urlNormalizer.ts          # URL normalization (v1.0.2+)
├── .editorconfig              # Editor formatting rules
├── .gitignore                 # Git ignore patterns
├── .releaserc.json            # Semantic release configuration
├── commitlint.config.cjs      # Commit message validation
├── CONTRIBUTING.md            # Contribution guidelines
├── CHANGELOG.md               # Release notes
├── CODE_OF_CONDUCT.md         # Community conduct guidelines
├── LICENSE                    # Proprietary, closed-source license
├── package.json               # Extension manifest and dependencies
├── tsconfig.json              # TypeScript configuration
└── README.md                  # This file

How It Works

  1. On Activation:

    • Detects if the workspace is an Astro project (via astro.config.* or astro in package.json)
    • Shows appropriate status in the status bar (NoWorkspace, NotAstroProject, LimitedFunctionality, or FullActivation)
    • Auto-detects project configuration: framework, languages, content directories, asset directories, trailing slash behavior
    • Multi-Project Mode: Scans for monorepo indicators and discovers Astro projects in apps/ and packages/ directories
    • Builds a file index of all .md and .mdx files in the workspace
  2. Index Architecture: Multiple specialized indexes maintain workspace state:

    • FileIndex — workspace file paths
    • PermalinkIndex — permalink → file mappings
    • PermalinkReferenceIndex — reverse reference lookups
    • AssetIndex — static asset paths
    • AssetReferenceIndex — asset dependency tracking
    • RedirectIndex — redirect chain mappings
    • RouteIndex — page routes, categories, namespaces
    • SourceIndex — source file → URL mapping
    • ReferenceIndex — URL reference tracking
    • UnifiedUrlIndex — canonical URL resolution (single source of truth)
    • DiagnosticsCache — centralized issue tracking
    • ProjectDiscoveryService — monorepo project discovery
  3. Unified URL Index (v1.0.2+): The single source of truth for canonical URL resolution. Computes the exact URL Astro builds using buildCanonicalUrl(), normalizes redirect URLs via normalizeForLookup(), and provides O(1) URL-to-entry resolution.

  4. Permalink Index: Scans frontmatter for keys defined in permalinkKeys (default: permalink). Maintains a permalink → file index with file system watchers. Duplicate permalinks are tracked and reported.

  5. Reference Index: Builds a reverse index mapping permalinks to all files that reference them, enabling O(1) lookups for "Show All References" functionality.

  6. Asset Index: Scans auto-detected asset directories (public/, static/, assets/) for static files. Enables resolution of image links and other asset references.

  7. Link Parsing: When you open or edit a markdown file, the link parser detects all link types using built-in regex patterns and produces ParsedLink objects with precise range information.

  8. Resolution: For each link, the FileResolver attempts permalink match, then redirect resolution, then asset resolution. Uses UnifiedUrlIndex for canonical URL matching. Returns the best match with location information.

  9. Diagnostics: The DiagnosticsProvider generates real-time warnings for broken links, displayed in the Problems panel.

  10. Multi-Project Behavior:

    • All detected Astro projects are indexed together at activation — no per-file project switching
    • Links resolve across all detected projects automatically
  11. External Project Mapping: URLs matching configured patterns are tagged as external and can optionally skip HTTP validation.

  12. Enable/Disable Toggle: Click the status bar item to pause/resume the extension. When paused, all indexes are cached for fast resume without rebuilding.


Development

# Install dependencies
npm install

# Compile TypeScript
npm run compile

# Watch for changes
npm run watch

# Run tests
npm test

# Run tests with coverage
npm run test:coverage

# Build VSIX package
npm run package:vsix

# Launch Extension Development Host
# Press F5 in VS Code

License

Proprietary - all rights reserved. See LICENSE. The Software is provided "as is", without warranty of any kind.

  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
© 2026 Microsoft