From car-hunter
Build or update an interactive depreciation analysis dashboard for car listings. Use when the user asks to "update the dashboard", "rebuild the depreciation dashboard", "analyse car values", "show me the depreciation curve", "update car value analysis", "build the dashboard", or any request related to analysing pricing, depreciation, or value retention for a tracked car. Config-driven: reads the active car profile.
How this skill is triggered — by the user, by Claude, or both
Slash command
/car-hunter:car-value-dashboardThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Build or update an interactive HTML dashboard that analyses car listings to help make informed purchase decisions. Uses multivariate regression to score value, identify negotiation opportunities, and visualise depreciation curves. Fully config-driven from a car profile.
Build or update an interactive HTML dashboard that analyses car listings to help make informed purchase decisions. Uses multivariate regression to score value, identify negotiation opportunities, and visualise depreciation curves. Fully config-driven from a car profile.
car-search skill, to visualise the collected data${CLAUDE_PLUGIN_DATA}/profiles/ (created via the setup-car-profile skill)car-search skill, in the user's workspace at {profile_name}-searches/If multiple profiles exist, ask which car to build the dashboard for.
The dashboard is generated by a Python builder script at ${CLAUDE_PLUGIN_ROOT}/scripts/build_dashboard.py that:
The script is fully config-driven via CLI arguments - do not copy, edit, or regenerate it per profile. Invoke it in place from the plugin via ${CLAUDE_PLUGIN_ROOT}/scripts/build_dashboard.py and let the profile JSON drive everything.
${CLAUDE_PLUGIN_DATA}/profiles/{profile_name}.json
{profile_name}-searches/{profile_name}-all-listings-{YYYY-MM-DD}.csv
These are maintained as dictionaries in the Python builder, keyed by composite key {price}_{location}. These are manually updated each search session. The builder script should include placeholder dictionaries that the user populates.
If profile.listing_id_date_encoding.enabled is true, extract dates from AutoTrader listing IDs (first 8 digits = YYYYMMDD) to calculate days on market.
Features (config-driven):
age_months (always)mileage (always)spec_score (always -- computed from profile.spec_options weights)is_tier_1, is_tier_2)The variant features are generated dynamically from profile.variants:
for variant in profile["variants"]:
if variant["tier"] > 0:
features.append(f"is_tier_{variant['tier']}")
spec_score = sum of (boolean_value * spec_option.weight) for each spec in profile.spec_options.
Method: OLS via normal equations with Gaussian elimination and partial pivoting. No external libraries required.
Output per listing:
predicted_price -- what the model expects this car to costvalue_deviation -- actual minus predicted (negative = undervalued)value_deviation_pct -- deviation as percentageMinimum data: Only cars aged >= 6 months are included in the regression to avoid skewing from brand-new stock.
For each spec option in profile.spec_options, compare mean regression residual for cars with vs without that option. This isolates the market premium after controlling for age, mileage, and variant.
Requires at least 3 cars with and 3 without the spec for a valid comparison.
All chart configurations read variant names, colours, and labels from the profile.
profile.variants[].colourprofile.spec_options[].label)profile.variants[].colourSortable table of all used listings. Fixed columns:
| Column | Data |
|---|---|
| Variant | variant name |
| Age | age_years (1dp) |
| Price | asking price |
| Expected | predicted price |
| Value | deviation tag (green/blue/amber/red) |
| Mileage | odometer |
| Dep/yr | depreciation_pa (N/A for < 6 months) |
| Days | days_on_market |
| Trend | price_change arrow |
| Spec | spec labels from profile (highlighted tags for target options) |
| Location | dealer town (clickable link if URL available) |
Default sort: best value first (lowest deviation).
All charts, KPIs, Market Pulse, and the table respond to filters:
profile.variants[].nameprofile.generations[].labelprofile.dashboard.mileage_filter_optionsprofile.dashboard.budget_filter_optionsDefault selections use profile.dashboard.mileage_filter_default and profile.dashboard.budget_filter_default.
Shows rolling market health metrics:
Note: sold/removed and new arrivals are currently hardcoded from manual comparison between search snapshots. Future versions could automate this by diffing CSV archives.
Read from profile.generations[].new_prices. Used for depreciation calculations. Display in the dashboard for context.
Read from profile.reg_date_mapping. Used to convert UK reg plate codes to decimal dates for age calculation.
Read colours from profile.dashboard.theme:
theme.bgtheme.card_bgtheme.card_bordertheme.texttheme.text_mutedprofile.variants[].colourhighlight is trueFont: system sans-serif stack. Responsive grid with mobile breakpoint at 900px. Chart.js 4.4.1 from CDN.
The builder script lives in the plugin at ${CLAUDE_PLUGIN_ROOT}/scripts/build_dashboard.py and is never copied into user workspaces. User artefacts are saved to the {profile_name}-searches/ folder in the user's workspace:
{profile_name}-dashboard.html -- self-contained, opens in browser{profile_name}-all-listings-{YYYY-MM-DD}.csv -- date-stamped archive${CLAUDE_PLUGIN_DATA}/profiles/{profile_name}.json{profile_name}-searches/ folder in the user's workspacecar-search skill firstpython3 ${CLAUDE_PLUGIN_ROOT}/scripts/build_dashboard.py --profile "${CLAUDE_PLUGIN_DATA}/profiles/{profile_name}.json" --csv <latest.csv> to regenerate the dashboardis_brand_new_stock)variant.standard_specs when interpreting spec dataprice_location) MUST be used for LISTING_IDS and PRICE_CHANGES to avoid duplicate location collisionsprofile.dashboard.titlenpx claudepluginhub zal4dw/car-hunter --plugin car-hunterProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.