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