Build /clients/ section + Eagle/Cody/Kelli Phase 1 memo (4 pages, password-gated, noindex)
What was done
Infrastructure (3 changes):
-
src/layouts/BaseLayout.astro:- Added optional
noindex?: booleanprop. When true, emits<meta name="robots" content="noindex,nofollow">. - Extended
<main>Pagefind-skip path check from/log/to also include/clients/so client memos never enter the site’s Pagefind index even if their HTML somehow gets through Cloudflare.
- Added optional
-
astro.config.mjs: extended sitemapfiltercallback to also exclude/clients/. Sitemap is now/log/+/home-test/+/clients/excluded. -
public/.htaccess: added an HTTP Basic Auth block scoped to/home/adminl/public_html/clients:<Directory "/home/adminl/public_html/clients"> AuthType Basic AuthName "Bailey Clients" AuthUserFile /home/adminl/.htpasswd-clients Require valid-user </Directory>The
.htpasswd-clientsfile lives outsidepublic_htmlso it’s not web-readable. Single shared user (admin) with the password the user provided. Hash generated locally withopenssl passwd -apr1. Operator-side file at.tmp/0001_26_05_01_eagle_eval/htpasswd-clients-FOR-UPLOAD.txtready to SCP.
Shared component:
src/components/ClientMemoArticle.astro — wraps memo content in a consistent header / body / back-link frame with all memo typography styles scoped via :global(...). Avoids ~450 lines of CSS duplication across the 3 sub-pages. The findings_summary index page has its own inline styles because it has additional structure (figures + callout tables) the shared component doesn’t need to know about.
Asset pipeline:
Moved 3 PNGs from .tmp/0001_26_05_01_eagle_eval/ to src/assets/clients/eagle-cody-memo/ so Astro’s image pipeline emits responsive webp variants. Source -> output sizes (smallest 400w variant in parens):
| Source PNG | Source size | Smallest webp |
|---|---|---|
| eaglezoning.png | 1.6 MB | 15.6 KB at 400w |
| eagleflum.png | 2.5 MB | 47 KB at 400w (more visual complexity) |
| eagledevelopmenttracker.png | 1.8 MB | 14.4 KB at 400w |
Browsers pick the smallest variant satisfying sizes="(max-width: 900px) 95vw, 800px". loading="lazy" because all three sit below the fold.
Pages built (5):
| Path | Source | Notes |
|---|---|---|
/clients/ | new | Thin landing — confidentiality note, list of active memos |
/clients/eagle-cody-memo/ | findings_summary.html | Full Phase 1 findings — TL;DR, top findings, subject, visual context (3 figures), inside-Eagle posture, sections 1.1-1.6, sub-area cap reconciliation, Whitehurst + Watermark precedent links, state preemption read |
/clients/eagle-cody-memo/whitehurst-village/ | phase_1_4_precedents/2025-06-10_CC.html | RZDA-2025-02 per-member analysis, 4-0 unanimous, 2.01 du/ac at §6.5.1.D cap, detached product |
/clients/eagle-cody-memo/watermark/ | phase_1_4_precedents/2026-02-24_CC.html | RZ-2006-14-MOD4 unanimous tabling, 14.7 du/ac net density at issue, council supports SFA use but not intensity |
/clients/eagle-cody-memo/climate-summary/ | phase_1_other/findings/climate_summary.html | N=9 Eagle CC Findings of Fact empirical read on FLUM-consistency depth, hypothesis test for Kelli |
All 5 pages pass noindex={true} to BaseLayout.
Why
User request: “re-create [the codeclau.de findings_summary] and the sub pages linked to on https://baileyengineers.com/clients/, ask for password on the UI” with article format mirroring /dev-iq/land-use-intelligence/rs4-nampa/. Source content was internal client memos at codeclau.de in a different visual design (dark mode, IBM Plex Mono, neon green); re-platformed into Bailey’s design tokens.
On the password approach: chose HTTP Basic Auth via .htaccess over JS-based gating because this is a static Astro site — a JS gate would be cosmetic only (the HTML is in dist/, downloadable by anyone who knows the URL). Real protection has to happen before the HTML body is sent. Apache .htaccess does that, with no client-side JS, matching the site’s stated values.
Verification
npm run buildclean- 5 client pages built; all 5 contain
noindex,nofollowmeta - 0
/clients/URLs indist/sitemap-0.xml - 0
data-pagefind-bodyattributes on/clients/*pages (1 on a normal page like/contact/for comparison) - Hero image variants emitted and verified at expected sizes
.htaccessAuth block present indist/.htaccessafter build (Astro copiespublic/.htaccessstraight through)
Operator follow-up — REQUIRED before pages are usable
After re-uploading dist/:
- Upload the htpasswd file to the SERVER, OUTSIDE public_html.
Local file:
.tmp/0001_26_05_01_eagle_eval/htpasswd-clients-FOR-UPLOAD.txtDestination on server:/home/adminl/.htpasswd-clients(note the leading dot, and that this is in/home/adminl/not/home/adminl/public_html/) Easiest path: SFTP into/home/adminl/, drop the file there, rename it to.htpasswd-clients. Or via SSH:echo 'admin:$apr1$v9gCfBGX$jtlZMwir4R0pZpNWt/2Oo.' > /home/adminl/.htpasswd-clients chmod 644 /home/adminl/.htpasswd-clients - Verify Apache has
mod_authn_fileandmod_auth_basicenabled. They’re standard on cPanel — usually on by default. Verify with:apachectl -M | grep -E 'authn_file|auth_basic' - Test the gate. Visit
https://baileyengineers.com/clients/in an incognito window — should prompt for credentials. Username:admin. Password: the one provided by the user. - Cloudflare cache purge for
/clients/*paths and/.htaccess(technically.htaccessisn’t cached by CF, but purge anyway to be safe). - One-time sanity check that the prior search engines have not crawled
/clients/URLs before today:site:baileyengineers.com/clients/query in Google. Should be empty (the pages are new).
Files affected
Created:
src/components/ClientMemoArticle.astrosrc/pages/clients/index.astrosrc/pages/clients/eagle-cody-memo/index.astrosrc/pages/clients/eagle-cody-memo/whitehurst-village.astrosrc/pages/clients/eagle-cody-memo/watermark.astrosrc/pages/clients/eagle-cody-memo/climate-summary.astrosrc/assets/clients/eagle-cody-memo/{eaglezoning,eagleflum,eagledevelopmenttracker}.png.tmp/0001_26_05_01_eagle_eval/htpasswd-clients-FOR-UPLOAD.txt(operator artifact)
Modified:
src/layouts/BaseLayout.astro— addednoindexprop +/clients/Pagefind exclusionastro.config.mjs— added/clients/to sitemap filterpublic/.htaccess— added<Directory>Basic Auth block- This devlog entry