Download the PHP package muzorix/ai-blog-engine without Composer
On this page you can find all versions of the php package muzorix/ai-blog-engine. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package ai-blog-engine
muzorix/ai-blog-engine
Fully automated, backend-only AI blog/article system for Laravel.
Discover topics, write full articles, humanize them, run fact-checking and SEO/AEO/GEO optimization, generate images and FAQs, manage internal linking and duplicate detection, and control the full lifecycle through a Filament admin panel. You bring your own frontend (Blade, Livewire, Inertia, or headless).
MIT licensed. Multi-provider throughout: Groq, Gemini, OpenAI, Claude.
Table of Contents
- What This Package Does
- Feature List
- Requirements
- Installation
- Configuration
- Admin Panel Guide
- The Article Pipeline
- Day-to-Day Usage
- Artisan Commands
- Scheduled Jobs
- Publishing Modes
- Topic Discovery
- AI Providers
- Image Providers
- Frontend Integration
- Models & Querying
- Programmatic Usage
- Database Tables
- Troubleshooting
- Package Structure
- License
What This Package Does
Most AI writing tools generate text and stop. This package treats article creation as a full lifecycle:
- Discover and score topics from RSS, News API, or manual entry
- Generate structured articles section-by-section
- Humanize, fact-check, and optimize for SEO, AEO, and GEO
- Generate FAQs, images, and internal links
- Flag duplicates and route to review (or auto-publish)
- Monitor freshness and refresh aging content
Everything is self-hosted. Your data, your pipeline, your providers.
Feature List
| Module | Description |
|---|---|
| Topic Discovery | Pluggable sources: Manual, RSS, News API — each topic scored for relevance & opportunity |
| Article Generation | Outline-first, section-by-section writing with configurable length, tone, and reading level |
| Humanization Pass | Second AI pass to reduce robotic phrasing; optional voice profile file |
| Fact Verification | Extracts claims, cross-checks against source material, flags unverified claims |
| SEO Layer | Meta title/description, slug, readability score, JSON-LD schema |
| AEO Layer | Featured-snippet answers, definition callouts, FAQPage schema |
| GEO Layer | Citation-friendly structure for AI answer engines (ChatGPT, Perplexity, etc.) |
| FAQ Generation | 4–6 auto-generated Q&A pairs per article |
| Image Generation | Featured + optional inline images; Pollinations (free) default |
| Internal Linking | Semantic similarity finds related articles; AI inserts contextual links |
| Duplicate Detection | Embedding similarity check before publish |
| Review Workflow | Human approve / reject from admin; or self-writing auto-publish mode |
| Freshness Engine | Flags old or declining-traffic articles for refresh |
| Content Calendar | AI proposes weekly topics based on content gaps |
| Analytics Loop | Weights topic sources by historical article performance |
| Filament Admin | Dashboard, Topics, Articles, Sources, Freshness Queue, AI Settings |
Requirements
- PHP 8.2+
- Laravel 11+ (tested on Laravel 13)
- Database MySQL, PostgreSQL, or SQLite
- Queue driver —
databaseorredisrecommended (QUEUE_CONNECTION=database) - At least one AI text provider API key (Groq recommended — free tier available)
- Composer with
ext-jsonandext-mbstring
Installation
1. Install the package
For local path development (monorepo):
2. Run the install command
This will:
- Publish
config/ai-blog-engine.php - Publish and run database migrations
- Seed default topic sources (Manual, RSS, News API)
- Create the
public/storagesymlink (for images) - Publish Filament CSS/JS assets
3. Publish Filament assets (if admin looks unstyled)
If the admin login page has no styling, run:
Important: Set
APP_URLin.envto match how you access the site (http://127.0.0.1:8000vshttp://localhost:8000).
4. Configure environment variables
Copy the block below into .env and fill in your keys:
5. Enable Filament panel access on your User model
Your App\Models\User must implement Filament\Models\Contracts\FilamentUser:
6. Create an admin user
7. Start the queue worker
Article generation runs as queued jobs. Start a worker:
Or use the Laravel composer dev script if your project has it.
8. Start the scheduler (production)
Add to your server crontab:
The package registers these scheduled jobs automatically:
| Job | Default schedule | Purpose |
|---|---|---|
FetchTopicsJob |
Every 6 hours | Pull topics from enabled sources |
RunFreshnessScanJob |
Mondays 3 AM | Flag articles needing updates |
RunContentCalendarJob |
Sundays 4 AM | Propose new topics for the week |
PullAnalyticsJob |
Daily 5 AM | Update source weights & queue topics |
9. Open the admin panel
(Path is configurable via ABE_ADMIN_PATH.)
Configuration
Publish or re-publish config anytime:
Key config sections
| Section | Purpose |
|---|---|
mode |
review or self_writing |
site |
Niche, description, author, organization — fed into AI prompts and schema |
text_provider |
Default provider + per-step overrides (generate, humanize, fact_check, etc.) |
image_provider |
Default image driver |
humanization |
Enable/disable pass; optional voice_profile_path text file |
fact_check |
Enable/disable; block_unverified_claims for hard blocking |
seo |
Min word count, readability target, meta length limits |
aeo |
FAQ count, snippet optimization |
geo |
Citation-friendly restructuring |
images |
Disk, directory, inline_per_h2 toggle |
duplicate_check |
Similarity threshold (0.85 default), compare last N articles |
internal_linking |
Max links per article, related article count |
freshness |
Check interval days, traffic decline threshold |
topic_discovery |
Min scores, RSS feeds, News API query |
generation |
Default length, tone, reading level |
frontend |
blog_path for canonical URLs in schema |
schedule |
Cron expressions for automated jobs |
Most settings can also be changed from AI Settings in the admin panel without editing files.
Admin Panel Guide
The Filament panel is at /abe-admin (panel ID: ai-blog-engine).
Dashboard
- Pipeline stats: queued topics, pending review, published count, freshness queue
- Recent articles table
Topics
Manage the topic pipeline:
| Action | Description |
|---|---|
| Create | Manually add a topic (auto-queued for generation) |
| Fetch Topics | Pull from RSS / News API and score with AI |
| Score | Re-run AI relevance/opportunity scoring on a topic |
| Generate | Dispatch full article pipeline for a topic |
Topic statuses: pending → scored → queued → processing → completed
Articles
Full CRUD for generated articles:
| Action | Description |
|---|---|
| Edit | Modify title, body, meta tags, status |
| Approve | Publish article (sets published_at) |
| Reject | Mark as rejected |
Review panel shows SEO score, readability, AEO score, duplicate flag, and fact-check flags.
Sources
Enable/disable and configure topic sources:
- Manual — topics entered by hand
- RSS — comma-separated feed URLs in config or
configkey-value in admin - News API — requires
NEWS_API_KEYand search query
Adjust performance_weight to boost sources that produce high-performing articles.
Freshness Queue
Articles flagged as needs_update appear here:
- Run Freshness Scan — scan all published articles
- Refresh — regenerate an updated draft through the full pipeline
AI Settings
Configure without touching .env:
- Site niche, description, author, URL
- Mode (review vs self-writing)
- Text and image providers
- Tone and target word count
- Humanization, fact-check, and inline image toggles
The Article Pipeline
When a topic is generated, it passes through these steps in order:
Each step logs to abe_ai_generation_logs with provider, tokens, and cost estimate.
Day-to-Day Usage
Workflow A: Fully automated (with review)
Workflow B: Manual topic → article
- Go to Topics → Create
- Enter title and summary (paste source content in summary for fact-checking)
- Set status to
queued - Click Generate on the topic row (or run
php artisan ai-blog-engine:generate {id}) - Review and approve in Articles
Workflow C: Self-writing (no human step)
Articles publish automatically when fact-check and duplicate checks pass.
Workflow D: Refresh aging content
Then use Freshness Queue in admin to refresh flagged articles.
Artisan Commands
| Command | Description |
|---|---|
php artisan ai-blog-engine:install |
Publish config, migrations, seed sources, Filament assets |
php artisan ai-blog-engine:install --migrate |
Same + run migrations |
php artisan ai-blog-engine:fetch-topics |
Fetch and AI-score topics from enabled sources |
php artisan ai-blog-engine:generate {topic?} |
Generate article for one topic ID |
php artisan ai-blog-engine:generate --queued |
Generate all queued topics |
php artisan ai-blog-engine:freshness-scan |
Scan published articles for freshness flags |
php artisan make:filament-user --panel=ai-blog-engine |
Create admin login |
php artisan filament:assets |
Re-publish Filament CSS/JS (fix unstyled admin) |
Scheduled Jobs
Registered automatically when APP_ENV runs in console. Customize cron in config/ai-blog-engine.php under schedule:
Override via env: ABE_SCHEDULE_FETCH_TOPICS, ABE_SCHEDULE_FRESHNESS, etc.
Publishing Modes
| Mode | Config | Behavior |
|---|---|---|
| Review | ABE_MODE=review |
Articles land in pending_review; human approves in admin |
| Self-writing | ABE_MODE=self_writing |
Auto-publish if no blocking fact-check flags and not duplicate-flagged |
Article statuses: draft → humanizing → fact_checking → seo_processing → pending_review → published
Also: scheduled, needs_update, rejected
Topic Discovery
Manual
Create topics in admin. Best practice: paste source article text in summary or store full content in raw_payload so fact-checking can verify claims.
RSS
Or configure feeds per-source in Sources → RSS → config key feeds as JSON array.
News API
Get a free key at newsapi.org.
AI Scoring
Each topic receives:
- Relevance score (0–100) — fit to your niche
- Opportunity score (0–100) — timeliness and content gap potential
Topics below ABE_MIN_RELEVANCE (50) or ABE_MIN_OPPORTUNITY (30) are not queued.
AI Providers
Text providers
| Driver | Env key | Notes |
|---|---|---|
groq |
GROQ_API_KEY or GROQ_API_KEYS |
Free tier, fast — supports multiple keys with auto-rotation on 429 |
openai |
OPENAI_API_KEY |
GPT-4o mini default |
claude |
ANTHROPIC_API_KEY |
Claude Sonnet default |
gemini |
GEMINI_API_KEY |
Gemini 2.0 Flash default |
Use one provider for all steps:
Multiple Groq keys (recommended for production / heavy usage):
When one key hits its rate limit, the package automatically switches to the next key — no job failure, no manual intervention.
You can still set GROQ_API_KEY for a single key; GROQ_API_KEYS takes precedence when set (comma-separated, no spaces required).
Keys are rotated round-robin for even load. On HTTP 429, the current key is skipped and the next is tried immediately.
Or override per pipeline step:
Programmatic usage
Image Providers
| Driver | Env key | Cost |
|---|---|---|
pollinations |
none | Free |
unsplash |
UNSPLASH_ACCESS_KEY |
Free (stock photos) |
openai |
OPENAI_API_KEY |
Paid (DALL-E 3) |
stability |
STABILITY_API_KEY |
Paid |
Images are stored on the disk configured in ABE_IMAGE_DISK (default: public) under abe-images/.
Frontend Integration
This package is backend-only. Query models from your own routes, controllers, or Livewire components.
Blade example
Livewire
Canonical URLs
Articles expose a url attribute using ABE_SITE_URL + ABE_BLOG_PATH:
Related articles
Models & Querying
| Model | Table | Purpose |
|---|---|---|
Topic |
abe_topics |
Discovered/scored topics |
TopicSource |
abe_topic_sources |
Source configuration |
Article |
abe_articles |
Generated articles |
ArticleFaq |
abe_article_faqs |
FAQ pairs |
ArticleImage |
abe_article_images |
Featured and inline images |
ArticleLink |
abe_article_links |
Internal links between articles |
FactCheckFlag |
abe_fact_check_flags |
Claim verification results |
AiGenerationLog |
abe_ai_generation_logs |
Per-step AI usage logs |
ArticleEdit |
abe_article_edits |
Human/AI edit audit trail |
ArticleAnalytic |
abe_article_analytics |
Pageview data for freshness/analytics |
Useful scopes
Publish manually
Programmatic Usage
Run the full pipeline
Generate with custom options
Dispatch as background job
Database Tables
Troubleshooting
Admin panel has no CSS / looks like plain HTML
Hard-refresh the browser (Ctrl+Shift+R).
Admin panel CSS loads but from wrong host
Set APP_URL in .env to exactly match your browser URL:
Articles stuck in processing
Ensure a queue worker is running:
Check storage/logs/laravel.log and the abe_ai_generation_logs table.
"API key not configured" errors
Verify the correct env key for your provider (GROQ_API_KEY, etc.) and run:
Images not displaying
Confirm ABE_IMAGE_DISK=public and files exist in storage/app/public/abe-images/.
No topics after fetch
- Check RSS feed URLs are valid and reachable
- Verify
NEWS_API_KEYif using News API - Lower
ABE_MIN_RELEVANCE/ABE_MIN_OPPORTUNITYin config - Topics with duplicate titles from the last 30 days are skipped
Fact-check flags everything as unverified
Paste the original source content into the topic summary or ensure raw_payload.content is populated when the topic is created.
Package Structure
License
MIT — free for personal and commercial use.
All versions of ai-blog-engine with dependencies
ext-json Version *
ext-mbstring Version *
filament/filament Version ^4.0
guzzlehttp/guzzle Version ^7.8
illuminate/console Version ^11.0|^12.0|^13.0
illuminate/database Version ^11.0|^12.0|^13.0
illuminate/http Version ^11.0|^12.0|^13.0
illuminate/routing Version ^11.0|^12.0|^13.0
illuminate/support Version ^11.0|^12.0|^13.0
spatie/laravel-package-tools Version ^1.16