33 Commits

Author SHA1 Message Date
jasonMPM
cf9343185f Merge pull request #13 from jasonMPM/claude/isp-website-docker-EB8pB
Add delete message action to staff portal
2026-02-28 21:31:35 -06:00
Claude
132d2c3a34 Add delete message action to staff portal
Adds a Delete button to each message card in the staff inbox so staff
can remove spam or dead-end submissions. Confirmation dialog (via
JS confirm()) prevents accidental deletions. Implementation:

- POST handler: DELETE FROM contacts WHERE id = ? (parameterized)
- .btn--danger CSS variant (red-tinted, matches dark theme)
- Delete button rendered in every message footer alongside existing
  Mark as read action

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-03-01 03:27:28 +00:00
jasonMPM
650698fbc5 Update footer.php 2026-02-28 21:24:41 -06:00
jasonMPM
03398b98c2 Merge pull request #12 from jasonMPM/claude/isp-website-docker-EB8pB
Rewrite roadmap to reflect B2B networking services focus
2026-02-28 21:20:13 -06:00
Claude
ab490dd679 Rewrite roadmap to reflect B2B networking services focus
Removed ISP-generic items (residential/business plan tiers, coverage
zone polygons, address lookup, subscription billing setup). Updated
milestones to match what the site actually is — a B2B networking
services and integration company:

- Milestone 1: marked services page and staff inbox as complete
- Milestone 2: renamed Content & Plans → Content & Branding; replaced
  plan tier items with real content goals (about, contact info, logo,
  stats, email notifications)
- Milestone 3: renamed Coverage Map → Portfolio & Project Showcase;
  replaced ISP coverage tools with project case studies and per-service
  detail pages
- Milestone 4: reframed Customer Portal as Client Portal with project
  tracking and network documentation instead of billing dashboard
- Milestone 5: simplified Billing → Invoicing & Payments; removed
  recurring subscription framing, kept retainer + one-time invoices
- Milestones 6–8: unchanged, remain applicable

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-03-01 03:18:08 +00:00
jasonMPM
11ac41e276 Merge pull request #11 from jasonMPM/claude/isp-website-docker-EB8pB
Update contact subject dropdown to match actual services; update README
2026-02-28 21:15:27 -06:00
Claude
5c8c406082 Update contact subject dropdown to match actual services; update README
Contact form subject options now match the five service lines on the site:
New Project Inquiry, Mesh Networking, Managed Services, Structured
Cabling, Access Control, IP Camera Systems, Technical Support, Other.
Removed the old ISP-generic options (billing, coverage, new-service).
Updated $subject_labels in admin-inbox.php to match.

README updates:
- ADMIN_PASS added to web container env vars table and env vars section
- Project structure updated to include db.php and admin-inbox.php
- Milestone 1 contact form item updated to note MySQL storage
- Milestone 4 marks contact DB storage and staff inbox as complete;
  email notification remains as the next open item

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-03-01 03:14:02 +00:00
jasonMPM
6503bdd6d6 Merge pull request #10 from jasonMPM/claude/isp-website-docker-EB8pB
Add contact form DB storage and hidden staff inbox
2026-02-28 21:08:36 -06:00
Claude
40e3f73aaf Add contact form DB storage and hidden staff inbox
- contact.php now inserts submissions into MySQL via PDO prepared
  statements; raw values stored (htmlspecialchars moved to output only)
- www/includes/db.php: shared PDO helper with auto-migration that adds
  the is_read column to existing deployments without a full DB reset
- docker/mysql/init.sql: added is_read TINYINT column to contacts table
  for fresh deploys
- www/pages/admin-inbox.php: self-contained staff inbox at /staff-portal
  with session-based password login, per-message mark-as-read, and
  mark-all-read; unread count shown in browser tab title
- index.php: routes /staff-portal before public header/footer so the
  admin page is fully standalone
- docker-compose.yml: ADMIN_PASS env var wired to web container

Set ADMIN_PASS in .env (gitignored) before deploying.
If the DB volume already exists, the auto-migration in db.php will
add the is_read column automatically on first request.

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-03-01 03:05:18 +00:00
jasonMPM
3151bb8d4b Merge pull request #9 from jasonMPM/claude/isp-website-docker-EB8pB
Apply hero card via inline style to bypass CSS caching
2026-02-28 20:52:53 -06:00
Claude
6b44fe8b4c Apply hero card via inline style to bypass CSS caching
CSS file changes were not rendering - likely due to Apache mod_expires
caching style.css for 1 week in the browser. Two fixes:
- Cache-bust the stylesheet link (?v=4) so the browser is forced to
  fetch a fresh copy of the CSS file
- Move the dark card and heading size fix to inline styles on the hero
  div directly in home.php, so the change lives in the PHP output and
  is not subject to any CSS caching layer

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-03-01 02:49:45 +00:00
jasonMPM
31226d424e Merge pull request #8 from jasonMPM/claude/isp-website-docker-EB8pB
Fix hero card sizing and heading overflow clipping
2026-02-28 20:46:29 -06:00
Claude
04bf20c14e Fix hero card sizing and heading overflow clipping
Previous card attempt used padding: 3rem 3.5rem which overrode the
container's padding-inline and shrank the text area from 652px to 568px,
making the heading clip worse and the card look too narrow to read.

Two fixes:
- max-width: 780px + padding: 3rem 2.5rem gives 730px text area,
  comfortably containing the heading at any viewport size
- heading clamp changed from (2.4rem, 6vw, 4rem) to (2.2rem, 4.5vw, 3.25rem)
  so the max rendered size stays well within the card width

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-03-01 02:43:48 +00:00
jasonMPM
309e1936d6 Merge pull request #7 from jasonMPM/claude/isp-website-docker-EB8pB
Fix hero text contrast with dark glass card and gradient text color
2026-02-28 20:34:38 -06:00
Claude
c4193eea59 Fix hero text contrast with dark glass card and gradient text color
The hero gradient (navy→blue→teal) used the same colors as the gradient
text (teal→blue), making the heading dissolve into the background.

Two fixes:
- hero__content now has a dark semi-transparent card (rgba 72% opacity)
  with blur backdrop, keeping the animated gradient background visible
  around it while text sits on a dark, readable surface
- --grad-text changed from teal→blue to orange→teal so the gradient
  heading contrasts against the card and visually pops

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-03-01 02:29:58 +00:00
jasonMPM
1112e80efe Update home.php 2026-02-28 20:21:47 -06:00
jasonMPM
b2ad3a412d Update home.php 2026-02-28 20:20:41 -06:00
jasonMPM
69a3247f86 Update contact.php 2026-02-28 20:19:02 -06:00
jasonMPM
c614c91abb Update about.php 2026-02-28 20:17:15 -06:00
jasonMPM
fdde8c6965 Merge pull request #6 from jasonMPM/claude/isp-website-docker-EB8pB
Claude/isp website docker eb8p b
2026-02-28 20:10:21 -06:00
Claude
58c37a81a2 Overhaul site content to reflect custom networking solutions focus
Remove all ISP-subscriber framing (coverage areas, residential plans,
500+ customers, backbone capacity) and replace with accurate positioning
as a custom networking and managed services company.

Key changes:
- Hero: new headline and CTA focused on custom solutions
- Stats bar: Deployments, Uptime SLA, 24/7 support, response time
- Services cards: Mesh Networking, Managed Services, Access Control, IP Cameras
- Why section: founding story (tornado relief, tent deployment, charity event)
- CTA band: contact-focused instead of address lookup form
- Services page: expanded to 5 service areas with real content cards;
  removed Residential/Business internet sections
- About page: full founding story, mission statement, 4-step approach
- Portfolio page: repurposed from Coverage Map; shows deployment types
  including the disaster relief origin story
- Nav: Coverage → Portfolio, Get Connected → Request a Quote
- Footer: updated service links and tagline
- Router: coverage route renamed to portfolio

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-03-01 02:06:23 +00:00
Claude
5c6c126c55 Fix 403 Forbidden by switching all paths from /mnt/user to /mnt/cache
/mnt/user is a FUSE filesystem on Unraid that is unavailable inside
Docker containers. The container sees an empty /var/www/html, Apache
finds no index.php, and returns 403 because Options -Indexes is set.
All volume mount paths and git clone instructions updated to use the
cache drive path (/mnt/cache/appdata/alwisp) directly. Added an
explanatory warning note in Step 1.

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-02-28 22:38:51 +00:00
jasonMPM
79b1cdd282 Merge pull request #5 from jasonMPM/claude/isp-website-docker-EB8pB
Fix file bind-mount error by COPYing Apache config into image
2026-02-28 16:31:34 -06:00
Claude
80c69a7217 Fix file bind-mount error by COPYing Apache config into image
Unraid Container Builder creates directories at mount points by default,
which fails when the container already has a file at that path. Moving
000-default.conf from a bind-mount to a COPY in the Dockerfile avoids
the OCI runtime error and is the correct pattern — config files belong
in the image, only persistent data should be mounted as volumes.

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-02-28 22:29:18 +00:00
jasonMPM
cc0fd835b7 Merge pull request #4 from jasonMPM/claude/isp-website-docker-EB8pB
Fix Container Builder error for locally built image
2026-02-28 16:25:00 -06:00
Claude
d0be9a0461 Fix Container Builder error for locally built image
Add --pull=never to Extra Parameters so Unraid doesn't try to pull
alwisp_web:latest from Docker Hub. The image is built locally in Step 2
and only exists on the host — without this flag the container fails to
start with 'pull access denied'.

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-02-28 22:21:35 +00:00
jasonMPM
9c2d937a61 Merge pull request #3 from jasonMPM/claude/isp-website-docker-EB8pB
Update install guide to use Unraid Container Builder with br0 dedicat…
2026-02-28 16:11:11 -06:00
Claude
eafc11864f Update install guide to use Unraid Container Builder with br0 dedicated IPs
Replace Docker Compose Manager steps with per-container Container Builder
setup. Each container (web, db, pma) gets its own fixed LAN IP via br0,
removing the need for port mapping. DB_HOST env var now points to the
database container's br0 IP instead of the internal Docker hostname.

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-02-28 22:10:32 +00:00
jasonMPM
315fb06500 Merge pull request #2 from jasonMPM/claude/isp-website-docker-EB8pB
Add full README with Unraid install guide, roadmap, and milestones
2026-02-28 15:45:00 -06:00
Claude
83a6bd35c4 Add full README with Unraid install guide, roadmap, and milestones
https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-02-28 21:43:44 +00:00
jasonMPM
97dca33d5c Merge pull request #1 from jasonMPM/claude/isp-website-docker-EB8pB
Add Dockerized LAMP stack and website skeleton for ALWISP
2026-02-28 15:41:04 -06:00
Claude
3e26125afa Add Dockerized LAMP stack and website skeleton for ALWISP
- Docker Compose orchestrating PHP 8.2/Apache web container and MySQL 8.0
- Dockerfile with GD, PDO, MySQLi extensions and security hardening
- Apache vhost with mod_rewrite, deflate, expires, and security headers
- PHP config with OPcache enabled and display_errors off
- MySQL init schema (contacts, coverage_zones tables)
- Front-controller PHP router (index.php → pages/)
- Responsive homepage: hero, stats bar, services cards, why section, coverage CTA
- Stub pages: services, coverage, about, contact (with working form skeleton), 404
- CSS design system using brand palette from logo (navy #0d1b3e → teal #00bcd4 + orange #f57c00 accents)
- JS: nav scroll/mobile toggle, IntersectionObserver counter animation, scroll reveal

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-02-28 21:39:21 +00:00
jasonMPM
69b567cf72 Initial commit 2026-02-28 15:28:05 -06:00