{"id":45783457,"url":"https://github.com/geostorm-ai/geostorm","last_synced_at":"2026-03-02T15:00:32.178Z","repository":{"id":340320142,"uuid":"1165503331","full_name":"geostorm-ai/geostorm","owner":"geostorm-ai","description":"Monitor how AI systems perceive and recommend your software across GPT, Claude, Gemini, and more.","archived":false,"fork":false,"pushed_at":"2026-03-01T15:06:36.000Z","size":1157,"stargazers_count":8,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-01T15:22:11.660Z","etag":null,"topics":["ai-monitoring","ai-perception","astro","brand-monitoring","developer-tools","docker","fastapi","llm","mcp","openrouter","opensource","python","self-hosted","seo"],"latest_commit_sha":null,"homepage":"http://geostorm.ai/","language":"Python","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/geostorm-ai.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"SUPPORT.md","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}},"created_at":"2026-02-24T08:32:18.000Z","updated_at":"2026-03-01T14:46:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/geostorm-ai/geostorm","commit_stats":null,"previous_names":["geostorm-ai/geostorm"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/geostorm-ai/geostorm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geostorm-ai%2Fgeostorm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geostorm-ai%2Fgeostorm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geostorm-ai%2Fgeostorm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geostorm-ai%2Fgeostorm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/geostorm-ai","download_url":"https://codeload.github.com/geostorm-ai/geostorm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geostorm-ai%2Fgeostorm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30007043,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T14:08:50.421Z","status":"ssl_error","status_checked_at":"2026-03-02T14:08:50.037Z","response_time":60,"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":["ai-monitoring","ai-perception","astro","brand-monitoring","developer-tools","docker","fastapi","llm","mcp","openrouter","opensource","python","self-hosted","seo"],"created_at":"2026-02-26T11:25:33.826Z","updated_at":"2026-03-02T15:00:32.157Z","avatar_url":"https://github.com/geostorm-ai.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# GeoStorm\n\n### AI Perception Monitoring for Software\n\n**Monitor how AI systems perceive and recommend your software across GPT, Claude, Gemini, and more.**\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/geostorm-ai/geostorm\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/python-3.11+-blue?style=flat\u0026logo=python\u0026logoColor=white\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/geostorm-ai/geostorm/actions/workflows/checks.yml\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/actions/workflow/status/geostorm-ai/geostorm/checks.yml?branch=main\u0026style=flat\u0026label=CI\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/geostorm-ai/geostorm/pkgs/container/geostorm\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/docker-ghcr.io-2496ED?style=flat\u0026logo=docker\u0026logoColor=white\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/geostorm-ai/geostorm?tab=contributing-ov-file\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/PRs-welcome-brightgreen?style=flat\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/geostorm-ai/geostorm?tab=MIT-1-ov-file\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/license-MIT-blue?style=flat\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003c/div\u003e\n\n---\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n**Developers increasingly discover software through AI** -- GPT, Claude, Gemini, Perplexity, and others. When someone asks \"what's the best library for X?\", the AI's answer shapes adoption. But you have no idea what these models are saying about your project.\n\n**GeoStorm fixes this.** It monitors multiple AI models on a schedule, tracks how they perceive and recommend your software, and alerts you when things change -- a new competitor appears, your ranking drops, or a model stops mentioning you entirely.\n\nOne container. One command. Full visibility into your AI presence.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## Quick Start\n\n```bash\ndocker run -d -p 8080:8080 -v geostorm-data:/app/data --name geostorm ghcr.io/geostorm-ai/geostorm\n```\n\nOpen [http://localhost:8080](http://localhost:8080) -- the demo loads immediately.\n\n**That's it.** No git clone, no build step, no API keys, no database setup. A demo project with 90 days of synthetic monitoring data is ready to explore.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ch3\u003eRequirements\u003c/h3\u003e\u003c/summary\u003e\n\n- [Docker](https://docs.docker.com/get-docker/)\n- An [OpenRouter](https://openrouter.ai/) API key (for querying AI models)\n\n\u003c/details\u003e\n\n---\n\n## What You'll See\n\nThe demo project ships with realistic sample data so you can explore every feature immediately:\n\n| Feature | Description |\n|---------|-------------|\n| **Signal Panel** | A unified feed of alerts, ranked by severity and recency |\n| **Alerts Feed** | Critical and warning signals with full context on what changed |\n| **Perception Chart** | Track your recommendation share and positioning across models over time |\n\nThe demo data covers multiple AI models, competitor tracking, and trend analysis so you can see exactly how GeoStorm works before connecting your own projects.\n\n---\n\n## Next Steps\n\nTo start monitoring your own software:\n\n**1. Get an API key** at [OpenRouter](https://openrouter.ai/) -- one key gives you access to multiple AI models.\n\n**2. Add your OpenRouter API key in the GeoStorm settings page:**\n\n\u003cimg src=\"docs/images/settings-api-key.png\" alt=\"GeoStorm Settings — API Key\" width=\"700\"\u003e\n\n**3. Create a project** in the UI and GeoStorm starts monitoring on a schedule.\n\n---\n\n## Alert Types\n\nGeoStorm detects and alerts on these signals:\n\n| Alert | Severity | Description |\n|-------|----------|-------------|\n| `competitor_emergence` | Critical | A new competitor has appeared in AI recommendations for your category |\n| `disappearance` | Critical | Your software has stopped being mentioned by one or more AI models |\n| `recommendation_share_drop` | Warning | Your share of AI recommendations has declined significantly |\n| `position_degradation` | Warning | Your software is being listed lower in AI recommendation rankings |\n| `model_divergence` | Warning | Different AI models are giving substantially different recommendations about your software |\n\n---\n\n## Architecture\n\nGeoStorm runs as a single Docker container with no external dependencies:\n\n| Component | Technology |\n|-----------|-----------|\n| **Backend** | FastAPI serving the REST API and running scheduled monitoring jobs via APScheduler (in-process) |\n| **Frontend** | Astro with React islands, styled with TailwindCSS, charts powered by Recharts |\n| **Database** | SQLite, stored in a mounted volume (`./data/`) |\n| **Scheduling** | APScheduler runs inside the FastAPI process -- no separate worker, no Redis, no message queue |\n\nThe entire stack is self-contained. One container, one port, one volume mount.\n\n---\n\n## Configuration\n\nGeoStorm works out of the box with zero configuration. You can optionally configure notification channels via environment variables in a `.env` file:\n\n| Channel | Description |\n|---------|-------------|\n| **Slack** | Set a webhook URL to receive alerts in a Slack channel |\n| **Email** | Configure SMTP settings for email notifications |\n| **Custom Webhook** | Point alerts at any HTTP endpoint |\n\nAll notification channels are optional. GeoStorm always displays alerts in the UI regardless of notification configuration.\n\n---\n\n## Contributing\n\nGeoStorm is open-source and we welcome contributions.\n\n### Ways to contribute:\n\n- **Bug Report:** Found an issue? [Create a bug report](https://github.com/geostorm-ai/geostorm/issues/new)\n- **Feature Request:** Have an idea? [Submit a feature request](https://github.com/geostorm-ai/geostorm/issues/new)\n- **Pull Request:** PRs are welcome -- fork, branch, and open a PR\n\n### Development Setup\n\n```bash\n# Run locally with a local build\ndocker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --build\n\n# Backend checks\nuv sync --frozen --all-extras\nuv run ruff check .\nuv run mypy src/ --strict\nuv run pytest tests/ -v\n\n# Frontend checks\ncd web \u0026\u0026 pnpm install --frozen-lockfile\npnpm astro check\npnpm tsc --noEmit\n```\n\n#### Structured Logging (Optional)\n\nGeoStorm uses [Logfire](https://logfire.pydantic.dev/) for structured logging. Console logs work out of the box with no extra setup. To also send telemetry to Logfire cloud during development, set `LOGFIRE_TOKEN` in your environment.\n\n---\n\n## FAQ\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhy would I want this?\u003c/strong\u003e\u003c/summary\u003e\n\u003cbr\u003e\n\nMore and more developers discover tools by asking AI -- \"what's the best library for X?\" If an AI model stops recommending your project, or starts favoring a competitor, you'd never know unless you manually checked every model. GeoStorm automates that, runs on a schedule, and alerts you when something changes.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhy OpenRouter?\u003c/strong\u003e\u003c/summary\u003e\n\u003cbr\u003e\n\nOpenRouter gives you access to GPT, Claude, Gemini, Llama, and dozens of other models through a single API key. Instead of managing separate keys for OpenAI, Anthropic, and Google, you sign up once and GeoStorm can query all of them. You can also use direct provider keys (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GOOGLE_API_KEY`) if you prefer.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eIs there a hosted version?\u003c/strong\u003e\u003c/summary\u003e\n\u003cbr\u003e\n\nNot yet. GeoStorm is self-hosted only for now. The Docker container is designed to be easy to run anywhere -- your laptop, a VPS, or a cloud VM. A hosted version is on the roadmap.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhy SQLite?\u003c/strong\u003e\u003c/summary\u003e\n\u003cbr\u003e\n\nGeoStorm is a single-user monitoring tool, not a multi-tenant SaaS. SQLite keeps things simple -- no database server to run, no connection strings to configure, no separate container. Your data lives in a single file on a mounted volume. For the query patterns GeoStorm uses, SQLite is more than fast enough.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eHow much does it cost to run?\u003c/strong\u003e\u003c/summary\u003e\n\u003cbr\u003e\n\nGeoStorm itself is free. The only cost is the AI API usage through OpenRouter. A typical monitoring run queries 3 models with a few prompts each -- roughly $0.01-0.05 per run depending on the models you choose. Running daily, that's about $1-2/month.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCouldn't I do this with OpenClaw?\u003c/strong\u003e\u003c/summary\u003e\n\u003cbr\u003e\n\nYou could wire up an OpenClaw agent with a cron job to query AI models daily and store the results somewhere. But then you're building GeoStorm from scratch -- prompt engineering for consistent structured responses, parsing and normalizing across models, calculating recommendation share and position rankings, detecting changes over time, generating alerts, and building a UI to make sense of it all.\n\nGeoStorm does all of that out of the box. It's also cheaper and more predictable -- GeoStorm runs deterministic code on a fixed schedule, so you know exactly what queries run and what they cost. An AI agent deciding what to do each run can drift, retry unpredictably, or burn tokens on reasoning overhead. One container, no agent framework required.\n\n\u003c/details\u003e\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n### Ready to see what AI thinks about your software?\n\n```bash\ndocker run -d -p 8080:8080 -v geostorm-data:/app/data --name geostorm ghcr.io/geostorm-ai/geostorm\n```\n\n\u003ca href=\"https://github.com/geostorm-ai/geostorm\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Star%20on%20GitHub-181717?style=for-the-badge\u0026logo=github\u0026logoColor=white\" alt=\"Star GeoStorm\" /\u003e\n\u003c/a\u003e\n\n\u003c/div\u003e\n\n---\n\n**License:** MIT | **Python:** 3.11+ | **Homepage:** [github.com/geostorm-ai/geostorm](https://github.com/geostorm-ai/geostorm)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeostorm-ai%2Fgeostorm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgeostorm-ai%2Fgeostorm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeostorm-ai%2Fgeostorm/lists"}