No description
Find a file
Paulo Castellano bde10059e3 feat: add brand autofill from website URL in onboarding
Users on the Brand step can type their website URL and click
'Preencher' (Portuguese) / 'Autofill' (English). The backend fetches
their homepage, parses standard meta tags, and returns:

- name        ← og:site_name | title (suffix stripped at ' | ', ' - ')
- description ← meta[name=description] | og:description
- language    ← <html lang> mapped to en / pt-BR / es
- logo        ← apple-touch-icon | largest link[rel*=icon] | og:image

The logo is downloaded, validated (mime whitelist, 2MB max), and
attached to the workspace's 'logo' media collection so the avatar
updates immediately.

Zero LLM calls, zero external APIs. Uses symfony/dom-crawler +
symfony/css-selector (newly required) for meta extraction. Everything
else (Http client, workspace media, Intervention) was already in the
project.

Security:
- SSRF guardrail: resolves the host, rejects private / loopback /
  link-local ranges, enforces http(s) scheme on both the initial
  page fetch and the logo download.
- Rate limited at 10 req/min per user via the throttle middleware
  alias on the route.
- Logo content-type must be one of the allowed image mimes; wrong
  types are silently dropped so users never see broken images.

UX:
- 'Autofill' button next to the website input, disabled until there
  is a URL; shows a spinner while running.
- If a logo was captured, a small preview appears below the input
  so users can see what was pulled before saving.
- Success and error paths both surface as vue-sonner toasts, with
  translations in en / pt-BR / es.
- Failures leave the form untouched — nothing is destructively
  overwritten if parsing gave us nothing.

Tests (16 new): action-level coverage for happy path, title-suffix
fallback, language code normalization across 6 locales, scheme
rejection, private-range SSRF rejection, implicit https prefixing,
empty sites, upstream errors, and wrong-mime logo rejection. Plus
two controller-level tests for the autofill endpoint.
2026-04-16 11:13:54 -03:00
.claude/skills feat: add CommentsTab component with replies, reactions, and real-time 2026-04-15 20:15:29 -03:00
.github fix: reorder CI steps — env before composer, key after 2026-03-31 12:08:04 -03:00
app feat: add brand autofill from website URL in onboarding 2026-04-16 11:13:54 -03:00
bootstrap refactor: auth split layout, subscribe redesign, onboarding, i18n, cookie locale 2026-03-30 11:53:42 -03:00
config chore: install laravel/ai SDK v0.5.1 2026-04-16 09:30:12 -03:00
database feat: add workspace content_language setting for AI generation 2026-04-16 10:37:03 -03:00
docs/superpowers feat: introduce Account entity as billing owner and refactor architecture 2026-04-14 22:22:04 -03:00
lang feat: add brand autofill from website URL in onboarding 2026-04-16 11:13:54 -03:00
maizzle chore: reverting domains 2026-03-31 11:35:49 -03:00
public chore: posthog, ui, features and more 2026-03-30 21:18:07 -03:00
resources feat: add brand autofill from website URL in onboarding 2026-04-16 11:13:54 -03:00
routes feat: add brand autofill from website URL in onboarding 2026-04-16 11:13:54 -03:00
storage chore: first commit 2026-01-14 22:13:44 -03:00
stubs feat: implement MCP server with tools, Post API tests, auth middleware 2026-03-29 20:30:36 -03:00
tests feat: add brand autofill from website URL in onboarding 2026-04-16 11:13:54 -03:00
.editorconfig chore: first commit 2026-01-14 22:13:44 -03:00
.env.ci feat: adding tests.. 2026-01-18 22:01:55 -03:00
.env.example feat: complete AI assistant with custom services and brand config 2026-04-16 09:25:08 -03:00
.env.testing feat: improvements on ui 2026-01-21 20:50:57 -03:00
.gitattributes chore: first commit 2026-01-14 22:13:44 -03:00
.gitignore chore: working 2026-04-02 17:57:06 -03:00
.mcp.json chore: update boost skills and config 2026-03-31 09:36:09 -03:00
.prettierignore chore: first commit 2026-01-14 22:13:44 -03:00
.prettierrc chore: first commit 2026-01-14 22:13:44 -03:00
artisan chore: first commit 2026-01-14 22:13:44 -03:00
boost.json feat: add CommentsTab component with replies, reactions, and real-time 2026-04-15 20:15:29 -03:00
CLAUDE.md feat: add CommentsTab component with replies, reactions, and real-time 2026-04-15 20:15:29 -03:00
components.json chore: first commit 2026-01-14 22:13:44 -03:00
compose.yaml feat: add documentation for connecting social media platforms and getting started guide 2026-01-18 18:57:15 -03:00
composer.json feat: add brand autofill from website URL in onboarding 2026-04-16 11:13:54 -03:00
composer.lock feat: add brand autofill from website URL in onboarding 2026-04-16 11:13:54 -03:00
eslint.config.js chore: first commit 2026-01-14 22:13:44 -03:00
GEMINI.md chore: update config files and remove unused translation files 2026-01-26 12:02:24 -03:00
LICENSE.md feat: Introduce a self-hosted mode, refactor email notifications to use Mailable classes with new templates, and update the project README. 2026-01-18 17:48:12 -03:00
package-lock.json fix: resolve all TypeScript errors 2026-03-31 09:34:39 -03:00
package.json fix: resolve all TypeScript errors 2026-03-31 09:34:39 -03:00
phpunit.xml feat: adding tests 2026-01-18 22:04:34 -03:00
pint.json chore: first commit 2026-01-14 22:13:44 -03:00
README.md fix: Stripe webhook setup completion, notifications routing, billing UI 2026-03-31 13:52:36 -03:00
tsconfig.json chore: first commit 2026-01-14 22:13:44 -03:00
vite.config.ts feat: Implement soft deletes for workspace hashtags and labels, and integrate content_type into the initial post platforms table creation. 2026-01-17 14:44:37 -03:00

TryPost

The open-source social media scheduling platform

Schedule, manage, and publish content to all your social media accounts from one place.
Self-hosted. Privacy-focused. No limits.

Stars License Release

DocumentationRoadmapCommunity


Why TryPost?

Tired of paying expensive monthly fees for social media scheduling tools? Want full control over your data? TryPost is the solution.

100% Open Source Inspect the code, contribute, make it yours
Self-Hosted Your data stays on your servers
No Limits Schedule unlimited posts, connect unlimited accounts
Privacy First No tracking, no analytics, no data selling

Features

Visual Calendar Drag and drop posts across your content calendar
Post Composer Create and preview posts for multiple platforms at once
Media Library Upload images and videos with automatic optimization
Team Collaboration Invite team members with role-based permissions (Owner, Admin, Member)
Workspaces Manage multiple brands or clients separately
REST API Full API with Bearer token authentication
MCP Server AI-ready with Model Context Protocol support
Google Login Sign up and log in with Google OAuth
Notifications In-app and email notifications for post status
i18n Available in English, Spanish, and Portuguese

Supported Platforms


X (Twitter)

LinkedIn

Facebook

Instagram

TikTok

YouTube

Pinterest

Threads

Bluesky

Mastodon

Tech Stack

Layer Technology
Backend Laravel 13, PHP 8.4
Frontend Vue 3, Inertia.js v3, Tailwind CSS v4
Database PostgreSQL
Queue Redis + Laravel Horizon
WebSockets Laravel Reverb
API REST with Bearer token auth
MCP Laravel MCP for AI integrations
Payments Laravel Cashier (Stripe)

Getting Started

Get TryPost running in minutes:

Installation Guide Step-by-step setup
Docker Setup Run with Laravel Sail
Configuration Environment setup
Platform Setup Connect your social accounts

Quick Start

git clone https://github.com/trypost-it/trypost.git
cd trypost
cp .env.example .env
composer install
npm install
php artisan key:generate
php artisan migrate
npm run build

API

TryPost includes a REST API for programmatic access. All endpoints are under /api and require a Bearer token.

curl -H "Authorization: Bearer tp_your_token" \
  https://your-domain.com/api/posts

See the API documentation for all available endpoints.

MCP Server

TryPost ships with a Model Context Protocol (MCP) server at /mcp/trypost, enabling AI assistants to manage your social media directly.

Contributing

We love contributions! Check the issues for open tasks.

License

TryPost is licensed under the Functional Source License (FSL).

You can: Use for personal or business use, self-host, modify and contribute.

You cannot: Offer as a competing SaaS, white-label and resell.


If TryPost helps you, please give us a star