Webby - AI-Powered No-Code Website Builder SaaS Platform v1.0.5
Webby - AI-Powered No-Code Website Builder SaaS Platform Changelog
Changelog v1.0.5
Webby (Laravel)
- Added YooKassa paid payment gateway plugin with full subscription lifecycle support (initial payment, webhook handling, auto-renewals via saved payment methods, cancellation, IP-range verification) and ProcessYooKassaRenewals artisan command for cron-based renewal processing
- Added preview style editing panel replacing the element context menu with an inline toolbar and categorized style panels (TypographyTab, SpacingTab, ColorsTab, LayoutTab, BordersTab, EffectsTab, ClassesTab) with breakpoint-aware editing and style-save.ts persistence
- Added admin Prompts settings tab (PromptsSettingsTab) allowing customization of builder system prompt and compact prompt with "Load Default" button that fetches defaults from the active builder via SettingsController::getDefaultPrompts
- Added workspace revision management endpoints in BuilderProxyController (undo, redo, getRevisions) and className-aware search/replace endpoint (classEdit) for visual style editing
- Added workspace build recovery via RecoverWorkspaceBuild job that auto-dispatches on recoverable builder errors (timeout, connection reset, broken pipe, EOF) with recoverBuild endpoint in BuilderProxyController
- Added DateHelper utility class with format() and formatDateTime() methods that respect system timezone and date format settings, used across all notifications, invoices, and admin displays
- Added SystemSetting::remove() method for clean setting deletion and SystemSetting::rebuildGroupCache() for reliable write-through group cache rebuilding
- Added Plan::getBillingInterval() method to derive interval unit/count from billing_period and
- Subscription::getPluginSlugFromPaymentMethod() to map payment method constants to gateway plugin slugs
- Added FirebaseAdminService::getAdminSdkStatusForProject() method extracted from ProjectSettingsController
- Added Pusher setup documentation page (PusherSetup.tsx) with step-by-step account creation, configuration guide, and search index entries
- Added category field to template API response in TemplateApiController
- Added txt and xml MIME type support in PublishedProjectController
- Added readonly webhook_url field to all payment gateway config schemas for easy copy-paste during setup
- Added path traversal protection for plugin uploads (main_class, migrations, slug, namespace validation) in PluginManager
- Added PSR-4 autoloading registration for uploaded plugins without requiring composer dump-autoload
- Added missing payment gateway labels (Stripe, Razorpay, Paystack, Crypto.com, YooKassa, Referral Credits) across admin subscription/transaction detail pages and billing history UI
- Added LOG_CHANNEL and LOG_LEVEL configuration to installer
- Added frontend date utility (date.ts) with formatDate(), formatDateTime(), and timeAgo() functions
- Fixed landing page hero input showing empty placeholder when focused; now shows static placeholder text when animated placeholder is inactive (checks showAnimatedPlaceholder instead of isFocused)
- Fixed SystemSetting::get() caching bug where a non-null $default value could be cached by Cache::remember, causing different callers with different defaults to get wrong values (introduced MISSING_SENTINEL pattern)
- Fixed SystemSetting::setMany() N+1 query issue; now batch-queries existing types and defers group cache rebuild until all individual sets complete
- Fixed SystemSetting::set() to use write-through caching instead of cache invalidation
- Fixed concurrent build race condition with atomic row-locking (lockForUpdate) in
- BuilderProxyController::startBuild to prevent two simultaneous requests from claiming the same build slot
- Fixed stale "building" status by verifying session existence with Go builder before blocking users; auto-resolves stale builds via 404 detection, terminal status sync, and time-based fallback
- Fixed cancel build always updating project status to cancelled even when builder HTTP call fails, preventing users from being permanently stuck
- Fixed builder status endpoint returning has_session: true when builder is unreachable; now returns has_session: false with error
- Fixed .env value escaping in InstallerService::toEnv() — double quotes inside values now properly escaped as " and unescaping in Installed middleware properly reverses escape sequences
- Fixed stale build session detection to handle NULL build_started_at values in CheckStaleBuildSessions command
- Fixed admin stats month-over-month change calculations using inline now()->subMonth() which could produce wrong year/month near year boundaries
- Fixed subscription stats change calculation incorrectly filtering only active subscriptions for monthly comparison
- Fixed payment gateway plugins using non-existent $plan->currency, $plan->interval_unit, and $plan->interval_count properties; now use CurrencyHelper::getCode() and Plan::getBillingInterval()
- Fixed payment gateway webhooks logging full payloads before signature verification; now logs only after verification succeeds
- Fixed Stripe, Razorpay, Paystack, and Crypto.com plugins mapping suspended/halted/past_due subscription status to CANCELLED; now correctly maps to PENDING
- Fixed Stripe handleSubscriptionDeleted not resetting user's plan_id to null
- Fixed Stripe handleSubscriptionUpdated re-activating users on every webhook even when subscription was already active
- Fixed Stripe, PayPal, Razorpay, Paystack, Crypto.com plugins not sending SubscriptionActivatedNotification and
- PaymentCompletedNotification emails
- Fixed Stripe, PayPal, Paystack, Crypto.com plugins not setting correct transaction type (subscription_new vs
- subscription_renewal)
- Fixed PayPal cancelSubscription() calling $subscription->cancel() internally causing double-cancel; now only cancels on PayPal's side
- Fixed PayPal defaulting to sandbox mode; now defaults to production mode
- Fixed PayPal webhook signature verification being skipped in sandbox mode; now always verified
- Fixed PayPal not requiring webhook_id in config validation; now required
- Fixed Crypto.com webhook processing without requiring webhook_secret; now mandatory
- Fixed Crypto.com creating new customers on every payment; now reuses existing customer via getOrCreateCustomer
- Fixed Paystack creating subscription from subscription.create webhook using stale plan metadata; now defers to charge.success which has correct user metadata
- Fixed Paystack cancelSubscription not handling missing email_token gracefully
- Fixed Paystack verifyWebhookSignature not returning false when signature header is missing
- Fixed transaction ID generation using uniqid() (predictable); now uses Str::random(12) across all payment gateways
- Fixed User::refillBuildCredits() using update() which triggered the UserObserver recursively; now uses updateQuietly()
- Fixed Firebase storage bucket validation rejecting .firebasestorage.app domain; now accepts both .appspot.com and .firebasestorage.app
- Fixed Firebase config validation in ProjectFirebaseController using string rule required_if which doesn't work with boolean values; now uses Rule::requiredIf closure
- Fixed plugin configuration accepting framework fields (_token, _method); now filters to only schema-defined fields and strips readonly fields before validation
- Fixed BankTransferPlugin defaulting confirmation_email to false; now defaults to true
- Fixed Crypto.com and PayPal product cache keys to include price for plan changes
- Fixed installer not handling stale migrations table from previous failed install; now drops migrations table before running fresh
- Fixed sentry_pending_reports migration failing on re-run; now wrapped in Schema::hasTable() check
- Fixed project creation not using the template selected during project creation for the first build
- Fixed duplicate action entries in conversation history caused by builder sending events via both Pusher and webhook; now deduplicates with row lock
- Fixed InternalAiService methods crashing when no AI provider is configured; now gracefully returns empty arrays
- Fixed InternalAiService provider resolution cached per-instance to prevent mid-cycle inconsistency
- Fixed autosetup.sh Reverb step ordering, shell variable quoting, country-code second-level domain handling, and purchase code input sanitization
- Changed default CACHE_STORE from file to database in .env.example, installer, and VPS autosetup script
- Changed all builder events (BuilderActionEvent, BuilderCompleteEvent, BuilderErrorEvent, BuilderMessageEvent) to implement ShouldBroadcastNow with proper channel/event methods for Laravel Reverb support
- Changed admin subscription cancellation and user subscription cancellation to also cancel the external gateway subscription before local cancel
- Changed admin settings general tab to validate default_locale against active languages table and restrict date_format to five allowed formats
- Changed all payment gateway plugins to reject lifetime billing plans with clear error messages
- Changed all payment gateway plugins to use named routes (payment.callback, payment.webhook) instead of deprecated payment-gateways.* route names
- Changed all payment gateway plugins to version 1.0.1
- Removed TemplateClassifierService in favor of using the project's template_id set during creation
- Updated translations across all 10 languages with new keys for builder actions, style editing UI, prompts settings, date formatting, and admin features
Builder (Go)
- Added external prompt template system with prompts/system.md and prompts/compact.md files using marker-based templating ({{PROJECT_NAME}}, {{INJECT:}}, {{DYNAMIC:}}) replacing hardcoded Go string concatenation
- Added admin-editable custom prompts support via CustomPrompts field on session and CustomPrompt/CustomCompactPrompt fields in PromptConfig allowing per-request prompt overrides
- Added token budget system for prompt generation with TokenBudget field in PromptConfig, word-based heuristic estimation, and prioritized prompt assembly via assemblePrioritized() with P0-P3 priority levels
- Added writeDesignIntelligence AI tool and DesignIntelligenceExecutor for persisting design decisions (colors, typography, spacing, animations) to design-intelligence.json with deep-merge support
- Added readDesignIntelligence AI tool for reading persisted design decisions at session start
- Added updateSiteMemory AI tool and SiteMemoryExecutor for persisting business facts (business name, products, contact info) to memory.json with deep-merge and confidence levels
- Added readSiteMemory AI tool for reading persisted business facts at session start
- Added generateAEO AI tool and AEOExecutor for generating Answer Engine Optimization assets: public/llms.txt (plain text site summary), public/robots.txt (AI bot allow rules for ClaudeBot, GPTBot, PerplexityBot), and JSON-LD Schema.org structured data injected into index.html
- Added listImages AI tool for searching a built-in stock image library with filters for type, category, mood, and tone via stock image registry (SearchImages, FindImageByFilename, FormatImageList, FormatImageUsage)
- Added getImageUsage AI tool for getting detailed usage info and ready-to-use JSX code for a specific stock image
- Added revision management system (internal/revision/manager.go) with snapshot-based workspace history supporting CreateSnapshot(), Undo(), Redo(), and List() operations with automatic pre-agent snapshots
- Added API endpoints for workspace revision management: POST /api/undo-workspace/:workspace_id, POST /api/redo-workspace/:workspace_id, GET /api/revisions-workspace/:workspace_id
- Added POST /api/recover-workspace/:workspace_id endpoint for recovering crashed workspaces by running npm install and npm run build
- Added PATCH /api/class-edit-workspace/:workspace_id endpoint for className-aware search/replace in TSX files for visual style editor support
- Added GET /api/default-prompts endpoint for returning hardcoded default system prompts to admin UI
- Added DeepMergeJSON() utility function for recursive JSON map merging and ReadJSONFile()/ WriteJSONFileAtomic() for safe JSON file I/O with atomic writes via temp file + rename
- Added validateContentQuality() function in file executor to detect suspiciously short TSX files, missing export default in page files, and placeholder content (Lorem ipsum, example.com, 555-)
- Added template metadata pre-loading into system prompts via loadTemplateMetadata() and buildTemplateMetadataSection() allowing AI to skip initial readFile("template.json") call
- Added site memory and design intelligence injection as system messages that survive context compaction
- Added Layout component usage verification in VerifyIntegration() with detection of centralized layout wrapping in App.tsx and bare layout exemptions
- Added path-based and label-based route detection patterns in VerifyIntegration()
- Added theme preset application to CSS via applyThemeToCSSContent() after template extraction, replacing :root and .dark CSS variable blocks with theme preset values
- Added providerName field to Anthropic client for provider-specific log messages supporting non-Anthropic providers (OpenRouter, etc.)
- Fixed WithFields() returning nil when Logger is uninitialized, preventing nil pointer panics in LoggerMiddleware and all other callers
- Fixed nil pointer panics in executor when template support is not configured (added nil guards for fetchTemplates, getTemplateInfo, and useTemplate)
- Fixed handleStatus() returning 200 for terminal sessions; now returns 404 so Laravel knows the build is done
- Fixed stale custom prompts persisting across session reuse; reuseSession() now clears customPrompts when not provided in request
- Fixed multiple silently ignored errors: io.ReadAll in template API error path, filepath.Rel in ListFiles() and SearchFiles(), theme CSS write failures after useTemplate, Pusher client reinitialization in reuseSession(), zip writer Close() and Write() in serveBuildOutput()
- Fixed double-close potential in Session.Close() by setting streamer to nil after closing
- Fixed SearchFiles() only checking context.Canceled but not context.DeadlineExceeded; now uses errors.Is() for both
- Changed BuildSystemPrompt() return signature from string to (string, error) to support fallible prompt template loading from disk
- Changed template initialization to skip pre-initialization when no template is explicitly selected; AI agent now selects via fetchTemplates + useTemplate flow
- Changed fmt.Sprintf() calls throughout codebase to fmt.Fprintf() for direct writer output avoiding intermediate string allocation across executor, prompt, and logging packages
- Changed token budget calculation to reserve ~40% of context window for system prompt with 60% reserved for history and response
- Changed theme preset prompt section to mention src/custom.css as the override target and index.css as a protected system file
- Updated dependencies: anthropic-sdk-go v1.20 to v1.26, gin v1.12, golang.org/x packages, added golang.org/x/sync v0.20