Commit Graph

10 Commits

Author SHA1 Message Date
Jeff Emmett 6a0ebc2d29 Consolidate header, add subscribe page, fix blog images, compress footer
- Merge two-bar header into single nav bar: remove social icons top bar,
  move search + cart icons next to hamburger menu
- Add /subscribe page with email signup form
- Fix blog images by restoring Squarespace CDN in next.config remotePatterns
- Compress footer into 4-column link layout, remove logo block
- Update Cynthia Trenshaw Poetry link to cynthiatrenshaw.com
- Add local images for homepage, about, IYOS, and artwork pages
- Add /wisdom-words page

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 00:13:36 +00:00
Jeff Emmett e410bd1b0a Hardcode PayPal sandbox client ID as build arg
The env_file is only available at runtime, not during docker build.
Build args need explicit values in docker-compose.yml for NEXT_PUBLIC
vars to be inlined into the client bundle.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:35:50 -07:00
Jeff Emmett 518f08e8e6 Pass PayPal client ID as build arg for client-side bundle
NEXT_PUBLIC_* vars must be available at build time to be inlined
into the client JS bundle. Added NEXT_PUBLIC_PAYPAL_CLIENT_ID as
a Docker build arg so the PayPal checkout button works in the browser.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:34:38 -07:00
Jeff Emmett 2523a304cf Add localPatterns for /api/assets and writable cache dir
- Configure images.localPatterns to allow /api/assets/** with query strings
- Add /app/.next/cache as tmpfs for image optimization cache (read-only container)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:12:46 -07:00
Jeff Emmett 5f0d2eff16 Use API route proxy for Directus assets instead of direct internal URL
Next.js image optimizer blocks internal Docker URLs due to SSRF
protection (private IP resolution). Instead, proxy assets through
/api/assets/[id] which fetches from internal Directus URL server-side.

This bypasses both Cloudflare Access and SSRF protection since the
<Image> src is a same-origin path, not an external URL.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:11:13 -07:00
Jeff Emmett cd7c0200f3 Add NEXT_PUBLIC asset vars to runtime environment
NEXT_PUBLIC_ vars need to be set both at build time (client bundle)
AND at runtime (server-side rendering in standalone mode).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:06:44 -07:00
Jeff Emmett 41d784e92d Fix store images: bypass Cloudflare Access via internal Docker URL
Directus CMS is behind Cloudflare Access, which blocks the Next.js
image optimizer from fetching assets. Route image requests through the
internal Docker network (http://katheryn-cms:8055) instead.

- Add NEXT_PUBLIC_DIRECTUS_ASSET_URL/TOKEN env vars for client components
- Use DIRECTUS_INTERNAL_URL for server-side Directus API calls
- Convert store detail page from client to server component (data
  fetching now happens server-side, not in browser)
- Add internal Docker hostname to Next.js remotePatterns

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:03:04 -07:00
Jeff Emmett f90b35d03a Update env_file path to /opt/secrets/katheryn-website/.env
Migrated from /root/.katheryn_credentials to the new organized
/opt/secrets/ directory structure. Symlinks ensure backward compat.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 12:43:24 -07:00
Jeff Emmett 2196cad129 Move secrets to env_file, add security hardening to docker-compose
- Use env_file referencing /root/.katheryn_credentials for all secrets
- Remove inline secrets from environment block (PayPal, SMTP, store token)
- Add directus_katheryn-internal network for internal CMS access
- Add container security: read_only, cap_drop ALL, no-new-privileges

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 12:34:12 -07:00
Jeff Emmett 1d0dfc342e feat: Add blog system with 72 posts from Squarespace export
- Parse Squarespace WordPress XML export and extract all blog posts
- Create blog listing page with posts grouped by year
- Create individual blog post pages with full content
- Add social sharing, prev/next navigation, related posts
- Configure Next.js for Squarespace CDN images
- Add Tailwind typography plugin for prose styling
- Include 357 artwork thumbnails from Airtable

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 01:23:12 +00:00