Jill Website
Search the build
-
db59fa42026-05-31 Add per-site favicon (kills /favicon.ico 404) -
e4055222026-05-19 security: upgrade rel=noopener to rel=noopener noreferrer on every target=_blank -
5f718fe2026-05-19 security: 404-guard snapshot/backup paths in both server entrypoints -
60877592026-05-19 .gitignore: broaden to exclude snapshot/backup/swap files -
53b173b2026-05-11 security: scrub hardcoded admin password from CLAUDE.md + add helmet dep -
6852df52026-05-11 security: remove express.static('.') — was exposing .env over HTTP -
6058b652026-05-07 tighten .gitignore: add missing standing-rule patterns (tmp/ .DS_Store build/) -
e97ed542026-05-04 [overnight] pre-debate baseline
Authors
- Steve8
Agents used
- security-auditor1
Skills used
- /backup2
- /server2
- /favicon1
- /yoga1
- /surf1
- /tour1
- /coverage1
- /swap1
- /sed1
- /patch1
- /lock1
Creative ideas + design notes
e405522 · 2026-05-19 · security: upgrade rel=noopener to rel=noopener noreferrer on every target=_blank
noopener alone prevents window.opener tampering but still leaks the Referer header to third-party destinations. Adding noreferrer closes that side-channel — every outbound restaurant/yoga/surf/tour link in the inline HTML template (server.js + auto-generated index.html) and the EJS partials (index, culinary-delights, surfing, yoga-wellness) now ships the full noopener noreferrer pair. 60 occurrences upgraded across 6 files. Verified zero bare rel=noopener occurrences remain outside node_modules/coverage. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5f718fe · 2026-05-19 · security: 404-guard snapshot/backup paths in both server entrypoints
Adds a defense-in-depth Express middleware (runs BEFORE express.static) that returns 404 for any request path ending in .bak / .bak.* / .pre-* / .orig / .rej / .swp / ~. Applied to both: - server.js (standalone fallback) - src/server.ts (PM2 production entrypoint via dist/server.js) Pairs with the .gitignore broadening in 6087759 — even if a snapshot file slips into public/ via a sloppy edit, it never serves over HTTP. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6087759 · 2026-05-19 · .gitignore: broaden to exclude snapshot/backup/swap files
Prevents editor/sed/patch artifacts (.bak, .pre-*, .orig, .rej, .swp, ~) from being staged or served — defense-in-depth alongside the runtime 404-guard middleware. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
53b173b · 2026-05-11 · security: scrub hardcoded admin password from CLAUDE.md + add helmet dep
CLAUDE.md was committing the live admin password 'DWSecure2024!' as plaintext doc — anyone who cloned the repo had prod credentials. Replaced with a pointer to ADMIN_PASSWORD env var. helmet was already require()'d in server.js but missing from package.json/lock — npm install would fail cold. Adding it now. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6852df5 · 2026-05-11 · security: remove express.static('.') — was exposing .env over HTTP
express.static('.') on the project root was making .env, server.js, node_modules,
package.json, etc. fetchable as static files. .env contains real SMTP_PASS and
DB_PASSWORD. Anything that needs to be public must live in public/.
Found by security-auditor sweep 2026-05-11.
File tree
- .env.example
- .gitignore
- CHANGES.md
- CHANGES2.md
- CLAUDE.md
- DATABASE.md
- GALLERY_VERIFICATION.md
- README.md
- REVIEW-2026-05-04.md
- coverage/clover.xml
- coverage/coverage-final.json
- coverage/lcov-report/__tests__/routes/index.html
- coverage/lcov-report/__tests__/routes/test-app.ts.html
- coverage/lcov-report/base.css
- coverage/lcov-report/block-navigation.js
- coverage/lcov-report/config/database.ts.html
- coverage/lcov-report/config/index.html
- coverage/lcov-report/favicon.png
- coverage/lcov-report/index.html
- coverage/lcov-report/models/Inquiry.ts.html
- coverage/lcov-report/models/Property.ts.html
- coverage/lcov-report/models/index.html
- coverage/lcov-report/prettify.css
- coverage/lcov-report/prettify.js
- coverage/lcov-report/routes/index.html
- coverage/lcov-report/routes/inquiries.ts.html
- coverage/lcov-report/routes/properties.ts.html
- coverage/lcov-report/services/emailService.ts.html
- coverage/lcov-report/services/index.html
- coverage/lcov-report/sort-arrow-sprite.png
- coverage/lcov-report/sorter.js
- coverage/lcov-report/src/__tests__/routes/index.html
- coverage/lcov-report/src/__tests__/routes/test-app.ts.html
- coverage/lcov-report/src/config/database.ts.html
- coverage/lcov-report/src/config/index.html
- coverage/lcov-report/src/index.html
- coverage/lcov-report/src/index.ts.html
- coverage/lcov-report/src/models/Inquiry.ts.html
- coverage/lcov-report/src/models/Property.ts.html
- coverage/lcov-report/src/models/index.html
- coverage/lcov-report/src/routes/index.html
- coverage/lcov-report/src/routes/inquiries.ts.html
- coverage/lcov-report/src/routes/properties.ts.html
- coverage/lcov-report/src/routes/unsubscribe.ts.html
- coverage/lcov-report/src/server.ts.html
- coverage/lcov-report/src/services/emailService.ts.html
- coverage/lcov-report/src/services/index.html
- coverage/lcov.info
- docs/LINK_VALIDATION.md
- docs/US-005-verification.md
- docs/US-009-verification.md
- ecosystem.config.js
- index.html
- jest.config.js
- package-lock.json
- package.json
- public/activity-links-demo.html
- public/css/activity-links.css
- public/css/adaptive-loading.css
- public/css/gallery.css
- public/css/style.css
- public/css/video.css
- public/favicon.ico
- public/favicon.svg
- public/images/hero.png
- public/images/properties/casita/casita-1-bedliving.jpg
- public/images/properties/casita/casita-2-bedroom.jpg
- public/images/properties/casita/casita-3-interior.jpg
- public/images/properties/luna/luna-1-bed.jpg
- public/images/properties/luna/luna-2-view.jpg
- public/images/properties/luna/luna-3-interior.jpg
- public/images/properties/main-house/main-house-1-bedroom.jpg
- public/images/properties/main-house/main-house-2-view.jpg
- public/images/properties/main-house/main-house-3-interior.jpg
- public/images/properties/sol/sol-1-bedroom.jpg
- public/images/properties/sol/sol-2-exterior.jpg
- public/images/properties/sol/sol-3-view.jpg
- public/js/activity-links.js
- public/js/adaptive-loading.js
- public/js/connection-speed.js
- public/js/gallery.js
- public/js/main.js
- public/js/video.js
- public/test-activity-links.html
- public/test-adaptive.html
- public/test-mobile-responsive.html
- scripts/check-links.ts
- scripts/ralph/prd.json
- scripts/ralph/progress.txt
- server.js
- setup-test-db.sh
- src/__tests__/Inquiry.test.ts
- src/__tests__/Property.test.ts
- src/__tests__/database.test.ts
- src/__tests__/routes/inquiries.test.ts
- src/__tests__/routes/properties.test.ts
- src/__tests__/routes/test-app.ts
- src/__tests__/setup.ts
- src/config/database.ts
- src/index.ts
- src/middleware/auth.ts
- src/migrations/001_create_tables.sql
- src/migrations/002_create_cms_tables.sql
- src/migrations/002_create_page_content.sql
- src/migrations/003_create_activities_table.sql
- src/migrations/004_add_rating_to_activities.sql
- src/migrations/005_create_link_checks_table.sql
- src/migrations/migrate.ts
- src/models/Activity.ts
- src/models/AdminUser.ts
- src/models/Inquiry.ts
- src/models/LinkCheck.ts
- src/models/PageContent.ts
- src/models/Property.ts
- src/models/__mocks__/Inquiry.ts
- src/models/__mocks__/Property.ts
- src/routes/activities.ts
- src/routes/admin.ts
- src/routes/inquiries.ts
- src/routes/linkValidation.ts
- src/routes/properties.ts
- src/routes/unsubscribe.ts
- src/server.ts
- src/services/emailService.ts
- src/services/googleMapsService.ts
- src/services/googleReviewsService.ts
- src/services/linkValidationService.ts
- src/utils/phoneFormatter.ts
- tasks/prd-focus-strictly-on-ui-and-make-sure-all-the-images.md
- tasks/prd-new-feature-for-jill-website.md
- tasks/prd-quick-mode-task.md
- tasks/prd-update-all-activities-with-real-llinks-out-to-all.md
- tasks/prd-use-images-from-front-page-herop-image-for-our-fro.md
- test-server.js
- tsconfig.json
- views/admin-dashboard.ejs
- views/admin-edit-page.ejs
- views/admin-login.ejs
- views/admin.ejs
- views/adventure-activities.ejs
- views/beaches.ejs
- views/culinary-delights.ejs
- views/error.ejs
- views/gallery-demo.ejs
- views/index.ejs
- views/nature-adventures.ejs
- views/partials/activity-links-example.ejs
- views/partials/booking-widget.ejs
- views/partials/category-nav.ejs
- views/partials/gallery.ejs
- views/partials/video.ejs
- views/properties-casita.ejs
- views/properties-luna.ejs
- views/properties-main-house.ejs
- views/properties-sol.ejs
- views/property-detail.ejs
- views/surfing.ejs
- views/video-demo.ejs
- views/yoga-wellness.ejs