PHPackages                             pseo/laravel-pseo - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. pseo/laravel-pseo

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

pseo/laravel-pseo
=================

Laravel package that generates robots.txt, sitemap.xml, and llms.txt — and imports pSEO campaign archives.

v1.0.0(2mo ago)023MITPHPPHP ^8.2

Since May 19Pushed 2mo agoCompare

[ Source](https://github.com/bbcreation/laravel-pseo)[ Packagist](https://packagist.org/packages/pseo/laravel-pseo)[ Docs](https://github.com/bbcreation/laravel-pseo)[ RSS](/packages/pseo-laravel-pseo/feed)WikiDiscussions main Synced 3w ago

READMEChangelogDependencies (7)Versions (2)Used By (0)

laravel-pseo
============

[](#laravel-pseo)

Laravel package that serves `robots.txt`, `sitemap.xml`, and `llms.txt` from imported pSEO campaign content — with a built-in password-protected upload panel.

**Zero project coupling.** Install via Composer, set two `.env` values, done.

---

Install
-------

[](#install)

```
composer require pseo/laravel-pseo
```

Service provider is auto-discovered. No manual registration needed.

```
# Optionally publish views to customize them:
php artisan vendor:publish --tag=pseo-views
```

---

Minimum .env
------------

[](#minimum-env)

```
PSEO_SITE_URL=https://yoursite.com
PSEO_UPLOAD_PASSWORD=your_secret_password
```

That's it. The panel is live at `/pseo-upload` and all three endpoints are registered.

---

All .env options
----------------

[](#all-env-options)

```
# ── Required ───────────────────────────────────────────────────────────────────

# Absolute URL of your site — used in sitemap.xml, llms.txt, robots.txt Sitemap directive
PSEO_SITE_URL=https://yoursite.com

# Password for the upload panel at /pseo-upload
# Accepts plain text OR a bcrypt hash:
#   php artisan tinker --execute="echo Hash::make('secret');"
PSEO_UPLOAD_PASSWORD=your_secret_password

# ── Optional (defaults shown) ──────────────────────────────────────────────────

# URL path for the upload panel (default: /pseo-upload)
# PSEO_UPLOAD_PATH=/pseo-upload

# Storage disk — any disk in config/filesystems.php (default: app default disk)
# PSEO_DISK=local

# Relative path on disk for campaign pages (default: pseo)
# Layout: {disk_root}/{PSEO_CONTENT_PATH}/pages/{pillar,supporting,research}/
# Empty string = use disk root directly
# PSEO_CONTENT_PATH=pseo

# URL prefix for imported page slugs (default: /learn)
# PSEO_LINK_PREFIX=/learn

# Cache TTL in seconds for generated files (default: 3600, 0 = disabled)
# PSEO_CACHE_TTL=3600

# llms.txt header (defaults: APP_NAME / empty)
# PSEO_LLMS_NAME=
# PSEO_LLMS_DESCRIPTION=

# Disable if you want to serve article pages yourself
# PSEO_CONTENT_ROUTES=true

# Layout component for article pages (default: layouts.app)
# Publish views to customize: php artisan vendor:publish --tag=pseo-views
# PSEO_VIEW_LAYOUT=layouts.app

# Route names (defaults derived from PSEO_LINK_PREFIX: learn.index, learn.show)
# PSEO_ROUTE_NAME_INDEX=learn.index
# PSEO_ROUTE_NAME_SHOW=learn.show
```

---

What it does
------------

[](#what-it-does)

After install the package automatically registers:

RouteDescription`GET /robots.txt`Generated robots.txt`GET /sitemap.xml`Generated from imported markdown pages`GET /llms.txt`Generated from imported markdown pages`GET /pseo-upload`Password-protected upload panel`GET /learn`Article index page`GET /learn/{slug}`Single article page---

Import a campaign ZIP
---------------------

[](#import-a-campaign-zip)

### Via the web panel

[](#via-the-web-panel)

1. Open `/pseo-upload` in your browser.
2. Enter the password.
3. Upload a campaign ZIP and click **Import**.

### Via Artisan

[](#via-artisan)

```
php artisan pseo:import /path/to/campaign.zip
php artisan pseo:import /path/to/campaign.zip --force   # overwrite existing files
```

### What the import does

[](#what-the-import-does)

- Copies `pillar/*.md`, `supporting/*.md`, `research/*.md` → `{disk}/{content_path}/pages/{type}/`
- Copies `schema/*.json` → `{disk}/{content_path}/schema/`
- Rewrites internal links from `/slug` to `{link_prefix}/slug`
- Merges `sitemap.xml` entries (deduped by ``)
- Merges `llms.txt` links under `## Imported Pages` (deduped by URL)
- Writes `robots.txt` only if it doesn't already exist
- Fixes malformed YAML front matter automatically

---

Build static files to public/
-----------------------------

[](#build-static-files-to-public)

Pre-generate files for direct web-server serving (bypasses PHP routing):

```
php artisan pseo:build              # all three
php artisan pseo:build sitemap llms # subset
```

---

Advanced configuration
----------------------

[](#advanced-configuration)

For custom `robots.txt` rules, sitemap priorities, or llms.txt sections, publish the config:

```
php artisan vendor:publish --tag=pseo-config
```

This creates `config/pseo.php` in your project. Edit as needed — `.env` values always take precedence.

> **Note:** If you set `PSEO_UPLOAD_PASSWORD` after running `php artisan route:cache`, run `php artisan route:clear` first — upload routes are only registered when the password is set.

---

Cache
-----

[](#cache)

Clear after importing:

```
php artisan cache:forget pseo.robots
php artisan cache:forget pseo.sitemap
php artisan cache:forget pseo.llms
```

---

Requirements
------------

[](#requirements)

- PHP 8.2+
- Laravel 10, 11, or 12
- `ext-zip`

License
-------

[](#license)

MIT

###  Health Score

39

—

LowBetter than 84% of packages

Maintenance86

Actively maintained with recent releases

Popularity9

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

66d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/a42c18ee9a8c09c920d2e5ab565f734720f4dd9d28d4980c8e25fad2c19fc17d?d=identicon)[bbcreation](/maintainers/bbcreation)

---

Top Contributors

[![bbcreation](https://avatars.githubusercontent.com/u/12559573?v=4)](https://github.com/bbcreation "bbcreation (1 commits)")

---

Tags

laravelSitemapseorobotsllms.txtpseoprogrammatic-seo

### Embed Badge

![Health badge](/badges/pseo-laravel-pseo/health.svg)

```
[![Health](https://phpackages.com/badges/pseo-laravel-pseo/health.svg)](https://phpackages.com/packages/pseo-laravel-pseo)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3345.3M347](/packages/psalm-plugin-laravel)[laravel/mcp

Rapidly build MCP servers for your Laravel applications.

77922.3M186](/packages/laravel-mcp)[laravel/ai

The official AI SDK for Laravel.

1.0k3.2M246](/packages/laravel-ai)[roots/acorn

Framework for Roots WordPress projects built with Laravel components.

9762.4M133](/packages/roots-acorn)[api-platform/laravel

API Platform support for Laravel

58174.6k17](/packages/api-platform-laravel)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

255.2k](/packages/aedart-athenaeum)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
