From 7c088e57d84e120bd9a35d0288e2873179012193 Mon Sep 17 00:00:00 2001 From: Mike Swanson Date: Fri, 20 Mar 2026 05:49:52 -0700 Subject: [PATCH] Session log: Flarum theme v2, Matomo analytics, Cloudflare proxy re-enabled - Redesigned community forum CSS for readability (GitHub Dark inspired) - Installed Matomo 5.8.0 at analytics.azcomputerguru.com - Added tracking to all 3 sites (WordPress, Flarum, Astro) - Re-enabled Cloudflare proxy on community, radio, analytics subdomains - Fixed analytics DNS record (was pointing to wrong IP) Co-Authored-By: Claude Opus 4.6 (1M context) --- credentials.md | 19 + projects/community-forum/theme-v2.less | 958 +++++++++++++++++++++++++ session-logs/2026-03-20-session.md | 129 ++++ 3 files changed, 1106 insertions(+) create mode 100644 projects/community-forum/theme-v2.less create mode 100644 session-logs/2026-03-20-session.md diff --git a/credentials.md b/credentials.md index 9805c12..095fba8 100644 --- a/credentials.md +++ b/credentials.md @@ -1346,6 +1346,25 @@ net use T: \\192.168.0.9\test - **AD2 has SMB1 disabled for security (post crypto-attack)** - **All production credentials should be rotated regularly** +### Matomo Analytics (analytics.azcomputerguru.com) +- **Service:** Self-hosted web analytics (Matomo 5.8.0) +- **URL:** https://analytics.azcomputerguru.com +- **Server:** IX (172.16.3.10), cPanel account `azcomputerguru` +- **Document Root:** `/home/azcomputerguru/public_html/analytics/` +- **Admin User:** MikeSwanson +- **Admin Password:** Mat0mo2026!CGS +- **Admin Email:** mike@azcomputerguru.com +- **DB Host:** localhost (on IX server) +- **DB Name:** azcompu_matomo +- **DB User:** azcompu_matomo +- **DB Password:** Mat0mo2026!CGS +- **Site ID 1:** AZ Computer Guru (azcomputerguru.com) - tracked via WP mu-plugin +- **Site ID 2:** Community Forum (community.azcomputerguru.com) - tracked via Flarum custom_header +- **Site ID 3:** Radio Show (radio.azcomputerguru.com) - tracked via HTML injection +- **Cron:** Every 5 min, `azcomputerguru` user, archive reports +- **Cloudflare:** Proxied (orange cloud), DNS A record to 72.194.62.5 +- **Installed:** 2026-03-20 + --- ## Context Recovery Usage diff --git a/projects/community-forum/theme-v2.less b/projects/community-forum/theme-v2.less new file mode 100644 index 0000000..6f5d574 --- /dev/null +++ b/projects/community-forum/theme-v2.less @@ -0,0 +1,958 @@ +/* ═══════════════════════════════════════════════════════════ + THE COMPUTER GURU SHOW COMMUNITY — Theme v2 + Redesigned for readability. Inspired by GitHub Dark / Discord. + Font: Lexend | Accent: #fe7400 | Base: layered grays + ═══════════════════════════════════════════════════════════ */ + +@import url('https://fonts.googleapis.com/css2?family=Lexend:wght@100..900&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap'); + +:root { + /* ── Accent ──────────────────────────────────────── */ + --g-orange: #fe7400; + --g-orange-hover: #ff8c2a; + --g-orange-muted: #e06800; + --g-orange-glow: rgba(254, 116, 0, 0.15); + --g-orange-subtle: rgba(254, 116, 0, 0.08); + + /* ── Surfaces (layered, each step clearly distinct) ── */ + --g-base: #0d1117; /* page background */ + --g-surface-1: #161b22; /* cards, posts */ + --g-surface-2: #1c2129; /* hover state, elevated */ + --g-surface-3: #21262d; /* active/selected */ + --g-overlay: #2d333b; /* dropdowns, modals */ + + /* ── Borders ─────────────────────────────────────── */ + --g-border: #30363d; + --g-border-light: #3d444d; + --g-border-active: #fe7400; + + /* ── Text (WCAG AA against surface-1) ────────────── */ + --g-text-primary: #e6edf3; /* 13.5:1 on surface-1 */ + --g-text-secondary: #9eaab6; /* 6.2:1 on surface-1 */ + --g-text-muted: #6e7a86; /* 3.8:1 on surface-1 */ + --g-text-link: #fe7400; + --g-text-bright: #ffffff; + + /* ── Functional ──────────────────────────────────── */ + --g-success: #3fb950; + --g-danger: #f85149; + --g-warning: #d29922; + + /* ── Radii / Shadows / Motion ────────────────────── */ + --g-radius: 8px; + --g-radius-lg: 12px; + --g-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3); + --g-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4); + --g-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.5); + --g-ease: cubic-bezier(0.4, 0, 0.2, 1); +} + + +/* ══════════════════════════════════════════════════════ + GLOBAL FOUNDATION + ══════════════════════════════════════════════════════ */ + +body, .App { + font-family: 'Lexend', -apple-system, BlinkMacSystemFont, sans-serif !important; + background: var(--g-base) !important; + color: var(--g-text-primary) !important; + min-height: 100vh; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + + +/* ══════════════════════════════════════════════════════ + HEADER + ══════════════════════════════════════════════════════ */ + +.Header { + background: var(--g-surface-1) !important; + border-bottom: 1px solid var(--g-border) !important; + box-shadow: var(--g-shadow-sm) !important; +} + +.Header-title { + font-weight: 700 !important; + font-size: 1.2em !important; + letter-spacing: -0.02em !important; +} + +.Header-title a { + color: var(--g-text-primary) !important; + text-decoration: none !important; + transition: color 0.2s var(--g-ease) !important; +} + +.Header-title a:hover { + color: var(--g-orange) !important; +} + +/* Header nav buttons */ +.Header-controls .Button { + color: var(--g-text-secondary) !important; + font-weight: 500 !important; + border-radius: var(--g-radius) !important; + transition: all 0.2s var(--g-ease) !important; +} + +.Header-controls .Button:hover { + color: var(--g-text-primary) !important; + background: var(--g-surface-2) !important; +} + +/* Sign Up button */ +.Header .Button--primary, +.LogInModal .Button--primary, +.SignUpModal .Button--primary { + background: var(--g-orange) !important; + color: #fff !important; + border: none !important; + border-radius: var(--g-radius) !important; + font-weight: 600 !important; + font-size: 0.85em !important; + padding: 8px 18px !important; + box-shadow: 0 1px 4px rgba(254, 116, 0, 0.25) !important; + transition: all 0.2s var(--g-ease) !important; +} + +.Header .Button--primary:hover, +.LogInModal .Button--primary:hover, +.SignUpModal .Button--primary:hover { + background: var(--g-orange-hover) !important; + box-shadow: 0 3px 12px rgba(254, 116, 0, 0.35) !important; + transform: translateY(-1px) !important; +} + +/* Log In button */ +.Header .LogInButton, +.Header .Button:not(.Button--primary) { + color: var(--g-text-secondary) !important; +} + +.Header .LogInButton:hover, +.Header .Button:not(.Button--primary):hover { + color: var(--g-text-primary) !important; +} + + +/* ══════════════════════════════════════════════════════ + HERO / WELCOME BANNER + ══════════════════════════════════════════════════════ */ + +.Hero { + background: var(--g-surface-1) !important; + border-bottom: 1px solid var(--g-border) !important; + text-align: center !important; + padding: 2.5rem 2rem !important; + position: relative; + overflow: hidden; +} + +/* Subtle accent glow behind hero */ +.Hero::before { + content: ''; + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + width: 600px; + height: 100%; + background: radial-gradient(ellipse, rgba(254, 116, 0, 0.06) 0%, transparent 70%); + pointer-events: none; +} + +.Hero .container { + position: relative; + z-index: 1; +} + +.Hero-title { + font-weight: 800 !important; + font-size: 2em !important; + letter-spacing: -0.03em !important; + color: var(--g-text-bright) !important; +} + +.Hero-subtitle, +.Hero .container p { + color: var(--g-text-secondary) !important; + font-weight: 400 !important; + font-size: 1.05em !important; + max-width: 580px; + margin: 0.5em auto 0; + line-height: 1.6 !important; +} + +/* Hide welcome banner dismiss X */ +.Hero .Button--icon { + color: var(--g-text-muted) !important; +} + +.Hero .Button--icon:hover { + color: var(--g-text-primary) !important; +} + + +/* ══════════════════════════════════════════════════════ + SIDEBAR / NAVIGATION + ══════════════════════════════════════════════════════ */ + +.IndexPage-nav, +.sideNav { + background: transparent !important; +} + +.SideNav .Button { + color: var(--g-text-secondary) !important; + border-radius: var(--g-radius) !important; + transition: all 0.15s var(--g-ease) !important; + font-weight: 500 !important; +} + +.SideNav .Button:hover { + color: var(--g-text-primary) !important; + background: var(--g-surface-2) !important; +} + +.SideNav .Button.active { + color: var(--g-text-bright) !important; + background: var(--g-surface-3) !important; + border-left: 3px solid var(--g-orange) !important; + font-weight: 600 !important; +} + +/* Tags in nav bar */ +.SideNav a, +.TagLinkButton { + color: var(--g-text-secondary) !important; + font-size: 0.9em !important; +} + +.SideNav a:hover, +.TagLinkButton:hover { + color: var(--g-text-primary) !important; +} + +.SideNav .icon, +.SideNav .Button .icon { + opacity: 0.85 !important; +} + +.TagLinkButton .TagLabel-text { + color: inherit !important; +} + +/* Start Discussion button */ +.IndexPage-newDiscussion .Button, +.IndexPage-toolbar .Button--primary { + background: var(--g-orange) !important; + color: #fff !important; + font-weight: 700 !important; + border: none !important; + border-radius: var(--g-radius) !important; + padding: 10px 20px !important; + box-shadow: 0 1px 4px rgba(254, 116, 0, 0.2) !important; + transition: all 0.2s var(--g-ease) !important; +} + +.IndexPage-newDiscussion .Button:hover, +.IndexPage-toolbar .Button--primary:hover { + background: var(--g-orange-hover) !important; + box-shadow: 0 3px 12px rgba(254, 116, 0, 0.3) !important; + transform: translateY(-1px) !important; +} + + +/* ══════════════════════════════════════════════════════ + DISCUSSION LIST + ══════════════════════════════════════════════════════ */ + +.DiscussionList { + background: transparent !important; +} + +.DiscussionListItem { + background: var(--g-surface-1) !important; + border: 1px solid var(--g-border) !important; + border-radius: var(--g-radius) !important; + margin-bottom: 6px !important; + transition: all 0.15s var(--g-ease) !important; +} + +.DiscussionListItem:hover { + background: var(--g-surface-2) !important; + border-color: var(--g-border-light) !important; +} + +.DiscussionListItem-content { + padding: 14px 18px !important; +} + +/* Discussion titles — high contrast */ +.DiscussionListItem-title { + font-weight: 600 !important; + font-size: 1.02em !important; +} + +.DiscussionListItem-title a { + color: var(--g-text-primary) !important; + text-decoration: none !important; + transition: color 0.15s var(--g-ease) !important; +} + +.DiscussionListItem-title a:hover { + color: var(--g-orange) !important; +} + +/* Discussion meta — clearly secondary but readable */ +.DiscussionListItem-info, +.DiscussionListItem-info a, +.DiscussionListItem time { + color: var(--g-text-muted) !important; +} + +.DiscussionListItem .username { + color: var(--g-orange) !important; + font-weight: 600 !important; +} + +/* Reply count */ +.DiscussionListItem-count { + color: var(--g-text-secondary) !important; +} + +.DiscussionListItem-count strong { + color: var(--g-text-primary) !important; +} + +/* Sort dropdown */ +.IndexPage-toolbar .Button { + color: var(--g-text-secondary) !important; + border: 1px solid var(--g-border) !important; + background: var(--g-surface-1) !important; + border-radius: var(--g-radius) !important; +} + +.IndexPage-toolbar .Button:hover { + color: var(--g-text-primary) !important; + border-color: var(--g-border-light) !important; + background: var(--g-surface-2) !important; +} + +/* Refresh button */ +.IndexPage-toolbar .Button--icon { + color: var(--g-text-muted) !important; + border: none !important; + background: transparent !important; +} + +.IndexPage-toolbar .Button--icon:hover { + color: var(--g-text-primary) !important; +} + + +/* ══════════════════════════════════════════════════════ + TAGS / BADGES + ══════════════════════════════════════════════════════ */ + +.TagLabel { + border-radius: 16px !important; + font-weight: 600 !important; + font-size: 0.72em !important; + text-transform: uppercase !important; + letter-spacing: 0.04em !important; + padding: 3px 10px !important; +} + +.Badge { + border-radius: 50% !important; +} + + +/* ══════════════════════════════════════════════════════ + DISCUSSION PAGE + ══════════════════════════════════════════════════════ */ + +.DiscussionPage-discussion { + background: transparent !important; +} + +.DiscussionHero { + background: var(--g-surface-1) !important; + border-bottom: 1px solid var(--g-border) !important; + padding: 2rem 0 !important; +} + +.DiscussionHero-title { + font-weight: 800 !important; + font-size: 1.7em !important; + letter-spacing: -0.02em !important; + color: var(--g-text-bright) !important; +} + +/* ── Posts ──────────────────────────────────────────── */ + +.PostStream-item { + border: none !important; +} + +.Post { + background: var(--g-surface-1) !important; + border: 1px solid var(--g-border) !important; + border-radius: var(--g-radius-lg) !important; + margin-bottom: 12px !important; + overflow: hidden; +} + +.Post-header { + padding: 14px 20px 0 !important; +} + +.Post-header, +.Post-header a, +.Post-header time { + color: var(--g-text-muted) !important; +} + +.Post-header .username, +.Post-header .username a { + color: var(--g-orange) !important; + font-weight: 600 !important; +} + +.Post-body { + padding: 14px 20px 20px !important; + font-size: 0.95em !important; + line-height: 1.75 !important; +} + +.Post-body, +.Post-body p, +.Post-body li { + color: var(--g-text-primary) !important; +} + +/* ── Post typography ───────────────────────────────── */ + +.Post-body h2 { + color: var(--g-text-bright) !important; + font-weight: 700 !important; + font-size: 1.35em !important; + margin-top: 1.8em !important; + margin-bottom: 0.5em !important; + padding-bottom: 0.3em !important; + border-bottom: 1px solid var(--g-border) !important; +} + +.Post-body h3 { + color: var(--g-text-primary) !important; + font-weight: 600 !important; + font-size: 1.12em !important; + margin-top: 1.4em !important; +} + +.Post-body a { + color: var(--g-orange) !important; + text-decoration: none !important; + transition: color 0.15s var(--g-ease) !important; +} + +.Post-body a:hover { + color: var(--g-orange-hover) !important; + text-decoration: underline !important; +} + +.Post-body strong { + color: var(--g-text-bright) !important; + font-weight: 600 !important; +} + +/* Inline code */ +.Post-body code { + background: rgba(254, 116, 0, 0.08) !important; + color: var(--g-orange-hover) !important; + padding: 2px 6px !important; + border-radius: 4px !important; + font-family: 'JetBrains Mono', 'Fira Code', monospace !important; + font-size: 0.87em !important; + border: 1px solid rgba(254, 116, 0, 0.12) !important; +} + +/* Code blocks */ +.Post-body pre { + background: var(--g-base) !important; + border: 1px solid var(--g-border) !important; + border-left: 3px solid var(--g-orange) !important; + border-radius: var(--g-radius) !important; + padding: 16px 20px !important; + overflow-x: auto !important; + margin: 1.2em 0 !important; +} + +.Post-body pre code { + background: none !important; + border: none !important; + padding: 0 !important; + color: var(--g-text-primary) !important; + font-size: 0.85em !important; + line-height: 1.6 !important; +} + +/* Blockquotes */ +.Post-body blockquote { + border-left: 3px solid var(--g-orange) !important; + background: var(--g-orange-subtle) !important; + padding: 10px 18px !important; + margin: 1em 0 !important; + border-radius: 0 var(--g-radius) var(--g-radius) 0 !important; + color: var(--g-text-secondary) !important; +} + +.Post-body hr { + border: none !important; + height: 1px !important; + background: var(--g-border) !important; + margin: 1.8em 0 !important; +} + +.Post-body ul, .Post-body ol { + color: var(--g-text-primary) !important; + padding-left: 1.5em !important; +} + +.Post-body li { + margin-bottom: 0.35em !important; +} + + +/* ══════════════════════════════════════════════════════ + COMPOSER + ══════════════════════════════════════════════════════ */ + +.Composer { + background: var(--g-surface-1) !important; + border-top: 1px solid var(--g-border) !important; + box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.3) !important; +} + +.TextEditor-editor, +.TextEditor textarea { + background: var(--g-base) !important; + color: var(--g-text-primary) !important; + border: 1px solid var(--g-border) !important; + border-radius: var(--g-radius) !important; + font-family: 'JetBrains Mono', monospace !important; +} + +.TextEditor-editor:focus, +.TextEditor textarea:focus { + border-color: var(--g-orange) !important; + box-shadow: 0 0 0 2px var(--g-orange-glow) !important; +} + + +/* ══════════════════════════════════════════════════════ + MODALS + ══════════════════════════════════════════════════════ */ + +.Modal-content { + background: var(--g-overlay) !important; + border: 1px solid var(--g-border) !important; + border-radius: var(--g-radius-lg) !important; + box-shadow: var(--g-shadow-lg) !important; + color: var(--g-text-primary) !important; +} + +.Modal-header { + background: var(--g-surface-3) !important; + border-bottom: 1px solid var(--g-border) !important; + border-radius: var(--g-radius-lg) var(--g-radius-lg) 0 0 !important; +} + +.Modal-header h3 { + color: var(--g-text-bright) !important; +} + +.Modal .Form-group input, +.Modal .Form-group textarea { + background: var(--g-base) !important; + border: 1px solid var(--g-border) !important; + color: var(--g-text-primary) !important; + border-radius: var(--g-radius) !important; +} + +.Modal .Form-group input:focus, +.Modal .Form-group textarea:focus { + border-color: var(--g-orange) !important; + box-shadow: 0 0 0 2px var(--g-orange-glow) !important; +} + +.Modal .Form-group label { + color: var(--g-text-secondary) !important; +} + + +/* ══════════════════════════════════════════════════════ + BUTTONS (GLOBAL) + ══════════════════════════════════════════════════════ */ + +.Button { + border-radius: var(--g-radius) !important; + transition: all 0.15s var(--g-ease) !important; + font-weight: 500 !important; +} + +.Button--primary { + background: var(--g-orange) !important; + color: #fff !important; + border: none !important; + font-weight: 600 !important; +} + +.Button--primary:hover { + background: var(--g-orange-hover) !important; + transform: translateY(-1px) !important; +} + + +/* ══════════════════════════════════════════════════════ + FORM ELEMENTS + ══════════════════════════════════════════════════════ */ + +input[type="text"], +input[type="email"], +input[type="password"], +textarea, +select { + background: var(--g-base) !important; + border: 1px solid var(--g-border) !important; + color: var(--g-text-primary) !important; + border-radius: var(--g-radius) !important; + transition: border-color 0.15s var(--g-ease) !important; +} + +input[type="text"]:focus, +input[type="email"]:focus, +input[type="password"]:focus, +textarea:focus { + border-color: var(--g-orange) !important; + box-shadow: 0 0 0 2px var(--g-orange-glow) !important; + outline: none !important; +} + + +/* ══════════════════════════════════════════════════════ + DROPDOWN MENUS + ══════════════════════════════════════════════════════ */ + +.Dropdown-menu { + background: var(--g-overlay) !important; + border: 1px solid var(--g-border) !important; + border-radius: var(--g-radius) !important; + box-shadow: var(--g-shadow-md) !important; +} + +.Dropdown-menu li > a, +.Dropdown-menu li > button, +.Dropdown-menu li > span { + color: var(--g-text-primary) !important; +} + +.Dropdown-menu li > a:hover, +.Dropdown-menu li > button:hover { + background: var(--g-surface-3) !important; + color: var(--g-orange) !important; +} + + +/* ══════════════════════════════════════════════════════ + SEARCH + ══════════════════════════════════════════════════════ */ + +.Search-input input { + background: var(--g-surface-2) !important; + border: 1px solid var(--g-border) !important; + color: var(--g-text-primary) !important; + border-radius: 20px !important; +} + +.Search-input input::placeholder { + color: var(--g-text-muted) !important; +} + +.Search-input input:focus { + border-color: var(--g-orange) !important; + background: var(--g-surface-1) !important; +} + +.Search-results { + background: var(--g-overlay) !important; + border: 1px solid var(--g-border) !important; + border-radius: var(--g-radius) !important; +} + + +/* ══════════════════════════════════════════════════════ + TAGS PAGE + ══════════════════════════════════════════════════════ */ + +.TagTile { + background: var(--g-surface-1) !important; + border: 1px solid var(--g-border) !important; + border-radius: var(--g-radius-lg) !important; + transition: all 0.15s var(--g-ease) !important; +} + +.TagTile:hover { + background: var(--g-surface-2) !important; + border-color: var(--g-border-light) !important; + transform: translateY(-1px) !important; + box-shadow: var(--g-shadow-md) !important; +} + +.TagTile-name { + color: var(--g-text-primary) !important; + font-weight: 700 !important; +} + +.TagTile-description { + color: var(--g-text-secondary) !important; + font-size: 0.85em !important; +} + + +/* ══════════════════════════════════════════════════════ + NOTIFICATIONS + ══════════════════════════════════════════════════════ */ + +.NotificationList { + background: var(--g-overlay) !important; + border: 1px solid var(--g-border) !important; +} + + +/* ══════════════════════════════════════════════════════ + AVATARS + ══════════════════════════════════════════════════════ */ + +.Avatar { + border-radius: var(--g-radius) !important; +} + + +/* ══════════════════════════════════════════════════════ + LOADING + ══════════════════════════════════════════════════════ */ + +.LoadingIndicator-container { + color: var(--g-orange) !important; +} + +/* Hide stuck loading bar */ +.App > .loading-indicator { + display: none !important; +} + + +/* ══════════════════════════════════════════════════════ + ALERTS + ══════════════════════════════════════════════════════ */ + +.Alert { + border-radius: var(--g-radius) !important; +} + +.Alert--success { + background: rgba(63, 185, 80, 0.12) !important; + border: 1px solid rgba(63, 185, 80, 0.25) !important; + color: #56d364 !important; +} + + +/* ══════════════════════════════════════════════════════ + SCROLLBAR + ══════════════════════════════════════════════════════ */ + +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: var(--g-base); +} + +::-webkit-scrollbar-thumb { + background: var(--g-border); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--g-border-light); +} + + +/* ══════════════════════════════════════════════════════ + FOOTER & MISC + ══════════════════════════════════════════════════════ */ + +.App-footer { + color: var(--g-text-muted) !important; + padding: 2rem 0 !important; +} + +.container { + max-width: 1100px !important; +} + +/* Empty state */ +.DiscussionList-empty, +.Placeholder { + color: var(--g-text-secondary) !important; +} + +/* Selection */ +::selection { + background: var(--g-orange) !important; + color: #fff !important; +} + + +/* ══════════════════════════════════════════════════════ + RESPONSIVE + ══════════════════════════════════════════════════════ */ + +@media (max-width: 768px) { + .Hero-title { font-size: 1.4em !important; } + .DiscussionHero-title { font-size: 1.3em !important; } + .Post-body { padding: 12px 14px 14px !important; } +} + + +/* ══════════════════════════════════════════════════════ + FLARUM BASE OVERRIDES + These target elements where Flarum's default CSS + applies dark text colors meant for light themes. + ══════════════════════════════════════════════════════ */ + +/* Global heading reset — Flarum sets h1-h6 to near-black */ +h1, h2, h3, h4, h5, h6 { + color: var(--g-text-primary) !important; +} + +/* Discussion list — the main link wrapper */ +.DiscussionListItem-main { + color: var(--g-text-primary) !important; +} + +.DiscussionListItem-main:hover { + color: var(--g-text-primary) !important; +} + +/* Discussion title heading inside the list */ +.DiscussionListItem-title h2, +.DiscussionListItem-title h3, +.DiscussionListItem .DiscussionListItem-title { + color: var(--g-text-primary) !important; +} + +/* All links inside discussion list items */ +.DiscussionListItem a { + color: var(--g-text-primary) !important; + transition: color 0.15s var(--g-ease) !important; +} + +.DiscussionListItem a:hover { + color: var(--g-orange) !important; +} + +/* Keep username orange */ +.DiscussionListItem .username, +.DiscussionListItem .username a { + color: var(--g-orange) !important; +} + +/* Tag labels keep their own colors */ +.DiscussionListItem .TagLabel a { + color: inherit !important; +} + +/* Generic link color for the whole app */ +a { + color: var(--g-text-secondary) !important; +} + +a:hover { + color: var(--g-text-primary) !important; +} + +/* But keep orange for primary/accent links */ +.Post-body a, +.DiscussionHero a { + color: var(--g-orange) !important; +} + +/* Navigation bar items */ +.IndexPage-toolbar, +.IndexPage-results { + color: var(--g-text-primary) !important; +} + +/* Ensure all text in the app is readable */ +.App-content { + color: var(--g-text-primary) !important; +} + +/* Fix the stuck loading bar */ +.App > .loading-indicator, +.loading-indicator { + display: none !important; +} + +/* Discussion hero info text */ +.DiscussionHero-items, +.DiscussionHero-items li, +.DiscussionHero .item-tags { + color: var(--g-text-secondary) !important; +} + +/* ── Sidebar spacing fixes ─────────────────────────── */ + +/* Reduce top margin on sidebar list */ +.IndexPage-nav > ul { + margin-top: 15px !important; +} + +/* Tighter padding on sidebar links */ +.IndexPage-nav .Dropdown-menu li > a, +.IndexPage-nav .Dropdown-menu li > button { + padding-top: 5px !important; + padding-bottom: 5px !important; +} + +/* Reduce separator gap */ +.IndexPage-nav .Dropdown-separator { + margin-top: 5px !important; + margin-bottom: 5px !important; +} + +/* Tighter bottom margin on Start a Discussion */ +.IndexPage-nav .item-newDiscussion { + margin-bottom: 12px !important; +} + +/* Reduce gap below nav dropdown container */ +.IndexPage-nav .item-nav { + margin-bottom: 5px !important; +} + +/* Add left padding to sidebar items */ +.IndexPage-nav .Dropdown-menu { + padding-left: 10px !important; +} + +.IndexPage-nav > ul { + padding-left: 10px !important; +} diff --git a/session-logs/2026-03-20-session.md b/session-logs/2026-03-20-session.md new file mode 100644 index 0000000..7a27fb8 --- /dev/null +++ b/session-logs/2026-03-20-session.md @@ -0,0 +1,129 @@ +# Session Log: 2026-03-20 + +## Session Summary + +Continued work on azcomputerguru.com web properties. Three major accomplishments: +1. **Flarum community forum theme redesign** - Complete CSS rewrite for readability (v1 → v2) +2. **Matomo analytics setup** - Self-hosted analytics installed and tracking all 3 sites +3. **Cloudflare proxy re-enabled** - community, radio, and analytics subdomains back to orange cloud + +## Work Completed + +### 1. Flarum Forum Theme v2 (community.azcomputerguru.com) + +**Problem:** The v1 theme had severe readability issues - dark text on dark backgrounds, discussion titles nearly invisible, overall muddy appearance. + +**Root Cause:** Flarum's base CSS applies near-black heading colors (`rgb(17,17,17)`) and dark link colors meant for light themes. The v1 custom LESS used CSS variables (`var()`) and `!important` but Flarum's compiled CSS had higher specificity on key elements like `h2`, `.DiscussionListItem-main`. + +**Solution:** Complete theme rewrite (v2) with: +- Replaced transparent navy overlays with **solid, layered gray surfaces** (GitHub Dark inspired) +- Color palette: `--g-base: #0d1117`, `--g-surface-1: #161b22`, `--g-surface-2: #1c2129`, etc. +- Text: `--g-text-primary: #e6edf3` (13.5:1 contrast ratio on surface-1) +- Added "Flarum Base Overrides" section targeting actual DOM elements (`h1-h6`, `.DiscussionListItem-main`, `.DiscussionListItem a`) +- Fixed sidebar spacing (reduced padding from 8px to 5px, separator margins from 8px to 5px) +- Added 10px left padding to sidebar nav items + +**Theme file:** `/home/guru/ClaudeTools/projects/community-forum/theme-v2.less` +**Stored in:** Flarum DB `settings.custom_less` +**Backup of v1:** `/tmp/theme-v1-backup.less` on IX server + +**Key lesson:** Flarum's LESS compiler caches aggressively. To force recompile: +1. Delete `public/assets/forum.css` and `rev-manifest.json` +2. Clear `storage/cache/*`, `storage/less-cache/*`, `storage/framework/cache/*` +3. Run `php flarum cache:clear` +4. Hit the site from an external client to trigger lazy CSS compilation +5. Hard refresh browser (`Ctrl+Shift+R`) + +### 2. Matomo Analytics (analytics.azcomputerguru.com) + +**Installed:** Matomo 5.8.0 on IX server + +**Setup steps:** +- DNS record for `analytics.azcomputerguru.com` was pointing to wrong IP (52.52.94.202) — updated to 72.194.62.5 +- Matomo files extracted to `/home/azcomputerguru/public_html/analytics/` +- Had to create `.htaccess` file (not included in Matomo zip for hidden files) +- Had to fix directory permissions (`chmod 755` on analytics dir) +- Web installer completed: system check, database, tables, superuser, first website, tracking code + +**Sites configured:** +| Site ID | Name | URL | Tracking Method | +|---------|------|-----|-----------------| +| 1 | AZ Computer Guru | https://azcomputerguru.com | WordPress mu-plugin (`wp-content/mu-plugins/matomo-tracking.php`) | +| 2 | Community Forum | https://community.azcomputerguru.com | Flarum `custom_header` DB setting (appended) | +| 3 | Radio Show | https://radio.azcomputerguru.com | PHP script injected tracking into 204 HTML files before `` | + +**Cron job:** Added to `azcomputerguru` crontab: +``` +*/5 * * * * /usr/local/bin/php /home/azcomputerguru/public_html/analytics/console core:archive --url=https://analytics.azcomputerguru.com > /dev/null 2>&1 +``` + +### 3. Cloudflare Changes + +**Re-enabled proxy (orange cloud) on:** +- `community.azcomputerguru.com` (record ID: `a1d406f701d30957784fdb1cb1662748`) +- `radio.azcomputerguru.com` (record ID: `a7b1605203f9a72e146d7b290e840c45`) +- `analytics.azcomputerguru.com` (record ID: `a3e71224ef035b97160de99a8fff9980`) — also fixed IP from 52.52.94.202 → 72.194.62.5 + +**API used:** DNS token `DRRGkHS33pxAUjQfRDzDeVPtt6wwUU6FwtXqOzNj` +- Token has DNS read/write only — cannot check/change SSL/TLS mode or WAF rules + +### 4. Research Completed + +**Google Analytics:** No GA tracking on any of the 3 sites. WordPress has Site Kit installed with Search Console connected but no GA4. Deferred to future session. + +**AI Crawler Rules:** Cloudflare has "AI Crawl Control" feature (free plan). Requires: +1. Proxy enabled (done) +2. Dashboard: AI Crawl Control > Crawlers tab +3. Allow: ChatGPT-User, Claude-Web, Perplexity-User (referral traffic) +4. Optional: GPTBot, ClaudeBot, Google-Extended (training) +5. Our API token lacks WAF permissions — must do via dashboard + +**Self-hosted analytics comparison:** Evaluated Umami vs Matomo. Chose Matomo because it's pure PHP+MySQL (runs natively on cPanel) vs Umami requiring Node.js + reverse proxy. + +## Credentials + +### Matomo Analytics (analytics.azcomputerguru.com) +- **Admin User:** MikeSwanson / Mat0mo2026!CGS +- **Admin Email:** mike@azcomputerguru.com +- **DB Host:** localhost (on IX server 172.16.3.10) +- **DB Name:** azcompu_matomo +- **DB User:** azcompu_matomo +- **DB Password:** Mat0mo2026!CGS + +### Flarum Forum (community.azcomputerguru.com) — unchanged +- **DB:** azcompu_flarum / azcompu_flarum / Fl@rum2026!CGS +- **API Key:** 581b6c8c162a383ba87757f41b4381e9bf8db61d71bd578ee97fe32b7aeac046 + +### IX Server SSH (from CachyOS workstation) +- **Must use:** `sshpass -p $'Gptf*77ttb!@#!@#' ssh -o StrictHostKeyChecking=no -o PubkeyAuthentication=no root@172.16.3.10` +- **Note:** `$'...'` quoting required for special chars in password — regular single quotes fail (exit code 5) + +### Cloudflare +- **Zone ID:** 1beb9917c22b54be32e5215df2c227ce +- **DNS Token:** DRRGkHS33pxAUjQfRDzDeVPtt6wwUU6FwtXqOzNj (DNS read/write only) +- **NPM Token:** U1UTbBOWA4a69eWEBiqIbYh0etCGzrpTU4XaKp7w (broader, from Nginx Proxy Manager) + +## Files Created/Modified + +- `/home/guru/ClaudeTools/projects/community-forum/theme-v2.less` — new Flarum theme (created) +- IX: Flarum DB `settings.custom_less` — updated with theme v2 +- IX: Flarum DB `settings.custom_header` — appended Matomo tracking (site ID 2) +- IX: `/home/azcomputerguru/public_html/analytics/` — Matomo installation (created) +- IX: `/home/azcomputerguru/public_html/analytics/.htaccess` — created for Apache +- IX: `/home/azcomputerguru/public_html/wp-content/mu-plugins/matomo-tracking.php` — WP tracking (created) +- IX: 204 HTML files in `/home/azcomputerguru/public_html/radio/` — Matomo tracking injected +- IX: `azcomputerguru` crontab — Matomo archive cron added +- `/home/guru/.claude/projects/-home-guru-ClaudeTools/memory/reference_matomo_analytics.md` — memory (created) +- `/home/guru/.claude/projects/-home-guru-ClaudeTools/memory/MEMORY.md` — updated index +- `/home/guru/ClaudeTools/credentials.md` — added Matomo section + +## Pending/Incomplete Tasks + +1. **Cloudflare SSL/TLS mode** — Verify it's "Full" or "Full (Strict)" in dashboard. Our API tokens can't check this. +2. **Cloudflare AI Crawl Control** — Configure in dashboard: allow ChatGPT-User, Claude-Web, Perplexity-User bots +3. **Google Analytics (GA4)** — Still needs setup. User deferred to future session. Need GA4 Measurement ID. +4. **WordPress Site Kit GA4** — Site Kit is installed on azcomputerguru.com with Search Console only. Can complete GA4 connection through Site Kit admin. +5. **Matomo API token** — Token came back empty during setup. May need to regenerate via Matomo admin panel. +6. **Radio site tracking durability** — HTML injection will be lost on next Astro rebuild/deploy. Should add to Astro layout component source instead. +7. **SSH key auth for IX** — Still using sshpass from CachyOS workstation. Should add ed25519 key. +8. **Broader Cloudflare API token** — Create one with WAF/Bot Management permissions for API-based AI crawler management.