- 01 Aug, 2026 3 commits
-
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Instead of reading invoices.total_amount, now queries the payments table: - Sums inbound/confirmed payments (gross income) - Subtracts inbound/refunded payments (refunds) - Applies plan.platform_fee_percent on the net feeable amount Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The fee collector was reading service_fee_amount from the instance's invoices table (always 0). Now calculates fee as total_amount * plan.platform_fee_percent. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 10 Jul, 2026 4 commits
-
-
Mahmoud Aglan authored
Solves chicken-and-egg: Meta verifies webhook before credentials are saved. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
PostgreSQL rejects encrypted (base64) strings in jsonb columns. The encrypted:array cast produces non-JSON output that must be stored as text. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- WhatsAppService now reads credentials from messaging_channels table (encrypted:array cast) instead of config/env vars - New MessagingSettings Livewire page to configure credentials from UI - Webhook verify token also read from DB - API Keys page auto-pushes MESSAGING_HUB_URL + KEY to instances via CapRover env vars on generate/regenerate - Sidebar shows messaging sub-nav when on messaging pages - Removed hardcoded whatsapp config from manager.php Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Full messaging hub that instances call via API to send WhatsApp messages: - Meta Graph API v25.0 integration (text, template, image, document) - API endpoint POST /api/messaging/send (auth via X-Messaging-Key header) - Per-instance API keys with rate limiting - WhatsApp webhook for delivery status updates - Admin UI: dashboard stats, compose, message log, API key management - Sidebar nav integration Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 05 Jul, 2026 25 commits
-
-
Mahmoud Aglan authored
- Switch logs from broken POST /appDefinitions/logs to working GET /appData/{app} - Add x-namespace header to auth call - Add activate() method to transition trial/suspended → active - Add Activate button in instance-show view - Rename "Container Logs" to "Build Logs" (reflects actual content) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Client portal: public page for clients (auth by instance UUID) Shows instance status, health, billing history, plan info - Rollback: redeploy previous version from deploy history - Portal link: copy-to-clipboard button on instance detail page - Portal layout: minimal, clean, no auth required Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Health check service pings instance URLs, shows status indicators - Env var editor with add/remove/save (single CapRover API call) - Activity timeline on instance detail page (from audit log) - Retry deploy button for failed instances - Maintenance mode toggle (scale to 0/1 replicas) - Dark mode via Tailwind + localStorage toggle - Dashboard: health check all, recent activity feed, total revenue - Instance list: health dots, failed filter, responsive columns - Logout button in header Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
getAppInfo only returns build status. getAppDefinition returns the full config (env vars, volumes, replicas, SSL). Also auto-loads state on page load so you don't have to click "Load State". Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Failed provisioning now appends '-failed-{timestamp}' to app_name, freeing it for retry without manual cleanup. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The forceSsl() update call only sends forceSsl:true, which causes CapRover to reset all other fields including the git webhook config. Wildcard cert + URL::forceScheme('https') handles HTTPS already. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Appends '-deleted-{timestamp}' to app_name when instance is deleted, so the name can be reused for new instances. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
CapRover only allows lowercase letters and single hyphens. The generator now strips invalid chars, forces lowercase suffix, and ignores deleted instances when checking for collisions. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The while/read loop was failing to properly quote env values with spaces (APP_NAME="El Captain Manager" caused dotenv parse failure). sed handles all edge cases (spaces, multiple = signs, special chars) in one pass. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Add configureAppFull() to CapRoverService that sends port, instanceCount, forceSsl, volumes, envVars, and appPushWebhook in ONE update call (CapRover wipes fields not included in each call) - Rewrite InstanceProvisionerService::deployApp() to use configureAppFull() - Add progress callback through provision() → deployApp() chain - Add deploy progress panel in wizard (loading state + completion log) - Fix provision() to not wrap in DB::transaction (was blocking progress) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
key:generate writes to .env, config:cache reads from .env — order matters. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Dumps runtime env vars into .env so config:cache picks them up instead of reading stale .env.example defaults. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
config:cache bakes .env values at build time, ignoring Docker env vars at runtime. Removed it so env vars from CapRover are read directly. Fixed DB_HOST and CAPROVER_API_URL defaults in .env.example. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Replace broken deployFromGit() with setGitRepo() + forceBuild(). Add Force Build button per instance + Force Build All on list page. No auto-deploy — builds only trigger when user clicks the button. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Laravel's key:generate reads the .env file content; it must exist and be parseable before the command runs. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The php:8.4-fpm-alpine image listens on TCP by default, not unix socket. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
CapRover injects env vars via Docker, not a .env file. The key:generate command needs the file to exist to write the generated key. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Load State button fetches replicas, build status, SSL, env var count, volumes, and recent deploy versions from CapRover API. Fetch Logs shows the container's stdout/stderr in a dark terminal-style panel with refresh. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Instead of creating a separate PostgreSQL container per El Captain instance, all instances now share the existing `elcaptainsportsonlydb` container. Provisioner creates a dedicated database + user per instance via the `pg_admin` superuser connection. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Full platform for operating El Captain as a service: - Deploy new academies via one-click wizard (CapRover API integration) - Flexible billing: monthly fee, platform %, or both per client - Daily fee collection from instance databases (pull + webhook verify) - Auto-suspend instances after grace period on overdue payments - Dashboard with MRR, platform fees, instance health overview - Complete audit log of all actions Stack: Laravel + Livewire + Tailwind, deployed to CapRover Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
-