inovector/mixpost
Mixpost is a self-hosted social media management platform built with Laravel. Schedule and publish posts across multiple accounts, collaborate with teams, manage a content calendar, and track analytics from one customizable dashboard without per-seat SaaS fees.
Mixpost is a self-hosted Buffer alternative shipped as a Laravel package: it adds routes, migrations, models, queue jobs, and an Inertia/Vue admin UI to an existing Laravel app. Treat it as a mini-application mounted inside your app, not as a library of composable helpers.
Minimum path to a first scheduled post:
composer require inovector/mixpost
php artisan mixpost:install
php artisan migrate
php artisan storage:link
If you use Mixpost Pro, set MIXPOST_LICENSE_KEY before visiting the UI.config/mixpost.php first. It controls the mount path (often MIXPOST_PATH, default /mixpost), middleware/auth, enabled social providers, queue connection, media disk, and other package behavior. This is the file you will revisit most.config/services.php / .env. Copy the callback URL exactly as the package generates it—normally based on APP_URL plus the Mixpost path.php artisan route:list --path=mixpost to see the mounted routes, then visit the UI, connect one account, and schedule a post a few minutes in the future.php artisan queue:work and ensure php artisan schedule:run fires every minute. Without both, posts remain "scheduled" forever.Where to look first when behavior is unclear: config/mixpost.php, the package migrations (core models are Post, Account, Media, Tag), Inovector\Mixpost\Models, and the package source under vendor/inovector/mixpost/src. Do not start by editing vendor views; most integration work belongs in config, middleware, and your own app code.
First real use case: mount Mixpost at an admin-only path, connect a single Facebook page or X account, schedule one text post plus one image post, and verify the full draft → scheduled → published lifecycle before inviting users.
Embed it behind your existing auth and admin policy. The package uses your application's users but cannot know your roles. Set the path to something like admin/social, keep web + auth middleware, and add your own authorization middleware or Gate around the Mixpost route group. Link to it from your admin navigation rather than exposing it publicly.
Use the UI as the authoring surface, not a reimplementation target. Mixpost's value is the calendar, queue, media library, and account management. Rebuilding those in your app is wasted effort. Integrate by linking users into Mixpost and keeping your own domain workflows elsewhere.
Automate content creation through the package models, carefully. For product launches, blog announcements, or internal alerts, create scheduled posts from your own domain events. Use the Mixpost Eloquent models and inspect the migrations/form requests for required fields and per-account publishing records. Keep creation in a small service class so package upgrades are easier to absorb. If the package exposes actions/services used by its controllers, prefer reusing those over raw inserts.
Isolate publishing jobs on a dedicated queue. Configure Mixpost to use its own queue connection/name (for example mixpost) so slow social API calls, media processing, and retries do not starve your application jobs. Run a separate worker for that queue and monitor failed_jobs.
Register a custom social provider when you need an internal or niche network. Mixpost has a provider abstraction used by its built-in networks. The pattern is to implement the provider contract, wire OAuth/account retrieval/publishing methods, and register the provider in config/mixpost.php. Verify the exact abstract class and config shape against the installed version before committing; this is a powerful but version-sensitive extension point.
Use events and jobs rather than patching vendor code. If you need notifications on publish success/failure, listen to the package's events or observe post status changes. For audit trails, add your own table and write to it from listeners instead of modifying Mixpost tables.
Promote environments with separate social apps. Use different OAuth credentials for local, staging, and production. Local OAuth is painful because most networks require public HTTPS callbacks; use a tunnel or a staging domain. Keep APP_URL correct per environment—Mixpost derives callback URLs from it.
Plan for localization and branding early. Publish and override language files if your users are non-English. Branding is more constrained because the UI is compiled Inertia/Vue; prefer config-level naming/colors and avoid forking the frontend unless you are prepared to maintain it.
php artisan schedule:list, the queue connection in config/mixpost.php, and failed_jobs.APP_URL, the Mixpost path, or using a proxy can invalidate redirect URIs. Re-copy the callback URL from the package after any path change.storage:link can break publishing even though the UI preview looks fine. Confirm the media disk and public URL configuration.php artisan config:clear and route:clear after changing the path, middleware, providers, or queue settings. Cached config is a common source of "my change did nothing."composer.json for production and upgrade deliberately.failed_jobs show the underlying exception. Reproduce with a single account and a simple text post before adding media or threads.How can I help you explore Laravel packages today?