m105andClaude Sonnet 5 c249a14d78 Add storyboard/video-gen/video-editing handlers and asset previews (#37-39, #45, #46)
StoryboardHandler (#37): breaks the project's script into a numbered
scene-by-scene breakdown (description + image prompt per scene) via
OpenAI in JSON mode (added json_mode support to OpenAiDriver for
reliable structured output), stored as a JSON asset.

VideoGenerationHandler (#38): generates one still image per storyboard
scene via StabilityAI — the scene *visuals*, not motion/video clips
(no text-to-video model integrated; see the task comment for why).

VideoEditingHandler (#39): the step that actually produces a video
file — assembles the scene stills into an MP4 via ffmpeg's concat
demuxer, timed to the voiceover audio's duration (probed via ffprobe)
or a fixed per-scene duration if there's no audio, then muxes the
audio track in. Verified against the real ffmpeg/ffprobe binaries on
this box, not just Process::fake().

Asset previews (#45, #46): a reusable partial renders each asset
inline by type — image/audio/video get real playback elements, text/
JSON gets a truncated <pre> block, everything else a download link.
Wired into both the awaiting_approval step view (so approving/
rejecting is an actual content review, not just a word count) and a
general project assets grid.

Also fixes a latent bug in AssetStorage::url(), found while wiring up
previews: it called Storage::url() on the default 'local' disk, which
has no configured URL driver and throws in production — only worked
before because Storage::fake() is more permissive than the real local
driver. Now serves assets through a new authenticated streaming route
instead (VideoProjectAssetController).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 21:15:31 +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%