{"id":45814997,"url":"https://github.com/mstelz/skymmich","last_synced_at":"2026-04-01T20:11:52.893Z","repository":{"id":303901722,"uuid":"1006341074","full_name":"mstelz/skymmich","owner":"mstelz","description":"Sync astrophotography images from Immich, plate solve them with Astrometry.net, and enrich with searchable celestial metadata.","archived":false,"fork":false,"pushed_at":"2026-03-31T18:29:32.000Z","size":21206,"stargazers_count":9,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-31T19:19:05.983Z","etag":null,"topics":["astrometry","astrophotography","image-annotation","image-processing","image-tagging","immich","plate-solving"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mstelz.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"mstelz","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":"mstelz","thanks_dev":null,"custom":null}},"created_at":"2025-06-22T03:33:37.000Z","updated_at":"2026-03-31T18:27:00.000Z","dependencies_parsed_at":"2025-07-31T04:09:07.463Z","dependency_job_id":"46f4bc6b-1046-4872-a1ba-e496f5b90dac","html_url":"https://github.com/mstelz/skymmich","commit_stats":null,"previous_names":["mstelz/astromich","mstelz/skymmich"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/mstelz/skymmich","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mstelz%2Fskymmich","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mstelz%2Fskymmich/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mstelz%2Fskymmich/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mstelz%2Fskymmich/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mstelz","download_url":"https://codeload.github.com/mstelz/skymmich/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mstelz%2Fskymmich/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291409,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["astrometry","astrophotography","image-annotation","image-processing","image-tagging","immich","plate-solving"],"created_at":"2026-02-26T18:40:23.524Z","updated_at":"2026-04-01T20:11:52.886Z","avatar_url":"https://github.com/mstelz.png","language":"TypeScript","funding_links":["https://github.com/sponsors/mstelz","https://buymeacoffee.com/mstelz"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"apps/client/public/logo.png\" width=\"300\"\u003e\n  \u003ch1 style=\"font-size: 55px\" align=\"center\"\u003eSKYMMICH\u003c/h1\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"./docker\"\u003e\u003cimg src=\"https://img.shields.io/badge/Docker-Ready-blue?logo=docker\"/\u003e\u003c/a\u003e\n  \u003ca href=\"./LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-green.svg\" /\u003e\n  \u003ca href=\"./docker/unraid-templates\"\u003e\u003cimg src=\"https://img.shields.io/badge/UnRAID-Compatible-orange)\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://discord.gg/ffZ8cuJ8Kh\"\u003e\u003cimg src=\"https://img.shields.io/badge/Discord-Join%20Chat-5865F2?logo=discord\u0026logoColor=white\" alt=\"Join us on Discord\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/mstelz/Skymmich/actions/workflows/docker-build-push.yml\"\u003e\u003cimg src=\"https://github.com/mstelz/Skymmich/actions/workflows/docker-build-push.yml/badge.svg\" alt=\"Build Status\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/mstelz/Skymmich/actions/workflows/release.yml\"\u003e\u003cimg src=\"https://github.com/mstelz/Skymmich/actions/workflows/release.yml/badge.svg\" alt=\"Release\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/mstelz/Skymmich/security\"\u003e\u003cimg src=\"https://img.shields.io/badge/Security-Trivy%20Scanned-brightgreen\" alt=\"Security Scan\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n**Skymmich** is a self-hosted photo gallery and management system designed specifically for astrophotographers. Built to integrate seamlessly with your [Immich](https://immich.app/) photo library, it provides intelligent plate solving, equipment tracking, and comprehensive metadata management tailored for deep-sky imaging workflows.\n\nPerfect for organizing, analyzing, and showcasing your astrophotography collection with full control over your data and infrastructure.\n\n\u003e **Disclaimer**: Skymmich is an independent project and is not affiliated with, endorsed by, or officially connected to Immich or its developers. Skymmich is a third-party application that integrates with Immich's public API.\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg width=\"80%\" src=\"assets/images/demo.gif\" /\u003e\n  \u003cbr/\u003e\n  \u003ca href=\"assets/images/screenshots\"\u003eView all screenshots\u003c/a\u003e\n\u003c/div\u003e\n\n## Features\n\n### **Self-Hosted Image Management**\n- **Immich Integration**: Seamless synchronization with your self-hosted Immich photo library\n- **Interactive Sky Map**: Explore your collection on a high-fidelity celestial atlas powered by Aladin Lite v3\n- **Astrophotography Filtering**: Filter by telescopes, cameras, targets, constellations, and acquisition details\n- **Deep Zoom Viewer**: High-resolution exploration of your deep-sky images with OpenSeaDragon\n- **Metadata Preservation**: Automatic EXIF handling for astrophotography workflows\n  \u003e **Note**: XMP sidecar generation is currently experimental and may not work as intended in all configurations. Configure `IMMICH_MAPPING_PATH` and `LOCAL_MAPPING_PATH` environment variables to map Immich volume paths to local paths for sidecar file placement.\n- **Zero Duplication**: View images directly from Immich without storage overhead\n- **Location Editing**: Save and reuse observing sites with map picker; coordinate changes sync back to the original Immich asset automatically\n\n### **DSO Catalog \u0026 Target Tracking**\n- **Built-in OpenNGC Catalog**: Browse, search, and filter thousands of deep-sky objects by type, constellation, magnitude, and angular size\n- **DSS Thumbnails**: Cached Digitized Sky Survey preview images for catalog objects\n- **Target Wishlists**: Annotate catalog objects with personal notes and tags on the Targets page\n- **Target Backfill**: Automatically match plate-solved images to catalog objects via the admin panel\n\n### **Acquisition Logging**\n- **Per-Filter Tracking**: Record exposure details per filter including frame count, exposure time, gain, offset, binning, and sensor temperature\n- **Integration Summary**: Automatic calculation of total frames, total integration time, and filter breakdown per image\n\n### **Plate Solving**\n- **Astrometry.net Integration**: Automatic coordinate solving for your images\n- **Background Processing**: Non-blocking worker processes with job queuing\n- **Real-time Updates**: Live progress tracking via WebSocket connections\n- **Batch Processing**: Handle multiple images simultaneously\n- **Results Storage**: Persistent RA/Dec coordinates and field information\n\n### **Astrophotography Equipment Tracking**\n- **Telescope Catalog**: Manage your telescopes, mounts, and accessories with specifications\n- **Camera Database**: Track sensors, filters, and imaging configurations specific to astrophotography\n- **Equipment Groups**: Bundle equipment into reusable presets and apply them to images in one click\n- **Session Logging**: Automatic equipment association from EXIF metadata and manual tagging\n\n### **Admin Interface**\n- **Configuration Management**: Secure API key and integration settings\n- **Automated Sync**: Cron jobs automatically sync images from Immich and clean up old notifications on a configurable schedule\n- **Worker Supervisor**: Background plate-solving workers automatically restart on failure with exponential backoff when Auto mode is enabled\n- **Database Backup**: One-click SQLite database download from the admin panel (PostgreSQL users should use `pg_dump`)\n- **Catalog Management**: Load, reload, and check for OpenNGC catalog updates; backfill target names for existing images\n\n### **Real-Time Notifications**\n- **Live Updates**: WebSocket-powered notifications for plate-solving results, Immich sync completions, and other events\n- **Manual Sync**: Trigger an Immich sync at any time from the header bar\n- **Notification Badge**: Unacknowledged notification count displayed in the navigation\n\n### **Security \u0026 Deployment**\n- **Docker Ready**: Multi-stage containerization with health checks\n- **UnRAID Support**: Ready-to-use container templates\n- **Database Options**: Built-in SQLite (default), optional PostgreSQL support\n\n## Quick Start\n\n\u003e **Prerequisites**: Skymmich requires a running [Immich](https://immich.app/) instance for photo management. Ensure you have Immich set up and accessible before proceeding.\n\n### Option 1: Docker Compose (Recommended)\n\nSingle container setup with built-in SQLite database — no external database needed:\n\n```bash\n# Download production compose file\ncurl -o docker-compose.prod.yml https://raw.githubusercontent.com/mstelz/Skymmich/main/docker-compose.prod.yml\n\n# Start Skymmich\ndocker compose -f docker-compose.prod.yml up -d\n\n# Access the application\nopen http://localhost:5000\n```\n\n**What this includes:**\n- Skymmich application from GitHub Container Registry\n- Built-in SQLite database with persistent storage\n- Health checks and automatic restarts\n- Volume mounts for configuration, logs, and database\n\n\u003e **PostgreSQL option**: If you prefer PostgreSQL, download [`docker-compose.postgres.yml`](docker-compose.postgres.yml) and layer it on:\n\u003e ```bash\n\u003e echo \"POSTGRES_PASSWORD=your_secure_password\" \u003e .env\n\u003e docker compose -f docker-compose.prod.yml -f docker-compose.postgres.yml up -d\n\u003e ```\n\n### Option 2: Docker Container\n\nSingle container deployment using GitHub Container Registry:\n\n```bash\n# Pull the latest image\ndocker pull ghcr.io/mstelz/skymmich:latest\n\n# Run with Docker (uses built-in SQLite database)\ndocker run -d \\\n  --name skymmich \\\n  -p 5000:5000 \\\n  -e NODE_ENV=production \\\n  -v skymmich-config:/app/config \\\n  -v skymmich-cache:/app/cache \\\n  ghcr.io/mstelz/skymmich:latest\n\n# Access the application\nopen http://localhost:5000\n```\n\n\u003e To use PostgreSQL instead, add `-e DATABASE_URL=\"postgresql://user:password@host:5432/skymmich\"` to the command above.\n\n### Option 3: UnRAID Template\n\n\u003e **Coming Soon**: Skymmich will be available in UnRAID Community Applications for easy one-click installation.\n\nFor now, manual installation:\n\n1. **Install Skymmich**: Add container using template URL `https://raw.githubusercontent.com/mstelz/Skymmich/main/docker/unraid-templates/skymmich.xml`\n2. **Configure**: Optionally set Immich URL and API keys (can also be done via admin UI)\n3. **Access**: Navigate to `http://your-server:2284`\n\n\u003e No external database needed — Skymmich uses a built-in SQLite database stored in the config directory. To use PostgreSQL instead, set the `DATABASE_URL` field in the template.\n\n### Option 4: Development Setup\n\n```bash\n# Clone and install dependencies\ngit clone https://github.com/mstelz/Skymmich.git\ncd Skymmich\nnpm install\n\n# Option A: Build and run with Docker Compose (builds from source)\n# Edit docker-compose.yml environment section with your settings\ndocker compose up -d\n\n# Option B: Local development server\ncp .env.example .env.local\n# Edit .env.local with your development settings (uses SQLite by default)\nnpm run dev\n\n# Option C: Worker-only deployment (standalone)\ncp .env.worker.example .env.worker\n# Edit .env.worker with database and API settings\nnpm run dev:worker:standalone\n\n# Access at http://localhost:5000 (Docker) or http://localhost:5173 (local)\n```\n\n## Requirements\n\n### Core Requirements\n- **Immich Server**: Self-hosted photo management server (currently the only supported photo source)\n- **Docker**: 20.10+ (for containerized deployment)\n- **Database**: Built-in SQLite (default, no setup required). PostgreSQL 15+ optionally supported.\n  - Automatic schema management with Drizzle ORM\n  - Migration script included for moving data between SQLite and PostgreSQL (see [Docker docs](docker/README.md#migrating-between-sqlite-and-postgresql))\n\n### Development Requirements\n- **Node.js**: 20+ (for building from source)\n\n### Optional Integrations\n- **Astrometry.net API Key**: For automated plate solving capabilities\n\n\u003e **Note**: Support for additional photo sources beyond Immich is planned for future releases, but Immich is currently required as the primary photo library.\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `DATABASE_URL` | _(empty)_ | Optional PostgreSQL connection string. Leave empty to use built-in SQLite. |\n| `PORT` | `5000` | HTTP server port |\n| `NODE_ENV` | `development` | Application environment |\n| `IMMICH_URL` | _(optional)_ | Immich server base URL |\n| `IMMICH_API_KEY` | _(optional)_ | Immich API authentication key |\n| `ASTROMETRY_API_KEY` | _(optional)_ | Astrometry.net API key |\n| `ENABLE_PLATE_SOLVING` | `true` | Enable background worker |\n| `PLATE_SOLVE_MAX_CONCURRENT` | `3` | Max simultaneous jobs |\n| `XMP_SIDECAR_PATH` | `/app/sidecars` | Directory for XMP sidecar files |\n\n### Admin Configuration\n\nAfter startup, access the admin interface at `/admin` to configure:\n\n- **Immich Integration**: Server URL, API keys, album picker, sync schedules\n- **Astrometry Settings**: API credentials, job limits, auto-processing\n- **Worker Management**: Enable/disable background processing\n- **Sync Scheduling**: Automated Immich synchronization frequency\n\n\u003e **Tip**: Configuration via admin interface takes precedence over environment variables and persists across container restarts.\n\n## Database Migration\n\nSkymmich includes a bidirectional migration script for moving data between SQLite and PostgreSQL:\n\n```bash\n# PostgreSQL → SQLite\nnode tools/scripts/migrate-db.js \\\n  --from postgresql://user:pass@host:5432/skymmich \\\n  --to sqlite:path/to/skymmich.db\n\n# SQLite → PostgreSQL\nnode tools/scripts/migrate-db.js \\\n  --from sqlite:path/to/local.db \\\n  --to postgresql://user:pass@host:5432/skymmich\n```\n\nInside a Docker container:\n```bash\nnode /app/dist/tools/scripts/migrate-db.js \\\n  --from postgresql://... \\\n  --to sqlite:/app/config/skymmich.db\n```\nTo avoid running the command manually inside the container, set the `AUTO_DB_MIGRATE_FROM` environment variable (and optional `AUTO_DB_MIGRATE_TO`) on the Skymmich service. The Docker startup script runs the migration before launching the app, deletes any existing SQLite target file (unless `AUTO_DB_MIGRATE_RESET_SQLITE=false`), and writes a marker to `/app/config/.auto-db-migrated` so it only happens once unless you delete that file or set `AUTO_DB_MIGRATE_ONCE=false`.\n\nThe script handles all type conversions (timestamps, booleans, JSON, arrays) and respects foreign key ordering automatically. SQLite targets run the bundled Drizzle migrations during the copy; PostgreSQL targets should be initialized once beforehand so the schema exists.\n\n## Container Images\n\nSkymmich provides ready-to-use container images through GitHub Container Registry:\n\n### Available Images\n- **Latest Release**: `ghcr.io/mstelz/skymmich:latest`\n- **Specific Version**: `ghcr.io/mstelz/skymmich:v1.x.x`\n- **Development**: `ghcr.io/mstelz/skymmich:main`\n\n### Supported Architectures\n- `linux/amd64` (x86_64)\n- `linux/arm64` (ARM64/Apple Silicon)\n\n### Image Tags\n- `latest` - Latest stable release\n- `v*.*.*` - Semantic version tags (e.g., `v1.0.0`)\n- `main` - Latest development build from main branch\n- `sha-*` - Specific commit builds\n\nAll images are automatically built, tested, and scanned for vulnerabilities using GitHub Actions.\n\n## Architecture\n\n```\n┌─────────────────────────────────────┐\n│        Skymmich Container           │\n├─────────────────────────────────────┤\n│  Frontend (React + TypeScript)      │\n│  ├─ Vite build system               │    ┌─────────────────────┐\n│  ├─ Tailwind CSS + shadcn/ui        │    │   External APIs     │\n│  └─ Real-time WebSocket client      │    ├─────────────────────┤\n├─────────────────────────────────────┤◄──►│  Immich Server      │\n│  Backend (Hono + Node.js)           │    │  Astrometry.net     │\n│  ├─ RESTful API endpoints           │    │  Image Sources      │\n│  ├─ WebSocket server (ws)           │    └─────────────────────┘\n│  ├─ Image proxy \u0026 thumbnails        │\n│  └─ Session management              │    ┌─────────────────────┐\n├─────────────────────────────────────┤    │  PostgreSQL         │\n│  Worker Manager                     │    │  (optional)         │\n│  ├─ Background job processing       │◄──►│  External database  │\n│  ├─ Plate solving automation        │    │  for advanced use   │\n│  ├─ Crash recovery \u0026 monitoring     │    └─────────────────────┘\n│  └─ Graceful shutdown handling      │\n├─────────────────────────────────────┤\n│  SQLite (built-in, default)         │\n│  └─ /app/config/skymmich.db         │\n└─────────────────────────────────────┘\n```\n\n## Project Structure\n\n```\nSkymmich/\n├── apps/\n│   ├── client/                 # React frontend application\n│   │   ├── src/\n│   │   │   ├── components/     # UI components (shadcn/ui)\n│   │   │   ├── pages/          # Route components\n│   │   │   ├── lib/            # Utilities and API clients\n│   │   │   └── hooks/          # Custom React hooks\n│   │   └── dist/               # Built frontend assets\n│   └── server/                 # Node.js backend application\n│       ├── src/\n│       │   ├── routes/         # API route handlers\n│       │   ├── services/       # Business logic services\n│       │   ├── workers/        # Background job processors\n│       │   └── db.ts           # Database configuration\n│       └── dist/               # Compiled backend code\n├── packages/\n│   └── shared/                 # Shared types and schemas\n│       ├── src/\n│       │   ├── db/             # Database schemas (SQLite/PostgreSQL)\n│       │   ├── schemas/        # Zod validation schemas\n│       │   └── types/          # TypeScript type definitions\n├── docker/                     # Containerization files\n│   ├── Dockerfile              # Multi-stage container build\n│   ├── docker-compose.yml      # Service orchestration\n│   ├── startup.sh              # Container entry point\n│   └── unraid-templates/       # UnRAID deployment templates\n├── tools/                      # Development and migration tools\n│   ├── scripts/                # Utility scripts\n│   └── migrations/             # Database migration files\n├── docs/                       # Documentation\n└── assets/                     # Static assets and examples\n```\n\n## Development\n\n### Prerequisites\n\n```bash\n# Install Node.js 20+\nnode --version  # v20+\nnpm --version   # 10+\n\n# Clone repository\ngit clone https://github.com/mstelz/Skymmich.git\ncd Skymmich\n```\n\n### Setup\n\n```bash\n# Install dependencies\nnpm install\n\n# Setup environment (choose one based on your needs)\ncp .env.example .env.local           # Main application settings\ncp .env.worker.example .env.worker   # Worker-only deployment\n# Configure your development settings\n\n# Database schema is managed automatically on startup via Drizzle ORM\n```\n\n### Development Commands\n\n```bash\n# Start development server (SQLite database by default)\nnpm run dev                      # Full stack: server + frontend + worker\nnpm run dev:server:watch         # Server only with file watching\nnpm run dev:worker               # Worker process only\nnpm run dev:worker:standalone    # Standalone worker (uses .env.worker)\n\n# Build for production\nnpm run build          # Build frontend and backend\nnpm run build:docker   # Build with Docker assets\n\n# Docker development (uses SQLite by default)\ndocker compose up -d               # Full stack via Docker\n```\n\n### Testing\n\nSkymmich includes comprehensive end-to-end testing using Playwright:\n\n```bash\n# Run all tests\nnpm run test:e2e       # Run Playwright end-to-end tests\n\n# Interactive testing\nnpm run test:e2e:ui    # Run tests with Playwright UI mode\nnpm run test:e2e:debug # Debug tests with Playwright inspector\nnpm run test:e2e:headed # Run tests in headed browser mode\n```\n\n**Test Structure:**\n- `tests/e2e/` - End-to-end test specifications\n- `tests/e2e/pages/` - Page Object Model classes for maintainable tests\n- `playwright.config.ts` - Playwright configuration with multiple browsers\n\n**Prerequisites for Testing:**\n- Skymmich application running on `http://localhost:5173`\n- Test database with sample data\n- All dependencies installed via `npm install`\n\n### Code Quality\n\n```bash\n# Type checking\nnpm run check          # TypeScript compilation check\n```\n\n## CI/CD \u0026 Deployment\n\nSkymmich uses GitHub Actions for continuous integration and deployment. All builds are automatically tested, scanned for vulnerabilities, and containerized.\n\n### Automated Workflows\n\n- **Build \u0026 Push**: Automatic Docker image builds on main branch commits\n- **PR Testing**: Validates all pull requests with build tests and security scans\n- **Release**: Semantic versioning releases with tagged Docker images\n\n### Security\n\n- All images are scanned with Trivy for vulnerabilities\n- Critical vulnerabilities block deployments\n- SBOM (Software Bill of Materials) generated for each build\n\nFor detailed CI/CD documentation, see [docs/CI_CD.md](docs/CI_CD.md).\n\n## Contributing\n\nWe welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.\n\n## Roadmap\n\n### Core Features\n- [ ] **Additional Photo Sources**: Support for photo libraries beyond Immich (direct uploads, other self-hosted solutions)\n- [x] **Interactive Sky Map**: Celestial atlas visualization for plate-solved image collections\n- [ ] Advanced image statistics and analytics for astrophotography sessions\n- [ ] Equipment usage reporting and session tracking\n- [x] XMP sidecar generation for astrophotography metadata\n- [ ] XMP sidecar viewer and editor for astrophotography metadata\n\n### Integrations\n- [ ] **NINA Plugin**: Sync session data (targets, equipment, acquisition details) directly from N.I.N.A. to Skymmich\n- [ ] **Local Plate Solving**: Integration with local solvers (ASTAP, PixInsight) for offline solving without Astrometry.net\n\n### Advanced Features\n- [ ] Advanced search and filtering with saved queries\n- [ ] Bulk image processing workflows and batch operations\n- [ ] View saved/tagged targets on the Sky Map\n- [ ] Raw data and calibration frame management\n- [ ] Mobile app companion for field use\n- [ ] Community features (sharing, public galleries)\n\n### Community \u0026 Help\n- **Bug Reports**: [GitHub Issues](https://github.com/mstelz/Skymmich/issues)\n- **Feature Requests**: [GitHub Discussions](https://github.com/mstelz/Skymmich/discussions)\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Acknowledgments\n\n- **[Immich](https://immich.app/)** - Inspiration and integration for photo management\n- **[Astrometry.net](https://astrometry.net/)** - Plate solving service and algorithms\n- **[shadcn/ui](https://ui.shadcn.com/)** - Beautiful and accessible React components\n- **[Drizzle ORM](https://orm.drizzle.team/)** - Type-safe database toolkit\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Built for the astrophotography community**\n\n[Star this repo](https://github.com/mstelz/Skymmich) | [Report bug](https://github.com/mstelz/Skymmich/issues) | [Request feature](https://github.com/mstelz/Skymmich/discussions)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmstelz%2Fskymmich","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmstelz%2Fskymmich","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmstelz%2Fskymmich/lists"}