Last Updated: 2026-02-28 Documentation Version: 1.4.0
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
| Date | Version | Changes |
|---|---|---|
| 2026-02-28 | 1.4.0 | Comprehensive sync: added Rust mount module, knowledge UI, icons component, 7 new stores, 19+ new hooks, astronomy engine/horizon/object-resolver subdirs, services daily-knowledge/map-providers/search subdirs, tauri mount/geolocation/map-keys APIs; fixed port references; removed stale llmdoc reference |
| 2026-02-13 | 1.3.0 | Major update: added mount-safety/simulator modules, event-sources-store, updater-store, use-object-actions/use-in-view hooks; removed titlebar/window-controls; updated module descriptions |
| 2026-02-11 | 1.2.0 | Added llmdoc/index.md with comprehensive documentation links; updated scan coverage to 98%; added logger module documentation |
| 2026-02-01 | 1.1.0 | Added tauri-api module documentation; updated scan coverage |
| 2025-01-31 | 1.0.0 | Initial comprehensive documentation with module structure diagram |
A desktop star map and astronomy planning application built with Next.js 16 + Tauri 2.9. The app integrates with Stellarium Web Engine for sky visualization and provides tools for observation planning, equipment management, and astronomical calculations.
Tech Stack:
- Frontend: Next.js 16, React 19, TypeScript, Tailwind CSS v4
- Desktop: Tauri 2.9 (Rust backend)
- UI: shadcn/ui, Radix UI, Lucide icons
- State: Zustand stores
- i18n: next-intl (English/Chinese)
graph TD
A["(root) skymap-test"] --> B["components"];
A --> C["lib"];
A --> D["src-tauri"];
A --> E["i18n"];
A --> F["tests"];
B --> B1["starmap"];
B --> B2["ui"];
B --> B3["providers"];
B --> B4["common"];
B --> B5["landing"];
B --> B6["icons"];
C --> C1["astronomy"];
C --> C2["stores"];
C --> C3["services"];
C --> C4["core"];
C --> C5["catalogs"];
C --> C6["tauri"];
C --> C7["logger"];
C --> C8["storage"];
C --> C9["offline"];
C --> C10["hooks"];
C --> C11["translations"];
C --> C12["aladin"];
C --> C13["data"];
C --> C14["feedback"];
C --> C15["constants"];
C --> C16["plate-solving"];
C --> C17["security"];
C --> C18["utils"];
D --> D1["astronomy"];
D --> D2["data"];
D --> D3["cache"];
D --> D4["network"];
D --> D5["platform"];
D --> D6["mount"];
E --> E1["messages"];
F --> F1["e2e"];
click B1 "./components/starmap/CLAUDE.md" "View starmap module documentation"
click C1 "./lib/astronomy/CLAUDE.md" "View astronomy module documentation"
click C2 "./lib/stores/CLAUDE.md" "View stores module documentation"
click C6 "./lib/tauri/CLAUDE.md" "View tauri-api module documentation"
click C7 "./lib/logger/CLAUDE.md" "View logger module documentation"
click D1 "./src-tauri/src/astronomy/CLAUDE.md" "View Rust astronomy module documentation"
click D2 "./src-tauri/src/data/CLAUDE.md" "View Rust data module documentation"
click D4 "./src-tauri/src/network/CLAUDE.md" "View Rust network module documentation"
click D3 "./src-tauri/src/cache/CLAUDE.md" "View Rust cache module documentation"
click D5 "./src-tauri/src/platform/CLAUDE.md" "View Rust platform module documentation"
click E1 "./i18n/CLAUDE.md" "View i18n module documentation"
click F1 "./tests/e2e/CLAUDE.md" "View E2E test documentation"
| Module | Path | Language | Description | Documentation |
|---|---|---|---|---|
| starmap-ui | components/starmap/ |
TSX | Star map UI components (core, overlays, planning, objects, management) | CLAUDE.md |
| tauri-api | lib/tauri/ |
TS | TypeScript wrappers for Tauri IPC commands | CLAUDE.md |
| astronomy-calculations | lib/astronomy/ |
TS | Pure astronomical calculations (coordinates, time, visibility, mount-safety) | CLAUDE.md |
| state-management | lib/stores/ |
TS | Zustand stores (settings, equipment, targets, markers, event-sources, updater) | CLAUDE.md |
| logger | lib/logger/ |
TS | Unified logging system with multiple transports | CLAUDE.md |
| frontend-services | lib/services/ |
TS | Service layer for external APIs | CLAUDE.md |
| catalogs | lib/catalogs/ |
TS | Astronomical catalog data and types | CLAUDE.md |
| rust-backend | src-tauri/src/ |
Rust | Tauri backend entry point and module orchestration | CLAUDE.md |
| rust-astronomy | src-tauri/src/astronomy/ |
Rust | Astronomical calculations in Rust | CLAUDE.md |
| rust-storage | src-tauri/src/data/ |
Rust | JSON storage for equipment, locations, targets, markers | CLAUDE.md |
| rust-network | src-tauri/src/network/ |
Rust | HTTP client with security and rate limiting | CLAUDE.md |
| rust-cache | src-tauri/src/cache/ |
Rust | Offline tile caching and unified cache | CLAUDE.md |
| rust-platform | src-tauri/src/platform/ |
Rust | Desktop-only features (settings, updater, plate solver) | CLAUDE.md |
| rust-mount | src-tauri/src/mount/ |
Rust | ALPACA mount client, simulator, commands | — |
| storage | lib/storage/ |
TS | Storage abstraction layer (Tauri/Web adapters, Zustand bridge) | — |
| hooks | lib/hooks/ |
TS | Custom React hooks (37+ hooks, aladin/, stellarium/ subdirs) | — |
| data | lib/data/ |
TS | Curated data (daily knowledge content) | — |
| feedback | lib/feedback/ |
TS | Feedback utilities | — |
| constants | lib/constants/ |
TS | App constants (equipment presets, shortcuts, onboarding, etc.) | — |
| aladin | lib/aladin/ |
TS | Aladin Lite compatibility layer | — |
| plate-solving | lib/plate-solving/ |
TS | Astrometry API and FITS parser | — |
| security | lib/security/ |
TS | Frontend security utilities | — |
| utils | lib/utils/ |
TS | Map utilities, observer location, scroll animation | — |
| icons | components/icons/ |
TSX | Brand icons, SkyMap logo, Stellarium/Zustand icons | — |
| internationalization | i18n/ |
JSON | English/Chinese translations | CLAUDE.md |
| e2e-tests | tests/e2e/ |
TS | Playwright end-to-end tests | CLAUDE.md |
# Frontend
pnpm dev # Start Next.js dev server (localhost:1420)
pnpm build # Build for production (outputs to out/)
pnpm lint # ESLint
# Desktop App (Tauri)
pnpm tauri dev # Run desktop app with hot-reload
pnpm tauri build # Build production desktop app
# Testing (Jest - Unit/Integration)
pnpm test # Run all tests
pnpm test:watch # Watch mode
pnpm test:coverage # With coverage (thresholds: 50% branches, 35% functions, 60% lines/statements)
pnpm test -- path/to/file # Run specific test file
# Testing (Playwright - E2E)
pnpm exec playwright test # Run all E2E tests
pnpm exec playwright test --project=chromium # Single browser
pnpm exec playwright test tests/e2e/starmap/ # Specific directory
# Type checking
pnpm exec tsc --noEmit # Check TypeScript without emitting
# Add shadcn/ui components
pnpm dlx shadcn@latest add [component-name]Important Build Note: For Tauri production builds, Next.js must use static export mode. Ensure output: "export" is set in next.config.ts as tauri.conf.json expects the out/ directory.
The app uses Tauri's IPC for frontend-backend communication:
- Rust commands are defined in
src-tauri/src/*.rsmodules (equipment, locations, astronomy, etc.) - TypeScript APIs in
lib/tauri/wrap Tauri'sinvoke()calls with type safety - Zustand stores in
lib/stores/manage client state and sync with Rust backend
React Component --> Zustand Store --> lib/tauri/*-api.ts --> Tauri invoke() --> Rust command
lib/tauri/ - Tauri IPC wrappers:
api.ts- Generic invoke wrapperstorage-api.ts- Storage operationsastronomy-api.ts- Astronomy calculationsevents-api.ts- Astro eventstarget-list-api.ts- Target list managementmarkers-api.ts- Sky markershttp-api.ts- HTTP clientcache-api.ts,unified-cache-api.ts- Cache managementupdater-api.ts,updater-hooks.ts- Auto-updateapp-control-api.ts- App controlplate-solver-api.ts- Plate solvingmount-api.ts- ALPACA mount controlgeolocation-api.ts- Geolocationmap-keys-api.ts- Map tile API keyspath-config-api.ts- Path configurationTauriSyncProvider.tsx- Zustand sync provider
lib/astronomy/ - Pure astronomical calculations (no side effects):
coordinates/- RA/Dec, Alt/Az, Galactic coordinate conversionstime/- Julian date, sidereal time calculationscelestial/- Sun, Moon position calculationsvisibility/- Target visibility, circumpolar calculationstwilight/- Twilight times (civil, nautical, astronomical)imaging/- Exposure and imaging feasibility calculationsengine/- Unified Tauri-first backend withastronomy-enginefallbackhorizon/- Custom horizon profile supportobject-resolver/- Object name parsing (catalog, minor body, coordinate)data/- EOP baseline datamount-safety.ts- GEM mount safety checks (meridian flip, hour angle limits, pier collision)mount-simulator.ts- Sequence simulation for mount safety analysisframes.ts,pipeline.ts,time-scales.ts- Coordinate frame contracts and unified transform pipelinesession-scheduler.ts,session-scheduler-v2.ts- Observation session schedulingplan-exporter.ts- Session plan exportfov-calculations.ts,fov-utils.ts- Field of view utilitiessky-quality.ts- Sky quality/Bortle estimationnavigation.ts,starmap-utils.ts- Star map navigation helpersocular-utils.ts,exposure-utils.ts,event-utils.ts,object-type-utils.ts- Domain utilities
lib/stores/ - Zustand state management:
settings-store- App preferences and UI settingsequipment-store- Telescopes, cameras, eyepieces with built-in presetstarget-list-store- Observation targetsmarker-store- Custom sky markersonboarding-store- First-run experience statebookmarks-store- View bookmarksmount-store- Telescope mount stateframing-store- Camera framing stateplate-solver-store- Plate solving statestellarium-store- Stellarium settingssatellite-store- Satellite tracking statesearch-store- Search statetheme-store- Theme preferencefavorites-store- Favorite objectssetup-wizard-store- Setup wizard statelog-store- Application logsevent-sources-store- Astronomical event source configurationupdater-store- Application update state managementaladin-store- Aladin Lite viewer statedaily-knowledge-store- Daily astronomy knowledge statefeedback-store- User feedback stateonboarding-bridge-store- Onboarding bridge/adapter stateplanning-ui-store- Planning panel UI statesession-plan-store- Observation session plan stateweb-location-store- Web-only location state
lib/hooks/ - Custom React hooks (37+ hooks):
use-geolocation- Geolocation with fallbackuse-object-search- Object search functionalityuse-object-actions- Shared slew/add-to-list actions for object panelsuse-in-view- Intersection Observer for scroll-triggered animationsuse-tonight-recommendations- Tonight's best targetsuse-target-planner- Target schedulinguse-http-client- Tauri HTTP integrationuse-animation-frame- Animation loop managementuse-coordinate-projection- Sky to screen coordinate projectionuse-keyboard-shortcuts- Keyboard shortcut handlinguse-navigation-history- View history managementuse-window-controls- Desktop window controlsuse-system-stats- FPS, memory, online statususe-night-mode- Night mode CSS effectsuse-mount-overlay- Mount control overlayuse-object-astro-data- Astronomical data for objectsuse-time-controls- Stellarium time controlsuse-adaptive-position- Adaptive UI positioninguse-cache-init- Cache initializationuse-camera- Camera controluse-carousel- Carousel interactionuse-celestial-name- Celestial object name resolutionuse-device-orientation- Device orientation sensoruse-equipment-fov-props- Equipment FOV property computationuse-focus-trap- Focus trap for accessibilityuse-is-client- Client-side rendering guarduse-mount-polling- Mount status pollinguse-observing-conditions- Observing conditions assessmentuse-ocular-simulation- Eyepiece simulationuse-orientation- Device orientationuse-prefers-reduced-motion- Reduced motion preferenceuse-select-target- Target selectionuse-star-field- Star field animationuse-target-list-actions- Target list CRUD actionsuse-tour-position- Onboarding tour tooltip positioninguse-window-state- Window state managementstellarium/*- Stellarium canvas hooks (click-coordinates, fov-overlay, marker-sync, selection, sky-culture, etc.)aladin/*- Aladin Lite hooks (catalogs, events, FITS, layers, loader, MOC, overlays, settings-sync)
lib/logger/ - Unified logging system:
log-manager.ts- Central log manager with singletontransports/console-transport.ts- Browser console outputtransports/memory-transport.ts- In-memory storage for UItransports/tauri-transport.ts- Backend bridge for Rust logscreateLogger()- Factory function for module-specific loggers
components/starmap/ - Star map UI components:
canvas/- Stellarium Web Engine canvas wrapperview/- Main sky view componentsearch/- Object search and advanced searchsettings/- Settings panels and dialogs (including event-sources-settings)controls/- Zoom, navigation history, bookmarks, keyboard shortcutstime/- Time control and clock displayoverlays/- FOV simulator, satellite tracker, ocular simulator, sky markersplanning/- Altitude charts, exposure calculator, session planning, mount-safety-simulator, event-detail-dialogobjects/- Object info panels, detail drawers, image galleriesmanagement/- Equipment, location, cache, and data managersdialogs/- About, credits, keyboard shortcuts dialogsonboarding/- Welcome dialog and tour componentssetup-wizard/- First-time setup wizardknowledge/- Daily astronomy knowledge (button, dialog, startup coordinator)plate-solving/- Image capture and plate solvingfeedback/- Loading skeletons and splash screensmount/- Telescope mount controlmap/- Leaflet-based location picker
src-tauri/src/ - Rust backend modules:
storage.rs- Generic JSON storage systemequipment.rs,locations.rs- Equipment and location managementastronomy/calculations.rs- Coordinate transforms, visibility calculationsastronomy/events.rs- Moon phases, meteor showers, astronomical eventscache/offline.rs- Tile caching for sky surveyscache/unified.rs- General-purpose network cachenetwork/http_client.rs- HTTP client with retries and progressnetwork/security.rs- URL validation and SSRF protectionnetwork/rate_limiter.rs- Request rate limitingplatform/app_settings.rs- App settings persistenceplatform/app_control.rs- App restart, quit, reloadplatform/updater.rs- Auto-update functionalityplatform/plate_solver.rs- Plate solving integrationmount/alpaca_client.rs- ALPACA telescope mount protocol clientmount/commands.rs- Mount Tauri commandsmount/simulator.rs- Mount simulator for testingmount/types.rs- Mount type definitionsobservation_log.rs- Observation logging and historytarget_list.rs,target_io.rs- Target list management and import/exportmarkers.rs- Custom sky marker persistence
- User data stored in platform-specific app data directory (
skymap/stores/) - Rust
storage.rsprovides generic JSON store operations - Frontend syncs state via
TauriSyncProvidercomponent - Known stores:
starmap-target-list,starmap-markers,starmap-settings,starmap-equipment,starmap-onboarding,starmap-event-sources,starmap-feedback,starmap-daily-knowledge,theme-customization,skymap-offline,skymap-locale
- Translations in
i18n/messages/{en,zh}.json next-intlfor i18n withlib/i18n/locale-store.tsfor persistence- Use
useTranslations()hook in components
@/components --> components/
@/lib --> lib/
@/ui --> components/ui/
@/hooks --> hooks/
@/utils --> lib/utils.ts- Test files:
__tests__/*.test.ts(x)or*.test.ts(x) - Uses Jest with React Testing Library
- E2E tests in
tests/e2e/using Playwright - Mock Tauri APIs in tests (see
__mocks__/directory) - Coverage reports output to
coverage/
- Branches: 50%
- Functions: 35%
- Lines: 60%
- Statements: 60%
- Use
cn()from@/lib/utilsto merge Tailwind classes:cn("base", conditional && "conditional", className) - Prefer composition with
asChildfor polymorphic components (Button as Link, etc.) - Dark mode via class-based strategy (apply
.darkclass to parent)
- Rate Limiting - Sliding window algorithm prevents API abuse
- Input Validation - Size limits on JSON, CSV, and tile data
- SSRF Protection - URL validation blocks private IPs and dangerous protocols
- Storage Security - Path sandboxing prevents path traversal attacks
See src-tauri/src/network/security.rs for implementation details.
- Respect the module structure - Keep changes within the appropriate module boundaries
- Follow the data flow - Understand how data flows between frontend stores and Rust backend via Tauri IPC
- Write tests - Add tests for new features, following the existing test patterns
- Update documentation - Keep module-level CLAUDE.md files in sync with code changes
- Use the logger - Replace
console.*calls withcreateLogger('module-name')
| Task | Key Files |
|---|---|
| Add new UI component | components/starmap/[category]/ |
| Add new setting | lib/stores/settings-store.ts, components/starmap/settings/ |
| Add new calculation | lib/astronomy/ or src-tauri/src/astronomy/ |
| Add new Tauri command | src-tauri/src/[module].rs, lib/tauri/[module]-api.ts |
| Add translations | i18n/messages/en.json, i18n/messages/zh.json |
| Add logging | lib/logger/index.ts (use createLogger()) |
| Add mount safety checks | lib/astronomy/mount-safety.ts, lib/astronomy/mount-simulator.ts |
| Add mount control | src-tauri/src/mount/, lib/tauri/mount-api.ts, components/starmap/mount/ |
| Add event source config | lib/stores/event-sources-store.ts, components/starmap/settings/event-sources-settings.tsx |
| Add daily knowledge | lib/data/daily-knowledge-curated.ts, lib/stores/daily-knowledge-store.ts, components/starmap/knowledge/ |
- Total Files: ~560
- Scanned Files: ~550
- Coverage: 98%
- Ignored: node_modules, .git, build artifacts
src-tauri/src/cache/- No unit tests yetsrc-tauri/src/platform/- No unit tests yetsrc-tauri/src/mount/- No CLAUDE.md yet- Smaller utility modules (lib/storage, lib/offline, lib/hooks, lib/data, lib/feedback, lib/constants, lib/aladin, lib/utils) - No module-level CLAUDE.md
New Modules (since 2026-02-13):
src-tauri/src/mount/- ALPACA mount client, simulator, types, commandscomponents/starmap/knowledge/- Daily astronomy knowledge UIlib/data/daily-knowledge-curated.ts- Curated daily knowledge contentlib/services/daily-knowledge/- Daily knowledge servicelib/services/map-providers/- Map tile provider configurationlib/services/search/- Search service abstractionlib/stores/aladin-store.ts- Aladin Lite viewer statelib/stores/daily-knowledge-store.ts- Daily knowledge statelib/stores/feedback-store.ts- User feedback statelib/stores/onboarding-bridge-store.ts- Onboarding bridgelib/stores/planning-ui-store.ts- Planning panel UI statelib/stores/session-plan-store.ts- Session plan statelib/stores/web-location-store.ts- Web-only location statelib/tauri/mount-api.ts- Mount control APIlib/tauri/geolocation-api.ts- Geolocation APIlib/tauri/map-keys-api.ts- Map keys APIlib/tauri/path-config-api.ts- Path config APIlib/hooks/aladin/*- Aladin Lite hooks (8 hooks)- 19+ new hooks in
lib/hooks/
Previous Changes (2026-02-13):
lib/astronomy/mount-safety.ts- GEM mount safety configuration and checkslib/astronomy/mount-simulator.ts- Sequence simulation for mount safetylib/stores/event-sources-store.ts- Event source configuration managementlib/stores/updater-store.ts- Application update state managementcomponents/starmap/planning/mount-safety-simulator.tsx- Mount safety UIcomponents/starmap/planning/event-detail-dialog.tsx- Event detail displaycomponents/starmap/settings/event-sources-settings.tsx- Event source configuration UI
- package.json - Frontend dependencies and scripts
- src-tauri/Cargo.toml - Rust dependencies
- next.config.ts - Next.js configuration
- jest.config.ts - Jest test configuration
- playwright.config.ts - Playwright E2E configuration
- docs/ - MkDocs-based developer and user documentation