Files
arnaudne 2bb80a8475 Add target comparison modal, integration goal progress, and session planning + full catalog expansion
Features added this session:
- Target comparison: side-by-side overlay (CompareModal) from Targets page via ⊕ button on each row; shows altitude curves, key times, filter recommendations and per-filter integration progress for two targets simultaneously
- Integration goal progress dashboard card: per-target keeper minutes vs goal hours (from CLAUDE.md §16.3) broken down by filter, with color-coded progress bars; powered by new stats.integration_goals backend query
- Session planning timeline: Gantt-style "Plan Tonight" section on Dashboard (PlanningTimeline component) — search targets, set durations, sequential scheduling from dusk, overrun warnings, clipboard export
- Slew-optimized run order toggle (nearest-neighbor sort by RA/Dec angular distance)
- Best Nights 14-day card + Monthly Highlights card on Dashboard

Catalog expansions:
- Sharpless (Sh2), VdB, LDN, Barnard dark nebulae, LBN, Melotte, Collinder, Gum, RCW, Abell PN, Abell GC, PGC bright subset
- Caldwell/Arp/Melotte/Collinder number columns + cross-reference maps
- Weather score multiplier applied to composite sort
- galaxy_cluster type (ACO badge) throughout TypeBadge, CSS, filter chips

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 07:20:10 +02:00

13 KiB
Raw Permalink Blame History

Astronome — TODO

Missing Spec Items

  • Settings — catalog info — shows last refreshed date + DB size in App Info table
  • Detail Drawer Tab 3 — workflow card — WorkflowCard renders steps + notes (was already built, now confirmed)
  • Stats page — guiding charts — Guiding RMS over time as a proper LineChart (Total/RA/Dec lines)
  • Calendar day panel — weather — clicking a day shows go/nogo, temp, cloud cover, seeing from 7timer
  • New Moon timeline — best targets overlay — top 3 emission nebulae shown per new moon window (from /api/calendar/new-moon-windows)

New Features

High Priority

  • Integration progress tracker — per-target progress bar (% of goal hours) with color coding; goal hours from CLAUDE.md §16.3 table; shown on TargetRow in a "Goal" column
  • Nightly recompute trigger — "Recompute Tonight" button in Settings → POST /api/nightly/recompute
  • Export imaging log as CSV — "↓ Export Log CSV" button on Stats page → GET /api/log/export

Medium Priority

  • Object planning notes — per-target free-text field in Detail Drawer Tab 4; saved to target_notes table; auto-saves on blur
  • Filter accumulation breakdown — keepers-only integration per filter shown in Detail Drawer Tab 4 (above session list); from /api/log/:id filter_breakdown field
  • Moon avoidance cone on altitude curve — blue shading when moon is above horizon; amber shading when moon sep < 30°

Nice to Have

  • Seasonal visibility heatmapYearlyVisibility.tsx replaced bar chart with a 12×31 SVG calendar heatmap. Each cell = one day, colored by alt_at_midnight (green/teal/amber/muted). Blue moon overlay (opacity ∝ illumination). Hover tooltip shows date, alt, usable hours, moon %. Today ring in amber.

Bugs & Fixes

  • Fix gallery image upload — root cause: ServeDir was mounted at URL /data/gallery (nginx sends that path to frontend, not backend). Fixed by remounting ServeDir at /api/gallery/files/. Updated all gallery image URL formats in gallery.rs. Also fixed api.gallery.upload to throw on non-2xx responses so errors surface in the UI.

  • Fix Custom Object coordinate calculations — root cause: get_target, get_visibility, get_curve, get_filters, get_yearly, and get_workflow_handler in targets.rs all queried only the catalog table, returning 404 for custom objects. Fixed by adding a lookup_coords helper that falls back to custom_targets table; get_target now returns a full response shape with null catalog-specific fields for custom objects.


Observing & Planning

  • Improve "best tonight" algorithm with composite score — composite score (alt*0.4 + fill*0.3 + usable*0.2 + moon*0.1) is the default sort in list_targets. "Best Score Tonight" and "Altitude tonight" both exposed as sort options in Targets page.

  • Custom horizon in target visibility — fixed usable_min/best_start/end in visibility.rs to use max(30°, horizon_alt(az)) instead of flat 30°. Added is_visible_tonight column to nightly_cache (with runtime migration). Nightly precompute now stores the flag. list_targets tonight filter uses is_visible_tonight = 1 with fallback to max_alt_deg >= 15 for pre-migration rows.

  • Show custom and solar system objects in Targets listlist_targets appends custom_targets (with RA/Dec) on page 1 with live-computed current altitude. Frontend: is_custom flag renders a teal "CUSTOM" pill in TargetRow; TypeBadge extended with USR/SAT/CMT labels; "Custom" toggle chip added to filter bar (teal, default on).

  • Greatly improve Targets filtering and sorting:

    • Multi-select object type filter — multi-select chips; comma-separated type param parsed server-side.
    • Best tonight sort — "Best Score Tonight" is default; "Altitude tonight" added as explicit sort option.
    • Persist filter state — all filter/sort state saved to localStorage (astronome_targets_filters_v2).
    • Additional filter dimensions — min altitude, min usable time already present.
    • Remaining: multi-select catalogue filter, FOV/SB ranges, constellation multi-select, session window.
  • Add Astrobin search links in target detail — added two Astrobin links (by common name and by catalog ID) in Detail Drawer Tab 2, plus a GoTo coordinates card with RA/Dec copy buttons and live hour angle / eastwest meridian indicator.

  • Moon path on altitude graph — already implemented: CurvePoint.moon_alt_deg populated in backend, rendered as dim blue dashed Line in AltitudeCurve.tsx; moon-above-horizon windows shaded in subtle blue, close-approach (<30°) shaded in amber.

  • Merge "Tonight" and "Target" tabs in Detail Drawer — combined into single "Overview" tab: DSS + metadata left column, altitude curve + key times right column; GoTo card + Aladin below the fold.

  • Tonight run order — Dashboard "Tonight's Run Order" Gantt-style card: each target row shows a bar across the night window (colored by filter), with start→end time. Targets sorted by best_start_utc. Also added "Run order (imaging window)" sort option to Targets page.

  • Moon separation live warning — red banner on Dashboard when the moon is within 20° of any top-5 tonight target. Uses moon_sep_deg from nightly_cache already fetched for the target list.

  • Altitude urgency indicatorlist_targets SQL joins a 90-day peak subquery; computes urgency field: peak (≥90% of seasonal max), rising (7090%, before peak date), declining (7090%, after peak date). TargetRow renders ▲ peak / ↗ rising / ↘ declining in matching semantic colors below the common name.

  • Imaging time calculator — SNR-based sub count estimator added to Filters & Workflow tab. Interactive SNR slider (1050), computes subs needed, total time, sessions needed. Uses IMX571 sensor constants (read noise 3.5e-, dark 0.002e-/px/s), per-filter sky backgrounds, surface_brightness from catalog.


Equipment & Sessions

  • Integration gap detector — Dashboard card showing targets with data in one narrowband filter but missing the companion (sv220↔c2, uvir↔sv260). Computed via new SQL query in stats.rs, surfaced as integration_gaps in the stats response, and displayed as a filter-gap card on the Dashboard.

  • Dew heater alarmDewAlert.tsx now triggers a browser Notification (requests permission on first alert) when level appears or escalates. Tag dew-alert prevents duplicate notifications.

  • Session checklistSessionChecklist.tsx collapsible card on Dashboard with 6 items (polar alignment, focus, guiding, dew heater, battery, cap). State in localStorage keyed by dusk date — auto-resets each evening. Progress bar + "Ready" indicator.

  • Equipment profiles — Settings page section. localStorage-based profiles showing plate scale, FOV. Current hardcoded AT71+ATR2600C shown as ACTIVE. Add/Edit/Delete UI with live preview of plate scale and FOV.


Post-Processing

  • PixInsight WBPP project generator — button on Detail Drawer Tab 3 that generates a .bat/.sh script or folder structure stub for WBPP. Out of scope for now (requires XISF format knowledge).

Catalog & Discovery

  • Sharpless catalog (Sh2) — 299 entries from VizieR VII/20 with popular names (Cave, Lion, Dolphin, etc.)

  • Check LdN and VdB implementations — LDN now fetches 1724 entries from VizieR VII/7A; VdB fetches 158 entries from VizieR VII/21A; popular_names.rs verified; Cl+N type bug fixed (IC1396 Elephant Trunk now included)

Additional Catalogue Ingestion

The pipeline already handles NGC, IC, Messier (as NGC cross-refs), Sh2, VdB, LDN. The following need dedicated fetch modules in catalog/ following the same VizieR TSV pattern used by sh2.rs / ldn.rs. Each needs: fetch + parse + deduplicate against existing entries (match on RA/Dec within 2) + upsert into catalog table + popular names entries in popular_names.rs.

  • Caldwell cataloguecaldwell_num INTEGER column added via migration; hardcoded map in caldwell.rs populates after each catalog upsert. C20, Arp85 prefix search supported. C-number shown in TargetRow (blue, only when no Messier num). Also added arp_num column and Arp map.

  • LBN (Lynds Bright Nebulae)lbn.rs fetches VizieR VII/9. Positional dedup against NGC/IC/Sh2 (2' radius). Class field used for emission vs reflection typing. Fallback hardcoded set.

  • GUM cataloguegum.rs fetches VizieR XI/75, Dec filter ≥ -30°. Positional dedup against existing catalog. Hardcoded fallback for VizieR failures.

  • RCW cataloguercw.rs fetches VizieR VIII/76, Dec filter ≥ -30°. Positional dedup.

  • Barnard catalogue (B)barnard.rs fetches VizieR VII/220A. Positional dedup against LDN. Hardcoded fallback includes B33 (Horsehead), B72 (Snake), B142/143, etc. Popular names wired in.

  • Abell Galaxy Clustersabell_gc.rs fetches VizieR VII/110A. New galaxy_cluster type added. TypeBadge shows "ACO", purple badge. Added to Targets filter chips and filter/sv260 suitability. Difficulty 4-5 based on m10 brightness.

  • Abell Planetary Nebulaeabell_pn.rs fetches VizieR V/74. Positional dedup. All set difficulty=5, hubble_type="low-SB PN — narrowband only". Prominent fallback set includes Abell 21 (Medusa), Abell 74, etc.

  • Arp cataloguearp_num INTEGER column added via migration, populated from caldwell.rs arp_map(). "Arp85" prefix search already supported in list_targets. Notable entries include Arp 85=M51, Arp 244=Antennae Galaxies.

  • Melotte cataloguemelotte_num INTEGER column added via migration. Hardcoded cross-reference map populates after upsert. Standalone entries added: Mel 20 (Alpha Per), Mel 25 (Hyades), Mel 111 (Coma Star Cluster).

  • Collinder cataloguecollinder_num INTEGER column added via migration. Cross-reference map + Cr399 (Brocchi's Coathanger) standalone entry.

  • PGC (Principal Galaxy Catalogue) bright subset — PGC contains millions of galaxies; ingesting all is impractical. Add only the "bright" subset: PGC objects with B_Mag < 14.0 not already in NGC/IC. Source: VizieR VII/237. Expect ~5000 new entries. Adds fainter NGC-complement galaxies for completeness. Object type: galaxy.

  • "Similar targets nearby" suggestionsGET /api/targets/:id/similar returns same obj_type + constellation within 25° RA. Shown in Overview tab as "Similar Targets Nearby" before Aladin embed.

  • Observation history timelineSessionTimeline on Stats page: sessions grouped by date, thumbnail (or star placeholder), filter pill, integration time, quality chip. Backend history field added to /api/stats.


Planning & Scheduling

  • Best nights ranking (14-night view)/api/calendar/best-nights endpoint returns 14 nights scored by moon*0.5 + dark*0.5. Dashboard card shows date, score bar, moon %, sorted by date (best score highlighted). Top 3 targets per night from nightly_cache.

  • Weather score in target rankinglist_targets fetches go_nogo from weather_cache and applies a multiplier (go=1.0, marginal=0.7, nogo=0.3) to the composite best-score sort. Defaults to 1.0 when forecast unavailable.

  • Session planning timeline — "Plan Tonight" mode: user selects an ordered set of targets, each assigned a duration. Renders a Gantt-style timeline (dusk→dawn, x-axis UTC) with color-coded blocks per target showing overlap with that object's visibility window. Warn when a target block extends past its set time. Exportable as a plain-text run order (e.g. "21:45 NGC7000 · 2h → 23:45 IC1805 · 1h30 → …").

  • Monthly highlights/api/calendar/monthly-highlights returns top 8 objects this month (by peak alt, preferring unimaged). Dashboard card shows name, type, peak alt, filter, imaged status.

  • Seasonal peak indicator on target rows — already implemented as urgency field: ▲ peak (≥90% of seasonal max), ↗ rising, ↘ declining. Shown below common name in TargetRow.


Catalogue Completion & Progress

  • Catalogue completion tracker — Stats page grid: Messier, Sharpless, LDN, VdB, NGC, IC progress bars with keeper counts and 🏆 badge on completion. Backend computes totals dynamically.

  • Beginner-friendly filter — "Accessible tonight" chip on Targets page: applies min_alt≥40°, usable≥60min server-side, plus difficulty≤2 and moon_sep≥45° client-side.

  • Deep-linkable target URLs — added /targets/:targetId React Router route. URL updates when a drawer is opened; navigating directly to /targets/NGC7000 pre-opens that drawer and disables the tonight-only filter so the target is always found.


GoTo Mount Integration

  • GoTo coordinates card — already in Overview tab: RA/Dec with copy buttons, live hour angle, East/West meridian indicator.

  • Slew-order optimizer — "⟳ Slew-optimized order" toggle in the Run Order card. Nearest-neighbor heuristic on RA/Dec angular distance reorders tonight's targets. Pure frontend, no backend needed.