skills/productivity/local-places/SKILL.md
Discovers, enriches, and scores local businesses in any neighborhood using Nimble Web Search Agents (WSAs) and web data. Returns a structured, ranked list with confidence scores, reviews, social presence, and an interactive map. Use this skill when the user asks about local businesses, places, or neighborhood discovery. Common triggers: "find all coffee shops in", "map every bar in", "local businesses in", "discover gyms near", "what restaurants are in", "neighborhood guide for", "local places in", "find places near", "list all [business type] in [area]", "best [type] near [location]", "build a neighborhood guide", "local place search". Requires the Nimble CLI (nimble agent run, nimble search, nimble extract) for live web data via WSAs and fallback search. Do NOT use for competitor analysis or monitoring (use competitor-intel), company research or deep dives (use company-deep-dive), general web search or extraction (use nimble-web-expert).
npx skillsauth add nimbleway/agent-skills local-placesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Location intelligence powered by Nimble Web Search Agents and web data APIs.
User request: $ARGUMENTS
Before running any commands, read references/nimble-playbook.md for Claude Code
constraints (no shell state, no &/wait, sub-agent permissions, communication style).
Follow the transport selection + standard preflight from references/nimble-playbook.md — pick CLI or MCP at session start, then run the standard preflight calls (date calc, today, profile, memory index) in parallel.
Also simultaneously:
mkdir -p ~/.nimble/memory/{reports,local-places/checkpoints}ls ~/.nimble/memory/local-places/checkpoints/ 2>/dev/nullFrom the results:
references/profile-and-onboarding.md, stopnimble CLI calls: nimble --client-source skill-local-places <subcommand>. MCP path: not yet supported — see references/nimble-playbook.md for status.references/nimble-playbook.md:
last_runs.local-places is today, check if a report
already exists at ~/.nimble/memory/reports/local-places-*[today].md. If so,
ask: "Already ran today for this area. Run again for fresh data?" Don't silently
re-run.Parse $ARGUMENTS for place type and location. Extract:
| Field | Required | Source | |-------|----------|--------| | Place type | Yes | User input ("coffee shops", "gyms", "restaurants") | | Location | Yes | User input ("Williamsburg", "downtown Austin", "Park Slope") | | Filters | Optional | User input ("with good reviews", "open late", "cheap") | | Output preference | Optional | User input ("map", "list", "guide") |
If both place type and location are clear from $ARGUMENTS, confirm briefly and
proceed: "Searching for coffee shops in Williamsburg, Brooklyn..."
If partial or ambiguous, ask one combined question in plain text:
"What type of places are you looking for, and where? (e.g., 'coffee shops in Williamsburg' or 'gyms near downtown Austin')"
If the user provided both but you want to scope further, use AskUserQuestion (counts as 1 of max 2 prompts):
How thorough should this search be?
- Quick scan -- top results from Google Maps + Yelp (~20 places)
- Comprehensive -- full discovery + social enrichment + reviews (~50+ places)
- Deep dive with map -- everything above + interactive neighborhood map
Before any API calls, resolve the location to avoid wasted searches.
Disambiguation triggers:
If ambiguous, ask the user (counts toward 2-prompt max):
"There are a few places called Williamsburg. Which one?"
- Williamsburg, Brooklyn, NY
- Williamsburg, VA
- Other -- I'll specify
If unambiguous, infer the full location (city + state/country) and confirm inline: "Searching Williamsburg, Brooklyn, NY..."
After disambiguation, derive the slug for checkpointing and file paths:
lowercase, hyphenated, includes city + state/country (e.g., williamsburg-brooklyn-ny).
Follow the Checkpointing & Resume pattern from references/memory-and-distribution.md.
Check: cat ~/.nimble/memory/local-places/checkpoints/{slug}/discovery.json 2>/dev/null
Discover available WSAs for all phases before execution. Run these searches simultaneously:
nimble agent list --search "maps" --limit 20
nimble agent list --search "reviews" --limit 20
nimble agent list --search "social" --limit 20
nimble agent list --search "{place-type}" --limit 20
From the combined results:
entity_type: SERP for discovery, PDP/Profile for enrichment/detailmanaged_by: "nimble" over managed_by: "community"references/wsa-pipeline.md for classification strategynimble agent get --template-name {name} to confirm paramsIf no WSAs found for a phase, that phase falls back to nimble search. Log
which phases had WSA coverage and which are using fallback.
Read references/wsa-pipeline.md for category detection logic.
Run discovered maps/location WSAs simultaneously, using the validated params from Step 4:
nimble agent run --agent {discovered_maps_wsa} --params '{...validated params...}'
nimble agent run --agent {discovered_review_site_wsa} --params '{...validated params...}'
Tertiary (conditional): Run discovered credibility WSAs only if primary + secondary return < 10 combined unique results, or if the user asked for credibility/trust data.
If any WSA fails or returns empty, fall back to:
nimble search --query "[place-type] in [location]" --max-results 20 --search-depth lite
After discovery:
references/nimble-playbook.md: place_id exact match -> domain normalization ->
fuzzy name + city~/.nimble/memory/local-places/checkpoints/{slug}/discovery.jsonFor each discovered place that has a Facebook page or Instagram handle, run the social WSAs discovered in Step 4. Batch max 4 concurrent Bash calls.
nimble agent run --agent {discovered_social_wsa} --params '{...validated params...}'
Run each discovered social WSA for places with matching handles. Skip social platforms for which no WSA was discovered. If no social WSAs were found in Step 4, skip this phase entirely.
Save checkpoint: ~/.nimble/memory/local-places/checkpoints/{slug}/social.json
For the top places (by source count and data completeness), run the review WSAs discovered in Step 4:
nimble agent run --agent {discovered_reviews_wsa} --params '{...validated params...}'
Batch max 4 concurrent calls. Focus on places that have a place_id or equivalent
identifier from Phase 1 discovery. If no review WSAs were found in Step 4, fall
back to: nimble search --query "[place-name] reviews" --max-results 5 --search-depth lite
Save checkpoint:
~/.nimble/memory/local-places/checkpoints/{slug}/reviews.json
Auto-trigger when the place type category matches food/drink keywords.
See references/wsa-pipeline.md for the category detection logic.
If triggered, run the delivery/food WSAs discovered in Step 4. Discovery first, then detail:
nimble agent run --agent {discovered_delivery_serp_wsa} --params '{...validated params...}'
For places found on delivery platforms, fetch full details using discovered detail WSAs:
nimble agent run --agent {discovered_delivery_detail_wsa} --params '{...validated params...}'
If no delivery WSAs were found in Step 4, fall back to:
nimble search --query "[place-name] [location] delivery" --max-results 3 --search-depth lite
Only run for food/drink categories. Skip if category doesn't match.
Deduplication: Run a final dedup pass across all phases following the Entity
Deduplication pattern from references/nimble-playbook.md. Merge fields from
multiple sources into a single enriched record per place.
Confidence scoring: Follow the Entity Confidence Scoring pattern from
references/nimble-playbook.md. Skill-specific target fields (N=8):
| Field | Description | |-------|-------------| | name | Business name | | address | Full street address | | phone | Phone number | | website | Website URL | | rating | Average rating | | review_count | Number of reviews | | social | At least one social profile | | hours | Operating hours |
Scoring criteria:
*** High** Medium* LowPresent results as a numbered table sorted by confidence (High first), then by rating within each tier.
# Local Places: [Place Type] in [Location]
*Found [N] places | [Date] | Confidence: [H] High, [M] Medium, [L] Low*
## Results
| # | Name | Rating | Reviews | Confidence | Address | Sources |
|---|------|--------|---------|------------|---------|---------|
| 1 | Place A | 4.8 (312) | *** High | 123 Main St | [Maps][Yelp] |
| 2 | Place B | 4.6 (89) | ** Medium | 456 Oak Ave | [Maps] |
...
## Top Picks (High Confidence)
### 1. Place A
- **Address:** 123 Main St, Williamsburg, Brooklyn, NY
- **Phone:** (555) 123-4567 | **Website:** [placea.com](https://placea.com)
- **Rating:** 4.8/5 (312 reviews on Google Maps, 289 on Yelp)
- **Social:** Instagram @placea (2.1K followers) | Facebook (1.8K likes)
- **Hours:** Mon-Fri 7am-7pm, Sat-Sun 8am-6pm
- **Delivery:** Available on DoorDash, Uber Eats
- **Why it stands out:** [1-2 sentences from review highlights]
- **Sources:** [Google Maps](link) | [Yelp](link) | [Facebook](link)
[Repeat for each High confidence place]
## Other Results (Medium + Low Confidence)
[Briefer format -- name, rating, address, missing data noted]
## What's Missing
[Note any data gaps: "3 places had no website or social presence",
"Reviews unavailable for BBB-only listings"]
Source links are mandatory. Every place must have at least one clickable source URL (Google Maps link, Yelp listing, website, or social profile). Places without any source link should be noted in "What's Missing" but still included if they have sufficient data from WSA results.
Drill-down: After presenting, tell the user:
"Want details on any place? Say 'tell me more about #3' or ask for the interactive map."
Generate an HTML file with Leaflet.js + OpenStreetMap tiles. See
references/wsa-pipeline.md for the full map generation pattern and color scheme.
Save to: ~/.nimble/memory/local-places/{slug}-map-{date}.html
Open in browser: open ~/.nimble/memory/local-places/{slug}-map-{date}.html
Only generate automatically if the user chose "Deep dive with map" in Step 1.
For map generation details, see references/wsa-pipeline.md.
Otherwise, offer it as a follow-up action.
Make all Write calls simultaneously:
~/.nimble/memory/reports/local-places-{slug}-{date}.md~/.nimble/memory/local-places/{slug}/places.json
(structured JSON with all enriched records)last_runs.local-places in ~/.nimble/business-profile.json
(only if profile exists)references/memory-and-distribution.md: update
index.md rows for all affected entity files, append a log.md entry for this run.Always offer distribution -- do not skip this step. Follow
references/memory-and-distribution.md for connector detection, sharing flow, and
source links enforcement.
Notion: full results table as a dated subpage. Slack: TL;DR with top 5 places only.
Sibling skill suggestions:
Next steps:
- Run
company-deep-divefor a full 360 profile on any business from this list- Run
meeting-prepif you're meeting with someone at one of these businesses- Run
competitor-positioningto compare businesses in this area
For comprehensive searches (50+ places), use nimble-researcher agents
(agents/nimble-researcher.md) to parallelize enrichment.
Follow the sub-agent spawning rules from references/nimble-playbook.md
(bypassPermissions, batch max 4, explicit Bash instruction, fallback on failure).
For WSA calls at scale (11+ entities), tell agents to use agent run-batch instead
of individual calls. See the Scaled Execution pattern in
references/nimble-playbook.md for tier selection. Pass the discovered WSA names
from Step 4 to each agent so they use the same cached names.
Spawn pattern: One agent per batch of 10 places for social enrichment. Each agent runs the Phase 2 WSAs for its batch and returns structured results.
Single-batch optimization: If <= 10 places, run enrichment directly from the main context instead of spawning agents -- saves overhead.
Fallback: If any agent fails, run those WSA calls directly from the main context.
Check at startup: echo $CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS
Team mode (flag set): Spawn teammates for parallel phases:
Solo mode (flag not set): Standard sequential flow from Steps 4-7.
See references/nimble-playbook.md for the standard error table (missing API key, 429,
401, empty results, extraction garbage). Skill-specific errors:
nimble search for that place/query. Log the failure but don't skip the place.nimble search. Log which phases had no WSA coverage.development
Builds Databricks data products from live web data, end to end: discovers the right Nimble web-data agents, scrapes into Delta tables, and produces an AI/BI dashboard and/or a deployed Databricks App — a table → dashboard → app workflow, for production data products or quick demos. Use whenever a request pairs live or scraped web data WITH a Databricks destination — e.g. "scrape Amazon/Walmart prices into a Delta table and build a dashboard", "load Zillow/Instagram/Maps/search results into Databricks and build a dashboard or app", "showcase Nimble + Databricks to a prospect". Prefer it over nimble-web-expert or competitor-intel when the data lands in Databricks. Do NOT use for one-off web fetches or CSV exports with no Databricks destination — use nimble-web-expert instead. Do NOT use for competitor or company research briefings — use competitor-intel or company-deep-dive instead. Do NOT use for generic Databricks work with no Nimble/web-data angle — use the official databricks-* skills instead.
development
Finds qualified candidates for a role by searching LinkedIn, Indeed, GitHub, and other professional platforms using Nimble Web Search Agents. Accepts a job description, role title, or freeform request and returns a ranked candidate list with profiles, skills, and contact signals. Use this skill when the user wants to find, source, or recruit candidates for a role. Common triggers: "find candidates for", "source engineers in", "who can I hire for", "find me a [role]", "recruiting for", "talent search", "find a [role] in [city]", "build a candidate list", "sourcing for [role]", "who's available for", "find potential hires". Also triggers on a pasted job description followed by a sourcing request. Do NOT use for job market research or salary benchmarking — use market-finder instead. Do NOT use for researching a single known person — use company-deep-dive or meeting-prep instead.
development
Get web data now — fast, incremental, immediately responsive to what the user needs. The only way Claude can access live websites. USE FOR: - Fetching any URL or reading any webpage - Scraping prices, listings, reviews, jobs, stats, docs from any site - Discovering URLs on a site before bulk extraction - Calling public REST/XHR API endpoints - Web search and research (8 focus modes) - Bulk crawling website sections Must be pre-installed and authenticated. Run `nimble --version` to verify. For building reusable extraction workflows to run at scale over time, use nimble-agent-builder instead.
development
A building experience: create, test, validate, refine, and publish extraction workflows based on existing or new Nimble agents. For users who want to invest in a durable, reusable workflow for a specific domain — not get data immediately. Trigger phrases: "set up extraction for X site", "I need to extract from this site regularly", "build an agent for", "create a reusable scraper", "generate a Nimble agent", "refine my agent", "add a field to my agent", or when the user wants to run extraction at scale. For getting data immediately, use nimble-web-expert instead.