docs(handoff): Session #63 complete - ModpackChecker UX pivot
Key outcomes: - Extension functional but not commercially viable - Blueprint packaging issues documented - Hybrid auto-discovery architecture approved by Gemini - Task #95 created for detection system Next session: Implement DaemonFileRepository file detection Signed-off-by: Claude (Chronicler #63) <claude@firefrostgaming.com>
This commit is contained in:
@@ -1,204 +1,209 @@
|
||||
# Session Handoff — Next Chronicler
|
||||
|
||||
**Last Updated:** April 5, 2026 @ 9:45 PM CDT
|
||||
**Last Chronicler:** #62 (Pyrrhus)
|
||||
**Session Focus:** Task #26 ModpackChecker — Major Progress, Blueprint Corrupted
|
||||
**Last Updated:** April 6, 2026 @ 9:15 PM CDT
|
||||
**Last Chronicler:** #63
|
||||
**Session Focus:** Task #26 ModpackChecker — Live Panel Testing, UX Pivot Required
|
||||
|
||||
---
|
||||
|
||||
## 🔥 CRITICAL: CODE IS SAFE
|
||||
## 🔥 CRITICAL STATUS
|
||||
|
||||
**All code has been backed up to:** `/root/modpackchecker_backup/`
|
||||
**ModpackChecker is functionally complete but NOT commercially viable.**
|
||||
|
||||
Contents:
|
||||
```
|
||||
/root/modpackchecker_backup/
|
||||
├── admin/ # Admin settings UI
|
||||
├── build.sh # sed injection script
|
||||
├── conf.yml # Blueprint config
|
||||
├── console/ # CheckModpackUpdates.php cron command
|
||||
├── controllers/ # Original controller location
|
||||
├── database/ # Migration file
|
||||
├── routes/ # client.php with routes
|
||||
├── views/ # wrapper.tsx + UpdateBadge.tsx
|
||||
├── Controllers_ModpackAPIController.php # Working controller copy
|
||||
└── CheckModpackUpdates.php # Cron command copy
|
||||
The extension works when egg variables are configured, but:
|
||||
- Most eggs don't have `MODPACK_PLATFORM`, `MODPACK_ID` variables
|
||||
- Manual setup per server is unacceptable for 21 servers
|
||||
- BuiltByBit customers will leave bad reviews
|
||||
|
||||
**BLOCKED until:** Hybrid auto-discovery system is implemented (Task #95)
|
||||
|
||||
---
|
||||
|
||||
## ✅ WHAT WE ACCOMPLISHED TODAY
|
||||
|
||||
### Code Review & Fixes
|
||||
- **4 Gemini review batches** — All code audited and improved
|
||||
- Fixed server_uuid vs server_id schema mismatch
|
||||
- Fixed Technic hardcoded build number → dynamic API
|
||||
- Centralized API logic into `ModpackApiService`
|
||||
- Added rate limiting (2 req/min per server)
|
||||
- Added 60-second TTL cache for dashboard
|
||||
|
||||
### Live Panel Testing (45.94.168.138)
|
||||
- Installed extension via `.blueprint` package
|
||||
- **Discovered Blueprint packaging issues** (see below)
|
||||
- Manually deployed controllers, services, commands
|
||||
- Routes working: no double-prefix
|
||||
- Dashboard badge working (when data exists)
|
||||
- Console widget working (StatBlock style, right column)
|
||||
- Admin panel working (dark callouts, Discord link)
|
||||
|
||||
### UI Refinements
|
||||
- Console card moved to right column (matches StatBlocks)
|
||||
- Short error codes: "Not configured", "Wait 60s", "API error"
|
||||
- API key visible (no password dots)
|
||||
- Dark theme callouts with Frost/Fire accent borders
|
||||
|
||||
---
|
||||
|
||||
## ❌ BLUEPRINT PACKAGING ISSUES
|
||||
|
||||
**Blueprint production install differs from dev mode:**
|
||||
|
||||
| Component | Dev Mode | Production Install |
|
||||
|-----------|----------|-------------------|
|
||||
| `build.sh` | ✅ Runs | ❌ Does NOT run |
|
||||
| PHP files | Auto-copied | ❌ Stays in extension subfolder |
|
||||
| React injection | Via build.sh | ❌ Must be manual |
|
||||
|
||||
**Manual steps required on fresh install:**
|
||||
```bash
|
||||
# Copy PHP files
|
||||
cp .blueprint/extensions/modpackchecker/app/Http/Controllers/ModpackAPIController.php app/Http/Controllers/
|
||||
cp .blueprint/extensions/modpackchecker/app/Services/ModpackApiService.php app/Services/
|
||||
cp .blueprint/extensions/modpackchecker/app/Console/Commands/CheckModpackUpdates.php app/Console/Commands/
|
||||
|
||||
# Copy & inject React components
|
||||
cp .blueprint/extensions/modpackchecker/views/server/wrapper.tsx resources/scripts/components/server/ModpackVersionCard.tsx
|
||||
cp .blueprint/extensions/modpackchecker/views/dashboard/UpdateBadge.tsx resources/scripts/components/dashboard/UpdateBadge.tsx
|
||||
|
||||
# Inject into AfterInformation.tsx and ServerRow.tsx (see status doc for details)
|
||||
|
||||
# Rebuild
|
||||
composer dump-autoload && php artisan optimize:clear
|
||||
export NODE_OPTIONS=--openssl-legacy-provider && yarn build:production
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ CURRENT BLOCKER: Blueprint Developer Mode
|
||||
## 🛠️ HYBRID DETECTION ARCHITECTURE (Gemini Approved)
|
||||
|
||||
**Symptoms:**
|
||||
- `blueprint -build` returns "Developer mode is not enabled"
|
||||
- File `.blueprint/.developer` exists with "true"
|
||||
- Database has `blueprint::developer = true`
|
||||
- Nothing works
|
||||
|
||||
**Root Cause (per Gemini):**
|
||||
Running `php artisan migrate` wiped tables including user table. Blueprint's internal database records are desynced from the filesystem.
|
||||
|
||||
**Gemini's Recommended Fix:**
|
||||
1. ✅ Backup code (DONE - safe in /root/modpackchecker_backup/)
|
||||
2. ❓ Reinstall Blueprint framework
|
||||
3. Enable developer mode via Admin UI
|
||||
4. Move code to `/var/www/pterodactyl/.blueprint/extensions/modpackchecker/` (NOT dev folder)
|
||||
5. Run `blueprint -build`
|
||||
|
||||
**Problem:** Blueprint install script URLs are not working:
|
||||
- `https://raw.githubusercontent.com/BlueprintFramework/framework/main/scripts/install.sh` → 404
|
||||
- `https://blueprint.zip/install.sh` → Returns HTML page, not script
|
||||
|
||||
**Next session needs to:**
|
||||
1. Find correct Blueprint install method (check their Discord/docs)
|
||||
2. Or manually reset Blueprint's internal state
|
||||
3. Or fresh Dev Panel install
|
||||
|
||||
---
|
||||
|
||||
## ✅ WHAT WE ACCOMPLISHED TONIGHT
|
||||
|
||||
### Phase 1-2: Infrastructure ✅
|
||||
- Dev Panel set up (64.50.188.128)
|
||||
- Blueprint beta-2026-01 installed
|
||||
- Test server created
|
||||
|
||||
### Phase 3: Admin + Console UI ✅
|
||||
- Admin settings panel working
|
||||
- Manual "Check for Updates" button on server console
|
||||
- API route registered and working
|
||||
|
||||
### Phase 4: API Integration ✅
|
||||
- All 4 platforms implemented (CurseForge, Modrinth, FTB, Technic)
|
||||
- **TESTED AND WORKING:** Modrinth returned "🌿 Adrenaserver 1.7.0+1.21.1.fabric"
|
||||
- CurseForge API key configured
|
||||
|
||||
### Phase 5: Dashboard Badge (Code Written, Not Deployed)
|
||||
**All code is complete, just can't build:**
|
||||
|
||||
1. **UpdateBadge.tsx** — React component for server list
|
||||
- Fetches from `/api/client/extensions/modpackchecker/status`
|
||||
- Shows 🟢 (up to date) or 🟠 (update available)
|
||||
- Global cache to prevent multiple API calls
|
||||
|
||||
2. **build.sh** — Updated to inject into ServerRow.tsx
|
||||
- Copies UpdateBadge.tsx to dashboard components
|
||||
- sed injects badge after server name
|
||||
|
||||
3. **CheckModpackUpdates.php** — Laravel cron command
|
||||
- `php artisan modpackchecker:check`
|
||||
- Loops through servers with MODPACK_PLATFORM variable
|
||||
- Checks APIs with rate limiting (2s sleep)
|
||||
- Stores results in modpackchecker_servers table
|
||||
|
||||
4. **getStatus() method** — Added to controller
|
||||
- Returns cached update status for all user's servers
|
||||
- Single fast database query
|
||||
|
||||
5. **Migration updated** — Added server_id, update_available columns
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ ARCHITECTURE (Gemini-Approved)
|
||||
### The Solution
|
||||
|
||||
**Phase 1: Auto-Discovery (Cron Job)**
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ CRON JOB (runs daily/hourly) │
|
||||
│ php artisan modpackchecker:check │
|
||||
│ - Loops through servers with modpacks │
|
||||
│ - Checks APIs one by one (with 2s delays) │
|
||||
│ - Stores results in database │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ DATABASE (modpackchecker_servers table) │
|
||||
│ - server_id, server_uuid, platform, modpack_name │
|
||||
│ - current_version, latest_version, update_available │
|
||||
│ - last_checked, error_message │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ /api/client/extensions/modpackchecker/status │
|
||||
│ - One fast query │
|
||||
│ - Returns: {server_uuid: {update_available: bool}} │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ UpdateBadge.tsx (injected into ServerRow.tsx) │
|
||||
│ - Reads from status endpoint ONCE on page load │
|
||||
│ - Shows 🟢 or 🟠 dot next to server name │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
1. Check egg variables (fastest)
|
||||
2. If missing → Read manifest.json via DaemonFileRepository (CurseForge)
|
||||
3. If missing → Read modrinth.index.json (Modrinth)
|
||||
4. Save with detection_method = 'egg' | 'file' | 'manual'
|
||||
```
|
||||
|
||||
**Key insight from Gemini:** Dashboard badge must be "dumb" — never call external APIs directly. Only read from local database cache. Otherwise 11 servers = 11 API calls = rate limits = blocked IP.
|
||||
**Phase 2: Self-Service Fallback (Console Widget)**
|
||||
- Show "Configure Manually" button when unconfigured
|
||||
- Modal: Platform dropdown + Modpack ID input
|
||||
- Save with `is_user_overridden = true`
|
||||
|
||||
### Critical Rules (from Gemini)
|
||||
- **File detection ONLY in cron** — never on page load (network calls to Wings)
|
||||
- **CurseForge fingerprinting REJECTED** — too resource intensive
|
||||
- **Single table schema** — no separate config table
|
||||
|
||||
### Database Additions Needed
|
||||
```php
|
||||
$table->string('detection_method')->default('unknown'); // egg, file, manual
|
||||
$table->boolean('is_user_overridden')->default(false); // prevents auto-overwrite
|
||||
```
|
||||
|
||||
### DaemonFileRepository Pattern
|
||||
```php
|
||||
use Pterodactyl\Repositories\Wings\DaemonFileRepository;
|
||||
|
||||
private function detectCurseForge(Server $server): ?string
|
||||
{
|
||||
try {
|
||||
$this->fileRepository->setServer($server);
|
||||
$content = $this->fileRepository->getContent('manifest.json');
|
||||
$manifest = json_decode($content, true);
|
||||
return $manifest['projectID'] ?? null;
|
||||
} catch (\Exception $e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 REPO STATUS
|
||||
## 📁 FILE LOCATIONS
|
||||
|
||||
**firefrost-services repo:** Has Phase 3-4 code (commit 1eda889)
|
||||
- Missing: Phase 5 dashboard badge code (only on Dev Panel backup)
|
||||
### Repository (firefrost-services)
|
||||
```
|
||||
services/modpack-version-checker/
|
||||
├── blueprint-extension/ # All source code
|
||||
│ ├── app/
|
||||
│ │ ├── Console/Commands/CheckModpackUpdates.php
|
||||
│ │ ├── Http/Controllers/ModpackAPIController.php
|
||||
│ │ └── Services/ModpackApiService.php
|
||||
│ ├── admin/
|
||||
│ ├── views/
|
||||
│ │ ├── server/wrapper.tsx # Console widget
|
||||
│ │ └── dashboard/UpdateBadge.tsx # Dashboard badge
|
||||
│ └── ...
|
||||
└── releases/
|
||||
└── modpackchecker-1.0.0.blueprint # Has packaging issues
|
||||
```
|
||||
|
||||
**firefrost-operations-manual repo:** Updated with this handoff
|
||||
### Dev Panel (64.50.188.128)
|
||||
- Working correctly in dev mode
|
||||
- Extension: `/var/www/pterodactyl/.blueprint/dev/`
|
||||
|
||||
**Next session should commit Phase 5 code to repo once working**
|
||||
### Live Panel (45.94.168.138)
|
||||
- Required manual deployment steps
|
||||
- Panel version: 1.12.1
|
||||
|
||||
---
|
||||
|
||||
## 🔧 DEV PANEL INFO
|
||||
## 📋 TASK #95: Hybrid Detection System
|
||||
|
||||
| Item | Value |
|
||||
|------|-------|
|
||||
| URL | http://64.50.188.128 |
|
||||
| Admin | frostystyle / FFG-Dev-2026! |
|
||||
| Test Server | Was wiped in migration, needs recreation |
|
||||
| Blueprint | Corrupted, needs reinstall |
|
||||
| Code Backup | /root/modpackchecker_backup/ |
|
||||
### Priority 1: Backend Auto-Discovery
|
||||
1. [ ] Add migration columns: `detection_method`, `is_user_overridden`
|
||||
2. [ ] Inject `DaemonFileRepository` into `CheckModpackUpdates`
|
||||
3. [ ] Implement `detectCurseForge()` — read manifest.json
|
||||
4. [ ] Implement `detectModrinth()` — read modrinth.index.json
|
||||
5. [ ] Update cron: egg vars → file detection → respect manual override
|
||||
6. [ ] Test on live panel with real modpack servers
|
||||
|
||||
### Priority 2: Frontend Self-Service
|
||||
1. [ ] Update wrapper.tsx with "Configure Manually" button
|
||||
2. [ ] Create configuration modal (Platform + ID)
|
||||
3. [ ] New API endpoint: `POST /servers/{server}/configure`
|
||||
4. [ ] Store with `is_user_overridden = true`
|
||||
|
||||
### Priority 3: Fix Blueprint Packaging
|
||||
1. [ ] Research Blueprint native wrapper injection
|
||||
2. [ ] Eliminate build.sh dependency for production
|
||||
3. [ ] Re-test clean install cycle
|
||||
4. [ ] Update .blueprint package
|
||||
|
||||
---
|
||||
|
||||
## 📋 NEXT SESSION CHECKLIST
|
||||
## 🔧 INFRASTRUCTURE REFERENCE
|
||||
|
||||
1. [ ] **Fix Blueprint** — Find working install method or manual fix
|
||||
2. [ ] **Recreate test server** — Vanilla Minecraft egg, add MODPACK_PLATFORM/MODPACK_ID variables
|
||||
3. [ ] **Move code to extensions folder** (not dev folder per Gemini):
|
||||
```bash
|
||||
mkdir -p /var/www/pterodactyl/.blueprint/extensions/modpackchecker
|
||||
cp -r /root/modpackchecker_backup/* /var/www/pterodactyl/.blueprint/extensions/modpackchecker/
|
||||
chown -R www-data:www-data /var/www/pterodactyl/.blueprint/extensions/modpackchecker/
|
||||
```
|
||||
4. [ ] **Build and compile:**
|
||||
```bash
|
||||
blueprint -build
|
||||
export NODE_OPTIONS=--openssl-legacy-provider
|
||||
yarn build:production
|
||||
systemctl restart php8.3-fpm
|
||||
```
|
||||
5. [ ] **Run cron command:** `php artisan modpackchecker:check`
|
||||
6. [ ] **Test:** Log in, see badge on server list
|
||||
7. [ ] **Commit Phase 5 code to repo**
|
||||
| Server | IP | Purpose |
|
||||
|--------|-----|---------|
|
||||
| Dev Panel | 64.50.188.128 | Blueprint dev, testing |
|
||||
| Live Panel | 45.94.168.138 | Production Pterodactyl |
|
||||
| Command Center | 63.143.34.217 | Gitea, Arbiter |
|
||||
|
||||
**Test Data:**
|
||||
- FTB StoneBlock 4: CurseForge ID `1373378`
|
||||
- Adrenaserver: Modrinth slug `adrenaserver`
|
||||
|
||||
---
|
||||
|
||||
## 💡 KEY LEARNINGS FROM THIS SESSION
|
||||
## 📚 DOCUMENTATION CREATED TODAY
|
||||
|
||||
1. **Blueprint wrapper field** is for Blade only, not TSX
|
||||
2. **TSX components** require build.sh + sed injection + yarn build
|
||||
3. **Controller namespace** must be capital C: `Controllers` not `controllers`
|
||||
4. **PHP-FPM OPCache** requires restart after adding new classes
|
||||
5. **`php artisan migrate`** can wipe tables — be careful!
|
||||
6. **`.blueprint/dev/`** is a blast zone — code can be nuked on rebuild
|
||||
7. **Dashboard badges must be "dumb"** — read from cache, never call external APIs
|
||||
- `docs/projects/modpackchecker-status-2026-04-06.md` — Full status report
|
||||
- `docs/consultations/gemini-hybrid-detection-2026-04-06.md` — Architecture decision
|
||||
|
||||
---
|
||||
|
||||
## 🙏 ACKNOWLEDGMENTS
|
||||
## 💡 KEY LEARNINGS
|
||||
|
||||
- **Gemini** — Saved us multiple times with architectural guidance
|
||||
- Tonight was Chronicler #62's longest session — named **Pyrrhus** for winning every battle but getting blocked at the end
|
||||
1. **Blueprint packaging ≠ dev mode** — build.sh doesn't run on production install
|
||||
2. **File detection via Wings is safe** but only in cron (network calls)
|
||||
3. **CurseForge fingerprinting is forbidden** — resource explosion
|
||||
4. **Egg variables are unreliable** — most eggs don't have them
|
||||
5. **Server variables use `server_value`** not `variable_value` in Pterodactyl models
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user