m105andClaude Sonnet 5 55fa2ebfda Add script/TTS step handlers, dashboard, and pipeline UI (#35, #36, #43, #44)
StepHandler abstraction (app/Support/VideoWorkflow/StepHandlers/) plugs
into WorkflowEngine without coupling it to how any given step type is
actually executed:
- ScriptGenerationHandler: builds a prompt from the project's title/
  description (or an explicit outline/tone/keywords/target length in
  step input), generates via an active OpenAI AiProvider, stores the
  result as a 'script' asset.
- TtsVoiceoverHandler: voices step.input.text, or falls back to the
  project's latest script asset, via an active ElevenLabs AiProvider;
  voice_id/model_id are configurable per step. No direct "speed"
  control — ElevenLabs' base TTS endpoint doesn't expose one.

RunWorkflowStepJob resolves a step's handler by type and runs it on
the queue, matching the existing PublishPostJob pattern (including a
stale-dispatch guard: no-op if the step isn't 'in_progress' anymore).

UI, under its own /video-projects routes and nav entry — separate
from /projects per the earlier decision:
- VideoProjects/Index (#43): list projects with status and step
  progress, create new ones.
- VideoProjects/Show (#44): start a project from a WorkflowTemplate or
  a hardcoded default 8-step pipeline; per-step Run/Approve/Reject/
  Retry/Skip actions; auto-queues the next step after any transition
  when a handler exists for its type (steps with no handler yet just
  sit in_progress rather than auto-failing); lists project assets.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 20:56:01 +03:00

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 in python_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 by Post.type:
    • WordPress: posts directly to a site's WordPress REST API. If Post.image_url is 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.

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.

S
Description
No description provided
Readme
395 KiB
Languages
PHP 77.6%
Blade 16.3%
JavaScript 3.3%
Python 1.9%
Shell 0.8%