95 Commits

Author SHA1 Message Date
614a0edfa1 Merge pull request 'Block example.com emails and homesites under 10' (#26) from feature/block-example-domain-and-min-homesites into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
2026-07-24 09:30:44 -04:00
1219117adf Block example.com emails and homesites under 10
Spam submissions were still getting through with placeholder data. Two
more content filters on the public form endpoints:

- Reject emails from reserved documentation domains (example.com/.org/
  /.net/.edu and subdomains) and reserved TLDs (.test/.example/.invalid/
  localhost). testing@example.com and friends are never real leads.
- Reject a homesites count below 10. Real associations are larger; the
  junk uses 0/1/2.

Both are validated server-side in security.js (validateEmail gains a
domain blocklist, new validateHomesites) and mirrored client-side in
app.js for immediate feedback. The homesites input min attribute goes
from 1 to 10. Blocked submissions return 400 with a `field` hint and
store nothing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 09:30:15 -04:00
5f4af3886c Merge pull request 'Validate email addresses on both public form endpoints' (#25) from feature/strict-email-validation into main
All checks were successful
Deploy to Production / deploy (push) Successful in 6s
2026-07-23 08:25:55 -04:00
156adeab59 Validate email addresses on both public form endpoints
The ROI calculator accepted the email field with no validation at all and
stored whatever arrived, which is where the spam submissions were putting
shell-command payloads. Nothing was executable — there is no child_process
or eval in the codebase and all writes are parameterized — but the junk was
being persisted, and the field is the obvious place to stop it.

Adds security.validateEmail(), deliberately stricter than RFC 5322: the
local part is limited to the characters real addresses use, which excludes
every shell metacharacter (; | & ` $ ( ) < > \ " ' space) and CSV-injection
lead-ins. Also rejects control characters (including the CR/LF used for
mail-header injection), caps lengths at 254/64/253, rejects non-strings,
and normalizes to trimmed lowercase before storage.

Applied to /api/calculate (optional field — empty is fine, present must be
valid) and to /api/leads, replacing its much weaker regex. The client
mirrors the check for immediate feedback; the server remains authoritative.

Also hardens the /api/leads required-field checks, which called .trim() on
unvalidated input and returned a 500 rather than a 400 when a bot posted a
non-string.

Trade-off: RFC-legal but vanishingly rare addresses (foo!bar$baz@x.com, a
leading + in the local part) are rejected. Those characters are the
injection surface.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 08:25:22 -04:00
c6425887f1 Merge pull request 'Add abuse protection to the ROI calculator form' (#24) from feature/roi-calculator-captcha into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
2026-07-23 07:13:58 -04:00
04ef642775 Add abuse protection to the ROI calculator form
The calculator endpoint was open to anyone, and it has been collecting
spam submissions. Add a layered guard that runs before anything is
written to the DB or sent to the AI provider:

- Cloudflare Turnstile CAPTCHA, verified server-side (active when
  TURNSTILE_* keys are configured; fails closed if unverifiable)
- Honeypot field that only bots fill in
- Signed, single-use form token enforcing a 4s minimum fill time
- Per-IP rate limiting (5 per 10 min, 25 per 24h)

Layers 2-4 need no configuration and work on their own, so submissions
are throttled immediately; adding Turnstile keys upgrades it to a full
challenge. Blocked submissions now stop the flow client-side instead of
silently showing a result.

Also sets `trust proxy` for correct client IPs behind nginx, caps the
JSON body at 32kb, and fixes a latent ReferenceError in the
"AI not configured" branch that called saveCalcSubmission() before the
variables it closes over were declared.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 07:13:14 -04:00
50fdbb1b1d Merge pull request 'Insights: How to Read Your HOA's Reserve Fund Health Score' (#23) from feature/insights-hoa-reserve-fund-health-score-2026-07-15 into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #23
2026-07-15 19:29:57 -04:00
080be485fe Add Insights article: How to Read Your HOA's Reserve Fund Health Score (2026-07-15)
- New article: articles/hoa-reserve-fund-health-score.html
- Updated articles/index.html with new card (newest first)
- Updated sitemap.xml with new URL entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-15 09:05:24 -04:00
acb1818e5d Merge pull request 'Insights: 5 Questions Every HOA Board Should Ask at Every Meeting' (#22) from feature/insights-hoa-board-meeting-financial-questions-2026-07-01 into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #22
2026-07-10 10:05:45 -04:00
f0733a106c Add Insights article: 5 Questions Every HOA Board Should Ask at Every Meeting (2026-07-01)
- New article: articles/hoa-board-meeting-financial-questions.html
- Updated articles/index.html with new card (newest first)
- Updated sitemap.xml with new URL entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 09:04:51 -04:00
c88ee544d6 Merge pull request 'Insights: What HOA Boards Get Wrong About Cash Flow Management' (#21) from feature/insights-hoa-cash-flow-management-mistakes-2026-06-15 into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #21
2026-06-15 09:40:43 -04:00
d70b614485 Add Insights article: What HOA Boards Get Wrong About Cash Flow Management (2026-06-15)
- New article: articles/hoa-cash-flow-management-mistakes.html
- Updated articles/index.html with new card (newest first)
- Updated sitemap.xml with new URL entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 09:36:04 -04:00
3e113cadd8 Update index.html
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Tweaks to working of v2 site.
2026-06-10 09:30:00 -04:00
a0032d17fa Merge pull request 'V2 fixes: full-size wordmark logo in nav/footer, legible legal pages' (#20) from 2026-June-V2-Site-Fixes into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #20
2026-06-10 09:22:54 -04:00
7cdf96fbe9 V2 fixes: full-size wordmark logo in nav/footer, legible legal pages
- Nav and footer now use the logo SVG alone (it already contains the
  HOA LedgerIQ wordmark) at correct aspect ratio, dropping the
  redundant text spans and the 36x36 square sizing that shrank it
- Privacy and Terms pages: replaced V1 dark-theme inline colors
  (white headings, light gray body) with dark ink colors for the
  V2 white background

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 08:52:46 -04:00
13a1136375 Merge pull request 'V2 site: Apple-inspired redesign with SEO, native pricing, FAQ, and mobile nav' (#19) from 2026-June-V2-Site into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #19
2026-06-10 08:44:10 -04:00
86a80deaf8 V2 site: Apple-inspired redesign with SEO, native pricing, FAQ, and mobile nav
Implements the revised website enhancement requirements:
- Light, clean Apple-style layout (system font stack, pill buttons,
  generous whitespace) with a dark AI showcase section
- SEO foundation: meta description, Open Graph, Twitter Card, and
  JSON-LD (SoftwareApplication, Organization, FAQPage)
- Native HTML pricing tiers (Starter $29 / Professional $79 /
  Enterprise custom) with monthly-annual toggle, replacing the
  uncrawlable iframe; pulled from app.hoaledgeriq.com/pricing
- New sections: How It Works (3 steps), trust bar, FAQ accordion,
  spreadsheet comparison table, closing CTA
- Mobile hamburger menu (nav previously disappeared under 640px)
- Pillar pages surfaced in footer (investment, reserve studies,
  assessment calculator)
- Performance: deferred Chatwoot load, image dimensions, preload
  hints, no blocking webfont
- Accessibility: skip link, aria states, prefers-reduced-motion
- ROI calculator preserved (same IDs/handlers in app.js); new v2.js
  for hamburger, billing toggle, section highlighting, GA4 events
- Legacy article styles retained so Insights pages keep working

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-09 20:08:59 -04:00
02da465b0e Merge pull request 'Add Insights article: HOA Financial Transparency: What Homeowners Deserve to Know (2026-06-01)' (#18) from feature/insights-hoa-financial-transparency-2026-06-01 into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #18
2026-06-03 15:23:08 -04:00
bc510d93ab Add Insights article: HOA Financial Transparency: What Homeowners Deserve to Know (2026-06-01)
- New article: articles/hoa-financial-transparency.html
- Updated articles/index.html with new card (newest first)
- Updated sitemap.xml with new URL entry and fixed malformed burnout entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-03 15:20:14 -04:00
5d5d081209 Update articles/hoa-treasurer-burnout-guide.html
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Fixing Screenshot carousel issues
2026-05-17 09:56:40 -04:00
71d9e6b7fd Merge pull request 'Update articles/index.html' (#17) from insights-article-5-15-fixes into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #17
2026-05-17 09:53:04 -04:00
c62cfd857a Merge pull request 'Update articles/hoa-treasurer-burnout-guide.html' (#16) from joebot-patch-515-fixes into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #16
2026-05-17 09:52:45 -04:00
a849af7f6c Update articles/hoa-treasurer-burnout-guide.html 2026-05-17 09:52:30 -04:00
23c6d1bccf Update articles/index.html 2026-05-17 09:48:30 -04:00
98f96ca065 Merge pull request 'Insights: The True Cost of Volunteer Treasurer Burnout (And How to Fix It)' (#15) from feature/insights-hoa-treasurer-burnout-2026-05-15 into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #15
2026-05-16 20:19:44 -04:00
e2b87e26e8 Add Insights article: The True Cost of HOA Treasurer Burnout (2026-05-15)
- New article: articles/hoa-treasurer-burnout-guide.html
- Updated articles/index.html with new card (newest first)
- Updated sitemap.xml with new URL entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 18:59:59 -04:00
6606b12c35 Merge pull request 'Insights: CD Laddering for HOA Reserve Funds: A Practical Guide' (#14) from feature/insights-hoa-reserve-fund-cd-laddering-2026-05-07 into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #14
2026-05-06 16:37:10 -04:00
e446afc772 Update articles/hoa-reserve-fund-cd-laddering.html 2026-05-04 14:39:50 -04:00
94ec216def Add Insights article: CD Laddering for HOA Reserve Funds: A Practical Guide (2026-05-07)
- New article: articles/hoa-reserve-fund-cd-laddering.html
- Updated articles/index.html with new card (newest first)
- Updated sitemap.xml with new URL entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 11:18:43 -04:00
bc3edc176b Merge pull request 'Insights: HOA Budget Season: A Step-by-Step Guide for Treasurers' (#13) from feature/insights-hoa-budget-season-guide-2026-05-01 into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #13
2026-05-02 14:51:15 -04:00
176655239b Add Insights article: HOA Budget Season: A Step-by-Step Guide for Treasurers (2026-05-01)
- New article: articles/hoa-budget-season-guide.html
- Updated articles/index.html with new card (newest first)
- Updated sitemap.xml with new URL entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 14:45:26 -04:00
88447bae3c Merge pull request 'Insights: Special Assessments: How to Avoid Them With Better Planning' (#11) from feature-insights-2026-04-21 into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #11
2026-04-21 09:54:52 -04:00
c5dc16c988 Merge branch 'main' into feature-insights-2026-04-21 2026-04-21 09:54:28 -04:00
b96c0c3007 Update articles/hoa-special-assessments-prevention.html 2026-04-21 09:54:09 -04:00
2bef81d71e Merge pull request 'Go-live: remove Coming Soon, add Start Free Trial CTAs, embed pricing page' (#12) from feature-golive into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #12
2026-04-21 09:45:54 -04:00
e5c4723bfa Add Insights article: Special Assessments: How to Avoid Them With Better Planning (2026-04-21)
- New article: articles/hoa-special-assessments-prevention.html
- Updated articles/index.html with new card (newest first)
- Updated sitemap.xml with new URL entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 09:43:57 -04:00
3e0969e682 Go-live: remove Coming Soon, add Start Free Trial CTAs, embed pricing page
- Remove coming-soon banner from all pages (index, articles, SEO pages, legal pages)
- Replace all "Get Early Access" CTAs with "Start Free Trial" → https://app.hoaledgeriq.com/pricing
- Hero CTA updated to "Start Your Free 14-Day Trial"
- Pricing section: replace static pricing grid with live iframe embed from app.hoaledgeriq.com/pricing
- Add .pricing-embed-wrap / .pricing-embed / .pricing-embed-fallback CSS
- Hide lead capture signup section (preserved with style="display:none" for future use)
- Update footer "Early Access" → "Start Free Trial" across all pages
- Update calculator CTA → https://app.hoaledgeriq.com/pricing
- Remove "Coming soon to hoaledgeriq.com" copy from privacy/terms footers
- Pages updated: index.html, styles.css, reserve-study-software.html, investment-management.html,
  special-assessment-calculator.html, privacy.html, terms.html, articles/index.html,
  articles/why-we-built-hoa-ledgeriq.html, articles/hoa-financial-blind-spots.html

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 09:38:19 -04:00
5cc20df0df Changing Screenshots
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
2026-04-02 08:39:26 -04:00
46a1ab61b8 Upload files to "img"
All checks were successful
Deploy to Production / deploy (push) Successful in 9s
2026-04-02 08:12:18 -04:00
7769a8cbe0 New Screenshot Pack
All checks were successful
Deploy to Production / deploy (push) Successful in 4s
Adding additional product screenshots to repository using the Sunny Valley Demo Tenant.
2026-04-02 08:11:39 -04:00
e4105fe410 Merge pull request 'New Cash Flow Screenshot' (#10) from joebot-screenshot-fix into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #10
2026-04-02 07:52:17 -04:00
8a4b98bed3 New Cash Flow Screenshot
Should fix height discrepency.
2026-04-02 07:51:46 -04:00
b2dc28c0df Merge pull request 'Fix carousel height jumping by stacking slides with CSS grid' (#9) from bugfix/carousel-fixed-height into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #9
2026-04-02 07:47:38 -04:00
6b6bfea220 Fix carousel height jumping by stacking slides with CSS grid
Replace display:none/flex slide toggling with CSS grid stacking so all
slides always occupy the same layout cell. The container height is now
fixed at the tallest image height — no more text jumping below the
carousel as slides change. Also enables the existing opacity fade
transition which was previously blocked by display:none.

Affects: index.html, articles/why-we-built-hoa-ledgeriq.html,
         articles/hoa-financial-blind-spots.html, and all future articles.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 07:45:49 -04:00
63ef2e59ca tweaked product references
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
2026-04-02 07:40:38 -04:00
80dd6ba5e6 updates and tweaks to article
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
2026-04-01 13:27:33 -04:00
a4e25eb49d Merge pull request 'Add Insights blog section with two founding articles' (#8) from feature/insights-blog into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #8
2026-04-01 13:12:07 -04:00
bd20195df3 Add Insights blog section with two founding articles
- Create articles/ directory with hub index page (newest-first card grid)
- Add Article 1: "Why We Built HOA LedgerIQ" (March 16, 2026, founder story)
- Add Article 2: "5 Financial Blind Spots Putting Your HOA at Risk" (April 1, 2026, use case)
- Both articles include screenshot carousel, article CTA, prev/next nav, and full SEO meta
- Add blog/article CSS to styles.css (hub hero, card grid, article prose, showcase, CTA)
- Add "Insights" nav link to index.html, reserve-study-software.html, investment-management.html
- Add "Insights" to footer Pages column on all pages (index.html gets a Pages column added)
- Add articles/ pages to sitemap.xml with appropriate priorities and lastmod dates

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 13:04:55 -04:00
2b67cf2f69 Merge pull request 'Fix free trial period from 30 days to 14 days across all pages' (#7) from fix/trial-period-14-days into main
All checks were successful
Deploy to Production / deploy (push) Successful in 3s
Reviewed-on: #7
2026-04-01 11:45:07 -04:00
5f934e70eb Fix free trial period from 30 days to 14 days across all pages
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 11:37:42 -04:00