18 KiB
π» Ghost Node β Progress Log
Read this alongside CLAUDE.md at the start of every new session. Full session history (all sessions, including Q&A decisions) β ARCHIVE.md β do NOT load at session start.
β οΈ MD Update Rule β DYNAMIC, NOT STATIC
Only update the MD file whose content was actually touched this session. Not all files β only the relevant ones.
- PROGRESS.md β update when any code file changed. Add a brief session entry here, move it to ARCHIVE.md when it's no longer active context.
- CLAUDE.md β update only if API endpoints, DB schema, config keys, or architecture changed.
- MEMORY.md β update only if a new reusable gotcha, pattern, or architecture decision was discovered.
- ARCHIVE.md β move old PROGRESS.md session entries here. Also log Q&A sessions that produced lasting decisions.
- If nothing changed in a session (pure Q&A, no files edited, no decisions made) β update nothing.
Current State
- Version: v2.7
- Status: β Fully operational β 21/21 tests passing
- Last session: 52 (2026-03-19) β wording normalization pass for mechanics docs (canonical phrasing alignment).
- Previous session: 44 (2026-03-19) β clean-room marketing landing rebuild (new
LandingPageV3+ OG image). - Previous session: 39 (2026-03-19) β added
/api/listings/refresh-statuscontract test (Option A baseline). - Previous session: 38 (2026-03-19) β added backend contract tests for
/api/statsand/api/listings/countdown-sync. - Previous session: 34 (2026-03-18) β added
docs/MD_UPDATE_PLAYBOOK.mdplaybook for deep semantic Markdown audits + minimal targeted MD edits workflow. - Previous session: 33 (2026-03-18) β per-site visible browser override + keyword batching progress tracking + hourly retry warnings. See details below.
- Previous session: 32 (2026-03-18) β Redis cache layer, Docker Compose, lot description extraction (N18). See details below.
- Previous session: 31 (2026-03-13) β Fixed Framer Motion SSR opacity:0 bug across all components (LandingPage hero, dashboard, StatsGrid, RecentListings, EngineConsole, ActivityLog, ListingRow, ListingsTable, ListingDetailPanel, 4 page routes). All above-the-fold elements now render visible in static HTML (opacity:1, only transforms animate). Below-fold scroll-triggered sections intentionally keep opacity:0 for scroll animations. 21/21 tests passing.
- Previous session: 30 (2026-03-13) β Full marketing landing page built from AI_WEB_BRIEF.md (Hero, Platform Strip, 6-feature grid, How It Works 4-step flow, Who It's For personas, FAQ accordion, Footer CTA + site footer). Light/dark theme toggle added (ThemeToggle.tsx, localStorage-persistent, vivid lavender-ivory light palette via data-theme attribute). globals.css extended with complete [data-theme="light"] overrides for all g-* classes. 21/21 tests passing.
- Previous session: 29 (2026-03-13) β Master dashboard "Mission Control" rebuilt: RecentListings (polls /api/listings every 10s), EngineConsole (status orb + controls + site health, polls /api/sites every 25s), enhanced ActivityLog (tracks engine state transitions), StatsGrid updated (keywords prop replaces engine card), utils.ts extended (formatUptime, formatMins, formatPrice, timeAgo). 21/21 tests passing.
- worker.py: 5,000+ lines (definitive β ahead of all exports)
- frontend/: Next.js 16 + React 19 + TypeScript + Tailwind v4 β static build in
frontend/out/(1.8MB).node_modules/is 553MB build tooling β safe to delete, runnpm installto restore. - models.py: ~420 lines
- Serving:
http://localhost:7000(React UI) |http://localhost:7000/legacy(HTML fallback)
π’ Session 52 β 2026-03-19
Canonical wording normalization (Markdown only)
- Ran a minimal wording-only pass on already-touched docs so mechanics phrasing is consistent across files.
- Standardized the same canonical statements for:
show_browser=trueprecedence vs per-sitecustom_visible_browserkeyword_batch_enabled+scrape_rounds/scrape_round_itemsstatuses (pending,in_progress,done,failed) and 4-hour window- Dashboard "Keyword Retry Tracking" source
GET /api/scrape/progresswith hourlywarn_duefromlast_hour_warn_atfallback logic
π’ Session 51 β 2026-03-19
Deep Markdown mechanics audit and alignment
- Audited all repo
*.mdfiles and applied minimal edits only where mechanics were missing/unclear. - Updated docs to consistently reflect:
custom_visible_browserbehavior andshow_browser=trueprecedence.keyword_batch_enabled+scrape_rounds/scrape_round_itemsstatus flow (pending,in_progress,done,failed).- 4-hour retry window, hourly warning bookkeeping (
last_hour_warn_at), andwarn_due. - Dashboard "Keyword Retry Tracking" source endpoint:
GET /api/scrape/progress.
π’ Session 42 β 2026-03-19
:Premium UX/UI: Landing page rewrite
- Added
frontend/components/landing/LandingPageV2.tsxwith a richer premium layout (neon particle canvas, interactive console preview, improved Features / How-it-works / Developer / Pricing / FAQ sections). - Switched
frontend/app/page.tsxto renderLandingPageV2. - Verified:
cd frontend && npx vitest runandnpm run build --prefix frontend.
π’ Session 43 β 2026-03-19
:Marketing UX cleanup: remove old landing
- Deleted
frontend/components/landing/LandingPage.tsx(unused now) so the marketing site is not based on the previous landing design. - Re-ran
cd frontend && npx vitest runandnpm run buildto confirm everything still passes.
π’ Session 44 β 2026-03-19
:Clean-room marketing rebuild (LandingPageV3 + OG)
- Deleted
frontend/out/and regenerated the Next.js static export. - Added
frontend/components/landing/LandingPageV3.tsx(shadcn + motion + lucide) and switchedfrontend/app/page.tsxto render it. - Added missing landing shadcn primitives (
button,card,accordion,badge,separator). - Added
frontend/app/opengraph-image.tsx(Satori vianext/og). - Verified:
http://localhost:7000/andhttp://localhost:7000/legacyreturn200.
π’ Session 45 β 2026-03-19
Full-app shell redesign pass (all routes)
- Rebuilt the shared top chrome so every route has a clearly new look without changing API wiring:
frontend/components/layout/Header.tsxfrontend/components/layout/Nav.tsxfrontend/components/layout/StatusBar.tsx
- New shell direction: thicker glass layers, stronger typography hierarchy, capsule nav tabs, route-wide control rail styling, and cardized telemetry status tiles.
- Kept all engine controls and route paths intact (
pause,resume,restart,kill, and all nav route links). - Verified:
cd frontend && npx vitest runandnpm run buildboth pass (same known static-export/metadata warnings only).
π’ Session 46 β 2026-03-19
Total visual wipe phase (hard reset baseline)
- Replaced
frontend/app/globals.csswith a minimal baseline (tailwindimports + basic box-model/body reset), removing all prior custom visual system layers (g-*, glass, gradients, neon, theme-specific utility classes). - Flattened visual-heavy components to plain functional markup:
frontend/components/dashboard/StatsGrid.tsxfrontend/components/listings/ListingsTable.tsxfrontend/components/keywords/KeywordRow.tsx
- Kept core behavior and wiring intact (data hooks, actions, filters, exports, delete flows, detail panel opening).
- Verified:
cd frontend && npm run buildpasses. Lint has one non-blocking warning inKeywordRow.tsxfromdnd-kitinline transform style usage.
π’ Session 47 β 2026-03-19
Total visual wipe phase (remaining shared/UI surfaces)
- Flattened remaining visual-heavy components to plain functional markup:
frontend/components/sites/SiteCard.tsxfrontend/components/sites/SitesTable.tsxfrontend/components/listings/ListingCard.tsxfrontend/components/listings/ListingDetailPanel.tsxfrontend/components/ai-log/AILogCard.tsxfrontend/components/ai-log/AILogFeed.tsxfrontend/components/layout/Header.tsxfrontend/components/layout/Nav.tsxfrontend/components/layout/StatusBar.tsx
- Removed old class-driven visual styling from these files while preserving core interactions (drag reorder, toggles, adapt trigger, engine actions, AI log polling/filtering, listing detail open/close).
- Verified:
cd frontend && npx vitest run && npm run buildpasses (same known Next.js warnings only). One non-blocking linter warning remains from requireddnd-kitinline transform style inSiteCard.tsx.
π’ Session 48 β 2026-03-19
Final g-* cleanup sweep (active app surfaces)
- Replaced remaining active visual-heavy files with plain functional markup and removed
g-*usage from active routes/components:frontend/components/dashboard/EngineConsole.tsxfrontend/components/dashboard/RecentListings.tsxfrontend/components/dashboard/ActivityLog.tsxfrontend/components/keywords/KeywordCard.tsxfrontend/components/keywords/KeywordsTable.tsxfrontend/components/keywords/ScoringRulesPanel.tsxfrontend/components/listings/ImageGallery.tsxfrontend/components/layout/ThemeToggle.tsxfrontend/app/settings/page.tsx
- Preserved key behavior (polling, engine controls, retry tracking, drag reorder, scoring CRUD, backup/restore, AI log/config interactions).
- Updated minimal test expectations indirectly through component text compatibility (no test file edits in this pass).
- Verified:
cd frontend && npx vitest run && npm run buildpasses (same known Next.js static-export warnings only).
π’ Session 49 β 2026-03-19
Lint cleanup finalization (ImageGallery)
- Removed inline-style usage from
frontend/components/listings/ImageGallery.tsxand converted to class-based styling (fixedoverlay/panel/image sizing + strip layout), including replacing runtime display toggle with class toggling. - Resolved final class lint recommendation (
z-[100]βz-100). - Verified:
cd frontend && npx vitest run && npm run buildpasses;ImageGallery.tsxlints clean.
π’ Session 50 β 2026-03-19
100% wipe completion pass
- Neutralized final leftover old-visual components with plain implementations:
frontend/components/sites/SiteRow.tsxfrontend/components/listings/ListingRow.tsxfrontend/components/layout/AmbientBackground.tsx
- Confirmed no
g-*class tokens remain in active frontend codebase outside non-app hidden tooling (frontend/.cursor/...). - Final verification passed:
cd frontend && npx vitest run && npm run build.
π’ Session 35 β 2026-03-19
Option A baseline: pinned retry tracking contract tests
- Added
frontend/__tests__/EngineConsole.test.tsxto validate the pinned βKeyword Retry Trackingβ panel contract via mocked/api/sites+/api/scrape/progress. - Updated
frontend/vitest.config.tsso Vitest runs onlyfrontend/__tests__(avoids picking up Cursor harness.cursor/tests). - Verified:
cd frontend && npx vitest run+npm run build --prefix frontend.
π’ Session 36 β 2026-03-19
Option A baseline: scrape-progress endpoint contract tests
- Added
backend_tests/test_scrape_progress.pyto seed a temp SQLite DB and verifyGET /api/scrape/progressoutput (keyword_batch_enabled,active_round,pending_items, andwarn_duelogic). - Verified:
python -m unittest discover -s backend_tests -p 'test_*.py'. - Re-verified:
cd frontend && npx vitest runremained green.
π’ Session 37 β 2026-03-19
Option A baseline: UI limiting behavior
- Updated
frontend/__tests__/EngineConsole.test.tsxwith a new case that mocks 10 pending items and asserts:- only the first 8 keyword terms render
- the UI shows
Showing first 8 of 10.
- Verified:
cd frontend && npx vitest run.
π’ Session 38 β 2026-03-19
Option A baseline: API contract tests for dashboard
- Extended
backend_tests/test_scrape_progress.pywith:/api/statsresponse shape assertions/api/listings/countdown-syncvalues + ISO timestamp fields based on seededListingrows.
- Verified:
python -m unittest discover -s backend_tests -p 'test_*.py'and frontendvitestremained green.
π’ Session 39 β 2026-03-19
Option A baseline: /api/listings/refresh-status contract test
- Extended
backend_tests/test_scrape_progress.pywith assertions for:GET /api/listings/refresh-statusreturnslast_price_updateISO string andlisting_count.
- Verified:
python -m unittest discover -s backend_tests -p 'test_*.py'+ frontendvitest.
π’ Session 40 β 2026-03-19
Option A baseline: /api/sites numeric flags contract
- Added backend contract assertions in
backend_tests/test_scrape_progress.pyverifyingenabled,custom_visible_browser,requires_login,login_enabledare returned as integer0/1(not JSON booleans). - Fixed
models.pyTargetSite.to_dict()to emit0/1integers for those flag fields. - Verified: backend unittests + frontend
vitestremain green.
π’ Session 41 β 2026-03-19
Option A baseline: /api/config contract tests (Settings page)
- Added backend contract assertions in
backend_tests/test_scrape_progress.pyfor:GET /api/configreturning a flat{key: value}object with string valuesPOST /api/configupserting values as strings and returning{status, keys}
- Verified: backend unittests and frontend
vitestremained green.
π’ Session 34 β 2026-03-18
MD Update Playbook (repeatable doc job)
- Added
docs/MD_UPDATE_PLAYBOOK.mdwith:- deep semantic audit workflow for all
*.mdfiles - exact mechanics checklist for per-site visibility override and keyword batching + retry tracking
- reusable prompt (TEXT + JSON) with approval gate + verification checklist
- deep semantic audit workflow for all
π’ Session 33 β 2026-03-18
Per-site Visible/Custom Browser Override
- Added
TargetSite.custom_visible_browser(0/1). - Global
show_browser=trueforces visible mode for all sites. - When
show_browser=false, a site becomes visible only ifcustom_visible_browser=1.
Keyword Batching + Persistent Progress Tracking
- Added config
keyword_batch_enabled(defaultfalse). - Introduced
scrape_rounds+scrape_round_itemsto track per-(site, keyword) status across cycles. - Engine batches at most
max_tabs_per_sitekeyword attempts per site per cycle/round. - Failures mark items
pendingand keep retrying until the roundβs 4-hour retry window expires.
Hourly Retry Warnings + Live Dashboard
- Hourly bookkeeping updates
scrape_round_items.last_hour_warn_at. - Added API:
GET /api/scrape/progressfor the dashboard to render pinned βKeyword Retry Trackingβ.
π’ Session 32 β 2026-03-18
Redis Cache Layer (Priority 1 β DONE)
- Added
_init_redis(),_redis_set_stats(),_redis_publish(),_redis_cache_set/get()helpers in worker.py - Graceful write-through: app runs unchanged when
REDIS_URLnot set - Stats synced to Redis on cycle complete, engine pause/resume, engine running
new_listingpub/sub event published on every alert- New endpoint:
GET /api/redis/statusβ connectivity check + cached stats - Redis channel:
ghostnode:events, stats key:ghostnode:stats
Docker Compose (Priority 2 β DONE)
Dockerfileβ Python 3.11-slim + Playwright Chromium + all deps, serves on port 8000docker-compose.ymlβ 3 services: ghostnode, postgres:16-alpine, redis:7-alpine- Auto health checks on Postgres + Redis before ghostnode starts
- One-command:
docker compose up --build - Volumes:
postgres_data,redis_data,ghostnode_sessions
Lot Description Extraction / N18 (Priority 3 β DONE)
JS_DETAIL_TEXTβ 4-layer JS extractor: JSON-LD β OG meta β known selectors β largest<p>blockdescription (Text)column added toListingORM + migration in_migrate_schema()for SQLite + PostgreSQL_fetch_listing_images_batch()now evaluatesJS_DETAIL_TEXTon every detail page visit (zero extra network cost β same page already open for images)_build_ai_prompt()and_ai_analyze()updated to accept optionaldescriptionparam- Re-analysis: listings that passed AI on title alone (
ai_match=1) are re-evaluated with description after detail fetch to_dict()onListingnow includesdescriptionfield
π‘ Pending Features β Priority Queue
Priority 1 β Frontend Polish
Badge system refinement, animation tuning, show description in ListingDetailPanel.
Priority 2 β Docker Testing
Test the docker-compose stack end-to-end. Verify PostgreSQL migration, Redis pub/sub, Playwright in container.
Priority 3 β vLLM Production Inference
Replace Groq rate-limited free tier with self-hosted vLLM on rented GPU for production scale.
Priority 4 β Frontend Visual Polish
Session 27: Full premium redesign β ambient animated gradient background (3 floating orbs + dot grid), glassmorphism shell (backdrop-blur + saturate), gradient glow cards (g-card-glow with animated border), Framer Motion staggered card/row/page animations, gradient text headings, badge system (green/amber/red/blue/purple/neutral), gradient underline active nav with glow, status pill with live pulse dot + aura shadow. New CSS prefix: g-* (e.g. bg-g-base, text-g-green). All 21 tests + build passing.
Session 28: Added a dedicated marketing landing page (frontend/components/landing/LandingPage.tsx) and switched frontend/app/page.tsx from redirect('/dashboard') to render the landing component. Root route now serves landing content in fresh static export.
π΅ Known Improvements (Lower Priority)
| Item | Description |
|---|---|
| Edit Site modal | No way to edit login fields on existing sites after creation |
| Cloudflare Turnstile | Current solver handles reCAPTCHA/hCaptcha only β Turnstile needs cf-clearance-scraper |
| Mobile dashboard | Desktop-only β needs responsive grid breakpoints |
| Sort by USD price | Listings table sorts by raw price β should optionally sort by price_usd |
| N18: Site Discovery | Skipped β AI-powered discovery of new auction sites from web |
Last updated: 2026-03-13 β Session 28