Dev Log

Build /clients/ section + Eagle/Cody/Kelli Phase 1 memo (4 pages, password-gated, noindex)

· Claude Opus 4.7 · Bot
clientsinternalauthmemonoindex

What was done

Infrastructure (3 changes):

  1. src/layouts/BaseLayout.astro:

    • Added optional noindex?: boolean prop. 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.
  2. astro.config.mjs: extended sitemap filter callback to also exclude /clients/. Sitemap is now /log/ + /home-test/ + /clients/ excluded.

  3. 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-clients file lives outside public_html so it’s not web-readable. Single shared user (admin) with the password the user provided. Hash generated locally with openssl passwd -apr1. Operator-side file at .tmp/0001_26_05_01_eagle_eval/htpasswd-clients-FOR-UPLOAD.txt ready 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 PNGSource sizeSmallest webp
eaglezoning.png1.6 MB15.6 KB at 400w
eagleflum.png2.5 MB47 KB at 400w (more visual complexity)
eagledevelopmenttracker.png1.8 MB14.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):

PathSourceNotes
/clients/newThin landing — confidentiality note, list of active memos
/clients/eagle-cody-memo/findings_summary.htmlFull 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.htmlRZDA-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.htmlRZ-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.htmlN=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 build clean
  • 5 client pages built; all 5 contain noindex,nofollow meta
  • 0 /clients/ URLs in dist/sitemap-0.xml
  • 0 data-pagefind-body attributes on /clients/* pages (1 on a normal page like /contact/ for comparison)
  • Hero image variants emitted and verified at expected sizes
  • .htaccess Auth block present in dist/.htaccess after build (Astro copies public/.htaccess straight through)

Operator follow-up — REQUIRED before pages are usable

After re-uploading dist/:

  1. Upload the htpasswd file to the SERVER, OUTSIDE public_html. Local file: .tmp/0001_26_05_01_eagle_eval/htpasswd-clients-FOR-UPLOAD.txt Destination 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
  2. Verify Apache has mod_authn_file and mod_auth_basic enabled. They’re standard on cPanel — usually on by default. Verify with: apachectl -M | grep -E 'authn_file|auth_basic'
  3. 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.
  4. Cloudflare cache purge for /clients/* paths and /.htaccess (technically .htaccess isn’t cached by CF, but purge anyway to be safe).
  5. 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.astro
  • src/pages/clients/index.astro
  • src/pages/clients/eagle-cody-memo/index.astro
  • src/pages/clients/eagle-cody-memo/whitehurst-village.astro
  • src/pages/clients/eagle-cody-memo/watermark.astro
  • src/pages/clients/eagle-cody-memo/climate-summary.astro
  • src/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 — added noindex prop + /clients/ Pagefind exclusion
  • astro.config.mjs — added /clients/ to sitemap filter
  • public/.htaccess — added <Directory> Basic Auth block
  • This devlog entry
Feedback