LangChain Deal Monitor
Watch any live-web query and get a Slack alert when something new appears.
A small LangChain/LangGraph app that uses Nimble Search to monitor the web, filter out results it has already seen, summarise new matches with an OpenAI-compatible model, and post the digest to Slack. Use it as a funding monitor, competitor tracker, acquisition watcher, pricing monitor, product-launch alert, or any workflow where fresh web results matter. Built for GTM, DevRel, investing, product, and research teams that need lightweight alerts when the web changes.
Inputs
- Search query Any live-web monitoring query — e.g. "developer tools funding news this week" or "competitor product launch announcement".
- Nimble API key Used by NimbleSearchTool to fetch current web results through Nimble's LangChain integration.
- Slack webhook URL Destination for alerts when the app finds new results.
- OpenAI-compatible LLM key Used to summarise new results before sending the Slack digest. The sample uses OpenRouter, but the model layer is swappable.
- Optional search settings Tune focus, recency, depth, result count, country, locale, and output format through environment variables.
Outputs
- New web results for the configured query
- Duplicate filtering against a local seen-result list
- A concise Slack-ready summary of only the new matches
- Source links for the results that triggered the alert
- Local
.state.jsontracking so future runs only alert on genuinely new items - Dry-run output for validating the graph without external API calls
- Optional LangSmith traces for debugging and demo visibility
How it works
A 7-step graph that runs on demand or on a cron to search, deduplicate, summarise, and alert, with no database required.
- Search NimbleSearchTool runs a live web search for the configured monitoring query — returning current results from across the web.
- Normalize The app normalizes returned results into a consistent shape: title, URL, and snippet.
- Filter Each result URL is checked against a local .state.json seen-list. Only genuinely new matches continue to the next step.
- Summarise An OpenAI-compatible chat model turns the new results into a short, Slack-friendly digest with source links.
- Notify The app posts the digest to Slack via an Incoming Webhook. If no new results are found, nothing is sent.
- Persist Seen URLs are saved to .state.json so the next run skips them.
- Schedule Run manually or place on a cron — for example, every six hours. The app only sends a Slack message when it finds new results.
Stack
- NimbleSearchTool (
langchain-nimble) Fetches current web results through Nimble's LangChain integration — the live web data layer for every run. - Nimble Focus Mode Sets focus mode (news / social / general), time range, depth, result count, country, locale, and output format via environment variables.
- LangGraph Orchestrates the workflow as a 5-node graph: search → normalize → filter → summarise → notify → persist.
- LangChain Provides the Nimble tool integration and OpenAI-compatible chat model interface.
- OpenRouter Sample LLM provider (default: google/gemma-3-27b-it:free). Any OpenAI-compatible endpoint works.
- Slack Incoming Webhooks Sends the alert where the team already works.
- Local .state.json Tracks seen URLs without requiring a database.
- Lang Smith optional tracing for debugging and visibility into each run
- Python 3.9+ Local app runtime.
