Files
2026-06-09 18:31:59 +02:00

130 lines
5.7 KiB
JSON

{
"_doc": "Arising Media stack selector — agent reference. Choose the correct stack before starting any project.",
"_updated": "2026-05-21",
"stacks": {
"static-html": {
"name": "Static HTML",
"reference_project": "lahrcarpetcleaning.com",
"use_when": [
"Site has fewer than 50 pages",
"Content changes infrequently (monthly or less)",
"Client hosts on cPanel shared hosting with no server-side scripting",
"No database required"
],
"do_not_use_when": [
"Site has more than 50 pages",
"Content must be updated across many pages simultaneously",
"Lead capture forms require server-side validation",
"Site has location pages, service pages, or any programmatic content"
],
"files": ["Dockerfile", "nginx.conf", "docker-compose.yml", ".htaccess", ".cpanel.yml"],
"sops": ["01-project-structure.md", "03-build-pipeline.md", "08-deployment-docker.md"]
},
"php-router-sqlite": {
"name": "PHP Router + SQLite",
"reference_project": "arisingmedia.us",
"use_when": [
"Site has 50+ pages of any type",
"Multiple page classes share a common template (services, locations, blog)",
"Header/footer/nav updates must propagate instantly across all pages",
"Content is authored in a database or Airtable and pulled at render time",
"Site will grow — new pages added without new HTML files"
],
"do_not_use_when": [
"Client requires cPanel shared hosting with no PHP-FPM (rare)",
"Site is a pure landing page (1-3 pages)"
],
"architecture": {
"router": "src/api/router.php",
"templates": "src/api/templates/ — one .php file per page class",
"components": "src/api/components/_sections.php, _header.php, _footer.php",
"database": "src/api/data/pages.sqlite (all page content)",
"tokens": "src/assets/css/tokens.css",
"styles": "src/assets/css/main.css",
"js": "src/assets/js/main.js"
},
"page_classes": {
"service": "service.php — detailed service pages with value_prop, use_case_carousel, roi_band, lead_magnet, tiers",
"location": "location.php — city + service combination pages, map embed, local content",
"challenge": "challenge.php — problem definition + our approach + CTA",
"static": "static.php — about, contact, hub pages, case studies",
"blog": "blog.php — blog posts with author, date, related posts",
"category": "category.php — service hub pages"
},
"sops": ["15-php-router-sqlite-standard.md"],
"design_reference": "arisingmedia.us/.planning/WEBSITE_BUILD_STANDARD.md",
"architecture_diagram": "arisingmedia.us/.planning/RENDER_ARCHITECTURE.html",
"approved_mockup": "arisingmedia.us/.planning/template-gallery-2026-05-20/mockup.html"
},
"php-app": {
"name": "PHP App Stack",
"reference_project": "quickconvert.us",
"use_when": [
"File uploads and server-side processing required",
"At-rest encryption of user data",
"Payment processing (Stripe subscriptions)",
"User authentication"
],
"sops": ["14-php-app-stack.md"]
}
},
"design_system": {
"fonts": ["Plus Jakarta Sans (display)", "Inter (body)"],
"approved_colors": {
"cobalt_deep": "#021a6a",
"cobalt": "#042fac",
"cobalt_light": "#5d78c9",
"navy": "#172034",
"footer": "#0f1626",
"slate": "#1c2c44",
"graphite": "#222f42",
"blue": "#1e6bd6",
"facet": "#6b82b2",
"stone": "#eef1f6",
"white": "#ffffff"
},
"rejected_colors": {
"teal": "never use — not brand",
"mist": "#f8f9fb — eliminated from band rhythm 2026-05-21",
"angled_edges": "clip-path diagonals rejected — tech brands use flat horizontal lines"
},
"band_rhythm": ["graphite", "light", "slate", "stone"],
"statement_type": "clamp(40px, 6.5vw, 96px)",
"section_padding_desktop": "120px",
"credibility_pattern": "proof numbers in dark grid band (IBM/Nvidia) — NOT generic icon logos"
},
"section_types": {
"available": ["text", "split", "pain", "process", "spotlight", "benefits", "faqs", "grid", "comparison", "testimonials", "stats", "cta", "pin_story", "tiers", "value_prop", "use_case_carousel", "roi_band", "lead_magnet"],
"v4_schema_columns": ["hero_value_proposition", "lead_magnet_json", "use_case_carousel_json", "roi_proof_json", "service_variant_strategy_json"],
"deprecated": ["grid — replaced by use_case_carousel when cases are populated", "mist band — eliminated from rhythm"]
},
"databases": {
"sqlite": {
"role": "Primary rendering database — exact slug lookups, structured content",
"suitable_up_to": "Millions of rows — 10,000 pages is tiny (5MB)",
"query_time": "< 1ms for slug lookup",
"file": "src/api/data/pages.sqlite"
},
"chromadb": {
"role": "Future semantic layer — related content, site search, content generation grounding",
"not_suitable_for": "Primary rendering — no exact-match primary key lookup",
"status": "Planned — future phase after all content is in SQLite"
}
},
"deployment": {
"container": "am-web (Docker)",
"local_port": 8001,
"db_path_in_container": "/var/www/data/pages.sqlite",
"assets_path": "/var/www/html/assets/",
"hot_copy_db": "docker cp src/api/data/pages.sqlite am-web:/var/www/data/pages.sqlite && docker exec am-web sh -c 'rm -f /var/www/data/pages.sqlite-shm /var/www/data/pages.sqlite-wal && chown www-data:www-data /var/www/data/pages.sqlite'",
"hot_copy_assets": "docker cp src/assets/css/main.css am-web:/var/www/html/assets/css/main.css"
}
}