> ## Documentation Index
> Fetch the complete documentation index at: https://docs.filarank.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Upgrade from v1 to v2

> Publish v2 migrations, re-register the plugin, and pick up AI, sitemaps, audits, and rank tracking.

FilaRank v1 scored a page while you wrote it. v2 turns that into a full SEO workflow: AI that suggests fixes, sitemaps, a technical audit, keyword research, rank tracking, backlinks, and competitor analysis.

There are **no breaking API changes**. Existing `HasSeo`, `SeoFields::make()`, and `SeoScoreColumn::make()` calls keep working.

<Steps>
  <Step title="Publish and run the new migrations">
    ```bash theme={null}
    php artisan vendor:publish --tag=filarank-migrations
    php artisan migrate
    ```

    This adds `filarank_settings`, `filarank_ai_logs`, `filarank_keywords`, `filarank_rank_snapshots`, `filarank_backlinks`, `filarank_competitors`, and `filarank_audit_issues`.
  </Step>

  <Step title="Register the plugin">
    Register the plugin on your panel if you haven't already, and switch off any pages you don't want:

    ```php theme={null}
    ->plugin(\Usamamuneerchaudhary\FilaRank\FilaRankPlugin::make())
    ```

    See [Installation](/quickstart) for the full list of page toggles.
  </Step>

  <Step title="Re-publish the config">
    Diff it against your copy rather than overwriting, so you pick up the `ai`, `sitemap`, `audit`, and `rank_tracker` sections:

    ```bash theme={null}
    php artisan vendor:publish --tag=filarank-config --force
    ```
  </Step>

  <Step title="Re-publish views if you customized them">
    The v2 pages ship new Blade files:

    ```bash theme={null}
    php artisan vendor:publish --tag=filarank-views --force
    ```
  </Step>

  <Step title="Optional setup">
    Add an AI key under **FilaRank SEO → SEO Settings**, enable the [sitemap](/sitemap), and populate `scanned_models` so the audit, sitemap, and link graph know which models to scan.
  </Step>
</Steps>

<Note>
  If you were relying on `sitemap.ping_on_save`, move to the `sitemap.ping` toggle. That redundant key was removed in v2.
</Note>

## What else changed

* `SeoFields::make()` gained optional `setSlugUsing` and `setIntroUsing` parameters. Existing calls are unaffected.
* [Redirects](/redirect-manager) can now create a 301 automatically when a published record's slug changes.
* JSON-LD emits a multi-node `@graph`. See [Structured data](/structured-data).
* Keyword Research moved from a custom Blade view to a real Filament table.
