Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Statamic Linkwise Laravel Package

arturrossbach/statamic-linkwise

Linkwise adds link management to Statamic: scan your content for broken or outdated URLs, review results in the control panel, and keep redirects and references tidy so visitors never hit a dead end. A lightweight addon for keeping large Statamic sites healthy.

View on GitHub
Deep Wiki
Context7

Getting Started

  • Install with composer require the package, then publish its config and migrations (php artisan vendor:publish for the package tag) and run php artisan migrate. The dashboard is registered by the package's service provider under a configurable route prefix — check routes in the published config before assuming a URL.
  • Open the config file first. It's where you declare which Eloquent models count as "entries", which locales exist, and which paths/URLs the crawler should ignore. Almost every surprising number on the Overview page traces back to a config decision, not a bug.
  • Populate the index with the package's artisan indexing command (usually something like php artisan <package>:index). Nothing on the dashboard is meaningful until that has run at least once against real content.
  • First use case: run the indexer, open Overview, and set the locale filter to your primary language. Look at three numbers in order — broken links, orphaned entries, then least-linked entries. That ordering goes from "actively costing you" to "cheap wins."
  • On multilingual installs (v1.3.0+), the locale dropdown on Overview behaves identically to the one on Links and Broken Links. Start there rather than reading aggregate stats, which blend languages together when set to "All languages."

Implementation Patterns

  • Schedule the indexer, don't run it by hand. Put the indexing command on the scheduler (nightly is typical, hourly if you publish often) and keep the broken-link crawl at a lower frequency — it's the expensive part. Use withoutOverlapping(); a stalled crawl plus a scheduled one is the most common cause of duplicated outbound rows.
  • Triage workflow per locale. Filter Overview to one locale → note the orphaned count → jump to Links filtered to orphaned entries → fix the highest-value ones. Then check "least-linked" for pages that should be receiving internal links. The locale filter persisting across Overview/Links/Broken Links in 1.3.0 is what makes this a coherent loop instead of three separate reports.
  • Use per-locale scoping for translation QA. Entry-count chips under "Entries Indexed" are a fast sanity check that every locale is actually indexed. If de shows 40 entries and en shows 1,200, your indexer isn't reaching the translated content — that's a config/URL-pattern problem, not a dashboard problem.
  • Feed the numbers into deployment checks. If your content is code-adjacent (markdown, docs sites, CMS with an API), run the broken-link check in CI on a schedule or before release and fail on regressions rather than eyeballing the dashboard.
  • Exclude appropriately. Admin panels, paginated archives, query-string variants, and staging hosts belong in the ignore config. Every excluded pattern silently changes orphan counts, so treat the ignore list as reviewed configuration, not a scratchpad.
  • Pair with your publishing flow. A model observer or a queued job fired after content save keeps the index near-real-time for new entries, while the nightly full crawl catches drift (deleted pages, changed slugs, redirects).
  • Report outward, not inward. For stakeholders, pull the numbers into a scheduled export or a Slack digest per locale rather than granting dashboard access. The per-locale scoping makes "English is healthy, German has 300 orphans" a one-line message.

Gotchas and Tips

  • Locale-scoped stats won't sum to the "All languages" total. Entries that aren't attributed to a locale, or that exist in a shared/neutral bucket, appear in the aggregate but not in any single-language view. Don't reconcile per-locale figures against the all-languages figure and call it a discrepancy.
  • The locale filter lives in the query string. Bookmarks and shared links preserve it, which is good — but it also means a teammate opening your link sees your locale without realising it. When reporting a number, state the locale explicitly.
  • If you're on 1.2.x, the missing per-language chips are a UI bug, not missing data. The counts were being computed; they just weren't rendering. Upgrading to 1.3.0 restores them without a re-index. Don't waste time debugging your indexer over this.
  • Clear caches after upgrading. php artisan config:clear (and your view cache, if you've published the dashboard views) before concluding the locale filter "doesn't work." Published views from an older version can shadow the updated filter markup.
  • Broken-link crawls are slow and network-bound. Queue them, set sane timeouts, and expect the count to lag reality by one run. A "broken link" reported at a URL that 200s in your browser is usually a bot-blocked or JS-rendered page, not a false positive in your content.
  • "Orphaned" means "no inbound link found within the index scope." External backlinks, links from excluded paths, and links from unindexed locales all count as nothing. Before acting on the orphan list, confirm the scope is what you think it is.
  • Watch migration/index performance on large content tables. The package's tables grow with entry count × link count; run migrations in a maintenance window on big installs and check that the indexes the package ships are actually present after upgrading.
  • Extension points: the extraction/normalisation logic and the dashboard views are the two places worth touching. Override views to match your admin theme, and only replace the extractor if you have non-HTML content — otherwise you're taking on maintenance the package already does.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
frankyso/ipaymu
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package
kda/filament-dynamic-navigation
bypersoft/signbox
pairus/product-data
fayne/laravel-filament-cms-core