Five small fixes scoped to the publishReel method: 1. Replace generic \Exception on media download failure with a typed FacebookPublishException(ServerError). The generic exception was landing in the \Throwable catch in PublishToSocialPlatform with category 'unknown', defeating the whole point of the social exception hierarchy. 2. Replace handleApiError($startResponse) with a direct FacebookPublishException throw when video_id/upload_url are missing. The previous code passed a successful HTTP response into a method built for error responses — fromApiResponse would fall into the default arm and surface 'An unknown Facebook error occurred.' ironically reintroducing the same bad UX we just spent the day fixing. 3. Drop the four redundant Log::error calls before handleApiError. FacebookPublishException::fromApiResponse already pulls the FB error code/subcode/message into platformErrorCode + userMessage, and the downstream catch in PublishToSocialPlatform::handle logs the exception anyway (Nightwatch picks that up). Same pattern as the X cleanup in PR #29. 4. Stream the upload body via fopen() resource instead of file_get_contents(). Eliminates loading the whole video into memory for large reels. 5. Replace \@unlink with unlink + Log::warning. Surfaces temp-file cleanup failures instead of silently leaking files. Tests: - Strengthened the missing-upload_url test to assert the exception message and class. - Added a typed-exception test for the media-download failure path (would have caught the regression where we used a generic \Exception). - Full suite green: 1505 passed, 2 skipped, 0 failed. |
||
|---|---|---|
| .claude/skills | ||
| .github | ||
| app | ||
| bootstrap | ||
| config | ||
| database | ||
| lang | ||
| maizzle | ||
| public | ||
| resources | ||
| routes | ||
| storage | ||
| stubs | ||
| templates | ||
| tests | ||
| .editorconfig | ||
| .env.ci | ||
| .env.example | ||
| .env.testing | ||
| .gitattributes | ||
| .gitignore | ||
| .mcp.json | ||
| .prettierignore | ||
| .prettierrc | ||
| artisan | ||
| boost.json | ||
| CLAUDE.md | ||
| components.json | ||
| compose.yaml | ||
| composer.json | ||
| composer.lock | ||
| eslint.config.js | ||
| GEMINI.md | ||
| LICENSE.md | ||
| package-lock.json | ||
| package.json | ||
| phpunit.xml | ||
| pint.json | ||
| README.md | ||
| tsconfig.json | ||
| vite.config.ts | ||
The open-source alternative to Buffer, Hootsuite, and Later.
Schedule, write, and publish to every social network from one place.
Self-hosted. Built for teams, agencies, and creators who own their data.
Cloud • Documentation • Roadmap • Community
TryPost 1.0 is here
A massive release that turns TryPost into a complete open-source social media platform.
- MCP Server — connect Claude, Cursor, ChatGPT, and any MCP client. Schedule, publish, and pull metrics with natural language.
- REST API — Personal Access Tokens, every workflow you can do in the dashboard, available over HTTP.
- Workspaces & Teams — manage multiple brands or clients in isolated environments. Invite team members with role-based permissions.
- AI Carousel Generator — type a prompt, get a multi-slide LinkedIn / Instagram carousel back, with images and copy on-brand.
- Brand Profile — set tone, voice, language, and colors once. Every AI generation respects them automatically.
- Analytics — per-account engagement metrics from every platform that exposes them, in a single dashboard.
Read the release notes →
Why TryPost
Tired of paying $30–$200/month per user for a scheduler? Tired of your content sitting on someone else's database?
| Self-hosted, your data | Your posts, drafts, and metrics never leave your server |
| No artificial limits | Unlimited posts, unlimited connected accounts, unlimited workspaces |
| AI built in | Captions, carousels, on-brand voice — using your own keys |
| Multi-tenant ready | Workspaces + roles for agencies managing many clients |
| API + MCP first-class | Automate everything; your AI assistant can post for you |
| AGPL-licensed | Inspect every line, fork it, ship it — forever free |
Features
| Visual Calendar | See every scheduled post at a glance, switch between month/week/day |
| Multi-Platform Composer | One draft → preview & tweak for every network in parallel |
| AI Generate / Review | Draft from a prompt, get inline feedback before you publish |
| AI Carousel Builder | Prompt → multi-slide carousel with images, on-brand |
| Brand Profile | Tone, voice, language, colors — applied to every AI call |
| Asset Library | Reusable workspace media + Unsplash & Giphy search built in |
| Signatures & Labels | Reusable text blocks (hashtags, CTAs) and color-coded post tags |
| Team Collaboration | Owner / Admin / Member roles, comments with @mentions on drafts |
| Workspaces | Isolate brands, clients, or projects in their own spaces |
| REST API + MCP | Full programmatic control; AI assistants integrate natively |
| Analytics | Per-account engagement metrics across every supported platform |
| Multi-language | English, Spanish, Portuguese |
Supported Platforms
X (Twitter) |
TikTok |
|||
YouTube |
Threads |
Bluesky |
Mastodon |
Get Started
| Try it on Cloud | The fastest way. Sign up at trypost.it |
| Self-host | Free forever. Installation guide → |
| Run with AI assistants | Connect Claude / Cursor / ChatGPT via MCP → |
Contributing
We love contributions, no matter how small. Pick an issue, say hi in Discussions, or just open a PR with what you'd like to see.
If TryPost is useful to you, a star helps more people find it. That's the most valuable contribution if you're short on time.
License
GNU Affero General Public License v3.0 — use, modify, fork, self-host, and redistribute, including commercially. If you run a modified version as a network service, you need to make your changes available to its users (AGPL §13).
Built openly by the community. Star us on GitHub and tell a friend.