Added
Changed
Fixed
Removed
v0.9 April 20, 2026 Major Feature Backend
GaitPrint — Movement Analysis Tool
  • AddedGaitPrint tool integrated across the app — new dashboard panel (panel-gait) embeds gaitprint.html in an iframe with "Open in new tab" fallback. Sidebar entry with NEW badge.
  • AddedOverview teaser card — gradient tool card on the dashboard overview nudges sellers toward GaitPrint before they post.
  • Added"Analyze Gait" deep-link on listing videos — any listing with a video in the browse detail modal now shows a sky-blue button that opens GaitPrint pre-loaded with ?video=<url>&listing=<id>.
  • AddedHome-page GaitPrint section — new marketing strip between "Why HayMarket" and "Types" sections with stride-pattern SVG mockup and a sky-blue "Try GaitPrint Free" CTA.
Pedigree-Aware Search
  • AddedBloodlines knowledge basebloodlines.php ships with a curated thesaurus covering the top cutting, reining, western pleasure, and barrel/rodeo sire families (Metallic Cat, Peptoboonsmal, Hollywood Dun It, Zippos Mr Good Bar, Bugs Alive in 75, A Streak of Flame, etc.) plus foundation lines (King, Leo, Doc Bar, Joe Hancock).
  • AddedSearch expansionlistings.php q and breed filters now call expand_bloodline_terms() to also match descendants/ancestors. Searching "Bug" returns horses with "Bugs Alive in 75" in bloodlines; searching "Jameson" returns A Streak of Flame lineage.
  • AddedAutocomplete — browse page Search and Breed/Bloodlines fields now wire to a shared <datalist> populated from GET /listings.php?action=bloodline_suggest&q=X.
  • AddedPedigree hint copy — small italic subtitle on the browse search field reminds users that searches are pedigree-aware.
Dashboard — New Panels
  • AddedMessages panel — inbox with conversation threads, unread badges, chat-style message bubbles, and inline reply. Sidebar badge reflects unread count.
  • AddedOffers & Bids panel — sellers can view every offer received on sale listings and respond with Accept / Decline / Counter (with amount input). Second tab lists all bids received with "High bid" vs "Outbid" labels.
  • AddedAccount panel — profile editor (name, phone, location, bio) with Near Me location button. Footer Sign Out button.
  • FixedDead sidebar buttons — Messages, Account, and Sign Out buttons in the desktop sidebar are now wired to their panels / HM.logout() instead of being non-functional placeholders. Mobile bottom-nav Messages tab now functional.
Browse — Watchlist
  • AddedSave / unsave toggle — heart icon on every listing card and in the detail modal header. State persists via api.php?action=save and is loaded on page init so hearts reflect the signed-in user's watchlist.
  • FixedURL type parambrowse.html?type=auction now pre-selects the correct type tab on load.
Index — Video Behavior
  • ChangedAll hero videos play exactly once per page loadheroVid.loop = false at every entry point (initial autoplay, post-spots handoff to thismightbetheeasiest.mp4, spots playlist). No more infinite background loop; refresh the page to watch again.
API
  • AddedGET /listings.php?action=bloodline_suggest&q= — ranked autocomplete over the bloodlines thesaurus.
  • AddedGET /api.php?action=offers_received — every offer placed on the authed user's listings, joined to buyer and horse.
  • AddedGET /api.php?action=bids_received — all bids on the authed user's auctions, with bidder info and high-bid status.
  • AddedPOST /api.php?action=update_profile — updates name, phone, location, and bio on the users row; returns the fresh user object.

v0.8 April 15, 2026 Fix UI Feature
Auth / Nav Fixes
  • FixedSign Out brokenHM and HMLocation are now explicitly assigned to window.HM and window.HMLocation so inline onclick handlers can always resolve them.
  • FixedNav avatar CSS missing on index/browse.nav-avatar and .nav-username styles added to the authStyles block injected by auth.js, so the initials circle renders correctly on every page.
  • FixedHMLocation is not defined — root cause was auth.js being loaded after inline scripts that referenced it. Resolved by: (1) moving <script src="auth.js" defer> to <head> on all pages, (2) defining HMLocation and HM at module scope before DOMContentLoaded, (3) exposing both as window.* globals.
  • Changedauth.js v3HM.ready() replaces the old HM.init() pattern. Returns a singleton promise that resolves to the current user after one fetch. Safe to call multiple times — only fetches once. init() kept as alias.
Index — Video Behavior
  • ChangedHero video muted by default — starts silent on page load for autoplay compatibility. 🔇/🔊 toggle button added to the video bar to flip sound on/off at will.
  • Changed"Watch Our Spots" — scroll to top — page now scrolls to top automatically when the button is clicked, so the video panel is immediately visible.
  • ChangedSpots play once, no repeat — after all three spots finish, button shows "✓ Spots played" and stays disabled. Hero resumes muted loop.
New Pages & Features
  • AddedContact modal — footer "Contact" link opens a modal form (name, email, subject, message). Submits to contact.php which delivers via PHP mail() to contact@haymarket.app with Reply-To set to the sender. No third-party dependencies.
  • AddedPrivacy policy — full 10-section policy at privacy.html. Covers data collection, public listing disclosure, cookies (hm_session only), third-party services, deletion rights, and contact. Linked from footer.
  • AddedToolbar position setting — Admin → Settings panel has a Top/Bottom toggle for the mobile nav bar. Writes to localStorage('hm_toolbar_pos'). Dashboard reads and applies it on load — no reload required.

v0.7 April 15, 2026 Feature Backend
Dashboard — Fully Live
  • ChangedAll static data replaced — stats row, listings table, and activity feed all pull live from api.php?action=dashboard.
  • AddedPost form wired — submits to listings.php (POST to create, PUT to update). Files upload to upload.php after save. Contact fields pre-filled from user profile.
  • AddedEdit listing — Edit button fetches full listing data and pre-fills every form field including discipline chips. Cancel Edit restores new-listing state.
  • AddedPublish / Delete actions — Publish fires listings.php?action=publish. Delete soft-removes and refreshes both overview and listings panel.
  • AddedMy Listings tabs — All / Active / Drafts / Ended filter server-side. Tab counts update dynamically.
  • AddedActivity feed live — bids, offers, messages with relative timestamps (just now / 5m ago / 3d ago). Shared renderer used by both overview preview (5 items) and full Activity panel.
  • AddedTime-aware greeting — "Good morning / afternoon / evening, [FirstName]'s Ranch" based on current hour.
Browse — Fully Live
  • ChangedAll static listings replaced — cards rendered dynamically from listings.php with real DB data. Photo/video thumbnail if uploaded, emoji fallback otherwise.
  • AddedAll filters wired — search, discipline chips, price range, age, height, sex, location, breed, vices. 400ms debounce on search input.
  • AddedDynamic detail modal — fetches full listing on click including media, bids, and seller info. Renders bid box (auctions), barter proposal box, or price + offer button as appropriate.
  • AddedAction modals — Contact Seller, Make Offer, Trade Proposal, and Place Bid all wire to real API endpoints. Require auth — trigger login modal if not signed in.
  • AddedAuction strip — appears automatically when live auctions exist in results, names the soonest-closing horse with countdown.
  • AddedPagination renders dynamically. Sort synced between mobile bar and desktop header.

v0.6 April 15, 2026 Feature Backend UI
Admin Panel
  • Addedadmin.html — full admin panel with dark sidebar nav. Panels: Dashboard (6 KPIs), Activity feed, Listings (filter/search/toggle status), Users (role management), Reports, Seed Data, Settings.
  • Addedadmin.php — backend for all admin endpoints: stats, listing list, user list, activity feed, remove listing, set listing status, set user role, delete user, seed, clear.
  • AddedSeed data — Admin → Seed Data → "Run Seed Script" creates 6 users, 8 listings across all types, bids, offers, messages, and trade proposals. Idempotent — skips existing records.
  • AddedClear All — wipes non-admin users and all content with a confirmation modal. Admin accounts preserved.
Auth — Post-Registration UX
  • AddedRegistration success message — "🎉 Welcome to HayMarket, [FirstName]!" green banner shown for 2 seconds before modal closes and nav updates.
  • AddedLogged-in index state — when signed in, index.html shows a sticky amber welcome banner, eyebrow changes to "Welcome back, [FirstName]", and hero CTAs swap to Dashboard / Browse links.
Near Me Location
  • AddedHMLocation utility in auth.js — GPS first (Nominatim reverse geocode to "City, ST"), IP fallback via ipapi.co. Caches result for session. Exposed as window.HMLocation.
  • Added📍 "Near Me" button wired to location field on browse filters and dashboard post form.
Schema
  • Addedrole VARCHAR(20) DEFAULT 'user' column added to users table. Admin seeds Tommy Lee as role='admin'.

v0.5 April 15, 2026 Feature Backend
Auth System
  • Addedauth.js — shared authentication module injected on all pages. Manages session state, renders nav, exposes HM.login(), HM.register(), HM.logout().
  • AddedLogin / Register modal — slides in from any page. Tab-switched between Sign In and Create Account. Keyboard accessible (Enter to submit, Esc to close).
  • AddedSession-aware nav — shows user initials + first name when logged in; shows "Sign In" button when logged out. Works on all three pages.
  • AddedDashboard auth gate — unauthenticated visitors hitting dashboard.html see the login modal; dashboard content is hidden until they authenticate.
  • AddedLogout button — ↩ icon in nav when signed in. Destroys session, redirects to index if on dashboard.
Backend — PHP / MySQL
  • Addedschema.sql — full database schema. 8 tables: users, listings, listing_media, bids, offers, trade_proposals, messages, saved_listings.
  • Addedconfig.php — PDO singleton, session configuration (30-day cookie), JSON response helper, auth helpers.
  • Addedauth.php — register, login, logout, /me endpoints. Bcrypt password hashing.
  • Addedlistings.php — full CRUD. Browse with 12 filter params, pagination, 4 sort modes. Ownership-checked update and soft-delete.
  • Addedupload.php — multipart file upload with real MIME validation, saves to uploads/{listing_id}/, records in listing_media.
  • Addedapi.php — bids (with min-bid enforcement), offers + respond, trade proposals, messaging/inbox/threads, save/unsave, dashboard summary, activity feed.
  • Added.htaccess — blocks directory listing, blocks PHP execution in /uploads/, security headers, 52MB upload limit.
Hero Video
  • ChangedHero video — now plays thismightbetheeasiest.mp4 with sound, looping. Removed cycling behavior.
  • Added"Watch our spots" button — plays the 3 commercial clips in sequence (Ifyouridehorses, cowboysusedto, mywifesaid2) with a 1.5s black fade between each, then returns to the hero loop.

v0.4 April 15, 2026 Feature UI
Video Integration
  • Added4 demo video clips integrated: thismightbetheeasiest.mp4, Ifyouridehorses.mp4, cowboysusedto.mp4, mywifesaid2.mp4.
  • AddedBrowse listing cards now show autoplay muted looping video thumbnails for first 3 listings.
  • AddedListing detail modals on browse.html include a full video player with controls.
  • ChangedIndex.html featured listings reverted to image placeholders — ready for real horse photos. Comments in HTML show exactly where to drop <img> tags.

v0.3 April 15, 2026 UI Fix
Mobile-First Overhaul
  • ChangedAll CSS rewritten mobile-first using min-width breakpoints (600px tablet, 960px desktop) instead of patching with max-width.
  • AddedHamburger nav on all 3 pages — animated 3-bar → X, opens slide-down drawer. Hides at 960px+.
  • AddedHero two-column layout — content left, video panel right at 960px+. Stacks on mobile.
  • AddedVideo toggle switch in hero — on/off toggle with 1.5s black fade transition. Pauses/plays video element.
  • AddedBrowse filter drawer — slide-in from left on mobile with dark overlay. Becomes sticky sidebar at 960px+ via CSS only.
  • AddedDashboard bottom tab nav — 5-tab fixed bar on mobile. Hides at 960px+ and dark left sidebar appears.
  • AddedBrowse modals sheet up from bottom on mobile, centered on desktop.
  • Fixed.htaccess error — removed <Directory> block which is not valid in .htaccess context. Replaced with RewriteRule.

v0.2 March 22, 2026 Feature UI
Core UI — Three Pages
  • Addedindex.html — Landing page. Hero with SVG landscape/horse silhouette, discipline marquee, How It Works (3-step), Featured Listings (3 cards), Why HayMarket, Listing Types explainer, CTA section, footer.
  • Addedbrowse.html — Browse/listings page. Type tabs (All/Sale/Auction/Barter), filter sidebar, listing rows with hover effect, detail modals for each listing type (sale → make offer, auction → live bid box, barter → trade proposal).
  • Addeddashboard.html — Seller dashboard. Stats row, listings table with status badges, tabbed panel system (Overview / My Listings / Post a Horse / Activity), 7-step post form with FB import bar, listing type selector, discipline chip picker, activity feed.
  • AddedDesign system — Western/rustic aesthetic. Palette: saddle brown, parchment, hay gold, ink. Fonts: Playfair Display (headings), Libre Baskerville (body), Josefin Sans (labels/UI). Rope/stitch border details, grain texture overlay, scroll-reveal animations.
  • AddedThree listing formats supported throughout: Fixed Price sale, Live Auction with bidding, and Barter/Trade.
  • AddedHorse-specific listing fields: bloodlines, discipline (chip multi-select), height, soundness, vices, quirks, maintenance.

v0.1 March 22, 2026 Foundation Backend
Project Genesis
  • AddedConcept defined- horse marketplace for a friend, Lance. Problem: horse listings are hard to find and mostly scattered across Facebook groups. Three listing formats: straight sale, barter/trade, auction. Horse-specific fields identified from a reference image: bloodlines, location, height, age, photos/video, soundness, vices, quirks, maintenance, discipline.
  • AddedStack decision — vanilla JS, PHP, MySQL per FluxForge methodology. No React, no heavy frameworks. Apache VPS. DB: thomasrlee42_haymarket.
FB Scraper — Phase 1 (Plain PHP)
  • Addedfb_scrape.php v1 — PHP scraper using file_get_contents() with a Chrome user-agent. Strips HTML/JS/CSS noise, sends raw text to Claude API (claude-sonnet-4-20250514) for structured JSON parsing. Returns 19 horse-specific fields plus a confidence score (high/medium/low).
  • AddedPasted text fallback — when Facebook returns a login wall, user can paste raw listing text; Claude parses it the same way.
  • Addedimport.html — standalone FB import UI. URL paste field, confidence badge, auto-fills a full listing form (all 19 fields + discipline chip tags + listing type selector). "Paste text instead" fallback toggle.
  • AddedClaude parsing prompt — extracts: horse_name, registered_name, breed, bloodlines, age, height_hands, sex, color, discipline (array), price, listing_type, location, sound, vices, quirks, maintenance, videos_photos, contact, description, confidence. Inference rules for listing_type from price language (asking/obo/firm = sale, bid/reserve = auction, trade/swap/considering = barter).
FB Scraper — Phase 2 (Playwright / Node)
  • Addedscraper.js — Node.js/Express microservice on port 3031. Uses Playwright + Chromium to render fully JS-hydrated Facebook pages with a saved login session cookie (fb_session.json). Routes: POST /scrape, GET /login, GET /session-status, DELETE /session. Blocks images/fonts for speed.
  • Addedfb_scrape.php v2 — updated to call the local Playwright service at http://127.0.0.1:3031 instead of direct HTTP fetch. Checks service status and login state before scraping. Falls back gracefully with actionable error messages.
  • AddedSession management — first-time FB login opens a visible Chromium browser window via GET /login. User logs in manually; session saved and reused for 30–90 days. Session persists across service restarts.
  • AddedArchitecture diagram — SVG diagram showing full pipeline: browser → fb_scrape.php → scraper.js (Playwright) → FB → Claude API → structured JSON → form auto-fill. Two zones: user's browser, server.
  • Addedpackage.json + README — npm setup (playwright, express), PM2 config for persistent service, setup guide, troubleshooting table.