Commit Graph

16 Commits

Author SHA1 Message Date
acobham 73c2f19d7e Quote FROM_EMAIL value to fix shell sourcing on container start 2026-06-04 14:43:45 +01:00
acobham 433b77ee5d Bake .env into build — env vars load from image at container start 2026-06-04 14:36:34 +01:00
acobham dc414f1b84 Remove .env bake-in — use Coolify env vars at runtime 2026-06-04 12:45:06 +01:00
acobham bc07e81514 Fix contact form POST routing and bake env into build
- nginx: route POST /contact/ to contact.php, GET to router.php
- Dockerfile: COPY .env into image
- entrypoint.sh: source .env on container start
- .dockerignore: allow .env to be included in build context
2026-06-04 00:30:40 +01:00
acobham fbb89b77e4 update 2026-06-04 00:00:01 +01:00
Concept Agent 6a0f351dc2 Fix nav breakpoint + topbar wrap on narrow screens
- Raise mobile nav breakpoint from 1023px to 1199px -- desktop nav needs 1200px+ (container max) to fit 7 links + phone + CTA without clipping
- Topbar: truncate text with ellipsis on <=600px to stay within fixed 44px height

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:46:38 +02:00
Concept Agent b94b66205f Fix contact form styles + narrow screen nav clipping
- Alias .form-group to .form-field in main.css so contact form inputs get full styling
- Hide header Get Estimate btn on <=480px (mobile drawer has CTA, prevents logo+btn+hamburger overflow)
- Tighten header-inner gap to space-4 on <=480px
- Drop redundant btn-sm padding override from 360px rule (btn now hidden at that width)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:39:47 +02:00
Concept Agent 93a0837563 Add favicon link to header
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:34:51 +02:00
Concept Agent fb32f28bd4 SEO + UX: schema.org JSON-LD, sitemap fix, persistent topbar, POST-only rate limit
- Add schema.org JSON-LD to page, service, and location templates (LocalBusiness / Service / FAQPage)
- Inject schema_json via _header.php <script type="application/ld+json"> block
- Fix sitemap.xml: replace 10 stale .html refs with trailing-slash URLs, add /blog/, update lastmod
- nginx: rate-limit /contact/ POST-only via map $request_method (GET no longer hits 429)
- Topbar: remove dismiss button, always visible for session; popup close no longer hides topbar

Verified: all 17 routes 200, JSON-LD present on home/service/location/contact, sitemap 17 URLs no .html

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 14:09:19 +02:00
Concept Agent 81feccdc1a Migrate to Stack A: PHP-fpm + nginx + supervisord, drop flat HTML + Python API
- Remove old flat HTML pages (index, about, blog, contact, reviews, services/*, locations/*)
- Remove Python/Flask API container (api/)
- Remove old root nginx.conf and components/
- Add infra/: full nginx.conf (http block at /etc/nginx/nginx.conf), php-fpm-pool.conf (TCP listen), supervisord.conf, entrypoint.sh (auto-generates ALTCHA_HMAC_KEY)
- Add src/: PHP router, page/service/location/blog templates, contact handler, altcha handler, promo endpoint, SQLite data files
- Rewrite Dockerfile: single container, tini PID 1, healthcheck, all env vars declared
- Update docker-compose.yml: port 8096, env_file, healthcheck
- Update .dockerignore: exclude .env.*, include robots.txt/sitemap.xml/404.html/500.html
- Update assets: tokens.css, promo-popup.css/js, altcha.min.js, refactored form.js/main.js

Verified: all 17 routes 200, protection audit PASS, Resend confirmed working

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:56:56 +02:00
Concept Agent 88ed4e6bda Align with AM stack SOPs: required files, nginx hardening, mobile CSS
- Add robots.txt, sitemap.xml (16 pages), 404.html, 500.html per SOP
- nginx: allow robots.txt/sitemap.xml explicitly, fix error_page to 404.html, deny _template.html, remove txt from deny list, fix API proxy comment
- Convert residential.png to residential.webp per image SOP
- components.css: mobile nav breakpoint 768→1023px, 360px ultra-narrow query, overflow-x:clip, inline grid collapse overrides
- blog/index.html: placeholder blog listing page with 3 article cards

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 18:53:35 +02:00
Concept Agent 6917cb6701 Clean root: move build scripts, source data, screenshots, notes to .planning
Deployment-only files stay in root (Dockerfile, nginx.conf,
docker-compose.yml, .dockerignore, .gitignore, public folders,
api/). Everything reference/dev-only goes to .planning/ to keep
the deploy directory clean.
2026-05-08 18:38:46 +02:00
Concept Agent e0b9e27b90 Add Python form API + harden nginx web root
- New api/ Python service (stdlib only — no pip install, no packages):
  validates fields server-side, verifies reCAPTCHA, sends via Resend
  with idempotency key, rate-limited (5 req/IP/15min)
- Matches existing project tooling (build_locations.py, build_services.py)
- Front-end form.js stays vanilla JS, no JS frameworks anywhere
- docker-compose runs nginx + python:3.13-alpine api with healthcheck
- nginx proxies /api/ to Python service, strips prefix
- Dockerfile now copies only public folders into web root (was
  copying everything, exposing /Dockerfile, /build_*.py, /api/.env)
- nginx.conf denies dotfiles, .env, .conf, .yml, .py, .md, .txt
  and Dockerfile as defense in depth
- .dockerignore keeps sensitive files out of build context
- .gitignore protects api/.env and __pycache__ from being committed
2026-05-08 18:26:12 +02:00
Concept Agent b363d19da7 docker compose added 2026-05-07 11:56:16 +02:00
Concept Agent 9907a2ab7d update 2026-05-07 11:45:16 +02:00
Concept Agent 4860391e99 first commit 2026-05-07 11:45:00 +02:00