Foundational layer for the YouTube Content Creation System project, built as a fully independent domain per the earlier decision (task #47) — no foreign keys into the existing projects/tasks/ideas tables. Schema: video_projects, workflow_steps, assets, ai_providers, workflow_templates (named to avoid colliding with the existing Post-templates `templates` table). WorkflowEngine (app/Support/VideoWorkflow/) drives a project's step sequence: start/startFromTemplate, currentStep, completeStep (with optional approval gating), approveStep/rejectStep, failStep/retryStep, skipStep. It only manages state transitions — actual step execution (AI calls, rendering, etc.) is out of scope here (tasks #33+). Also fixes four Publisher classes (WordPress/Reddit/Twitter/LinkedIn) that were missing a `use App\Models\SocialAccount;` import after an earlier interface change, which broke the entire test suite at bootstrap; and PostFactory, which still set the now-removed `social_account_id` column instead of the SocialAccount pivot. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Muninn
Muninn is a personal content-operations hub. It keeps track of your Sites, Social Accounts, and Posts, and exposes them over a local JSON API so an AI agent (or you, via the built-in UI) can draft, schedule, and publish content across WordPress blogs, Reddit, and other platforms.
Built with Laravel 13, Livewire, and Tailwind CSS.
What it does
- Sites — the websites you own (WordPress, custom, or other), with optional WordPress Application Password credentials for publishing.
- Social Accounts — logins for social networks (Twitter, Instagram, Facebook, Reddit, TikTok, LinkedIn, YouTube, etc.).
- Posts — the actual content, each tied to a Site and optionally a
Social Account, moving through
draft -> scheduled -> publishing -> published/failed. - A JSON API (
/api/sites,/api/accounts,/api/posts) plus thin Python CLI wrappers inpython_scripts/, so an agent can poll for due posts (?due=1) and drive the publish lifecycle without hand-rolling HTTP requests. - A Publish button in the UI (Posts page) for any post whose network has a publisher wired up — queues a background job so slow, flaky publishers (e.g. Reddit's browser automation) don't block the page.
- Built-in publishers (
app/Support/Publishing/), one per network, resolved byPost.type:- WordPress: posts directly to a site's WordPress REST API. If
Post.image_urlis set (optional, for every post type), it's uploaded and used as the featured image. Also available synchronously from the CLI:php artisan posts:publish {post_id}. - Reddit: drives a standalone Playwright sidecar at
sidecars/reddit-post/that logs in and creates a post. - Anything else: no publisher yet — publish however fits, then report back via the API.
- WordPress: posts directly to a site's WordPress REST API. If
See AI_API.md for the full API reference and publishing contract, and
python_scripts/README.md for the CLI wrapper usage.
Note: the JSON API has no authentication and returns credentials in plain text by design — it's meant to run on your local network only, not be exposed to the public internet.
Requirements
- PHP 8.3+
- Composer
- Node.js + npm
- MySQL (or another Laravel-supported database)
Setup
composer install
cp .env.example .env
php artisan key:generate
Edit .env and set your database credentials (DB_DATABASE,
DB_USERNAME, DB_PASSWORD, etc. — defaults assume a local MySQL
database named muninn), then run migrations:
php artisan migrate
Install JS dependencies and build frontend assets:
npm install
npm run build
Alternatively, run everything in one shot with:
composer run setup
Running locally
composer run dev
This starts the PHP dev server, queue listener, log viewer (Pail), and
Vite dev server together. The app is served at http://localhost:8000 by
default.
Outside of composer run dev (e.g. a plain production deploy), the Publish
button needs its own queue worker running, or queued publishes will just sit
in the jobs table:
php artisan queue:work
Reddit sidecar (optional)
If you plan to publish to Reddit, set up the Playwright sidecar separately:
cd sidecars/reddit-post
npm install
npx playwright install
See sidecars/reddit-post/README.md for usage.
Testing
composer test
License
The Laravel framework is open-sourced software licensed under the MIT license.