From 538876ac164984d2649a846583297fb8f5fa5306 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 5 Aug 2026 07:34:35 -0400 Subject: [PATCH] docs: infrastructure gap assessment + project updates - infrastructure-gap-assessment: full audit doc - project-log: recent completions - hotnow, hotnow-phase1, ops-portal-runcloud-design-brief, schoolcart PTA docs - intelsight and schoolcart updates --- ...nfrastructure-gap-assessment-2026-08-04.md | 290 ++++ docs/project-log.md | 12 + projects/hotnow-phase1.md | 985 +++++++++++++ projects/hotnow.md | 827 +++++++++++ projects/intelsight.md | 15 + projects/ops-portal-runcloud-design-brief.md | 1282 +++++++++++++++++ projects/schoolcart-pta-marketing-blitz.md | 372 +++++ projects/schoolcart-pta-research.md | 123 ++ projects/schoolcart.md | 8 +- 9 files changed, 3910 insertions(+), 4 deletions(-) create mode 100644 docs/infrastructure-gap-assessment-2026-08-04.md create mode 100644 projects/hotnow-phase1.md create mode 100644 projects/hotnow.md create mode 100644 projects/ops-portal-runcloud-design-brief.md create mode 100644 projects/schoolcart-pta-marketing-blitz.md create mode 100644 projects/schoolcart-pta-research.md diff --git a/docs/infrastructure-gap-assessment-2026-08-04.md b/docs/infrastructure-gap-assessment-2026-08-04.md new file mode 100644 index 0000000..cf32d98 --- /dev/null +++ b/docs/infrastructure-gap-assessment-2026-08-04.md @@ -0,0 +1,290 @@ +# ITPP Infrastructure Documentation Gap Assessment +**Date:** 2026-08-04 +**Auditor:** Hermes Agent (subagent) +**Scope:** All ITPP infrastructure β€” Core, app1, app2, app3, app1-bu, wphost02 + +--- + +## Executive Summary + +**Total services discovered running:** 65+ (across 5 hosts) +**Services with NO backup:** 12 (CRITICAL: 3 with production data at risk) +**Services missing from API master list:** 14 +**Documentation staleness issues:** 7 +**Services with NO project documentation:** 22+ +**Duplicate services (unintended):** 2 (Twenty CRM, SearXNG running on both Core AND App1) +**Sites missing local snapshots (App3):** 4 + +--- + +## (A) CRITICAL GAPS β€” Services with NO Backup + +### πŸ”΄ Priority 1 β€” Production data at immediate risk + +| # | Service | Host | Risk | Data at stake | +|---|---------|------|------|---------------| +| 1 | **Ragflow** (full stack) | App2 | CRITICAL | MySQL DB, Minio objects, Infinity vector DB, Valkey cache β€” entire RAG/knowledge base platform. 6 Docker containers including mysql:8.0.39, minio, infinity vector DB | +| 2 | **Mattermost** | App1 | CRITICAL | Team chat messages, channels, files, user accounts. postgres:16-alpine backend | +| 3 | **Wazuh** (SIEM) | App1 | HIGH | Security events, alerts, agent data, compliance logs. 3 containers (dashboard, manager, indexer). Only the server itself is backed up via app1 general backup β€” Wazuh data is NOT | + +### 🟑 Priority 2 β€” Important services without backups + +| # | Service | Host | Risk | Data at stake | +|---|---------|------|------|---------------| +| 4 | **Dawarich** | App2 | MEDIUM | Location history data (PostGIS), Redis cache. NOT in app2-backup.sh | +| 5 | **Technitium DNS** | App2 | MEDIUM | DNS zone configs, DHCP leases, blocklists. NOT in app2-backup.sh | +| 6 | **SearXNG (App1)** | App1 | MEDIUM | Search engine config. Backup plan says "removed" but it's running on :8080 | +| 7 | **MCP containers** (App1) | App1 | LOW | mcp-browser, mcp-email, mcp-git, mcp-filesystem, super-search β€” config/state not backed up individually | +| 8 | **browserless** (App1) | App1 | LOW | Stateless Chrome, but no restart config backup | +| 9 | **Timetrex** | Core | LOW | Time tracking data β€” Docker container, no compose file found | +| 10 | **Microbin** | Core | LOW | Paste bin data β€” Docker container, compose exists at /opt/microbin/ | +| 11 | **browserless** (Core) | Core | LOW | Stateless Chrome, :3000 (conflicts with Grafana's documented port) | +| 12 | **crawl4ai** | Core | LOW | Python service :8910 β€” web crawling config. No compose, running from /root/docker/crawl4ai/ | + +### 🟒 Services running natively (Core systemd/Python β€” minimal backup need) + +These are stateless or backed up via hermes-backup.sh (skills/profiles/sessions) and root-essentials-backup.sh (scripts): +- hotnow-api (:8001), auth-server (:8500), pipeline-server (:8200), hermes-voice (:4331), host-metrics-exporter (:9275), transitpin-mockup (:8912), http-server (:9876) + +--- + +## (B) DOCUMENTATION GAPS β€” Services not in API Master List + +### Missing from `/root/projects/itpp-infrastructure/api-master-list.md` + +| # | Service | Host | Port | Notes | +|---|---------|------|------|-------| +| 1 | **Mattermost** | App1 | :8065 | Team chat β€” not listed anywhere | +| 2 | **n8n** | App1 | :5678 | Workflow automation β€” not listed | +| 3 | **Ragflow** | App2 | :9380-9384 | RAG platform β€” not listed | +| 4 | **SearXNG (App1)** | App1 | :8080 | Listed only on Core :8888 | +| 5 | **Timetrex** | Core | :8085 | Time tracking β€” not listed | +| 6 | **Microbin** | Core | :8260 | Paste bin β€” not listed | +| 7 | **browserless** (Core) | Core | :3000 | Chrome automation β€” not listed | +| 8 | **browserless** (App1) | App1 | :3005 | Chrome automation β€” not listed | +| 9 | **crawl4ai** | Core | :8910 | Web crawler β€” not listed | +| 10 | **hermes-control-deck** | Core | systemd | Control deck API β€” not listed | +| 11 | **MCP containers** (App1) | App1 | :8900-8903 | Litellm MCP gateway services β€” not listed individually | +| 12 | **Super Search (App1)** | App1 | container | Duplicate of Core's β€” not listed | +| 13 | **hotnow-api** | Core | :8001 | HotNow API (different from :8000 Diglocate) | +| 14 | **auth-server** | Core | :8500 | Centralized auth project | + +--- + +## (C) STALE DOCUMENTATION β€” Wrong/Outdated Information + +### πŸ”΄ API Master List errors + +| # | Issue | Doc says | Actual | Severity | +|---|-------|----------|--------|----------| +| 1 | **Grafana port** | Core :3000 | Core :3002 (browserless/chrome occupies :3000) | MED β€” monitoring dashboards accessed at wrong port | +| 2 | **DocuSeal port** | App1 :3000 | App1 :3002 (Open WebUI occupies :3000 on App1) | MED | +| 3 | **Twenty CRM location** | Core :3003 (listed as Core) | Running on BOTH Core :3003 AND App1 :3003 | HIGH β€” duplicate service, unclear which is authoritative | +| 4 | **SearXNG status** | Core :8888, backup plan says "removed" | Actually running on BOTH Core :8888 AND App1 :8080 | HIGH β€” backup plan says replaced by Super Search but still running on two hosts | +| 5 | **Vaultwarden location** | Core :8080 (in old API list), App1 :8081 | Only on App1 :8081 (correct) but stale S3 paths remain | LOW | +| 6 | **Komodo location** | Migrated to App1 :9120 | Correctly on App1 :9120 | OK | +| 7 | **DocuSeal location** | Migrated to App1 :3002 | Correctly on App1 :3002 | OK | +| 8 | **Twenty CRM migration** | Backup plan says migrated to App1 | Still running on Core too! The migration was partial or the Core instance was never shut down | HIGH | + +### πŸ”΄ Backup Plan errors + +| # | Issue | Details | +|---|-------|---------| +| 9 | **S3 stale paths** | `core/vaultwarden/`, `core/twenty/`, `core/searxng/`, `core/komodo/` still in S3 hierarchy β€” services migrated but old paths not cleaned | +| 10 | **Backup plan lists Core services that migrated** | Table shows Vaultwarden, SearXNG, Twenty CRM, Komodo, DocuSeal, Kokoro TTS under Core section β€” all migrated to App1 | +| 11 | **app1-backup.sh (on App1) backs up MORE than documented** | Script backs up n8n (not in plan), Ollama (not in plan) but does NOT back up Mattermost, Wazuh, SearXNG (App1), browserless | +| 12 | **app2-backup.sh (on App2) coverage gaps** | Script covers Traccar, Gitea, Hudu, UNMS, UniFi but misses Dawarich, Technitium DNS, Ragflow | + +### πŸ”΄ App3 Snapshot Coverage + +| # | Site | Nginx config? | In backup-restore snapshots? | In S3 app3-backup.sh? | +|---|------|--------------|------------------------------|----------------------| +| 1 | intelsight.io | βœ… | ❌ | βœ… (via WordPress files backup) | +| 2 | my.voipsimplicity.com | βœ… | ❌ | βœ… | +| 3 | panel.itpropartner.com | βœ… | ❌ | N/A (CloudPanel itself) | +| 4 | transitpin.com | βœ… | ❌ | βœ… | + +--- + +## (D) CREDENTIAL GAPS + +### Credential Management Assessment + +- **Vaultwarden:** Running on App1 :8081. Accessible via web UI. Not directly queryable via API without auth token. +- **Standard credentials** (ippadmin/LoveMyBoys.1520!): Referenced in task context. Need to verify which services use these vs. unique credentials. +- **Key credential files:** `/root/.hermes/.env`, `~/.aws/credentials`, Vaultwarden vault +- **DR Issue Log** references `migration-creds.txt` and `dre-temp-passwords.txt` β€” both now `chmod 600` (DR-004, DR-005 fixed) + +### Recommendations: +1. Audit all services to confirm which use standard creds vs unique creds +2. Each service should have a Hudu asset documenting its credentials +3. Service-specific API keys (n8n, Mattermost, Ragflow internal admin) need to be inventoried + +--- + +## (E) SERVICES WITH NO PROJECT DOCUMENTATION + +The `/root/projects/itpp-infrastructure/` repo has documentation for only ~8 projects out of 30+ running services: + +**Have docs:** ops-portal, backup-restore, hotnow, intelsight, schoolcart, tripflow, beachdirect, forefront-broadband-map, missed-call-lead-recovery + +**NO docs (22+ services):** +Mattermost, n8n, Ragflow, Wazuh, Dawarich, Technitium DNS, Timetrex, Microbin, browserless (both), crawl4ai, Vaultwarden, Komodo, DocuSeal, LiteLLM, Open WebUI, Twenty CRM, Kokoro TTS, PRY, TransitPin, Village Express, Shopping Cart, Voice Agent stack, Diglocate, Rally, Shark Game, hermes-assistant, hermes-control-deck, Camofox, Super Search, Gitea, Hudu, UNMS, UniFi + +--- + +## (F) DUPLICATE SERVICES + +Two services are running redundantly on both Core and App1: + +| Service | Core | App1 | Notes | +|---------|------|------|-------| +| **Twenty CRM** | :3003 (Docker, 5 containers) | :3003 (Docker, 4 containers) | Migration doc says moved to App1. Core instance was never shut down. Which is authoritative? | +| **SearXNG** | :8888 (Docker) | :8080 (Docker) | Backup plan says "removed, replaced by Super Search." Both still running. | + +--- + +## (G) RECOMMENDED FIXES β€” Priority Order + +### πŸ”΄ Immediate (this week) + +1. **Backup Ragflow** β€” Create ragflow-backup.sh on App2. Dump MySQL (mysql:8.0.39), backup Minio objects, backup Infinity DB. Add to cron. Risk: complete RAG platform data loss. + +2. **Backup Mattermost** β€” Add to app1-backup.sh or create mattermost-backup.sh. Dump postgres:16-alpine DB, backup file uploads. Add to cron. + +3. **Backup Wazuh** β€” Create wazuh-backup.sh on App1. Backup Elasticsearch indices and Wazuh manager config. Add to cron. + +4. **Shut down duplicate Twenty CRM on Core** β€” The migration doc says it moved to App1. The Core instance (5 containers) is likely stale and consuming resources. Verify App1 instance is authoritative, then stop Core instance. + +5. **Shut down duplicate SearXNG on both hosts OR document the dual deployment** β€” Backup plan says "removed, replaced by Super Search." If Super Search is sufficient, remove both SearXNG instances. If still needed, document why and add to backup plan. + +### 🟑 This sprint (next 2 weeks) + +6. **Update API Master List** β€” Add all 14 missing services. Fix stale port references (Grafana :3000β†’:3002, DocuSeal :3000β†’:3002). + +7. **Update Backup Plan** β€” Remove stale Core entries (Vaultwarden, SearXNG, Twenty, Komodo, DocuSeal, Kokoro). Add Mattermost, n8n, Wazuh, Ragflow. Note that n8n IS backed up by app1-backup.sh but not documented. + +8. **Backup Dawarich** β€” Add PostGIS dump to app2-backup.sh. + +9. **Backup Technitium DNS** β€” Add DNS zone/config backup to app2-backup.sh. + +10. **Add App3 sites to local snapshots** β€” Add intelsight.io, my.voipsimplicity.com, transitpin.com to `/opt/backup-restore/snapshot.sh` coverage. + +### 🟒 Backlog (next month) + +11. **Create project docs** for at minimum: Mattermost, n8n, Ragflow, Wazuh (the 4 services with no docs AND production data). + +12. **Create `disaster-recovery-plan.md`** in itpp-infrastructure repo β€” it doesn't exist at the expected path. The DR issue log references it but the file is missing. + +13. **Audit S3 bucket** β€” Clean stale paths (core/vaultwarden/, core/twenty/, core/searxng/, core/komodo/). Verify recent backups for all 26 documented targets. + +14. **Credential audit** β€” Log into Vaultwarden, enumerate all entries, cross-reference with running services, identify gaps. + +15. **Timetrex and Microbin** β€” Document purpose, add compose files to repo, add lightweight backup if they hold data. + +16. **Create per-service README template** β€” Standardized format: purpose, host, ports, dependencies, backup method, restore procedure, credentials location. + +--- + +## Methodology + +- **Baseline docs read:** `/root/projects/itpp-infrastructure/backup-plan.md`, `api-master-list.md`, `/root/.hermes/references/dr-issue-log.md` +- **Hosts audited via SSH:** Core (localhost), app1 (152.53.36.131), app2 (152.53.39.202), app3 (152.53.241.111), app1-bu (5.161.225.131), wphost02 (5.161.62.38) +- **Enumeration:** `docker ps`, `ss -tlnp`, `systemctl list-units`, `crontab -l`, `ls /etc/nginx/sites-enabled/` +- **Cross-reference:** Each running service checked against API master list, backup plan, and itpp-infrastructure project docs +- **Key:** `/root/.ssh/itpp-infra` used for all remote SSH + +--- + +## Appendix: Complete Service Inventory + +### Core (152.53.192.33) β€” netcup RS 2000 + +| Service | Type | Port | In API List? | Backed Up? | Has Docs? | +|---------|------|------|-------------|------------|-----------| +| Twenty CRM | Docker (5ctr) | :3003 | βœ… (stale: says Core) | ⚠️ (S3: app1/twenty/, Core backup) | ❌ | +| SearXNG | Docker | :8888 | βœ… (stale: says removed) | ⚠️ (stale S3 path) | ❌ | +| Prometheus | Docker | :9090 | βœ… | βœ… (core-services-backup.sh) | ❌ | +| Grafana | Docker | :3002 | βœ… (wrong port :3000) | βœ… | ❌ | +| Telegraf | Docker | :9273 | βœ… | βœ… (system) | ❌ | +| Uptime Kuma | Docker | :3001 | βœ… | βœ… | ❌ | +| MikroTik Exporter | Docker | :9436 | βœ… | βœ… (system) | ❌ | +| Camofox Browser | Docker | :9377 | βœ… | ⚠️ (hermes-backup.sh) | ❌ | +| browserless | Docker | :3000 | ❌ | ❌ | ❌ | +| Timetrex | Docker | :8085 | ❌ | ❌ | ❌ | +| Microbin | Docker | :8260 | ❌ | ❌ | ❌ | +| Super Search MCP | systemd | :8899 | βœ… | βœ… (hermes-backup.sh) | ⚠️ (partial) | +| DRE MCP | systemd | :8900 | βœ… | βœ… | ❌ | +| Twilio MCP | systemd | :8901 | βœ… | βœ… | ❌ | +| OSINT Person MCP | systemd | :8902 | βœ… | βœ… | ❌ | +| FT360 MCP | systemd | :8903 | βœ… | βœ… | ❌ | +| PRY | systemd | :8905 | βœ… | βœ… | ❌ | +| Ops Portal | systemd | :8090 | βœ… | βœ… | βœ… | +| IntelSight API | systemd | :8099 | βœ… | βœ… | βœ… | +| Diglocate API | systemd | :8000 | βœ… | βœ… | ❌ | +| hotnow-api | systemd | :8001 | ❌ | ❌ | ⚠️ (project doc exists) | +| Rally | systemd | :8105 | βœ… | βœ… | ❌ | +| Village Express | systemd | :8210 | βœ… | βœ… | ❌ | +| Voice Agent STT | systemd | :9000 | βœ… | βœ… | ❌ | +| Voice Agent | systemd | :9101 | βœ… | βœ… | ❌ | +| Shopping Cart | systemd | :8101 | βœ… | βœ… | ❌ | +| OSINT API | systemd | :8100 | βœ… | βœ… | ❌ | +| Shark Game | systemd | :8083 | βœ… | βœ… | ❌ | +| hermes-assistant | systemd | :8082 | βœ… | βœ… | ❌ | +| hermes-control-deck | systemd | n/a | ❌ | βœ… | ❌ | +| hermes-voice | systemd | :4331 | ❌ | βœ… | ❌ | +| auth-server | systemd | :8500 | ❌ | ❌ | ❌ | +| pipeline-server | systemd | :8200 | ❌ | ❌ | ❌ | +| crawl4ai | systemd | :8910 | ❌ | ❌ | ❌ | +| host-metrics-exporter | systemd | :9275 | ❌ | ❌ | ❌ | +| transitpin mockup | systemd | :8912 | ❌ | ❌ | ❌ | + +### App1 (152.53.36.131) β€” netcup RS 4000 + +| Service | Type | Port | In API List? | Backed Up? | Has Docs? | +|---------|------|------|-------------|------------|-----------| +| Open WebUI | Docker | :3000 | βœ… | βœ… (app1-backup.sh) | ❌ | +| LiteLLM | Docker | :4000 | βœ… | βœ… | ❌ | +| Komodo | Docker | :9120 | βœ… | βœ… (komodo-backup.sh) | ❌ | +| DocuSeal | Docker | :3002 | βœ… (port :3000) | βœ… (docuseal-backup.sh) | ❌ | +| Twenty CRM | Docker (4ctr) | :3003 | βœ… (says Core) | βœ… (twenty-backup.sh) | ❌ | +| Kokoro TTS | Docker | :8880 | βœ… | N/A (stateless) | ❌ | +| SearXNG (App1) | Docker | :8080 | ❌ (only listed on Core) | ❌ | ❌ | +| Wazuh | Docker (3ctr) | :5601/:9200 | βœ… | ❌ | ❌ | +| Vaultwarden | Docker | :8081 | βœ… | βœ… (vaultwarden-backup.sh) | ❌ | +| n8n | Docker | :5678 | ❌ | βœ… (in app1-backup.sh but not plan) | ❌ | +| Mattermost | Docker | :8065 | ❌ | ❌ | ❌ | +| MCP Gateway services | Docker (5ctr) | :8900-8903 | ❌ | ❌ | ❌ | +| browserless (App1) | Docker | :3005 | ❌ | ❌ | ❌ | +| Super Search (App1) | Docker | n/a | ❌ | ❌ | ❌ | + +### App2 (152.53.39.202) β€” netcup RS 4000 + +| Service | Type | Port | In API List? | Backed Up? | Has Docs? | +|---------|------|------|-------------|------------|-----------| +| Hudu | Docker (4ctr) | :3000 (int) | βœ… | βœ… (hudu-backup.sh) | ❌ | +| Gitea | Docker | :3001 (int) | βœ… | βœ… (gitea-backup.sh) | ❌ | +| UNMS/UISP | Docker (full) | :8089 | βœ… | βœ… (unms-backup-sync.sh) | ❌ | +| UniFi | Docker | :8443 | βœ… | βœ… (unifi-backup-sync.sh) | ❌ | +| Traccar | Docker | :8082 | βœ… | βœ… (app2-backup.sh) | ❌ | +| Dawarich | Docker (4ctr) | :3002 | βœ… | ❌ | ❌ | +| Technitium DNS | Docker | :5380 | βœ… | ❌ | ❌ | +| Ragflow | Docker (6ctr) | :9380-9384 | ❌ | ❌ | ❌ | + +### App3 (152.53.241.111) β€” netcup RS 4000 (CloudPanel) + +13 WordPress sites hosted. All backed up to S3 via app3-backup.sh (daily 3 AM). 4 of 13 sites NOT in local snapshot rotation (intelsight.io, my.voipsimplicity.com, panel.itpropartner.com, transitpin.com). + +### App1-BU (5.161.225.131) β€” Hetzner CPX21 + +Warm standby Hermes. No Docker. Cron: standby watchdog (every 5 min) + sync (every 10 min). Correctly configured per DR plan. + +### wphost02 (5.161.62.38) β€” Hetzner CPX21 + +RunCloud WordPress hosting. 2 users (ippadmin, runcloud). Backed up via SSH from Core at 5 AM daily. Verified functional (DR-018, Jul 19). + +--- + +## Files Created + +- `/root/projects/itpp-infrastructure/docs/infrastructure-gap-assessment-2026-08-04.md` β€” this report diff --git a/docs/project-log.md b/docs/project-log.md index d5b1980..6bcbaef 100644 --- a/docs/project-log.md +++ b/docs/project-log.md @@ -66,3 +66,15 @@ ### Skills Updated - 10 skills patched: docker-service-deployment, home-lab-*, server-architecture-plan, twilio-10dlc, vaultwarden-management, voip-portal, hudu, syncromsp, recurring-information-scout + +## 2026-07-29 + +### Village Express β€” Client Project +- Direct client engagement: student transport platform for Savannah family +- Built working mockups: client registration form + admin dashboard +- Live at https://mockup.iamgmb.com/village-express/ and /admin.html +- Deployed: registration form with SCCPSS school dropdown, e-signatures, SMS PIN +- Deployed: admin dashboard with 5-page nav, approve/reject, route toggles, SMS broadcast modal, settings +- Project proposal written: scope, pricing ($1,500 setup / $497/mo), timeline, Phases 1-3 +- Customer email drafted: benefit-focused, sells time savings and simplicity +- Both documents in /root/projects/village-express/ diff --git a/projects/hotnow-phase1.md b/projects/hotnow-phase1.md new file mode 100644 index 0000000..6f2e2ad --- /dev/null +++ b/projects/hotnow-phase1.md @@ -0,0 +1,985 @@ +# HotNow.io β€” Phase 1: Architecture + Competitive Intel + +> **Phase 1 of 4 β€” $50 Premium Build** +> **Date:** August 2, 2026 +> **Status:** βœ… Complete β€” Awaiting Germaine Review + +--- + +## Table of Contents + +1. [Competitive Landscape](#1-competitive-landscape) +2. [Opportunity Analysis & HotNow's Edge](#2-opportunity-analysis--hotnows-edge) +3. [Product Architecture](#3-product-architecture) +4. [Data Model](#4-data-model) +5. [API Surface](#5-api-surface) +6. [Real-Time Ranking Algorithm](#6-real-time-ranking-algorithm) +7. [Component Tree & PWA Shell](#7-component-tree--pwa-shell) +8. [Infrastructure & Deployment](#8-infrastructure--deployment) +9. [Build Plan Preview (Phases 2-4)](#9-build-plan-preview-phases-2-4) +10. [Follow-Up Questions for Germaine](#10-follow-up-questions-for-germaine) + +--- + +## 1. Competitive Landscape + +### Market Segmentation + +The local discovery space is fragmented across four segments β€” nobody owns all of them: + +| Segment | What It Covers | Key Players | +|---------|---------------|-------------| +| **Restaurant/Business Discovery** | Finding places to eat, drink, shop | Yelp, Google Maps, Beli, Corner, TripAdvisor | +| **Event/Ticketing Platforms** | Buying tickets, browsing events | Eventbrite, DICE/Fever, Songkick, Bandsintown | +| **Neighborhood Social** | Hyperlocal community chatter | Nextdoor, Facebook Groups, Ring Neighbors | +| **Curated Experiences** | Immersive, premium, one-off events | Fever (Candlelight), Secret Cinema, Airbnb Experiences | + +### Competitor Deep Dives + +--- + +#### 2. Yelp β€” The Incumbent Giant + +- **What it is:** 20-year-old local business discovery platform. 21-22M reviews/year. Massive community-generated content moat. +- **What's new (2025 Fall Release):** Massive AI push β€” Yelp Assistant (AI chatbot on every business page), Menu Vision (AR menu scanning), natural language/voice search, Popular Offerings (LLM-extracted crowd favorites), Yelp Host/Receptionist (AI call answering for businesses). Partnered with DoorDash for delivery. +- **Pricing:** Free for consumers. Business advertising: $150-$5,000+/mo. Yelp Host: $99/mo. +- **UX Pattern:** List-first with map secondary. Search-driven discovery. +- **Weaknesses:** + - Not real-time β€” Yelp ranks on accumulated review history, not "what's hot right now" + - Weak on events β€” events are an afterthought, not core UX + - Gen Z exodus β€” Beli and Corner are eating its lunch with younger demographics + - No social buzz integration β€” no TikTok/Instagram trend signals +- **πŸ”΄ HotNow opportunity:** Real-time trending that Yelp's batch-oriented ranking can't match. Social buzz as a ranking signal. Event-first UX. + +--- + +#### 3. Fever β€” The Experience Curator + +- **What it is:** Global ticketing platform for curated experiences. 30+ cities worldwide. Known for Candlelight Concerts, immersive Van Gogh exhibits, themed pop-ups. +- **Big news:** **Acquired DICE in 2025** β€” combined entity now dominates curated event ticketing +- **Pricing:** Free to browse. Fever takes a commission on ticket sales (service fees added). No consumer subscription. +- **UX Pattern:** Feed-first (curated hero cards). List + grid browse. Map only for venue lookup. +- **Weaknesses:** + - Curated, not comprehensive β€” Fever only shows its own catalog (events they ticket) + - Not real-time β€” no trending algorithm, fixed listings + - Not local-discovery β€” it's a ticketing platform, not a "what's happening around me" tool + - B2C curation model β€” doesn't surface grassroots/pop-up/unlisted happenings +- **πŸ”΄ HotNow opportunity:** Comprehensive vs. curated. Real-time vs. scheduled. Discovery vs. ticketing. + +--- + +#### 4. DICE β€” Transparent Ticketing + +- **What it is:** Music-first ticketing platform with transparent pricing (no hidden fees). Strong in UK/Europe, expanding in US. Acquired by Fever. +- **Pricing:** No consumer fees β€” built into ticket price. Artist/venue revenue share. +- **UX Pattern:** Feed-first with personalized recommendations based on listening history (Spotify/Apple Music integration). +- **Weaknesses:** + - Music-only β€” no restaurant/bar/pop-up discovery + - Ticketing-centric β€” useless if you just want to know what's happening without buying a ticket + - Post-acquisition uncertainty β€” Fever integration may shift focus +- **πŸ”΄ HotNow opportunity:** Cross-category discovery (not just music). Free-form exploration without ticket purchase obligation. + +--- + +#### 5. Eventbrite β€” The Event Marketplace + +- **What it is:** Largest self-service event platform. 5M+ events/year. 2025 rebrand from utility to "cultural hub." +- **New initiatives:** AI personalization, Listener.com partnership for audience reach, AI-powered event recommendations. +- **Pricing:** Free to browse. Organizers pay: free tier (up to 25 tickets), then 2% + $0.79 per paid ticket, or subscription plans. +- **UX Pattern:** Search-first with category browse. List results. Map secondary. +- **Weaknesses:** + - Quantity over quality β€” lots of spam, online webinars, low-quality listings + - No real-time signal β€” static listings sorted by date/relevance + - Brand perception: "event Craigslist" β€” utilitarian, not aspirational + - Not Gen Z cool β€” zero social features +- **πŸ”΄ HotNow opportunity:** Quality-filtered, social-buzz ranked. Cool brand. Map-first UX. + +--- + +#### 6. Nextdoor β€” Neighborhood Social + +- **What it is:** Hyperlocal social network for neighborhoods. 15 years old. User-generated content: recommendations, alerts, events. +- **2025 redesign:** AI-powered "Faves" for local business discovery, real-time emergency alerts (weather/traffic/power), local news from 3,500+ publisher partners, LLM per neighborhood trained on 15 years of conversations. +- **Pricing:** Free. Ad-supported + promoted business posts. +- **UX Pattern:** Feed-first (social). Map for alerts. List for businesses. +- **Weaknesses:** + - Brand damage β€” associated with racism, misinformation, "Karen" culture + - Demographic skew β€” older homeowners, not Gen Z/Millennials going out + - Events are buried β€” not a discovery tool, it's a neighborhood bulletin board + - Reactive, not proactive β€” "lost cat" dominates over "cool thing happening" +- **πŸ”΄ HotNow opportunity:** Aspirational, cool brand. Discovery-first. Young demographic. No neighborhood baggage. + +--- + +#### 7. Beli β€” Gen Z Restaurant Ranking + +- **What it is:** Restaurant ranking + social app. Goodreads/Letterboxd for food. 80% of users under 35. 30M reviews in 2024 (surpassing Yelp's 21M). +- **How it works:** Log restaurants, compare them head-to-head (pairwise ranking algorithm assigns scores /10), follow friends, browse feeds. No star ratings. +- **Growth engine:** College campus ambassador program. Leaderboards by school. Dating app integration (sharing rankings to vet dates). TikTok/Instagram virality. +- **Pricing:** Free (currently). No ads. No monetization yet. +- **UX Pattern:** Feed-first (social). Profile-centric. No map. +- **Weaknesses:** + - Restaurant-only β€” no events, bars (as venues), pop-ups, activities + - Past-tense β€” about where you've been, not what's happening right now + - No map β€” poor for real-time exploration + - No monetization path yet β€” unclear business model +- **πŸ”΄ HotNow opportunity:** Real-time + events + map. Broader than restaurants. Clear revenue model from day one. + +--- + +#### 8. Corner β€” Gen Z Social Map + +- **What it is:** Map-first social app for Gen Z. User-curated map of places (restaurants, bars, shops, sunset spots). No star ratings. Mood-board style lists. $3.75M raised. +- **Key features:** AI semantic search ("sexy wine bar" β†’ results), Instagram/TikTok bookmark import, user-generated descriptions (Gen Z voice: "performative male wine bar to break someone's heart"), Mapbox-powered. +- **Stats:** 55,000 users, 275,000+ places, 450 cities. Hubs: NYC, SF, Tokyo, LA, Seoul. +- **Pricing:** Free. Considering premium trip-planning tier. No sponsored placements (stated philosophy). +- **UX Pattern:** Map-first. Feed of friend activity. Profile + lists. +- **Weaknesses:** + - Tiny scale β€” 55K users vs. Yelp's millions + - User-generated only β€” no data if nobody has added a place yet + - No events β€” purely place discovery (static) + - Gen Z monoculture β€” alienates 30+ demographic + - No monetization β€” pre-revenue, burning VC +- **πŸ”΄ HotNow opportunity:** Events + real-time + broader demographic. Data-rich from day one (Super Search v2). Revenue from launch. + +--- + +#### 9. Google Maps β€” The 800-Pound Gorilla + +- **What it is:** Default map for 1B+ users. 20 years old. "Explore" tab surfaces nearby restaurants, attractions, activities. +- **Recent AI:** Gemini-powered conversational search, AR Live View, "Popular Times" (historical foot traffic data), AI-summarized place descriptions. +- **Pricing:** Free for consumers. Google Ads for businesses. +- **UX Pattern:** Map-first. Everything is on the map. Unbeatable directions + navigation. +- **Weaknesses:** + - Not events-first β€” events are buried, inconsistent, often missing + - Static data β€” "Popular Times" is historical, not real-time + - No social β€” no friend activity, no trending rankings + - Generic UX β€” one-size-fits-all, no personality +- **πŸ”΄ HotNow opportunity:** Events-first UX. Real-time trending. Social layer. Brand personality. + +--- + +#### 10. Songkick / Bandsintown β€” Live Music Trackers + +- **What it is:** Track artists you follow β†’ get notified when they're playing near you. Songkick acquired by Suno (AI music company). Bandsintown is independent. +- **Pricing:** Free for fans. Bandsintown: artist promo packages ($25-$100+/mo). +- **UX Pattern:** List-first (concerts by date). Artist-centric. +- **Weaknesses:** + - Music-only β€” no other event categories + - Artist-dependent β€” you must follow artists to get value + - No real-time trending β€” chronological, not ranked by buzz +- **πŸ”΄ HotNow opportunity:** All categories. Buzz-ranked. No following required β€” discover without pre-configuring. + +--- + +#### 11. Resident Advisor (RA) β€” Electronic Music Authority + +- **What it is:** The definitive electronic music events platform. Global listings, reviews, news, ticket sales. +- **Pricing:** Free to browse. Ticket commission + promoted event listings. +- **UX Pattern:** List-first. Deep filtering by genre/city/date. +- **Weaknesses:** + - Niche (electronic music only) β€” tiny addressable market + - Community-specific β€” not for general audience +- **πŸ”΄ HotNow opportunity:** Mass-market appeal. All genres + all categories. + +--- + +#### 12. Seeker.io β€” B2B AI Event Aggregation + +- **What it is:** AI-native event discovery for tourism boards, CVBs, local media. Crawls any website to extract events. Used by SF Peninsula (500+ sources, 16 cities), Tennessee Tourism (statewide), Calgary Co-op (4 orgs, 1 feed). +- **Pricing:** Enterprise B2B SaaS (not publicly listed β€” likely $500-$5K+/mo depending on scale). +- **UX Pattern:** Embeddable calendar widget for partner websites. REST API for custom integrations. +- **Weaknesses:** + - B2B, not consumer-facing β€” no social, no map UX, no mobile app + - No real-time trending β€” chronological curation + - Expensive β€” not for small businesses +- **πŸ”΄ HotNow opportunity:** Consumer experience. Real-time social ranking. Affordable business tiers. + +--- + +## 2. Opportunity Analysis & HotNow's Edge + +### The White Space + +After analyzing 12 competitors, **nobody is doing all of these together:** + +| Capability | Yelp | Fever/DICE | Eventbrite | Nextdoor | Beli | Corner | Google Maps | **HotNow** | +|------------|------|-----------|------------|----------|------|--------|-------------|-------------| +| Real-time trending | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | βœ… | +| Social buzz signals | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | βœ… | +| Map-first UX | πŸ”Ά | ❌ | ❌ | πŸ”Ά | ❌ | βœ… | βœ… | βœ… | +| Events + Places | ❌ | πŸ”Ά | βœ… | πŸ”Ά | ❌ | ❌ | πŸ”Ά | βœ… | +| AI ranking | πŸ”Ά | ❌ | πŸ”Ά | βœ… | βœ… | βœ… | πŸ”Ά | βœ… | +| Gen Z cool factor | ❌ | πŸ”Ά | ❌ | ❌ | βœ… | βœ… | ❌ | βœ… | +| Business monetization | βœ… | βœ… | βœ… | βœ… | ❌ | ❌ | βœ… | βœ… | +| Offline mode (PWA) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | βœ… | βœ… | +| PWA (no app store) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | βœ… | + +**πŸ”Ά = partially / second-class feature** + +### HotNow's Core Differentiators + +1. **Real-Time Trending Ranking** β€” The single biggest gap. Everyone ranks by reviews, dates, or manual curation. HotNow ranks by what's buzzing *right now* β€” social signals, check-in velocity, search volume, AI sentiment. + +2. **Super Search v2 Integration** β€” Already live on Core server with 7 providers. This is HotNow's data engine β€” aggregates events, venues, reviews, and social signals from multiple sources without needing to build every scraper from scratch. + +3. **Map-First PWA** β€” No app store friction. Instant onboarding. Works offline. Lower CAC than native app competitors. + +4. **Three-Tier Consumer Monetization** β€” Explorer (free), Pro ($4.99/mo), Concierge ($19.99/mo). Competitors are either free/ad-supported or ticket-commission-only. Recurring subscription revenue from day one. + +5. **Business Revenue from Launch** β€” Featured Placement ($97/mo) + Event Boost ($47/event). Affordable for small businesses (unlike Yelp's $500+ minimums). + +6. **Brand Identity** β€” Dark theme, warm gradient accent. "What's good, right now, near you." Gen Z/Millennial voice without alienating 30+. + +--- + +## 3. Product Architecture + +### System Overview + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ USERS (PWA) β”‚ +β”‚ app.hotnow.io ─── Map View ─── Discovery Feed ─── etc. β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ CLOUDFLARE CDN β”‚ +β”‚ Static assets (JS/CSS/icons) β”‚ API proxy β”‚ DDoS protection β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ CADDY REVERSE PROXY β”‚ +β”‚ SSL termination β”‚ Rate limiting β”‚ Route by subdomain β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β–Ό β–Ό β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ app.hotnow.io β”‚ β”‚ api.hotnow.io β”‚ β”‚ dashboard.hotnow β”‚ +β”‚ (Static PWA) β”‚ β”‚ (FastAPI) β”‚ β”‚ (Business Dash) β”‚ +β”‚ SvelteKit SPA β”‚ β”‚ Port 8001 β”‚ β”‚ Static + API β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β–Ό β–Ό β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ PostgreSQL β”‚ β”‚ Redis β”‚ β”‚ Super Search v2 β”‚ +β”‚ + PostGIS β”‚ β”‚ Cache + Queueβ”‚ β”‚ (7 providers) β”‚ +β”‚ β”‚ β”‚ + Real-time β”‚ β”‚ Existing on Core β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Tech Stack + +| Layer | Technology | Why | +|-------|-----------|-----| +| **PWA Frontend** | SvelteKit (static adapter) | Fast, small bundles, great PWA support | +| **Map** | Leaflet.js + OpenStreetMap tiles | Free, no API keys, works offline with cached tiles | +| **Backend API** | FastAPI (Python 3.11) | Async, auto-docs, Python matches existing Core stack | +| **Database** | PostgreSQL 16 + PostGIS | Geospatial queries (proximity, radius, bounding box) | +| **Cache** | Redis | Trending scores, session cache, rate limit counters, real-time pub/sub | +| **Task Queue** | Redis + ARQ (or Celery) | Background: Super Search ingestion, trend recalculation, notifications | +| **Auth** | JWT tokens + refresh | Stateless, PWA-friendly, no cookies needed | +| **Payments** | Stripe | Consumer subs + business placements, Webhook integration | +| **Search** | PostgreSQL full-text search + Super Search v2 | Hybrid: own DB for quick lookups, Super Search for deep aggregation | +| **Offline** | Service Worker + IndexedDB | Cache map tiles, event data, user preferences | +| **Push Notifications** | Web Push API + VAPID | PWA native, no app store needed | +| **Email** | Postmark or SendGrid | Transactional + marketing | + +### Subdomain Architecture + +| Subdomain | Purpose | Technology | +|-----------|---------|------------| +| `hotnow.io` | Marketing/SEO landing page | Static HTML (existing `/var/www/hotnow/index.html`) | +| `app.hotnow.io` | PWA shell | SvelteKit SPA, static export, served by Caddy | +| `api.hotnow.io` | REST API backend | FastAPI on Core server (`152.53.192.33`), port 8001 | +| `dashboard.hotnow.io` | Business dashboard | SvelteKit SPA (shared component library with app) | +| `cdn.hotnow.io` | Static assets (optional) | Cloudflare CDN caching | +| `admin.hotnow.io` | Internal admin panel | Protected by Tailscale, minimal FastAPI admin | + +--- + +## 4. Data Model + +### Core Entities + +#### Events + +```sql +CREATE TABLE events ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + title VARCHAR(255) NOT NULL, + description TEXT, + category event_category NOT NULL, -- enum: music, food_drink, arts_culture, nightlife, sports, family, pop_up, other + start_time TIMESTAMPTZ NOT NULL, + end_time TIMESTAMPTZ, + timezone VARCHAR(50) DEFAULT 'America/Chicago', + is_recurring BOOLEAN DEFAULT false, + recurrence_rule VARCHAR(255), -- RRULE format + is_featured BOOLEAN DEFAULT false, + + -- Venue relationship + venue_id UUID REFERENCES venues(id) ON DELETE CASCADE, + + -- Media + cover_image_url VARCHAR(500), + media_urls JSONB DEFAULT '[]', -- [{url, type, order}] + + -- Pricing + price_info JSONB DEFAULT NULL, -- {type: free|paid|varies, range: {min, max}, currency} + ticket_url VARCHAR(500), + + -- Source attribution + source VARCHAR(100) NOT NULL, -- 'manual', 'super_search', 'user_submitted', 'api_partner' + source_event_id VARCHAR(255), -- external ID for dedup + source_url VARCHAR(500), + + -- Real-time signals (updated by background worker) + trending_score FLOAT DEFAULT 0.0, + popularity_pulse INTEGER DEFAULT 0, -- short-term velocity (last 2 hours) + social_mention_count INTEGER DEFAULT 0, + search_volume_24h INTEGER DEFAULT 0, + check_in_count INTEGER DEFAULT 0, + ai_sentiment_score FLOAT DEFAULT 0.0, -- -1.0 to 1.0 + + -- Metadata + tags TEXT[] DEFAULT '{}', + is_active BOOLEAN DEFAULT true, + reviewed_by_admin BOOLEAN DEFAULT false, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Geospatial: events inherit location from venue, but can override +-- Indexes +CREATE INDEX idx_events_trending ON events (trending_score DESC) WHERE is_active = true; +CREATE INDEX idx_events_time_range ON events (start_time, end_time) WHERE is_active = true; +CREATE INDEX idx_events_category ON events (category) WHERE is_active = true; +CREATE INDEX idx_events_venue ON events (venue_id); +CREATE INDEX idx_events_source_dedup ON events (source, source_event_id); +``` + +#### Venues + +```sql +CREATE TABLE venues ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name VARCHAR(255) NOT NULL, + description TEXT, + venue_type venue_type NOT NULL, -- enum: bar, restaurant, club, theater, park, gallery, pop_up, other + + -- Contact + address VARCHAR(500), + city VARCHAR(100) NOT NULL, + state VARCHAR(50), + postal_code VARCHAR(20), + country VARCHAR(2) DEFAULT 'US', + + -- Geospatial (PostGIS) + location GEOGRAPHY(POINT, 4326), -- lat/lng for proximity queries + geo_json JSONB DEFAULT NULL, -- polygon for venues with boundaries + + -- Contact + phone VARCHAR(20), + website VARCHAR(500), + social_links JSONB DEFAULT '{}', -- {instagram, facebook, twitter, tiktok} + + -- Hours + hours JSONB DEFAULT NULL, -- [{day, open, close}] + is_permanently_closed BOOLEAN DEFAULT false, + + -- Media + cover_image_url VARCHAR(500), + media_urls JSONB DEFAULT '[]', + + -- Real-time signals + trending_score FLOAT DEFAULT 0.0, + current_busy_level busy_level DEFAULT 'unknown', -- enum: quiet, moderate, busy, packed + + -- Business owner (links to Stripe customer) + owner_user_id UUID REFERENCES users(id), + + -- Metadata + source VARCHAR(100) DEFAULT 'manual', + source_venue_id VARCHAR(255), + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE INDEX idx_venues_location ON venues USING GIST (location); +CREATE INDEX idx_venues_city ON venues (city, state); +CREATE INDEX idx_venues_type ON venues (venue_type); +``` + +#### Users + +```sql +CREATE TABLE users ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + email VARCHAR(255) UNIQUE, + display_name VARCHAR(100), + avatar_url VARCHAR(500), + + -- Auth + password_hash VARCHAR(255), + auth_provider auth_provider DEFAULT 'email', -- enum: email, google, apple + auth_provider_id VARCHAR(255), + email_verified BOOLEAN DEFAULT false, + + -- Subscription + tier subscription_tier DEFAULT 'explorer', -- explorer, pro, concierge + stripe_customer_id VARCHAR(100), + subscription_status subscription_status DEFAULT 'inactive', -- active, past_due, canceled, inactive + subscription_expires_at TIMESTAMPTZ, + + -- Preferences + home_city VARCHAR(100), + home_location GEOGRAPHY(POINT, 4326), + preferred_categories TEXT[] DEFAULT '{}', + preferred_radius_km INTEGER DEFAULT 10, + notification_prefs JSONB DEFAULT '{}', -- {push, email, sms, categories} + + -- PWA + push_subscription JSONB DEFAULT NULL, -- Web Push subscription object + + -- Metadata + is_business BOOLEAN DEFAULT false, + is_admin BOOLEAN DEFAULT false, + last_active_at TIMESTAMPTZ, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE INDEX idx_users_email ON users (email); +CREATE INDEX idx_users_stripe ON users (stripe_customer_id); +``` + +#### Search/Discover Events (Lightweight for feed) + +```sql +CREATE TABLE discover_events ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + event_id UUID REFERENCES events(id) ON DELETE CASCADE, + user_id UUID NOT NULL, -- anonymized session UUID for anonymous users + action discover_action NOT NULL, -- enum: view, click, save, share, check_in + source_context VARCHAR(50), -- 'map', 'feed', 'search', 'detail' + created_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE INDEX idx_discover_events_user_time ON discover_events (user_id, created_at DESC); +CREATE INDEX idx_discover_events_event ON discover_events (event_id, created_at); +``` + +#### Business Features + +```sql +CREATE TABLE business_features ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + venue_id UUID REFERENCES venues(id) ON DELETE CASCADE, + feature_type feature_type NOT NULL, -- featured_placement, event_boost, promoted_listing + status feature_status DEFAULT 'active', + starts_at TIMESTAMPTZ NOT NULL, + ends_at TIMESTAMPTZ NOT NULL, + stripe_payment_id VARCHAR(100), + amount_paid_cents INTEGER, + metadata JSONB DEFAULT '{}', + created_at TIMESTAMPTZ DEFAULT NOW() +); +``` + +#### Cached/Search Index (Redis) + +```redis +# Trending events by city (sorted set, scored by trending_score) +trending:{city}:{category} β†’ Sorted Set {event_id: score} + +# Real-time pulse (current activity, 15-min TTL) +pulse:{event_id} β†’ {view_count, click_count, save_count, last_updated} + +# User sessions (JWT refresh tokens) +session:{user_id}:{device_id} β†’ {refresh_token, expires_at, device_info} + +# Rate limiting +ratelimit:{ip}:{endpoint} β†’ counter with TTL + +# Geo-index cache (pre-computed bounding boxes) +geo:{lat}:{lng}:{radius_km} β†’ Set of event_ids (TTL: 5 min) +``` + +--- + +## 5. API Surface + +### REST API (api.hotnow.io/v1) + +#### Events + +| Method | Endpoint | Auth | Description | +|--------|----------|------|-------------| +| `GET` | `/events/trending` | Optional | Trending events (paginated, filtered by location/category) | +| `GET` | `/events/nearby` | Optional | Events within radius of lat/lng | +| `GET` | `/events/:id` | Optional | Full event detail with venue info | +| `GET` | `/events/search` | Optional | Full-text search + Super Search v2 aggregation | +| `POST` | `/events/submit` | User | User-submitted event (goes to review queue) | +| `POST` | `/events/:id/save` | User | Save/bookmark event | +| `POST` | `/events/:id/check-in` | User | Check in (anonymized, feeds trending) | +| `GET` | `/events/:id/pulse` | Optional | Real-time activity data for this event | + +#### Venues + +| Method | Endpoint | Auth | Description | +|--------|----------|------|-------------| +| `GET` | `/venues/nearby` | Optional | Venues within radius | +| `GET` | `/venues/:id` | Optional | Venue detail + upcoming events | +| `GET` | `/venues/:id/busy` | Optional | Current busy level estimate | + +#### Discovery + +| Method | Endpoint | Auth | Description | +|--------|----------|------|-------------| +| `GET` | `/discover/feed` | Optional | Personalized feed (AI if Pro tier, trending if free) | +| `GET` | `/discover/recommendations` | Pro | AI-powered recommendations | +| `POST` | `/discover/action` | Optional | Log view/click/save for trending signals | + +#### Auth + +| Method | Endpoint | Auth | Description | +|--------|----------|------|-------------| +| `POST` | `/auth/register` | None | Create account (email + password) | +| `POST` | `/auth/login` | None | Login β†’ JWT access + refresh token | +| `POST` | `/auth/refresh` | Refresh | Get new access token | +| `POST` | `/auth/logout` | Access | Revoke refresh token | +| `POST` | `/auth/oauth/google` | None | Google OAuth login | +| `GET` | `/auth/me` | Access | Current user profile | + +#### Subscriptions + +| Method | Endpoint | Auth | Description | +|--------|----------|------|-------------| +| `GET` | `/billing/plans` | None | Available subscription tiers | +| `POST` | `/billing/subscribe` | User | Create Stripe checkout session | +| `GET` | `/billing/portal` | User | Redirect to Stripe Customer Portal | +| `POST` | `/billing/webhook` | Stripe | Stripe webhook receiver | + +#### Business + +| Method | Endpoint | Auth | Description | +|--------|----------|------|-------------| +| `GET` | `/business/dashboard` | Business | Business metrics and active features | +| `POST` | `/business/featured` | Business | Purchase Featured Placement | +| `POST` | `/business/boost` | Business | Purchase Event Boost | +| `GET` | `/business/analytics` | Business | Impressions, clicks, conversions | + +#### Admin (internal) + +| Method | Endpoint | Auth | Description | +|--------|----------|------|-------------| +| `GET` | `/admin/review-queue` | Admin | Events/venues pending review | +| `POST` | `/admin/review/:id` | Admin | Approve/reject submission | +| `POST` | `/admin/recalculate-trending` | Admin | Force trend recalculation | +| `GET` | `/admin/stats` | Admin | Platform metrics | + +### Auth Flow + +``` +1. User registers/logs in β†’ receives: + - access_token (JWT, 15 min expiry) + - refresh_token (opaque, 30 day expiry, stored in Redis) + +2. Every API call: Authorization: Bearer + +3. Access token expires β†’ POST /auth/refresh β†’ new access_token + +4. Logout β†’ revoke refresh_token in Redis + +5. Anonymous users: session_id (UUID v4, stored in localStorage) + - Limited rate: 100 requests/hour + - Cannot save/bookmark (no persistence without account) +``` + +### Rate Limits + +| Tier | Requests/Hour | Special Limits | +|------|--------------|----------------| +| Anonymous | 100 | Search: 10/hr | +| Explorer (Free) | 300 | AI recs: none, Save: 50 | +| Pro ($4.99/mo) | 1000 | AI recs: 100/hr, Offline: full | +| Concierge ($19.99/mo) | 5000 | AI recs: unlimited, Concierge chat: 50/day | +| Business | 500 | Dashboard + analytics | +| Admin | Unlimited | All endpoints | + +--- + +## 6. Real-Time Ranking Algorithm + +### The HotNow Score + +The core innovation. Every event has a `trending_score` recalculated every 5 minutes by a background worker. + +``` +HOT_SCORE = ( + SOCIAL_BUZZ Γ— 0.30 + + ENGAGEMENT_VELOCITY Γ— 0.25 + + RECENCY_DECAY Γ— 0.20 + + AI_SENTIMENT Γ— 0.15 + + MANUAL_BOOST Γ— 0.10 +) Γ— CITY_NORMALIZATION +``` + +#### Signal Components + +| Signal | Weight | Sources | Decay | +|--------|--------|---------|-------| +| **SOCIAL_BUZZ** | 30% | Instagram geotag mentions, X/Twitter mentions, TikTok location tags (via Super Search) | Half-life: 4 hours | +| **ENGAGEMENT_VELOCITY** | 25% | HotNow own telemetry: views/min, clicks/min, saves/min, check-ins/min | Half-life: 2 hours | +| **RECENCY_DECAY** | 20% | Time until event start. Events starting soon get boost. | Linear ramp: peaks 2h before, decays after start | +| **AI_SENTIMENT** | 15% | Super Search v2 NLP sentiment on social mentions about the venue/event | 24h rolling window | +| **MANUAL_BOOST** | 10% | Featured Placement ($97/mo), Event Boost ($47/event) | Fixed duration | + +#### City Normalization + +``` +CITY_NORMALIZATION = log10(active_users_in_city + 1) / log10(total_events_in_city + 1) +``` + +Prevents NYC/London from dominating. Small cities can compete. + +#### Anti-Gaming Measures + +- Velocity caps: engagement increase >300% in 15 min β†’ throttled +- Bot detection: suspicious patterns (same IP, rapid fire) β†’ excluded +- Review queue: user-submitted events require admin approval before trending +- Manual boost transparency: clearly labeled in UI ("Promoted") + +### Data Pipeline + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Super Search v2 β”‚ ← 7 providers, already live on Core +β”‚ (aggregator) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ Every 15 min + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Ingestion Worker β”‚ ← Redis queue (ARQ), dedup by source_event_id +β”‚ β”‚ enrich with geocoding, AI sentiment +β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ PostgreSQL β”‚ ← Events + Venues tables +β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ Every 5 min + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Trend Calculator β”‚ ← Compute HOT_SCORE for all active events +β”‚ (ARQ cron job) β”‚ Update trending_score, write to Redis sorted sets +β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Redis β”‚ ← Sorted sets: trending:{city}:{category} +β”‚ β”‚ API reads directly from Redis (sub-millisecond) +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## 7. Component Tree & PWA Shell + +### PWA Architecture + +``` +app.hotnow.io (SvelteKit SPA, static export) +β”‚ +β”œβ”€β”€ src/ +β”‚ β”œβ”€β”€ routes/ +β”‚ β”‚ β”œβ”€β”€ +layout.svelte # Shell (nav, bottom tabs, auth state) +β”‚ β”‚ β”œβ”€β”€ +page.svelte # Map view (default/home) +β”‚ β”‚ β”œβ”€β”€ discover/ +β”‚ β”‚ β”‚ └── +page.svelte # Discovery feed (list) +β”‚ β”‚ β”œβ”€β”€ event/ +β”‚ β”‚ β”‚ └── [id]/ +β”‚ β”‚ β”‚ └── +page.svelte # Event detail +β”‚ β”‚ β”œβ”€β”€ venue/ +β”‚ β”‚ β”‚ └── [id]/ +β”‚ β”‚ β”‚ └── +page.svelte # Venue detail +β”‚ β”‚ β”œβ”€β”€ search/ +β”‚ β”‚ β”‚ └── +page.svelte # Search + filters +β”‚ β”‚ β”œβ”€β”€ profile/ +β”‚ β”‚ β”‚ └── +page.svelte # User profile, saved events +β”‚ β”‚ β”œβ”€β”€ settings/ +β”‚ β”‚ β”‚ └── +page.svelte # Preferences, notifications +β”‚ β”‚ β”œβ”€β”€ auth/ +β”‚ β”‚ β”‚ β”œβ”€β”€ login/+page.svelte +β”‚ β”‚ β”‚ └── register/+page.svelte +β”‚ β”‚ └── concierge/ +β”‚ β”‚ └── +page.svelte # Concierge chat (Pro tier) +β”‚ β”‚ +β”‚ β”œβ”€β”€ lib/ +β”‚ β”‚ β”œβ”€β”€ components/ +β”‚ β”‚ β”‚ β”œβ”€β”€ Map.svelte # Leaflet wrapper +β”‚ β”‚ β”‚ β”œβ”€β”€ EventCard.svelte # Horizontal/vertical card variant +β”‚ β”‚ β”‚ β”œβ”€β”€ EventDetail.svelte # Full modal/page detail +β”‚ β”‚ β”‚ β”œβ”€β”€ VenueCard.svelte +β”‚ β”‚ β”‚ β”œβ”€β”€ TrendPulse.svelte # Live activity indicator +β”‚ β”‚ β”‚ β”œβ”€β”€ CategoryFilter.svelte +β”‚ β”‚ β”‚ β”œβ”€β”€ SearchBar.svelte +β”‚ β”‚ β”‚ β”œβ”€β”€ BottomNav.svelte # Mobile bottom tab bar +β”‚ β”‚ β”‚ β”œβ”€β”€ ConciergeChat.svelte # AI chat interface +β”‚ β”‚ β”‚ └── PwaInstall.svelte # Install prompt +β”‚ β”‚ β”œβ”€β”€ stores/ +β”‚ β”‚ β”‚ β”œβ”€β”€ auth.ts # JWT + refresh logic +β”‚ β”‚ β”‚ β”œβ”€β”€ location.ts # Geolocation watcher +β”‚ β”‚ β”‚ β”œβ”€β”€ events.ts # Event cache + trending +β”‚ β”‚ β”‚ └── settings.ts # User preferences +β”‚ β”‚ β”œβ”€β”€ api/ +β”‚ β”‚ β”‚ β”œβ”€β”€ client.ts # Fetch wrapper with auth +β”‚ β”‚ β”‚ β”œβ”€β”€ events.ts +β”‚ β”‚ β”‚ β”œβ”€β”€ venues.ts +β”‚ β”‚ β”‚ β”œβ”€β”€ discover.ts +β”‚ β”‚ β”‚ └── auth.ts +β”‚ β”‚ └── utils/ +β”‚ β”‚ β”œβ”€β”€ geo.ts # Distance, bounding box calc +β”‚ β”‚ β”œβ”€β”€ offline.ts # IndexedDB + SW helpers +β”‚ β”‚ └── format.ts # Date, price, category formatting +β”‚ β”‚ +β”‚ β”œβ”€β”€ service-worker.ts # PWA offline cache +β”‚ └── app.css # Tailwind + brand colors +β”‚ +β”œβ”€β”€ static/ +β”‚ β”œβ”€β”€ manifest.json # PWA manifest +β”‚ β”œβ”€β”€ icons/ # PWA icons (192, 512) +β”‚ └── favicon.ico +β”‚ +β”œβ”€β”€ svelte.config.js +β”œβ”€β”€ vite.config.ts +β”œβ”€β”€ tailwind.config.ts +└── package.json +``` + +### Key UI Patterns + +#### Map View (Home Screen) +- Full-screen Leaflet map (OpenStreetMap tiles pre-cached for offline) +- Clustered markers colored by category +- Pulsing markers for "hot right now" (pulse speed = trending_score) +- Bottom sheet (swipeable): list of nearby trending events +- Filter chip bar: All | Music | Food/Drink | Arts | Nightlife | Pop-ups +- Location button: recenter, radius slider + +#### Discovery Feed +- Vertical scroll list of EventCards +- Each card: cover image, title, venue, distance, trending badge, time +- Pull-to-refresh (recalculates location + trending) +- "Happening Now" horizontal carousel at top +- Skeleton loading states + +#### Event Detail +- Hero image with gradient overlay +- Title, venue name (tappable β†’ venue detail), distance +- "Hot right now" pulse indicator +- Description, category badges, tags +- Price info + ticket link +- Actions: Save, Share, Check In, Get Directions +- Map snippet showing location +- "Nearby" section: other trending events nearby + +#### Business Dashboard (dashboard.hotnow.io) +- Auth-gated, only for users with `is_business = true` +- Overview: impressions, clicks, saves for their venue/events +- Purchase flow: Featured Placement, Event Boost +- Analytics: 7-day, 30-day charts +- Manage venue details, hours, photos + +--- + +## 8. Infrastructure & Deployment + +### Server: Netcup RS 2000 (Core β€” 152.53.192.33) + +```yaml +Services: + PostgreSQL 16 + PostGIS: + database: hotnow + user: hotnow_app + extensions: postgis, pg_trgm, uuid-ossp + + Redis 7: + instance: hotnow + maxmemory: 256mb + policy: allkeys-lru + + FastAPI (api.hotnow.io): + port: 8001 + workers: 4 (gunicorn + uvicorn) + systemd service: hotnow-api + + ARQ Workers: + service: hotnow-worker + queues: ingestion, trending, notifications, cleanup + + Caddy: + config: /etc/caddy/Caddyfile + routes: + hotnow.io β†’ /var/www/hotnow/index.html (landing page) + app.hotnow.io β†’ /var/www/hotnow-app/ (SvelteKit build) + api.hotnow.io β†’ reverse_proxy localhost:8001 + dashboard.hotnow.io β†’ /var/www/hotnow-dashboard/ (SvelteKit build) +``` + +### Cloudflare DNS + +``` +A hotnow.io β†’ 152.53.192.33 +A app.hotnow.io β†’ 152.53.192.33 (or CNAME β†’ hotnow.io) +A api.hotnow.io β†’ 152.53.192.33 (or CNAME β†’ hotnow.io) +A dashboard.hotnow.io β†’ 152.53.192.33 (or CNAME β†’ hotnow.io) +CNAME www.hotnow.io β†’ hotnow.io +``` + +### Environment Variables + +```bash +# /etc/hotnow/.env +DATABASE_URL=postgresql://hotnow_app:${DB_PASSWORD}@localhost:5432/hotnow +REDIS_URL=redis://localhost:6379/0 +JWT_SECRET=${JWT_SECRET} +JWT_REFRESH_SECRET=${JWT_REFRESH_SECRET} +STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY} +STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET} +SUPER_SEARCH_ENDPOINT=http://localhost:8000 # Super Search v2 MCP +SUPER_SEARCH_API_KEY=${SUPER_SEARCH_API_KEY} +ENVIRONMENT=production +CORS_ORIGINS=https://app.hotnow.io,https://dashboard.hotnow.io +``` + +--- + +## 9. Build Plan Preview (Phases 2-4) + +### Phase 2: Core Build ($20-25 budget, premium models) + +**What gets built:** + +1. **Database setup** β€” PostgreSQL + PostGIS on Core server. Run migrations for all tables. +2. **FastAPI backend** β€” All API endpoints listed above. Auth flow (JWT + refresh). Stripe integration (subscriptions + business payments). +3. **Super Search v2 integration** β€” Event ingestion pipeline. Dedup logic. Geocoding enrichment. +4. **Trending algorithm** β€” HOT_SCORE calculator. ARQ cron job. Redis sorted set population. +5. **PWA shell** β€” SvelteKit SPA. Map view with Leaflet. Discovery feed. Event detail. Search. Auth. Bottom navigation. +6. **Business dashboard** β€” Basic dashboard with analytics and purchase flow. +7. **Caddy + Cloudflare** β€” Subdomain routing. SSL. Rate limiting. + +**Models used:** `claude-sonnet-4-20250514` for complex backend logic, `gpt-4o` for frontend, `deepseek-v4-pro` for architecture decisions. + +--- + +### Phase 3: Review + Hardening ($8-10 budget) + +**What gets hardened:** + +1. **Security audit** β€” JWT hardening, input validation, SQL injection check, CORS review. +2. **Performance** β€” API response time optimization, database query tuning, Redis cache hit rate. +3. **Error handling** β€” Graceful degradation, offline fallbacks, rate limit UX, payment failure flows. +4. **PWA audit** β€” Lighthouse PWA score, offline functionality, install flow, push notifications. +5. **Mobile testing** β€” iOS Safari, Chrome Android, Samsung Internet. Responsive breakpoints. +6. **Seed data** β€” Populate with real events for launch city. Verify trending algorithm with live data. +7. **Business onboarding flow** β€” Stripe Connect setup, venue claim flow, payment testing. + +**Models used:** `claude-sonnet-4-20250514` for code review, `gpt-4o` for testing, `deepseek-v4-pro` for security analysis. + +--- + +### Phase 4: Launch Package ($5-7 budget) + +**What gets packaged:** + +1. **Launch city campaign** β€” SEO landing page for target city. Social media post templates. +2. **Email sequence** β€” Welcome email, weekly digest ("What's Hot This Weekend"), re-engagement. +3. **Analytics dashboard** β€” Simple admin analytics: DAU/MAU, event engagement, revenue tracking. +4. **Business outreach kit** β€” One-page pitch for venues to advertise. "Claim your venue" email template. +5. **Documentation** β€” Deployment runbook, API docs (auto-generated by FastAPI), admin guide. +6. **Monitoring** β€” Uptime Kuma check for api.hotnow.io health endpoint. Error alerting. +7. **Launch checklist** β€” Pre-launch verification items. Go/no-go criteria. + +--- + +## 10. Follow-Up Questions for Germaine + +### Launch Strategy + +1. **Launch city?** You mentioned Savannah in the doc. Is that the definite first market? Pros: manageable size, tourist economy, strong local culture, your home base. Cons: smaller user base, seasonal tourism. Alternatives to consider: Austin (tech-forward, young demo), Nashville (music + nightlife), Charleston (tourism + culture, close to Savannah). + +2. **Savannah-specific considerations?** SCAD students are a natural early adopter demographic. Should we do a SCAD ambassador program (similar to Beli's campus model)? Are there local event organizers / venues we should partner with pre-launch? + +3. **City-rollout strategy?** One city at a time (depth-first) or multi-city from launch (breadth-first)? Depth-first: build strong network effects in one market, then expand. Breadth-first: broader appeal but thinner data per city. + +### Data Strategy + +4. **Seed data sources?** Super Search v2 gives us web crawl + search aggregation. But for launch, should we also: + - Manually curate 50-100 events/venues in the launch city to ensure quality? + - Partner with local event organizers, venues, tourism boards? + - Scrape existing platforms (Eventbrite, Facebook Events) as seed data? + - User submissions from day one (UGC)? + +5. **Data quality vs. quantity?** Fever/DICE has 100% quality (curated) but narrow scope. Eventbrite has massive scope but low quality. Where should HotNow start on this spectrum? + +### Revenue Priority + +6. **Consumer subscriptions vs. business placements β€” which is Priority A?** + - Consumer-first: requires user acquisition β†’ conversion to Pro/Concierge. Longer path to revenue. + - Business-first: sell Featured Placement + Event Boost to venues immediately. Faster revenue, but need traffic to sell. + - Hybrid: launch with free tier + business placements, add Pro/Concierge in month 2-3. + +7. **Concierge tier ($19.99/mo) β€” what should it actually offer at launch?** Curated experiences require human or AI curation effort. Options: + - AI-powered concierge chat (lower cost, always available) + - Human-curated weekly picks (higher value, higher cost) + - Hybrid: AI for instant answers, human for weekly curated lists + +### Technical Choices + +8. **Map provider β€” Leaflet (OpenStreetMap) free or splurge on Mapbox?** + - Leaflet + OSM: free, no API keys, works offline. Less polished tiles. + - Mapbox: beautiful tiles, better dark theme, 3D buildings. $0 for first 50K monthly loads, then ~$200+/mo at scale. + - Recommendation: start with Leaflet, swap to Mapbox when revenue supports it. + +9. **Hard constraints on tech stack?** You've already chosen FastAPI + SvelteKit + PostgreSQL. Any of these non-negotiable? Any you'd prefer to swap? + +10. **Progressive Web App vs. native mobile?** PWA is the plan (no app store, instant updates, offline). When/if should we invest in native iOS/Android? Trigger points: 10K MAU? Revenue milestone? + +### Timeline & Budget + +11. **Phase 2 timeline expectations?** At $20-25 budget with premium models, I estimate Phase 2 takes about 8-12 hours of build time (subagent + human orchestration). Does that match your timeframe? + +12. **MVP definition β€” what's the absolute minimum for "go live"?** + - Must have: map, trending events, search, event detail, basic auth + - Nice to have: AI recommendations, offline mode, Concierge chat, business dashboard + - Your call on the cutoff for launch + +--- + +## Appendix A: Existing Assets Snapshot + +| Asset | Path | Status | +|-------|------|--------| +| Landing page | `/var/www/hotnow/index.html` | βœ… Live (1342 lines, 38KB) | +| Mockup | `/var/www/mockup/hotnow/index.html` | βœ… Complete (432 lines, 14KB) | +| Project doc | `/root/projects/itpp-infrastructure/projects/hotnow.md` | βœ… Comprehensive (827 lines) | +| Domain | `hotnow.io` | βœ… Registered at Cloudflare | +| Server | Core (152.53.192.33), Netcup RS 2000 | βœ… Operational | +| Super Search v2 | MCP on Core | βœ… 7 providers, all healthy | +| Caddy | Reverse proxy on Core | βœ… Configured | +| PostgreSQL 16 | On Core | βœ… Running | +| Redis | On Core | βœ… Running | + +## Appendix B: Key Market Signals + +- **Gen Z discovery:** 77% discover restaurants on social media (Eater/Vox 2025 survey) +- **Beli growth:** 30M reviews in 2024 (surpassing Yelp's 21M) β€” demand for social-forward discovery +- **Fever acquired DICE:** Consolidation in curated event space β€” leaves gap for comprehensive real-time +- **Nextdoor AI pivot:** "LLM for every neighborhood" β€” validates AI + hyperlocal +- **Corner's $3.75M raise:** VCs betting on map-first social discovery for Gen Z +- **Yelp's AI transformation:** Incumbent feels threat from new discovery paradigms +- **Eventbrite rebrand:** Moving from utility to cultural hub β€” validates shift toward experience economy diff --git a/projects/hotnow.md b/projects/hotnow.md new file mode 100644 index 0000000..e29948f --- /dev/null +++ b/projects/hotnow.md @@ -0,0 +1,827 @@ +# HotNow Business Proposal + +**Prepared for:** Germaine Brown & Advisory Team +**Date:** August 1, 2026 +**Company:** IT Pro Partner -- Product Division +**Product:** HotNow (hotnow.io) +**Classification:** Confidential -- Advisory Review + +--- + +## Table of Contents + +1. [Executive Summary](#1-executive-summary) +2. [Elevator Pitch](#2-elevator-pitch) +3. [Problem Statement](#3-problem-statement) +4. [Market Analysis](#4-market-analysis) +5. [Product Overview](#5-product-overview) +6. [Revenue Model](#6-revenue-model) +7. [Competitive Advantages](#7-competitive-advantages) +8. [Go-to-Market Strategy](#8-go-to-market-strategy) +9. [Risk Analysis](#9-risk-analysis) +10. [Financial Projections](#10-financial-projections) +11. [The Ask](#11-the-ask) + +--- + +## 1. Executive Summary + +HotNow is a real-time local discovery engine that surfaces hidden gems, trending spots, and live events near you -- in real time. Unlike Yelp (review-focused, static), Eventbrite (event ticketing, not discovery), or editorial curation platforms (slow, limited cities), HotNow aggregates and ranks everything happening around you right now based on social signals, check-in data, freshness, and AI-powered curation. + +The global local discovery and events market is massive. The online event ticketing market alone was valued at **$28.4 billion in 2024** and is projected to reach **$43.6 billion by 2032** (Allied Market Research, 2025). The broader "things to do" local discovery segment -- encompassing restaurants, nightlife, pop-ups, street festivals, live music, and art shows -- represents a **$100B+ annual consumer spend category** in the US alone (US Bureau of Labor Statistics, Consumer Expenditure Survey, 2024). Yet no single platform answers the question "what's good right now near me?" in real time. + +HotNow fills this gap. Built on IT Pro Partner's existing Super Search v2 infrastructure -- a battle-tested multi-provider search engine with 7 providers, circuit breakers, and caching already running on netcup VPS -- HotNow adds a map-first mobile PWA, real-time ranking algorithm, user accounts, and location-based discovery. Approximately **70% of the core search and aggregation engine already exists and is production-hardened**. + +With a freemium model anchored by Pro ($4.99/mo) and Concierge ($19.99/mo) tiers, plus business featured placements ($97/mo) and event promotion boosts ($47/event), HotNow monetizes both consumer willingness to pay for curation and business willingness to pay for visibility. At **1,000 Pro subscribers and 100 featured businesses**, HotNow projects **~$176K MRR** (~$2.1M ARR) with approximately **90%+ gross margins** -- a capital-efficient consumer platform with near-zero marginal delivery cost. + +This proposal outlines the market opportunity, product architecture, revenue model, go-to-market plan, risk analysis, and the resources required to launch HotNow as a standalone product under the IT Pro Partner umbrella. + +**TL;DR:** Everyone asks "what should we do tonight?" HotNow answers it -- in real time. Freemium consumer app ($4.99/mo Pro) plus business visibility revenue. ~70% of the engine already built on Super Search v2. Domain hotnow.io acquired. Ready to build and launch. + +--- + +## 2. Elevator Pitch + +HotNow tells you what's good, right now, near you. Open the app, see a live map of trending spots, pop-ups, live music, secret menus, and street festivals happening around you -- ranked in real time by social buzz, freshness, and AI curation. Free to browse. $4.99/month unlocks "Best Right Now" -- AI picks tailored to your tastes, the weather, the time of day, and real-time crowd signals. It's the answer to "what should we do tonight?" for every Gen Z and Millennial in every city. + +--- + +## 3. Problem Statement + +### 3.1 The Discovery Gap + +Every day, millions of people ask some version of the same question: "what's good around here?" or "what should we do tonight?" The answers are scattered across a fragmented landscape of platforms, none of which solve the problem end-to-end in real time. + +| Platform | What It Does | What It Misses | +|----------|-------------|----------------| +| Yelp / Google Maps | Restaurant reviews + ratings | Not real-time; doesn't surface pop-ups, events, live music, or trending spots | +| Eventbrite / Ticketmaster | Event ticketing | Only ticketed events; misses free pop-ups, street festivals, hidden gems | +| TikTok / Instagram | Social discovery | Unstructured, algorithmic feed; not map-based; no real-time ranking | +| Thrillist / Infatuation | Editorial curation | Slow, static, limited to major cities; misses neighborhood-level gems | +| Scoop Travel | Curated travel recommendations | Travel-focused, not local; editorial (slow), not real-time | +| Google "Events near me" | Event listings | Generic, incomplete, no social signals, no curation | + +The result: **people miss the best stuff happening around them**. The pop-up ramen shop that's only open tonight. The street festival three blocks away that didn't show up on Eventbrite. The bar with a secret live jazz set. By the time editorial coverage or Yelp reviews catch up, the moment is gone. + +### 3.2 Who Feels This Pain + +- **Gen Z and Millennials in urban areas** (18-40). They're spontaneous, social, and discovery-driven. They don't plan weekend activities days in advance -- they decide at 7pm what to do at 8pm. +- **Tourists and visitors** who want to find what locals actually do, not the TripAdvisor top 10. +- **Foodies and nightlife enthusiasts** who've exhausted the Yelp front page and want the hidden stuff. +- **Event-goers** tired of missing pop-ups, secret shows, and limited-run experiences because they didn't follow the right Instagram account. + +### 3.3 The Pain Points HotNow Solves + +| Pain Point | HotNow Solution | +|------------|----------------| +| "I don't know what's happening around me right now" | Real-time map of trending spots, events, and pop-ups | +| Yelp only shows established places, not what's hot tonight | Social signal + freshness ranking surfaces the new and trending | +| Events scattered across 5+ platforms | Single aggregated feed of everything: food, music, art, nightlife | +| Editorial coverage is slow and limited to big cities | AI-powered, automated, neighborhood-level precision everywhere | +| No personalization without hours of research | Pro tier: AI picks tailored to your tastes, weather, and time | +| "My friends and I can't decide" | Concierge tier: group coordination, itinerary builder | + +--- + +## 4. Market Analysis + +### 4.1 Total Addressable Market (TAM) + +The local discovery and events market spans several overlapping segments: + +| Segment | Market Size | Source / Methodology | +|---------|------------|---------------------| +| Online event ticketing (global) | $28.4B (2024) β†’ $43.6B (2032) | Allied Market Research, 2025; CAGR 5.5% | +| US restaurant + food service spend | $1.1T annually | National Restaurant Association, 2025 | +| US live music + entertainment | $35B annually | IBISWorld, 2024 | +| US nightlife + bars | $28B annually | IBISWorld, 2024 | +| US "things to do" / experiences consumer spend | ~$150B annually | BLS Consumer Expenditure Survey, 2024; aggregate of food away from home, entertainment, recreation | +| Global local search advertising | $14.8B (2024) β†’ $25.3B (2030) | Grand View Research, 2025; CAGR 9.4% | + +**TAM (Consumer Discovery Apps + Local Event Aggregation):** Conservative estimate of **$5B-$10B** in addressable consumer and business revenue globally, growing as mobile-first discovery replaces traditional search and editorial curation. + +### 4.2 Serviceable Addressable Market (SAM) + +HotNow's initial SAM is **US urban Gen Z and Millennials (18-40) in top 30 metro areas** who use smartphones for local discovery. + +| Parameter | Value | Source / Methodology | +|-----------|-------|---------------------| +| US population 18-40 in top 30 metros | ~45 million | Census Bureau 2024; metro population Γ— age bracket share | +| Smartphone users who search for "things to do near me" at least weekly | ~35% | Google Trends + Pew Research mobile search behavior | +| Addressable users | ~15.75 million | 45M Γ— 35% | +| Willingness to pay $5/mo for discovery app | ~5-10% of addressable | Comparable to subscription app conversion rates (Strava, AllTrails, Yelp) | +| **SAM (consumer subscriptions)** | **~$47M-$94M MRR** | 15.75M Γ— 5-10% Γ— $4.99 | +| **SAM (business featured placements)** | **~$500M-$1B annually** | US SMBs in food/entertainment/hospitality (~1M) Γ— $97/mo Γ— 5-10% adoption | + +### 4.3 Serviceable Obtainable Market (SOM) + +HotNow's SOM for the first 3 years focuses on **launch cities with high young-adult density and strong nightlife/event cultures**. + +| Year | SOM Estimate | Methodology | +|------|-------------|-------------| +| Year 1 | 500-2,000 Pro subscribers + 20-50 featured businesses | Launch in 2-3 cities (Austin, Miami, Atlanta). Organic + community-driven growth. | +| Year 2 | 5,000-15,000 Pro subscribers + 100-300 businesses | Expand to 8-10 cities. Referral flywheel + social media. | +| Year 3 | 20,000-50,000 Pro subscribers + 500-1,000 businesses | 20+ cities. Brand establishment. Network effects from user density. | + +### 4.4 Competitive Landscape + +| Competitor | Price | Primary Strength | Primary Weakness | HotNow Advantage | +|------------|-------|-----------------|-----------------|-----------------| +| **Yelp** | Free (ads) | Massive review database, SEO dominance | Static, review-focused; no real-time ranking; no pop-up/event discovery | Real-time social signals + AI curation; surfaces what's hot NOW, not what has 200 reviews from last year | +| **Google Maps "Explore"** | Free | Universal adoption, location data | Generic, no curation; misses pop-ups and trending spots; no social signals | AI-powered personalization; real-time ranking; dedicated to discovery, not navigation | +| **Eventbrite** | Free (ticketing fees) | Event creation + ticketing infrastructure | Only ticketed events; misses free pop-ups, street festivals, nightlife | Aggregates everything: ticketed + free + pop-ups + trending spots; not a ticketing platform | +| **TikTok "near me"** | Free | Massive engagement, trend-spotting | Unstructured; no map; no systematic ranking; algorithm-dependent | Map-first structured discovery; real-time ranking; save and plan capabilities | +| **Scoop Travel** | $10/mo | Curated, high-quality travel recommendations | Travel-focused (not local); editorial (slow); limited cities; $10/mo for static content | Real-time; local-first; AI-driven; $4.99/mo; neighborhood precision | +| **Thrillist / Infatuation** | Free (ads) | Editorial quality, brand trust | Slow publication cycle; limited city coverage; misses real-time pop-ups | Automated, real-time, scalable to any city; no editorial bottleneck | +| **Dice / Bandsintown** | Free (ticketing fees) | Live music focus, artist following | Music-only; misses food, art, pop-ups, nightlife | Everything combined: food + music + art + nightlife + events | +| **Instagram "nearby"** | Free | Social proof, visual discovery | Feed-based, not map-based; chronological, not ranked; no aggregation | Map-first; real-time ranking; AI curation; systematic aggregation | + +**Key insight:** HotNow does not need to replace Yelp or Google Maps. It needs to answer the specific, high-intent question those platforms handle poorly: "what's good right now near me?" This is a new category -- real-time local discovery -- that combines elements of social media (freshness), maps (location), and AI curation (personalization) into a single experience. + +--- + +## 5. Product Overview + +### 5.1 Architecture + +HotNow is built on a layered architecture that maximizes reuse of existing IT Pro Partner infrastructure: + +``` ++-----------------------------------------------------------+ +| HotNow PWA (React + Mapbox) | +| Map-first mobile experience, user accounts, tiers | ++-----------------------------------------------------------+ +| API Layer (FastAPI + Auth) | +| REST endpoints, geolocation, user profiles, billing | ++-----------------------------------------------------------+ +| HotNow Engine (Python) | +| Real-time ranking algorithm, AI curation, social signals | ++---------------------------+-------------------------------+ +| Super Search v2 | Event Aggregators | +| (7 providers, caching, | (Eventbrite, Ticketmaster, | +| circuit breakers) | Meetup, Facebook Events, | +| | scraping layer) | ++---------------------------+-------------------------------+ +| PostgreSQL -- Places, users, events, reviews | ++-----------------------------------------------------------+ +| Stripe -- Billing, subscriptions, payouts | ++-----------------------------------------------------------+ +| Mapbox -- Maps, geocoding, location services | ++-----------------------------------------------------------+ +``` + +**Infrastructure:** +- **Hosting:** netcup VPS (IT Pro Partner existing infra) -- one production server + staging +- **Super Search v2 MCP Server:** Already running on app1 -- provides search across 7 providers with circuit breakers, caching, and health monitoring +- **API Layer (to build):** FastAPI with JWT auth, geolocation queries, user profiles +- **PWA (to build):** React SPA with Mapbox GL JS, offline support, push notifications +- **Database (to add):** PostgreSQL with PostGIS for geospatial queries on places, events, users +- **Billing (to add):** Stripe for consumer subscriptions + business featured placement billing +- **Ranking Engine (to build):** Real-time scoring algorithm combining social signals, freshness, check-in velocity, and review sentiment +- **LLM:** deepseek-v4-pro for AI curation, personalized recommendations, itinerary building + +**Existing vs. to-build breakdown:** + +| Component | Status | Effort Estimate | +|-----------|--------|----------------| +| Super Search v2 engine | **Existing** | 0 hours | +| Search provider orchestration | **Existing** | 0 hours | +| Circuit breakers, caching, health checks | **Existing** | 0 hours | +| Event aggregator connectors (Eventbrite, Ticketmaster, Meetup) | **To build** | ~30 hours | +| Social signal ingestion (check-in data, review velocity) | **To build** | ~25 hours | +| Real-time ranking algorithm | **To build** | ~40 hours | +| AI curation / recommendation engine | **~40% existing** | ~35 hours | +| FastAPI multi-tenant API layer | **To build** | ~30 hours | +| React PWA (Mapbox, offline, push) | **To build** | ~100 hours | +| PostgreSQL + PostGIS schema | **To build** | ~20 hours | +| Stripe billing integration | **To build** | ~20 hours | +| Auth (JWT + social login: Google, Apple) | **To build** | ~15 hours | +| Business portal (claim listing, analytics, featured placement) | **To build** | ~40 hours | +| Push notification engine | **To build** | ~15 hours | +| Testing, DevOps, CI/CD, PWA compliance | **To build** | ~35 hours | +| Documentation, moderation tools | **To build** | ~20 hours | +| **Total remaining build** | | **~425 hours** | + +### 5.2 Tier Structure + +#### Explorer -- Free + +**Target:** Everyone. The top of the funnel. + +**Features:** +- Real-time map of trending spots and events near you +- Browse by category: food, music, nightlife, art, festivals, pop-ups +- Event and place detail pages with photos, descriptions, social links +- Basic search and filtering +- "Trending Now" feed for your current location +- Limited to 10 "Best Right Now" AI picks per month +- Ad-supported + +#### Pro -- $4.99/month (annual: $49.99/yr, save 17%) + +**Target:** Power users who want curated, personalized discovery. + +**Features (everything in Explorer, plus):** +- Unlimited "Best Right Now" AI picks -- personalized to your tastes, weather, time of day, and real-time crowd data +- Taste profile: teach HotNow what you like (cuisines, music genres, vibe preferences) +- Saved places and collections ("Date Night Spots," "Best Rooftops") +- Custom alerts: get notified when your favorite type of event pops up nearby +- Ad-free experience +- "Friends Are Going" social signals (opt-in) +- Early access to limited-capacity events + +#### Concierge -- $19.99/month (annual: $199.99/yr, save 17%) + +**Target:** Power planners, group organizers, frequent entertainers. + +**Features (everything in Pro, plus):** +- Trip planner: build multi-stop itineraries with time/location optimization +- Group coordination: share plans, vote on options, see where friends want to go +- "Perfect Night Out" AI: give it a vibe ("romantic," "wild," "low-key") and it builds the night +- Priority support (chat, 2-hour response) +- Concierge badge (verified power user status) +- Early access to new features +- Export itineraries to calendar + +### 5.3 Business Revenue Products + +| Product | Price | What It Is | +|---------|-------|------------| +| **Featured Placement** | $97/mo per location | Priority placement in "Trending Now" feed + map highlight + "Featured" badge. Analytics dashboard showing impressions, clicks, direction requests. | +| **Event Boost** | $47/event | One-time boost for a specific event (pop-up, special menu, guest DJ, etc.). Surfaces the event to users in a 5-mile radius for 48 hours. | +| **Business Profile** | Free (claimed) | Claim and manage your listing with photos, hours, menus, event posts. Free for all businesses. | + +### 5.4 Deployment Status Grid + +| Site | Status | Detail | +|------|--------|--------| +| hotnow.io | πŸ”΄ Not created | Domain registered at Cloudflare ($33/yr). DNS + Caddy needed. | +| app.hotnow.io | πŸ”΄ Not created | PWA dashboard | +| api.hotnow.io | πŸ”΄ Not created | Backend API (Super Search extended) | + +--- + +## 6. Revenue Model + +### 6.1 Pricing Rationale + +HotNow's consumer pricing is anchored to impulse-buy psychology -- less than a single cocktail or a month of Netflix: + +- **Explorer (Free):** "Try it. You'll wonder how you lived without it." +- **Pro ($4.99/mo):** "Less than a latte. Unlimited AI-curated picks for the price of a single drink." +- **Concierge ($19.99/mo):** "The cost of one mediocre appetizer. Your personal nightlife planner." + +Business pricing is aggressive compared to Yelp Ads ($150-$500+/mo for basic placement) and Eventbrite promotion ($0.79-$2.50/ticket in fees): + +- **Featured Placement ($97/mo):** "Less than Yelp Ads. More targeted. Real-time visibility when people are deciding where to go." +- **Event Boost ($47/event):** "One-time. No revenue share. 48 hours of priority visibility to everyone nearby." + +### 6.2 Cost Structure (Monthly Operating) + +| Expense | Monthly Cost | Annual Cost | Notes | +|---------|-------------|-------------|-------| +| Super Search infrastructure | $0 | $0 | Already running on ITPP infra | +| Netcup VPS (production + staging) | $50 | $600 | Incremental to existing; largely absorbed | +| Mapbox (maps + geocoding) | $50-$200 | $600-$2,400 | Free tier: 50K monthly loads. Scales with MAUs | +| Eventbrite / Ticketmaster API | $0-$100 | $0-$1,200 | Many have free tiers for discovery apps | +| deepseek-v4-pro API calls | $100-$300 | $1,200-$3,600 | Variable; scales with Pro/Concierge user count | +| Stripe fees | ~2.9% + $0.30/transaction | Variable | ~3% of revenue | +| Domain + SSL | $3 | $36 | hotnow.io at Cloudflare ($33/yr) | +| Email delivery (Resend/SendGrid) | $20 | $240 | Transactional + notification delivery | +| Push notifications (OneSignal/FCM) | $0-$50 | $0-$600 | Free tier: 10K subscribers | +| Monitoring + logging | $30 | $360 | Basic observability | +| **Total baseline operating cost** | **~$253-$753/mo** | **~$3,036-$9,036/yr** | | + +At scale (10K+ MAU), Mapbox and LLM costs become the primary variable costs. Mapbox pricing: ~$0.50 per 1,000 map loads beyond free tier. LLM: ~$0.01-$0.05 per AI recommendation query. + +### 6.3 Revenue Projections by User Count + +All consumer figures assume annual contract pricing for simplicity. Month-to-month Pro adds $1/mo (20% premium). + +#### Scenario: Consumer Subscriptions Only + +| Pro Subscribers | Concierge (10% of Pro) | Monthly Consumer Revenue | Annual Revenue | +|-----------------|----------------------|-------------------------|----------------| +| 100 | 10 | $617 | $7,404 | +| 500 | 50 | $3,083 | $37,000 | +| 1,000 | 100 | $6,166 | $73,992 | +| 5,000 | 500 | $30,830 | $369,960 | +| 10,000 | 1,000 | $61,660 | $739,920 | +| 50,000 | 5,000 | $308,300 | $3,699,600 | + +#### Scenario: Consumer + Business Revenue (Year 3 Target) + +| Revenue Source | Volume/Month | Monthly Revenue | Annual Revenue | +|---------------|-------------|----------------|---------------| +| Pro Subscribers ($4.17/mo annual) | 10,000 | $41,700 | $500,400 | +| Concierge ($16.67/mo annual) | 1,000 | $16,670 | $200,040 | +| Featured Placements ($97/mo) | 500 | $48,500 | $582,000 | +| Event Boosts ($47/event) | 200 | $9,400 | $112,800 | +| **Total** | | **$116,270** | **$1,395,240** | + +#### Gross Margin Analysis + +At 1,000 Pro subscribers + 100 featured businesses (~$14.7K MRR), monthly costs of ~$500 vs. revenue of ~$14,700 yields a **gross margin of ~97%**. At scale (50K users + 1,000 businesses), margin remains above **90%** after Mapbox and LLM scaling costs. + +### 6.4 12-Month Revenue Ramp (Realistic Case) + +| Month | Pro Users | Businesses | MRR | Cumulative Revenue | Notes | +|-------|-----------|-----------|-----|-------------------|-------| +| 1 | 0 | 0 | $0 | $0 | Pre-launch: build completion, beta | +| 2 | 0 | 0 | $0 | $0 | Beta testing, seed content, initial listings | +| 3 | 20 | 2 | $278 | $278 | Soft launch in 1 city (Austin) | +| 4 | 50 | 5 | $693 | $971 | First social media traction | +| 5 | 80 | 8 | $1,109 | $2,080 | Word-of-mouth begins; second city (Miami) | +| 6 | 120 | 12 | $1,664 | $3,744 | Community events + local influencer push | +| 7 | 180 | 18 | $2,496 | $6,240 | Referral program launched | +| 8 | 250 | 25 | $3,467 | $9,707 | Third city (Atlanta); TikTok content | +| 9 | 350 | 35 | $4,854 | $14,561 | First press coverage; organic growth | +| 10 | 500 | 50 | $6,935 | $21,496 | Business flywheel: placements attract users | +| 11 | 700 | 70 | $9,709 | $31,205 | Network effects visible in launch cities | +| 12 | 1,000 | 100 | $13,867 | $45,072 | **Year 1 exit ARR: ~$166K** | + +**Key assumptions:** +- Launch city strategy: dense urban area with high young-adult population +- Zero paid acquisition in months 1-6 (organic, social, community only) +- Monthly consumer churn: 4-6% (typical for consumer subscription apps; Netflix ~2%, niche apps 5-8%) +- Monthly business churn: 3-5% (lower; business subscriptions are stickier) +- Average revenue per Pro user: $4.17/mo (annual pricing) +- All new cities seeded manually with initial listings and events before user launch + +--- + +## 7. Competitive Advantages + +### 7.1 Why HotNow Wins + +#### 1. Real-Time, Not Static + +Every major competitor is static or slow. Yelp shows you the top-rated restaurants from the last 5 years. Thrillist publishes a "Best New Restaurants" list twice a year. Eventbrite lists events, but doesn't rank or recommend them. HotNow is the only platform that answers "what's good RIGHT NOW" -- not "what was good last month" or "what's generally good in this city." + +This is a fundamental architectural advantage. HotNow's ranking engine combines: +- **Freshness signals:** how recently was this posted/updated/checked-into +- **Velocity signals:** how fast are social mentions, check-ins, and reviews accelerating +- **Social proof:** real-time Instagram/TikTok mentions, not just accumulated Yelp stars +- **Contextual signals:** weather, time of day, day of week, proximity + +No competitor combines all four in real time. + +#### 2. Everything in One Place + +Users currently need 5+ apps to cover what HotNow does in one: +- Yelp for restaurants +- Eventbrite for events +- Instagram/TikTok for pop-ups and trending spots +- Google Maps for navigation +- Bandsintown/Dice for live music + +HotNow unifies these into a single map-first experience. The aggregation is the product. + +#### 3. ~70% Already Built on Super Search v2 + +Super Search v2 -- the multi-provider search engine with 7 providers, circuit breakers, intelligent caching, and health monitoring -- is already running on IT Pro Partner infrastructure. This is not a greenfield search engine build. Approximately 70% of the aggregation and search layer exists today. Competitors would need 6-12 months and $100K+ to replicate just this component. + +#### 4. AI-Powered Personalization from Day One + +HotNow's Pro tier uses LLM-powered AI curation to deliver personalized "Best Right Now" picks based on: +- Your taste profile (cuisines, music genres, vibe preferences, dietary needs) +- Current weather (patio weather? indoor jazz?) +- Time of day (brunch spots at 11am, cocktail bars at 7pm, late-night at 11pm) +- Real-time crowd signals (is it packed? is it dead?) +- What's genuinely hot right now, not what was hot last season + +This is a fundamentally different approach from collaborative filtering ("people who liked X also liked Y"), which requires massive user bases to work. HotNow's AI curation works from user #1. + +#### 5. Capital Efficiency -- Near-Zero Marginal Delivery Cost + +The Super Search infrastructure is fixed-cost. Each additional user, recommendation, or search costs fractions of a cent in API calls. At 90%+ gross margins at scale, HotNow is a capital-efficient consumer platform that doesn't require VC-scale burn to grow. This means: +- No pressure to raise venture capital or hit unicorn growth metrics +- Sustainable growth at modest user counts +- Optionality: bootstrapped lifestyle business or venture-scale play -- whichever the market supports + +#### 6. Business Monetization Without the Yelp Trap + +Yelp's business monetization is adversarial: pay for visibility or risk bad reviews being surfaced. HotNow's business model is additive: featured placement boosts visibility, but the organic ranking is driven by real-time signals, not ad spend. Businesses pay to be seen, not to suppress negative content. This avoids the trust and reputation problems that plague Yelp. + +### 7.2 Competitive Positioning Map + +``` + HIGH PRICE / SLOW + β”‚ + Thrillist ● β”‚ + (Free, but β”‚ + editorial, β”‚ + slow, limited)β”‚ + β”‚ + Scoop Travel ● β”‚ + ($10/mo, β”‚ + travel-only, β”‚ + editorial) β”‚ + β”‚ +────────────────────────┼──────────────────────── + STATIC / β”‚ REAL-TIME / + REVIEW-BASED β”‚ SOCIAL-DRIVEN + β”‚ + Yelp ● β”‚ + (Free, massive β”‚ β˜… HotNow + review DB, β”‚ (Free-$19.99/mo, + but not real-time) β”‚ real-time, AI, + β”‚ everything) + Google Maps ● β”‚ + (Free, universal, β”‚ + but no curation) β”‚ + β”‚ + β”‚ + LOW PRICE / REAL-TIME +``` + +HotNow occupies the real-time, low-price quadrant -- a position with no current occupant. Every existing player is either static/slow (Yelp, Google Maps) or expensive/narrow (Scoop Travel, editorial platforms). + +--- + +## 8. Go-to-Market Strategy + +### 8.1 Phase 1: Foundation (Months 1-2) + +**Objective:** Complete build, seed content, recruit beta users. + +**Activities:** +- Complete remaining ~425 hours of development (PWA, ranking algorithm, API, billing) +- Seed launch city with 500+ manually curated places and events +- Recruit 20-50 beta users in Austin for testing + feedback +- Build social media presence: Instagram, TikTok, X accounts +- Produce launch content: "HotNow is coming" teasers +- Set up Stripe, email, push notification infrastructure +- Submit PWA to Google Play and Apple App Store (PWA wrapper) + +**KPIs:** +- Beta users: 20-50 +- Seed listings: 500+ +- Social followers: 500+ combined + +### 8.2 Phase 2: Soft Launch -- City by City (Months 3-6) + +**Objective:** Prove product-market fit in 2-3 launch cities. Validate willingness to pay. + +**Launch cities:** Austin, TX (Month 3), Miami, FL (Month 5), Atlanta, GA (Month 6) + +**Rationale:** These cities have high young-adult density, vibrant nightlife/food/event scenes, warm weather (year-round outdoor events), and strong social media culture. + +**Channels:** + +| Channel | CAC Estimate | Time to Mature | Priority | +|---------|-------------|----------------|----------| +| Local Instagram/TikTok influencers | $50-$200 per post | Immediate | β˜…β˜…β˜…β˜…β˜… | +| College campus ambassadors | Free (swag) + commission | 1-2 months | β˜…β˜…β˜…β˜…β˜… | +| Cross-promotion with local venues/bars/restaurants | $0 (mutual benefit) | Immediate | β˜…β˜…β˜…β˜…β˜… | +| Reddit city subreddits (r/Austin, r/Miami, r/Atlanta) | $0 | Immediate | β˜…β˜…β˜…β˜… | +| Organic TikTok/Reels content ("What's hot tonight in Austin") | $0 | 2-4 weeks | β˜…β˜…β˜…β˜… | +| Event partnerships -- HotNow as "official discovery partner" | $0-$500 | 1-2 months | β˜…β˜…β˜… | +| Product Hunt launch | $0 | One-time | β˜…β˜…β˜… | + +**KPIs:** +- Pro subscribers: 80-120 +- Featured businesses: 8-12 +- Monthly active users (MAU): 2,000-5,000 +- App store rating: 4.5+ stars + +### 8.3 Phase 3: Growth (Months 7-9) + +**Objective:** Activate referral flywheel, expand to 5+ cities, begin business sales. + +**Activities:** +- Launch referral program: "Give a month free, get a month free" +- Expand to 3 additional cities (Nashville, Denver, Chicago) +- Hire 1-2 part-time city launchers to seed new markets +- Begin direct business outreach: "Get featured on HotNow before your competitors" +- User-generated content campaigns: "Tag #HotNow for a chance to be featured" +- Weekly "What's Hot" newsletter for each city + +**KPIs:** +- Pro subscribers: 250-350 +- Featured businesses: 25-35 +- MAU: 10,000-25,000 +- Cities live: 5-6 + +### 8.4 Phase 4: Scale (Months 10-12) + +**Objective:** Establish predictable growth engine, expand to 10+ cities. + +**Activities:** +- Paid acquisition: Instagram/TikTok ads in new cities ($2,000-$5,000/mo budget) +- Launch HotNow for Web (desktop experience for trip planning) +- API partnerships: integrate with reservation platforms (OpenTable, Resy, Tock) +- Press outreach: tech blogs, local news, lifestyle publications +- Business sales: hire one part-time business development rep + +**KPIs:** +- Pro subscribers: 700-1,000 +- Featured businesses: 70-100 +- MAU: 50,000-100,000 +- Cities live: 10+ +- Annual exit ARR: ~$166K + +### 8.5 Customer Acquisition Strategy Summary + +| Channel | CAC Estimate | Time to Mature | Scalability | Priority | +|---------|-------------|----------------|-------------|----------| +| Local influencer partnerships | $50-$200/post | Immediate | High per city | β˜…β˜…β˜…β˜…β˜… | +| Venue/bar/restaurant cross-promotion | $0 | Immediate | High per city | β˜…β˜…β˜…β˜…β˜… | +| College ambassadors | $0-$100 | 1-2 months | Medium (seasonal) | β˜…β˜…β˜…β˜…β˜… | +| Organic TikTok/Reels | $0 | 2-4 weeks | Very High | β˜…β˜…β˜…β˜… | +| Referral program | $0 | 3+ months | Very High | β˜…β˜…β˜…β˜… | +| City subreddits / local forums | $0 | Immediate | Medium (one-time) | β˜…β˜…β˜…β˜… | +| Event partnerships | $0-$500 | 1-3 months | Medium | β˜…β˜…β˜… | +| Product Hunt | $0 | One-time | Low (one-time) | β˜…β˜…β˜… | +| Paid social (Instagram/TikTok ads) | $5-$15/install | 1-2 weeks | Very High | β˜…β˜… (Phase 4) | +| Press / PR | $0-$1,000 | 1-3 months | Medium | β˜…β˜… | + +--- + +## 9. Risk Analysis + +### 9.1 Market Risks + +| Risk | Probability | Impact | Mitigation | +|------|-----------|--------|------------| +| **Consumer discovery apps have high churn / low willingness to pay** | Medium-High | High | Validate with beta before full investment. Free tier must be genuinely useful to drive habit formation. Freemium conversion rate in consumer apps averages 2-5% -- HotNow targets 3%. If consumer subscriptions underperform, shift to business-first monetization (featured placements as primary revenue). | +| **"Winner-take-all" network effects favor incumbents (Yelp, Google)** | Medium | Medium | HotNow competes on a different axis (real-time, not review database). Network effects matter less for real-time discovery than for accumulated reviews. HotNow's value is in freshness, not depth of review history. | +| **Recession reduces discretionary spending on entertainment** | Low-Medium | Medium | At $4.99/mo, Pro is a trivial expense. In downturns, free tier usage *increases* as people seek affordable local activities. Business featured placements may decline -- offset by consumer Pro upgrades from free users seeking better curation. | + +### 9.2 Product Risks + +| Risk | Probability | Impact | Mitigation | +|------|-----------|--------|------------| +| **"Cold start" problem: no content in new cities** | High | High | Manual seeding of 500+ places/events per city before launch. City launcher role: one person spends 2 weeks curating a city before it goes live. Event aggregator connectors (Eventbrite, Ticketmaster, Meetup, Facebook Events) provide automated baseline content. | +| **Real-time ranking algorithm quality** | Medium | High | Start simple: freshness + social velocity as primary signals. Layer on AI curation complexity incrementally. Beta test ranking quality with real users in launch city. Allow user feedback ("not relevant" / "great pick") to train ranking. | +| **Mapbox costs scale poorly with MAU growth** | Low-Medium | Medium | Mapbox free tier: 50K monthly loads. At 100K MAU, Mapbox costs ~$300-$500/mo -- manageable at our margins. Have OpenStreetMap + Leaflet as fallback if Mapbox costs become excessive. Negotiate volume pricing at 500K+ MAU. | +| **PWA adoption friction (no native app store presence)** | Medium | Medium | PWA wrapper for App Store / Google Play submission gives native app store listing. Users can install directly from browser. Promote PWA install aggressively in onboarding. If PWA proves inadequate, native app build (~150 additional hours) is scoped but deferred. | + +### 9.3 Competitive Risks + +| Risk | Probability | Impact | Mitigation | +|------|-----------|--------|------------| +| **Yelp launches real-time "trending" feature** | Medium | Medium-High | Yelp's DNA is review-driven, not real-time. Adding trending requires a fundamentally different data pipeline. Even if launched, Yelp's business model (ads for established businesses) conflicts with surfacing new/pop-up spots. HotNow has 12-18 month head start. | +| **Google builds better "Explore" with real-time signals** | Medium | High | Google has the data (Maps, search, location history) but historically underinvests in local discovery UX. Google's incentives favor search ads, not discovery feeds. If Google enters, HotNow competes on curation quality, community, and focus. | +| **TikTok builds structured local discovery** | Medium | Medium | TikTok has user attention and trend data but no location infrastructure. Building maps + structured places data is a multi-year effort. HotNow competes by being purpose-built for discovery, not an add-on to a video feed. | +| **VC-funded competitor clones HotNow concept** | Medium | Medium | Mitigation: move fast, lock in launch cities first, build brand loyalty. HotNow's capital efficiency means we don't need to match VC burn rates. Domain and brand in market first. | + +### 9.4 Operational Risks + +| Risk | Probability | Impact | Mitigation | +|------|-----------|--------|------------| +| **Germaine bandwidth -- only person who can build/support** | High | High | Single biggest risk. Mitigation: (1) aggressive documentation from day one, (2) city launcher contractors reduce operational burden, (3) self-serve business portal minimizes support, (4) consider part-time developer at $10K MRR. | +| **Content moderation at scale (spam, fake events, inappropriate content)** | Medium | Medium | Manual review for featured/business listings. User reporting for free tier. Automated spam detection for event submissions. Moderation cost scales slowly -- community self-polices if user base is engaged. | +| **deepseek-v4-pro API changes or price increases** | Low-Medium | Medium | LLM abstraction layer allows provider switching. OpenAI, Claude, and open-source models are fallbacks. AI curation quality is model-dependent but architecture is model-agnostic. | + +### 9.5 Legal & Regulatory Risks + +| Risk | Probability | Impact | Mitigation | +|------|-----------|--------|------------| +| **Scraping event data from third-party sites** | Low-Medium | Medium | Use official APIs where available (Eventbrite, Ticketmaster, Meetup). For sites without APIs, limit to publicly available factual information (event name, date, location, description). Do not scrape copyrighted content. Legal review of aggregation practices before launch. | +| **User location privacy concerns** | Medium | Medium | Location only used while app is active. No background location tracking. Clear privacy policy. GDPR/CCPA compliant. Users can delete location history. "Opt-in only" for social features. | + +### 9.6 90-Day Launch KPIs (Months 3-5) + +| KPI | Target | Red Flag Threshold | +|-----|--------|-------------------| +| MAU (Austin only, Month 3) | 1,000+ | <300 | +| Pro conversion rate | 3%+ | <1% | +| App store rating | 4.5+ | <4.0 | +| Weekly active user retention (Day 7) | 40%+ | <20% | +| Places/events listed in Austin | 500+ | <200 | +| User-reported accuracy ("Great pick" rate) | 70%+ | <50% | +| Business outreach response rate | 25%+ | <10% | + +**If red flags trigger on 3+ KPIs:** Pivot to business-first monetization. De-prioritize consumer subscriptions and focus on building the supply side (businesses, events, venues) as a data/API play sold to platforms that need real-time local data (delivery apps, travel platforms, mapping services). + +### 9.7 Pre-Mortem: What Kills HotNow Within 6 Months? + +1. **Cold start death spiral:** Users open the app, see nothing in their city, never come back. **Prevention:** no city goes live without 500+ manually seeded listings. City launchers are non-negotiable. + +2. **Pro conversion rate below 1%:** Free tier is good enough that nobody upgrades. **Prevention:** free tier must be genuinely useful BUT with clear upgrade triggers (limited AI picks, ads, no saved places). The "Best Right Now" feature must feel like magic. + +3. **Germaine burns out:** The build is significant (~425 hours). Launching in multiple cities is hands-on work. **Prevention:** hire city launchers (contractors, $15-25/hr) immediately. Do not try to do everything solo. + +4. **No content flywheel:** Users consume but don't contribute. **Prevention:** make contribution easy (tap "this is happening" to submit a spot). Incentivize with Pro credits. Build community from day one. + +5. **Yelp/Google ships "trending" before HotNow has brand awareness:** If an incumbent ships a "good enough" real-time feature before HotNow has user density, HotNow loses the first-mover window. **Prevention:** launch fast, launch ugly if necessary. Speed to market matters more than feature completeness. + +--- + +## 10. Financial Projections + +### 10.1 12-Month P&L Projection (Realistic Case) + +| Line Item | Month 1-3 | Month 4-6 | Month 7-9 | Month 10-12 | Year 1 Total | +|-----------|-----------|-----------|-----------|-------------|-------------| +| **Revenue** | | | | | | +| MRR (end of period) | $278 | $1,664 | $4,854 | $13,867 | -- | +| Cumulative Revenue | $278 | $3,744 | $14,561 | $45,072 | **$45,072** | +| **Cost of Revenue** | | | | | | +| Infrastructure + Mapbox + APIs | $300 | $600 | $1,200 | $2,100 | $4,200 | +| LLM API costs | $100 | $300 | $800 | $1,800 | $3,000 | +| Stripe fees (~3%) | $8 | $112 | $437 | $1,352 | $1,909 | +| **Total COGS** | **$408** | **$1,012** | **$2,437** | **$5,252** | **$9,109** | +| **Gross Profit** | **-$130** | **$2,732** | **$12,124** | **$39,820** | **$35,963** | +| *Gross Margin* | *-47%* | *73%* | *83%* | *88%* | *80%* | +| **Operating Expenses** | | | | | | +| Development (remaining build) | $20,000 | $10,000 | $5,000 | $2,500 | $37,500 | +| City launchers (contractors) | $1,500 | $3,000 | $6,000 | $9,000 | $19,500 | +| Content + social media | $1,000 | $2,000 | $2,000 | $3,000 | $8,000 | +| Influencer / community | $500 | $1,500 | $2,000 | $3,000 | $7,000 | +| Paid acquisition | $0 | $0 | $0 | $5,000 | $5,000 | +| Tools + software | $200 | $300 | $400 | $500 | $1,400 | +| Legal + compliance | $2,000 | $0 | $0 | $1,000 | $3,000 | +| Miscellaneous | $300 | $500 | $750 | $1,000 | $2,550 | +| **Total OpEx** | **$25,500** | **$17,300** | **$16,150** | **$25,000** | **$83,950** | +| **Net Income** | **-$25,630** | **-$14,568** | **-$4,026** | **$14,820** | **-$47,987** | +| *Net Margin* | *Negative* | *Negative* | *Negative* | *33%* | *Negative* | + +**Key observations:** +- Year 1 is investment-heavy: ~$48K net loss, funded by Germaine's sweat equity + minimal cash outlay +- The business becomes cash-flow positive by Month 10-11 on current ramp +- Gross margins exceed 80% by Month 4 -- the underlying unit economics are strong immediately +- Exit run-rate in Month 12: ~$166K ARR with 88% gross margins +- Total Year 1 cash outlay: approximately **$48K** (primarily development time, city launchers, legal) + +### 10.2 3-Year Projection + +| | Year 1 | Year 2 | Year 3 | +|---|--------|--------|--------| +| **Pro Subscribers (end of year)** | 800 | 5,000 | 10,000 | +| **Concierge Subscribers** | 80 | 500 | 1,000 | +| **Featured Businesses** | 80 | 300 | 500 | +| **Event Boosts (per month)** | 30 | 100 | 200 | +| **ARR (end of year)** | $166,000 | $620,000 | $1,395,000 | +| **Total Revenue** | $45,072 | $450,000 | $1,100,000 | +| **Gross Margin** | 80% (ramping) | 90% | 92% | +| **OpEx** | $83,950 | $250,000 | $500,000 | +| **Net Income** | -$47,987 | $155,000 | $512,000 | +| **Net Margin** | Negative | 34% | 47% | + +**Year 2 assumptions:** +- Expand to 15-20 cities +- 2-3 part-time city launchers ($40K-$60K combined) +- First full-time hire: community/operations manager ($50K-$70K) +- Paid acquisition: $3,000-$5,000/mo (validated CAC from Year 1) +- Referral program generating 20%+ of new users +- Pro conversion rate: 3.5% (improving from Year 1's 3%) + +**Year 3 assumptions:** +- 25+ cities live +- Small team: 3-5 full-time (engineering, community, business development, support) +- Brand recognition in launch cities drives organic growth +- Business revenue becomes 45%+ of total (featured placements + event boosts) +- First API/data licensing deals (sell real-time local trend data to platforms) +- Potential acquisition interest from Yelp, Google, or travel platforms + +### 10.3 Unit Economics (Steady State) + +| Metric | Value | Industry Benchmark | Assessment | +|--------|-------|-------------------|------------| +| Average Pro subscriber LTV (annual) | ~$50 | $20-$100 (consumer subscription apps) | Strong | +| Average Concierge subscriber LTV (annual) | ~$200 | $100-$300 (premium consumer) | Strong | +| Average Featured Business LTV (annual) | ~$1,164 | $500-$2,000 (local SMB SaaS) | Healthy | +| Consumer CAC (blended) | $2-$8 | $5-$20 (consumer apps) | Excellent | +| Business CAC | $50-$150 | $100-$500 (local SMB sales) | Excellent | +| LTV:CAC ratio (consumer) | 6:1 to 25:1 | >3:1 (good) | Exceptional | +| LTV:CAC ratio (business) | 8:1 to 23:1 | >3:1 (good) | Exceptional | +| Gross margin | 88-92% | 70-80% (good SaaS) | Excellent | +| Monthly consumer churn | 4-5% | 3-8% (consumer apps) | Target zone | +| Monthly business churn | 3-4% | 3-7% (SMB SaaS) | Good | + +The unit economics are favorable because: +1. **Near-zero marginal delivery cost** -- Super Search and LLM API calls cost fractions of a cent per user +2. **Organic/viral acquisition** -- social media, word of mouth, and venue cross-promotion dominate early growth +3. **Dual revenue streams** -- consumer subscriptions + business placements diversify and compound +4. **Network effects at city density** -- each new user increases value for other users in that city (more check-ins, more social signals, better ranking) + +### 10.4 Capital Requirements + +HotNow is designed to be bootstrapped: + +| Item | Cost | Notes | +|------|------|-------| +| Remaining development (~425 hours) | $0 | Built by Germaine / internal team | +| Initial infrastructure setup | $500 | Domain ($33/yr), SSL, minor VPS adjustments | +| Legal (terms, privacy policy, TOS) | $2,000-$4,000 | One-time | +| Brand identity + design | $1,500-$3,000 | Logo, color system, PWA design | +| City launchers (first 6 months) | $6,000-$12,000 | Contractors at $15-25/hr for city seeding | +| Content + social media | $3,000-$6,000 | First 6 months | +| Influencer seeding (first 3 cities) | $2,000-$5,000 | Micro-influencers with local audiences | +| **Total initial outlay** | **$15,000-$30,500** | | + +This is not a venture-scale capital requirement. The primary investment is Germaine's time -- approximately 425 hours of development, plus ongoing city expansion and community management. At 800 Pro subscribers and 80 businesses (exit Month 12), the business generates ~$166K ARR against a ~$30K initial outlay. + +### 10.5 Break-Even Analysis + +Monthly break-even occurs when monthly gross profit covers monthly OpEx: + +| Scenario | Break-Even Point | Timeline (from launch) | +|----------|-----------------|----------------------| +| Consumer-only (Pro + Concierge) | ~350 subscribers | Month 7-8 | +| Consumer + Business | ~200 Pro + 15 businesses | Month 5-6 | +| With city launcher contractors | ~500 Pro + 30 businesses | Month 8-9 | + +Cumulative break-even (recovering full ~$48K Year 1 investment) occurs in Month 3-5 of Year 2, assuming continued growth trajectory. + +--- + +## 11. The Ask + +### 11.1 What We Need to Launch + +| Resource | Details | Timeline | +|----------|---------|----------| +| **Development capacity** | ~425 hours to build PWA, ranking algorithm, API, billing, business portal | Months 1-2 | +| **City launcher contractors** | 1-2 part-time contractors to seed initial cities with listings (500+/city) | Month 3, ongoing | +| **Legal review** | Terms of service, privacy policy, data aggregation compliance review | Month 1 | +| **Brand identity** | Logo, color system, PWA design, app store assets | Month 1 | +| **Domain setup** | DNS + Caddy configuration for hotnow.io, app.hotnow.io, api.hotnow.io | Month 1 | +| **Beta testers** | 20-50 users in Austin willing to provide feedback | Month 2 | +| **Go-to-market execution** | Germaine's time for city launches, influencer outreach, community management | Ongoing (10-15 hrs/week) | +| **Initial operating capital** | ~$15,000-$30,500 for one-time setup + first 6 months of contractor costs | Month 1 | + +### 11.2 Immediate Decisions Required + +1. **Approval to brand HotNow as a standalone product** under IT Pro Partner ("HotNow is a product of IT Pro Partner") -- maintaining ITPP credibility while allowing HotNow to develop its own consumer-facing brand identity +2. **Confirmation of pricing model** -- are $4.99/$19.99 the right consumer anchor points? Should annual discount be 17% (1 month free) or deeper (25%)? +3. **Business pricing validation** -- is $97/mo for featured placement and $47/event for boosts the right level? Should we test higher (Yelp Ads are $150-$500+/mo)? +4. **Launch city selection** -- confirm Austin as first city, then Miami and Atlanta. Are these the right priority? +5. **Resource allocation** -- confirmation that Germaine can dedicate ~425 hours to the build, plus 10-15 hours/week ongoing GTM effort +6. **Legal entity structure** -- does HotNow operate as a division of IT Pro Partner, or as a separate LLC with ITPP as parent? +7. **Domain confirmation** -- hotnow.io is already purchased ($33/yr at Cloudflare). DNS setup and Caddy configuration needed immediately. + +### 11.3 What Success Looks Like (Month 12) + +- **1,000 Pro subscribers** across 10+ cities, paying $4.99/mo (or $49.99/yr) +- **100 featured businesses** generating $97/mo each in placement revenue +- **~$166,000 ARR** with 88% gross margins +- **50,000-100,000 MAU** with 40%+ weekly active retention +- **10+ cities live** with 500+ listings each +- **4.5+ star app store rating** with 200+ reviews +- **Referral program** generating 15-20% of new users +- **TikTok/Instagram presence** with 50K+ combined followers +- **Team:** Germaine + 1-2 part-time city launchers + 1 part-time community manager +- **Option value:** At 5-8x ARR multiple (consumer marketplace), the business would be valued at ~$830K-$1.3M -- built for a ~$30K initial investment + +### 11.4 The Bigger Picture + +HotNow is more than a local discovery app -- it's a strategic diversification play for IT Pro Partner into the consumer space. Every ITPP product to date has been B2B: managed services, competitive intelligence, debt recovery, digital signage. HotNow tests whether the same infrastructure (Super Search v2, netcup hosting, deepseek-v4-pro LLM) can power a consumer-facing product with fundamentally different unit economics and growth dynamics. + +The consumer space is harder to monetize per user but scales much faster when it works. A successful consumer product also provides leverage: optionality for acquisition (Yelp, Google, Eventbrite, travel platforms), data licensing revenue (real-time local trend data), and brand visibility that feeds back into IT Pro Partner's core B2B credibility. + +In a market where the question "what should we do tonight?" is asked millions of times daily and answered poorly by every existing platform, HotNow's combination of real-time data, AI curation, and capital-efficient infrastructure is not merely competitive -- it's a category creator. The question is whether we build it fast enough and seed cities effectively enough to establish the network effects before someone else does. + +--- + +## Appendix A: Competitor Pricing Deep Dive + +| Platform | Consumer Price | Business Price | Real-Time? | Map-First? | AI Curation? | +|----------|---------------|----------------|------------|------------|-------------| +| **Yelp** | Free | $150-$500+/mo (ads) | No | Yes (secondary) | No | +| **Google Maps** | Free | Free (Google Ads separate) | No | Yes | No | +| **Eventbrite** | Free (ticketing fees) | 3.5% + $1.79/ticket | No | No | No | +| **Scoop Travel** | $10/mo | N/A | No | Yes | No (editorial) | +| **Thrillist** | Free | Sponsored content (custom) | No | No | No | +| **Infatuation** | Free | Sponsored content (custom) | No | No | No | +| **Dice** | Free (ticketing fees) | Revenue share | Partial (music only) | No | No | +| **Bandsintown** | Free | Promoted events | Partial (music only) | No | No | +| **TikTok** | Free | Ads | Partial (unstructured) | No | Algorithmic | +| **HotNow** | **Free / $4.99 / $19.99** | **$97/mo + $47/event** | **Yes** | **Yes** | **Yes (LLM)** | + +## Appendix B: API and Data Source Costs + +| Service | Plan | Monthly Cost | Annual Cost | Limits | +|---------|------|-------------|-------------|--------| +| Mapbox | Pay-as-you-go | $50-$200 (est.) | $600-$2,400 | 50K free loads; ~$0.50/1K beyond | +| Eventbrite API | Free tier | $0 | $0 | Rate-limited; sufficient for aggregation | +| Ticketmaster API | Free tier | $0 | $0 | Rate-limited; sufficient for aggregation | +| Meetup API | Free tier | $0 | $0 | Rate-limited | +| Facebook Events API | Free tier | $0 | $0 | Limited availability post-Cambridge Analytica | +| deepseek-v4-pro | Pay-per-token | $100-$300 (est.) | $1,200-$3,600 | Variable; scales with user count | +| Super Search v2 | Internal | $0 | $0 | Already running on ITPP infrastructure | +| Netcup VPS | Existing infra | $0 (absorbed) | $0 | Existing ITPP servers | +| OneSignal (push) | Free tier | $0-$50 | $0-$600 | 10K free subscribers | +| Resend (email) | Free tier | $20 | $240 | 3K emails/mo free; scales | + +## Appendix C: Glossary + +| Term | Definition | +|------|-----------| +| **ARR** | Annual Recurring Revenue -- the annualized value of subscription contracts | +| **MRR** | Monthly Recurring Revenue | +| **MAU** | Monthly Active Users | +| **CAC** | Customer Acquisition Cost -- total sales & marketing spend / new customers acquired | +| **LTV** | Lifetime Value -- average revenue per customer over their lifetime | +| **PWA** | Progressive Web App -- a web application that behaves like a native mobile app | +| **MCP** | Model Context Protocol -- the protocol used by Super Search v2 for AI integration | +| **COGS** | Cost of Goods Sold -- direct costs attributable to delivering the service | + +--- + +**Document prepared by:** HotNow Product Division, IT Pro Partner +**Contact:** Germaine Brown +**Classification:** Confidential -- For Advisory Team Review Only +**Version:** 1.0 -- August 1, 2026 diff --git a/projects/intelsight.md b/projects/intelsight.md index c4597d4..8cea8df 100644 --- a/projects/intelsight.md +++ b/projects/intelsight.md @@ -726,3 +726,18 @@ In a market where established players charge $50,000/year for less capability, I **Contact:** Germaine Brown **Classification:** Confidential β€” For Advisory Team Review Only **Version:** 1.0 β€” July 25, 2026 + +--- + +## Project Queue + +*Queued Aug 4, 2026 β€” for external advisory team review preparation.* + +| # | Task | Status | +|---|---|---| +| 1 | Tie `intelsight.io` login page to centralized auth (`auth.itpropartner.com`) | Queued | +| 2 | Build out docs page at `intelsight.io/docs/` | Queued | +| 3 | Build tier demo pages at `my.intelsight.io` (Starter, Pro, Enterprise) | Queued | +| 4 | Deploy `$50 design team` to polish `intelsight.io` and `my.intelsight.io` | Queued | + +**Dependencies:** Items 3 & 4 are for external advisory team review β€” keep in production if polished enough post-review, otherwise staging-only. Item 1 ties into existing centralized auth infrastructure (see `centralized-auth` skill). diff --git a/projects/ops-portal-runcloud-design-brief.md b/projects/ops-portal-runcloud-design-brief.md new file mode 100644 index 0000000..02e5985 --- /dev/null +++ b/projects/ops-portal-runcloud-design-brief.md @@ -0,0 +1,1282 @@ +# Ops Portal Redesign β€” RunCloud-Inspired Design Brief + +**Author:** Hermes Agent (Research + Design Synthesis) +**Date:** 2026-08-01 +**Target:** ops.itpropartner.com (IT Pro Partner Operations Portal) +**Reference:** RunCloud Server Management Dashboard (v1 classic + v2 beta) +**Status:** Design Brief / Implementation Spec + +--- + +## Table of Contents +1. [Executive Summary](#1-executive-summary) +2. [RunCloud UI Research Findings](#2-runcloud-ui-research-findings) +3. [Current Ops Portal Analysis](#3-current-ops-portal-analysis) +4. [Proposed Design System](#4-proposed-design-system) +5. [Layout Architecture](#5-layout-architecture) +6. [Component Patterns to Adopt](#6-component-patterns-to-adopt) +7. [Page-by-Page Redesign Specifications](#7-page-by-page-redesign-specifications) +8. [Functionality Gaps & New Features](#8-functionality-gaps--new-features) +9. [Implementation Phases](#9-implementation-phases) +10. [CSS Custom Properties Reference](#10-css-custom-properties-reference) + +--- + +## 1. Executive Summary + +This design brief provides a comprehensive specification for rebuilding the IT Pro Partner Operations Portal (ops.itpropartner.com) with a design language inspired by RunCloud's server management dashboard. RunCloud's UI has evolved through two major design languages (v1 dark classic and v2 modern), and both provide rich patterns applicable to our Ops Portal. + +**Key transformation:** Move from a top-nav, full-width dark layout to a sidebar-first layout with a dark sidebar, content zone, rich data visualization cards, tabbed settings pages, global search, and batch-action capabilities. + +**Primary goals:** +- Adopt RunCloud's professional dark admin aesthetic with sidebar navigation +- Introduce visual resource monitoring (donut charts, sparklines, progress bars) +- Add global search across all servers, services, and resources +- Implement batch actions (restart multiple services, run backups across servers) +- Build visual configuration editors for server/service settings +- Maintain mobile responsiveness and the existing auth integration with auth.itpropartner.com + +--- + +## 2. RunCloud UI Research Findings + +### 2.1 Methodology + +Research was conducted through: +- Web searches for RunCloud dashboard screenshots, reviews, and walkthroughs +- Vision analysis of official RunCloud documentation screenshots (disk usage, server health, SSH config) +- Extraction of RunCloud's blog announcements about Dashboard v2 beta +- Third-party review articles describing UI patterns +- Comparison with similar admin panels (Plesk, cPanel, ServerAvatar) + +### 2.2 RunCloud Classic Dashboard (v1 β€” manage.runcloud.io) + +The classic dashboard served as RunCloud's primary interface and is characterized by: + +**Color Palette (Classic Dark Theme):** +| Element | Hex Code | Usage | +|---------|----------|-------| +| Page background | `#141824` | Main content area background | +| Card surfaces | `#1E2232`–`#222738` | Elevated cards, stat panels | +| Sidebar background | `#0E1119`–`#131621` | Deepest layer, sidebar | +| Primary accent | `#3B82F6` | Active nav, selected tabs, buttons, badges | +| Chart line / donut | `#2DD4BF` (teal/cyan) | Sparklines, donut fills, area charts | +| Success / Healthy | `#22C55E` | Status badges, healthy indicators | +| Warning | `#F59E0B` (amber) | Warning badges, high-usage bars | +| Danger / Error | `#EF4444` | Error states, critical alerts | +| Primary text | `#FFFFFF` | Headings, metric values | +| Secondary text | `#94A3B8` | Labels, descriptions | +| Muted text | `#64748B` | Helper text, breadcrumbs | +| Border / divider | `#2D3344` | Card borders, gridlines | +| Sidebar icon color | `#A0AEC0` | Inactive nav items | +| Sidebar active bg | `rgba(59,130,246,0.12)` | Active navigation row | + +**Layout Structure:** +- Fixed left sidebar (~220px) + fluid main content area +- Top bar: RunCloud logo + global search (`Ctrl+K`) + notification bell + chat bubble + user avatar +- Breadcrumb trail: `Servers > server-name > Section` +- Page title: Large bold white heading with subtitle in gray + +**Stat Cards (4-column grid):** +- Each card: dark elevated surface (~`#1E2232`), generous rounded corners (10–12px), 20–24px padding +- Left side: large bold metric value (28–36px), label in small gray (12–14px), colored status badge +- Right side: visual element β€” donut chart, sparkline, or horizontal progress bar +- Donut chart: thin ring (6–8px), teal/cyan fill, dark track, center transparent +- Sparkline: miniature area chart, teal stroke + gradient fill, no axes +- Progress bar: rounded bar, dark track, amber fill at warning, rounded caps + +**Time Range Tabs:** +- Pill-shaped tab group: `1 Hour | 3 Hours | 6 Hours | 12 Hours | 1 Day | 3 Days | 7 Days` +- Active tab: blue fill (`#3B82F6`) with white text +- Inactive: outlined, dark, gray text +- Font: 13–14px, medium weight + +**Detail Panel (full-width chart):** +- Full-width card below stat cards +- Large line/area chart with dark background, subtle horizontal gridlines +- Teal line with gradient fill, dot markers at data points +- X-axis: time labels, Y-axis: percentage range +- Below chart: small I/O metric blocks with inline sparklines + +**Sidebar Details:** +- Deepest dark (`#0E1119`–`#131621`) +- Collapsible sections: "Servers" (with chevron), "Team", "Settings" +- Active server shown under "Servers" section with submenu items +- Active item: 3–4px blue (`#3B82F6`) left border indicator + lighter background +- Icons: 24px stroke-based icons in `#A0AEC0` (active `#FFFFFF`) +- Font: Inter, 14px, regular weight +- Row height: ~44px, 16px left padding +- Hover state: `rgba(255,255,255,0.05)` background +- "New" badge: small blue pill with white text (10–11px) +- Bottom section: plan indicator + Upgrade button (green) + user identity + +### 2.3 RunCloud Dashboard v2 Beta (new.runcloud.io β€” 2024) + +The v2 redesign introduced a significant shift while maintaining some core patterns: + +**Key Changes in v2:** +- **Accent color changed from blue to purple:** `#7C4DFF` (vibrant purple) +- **Content area shifted to light background:** `#FFFFFF` (cards white with shadows) +- Sidebar remained dark: `#1B2432` +- **Cards:** White background, no border, box-shadow for elevation + - Shadow: `0 1px 3px 0 rgba(0,0,0,0.1), 0 1px 2px 0 rgba(0,0,0,0.06)` + - Border-radius: `8px` (0.5rem), padding: `24px` +- **Global Search:** Prominently placed with `Ctrl+K` shortcut, search across servers, apps, databases +- **Server Tags:** Color-coded tags for organizing servers +- **Web Applications:** Top-level menu showing apps across all servers +- **Recently Viewed:** Quick-access to recent servers and web apps +- **Tabbed Settings:** Server settings consolidated with tab navigation (SSH keys, login notification, session, config) +- **Toggle Switches:** Replacing checkboxes β€” track `#CBD5E0` (off) β†’ `#7C4DFF` (on), 44Γ—24px, fully rounded +- **Input Fields:** 40px height, 1px `#E2E8F0` border, 6px radius, focus `#7C4DFF` + 3px glow +- **Primary Buttons:** `#7C4DFF` bg, white text, 6px radius, 10px 24px padding, hover darkens to `#6B3DE0` +- **Typography:** Inter font family, 14px body, 20px page titles, 12px helper text +- **Laravel/WordPress Features:** One-click artisan commands, staging, cloning, Canvas interface +- **Improved Activity Logs:** Sorted by date with better visibility +- **Teams:** Redesigned flow with email invitations + +### 2.4 Functional Patterns from RunCloud + +**Server Management:** +- One-click actions: Start, Stop, Restart, Console, Edit +- Status dots: green (running) / red (stopped) on server cards +- Resource graphs: CPU, RAM, Disk with time-range selection +- File Manager: web-based with zip/unzip capabilities +- Log Viewer: tail logs in-browser +- SSH configuration: tabbed interface (Settings / Authentication) +- Central SSH utilities in one page with tabs + +**Web Application Management:** +- App Library: categorized cards for one-click installs +- Git deployment: informative integration setup +- Database management: visual interface +- Cron job creation: floating modal/panel +- .env file editor: quick shortcut +- Deployment script editor + +**Navigation Patterns:** +- Collapsible sidebar sections +- Breadcrumb trail for deep navigation +- Global search (Ctrl+K) +- Active item: colored left border + subtle background +- Sidebar collapses to icon-only on narrow screens +- Server list with tags for organization + +**Settings Pages:** +- Tabbed navigation within settings (no page reload) +- Labels above form inputs +- Toggle switches for boolean settings +- Save button right-aligned at bottom of card +- Inline validation with error messages below inputs +- Disabled states: gray background + not-allowed cursor + +--- + +## 3. Current Ops Portal Analysis + +### 3.1 Existing Architecture + +**Served from:** `/var/www/ops/` via Caddy on Core (152.53.192.33) +**Auth:** Separate auth service at auth.itpropartner.com (JWT-based) +**Data:** Fetches live data from `/data/ops-status.json` + +**Files:** +- `css/ops.css` β€” 1027-line single stylesheet +- `js/utils.js` β€” 230-line shared utility functions +- `js/app.js` β€” Dashboard-specific logic +- `nav.html` β€” Shared navigation partial (not using SSI currently, nav duplicated across pages) +- 10 HTML pages: index, services, servers, network, backups, cron, config, logs, audit, cost + +### 3.2 Current Design System + +**Color Palette:** +| Variable | Value | Usage | +|----------|-------|-------| +| `--bg-body` | `#0F1628` | Page background | +| `--bg-card` | `#1E293B` | Card backgrounds, nav bar | +| `--bg-elevated` | `#1A2337` | (defined but underused) | +| `--bg-hover` | `#2A3A52` | Hover states | +| `--border-card` | `#2A3A4E` | Card and element borders | +| `--border-active` | `#3D506E` | Active/hover borders | +| `--accent` | `#F59E0B` | **Amber/orange** β€” primary accent | +| `--accent-hover` | `#D97706` | Darker amber | +| `--text-primary` | `#F1F5F9` | Main text | +| `--text-secondary` | `#94A3B8` | Secondary text | +| `--text-muted` | `#64748B` | Muted/helper text | +| `--green` | `#22C55E` | Success/healthy | +| `--amber` | `#F59E0B` | Warning (same as accent) | +| `--red` | `#EF4444` | Error/danger | +| `--teal` | `#14B8A6` | Info accent | +| `--blue` | `#3B82F6` | Info/secondary accent | + +**Current Layout:** +- **Top nav bar** (`ops-nav`): sticky, full-width, 56px height, blur backdrop + - Brand logo (left), hamburger toggle (mobile), nav links (center), logout (right) + - Mobile: hamburger opens dropdown below nav + - Desktop (>768px): horizontal inline links with bottom-border active indicator +- **Content:** `page-wrapper` max-width 1440px, centered, padding: 20-28px +- **Cards:** `--bg-card` background, 1px `--border-card` border, 12px radius, 20px padding, light shadow +- **Health Grid:** `auto-fit, minmax(140px, 1fr)`, large metric values (1.8rem), uppercase labels +- **Tables:** Full-width, sticky headers, clickable rows, hover highlight +- **Buttons:** Primary (amber fill), outline, danger, success variants, 6px radius +- **Status dots:** Colored with glow effect (green glow, red glow) +- **Badges:** Pill-shaped, colored backgrounds with matching text +- **Resource bars:** 8px height, rounded, with label + percentage +- **Toasts:** Slide-in from right, colored left border +- **Confirm dialog:** Modal overlay with blur backdrop + +**Typography:** +- System font stack: `-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, sans-serif` +- Page titles: 1.4rem (mobile) β†’ 1.6rem (desktop), bold, amber, letter-spacing -0.02em +- Card headers: 0.78rem, uppercase, letter-spacing 0.06em, muted +- Body: 0.82rem in tables, 0.85rem in alerts + +**Current Navigation (10 links):** +Dashboard, Services, Servers, Network, Backups, Cron Jobs, Config, Logs, Audit, Costs + +### 3.3 Strengths of Current Design + +- Clean dark theme with consistent CSS custom properties +- Mobile-responsive with hamburger menu +- JWT-based auth with login overlay +- Good component library: cards, tables, badges, toasts, modals, resource bars +- Live data fetching with refresh +- Status indicators with glow effects +- Good color semantics (green=ok, amber=warning, red=error) + +### 3.4 Weaknesses to Address + +- **No sidebar:** Top nav limits vertical space and feels dated compared to modern admin panels +- **No global search:** Cannot search across servers, services, or logs +- **Tables are text-heavy:** Servers and services use plain tables instead of visual cards with metrics +- **No resource visualization:** Missing charts, sparklines, donut indicators +- **No batch actions:** Cannot restart multiple services or trigger multiple backups at once +- **No visual config editors:** Config page is likely read-only or text-based +- **Nav duplicated across pages:** nav.html is manually included, not server-side included +- **Logs are probably raw text:** No filtering, search, or log-level coloring +- **No server grouping/tagging:** All servers in flat list +- **Limited dashboard interactivity:** Time-range selection for metrics missing + +--- + +## 4. Proposed Design System + +### 4.1 Color Palette (RunCloud-Inspired Dark Theme) + +We will adopt a hybrid approach: keep the dark theme (matching our infrastructure aesthetic), but adopt RunCloud's richer color system and the purple or blue accent. + +**Recommended palette β€” dark content area with rich accent:** + +| CSS Variable | Hex Code | Usage | +|-------------|----------|-------| +| `--bg-sidebar` | `#0B0E14` | Sidebar background (deepest layer) | +| `--bg-sidebar-hover` | `#1A1F2E` | Sidebar item hover | +| `--bg-sidebar-active` | `rgba(59,130,246,0.12)` | Sidebar active item bg | +| `--bg-body` | `#111620` | Main content area background | +| `--bg-card` | `#1A1F2E` | Card surfaces | +| `--bg-card-hover` | `#21273A` | Card hover state | +| `--bg-input` | `#151A26` | Input/select backgrounds | +| `--bg-elevated` | `#1E2335` | Dropdowns, tooltips, elevated surfaces | +| `--border-default` | `#262D3F` | Card and input borders | +| `--border-active` | `#3B82F6` | Focus/active borders | +| `--border-subtle` | `#1E2538` | Dividers, subtle separators | +| `--accent-primary` | `#3B82F6` | **Primary accent (blue)** β€” buttons, active nav, links | +| `--accent-primary-hover` | `#2563EB` | Darker blue hover | +| `--accent-primary-glow` | `rgba(59,130,246,0.20)` | Focus rings, glows | +| `--accent-secondary` | `#7C4DFF` | **Purple accent** β€” alternative actions, secondary highlights | +| `--accent-chart` | `#2DD4BF` | **Teal/cyan** β€” charts, sparklines, donut fills | +| `--accent-chart-alt` | `#818CF8` | **Indigo** β€” secondary chart color | +| `--text-primary` | `#F1F5F9` | Primary text, headings | +| `--text-secondary` | `#94A3B8` | Secondary text, descriptions | +| `--text-muted` | `#64748B` | Muted/helper text, placeholders | +| `--text-sidebar` | `#9CA3AF` | Sidebar nav text (inactive) | +| `--text-sidebar-active` | `#FFFFFF` | Sidebar nav text (active) | +| `--green` | `#22C55E` | Success, healthy, running | +| `--green-bg` | `rgba(34,197,94,0.12)` | Success backgrounds | +| `--amber` | `#F59E0B` | Warning, degraded | +| `--amber-bg` | `rgba(245,158,11,0.12)` | Warning backgrounds | +| `--red` | `#EF4444` | Error, stopped, critical | +| `--red-bg` | `rgba(239,68,68,0.12)` | Error backgrounds | +| `--blue` | `#3B82F6` | Info, neutral | +| `--blue-bg` | `rgba(59,130,246,0.12)` | Info backgrounds | +| `--teal` | `#2DD4BF` | Chart accent | +| `--teal-bg` | `rgba(45,212,191,0.12)` | Chart accent backgrounds | + +**Note on accent choice:** We're adopting blue (`#3B82F6`) as the primary accent (matching RunCloud classic's proven palette) with purple (`#7C4DFF`) as a secondary accent and teal (`#2DD4BF`) for data visualization. This gives us: +- Blue: Navigation, primary actions, links, selected states +- Purple: Secondary actions, special features, "New" badges +- Teal: All charts, sparklines, donut fills, metric visualization +- Green/Amber/Red: Status semantics (unchanged from current) + +### 4.2 Typography + +| Usage | Font | Size | Weight | Notes | +|-------|------|------|--------|-------| +| Page title | Inter | 24px (1.5rem) | 700 | Letter-spacing: -0.02em | +| Section heading | Inter | 14px (0.875rem) | 700 | Uppercase, letter-spacing: 0.05em | +| Card metric value | Inter | 32px (2rem) | 800 | Tabular figures, letter-spacing: -0.03em | +| Card label | Inter | 12px (0.75rem) | 600 | Uppercase, letter-spacing: 0.06em | +| Body text | Inter | 14px (0.875rem) | 400 | Line-height: 1.5 | +| Table cell | Inter | 13px (0.8125rem) | 400 | Tabular figures | +| Table header | Inter | 11px (0.6875rem) | 600 | Uppercase, letter-spacing: 0.06em | +| Sidebar item | Inter | 14px (0.875rem) | 500 | Line-height: 1.2 | +| Badge / tag | Inter | 11px (0.6875rem) | 600 | Uppercase, letter-spacing: 0.04em | +| Button text | Inter | 14px (0.875rem) | 600 | β€” | +| Helper / caption | Inter | 12px (0.75rem) | 400 | β€” | +| Code / mono | JetBrains Mono | 13px (0.8125rem) | 400 | For IPs, commands, config | + +**Font loading strategy:** +```html + + + +``` + +With fallback: `'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif` + +### 4.3 Spacing & Sizing + +| Token | Value | Usage | +|-------|-------|-------| +| `--space-xs` | 4px | Tight gaps, icon padding | +| `--space-sm` | 8px | Element gaps, small padding | +| `--space-md` | 12px | Card internal gaps, input gaps | +| `--space-lg` | 16px | Section gaps, card padding | +| `--space-xl` | 24px | Card padding, section margins | +| `--space-2xl` | 32px | Page margins, large gaps | +| `--radius-sm` | 6px | Inputs, buttons, small elements | +| `--radius-md` | 8px | Cards, panels, dialogs | +| `--radius-lg` | 12px | Main cards, stat panels | +| `--radius-full` | 9999px | Pills, badges, toggle switches | + +### 4.4 Shadows & Elevation + +| Token | Value | Usage | +|-------|-------|-------| +| `--shadow-sm` | `0 1px 2px rgba(0,0,0,0.3)` | Cards (subtle elevation) | +| `--shadow-md` | `0 4px 12px rgba(0,0,0,0.4)` | Elevated cards, dropdowns | +| `--shadow-lg` | `0 8px 24px rgba(0,0,0,0.5)` | Modals, dialogs | +| `--shadow-glow-blue` | `0 0 12px rgba(59,130,246,0.15)` | Active/focus glows | +| `--shadow-glow-green` | `0 0 12px rgba(34,197,94,0.15)` | Status dot glows | +| `--shadow-glow-red` | `0 0 12px rgba(239,68,68,0.15)` | Error glows | + +--- + +## 5. Layout Architecture + +### 5.1 Global Shell + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚ +β”‚ β”‚ β”‚ β”‚ TOP BAR: Logo + Global Search + Notif + User β”‚β”‚ +β”‚ β”‚ SIDEBAR β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚β”‚ +β”‚ β”‚ Logo β”‚ β”‚ BREADCRUMB TRAIL β”‚β”‚ +β”‚ β”‚ ────── β”‚ β”‚ PAGE TITLE + ACTIONS β”‚β”‚ +β”‚ β”‚ Search β”‚ β”‚ β”‚β”‚ +β”‚ β”‚ ────── β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚β”‚ +β”‚ β”‚ Nav 1 β–Έ β”‚ β”‚ β”‚ β”‚ β”‚β”‚ +β”‚ β”‚ Nav 2 β”‚ β”‚ β”‚ MAIN CONTENT ZONE β”‚ β”‚β”‚ +β”‚ β”‚ Nav 3 β”‚ β”‚ β”‚ (Cards, Tables, Charts, Forms) β”‚ β”‚β”‚ +β”‚ β”‚ Nav 4 β”‚ β”‚ β”‚ β”‚ β”‚β”‚ +β”‚ β”‚ Nav 5 β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚β”‚ +β”‚ β”‚ ────── β”‚ β”‚ β”‚β”‚ +β”‚ β”‚ Section β”‚ β”‚ β”‚β”‚ +β”‚ β”‚ ────── β”‚ β”‚ β”‚β”‚ +β”‚ β”‚ User β”‚ β”‚ β”‚β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +**Sidebar:** Fixed, 240px width (desktop), collapsible to 64px (icon-only) +**Top Bar:** 56px height, spans the full width of the content area (right of sidebar) +**Main Content:** Scrollable, fills remaining viewport, max-width 1400px with auto margins + +### 5.2 Sidebar Specification + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ [Logo] ITPP [β—€] β”‚ ← Logo + collapse toggle +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ πŸ” Quick search β”‚ ← In-sidebar search (or cmd+k global) +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ πŸ“Š Dashboard β”‚ ← Active: blue left border + light bg +β”‚ β”‚ +β”‚ DASHBOARD β”‚ ← Section header (collapsible) +β”‚ πŸ“ˆ Overview β”‚ +β”‚ πŸ“‹ Activity β”‚ +β”‚ β”‚ +β”‚ INFRASTRUCTURE β”‚ +β”‚ πŸ–₯ Servers [5]β”‚ ← With count badge +β”‚ βš™ Services [12]β”‚ +β”‚ 🌐 Network β”‚ +β”‚ πŸ’Ύ Backups β”‚ +β”‚ ⏰ Cron Jobs β”‚ +β”‚ β”‚ +β”‚ MANAGEMENT β”‚ +β”‚ πŸ“ Config β”‚ +β”‚ πŸ“„ Logs β”‚ +β”‚ βœ“ Audit β”‚ +β”‚ πŸ’° Costs β”‚ +β”‚ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ πŸ‘€ admin@itpp... β”‚ ← User identity +β”‚ βš™ Settings β”‚ +β”‚ πŸšͺ Sign Out β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +**Sidebar behavior:** +- **Default:** 240px wide, full text + icons +- **Collapsed:** 64px wide, icons only, tooltips on hover +- **Mobile (<768px):** Hidden behind hamburger, slides in as overlay +- **Sections:** Collapsible with chevron indicators +- **Active item:** 3px blue left border + `rgba(59,130,246,0.10)` background + white text +- **Hover:** `#1A1F2E` background, white text +- **Count badges:** Small pill on right side of nav items +- **Server sub-list:** Expandable tree showing individual server names with status dots + +### 5.3 Top Bar Specification + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ πŸ” Search servers, services, logs... [Ctrl+K] πŸ”” πŸ’¬ πŸ‘€β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +**Elements (right-aligned):** +- Global search: `Ctrl+K` shortcut, ⌘ on Mac +- Notification bell: with unread count badge +- User avatar: initials on colored circle, dropdown for Settings / Sign Out + +### 5.4 Content Zones + +Each page follows this vertical layout within the content area: + +1. **Breadcrumb row:** `Home > Section > Subsection` (12px, muted, with chevron separators) +2. **Page header:** Title (24px bold white) + description (14px gray) + action buttons (right-aligned) +3. **Summary bar (optional):** Quick stats in a horizontal pill row +4. **Main content:** Cards, tables, charts β€” scrollable +5. **Footer (optional):** "Last updated: ..." timestamp + +### 5.5 Responsive Breakpoints + +| Breakpoint | Width | Sidebar | Content | Layout Changes | +|-----------|-------|---------|---------|----------------| +| Mobile | < 768px | Hidden (hamburger overlay) | Full width | Cards stack 1-col, tables become cards | +| Tablet | 768–1023px | Collapsed (64px, icons only) | Fluid | Cards 2-col, sidebar icons with tooltips | +| Desktop | β‰₯ 1024px | Full (240px) | Max 1400px centered | Full layout, 4-col card grids | +| Wide | β‰₯ 1440px | Full (240px) | Max 1400px centered | Extra whitespace on sides | + +--- + +## 6. Component Patterns to Adopt + +### 6.1 Stat/Metric Cards + +**Pattern from RunCloud:** Each server or resource card shows a large metric value, a label, a status badge, and a visual indicator. + +**Specification:** +```css +.stat-card { + background: var(--bg-card); + border: 1px solid var(--border-default); + border-radius: var(--radius-lg); /* 12px */ + padding: var(--space-xl); /* 24px */ + display: flex; + align-items: center; + gap: var(--space-lg); /* 16px */ + transition: border-color 0.2s ease; +} +.stat-card:hover { + border-color: var(--border-active); +} +.stat-card .stat-left { + flex: 1; + min-width: 0; +} +.stat-card .stat-value { + font-size: 2rem; /* 32px */ + font-weight: 800; + letter-spacing: -0.03em; + color: var(--text-primary); + line-height: 1.1; + font-variant-numeric: tabular-nums; +} +.stat-card .stat-label { + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--text-muted); + margin-top: 4px; +} +.stat-card .stat-visual { + flex-shrink: 0; + width: 64px; + height: 64px; + display: flex; + align-items: center; + justify-content: center; +} +.stat-card .stat-status { + margin-top: 8px; +} +``` + +### 6.2 Donut Chart (for disk usage, pass rates) + +Lightweight SVG donut chart β€” no library needed. + +```html + + + + stroke-dashoffset="97.7" + stroke-linecap="round" + transform="rotate(-90 32 32)"/> + + 44.5% + + +``` + +### 6.3 Sparkline (mini area chart) + +SVG-based sparkline for CPU, load, request rate trends. + +```html + + + + + + + + + + +``` + +### 6.4 Progress/RAM Bar (with color thresholds) + +```css +.progress-bar { + height: 10px; + background: var(--bg-body); + border-radius: var(--radius-full); + overflow: hidden; +} +.progress-bar .fill { + height: 100%; + border-radius: var(--radius-full); + transition: width 0.6s ease, background 0.3s ease; +} +.fill-low { background: var(--green); } /* 0-50% */ +.fill-medium { background: var(--amber); } /* 50-80% */ +.fill-high { background: var(--red); } /* 80-100% */ +``` + +With label row above: `[Label] [Percentage]` + +### 6.5 Time Range Selector + +Pill-shaped tab group for filtering metric time ranges. + +```html +
+ + + + + + + +
+``` + +```css +.time-tabs { + display: inline-flex; + gap: 4px; + background: var(--bg-body); + border-radius: var(--radius-md); + padding: 3px; +} +.time-tab { + padding: 6px 14px; + border-radius: var(--radius-sm); + border: none; + background: transparent; + color: var(--text-secondary); + font-size: 0.8125rem; + font-weight: 500; + cursor: pointer; + transition: all 0.15s ease; +} +.time-tab:hover { color: var(--text-primary); } +.time-tab.active { + background: var(--accent-primary); + color: #FFFFFF; +} +``` + +### 6.6 Resource Usage Card (Server Card) + +Replaces current plain server table with visual cards: + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ 🟒 Core (152.53.192.33) netcup β”‚ +β”‚ ─────────────────────────────────── β”‚ +β”‚ CPU β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘ 12% β”‚ +β”‚ RAM β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘ 82% ⚠ β”‚ +β”‚ Disk β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ 31% β”‚ +β”‚ β”‚ +β”‚ Services: 8 running, 0 stopped β”‚ +β”‚ Uptime: 47d 12h β”‚ +β”‚ ─────────────────────────────────── β”‚ +β”‚ [View] [SSH] [Restart] [Monitor] β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### 6.7 Server List with Status Dots (Sidebar Tree) + +``` +πŸ–₯ Servers [5] + β”œβ”€ 🟒 Core (152.53.192.33) + β”œβ”€ 🟒 App1 (192.168.x.x) + β”œβ”€ 🟑 DB1 (192.168.x.x) ← Warning + β”œβ”€ πŸ”΄ WPHost (192.168.x.x) ← Down + └─ 🟒 Monitor (192.168.x.x) +``` + +### 6.8 Tabbed Settings Pages + +```html +
+
+ + + + +
+
+ +
+
+ +
+
+``` + +```css +.tab-bar { + display: flex; + border-bottom: 1px solid var(--border-default); + margin-bottom: 24px; +} +.tab { + padding: 10px 20px; + border: none; + background: none; + color: var(--text-secondary); + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + border-bottom: 2px solid transparent; + transition: all 0.15s ease; + margin-bottom: -1px; +} +.tab:hover { color: var(--text-primary); } +.tab.active { + color: var(--accent-primary); + border-bottom-color: var(--accent-primary); + font-weight: 600; +} +``` + +### 6.9 Toggle Switches + +```css +.toggle { + position: relative; + display: inline-block; + width: 44px; + height: 24px; +} +.toggle input { opacity: 0; width: 0; height: 0; } +.toggle .slider { + position: absolute; + inset: 0; + background: #374151; + border-radius: 9999px; + cursor: pointer; + transition: background 0.2s ease; +} +.toggle .slider::before { + content: ''; + position: absolute; + width: 20px; + height: 20px; + left: 2px; + bottom: 2px; + background: #FFFFFF; + border-radius: 50%; + transition: transform 0.2s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.3); +} +.toggle input:checked + .slider { + background: var(--accent-primary); +} +.toggle input:checked + .slider::before { + transform: translateX(20px); +} +.toggle input:focus-visible + .slider { + box-shadow: 0 0 0 3px var(--accent-primary-glow); +} +``` + +### 6.10 Global Search Modal + +Triggered by `Ctrl+K` or clicking the search bar. Overlay with: + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ πŸ” Search servers, services, logs... β”‚ +β”‚ β”‚ +β”‚ ─── SERVERS ─────────────────────────── β”‚ +β”‚ πŸ–₯ Core (152.53.192.33) netcup β”‚ +β”‚ πŸ–₯ App1 (192.168.x.x) hetznerβ”‚ +β”‚ β”‚ +β”‚ ─── SERVICES ────────────────────────── β”‚ +β”‚ βš™ caddy.service running β”‚ +β”‚ βš™ sshd.service running β”‚ +β”‚ β”‚ +β”‚ ─── RECENT ──────────────────────────── β”‚ +β”‚ πŸ“„ Core system logs β”‚ +β”‚ πŸ“Š Server health metrics β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +Fuzzy search across: server names, IPs, service names, log entries, config keys, backup names. + +### 6.11 Toast Notifications (Refined) + +Current toast design is good β€” enhance with: +- Progress bar for auto-dismiss +- Action button (e.g., "Undo" for batch actions) +- Stack limit (max 3 visible) +- Sound optional for critical alerts + +### 6.12 Empty States + +```html +
+
+ +
+

No servers connected

+

Connect your first server to start monitoring.

+ +
+``` + +--- + +## 7. Page-by-Page Redesign Specifications + +### 7.1 Dashboard (index.html) β€” Highest Priority + +**Current:** Health grid (5 items), Quick Actions (3 cards), Server table, Cron table, Audit log. +**Redesign:** + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ 🏠 Dashboard β”‚ +β”‚ System health, recent activity, and quick actions β”‚ +β”‚ [Refresh] β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Servers β”‚ β”‚Services β”‚ β”‚ Disk β”‚ β”‚ RAM β”‚ β”‚ +β”‚ β”‚ 5 β”‚ β”‚ 12 ok β”‚ β”‚ 31% β”‚ β”‚ 62% β”‚ β”‚ +β”‚ β”‚ 4 up β”‚ β”‚ 0 fail β”‚ β”‚ [β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘]β”‚ β”‚ [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘]β”‚ β”‚ +β”‚ β”‚ 1 warn β”‚ β”‚ β”‚ β”‚ Healthyβ”‚ β”‚ Warning β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ CPU Load (1H) β”‚ β”‚ Network I/O β”‚ β”‚ +β”‚ β”‚ [ sparkline ] β”‚ β”‚ [ sparkline ] β”‚ β”‚ +β”‚ β”‚ 0.87 avg | 2.1 peak β”‚ β”‚ 1.2 MB/s ↓ | 0.8 ↑ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Servers Overview [All β†’]β”‚ β”‚ +β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚ β”‚ +β”‚ β”‚ β”‚πŸŸ’ Core β”‚ β”‚πŸŸ’ App1 β”‚ β”‚πŸŸ‘ DB1 β”‚ β”‚πŸŸ’ Monitorβ”‚β”‚ β”‚ +β”‚ β”‚ β”‚CPU: 12% β”‚ β”‚CPU: 8% β”‚ β”‚CPU: 67% β”‚ β”‚CPU: 3% β”‚β”‚ β”‚ +β”‚ β”‚ β”‚RAM: 62% β”‚ β”‚RAM: 45% β”‚ β”‚RAM: 82%βš β”‚ β”‚RAM: 22% β”‚β”‚ β”‚ +β”‚ β”‚ β”‚[View] β”‚ β”‚[View] β”‚ β”‚[View] β”‚ β”‚[View] β”‚β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Recent Audit Log β”‚ β”‚ Scheduled Jobs β”‚ β”‚ +β”‚ β”‚ 12:34 backup ok β”‚ β”‚ ⏰ hermes-backup βœ“ β”‚ β”‚ +β”‚ β”‚ 11:20 caddy reload β”‚ β”‚ ⏰ lynis-scan βœ“ β”‚ β”‚ +β”‚ β”‚ 09:15 deploy app1 β”‚ β”‚ ⏰ s3-sync ⚠ β”‚ β”‚ +β”‚ β”‚ [View All] β”‚ β”‚ [View All] β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +**New features:** +- Server mini-cards with CPU/RAM bars and status dots +- Sparkline charts for CPU load and network I/O +- Time range selector for metric detail views +- Quick-jump from audit entries to affected resources +- Collapsible sections for less-used widgets + +### 7.2 Servers Page β€” Major Upgrade + +**Current:** Plain HTML table: Name, Type, IP, Status, Provider. +**Redesign:** Card grid with rich server cards. + +Each server card: +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ 🟒 Core netcup β”‚ +β”‚ 152.53.192.33 β”‚ +β”‚ ──────────────────────────────────── β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ CPU β”‚ β”‚ RAM β”‚ β”‚ Disk β”‚ β”‚ +β”‚ β”‚ [donut] β”‚ β”‚ [bar] β”‚ β”‚ [donut] β”‚ β”‚ +β”‚ β”‚ 12% β”‚ β”‚ 62% β”‚ β”‚ 31% β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”‚ Services: 8 running β€’ Uptime: 47d β”‚ +β”‚ ──────────────────────────────────── β”‚ +β”‚ [Details] [SSH] [Restart] [Logs] β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +**New features:** +- **Search/filter:** Bar above grid to filter servers by name, IP, provider, status, tags +- **Server tags:** Color-coded tags for grouping (e.g., "production", "staging", "web", "db") +- **Batch actions:** Checkbox on each card β†’ batch restart, batch update, batch backup trigger +- **Sort options:** By name, CPU, RAM, disk, uptime, status +- **View toggle:** Grid view (cards) vs. List view (compact table) +- **Server grouping:** Group by provider, tag, or status +- **Quick actions on hover:** SSH, Restart, View Logs without navigating + +### 7.3 Services Page + +**Current:** Individual service cards with status dot, name, status text, action buttons. +**Redesign:** + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ βš™ Services [+ Add Filter]β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ πŸ” Filter services... [All β–Ύ] [Server: All β–Ύ] β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ 🟒 caddy β”‚ β”‚ 🟒 sshd β”‚ β”‚ +β”‚ β”‚ Core Β· web server β”‚ β”‚ Core Β· ssh daemon β”‚ β”‚ +β”‚ β”‚ Uptime: 47d 12h β”‚ β”‚ Uptime: 47d 12h β”‚ β”‚ +β”‚ β”‚ [Restart] [Logs] β”‚ β”‚ [Restart] [Logs] β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Batch Actions: [Select All] [Restart Selected (3)] β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +**New features:** +- Filter by service name, server, status (running/stopped/failed) +- Group by server with collapsible sections +- Batch restart/stop of selected services +- Service dependency visualization +- Last log excerpt shown inline (last 3 lines) + +### 7.4 Backups Page + +**Current:** Bucket cards with name, status, details. +**Redesign:** + +- Visual backup health indicator (donut showing % of successful recent backups) +- Timeline view of last N backups per target +- Backup size trend sparkline +- "Backup Now" button per target with confirmation +- Batch trigger all backups +- Last backup duration and transfer speed + +### 7.5 Network Page + +**Current:** Network-related data display. +**Redesign:** + +- Network topology mini-map (server nodes + connections) +- Per-server network I/O sparklines +- Open ports table with security indicators +- DNS health check results +- SSL certificate expiry countdown widgets +- Tailscale/ WireGuard peer status list + +### 7.6 Logs Page β€” Major Upgrade + +**Current:** Likely raw log display or simple list. +**Redesign:** + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ πŸ“„ Logs β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Server: [All β–Ύ] Service: [All β–Ύ] Level: [All β–Ύ] β”‚ β”‚ +β”‚ β”‚ πŸ” Search logs... [Live β–Ύ] β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”‚ 12:34:56 INFO caddy TLS handshake from 1.2.3.4 β”‚ +β”‚ 12:34:55 WARN sshd Failed password for root β”‚ +β”‚ 12:34:54 ERROR app1 500 GET /api/status β”‚ +β”‚ 12:34:53 INFO cron job 'backup' completed (OK) β”‚ +β”‚ β”‚ +β”‚ [Load older] [Auto-scroll βœ“]β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +**New features:** +- Log level coloring (ERROR=red, WARN=amber, INFO=blue, DEBUG=gray) +- Server and service filter dropdowns +- Free-text search with regex support +- Live tail mode (WebSocket or polling) +- Time range picker +- Export logs to file +- Log entry click β†’ expand details (full stack trace, context) + +### 7.7 Config Page + +**Current:** Config data display. +**Redesign:** Tabbed settings page with visual configuration editors. + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ πŸ“ Configuration β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ [General] [SSH] [Firewall] [Monitoring] [Backups] β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Server Configuration Core β”‚ β”‚ +β”‚ β”‚ ──────────────────────────────────────────────────── β”‚ β”‚ +β”‚ β”‚ Hostname [core.itpropartner.com ] β”‚ β”‚ +β”‚ β”‚ Timezone [America/Chicago β–Ύ ] β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ SSH Port [22 ] β”‚ β”‚ +β”‚ β”‚ Root Login [β—‰] Off β—‹ On β”‚ β”‚ +β”‚ β”‚ Password Auth [β—‹] Off β—‰ On β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ Firewall β”‚ β”‚ +β”‚ β”‚ β˜‘ 22/tcp (SSH) β”‚ β”‚ +β”‚ β”‚ β˜‘ 80/tcp (HTTP) β”‚ β”‚ +β”‚ β”‚ β˜‘ 443/tcp (HTTPS) β”‚ β”‚ +β”‚ β”‚ ☐ 8080/tcp (Alt HTTP) β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ [Save Changes] [Reset] β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### 7.8 Cron Jobs Page + +**Current:** Plain table. +**Redesign:** + +- Visual schedule indicators (clock-like UI showing next run time) +- Job dependency graph +- Manual trigger button per job +- Last N run results with duration sparklines +- Enable/disable toggles per job +- "Create Cron Job" button with modal form + +### 7.9 Audit Page + +**Current:** List of audit entries. +**Redesign:** + +- Filterable by action type, target, result, date range +- Timeline visualization +- Actor identification (which user/system triggered each action) +- Export audit log +- Audit statistics (actions per day, failure rate) + +### 7.10 Costs Page + +**Current:** Cost data display. +**Redesign:** + +- Monthly cost trend chart (area chart) +- Per-provider cost breakdown (stacked bar or donut) +- Per-server cost allocation +- Projected monthly cost based on current usage +- Cost anomaly detection alerts + +--- + +## 8. Functionality Gaps & New Features + +### 8.1 Global Search (Priority: HIGH) +- **`Ctrl+K` / `⌘K`** shortcut to open search modal +- Fuzzy search across: servers (name, IP, provider), services, log entries, config keys, cron jobs, backups +- Results grouped by category with icons +- Recent searches saved locally +- Keyboard navigation (arrow keys + Enter) + +### 8.2 Batch Actions (Priority: HIGH) +- Checkbox selection on servers, services, backups +- Batch restart services across servers +- Batch trigger backups +- Batch enable/disable cron jobs +- Confirmation dialog with summary of affected items +- Progress indicator for long-running batch operations + +### 8.3 Visual Resource Monitoring (Priority: HIGH) +- Donut charts for disk usage per server +- Sparklines for CPU load, memory, network I/O +- Progress bars with color thresholds +- Time range selector (1H, 3H, 6H, 12H, 1D, 3D, 7D) +- Auto-refresh with configurable interval (15s, 30s, 1m, 5m, off) +- Click sparkline β†’ expand to detailed chart modal + +### 8.4 Visual Configuration Editors (Priority: MEDIUM) +- Tabbed settings pages (SSH, Firewall, Monitoring, Backups, Notifications) +- Toggle switches for boolean settings +- Dropdown selects for enumerated values +- Input validation with inline errors +- "Save Changes" with loading state and success toast +- "Reset to defaults" with confirmation +- Config diff view showing changes before save + +### 8.5 Server Dashboard (Per-Server Detail Page) (Priority: MEDIUM) +- New page: `/server.html?name=core` +- Tabs: Overview, Services, Logs, Config, Backups +- Overview: CPU/RAM/Disk graphs, service status list, recent logs +- One-click actions: Restart, SSH, View Logs, Edit Config + +### 8.6 Server Tags (Priority: MEDIUM) +- Color-coded tags for organizing servers (e.g., "production" = green, "staging" = amber, "database" = blue) +- Filter sidebar by tags +- Bulk tag assignment +- Custom tag creation + +### 8.7 Notifications & Alerting (Priority: LOW) +- Notification bell in top bar with dropdown +- Alert rules: CPU > 90%, disk > 85%, service down, backup failed +- In-app toast + optional email notification +- Alert history page + +### 8.8 Dark/Light Theme Toggle (Priority: LOW) +- Toggle in user menu or sidebar footer +- Persisted to localStorage +- Light theme uses RunCloud v2 color scheme (white content area, dark sidebar) + +### 8.9 Mobile Optimizations (Priority: MEDIUM) +- Bottom tab bar on mobile (instead of collapsed sidebar) +- Swipe gestures for navigation +- Touch-friendly card actions (larger tap targets) +- Pull-to-refresh on dashboard +- Responsive charts and tables (cards replace tables on mobile) + +--- + +## 9. Implementation Phases + +### Phase 1: Foundation (Week 1–2) +1. Create new `ops.css` with the full design system (CSS custom properties) +2. Build sidebar component (HTML + CSS + JS) +3. Build top bar with global search trigger +4. Create page shell template (sidebar + top bar + content zone) +5. Set up CSS grid layout for content area +6. Implement responsive breakpoints and mobile sidebar +7. Add Inter + JetBrains Mono fonts + +### Phase 2: Core Components (Week 2–3) +8. Build stat card component (with donut chart variant) +9. Build sparkline chart component (SVG-based) +10. Build progress bar component (with thresholds) +11. Build time range selector tabs +12. Build tabbed settings component +13. Build toggle switch component +14. Build global search modal (UI only) +15. Build breadcrumb component + +### Phase 3: Dashboard Redesign (Week 3–4) +16. Rebuild Dashboard page with new stat cards +17. Add server mini-cards with CPU/RAM bars +18. Add sparkline charts for CPU and Network I/O +19. Implement time range filtering for dashboard metrics +20. Polish audit log and cron job widgets + +### Phase 4: Content Pages (Week 4–6) +21. Rebuild Servers page with card grid +22. Add server search/filter/sort +23. Add batch action capability +24. Rebuild Services page with filter and batch actions +25. Rebuild Backups page with visual indicators +26. Rebuild Logs page with log viewer and filters +27. Rebuild Config page with tabbed settings and toggles +28. Rebuild Network, Audit, Cron, Costs pages with refreshed UI + +### Phase 5: Advanced Features (Week 6–8) +29. Implement global search backend (fuzzy search across data) +30. Add server detail page (`/server.html`) +31. Implement server tags system +32. Add notification system (bell + dropdown + toast on alerts) +33. Add dark/light theme toggle +34. Mobile bottom tab bar +35. Performance optimization and final polish + +--- + +## 10. CSS Custom Properties Reference + +Complete CSS custom properties for the new design system: + +```css +:root { + /* ===== SURFACES ===== */ + --bg-sidebar: #0B0E14; + --bg-sidebar-hover: #1A1F2E; + --bg-sidebar-active: rgba(59, 130, 246, 0.10); + --bg-body: #111620; + --bg-card: #1A1F2E; + --bg-card-hover: #21273A; + --bg-input: #151A26; + --bg-elevated: #1E2335; + + /* ===== BORDERS ===== */ + --border-default: #262D3F; + --border-active: #3B82F6; + --border-subtle: #1E2538; + + /* ===== ACCENTS ===== */ + --accent-primary: #3B82F6; + --accent-primary-hover: #2563EB; + --accent-primary-glow: rgba(59, 130, 246, 0.20); + --accent-secondary: #7C4DFF; + --accent-chart: #2DD4BF; + --accent-chart-alt: #818CF8; + + /* ===== TEXT ===== */ + --text-primary: #F1F5F9; + --text-secondary: #94A3B8; + --text-muted: #64748B; + --text-sidebar: #9CA3AF; + --text-sidebar-active: #FFFFFF; + + /* ===== SEMANTIC COLORS ===== */ + --green: #22C55E; + --green-bg: rgba(34, 197, 94, 0.12); + --green-glow: rgba(34, 197, 94, 0.25); + --amber: #F59E0B; + --amber-bg: rgba(245, 158, 11, 0.12); + --red: #EF4444; + --red-bg: rgba(239, 68, 68, 0.12); + --red-glow: rgba(239, 68, 68, 0.25); + --blue: #3B82F6; + --blue-bg: rgba(59, 130, 246, 0.12); + --teal: #2DD4BF; + --teal-bg: rgba(45, 212, 191, 0.12); + --purple: #7C4DFF; + --purple-bg: rgba(124, 77, 255, 0.12); + + /* ===== SPACING ===== */ + --space-xs: 4px; + --space-sm: 8px; + --space-md: 12px; + --space-lg: 16px; + --space-xl: 24px; + --space-2xl: 32px; + + /* ===== RADIUS ===== */ + --radius-sm: 6px; + --radius-md: 8px; + --radius-lg: 12px; + --radius-full: 9999px; + + /* ===== SHADOWS ===== */ + --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3); + --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4); + --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.5); + --shadow-glow-blue: 0 0 12px rgba(59, 130, 246, 0.15); + --shadow-glow-green: 0 0 12px rgba(34, 197, 94, 0.15); + --shadow-glow-red: 0 0 12px rgba(239, 68, 68, 0.15); + + /* ===== TYPOGRAPHY ===== */ + --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + --font-mono: 'JetBrains Mono', 'SF Mono', 'Cascadia Code', 'Consolas', monospace; + + /* ===== LAYOUT ===== */ + --sidebar-width: 240px; + --sidebar-collapsed: 64px; + --topbar-height: 56px; + + /* ===== TRANSITIONS ===== */ + --transition-fast: 0.15s ease; + --transition-base: 0.2s ease; + --transition-slow: 0.3s ease; +} +``` + +--- + +## Appendix A: RunCloud Reference URLs + +- RunCloud Homepage: https://runcloud.io/ +- Dashboard v2 Beta Blog: https://runcloud.io/blog/dashboard-v2-beta +- Server Health Docs: https://runcloud.io/docs/understanding-server-health-load-memory-disk +- Disk Space Usage Docs: https://runcloud.io/docs/disk-space-usage +- SSH Hardening Docs: https://runcloud.io/docs/ssh-service-hardening-on-runcloud +- Classic Dashboard: https://manage.runcloud.io +- New Dashboard v2: https://new.runcloud.io +- Third-party Review: https://responsiveweb.nz/blog/post/runcloud-server-management-review +- Third-party Review: https://wpjohnny.com/runcloud-cloud-based-vps-webhosting-control-panel-review/ + +## Appendix B: Existing Ops Portal Reference + +- Production URL: https://ops.itpropartner.com +- Server: Core (152.53.192.33) +- Document root: `/var/www/ops/` +- Web server: Caddy +- Auth: JWT via auth.itpropartner.com +- Data source: `/data/ops-status.json` +- Existing CSS: `/var/www/ops/css/ops.css` (1027 lines) +- Existing JS: `/var/www/ops/js/utils.js` (230 lines), `/var/www/ops/js/app.js` +- Pages: index, services, servers, network, backups, cron, config, logs, audit, cost + +## Appendix C: Key Design Decisions + +1. **Dark theme retained** β€” matches infrastructure/admin tooling conventions and existing brand +2. **Blue primary accent** over amber β€” RunCloud's blue is more professional and less "warning-like"; purple available as secondary +3. **Teal for data visualization** β€” distinct from UI accent to avoid confusion with interactive elements +4. **Sidebar over top nav** β€” modern admin panel standard, better use of horizontal space on wide screens +5. **Inter font** β€” RunCloud's choice, excellent legibility, good tabular figures for metrics +6. **SVG-based charts** β€” no library dependency, lightweight, themeable via CSS variables +7. **Single-file architecture retained** β€” each page is a self-contained HTML file with shared CSS/JS, no build step required +8. **Progressive enhancement** β€” all pages usable without JS, enhanced with JS for interactivity + +--- + +*End of Design Brief* diff --git a/projects/schoolcart-pta-marketing-blitz.md b/projects/schoolcart-pta-marketing-blitz.md new file mode 100644 index 0000000..0d259d6 --- /dev/null +++ b/projects/schoolcart-pta-marketing-blitz.md @@ -0,0 +1,372 @@ +# CartMyList PTA Marketing Blitz β€” Strategic Plan + +**Date:** August 3, 2026 +**Product:** CartMyList (cartmylist.com) +**Target:** Chatham County, GA β€” 55 SCCPSS schools, ~36,000+ students +**Objective:** Get CartMyList in front of PTA leaders with maximum reach, minimum effort + +--- + +## 1. PTA Contact Research β€” What We Found + +### 1.1 SCCPSS School Count: ~55 Schools (8 Board Districts) + +| District | Board Member | Email | Schools | +|----------|-------------|-------|---------| +| 1 | Denise Grabowski | denise.grabowski@sccpss.com | 8 schools (Ellis K-8, Heard, Hesse K-8, Isle of Hope K-8, J.G. Smith, Savannah Arts, STEM Bartlett, White Bluff) | +| 2 | Vacant | β€” | 8 schools (A.B. Williams, Formey ELC, Hubert, J.G. Low, Jenkins HS, Myers, Savannah Classical, Susie King Taylor) | +| 3 | Cornelia Hall | cornelia.hall@sccpss.com | 6 schools (Gadsden, Garrison K-8, Johnson HS, Oglethorpe, Savannah High, Savannah Early College) | +| 4 | Shawn Kachmar | shawn.kachmar@sccpss.com | 5 schools (Coastal, Islands HS, Marshpoint, May Howard, Tybee Maritime) | +| 5 | Paul Smith | paul.smith1@sccpss.com | 7 schools (Beach HS, Coastal Empire Montessori, DeRenne, Haven, Hodge, Largo-Tibet, Pulaski) | +| 6 | David Bringman | david.bringman@sccpss.com | 5 schools (Georgetown K-8, Southwest ES, Southwest MS, Windsor Forest ES, Windsor Forest HS) | +| 7 | Stephanie Campbell | stephanie.campbell@sccpss.com | 6 schools (Bloomingdale, Pooler, New Hampstead K-8, New Hampstead HS, West Chatham ES, West Chatham MS) | +| 8 | Tonia Howard-Hall | tonia.howard-hall@sccpss.com | 9 schools (Brock, Butler, Garden City, Godley Station K-8, Gould, Groves HS, Mercer, Rice Creek K-8, Woodville-Tompkins) | + +### 1.2 Confirmed PTA/PTO/PTSA Facebook Pages + +| School | Type | Facebook | +|--------|------|----------| +| **Savannah Chatham Council of PTAs** | Council | facebook.com/SavannahChathamPTA | +| Jacob G. Smith Elementary | PTA | facebook.com/jgsmithpta | +| May Howard Elementary | PTA | facebook.com/mayhowardpta | +| Marshpoint Elementary | PTA | facebook.com/MarshpointPTA | +| White Bluff Elementary | PTA | facebook.com/WhiteBluffPTA | +| Windsor Forest Elementary | PTA | facebook.com/WFESWildcatsPTA | +| Herschel V. Jenkins High | PTSA | facebook.com/p/Herschel-V-Jenkins-High-School-PTSA-100085848390072 | +| Savannah Early College HS | PTSA | facebook.com/SECHSPTSA | +| Myers Middle School | PTA | facebook.com/p/Myers-Middle-School-PTA-Gators-100075861945142 | +| New Hampstead K-8 | PTO | nhk8.sccpss.com/community-engagement/nhk8-parent-teacher-organization | + +### 1.3 Key Distribution Channels + +| Channel | Reach | Cost | Barrier | +|---------|-------|------|---------| +| **Peachjar e-flyer** | ALL SCCPSS parents via email + school webpages | ~$25/school (or free for free events) | District approval required; free tier limited to 1 flyer/30 days, up to 25 schools | +| **Georgia PTA District 6** | All PTA units in region | $0 | Need intro to district leadership | +| **SCCPSS Communications Dept** | District-wide announcements | $0 | Must pass Kurt Hetager's approval (communications@sccpss.com) | +| **Parents of SCCPSS Facebook Group** | 4,000+ local parents | $0 | Group admin approval for promotional posts | +| **Individual PTA Facebook pages** | School-specific parents | $0 (DM) | Labor-intensive, 1:1 outreach | +| **SCCPSS board members** | Each represents 5-9 schools | $0 | Politically sensitive β€” don't cold-email without warm intro | + +### 1.4 Contact Information Gaps + +- **Council president:** Unknown (Sandra Cason was president 2011-2013, likely rotated out). Georgia PTA District 6 Facebook page is the best route to get current leadership. +- **Individual PTA emails:** None found publicly. Facebook DMs or school website "Contact PTA" forms are the only path. +- **Georgia PTA local unit directory:** Not publicly searchable β€” must go through state/district leadership. + +--- + +## 2. Marketing Blitz Strategy β€” "Least Effort, Maximum Reach" + +### The Core Insight + +CartMyList's **School Plan is FREE** and pays the PTA **$1 per cart** β€” this is the entire pitch. PTAs spend all year begging for volunteers and money. CartMyList is a zero-effort fundraiser: no bake sales, no wrapping paper, no door-to-door. One email to parents, one Facebook post, and the PTA earns passive income during back-to-school season. + +### 2.1 Strategy Pyramid (Highest ROI β†’ Lowest) + +``` + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ PEACHJAR β”‚ ← 35,000+ parents in one shot + β”‚ (District) β”‚ + β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ + β”‚ COUNCIL β”‚ ← 1 meeting β†’ all 50+ unit presidents + β”‚ MEETING β”‚ + β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ + β”‚ FACEBOOK β”‚ ← 4,000+ engaged parents + β”‚ GROUPS β”‚ + β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ + β”‚ ROGER MOSS β”‚ ← Board president endorsement + β”‚ (SCCPSS) β”‚ + β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ + β”‚ 1:1 PTA β”‚ ← Direct DMs to known units + β”‚ OUTREACH β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### 2.2 Phase 0: Foundation (This Week) + +**Actions:** +1. **Domain registration:** Register cartmylist.com immediately ($12/yr at Cloudflare). Set up Caddy routing and a simple landing page. +2. **Landing page:** Single page at cartmylist.com β€” hero section ("Turn Any School Supply List Into a One-Click Amazon Cart"), upload demo (animated), "For PTAs" section highlighting the School Plan (free, $1/cart donation, branded portal), and a "Get Your School Started" form. +3. **One-pager PDF:** A printable/sharable flyer for PTA presidents β€” problem, solution, how it works, the PTA deal (free + earn $1/cart), signup link. +4. **Demo video:** 60-second screen recording of PDF upload β†’ cart result. Host on landing page. This is the proof that silences skepticism. + +**Cost:** $12 domain + time. + +### 2.3 Phase 1: Peachjar β€” The Mass Distribution Play + +**What:** Upload CartMyList as a district-wide Peachjar e-flyer. + +**Why this is the #1 channel:** +- Hits ALL SCCPSS parents via email (35,000+ households) +- Embedded as image in email β€” no link to click, it's right there +- Parents trust Peachjar (it's "from the school district") +- $25/school Γ— 55 schools = $1,375 for full district coverage, OR use the free tier (1 flyer/30 days, 25 schools max) + +**Execution:** +1. Register at Peachjar.com as "Community Organization" +2. Create a professional flyer: "Turn Your Child's Supply List Into a One-Click Amazon Cart β€” Free Service for SCCPSS Families" +3. Submit to district for approval (Kurt Hetager's office) +4. Select target schools (all elementary + K-8 schools first β€” those are supply-list-heavy) +5. Time it for late July 2027 (peak BTS shopping window) + +**Estimated reach:** 25-55 schools Γ— hundreds of parents each = 10,000-35,000 parents. + +**Cost:** $0 (free tier, first 25 schools) to $1,375 (full district, paid tier). + +### 2.4 Phase 2: Council Meeting β€” One Room, 50+ PTAs + +**What:** Get on the Savannah Chatham Council of PTAs meeting agenda. + +**Why this is the #2 channel:** +- Council meetings gather PTA presidents from 50+ local units +- One 10-minute presentation β†’ every PTA president hears the pitch +- Warm endorsement from council leadership cascades to every school +- Presidents make the decision β€” if they say yes, it's done + +**Execution:** +1. Find current council president via Georgia PTA District 6 Facebook page +2. Send a concise email: "Free fundraiser for all 50+ SCCPSS PTAs β€” 10 minutes on your next council meeting agenda" +3. Prepare 5-slide deck: problem (supply list hell), solution (CartMyList), PTA deal (free + $1/cart), demo, signup +4. Attend meeting, present, answer questions, collect emails + +**Estimated reach:** 50+ PTA presidents Γ— ~300 families each = 15,000 families. + +**Cost:** $0 (gas money for the meeting). + +### 2.5 Phase 3: Facebook Parent Groups β€” Direct to Parents + +**What:** Post in SCCPSS parent Facebook groups. + +**Known groups:** +- Parents of SCCPSS (facebook.com/groups/623536371870003) +- Individual school parent groups (every school has one) +- Savannah Moms groups +- Back-to-school Savannah groups + +**Execution:** +1. Join "Parents of SCCPSS" group +2. Post: "Parent here β€” I built a free tool that turns school supply lists into Amazon carts. Upload the PDF, get a one-click cart. No more Walmart trips. Thought other SCCPSS parents might want it. [link]" +3. This is Germaine posting as a parent, not a business β€” way more trusted +4. Promote PTA angle: "If your school's PTA signs up, the school earns $1/cart β€” free fundraiser" + +**Estimated reach:** 500-2,000 engaged parents per post cycle. + +**Cost:** $0. + +### 2.6 Phase 4: Board President Endorsement + +**What:** Get Roger Moss (SCCPSS Board President, roger.moss@sccpss.com) to endorse or at least not block it. + +**Why:** If the board president mentions CartMyList positively in a board meeting or newsletter, it's instant credibility. And Peachjar approval flows smoother with board awareness. + +**Execution:** +1. Germaine (as a SCCPSS parent of kids at STEM Bartlett) emails Roger Moss: "I built a free tool for SCCPSS parents that turns supply lists into Amazon carts. It's free for families and free for schools β€” PTAs actually earn money. Would love 5 minutes to show you." +2. Parent-to-board-president framing, not vendor-to-district + +**Cost:** $0. + +--- + +## 3. Email Messaging β€” PTA Outreach Sequences + +### 3.1 Cold Email to PTA Presidents (Template) + +**Subject:** Free fundraiser for [School Name] PTA β€” zero effort, $1 per family + +--- + +Hi [Name], + +I'm a SCCPSS parent (kids at STEM Bartlett). I built something that I think could help your PTA raise money with zero volunteer hours. + +**The problem:** Every summer, parents at [School Name] spend 2+ hours fighting Walmart crowds to buy school supplies from the teacher's list. It's miserable. + +**What I built:** CartMyList β€” upload the supply list PDF, get a one-click Amazon cart in 20 seconds. All 45 items, correctly matched, ready to buy. + +**The PTA deal (free):** +- CartMyList is **completely free for schools and PTAs** +- We donate **$1 per cart** back to your PTA β€” passive fundraiser +- You get a **branded portal** ([schoolname].cartmylist.com) with all grade-level supply lists pre-loaded +- You send **one email** to parents, post once on Facebook β€” that's it. No volunteers needed. + +If 100 families use it during back-to-school season, that's **$100 for your PTA** with zero bake sales, zero wrapping paper, zero effort. + +I'm rolling this out for the 2027 school year. Would you be open to a 10-minute call to see if this makes sense for [School Name]? + +Best, +Germaine Brown +SCCPSS Parent, STEM Bartlett +cartmylist.com + +--- + +### 3.2 Council Meeting Pitch Request (Template) + +**Subject:** 10 minutes at next council meeting β€” free fundraiser for all 50+ SCCPSS PTAs + +--- + +Hi [Council President Name], + +My name is Germaine Brown β€” I'm a SCCPSS parent and the founder of CartMyList, a tool that turns school supply lists into one-click Amazon carts. + +I'd love 10 minutes at your next Savannah Chatham Council of PTAs meeting to share something that can put money in every PTA's pocket with zero volunteer hours. + +**The short version:** +- CartMyList is **free for PTAs** β€” no cost, no catch +- PTAs earn **$1 per cart** parents create through their school portal +- One email to parents, one Facebook post β€” done. Passive income. +- A 500-student elementary school could earn $200-500 during back-to-school season without a single bake sale + +I've got a quick demo and a one-pager. Happy to come to any meeting, any time. + +Is there space on the agenda? + +Best, +Germaine Brown +SCCPSS Parent, STEM Bartlett +(912) [phone] +cartmylist.com + +--- + +### 3.3 Peachjar Flyer Text (Template) + +**Headline:** Turn Your Child's Supply List Into a One-Click Amazon Cart β€” Free for SCCPSS Families + +**Subhead:** Upload the PDF. Get a cart. Done in 20 seconds. + +**Body:** + +Stop fighting Walmart crowds. CartMyList reads your child's school supply list and builds a complete Amazon cart β€” all 45 items, correctly matched, ready to buy. + +**How it works:** +1. Go to cartmylist.com +2. Upload your child's supply list PDF +3. Get an Amazon cart with everything pre-loaded +4. One click buys it all β€” delivered to your door + +**Free for SCCPSS families.** No catch. No subscription. + +**PTA Fundraiser:** When your school's PTA signs up (free), they earn $1 per cart β€” passive income during back-to-school season. + +**Call to action:** cartmylist.com + +--- + +## 4. Talking Points & Elevator Pitch + +### 4.1 30-Second Elevator Pitch + +"You know the back-to-school supply list nightmare β€” 45 items, specific brands, 2 hours at Walmart with screaming kids. I built CartMyList: upload the PDF, we build a one-click Amazon cart in 20 seconds. It's free for parents. And if the PTA signs up β€” also free β€” they earn a dollar per cart. Zero effort fundraiser." + +### 4.2 Parent-Facing Talking Points + +- "Your kid's teacher already picked the exact items. Why hunt for them?" +- "The list has 45 items. We match 45 items. One click." +- "No subscription, no upsell, no catch. Upload the PDF, get the cart." +- "Amazon delivers. You keep your Saturday." +- "It's free. The PTA actually earns money when you use it." + +### 4.3 PTA-Facing Talking Points + +- **"Free passive fundraiser."** No volunteers, no inventory, no shipping. +- **"$1 per cart, straight to your PTA."** 100 families = $100. 500 = $500. During the 6-week BTS window. +- **"Branded portal for your school."** [yourschool].cartmylist.com, all grade-level lists pre-loaded. +- **"One email. One Facebook post."** That's the entire time commitment. +- **"We handle everything."** PDF parsing, Amazon matching, cart building, email delivery. You don't touch it. +- **"No risk."** It's free. If nobody uses it, you lose nothing. If they do, you earn. + +### 4.4 Board/District Talking Points + +- "This is a parent-built tool for SCCPSS parents." +- "It reduces the back-to-school burden on families β€” especially working parents and single-parent households." +- "It's free for families and free for schools. No cost to the district." +- "PTAs earn passive income β€” this fills the fundraising gap without competing with existing programs." + +--- + +## 5. Objection Handling + +| Objection | Response | +|-----------|----------| +| "We already have a school supply kit program." | "Those kits are $60-90 and don't match the teacher's exact list. CartMyList is free for parents and matches the specific brands the teacher asked for β€” Ticonderoga pencils, not generic." | +| "Is this really free?" | "Yes. Parents pay nothing. PTAs pay nothing. We earn a small Amazon commission on the cart β€” that's our business model." | +| "What if items are out of stock?" | "Our Family Plan finds the closest alternative. Even the free tier handles 95%+ of items." | +| "We don't have time to manage this." | "You don't manage it. We do. You send one email and one Facebook post. We handle everything else." | +| "Is this approved by the district?" | "It's a free community resource, same as any other parent tool. We're working through Peachjar for official distribution." | +| "What if Amazon changes how carts work?" | "The cart URL format has been stable for years. If it changes, we adapt β€” this is our only product, so we'd fix it fast." | + +--- + +## 6. Timeline β€” 2027 Back-to-School Blitz + +| Date | Action | Owner | +|------|--------|-------| +| **Aug 2026** | Soft launch β€” free tier live at cartmylist.com, collect parent emails | Germaine | +| **Sep-Oct 2026** | Build Stripe payment, user accounts, cart preview page | Germaine | +| **Jan 2027** | Identify council president, request council meeting slot | Germaine | +| **Feb 2027** | Present at Savannah Chatham Council of PTAs meeting | Germaine | +| **Mar 2027** | Follow up with interested PTAs, onboard 5-10 pilot schools | Germaine | +| **Apr 2027** | Create Peachjar flyer, submit for district approval | Germaine | +| **May 2027** | Facebook group posts, parent awareness campaign | Germaine | +| **Jun 2027** | Onboard remaining PTAs, get supply lists from teachers | PTAs | +| **Jul 2027** | Peachjar flyer goes live (peak BTS shopping), Facebook ad push | Germaine | +| **Aug 2027** | Full BTS season β€” track carts, payout PTAs, collect testimonials | Germaine | + +--- + +## 7. Metrics & Goals + +| Metric | Conservative | Target | Aggressive | +|--------|-------------|--------|------------| +| PTAs signed up | 5 | 15 | 30 | +| Schools with pre-loaded lists | 3 | 10 | 25 | +| Carts generated (Jul-Aug 2027) | 200 | 1,000 | 3,000 | +| PTA donations paid ($1/cart) | $200 | $1,000 | $3,000 | +| Parent email list (for 2028) | 100 | 500 | 2,000 | +| Revenue (service + commission) | $1,560 | $7,800 | $23,400 | + +--- + +## 8. What Needs to Happen First (Priority Order) + +1. **Register cartmylist.com** β€” $12, 10 minutes. Domain is the foundation. +2. **Build simple landing page** β€” cartmylist.com with demo, PTA section, and email signup. 4-6 hours. +3. **Identify council president** β€” DM Georgia District 6 PTA on Facebook, or ask J.G. Smith PTA (Germaine's kids' school) who runs the council. +4. **Build the School Plan portal tech** β€” multi-school branded portals, PTA signup, tracking per-school cart counts. ~40 hours (biggest dev lift). +5. **Create Peachjar flyer** β€” design, submit, get approved. 2-3 hours + $0-25/school. + +--- + +## 9. Appendix: Every SCCPSS School by District + +### District 1 (Denise Grabowski) +Ellis K-8, Heard Elementary, Hesse K-8, Isle of Hope K-8, J.G. Smith Elementary, Savannah Arts Academy HS, STEM Academy at Bartlett Middle School, White Bluff Elementary + +### District 2 (Vacant) +A.B. Williams Elementary, ELC-Henderson E. Formey, Hubert Middle School, Juliette Gordon Low ES, Jenkins High School, Myers Middle School, Savannah Classical Academy, Susie King Taylor Community School + +### District 3 (Cornelia Hall) +Gadsden Elementary, Garrison K-8, Johnson High School, Oglethorpe Charter School, Liberal Studies at Savannah High, Savannah Early College High School + +### District 4 (Shawn Kachmar) +Coastal Middle School, Islands High School, Marshpoint Elementary, May Howard Elementary, Tybee Island Maritime Academy + +### District 5 (Paul Smith) +Beach High School, Coastal Empire Montessori Charter, DeRenne Middle School, Haven Elementary, Hodge Elementary, Largo-Tibet Elementary, Pulaski Elementary + +### District 6 (David Bringman) +Georgetown K-8, Southwest Elementary, Southwest Middle School, Windsor Forest Elementary, Windsor Forest High School + +### District 7 (Stephanie Campbell) +Bloomingdale Elementary, Pooler Elementary, New Hampstead K-8, New Hampstead High School, West Chatham Elementary, West Chatham Middle School + +### District 8 (Tonia Howard-Hall) +Brock Elementary, Butler Elementary, Garden City Elementary, Godley Station K-8, Gould Elementary, Groves High School, Mercer Middle School, Rice Creek K-8, Woodville-Tompkins High School + +--- + +**Document prepared by:** Sho'Nuff Brown +**Next step:** Register cartmylist.com, build landing page, identify council president diff --git a/projects/schoolcart-pta-research.md b/projects/schoolcart-pta-research.md new file mode 100644 index 0000000..c1b76f4 --- /dev/null +++ b/projects/schoolcart-pta-research.md @@ -0,0 +1,123 @@ +# Chatham County PTA Landscape β€” Savannah, GA +# Compiled August 3, 2026 for CartMyList GTM + +## OVERVIEW +- **70+ PTA organizations** in the Savannah metro area (CauseIQ directory) +- **24 PTAs** actively using JoinTotem for membership management +- **49 SCCPSS schools** with school supply lists on sccpss.com +- **Savannah-Chatham Council of PTAs** is the umbrella org (Georgia PTA District 6) +- School year started **August 3, 2026** + +## COUNCIL LEADERSHIP +- **President (current):** Sandra Cason (per LinkedIn; also president in 2011-2012) + - LinkedIn: linkedin.com/in/sandra-cason-7740913b + - Also runs Farm to School program +- **President (2021 PDF):** Tina Kelly β€” sccoftas@gmail.com + - Georgia PTA account: SavannahChatham.D6@georgiapta.org +- **Council Facebook:** facebook.com/SavannahChathamPTA (1,206 likes) +- **Georgia PTA:** georgiapta.org, office@georgiapta.org, 404-659-0214 + +## ALL KNOWN PTAs ON JOINTOTEM (24 Total) +Each has a JoinTotem page at jointotem.com/ga/savannah/{slug} with "Join Now" β€” the membership form goes to PTA officers. + +### High Schools +| School | Type | Notes | +|--------|------|-------| +| Beach HS PTA | PTA | Generic template | +| Islands High School PTSA | PTSA | Generic template | +| Windsor Forest HS PTA | PTA | Generic template | +| Savannah Arts Academy PTSA | PTSA | Generic template | +| Savannah Early College High PTSA | PTSA | Generic template | + +### K-8 Schools +| School | Type | Notes | +|--------|------|-------| +| E F Garrison K-8 PTA | PTA | Your kids' school! Arts-focused. Generic template | +| Georgetown K-8 PTA | PTA | Has custom description | +| Hesse K-8 PTA | PTA | Generic template | +| CEMCS PTA (Coastal Empire Montessori) | PTA | Generic template | + +### Middle Schools +| School | Type | Notes | +|--------|------|-------| +| STEM Academy PTSA | PTSA | Your kids' school! "STEM based public Middle school, Choice program" | +| Coastal Middle School PTSA, Inc. | PTSA | Generic template | +| Southwest Middle PTSA | PTSA | Generic template | + +### Elementary Schools +| School | Type | Notes | +|--------|------|-------| +| **Jacob G Smith ES PTA** | PTA | Has **own website**: jacobgsmithpta.org (Squarespace). Your kids' former school | +| **May Howard ES PTA** | PTA | Has **own website**: mayhowardpta.weebly.com. Detailed description β€” raises money for curriculum, tech, teacher training, equipment | +| Butler ES PTA | PTA | Generic template | +| Carrie E. Gould ES PTA | PTA | Generic template | +| Ellis Montessori PTA | PTA | Has custom description | +| Gadsden ES PTA | PTA | Custom description: "excited about 2026-2027 School Year" | +| Garden City ES PTA | PTA | Generic template | +| Haven ES PTA | PTA | Generic template | +| Juliette Gordon Low ES PTA | PTA | Generic template | +| Marshpoint Elementary School PTA | PTA | Generic template | +| Virginia L Heard ES PTA | PTA | Custom description: "primary educational support organization providing resources" | +| WBES PTA (White Bluff ES) | PTA | Custom description: "make every child's potential a reality" | +| Windsor Forest ES PTA | PTA | Generic template | + +## ADDITIONAL PTAs KNOWN FROM CAUSEIQ (not on JoinTotem) +- Rice Creek PTSA (Port Wentworth) +- Robert W Gadsden ES PTA +- Mercer MS PTA +- Shuman ES PTA +- Jacob G Smith ES PTA +- Woodville Tompkins High PTSA +- Susie King Taylor Community PTA +- Savannah Classical Academy PTSA + +## SCCPSS SCHOOL SUPPLY LIST INFRASTRUCTURE +Every SCCPSS school has its own supply list page at {school}.sccpss.com. The district also aggregates them at: +- sccpss.com/families/back-to-school/supplies (2026-27 lists) + +This is the integration surface β€” each school's PDF list links directly to the product. + +## COMPETITION: TeacherLists.com +- **1M+ school supply lists** on their platform +- Partners: Amazon, Target, Walmart, Staples, Walgreens +- Free for schools and teachers +- Digitize supply lists and make them "shoppable" β€” but each item is individually shoppable, NOT one-click cart +- **CartMyList differentiator:** One Amazon cart link from a PDF upload. CartMyList competes on convenience, not list management. + +## GTM STRATEGY FOR PTA OUTREACH + +### Play 1: Council-Level Pitch +Go through Savannah-Chatham Council of PTAs (Sandra Cason). Position as a zero-effort fundraiser. Council endorses β†’ cascades to all 24+ local PTAs. + +### Play 2: School-by-School Direct +Use each school's supply list page as proof of concept. "I saw your supply list for 2026-27. Here's what it looks like as a one-click Amazon cart. Want this for your parents? Free for you, $1/cart to your PTA." + +### Play 3: Parent Ambassador +Your kids are at STEM Academy (PTSA member) and Garrison (PTA member). Start there β€” dogfood it with your own school supply lists. + +### Play 4: Back-to-School Timing +School started TODAY (Aug 3). The window is NOW β€” parents are actively buying supplies. Even a late entry with a "last-minute shopping" angle works. + +## DOMAIN AVAILABILITY (as of Aug 3, 2026) + +### AVAILABLE βœ… +| Domain | Verdict | +|--------|---------| +| **cartmylist.com** | Short, verb-driven, memorable. Top pick from Round 1 | +| **mylistcart.com** | Close variant, what-it-does naming | +| **listcart.co** | Shortest, clean | +| **quicklistcart.com** | Speed/value positioning | +| **collecthq.co** | Broader rebrand (from Round 2) | +| **submithub.co** | Broader rebrand (from Round 2) | +| **ptafund.co / ptafund.us** | PTA-specific fundraising angle | +| **fuelyourpta.com** | Bold, fundraising-focused | + +### TAKEN ❌ +orderport.com, orderport.io, cartflow.io, gatherhq.co, list2go.com, schoolcart.com, listporter.com, supplyporter.com, listbridge.com, cartbridge.co, supplylist.co + +## KEY CONTACT METHODS FOR PTAs +1. **JoinTotem "Join Now" buttons** β€” these submit to the PTA officers directly. Could use the membership form as a demo/dogfooding channel. +2. **Facebook pages** β€” Most schools have individual PTA Facebook pages. Search: "{School Name} PTA" on Facebook. +3. **School websites** β€” Each SCCPSS school has a site at {slug}.sccpss.com. Contact forms there reach the front office β†’ can forward to PTA. +4. **Georgia PTA office** β€” office@georgiapta.org / 404-659-0214 for council-level introductions. +5. **Council Facebook** β€” facebook.com/SavannahChathamPTA β€” 1,206 followers. Post or DM. diff --git a/projects/schoolcart.md b/projects/schoolcart.md index f516193..8558311 100644 --- a/projects/schoolcart.md +++ b/projects/schoolcart.md @@ -150,7 +150,7 @@ SchoolCart targets English-speaking US households with school-age children who a β”‚ Already built ↓ β”‚ To build ↓ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ PDF parser (proven) β”‚ Stripe payment gating β”‚ -β”‚ Amazon search (36/45 β”‚ Subscription tiers β”‚ +β”‚ Amazon search (36/45 β”‚ Family Plan tier logic β”‚ β”‚ matched in test) β”‚ School/PTA portal β”‚ β”‚ Cart URL generator β”‚ User accounts/auth β”‚ β”‚ Email delivery (SMTP) β”‚ Cart preview page β”‚ @@ -171,7 +171,7 @@ SchoolCart targets English-speaking US households with school-age children who a | Caddy reverse proxy | **Built** | shopping.iamgmb.com β†’ 127.0.0.1:8101 | | **Stripe payment** | **To build** | ~8 hours | | **User accounts** | **To build** | ~12 hours | -| **Subscription tiers** | **To build** | ~16 hours | +| **Family Plan tiers** | **To build** | ~12 hours | | **School/PTA portal** | **To build** | ~40 hours | | **Cart preview** | **To build** | ~8 hours | | **Analytics** | **To build** | ~4 hours | @@ -376,7 +376,7 @@ SchoolCart occupies the **high-convenience, low-price quadrant** that is current **Objective:** Build payment system, polish matching, prepare for 2027 BTS season. **Activities:** -- Build Stripe checkout for $4.99/$9.99 cart unlock + $19.99/yr Family Pass subscription +- Build Stripe checkout for $4.99/$14.99 cart unlock - Improve ASIN matching β€” multiple search attempts, brand-specific matching - Build cart preview page (show matched items before asking for payment) - Set up branded domain and landing page (cartmylist.com or similar) @@ -585,7 +585,7 @@ The biggest risk is that the pain of school supply shopping isn't painful enough | list2cart.com | ❌ Registered | Taken 2. **Stripe account** β€” use ITPP Stripe to launch, or create separate entity first? 3. **Company structure** β€” operate under IT Pro Partner, or new LLC? -4. **Pricing model** β€” confirmed as Quick Cart $4.99, Premium Cart $9.99 (named carts + multi-pass matching), Family Pass $19.99/yr (all kids, all year), School Plan FREE ($1/cart donated to PTA) +4. **Pricing model** β€” 3-tier: Quick Cart $4.99, Family Plan $14.99/season (30 days), School Plan FREE ($1/cart donated to PTA). No subscriptions β€” Family Plan has no auto-renewal. 5. **Timeline** β€” soft launch for August 2026 (free), or wait until 2027 BTS with full paid launch? ### 11.3 What Success Looks Like (Month 12 β€” August 2027)