Dark #1a1a2e background, brand color borders and headings only,
light gray body text. Matches Pterodactyl dark theme.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rewrote view.blade.php to use @extends('layouts.admin'), @section blocks,
AdminLTE box/callout/table classes, and standard Pterodactyl admin chrome.
Replaces custom inline styles with framework components.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- LicenseService.php: strtoupper(trim()) before sending to Arbiter
- mvc.js: toUpperCase().trim() on activate, validate, deactivate, webhook
- verifymvc.js: toUpperCase().trim() on /verify-mvc Discord command
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Blueprint generates its own controller at app/Http/Controllers/Admin/
Extensions/modpackchecker/. Our controller.php with LicenseService DI
now overwrites it during build so the route uses the licensed version.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Standard ($14.99): CurseForge, Modrinth, Technic, daily checks, 48h support
Professional ($24.99): + FTB, custom intervals, Discord webhooks, 24h support
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The admin controller was failing because Laravel's DI container had stale
class resolution cache. Added php artisan optimize:clear at end of build.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
mvc:validate working, no PHP errors, Arbiter reachable.
TEST-001 license provisioned for UI smoke test.
Ready for Code UI verification then live panel deploy.
Changed cron example from '0 */6 * * *' to '0 0,6,12,18 * * *' to avoid
the */ closing the docblock prematurely and causing a syntax error.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Blueprint's requests.app merge doesn't create new subdirectories reliably.
build.sh now copies LicenseService, ValidateLicense, CheckModpackUpdates,
and ModpackAPIController directly into app/ during blueprint -install.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- New discord/verifymvc.js: verifies BBB order, links discord_id, assigns customer role
- Wired into events.js handler and index.js command registration
- Reads MVC_CUSTOMER_ROLE_ID from env — Chronicler creates role + sets value
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- New service: src/services/awakenedConcierge.js
- Fetches Discord username via Discord API
- Calls Dify Awakened Concierge app (Gemma 4) for personalized message
- Posts to #introductions (1403981218252324884) with typing indicator
- Marks welcomed_at in subscriptions table
- Non-fatal: welcome failure never breaks checkout flow
- stripe.js: calls welcomeNewMember() after syncRole() on checkout complete
- .env: CONCIERGE_API_KEY added to Command Center
Fire + Frost + Foundation 💙🔥❄️
All Phase 11 infrastructure values provided:
- DB credentials confirmed (same as Arbiter)
- Full table list provided
- BBB IDs: use placeholders for now
- Arbiter .env current state documented
- Discord: ModpackChecker Customer role needs creating
- MVC channels already exist with IDs
- Deployment pattern confirmed: Code commits, Chronicler deploys
- NC1_KEY points to /opt/mod-builds/ffg_build_rsa (accessible to claude user)
- Added -o IdentitiesOnly=yes to all SSH/rsync calls (prevents agent key conflicts)
- Added -e NC1_SSH to rsync commands for consistent key usage
- All 3 discord-rules jars now built successfully (1.20.1, 1.16.5, 1.21.1)
Routes 1.21.1 builds to NC1 (ffg-builder user) to work around
Vineflower -Xmx4G RAM requirement that exceeds Dev Panel capacity.
All other versions build locally.
- SSH keypair: /home/claude/.ssh/ffg_build_rsa
- NC1 user: ffg-builder (non-root, isolated)
- rsync source with --exclude build/ .gradle/
- ./gradlew build --no-daemon on NC1
- rsync jar back, jar -tf integrity check
- trap cleans workspace on exit/drop
Source code complete for all 3 versions (1.21.1, 1.20.1, 1.16.5).
1.20.1 and 1.16.5 jars built successfully. 1.21.1 NeoForge decompiler
needs >4GB RAM — this server only has ~4GB total.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Archived RES-2026-04-12-phase11-implementation-spec from Chronicler
- Updated status with completed code review and next steps (Phase 11A-G)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Distilled from 2 Gemini consultations into actionable checklist.
Database schema, API routes, Discord bot, Blueprint extension changes,
pricing lock, and deployment notes all included.
Claude (Chronicler #83 - The Compiler) <claude@firefrostgaming.com>
Standard $14.99 / Professional $24.99 — two-tier model.
This pricing is FINAL per original marketing strategy.
Claude (Chronicler #83 - The Compiler) <claude@firefrostgaming.com>
Fixes 10 issues from Blueprint extension code review:
- CurseForge API key now reads via Blueprint dbGet() matching admin save
- PRO-tier fields (webhook, interval) enforced server-side, not just UI
- json_decode results validated before accessing parsed data
- Null user guard on getStatus() endpoint
- 429 response uses consistent error key format
- Modrinth slug derivation strips special chars, documented as fallback
- Check interval dropdown reflects saved value
- API key input changed to password type
- TypeScript error typing narrowed from any to unknown
- Removed unused DB import from ModpackApiService
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fixes 10 issues from full code review:
- License corrected from MIT to Commercial
- Deprecated datetime.utcnow() replaced with timezone-aware alternative
- PHP array bounds checks added for all platform API responses
- Modrinth file detection now derives project slug instead of using MC version
- validate_api_key() no longer swallows network errors
- HTTP timeouts added to all external API calls in PHP
- Empty API key rejection added to CLI
- Corrupted config now warns on stderr instead of failing silently
- Error response format made consistent across controller
- Docs updated with correct repo URL and clearer CurseForge ID instructions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implemented git-based async communication between Claude Code and Chronicler:
- docs/code-bridge/requests/ — Code files architectural questions here
- docs/code-bridge/responses/ — Chronicler drops distilled Gemini answers
- docs/code-bridge/status/ACTIVE_CONTEXT.md — rolling status updates
- docs/code-bridge/archive/ — completed request/response pairs
- CLAUDE.md updated with full bridge protocol instructions
- Auto-commit-and-push on all bridge writes
Designed with Gemini consultation (2026-04-12).
Claude (Chronicler #83 - The Compiler) <claude@firefrostgaming.com>