From d9c6d2f8ced2a82e1d9cca06108c6061f8724a14 Mon Sep 17 00:00:00 2001 From: Alexander Hinrichs Date: Wed, 26 Nov 2025 22:52:18 +0100 Subject: [PATCH] Add GeoGuesser AI app to store MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New CasaOS app for AI-powered geographic image location analysis. Features: - Three-tier architecture (PostgreSQL, Backend API, Frontend) - Claude AI integration for image analysis - All environment variables configurable - Only frontend port exposed externally - Container registry authentication required Note: Icon file (icon.png) still needs to be added. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- Apps/geoguesser-ai/README.md | 60 ++++++++++ Apps/geoguesser-ai/docker-compose.yml | 156 ++++++++++++++++++++++++++ 2 files changed, 216 insertions(+) create mode 100644 Apps/geoguesser-ai/README.md create mode 100644 Apps/geoguesser-ai/docker-compose.yml diff --git a/Apps/geoguesser-ai/README.md b/Apps/geoguesser-ai/README.md new file mode 100644 index 0000000..16145f7 --- /dev/null +++ b/Apps/geoguesser-ai/README.md @@ -0,0 +1,60 @@ +# GeoGuesser AI - CasaOS App + +## Icon Required +This app needs an icon file (icon.png) to be added to this directory. + +The icon should be: +- PNG format +- Square dimensions (recommended: 256x256 or 512x512) +- Represents geographic/location analysis theme + +## Authentication Setup +This app requires authentication to pull container images from git.hinrichs.dev. + +On the CasaOS host system, configure Docker/Podman authentication: +```bash +docker login git.hinrichs.dev +``` + +Or create/update ~/.docker/config.json with credentials. + +## Environment Variables +All environment variables from the original .env file are configurable during installation: + +### Required +- `CLAUDE_API_KEY`: Anthropic Claude API key (get from https://console.anthropic.com/) + +### Database (defaults provided) +- `DB_USER`: PostgreSQL username (default: geolocator) +- `DB_PASSWORD`: PostgreSQL password (default: geolocator_password) +- `DB_NAME`: PostgreSQL database name (default: geolocator_db) +- `DB_SSLMODE`: SSL mode for database (default: disable) + +### Application Settings +- `ENV`: Application environment (default: production) +- `PORT`: Backend API port (default: 3000) +- `CLAUDE_MODEL`: Claude model to use (default: claude-sonnet-4-5) +- `CLAUDE_API_URL`: Claude API endpoint (default: https://api.anthropic.com/v1/messages) +- `USE_MOCK_AI`: Use mock AI for testing (default: false) + +### File Upload +- `MAX_IMAGE_SIZE_MB`: Maximum image upload size (default: 10) +- `ALLOWED_IMAGE_TYPES`: Allowed MIME types (default: image/jpeg,image/png,image/webp) + +### External APIs +- `OVERPASS_API_URL`: OpenStreetMap Overpass API (default: https://overpass-api.de/api/interpreter) +- `ELEVATION_API_URL`: Elevation API (default: https://api.open-elevation.com/api/v1/lookup) + +### CORS & Logging +- `ALLOWED_ORIGINS`: CORS allowed origins (default: http://localhost:8080) +- `LOG_LEVEL`: Log level (default: info) +- `LOG_FORMAT`: Log format (default: json) + +## Ports +- 8080: Web UI (exposed externally) +- 3000: Backend API (internal only) +- 5432: PostgreSQL (internal only) + +## Volumes +- `/DATA/AppData/$AppID/postgres_data`: PostgreSQL database storage +- `/DATA/AppData/$AppID/uploads`: Uploaded images storage diff --git a/Apps/geoguesser-ai/docker-compose.yml b/Apps/geoguesser-ai/docker-compose.yml new file mode 100644 index 0000000..241f182 --- /dev/null +++ b/Apps/geoguesser-ai/docker-compose.yml @@ -0,0 +1,156 @@ +name: alxndrhi-geoguesser-ai +services: + postgres: + container_name: alxndrhi-geoguesser-ai-postgres + image: postgres:16-alpine + environment: + POSTGRES_USER: ${DB_USER:-geolocator} + POSTGRES_PASSWORD: ${DB_PASSWORD:-geolocator_password} + POSTGRES_DB: ${DB_NAME:-geolocator_db} + volumes: + - type: bind + source: /DATA/AppData/$AppID/postgres_data + target: /var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-geolocator} -d ${DB_NAME:-geolocator_db}"] + interval: 10s + timeout: 5s + retries: 5 + network_mode: bridge + restart: unless-stopped + + backend: + container_name: alxndrhi-geoguesser-ai-backend + image: git.hinrichs.dev/alexander/geoguesser-ai/backend:latest + environment: + ENV: ${ENV:-production} + PORT: ${PORT:-3000} + DATABASE_URL: postgresql://${DB_USER:-geolocator}:${DB_PASSWORD:-geolocator_password}@alxndrhi-geoguesser-ai-postgres:5432/${DB_NAME:-geolocator_db}?sslmode=${DB_SSLMODE:-disable} + CLAUDE_API_KEY: ${CLAUDE_API_KEY} + CLAUDE_API_URL: ${CLAUDE_API_URL:-https://api.anthropic.com/v1/messages} + CLAUDE_MODEL: ${CLAUDE_MODEL:-claude-sonnet-4-5} + USE_MOCK_AI: ${USE_MOCK_AI:-false} + MAX_IMAGE_SIZE_MB: ${MAX_IMAGE_SIZE_MB:-10} + ALLOWED_IMAGE_TYPES: ${ALLOWED_IMAGE_TYPES:-image/jpeg,image/png,image/webp} + OVERPASS_API_URL: ${OVERPASS_API_URL:-https://overpass-api.de/api/interpreter} + ELEVATION_API_URL: ${ELEVATION_API_URL:-https://api.open-elevation.com/api/v1/lookup} + ALLOWED_ORIGINS: ${ALLOWED_ORIGINS:-http://localhost:8080} + LOG_LEVEL: ${LOG_LEVEL:-info} + LOG_FORMAT: ${LOG_FORMAT:-json} + volumes: + - type: bind + source: /DATA/AppData/$AppID/uploads + target: /app/uploads + depends_on: + postgres: + condition: service_healthy + external_links: + - alxndrhi-geoguesser-ai-postgres:postgres + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/api/v1/health"] + interval: 30s + timeout: 10s + retries: 3 + network_mode: bridge + restart: unless-stopped + + frontend: + container_name: alxndrhi-geoguesser-ai-frontend + image: git.hinrichs.dev/alexander/geoguesser-ai/frontend:latest + ports: + - target: 8080 + published: "8080" + protocol: tcp + depends_on: + - backend + external_links: + - alxndrhi-geoguesser-ai-backend:backend + network_mode: bridge + restart: unless-stopped + x-casaos: + envs: + - container: ENV + description: + en_us: Application environment (development/production) + - container: PORT + description: + en_us: Backend API port + - container: DB_USER + description: + en_us: PostgreSQL database username + - container: DB_PASSWORD + description: + en_us: PostgreSQL database password + - container: DB_NAME + description: + en_us: PostgreSQL database name + - container: DB_SSLMODE + description: + en_us: PostgreSQL SSL mode (disable/require) + - container: CLAUDE_API_KEY + description: + en_us: Anthropic Claude API key for AI analysis + - container: CLAUDE_API_URL + description: + en_us: Claude API endpoint URL + - container: CLAUDE_MODEL + description: + en_us: Claude model identifier to use + - container: USE_MOCK_AI + description: + en_us: Use mock AI responses (true/false) + - container: MAX_IMAGE_SIZE_MB + description: + en_us: Maximum upload image size in MB + - container: ALLOWED_IMAGE_TYPES + description: + en_us: Comma-separated list of allowed image MIME types + - container: OVERPASS_API_URL + description: + en_us: OpenStreetMap Overpass API endpoint + - container: ELEVATION_API_URL + description: + en_us: Elevation data API endpoint + - container: ALLOWED_ORIGINS + description: + en_us: CORS allowed origins (comma-separated) + - container: LOG_LEVEL + description: + en_us: Application log level (debug/info/warn/error) + - container: LOG_FORMAT + description: + en_us: Log output format (json/text) + ports: + - container: "8080" + description: + en_us: Web UI HTTP Port + volumes: + - container: /var/lib/postgresql/data + description: + en_us: PostgreSQL database storage + - container: /app/uploads + description: + en_us: Uploaded images storage + +x-casaos: + architectures: + - amd64 + - arm64 + main: frontend + author: Alexander Hinrichs + category: Utilities + developer: Alexander Hinrichs + description: + en_us: An AI-powered geographic image analyzer that uses Claude AI to + identify locations from photos. Upload images and get detailed + geolocation analysis including coordinates, landmarks, and contextual + information. Requires Anthropic API key for Claude AI access. + tagline: + en_us: AI-powered geographic image location analyzer + icon: https://git.ct.hinrichs.dev/alexander/CasaOS-alexanders-AppStore/raw/branch/main/Apps/geoguesser-ai/icon.png + index: / + port_map: "8080" + scheme: http + store_app_id: geoguesser-ai + title: + en_us: GeoGuesser AI