Commit graph

583 commits

Author SHA1 Message Date
Paulo Castellano
5de993bc6c
Merge pull request #65 from trypostit/feat/docker-distribution
feat(docker): publish multi-arch image to GHCR + self-host compose
2026-05-27 16:02:32 -03:00
Paulo Castellano
09fa97d539 refactor(docker): align echo.ts with the shared sendkit config
Make resources/js/echo.ts byte-identical to the sendkit Echo setup
(VITE_REVERB_* read directly, no window.location derivation). The release
workflow now bakes only VITE_REVERB_APP_KEY, and compose.prod.yaml restores
the 8080 host port so the published image's Reverb client (baked at
localhost:8080) works for local docker compose. A custom-domain deploy needs
the image rebuilt with VITE_REVERB_HOST/PORT/SCHEME set.
2026-05-27 15:17:47 -03:00
Paulo Castellano
48727c80cd feat(docker): add Caddy reverse proxy and domain-portable Reverb config
Add an optional Caddy service (proxy profile) to compose.prod.yaml for
automatic HTTPS on a custom domain, with a Caddyfile that transparently
proxies WebSocket upgrades.

Move Echo setup into resources/js/echo.ts and derive the Reverb host from
window.location when VITE_REVERB_* is unset, so the published image's frontend
connects on any domain without a rebuild. The release workflow bakes a fixed
public Reverb key and leaves host/port/scheme empty to enable this; the Herd
dev setup keeps its explicit VITE_REVERB_* values, so its behaviour is
unchanged.

Drop the now-unneeded 8080 host port — the WebSocket rides the main HTTP(S)
port via the in-container nginx /app proxy.
2026-05-27 14:53:46 -03:00
Paulo Castellano
5b9226569f feat(docker): publish multi-arch image to GHCR and add self-host compose
Add a release workflow that builds docker/Dockerfile (production target) for
linux/amd64 and linux/arm64 on native runners and publishes a single
multi-arch manifest to ghcr.io/trypostit/trypost on every v*.*.* tag, tagged
with semver (1.2.3, 1.2, 1) and latest.

Add compose.prod.yaml: a self-host stack that pulls the published image
alongside Postgres and Redis with persistent volumes. Config is inline with
sectioned comments, including a commented S3/R2 block (storage already uses
the default disk, so switching is config-only).

No application code is changed.
2026-05-27 14:40:35 -03:00
Paulo Castellano
0602a02706
Merge pull request #63 from trypostit/docs/readme-markdown
docs: add Star History section to README
2026-05-25 17:11:43 -03:00
Paulo Castellano
7577029045 docs: add Star History section to README 2026-05-25 17:08:01 -03:00
Paulo Castellano
fc18f044af chore(release): enhance /release command for improved automation
Refines the /release slash command to streamline the weekly release process, ensuring better detection of version bumps and integration with the GitHub release API for automated note generation and email drafting.
2026-05-22 13:39:05 -03:00
Paulo Castellano
2cbf1d5be1
Merge pull request #62 from trypostit/chore/add-release-command
chore(release): add /release slash command for weekly ritual
2026-05-22 13:17:05 -03:00
Paulo Castellano
ff7ca65dc2 chore(release): switch to sequential versioning with rollover at 9
Replaces semver-by-commit-type detection with sequential numbering.
Patch increments on every release; rolls over to minor at patch=10;
rolls over to major at minor=10. No manual override — every release
is the next number in sequence.
2026-05-22 13:07:01 -03:00
Paulo Castellano
7e4fab3078 chore(release): add /release slash command for weekly ritual
Adds a Claude Code slash command that runs the Friday release flow:
auto-detects semver bump, generates the GitHub release via the native
generate-notes API, drafts a customer-facing email in Cal.com style
(themed prose, no internal references), runs the humanizer skill on the
email prose, and saves mirrors to releases/<version>/.
2026-05-22 13:00:50 -03:00
Paulo Castellano
d422289808
Merge pull request #60 from trypostit/fix/facebook-story-video-only
fix(facebook): restrict Page Stories to video-only
2026-05-21 21:25:03 -03:00
Paulo Castellano
8dfa664fa6 fix(facebook): restrict Page Stories to video-only
Facebook Stories do not work reliably with images via the Graph API.
Align validation and publisher with video-only (like Reel), while
Instagram Story continues to accept image or video.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 21:21:50 -03:00
Paulo Castellano
ade899c010
Merge pull request #59 from trypostit/fix/facebook-multi-image-form-encoding
fix(facebook): multi-image posts publish as text-only
2026-05-21 21:17:29 -03:00
Paulo Castellano
eed1019301 fix(facebook): send Graph API requests as form-urlencoded
Multi-image posts were published as text-only because Laravel sent
attached_media as JSON; Facebook accepts message but drops attachments.
Use asForm() for all FacebookPublisher Graph API calls.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 21:07:03 -03:00
Paulo Castellano
277093e52e
Merge pull request #58 from trypostit/fix/npm-audit-55
fix(security): resolve npm audit vulnerabilities
2026-05-21 20:37:32 -03:00
Paulo Castellano
a26aaafb65 fix(security): resolve npm audit in maizzle email toolchain
Apply npm audit fix to the separate maizzle package lockfile (14 vulnerabilities).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 20:29:32 -03:00
Paulo Castellano
c2134505e1 fix(security): resolve npm audit vulnerabilities
Bump transitive dependencies via npm audit fix to address 20 reported
vulnerabilities (including critical protobufjs). Closes #55.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 20:28:05 -03:00
Paulo Castellano
7a598615c3
Merge pull request #57 from trypostit/feat/ai-image-regenerate
feat: regenerate AI post images with brand palette
2026-05-21 20:25:27 -03:00
Paulo Castellano
0e204342a1 refactor(posts): standardize MediaItem type imports across components
- Added consistent imports of the MediaItem type across various components, including FacebookSettings, InstagramSettings, LinkedInSettings, PinterestSettings, PreviewTab, InstagramPreview, and PlatformPreview.
- This change enhances code organization and ensures uniformity in type definitions throughout the project.
2026-05-21 20:23:20 -03:00
Paulo Castellano
b980212225
Merge branch 'main' into feat/ai-image-regenerate 2026-05-21 20:23:02 -03:00
Paulo Castellano
666402c59f feat(billing): add configuration for trial signup card requirement
Introduced a new environment variable `REQUIRE_CARD_FOR_TRIAL` to control whether a credit card is required for trial signups. Updated the billing configuration to reflect this setting, allowing for more flexible trial management.
2026-05-21 20:19:45 -03:00
Paulo Castellano
e91e0e4c29
Merge branch 'main' into feat/ai-image-regenerate 2026-05-21 20:16:16 -03:00
Paulo Castellano
c18c1b9c0d
Merge pull request #56 from trypostit/fix/require-card-for-trial
fix(billing): require card-backed trial again
2026-05-21 20:12:18 -03:00
Paulo Castellano
2fff7f66f3 fix(billing): update default trial days to 8 in cashier config
Increase the default trial duration from 7 to 8 days in the cashier configuration to better align with user feedback and improve trial experience.
2026-05-21 20:04:16 -03:00
Paulo Castellano
91a144142f feat(posts): introduce change_mode for flexible image and text regeneration
- Replaced the `regenerate_image` boolean with a `change_mode` string parameter in the PostImageRegenerator schema, allowing for more granular control over regeneration options.
- Updated methods in RegeneratePostMediaImage to handle the new `change_mode` values: `image_only`, `text_only`, and `both`.
- Enhanced documentation and comments to clarify the new regeneration logic.
- Added tests to verify correct behavior for different regeneration modes, ensuring that text and image changes are handled appropriately.
2026-05-21 20:00:41 -03:00
Paulo Castellano
33e53f5bca feat(posts): add regenerate_image option for background image handling
- Introduced a new `regenerate_image` boolean parameter in the PostImageRegenerator schema to control background image regeneration.
- Updated relevant methods in RegeneratePostMediaImage and TemplateImageGenerator to utilize the new parameter for reusing existing backgrounds when appropriate.
- Enhanced documentation and comments to clarify the usage of the `regenerate_image` option.
- Added tests to ensure correct behavior when reusing background images.
2026-05-21 19:52:12 -03:00
Paulo Castellano
8a9ff81a96 refactor(posts): simplify AiRegenerateImageDialog logic and enhance type safety
- Replaced custom regeneration logic with a composable for improved organization and reusability.
- Streamlined state management and error handling, enhancing clarity and maintainability.
- Removed unused imports and interfaces, reducing code complexity and improving readability.
- Updated computed properties for better form submission validation and user experience.
2026-05-21 19:40:42 -03:00
Paulo Castellano
72c9c93a85 refactor(posts): replace PostStatusGuard with PostStatusRules for editing and deletion checks
- Removed the PostStatusGuard class and replaced its usage with the new PostStatusRules utility across multiple controllers and actions, enhancing code organization and maintainability.
- Updated error message handling to utilize the centralized method in PostStatusRules, ensuring consistency in user feedback.
- Deleted associated tests for PostStatusGuard, reflecting the removal of the class.
2026-05-21 19:32:42 -03:00
Paulo Castellano
7854596579 refactor(posts): centralize post editing status checks with PostStatusGuard
- Replaced direct status checks in multiple controllers and actions with the PostStatusGuard utility, improving code readability and maintainability.
- Updated error messages to utilize a centralized method for consistency across the application.
- Removed the BrandImagePalette class, consolidating color resolution logic into the AiImageClient for better organization and type safety.
2026-05-21 19:27:19 -03:00
Paulo Castellano
4d8452dbc8 refactor(posts): enhance regeneration dialog logic and type safety
- Improved type definitions for regeneration status and event handling, increasing clarity and maintainability.
- Streamlined the regeneration result handling by introducing a dedicated function to manage success and error states.
- Added computed properties to optimize form submission logic, ensuring better user experience and validation.
- Refactored the subscription logic to improve readability and error handling during media regeneration.
2026-05-21 19:12:50 -03:00
Paulo Castellano
a008555589 refactor(posts): streamline media item handling and improve type definitions
- Refactored the media item interface by moving it to a dedicated type file, enhancing code organization and reusability across components.
- Updated various components to import the new MediaItem type, ensuring consistency and reducing redundancy in type definitions.
- Improved the RegeneratePostMediaImage job by optimizing the media regeneration process and enhancing error handling for better reliability.
2026-05-21 19:08:46 -03:00
Paulo Castellano
98632404a9 chore: update AI agent guidelines and refactor prompt handling
- Added guidelines for AI agents to avoid embedding prompts in PHP and to store them in Blade files under `resources/views/prompts/`.
- Updated `PostImageRegenerator` to render prompts using Blade instead of heredocs, improving maintainability and consistency with project standards.
- Enhanced documentation in `CLAUDE.md` and `.cursor/rules` files to reflect these changes.
2026-05-21 18:53:37 -03:00
Paulo Castellano
560393db2a feat: regenerate AI post images with brand palette in editor
Let users adjust AI-generated slides in place via async job and Echo, while applying workspace brand, background, and text colors to image prompts. Autofill swaps site text/background colors for the image palette, and regeneration is blocked on finalized posts with safer job cleanup.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 16:27:55 -03:00
Paulo Castellano
e8fcbfa230 refactor(billing): make trial toggle fixed in trypost config
Keep the trial card requirement switch as a plain boolean in config/trypost.php so changing the app flow is a single in-repo config edit without env wiring.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 10:09:20 -03:00
Paulo Castellano
3611e882b4 feat(billing): make trial card requirement configurable
Add a trypost config toggle to switch between card-required checkout trials and no-card signup trials, and wire signup, checkout, access gating, UI copy, and tests to both modes.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 10:02:38 -03:00
Paulo Castellano
a8f999f45f chore(billing): surface trial copy and rename signup test
Show the checkout-based trial duration again on the subscribe page and rename the signup billing test file so it matches the current no-trial-at-signup behavior.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 09:57:46 -03:00
Paulo Castellano
26c738c0ba fix(billing): require card-backed trial again
Revert the no-card signup trial flow so access depends on a Stripe subscription trial started at checkout, preventing app access before a payment method is collected.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 09:49:44 -03:00
Paulo Castellano
a4e1757535
Merge pull request #54 from trypostit/chore/cursor-rules
chore(cursor): add Cursor project rules
2026-05-19 19:28:16 -03:00
Paulo Castellano
4c9243ccb9 chore(cursor): add Cursor rules for Laravel and frontend stacks
Ship .cursor/rules MDC files covering project context, Laravel patterns,
Boost tooling, PHP style, Inertia v3/pagination, Vue/TypeScript, Pest, and Dusk.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-19 19:26:49 -03:00
Paulo Castellano
5f40b7bd6a
Merge pull request #43 from trypostit/feat/posthog-onboarding-properties
feat(posthog): keep social_accounts_count and posts_count fresh on account group
2026-05-19 19:25:58 -03:00
Paulo Castellano
da0d5f2a42 fix(posthog): simplify user identification and account usage sync
Refactor the user identification process by removing unnecessary type casting for user ID and account ID. This change enhances code readability and maintains functionality for syncing account usage.
2026-05-19 19:20:56 -03:00
Paulo Castellano
ccd78e3c8d fix(posthog): harden usage sync after deletes and workspace removal
Use Account::postsCountCacheKey everywhere, avoid findOrFail when syncing
post deletes, dispatch SyncAccountUsage after DeleteWorkspace when enabled,
and add coverage for the new paths.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-19 19:01:53 -03:00
Paulo Castellano
a659a9eadf
Merge branch 'main' into feat/posthog-onboarding-properties 2026-05-19 17:00:34 -03:00
Paulo Castellano
ac1a362f2a
Merge pull request #41 from trypostit/fix/facebook-empty-message
fix(facebook): empty-message rejection + state consistency + no re-publish on terminal
2026-05-19 17:00:16 -03:00
Paulo Castellano
35051350c6 refactor(posts): encode scheduled_at for API via date helper
Parse datetime-local values in the user timezone before converting to UTC,
matching formatUtcForDateTimeLocalInput. Fix ESLint import order in usePostCompliance.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-19 16:42:42 -03:00
Paulo Castellano
df35d1b671 feat(posts): add validation message for past date selection in PickTimePopover
- Introduced a new translation key for future date selection prompts in English, Spanish, and Portuguese.
- Implemented logic to disable the confirm button and display a warning message when a past date is selected in the PickTimePopover component.
- Updated date formatting utility to handle UTC dates for HTML datetime-local inputs.
2026-05-19 16:26:40 -03:00
Paulo Castellano
1d61904bc8 refactor(posts): collapse TikTok/Pinterest meta rules into PLATFORM_META_RULES map 2026-05-19 15:36:51 -03:00
Paulo Castellano
3580d2eaf6 refactor(posts): flatten togglePlatform with snapToCompatibleVariant helper
Pull the variant-snap branch out of togglePlatform into a named
helper with guard clauses. togglePlatform now reads top-down:
lock check → deselect short-circuit → snap → select.
2026-05-19 15:15:13 -03:00
Paulo Castellano
2584257ee6 refactor(posts): extract Edit.vue validation logic into usePostCompliance
Pulls ~200 lines of media/platform/length compliance and tooltip
derivation into composables/usePostCompliance.ts. Edit.vue is now
focused on state, save logic and event handlers; PLATFORM_VARIANTS
and the per-content-type media-rule check are exposed from the
composable for togglePlatform.
2026-05-19 15:11:58 -03:00
Paulo Castellano
cad89a0a97 revert(posts): drop redundant router.visit in Edit.vue Echo handler
The backend edit() controller already redirects posts in terminal
states to /show; Inertia follows that redirect on partial reload.
2026-05-19 14:57:38 -03:00