Skip to content

roeimichael/AppScanner

Repository files navigation

appscanner

Find your next apartment in Israel before everyone else does.
Scans Yad2 + Onmap every 15 minutes. Telegrams you the moment a new listing matches your spec β€” with a one-tap WhatsApp link to the owner and a market-fit score.

appscanner dashboard

Why

The Israeli rental market moves fast. A good listing in a tight neighborhood is gone within hours. Refreshing Yad2 manually doesn't scale and the official saved-search emails are slow and noisy.

appscanner runs the search for you on a 15-minute cadence and only pings when something actually new appears that matches your spec. It also tells you whether the apartment is a deal compared to the local market.

Features

  • πŸ“‘ Two sources, one feed β€” Yad2 (via a proxy to bypass anti-bot) and Onmap, deduped to a single stream
  • 🎯 Sharp filters β€” neighborhoods, rooms, price, square meters, floor, amenities, agency/private
  • πŸ“ Smart geo-fallback β€” when a listing's neighborhood field is empty, coordinates are reverse-geocoded so you don't miss it
  • πŸ“Š Market-fit score β€” ranks every listing 0–100 against your ideal price / size / floor / amenities, with explainable factor breakdown
  • πŸ’Έ β‚ͺ/mΒ² vs city mean β€” every alert tells you if the listing is cheap (top 25%) or pricey (bottom 25%) for the city
  • πŸ”₯ Hot-deal flag β€” private listings priced β‰₯10% below city mean get highlighted
  • πŸ“² Telegram alerts β€” one message per listing with photo, address, owner phone (where available), prefilled WhatsApp link, and source-deep-link
  • πŸ‘₯ Multi-chat fan-out β€” DM yourself + share a group chat for collaborative hunting
  • πŸŒ™ Active hours β€” pause overnight, scan during the day
  • πŸ—ΊοΈ Web dashboard β€” searches, optimal ranking, map with clustering, activity charts
  • πŸ‘₯ Shared tracker β€” collaborative tab for 2-3 roommates: shortlist apartments from any source, track status (interested β†’ contacted β†’ visited β†’ signed), assign who's reaching out, leave notes

Quickstart

You need: Node 20+, a free Supabase project, a Telegram bot (@BotFather β†’ /newbot), and optionally a free ScraperAPI key for Yad2.

git clone https://github.com/roeimichael/appscanner.git
cd appscanner
npm install
cp .env.local.example .env.local   # then fill it in

Apply the schema to your Supabase project (paste both files into the SQL editor, in order):

supabase/migrations/0001_init_appscanner_schema.sql
supabase/migrations/0002_tracker.sql

Run it:

npm run dev
# open http://localhost:3000

Open /settings, save your Telegram bot token + chat id, then /searches/new to create your first search.

Self-host on Vercel + Supabase

Free tier on both is plenty.

vercel link
vercel env add SUPABASE_URL              production
vercel env add SUPABASE_SERVICE_ROLE_KEY production
vercel env add SCRAPERAPI_KEY            production   # optional
vercel env add CRON_SECRET               production
vercel env add ROOMMATES                 production   # comma-separated names for tracker tab
vercel deploy --prod

Vercel Hobby cron caps at one fire/day, so the live trigger runs from Supabase:

create extension if not exists pg_cron with schema extensions;
create extension if not exists pg_net  with schema extensions;

select cron.schedule('appscanner-scan-15min', '*/15 * * * *', $cron$
  select net.http_post(
    url := 'https://YOUR-DEPLOYMENT.vercel.app/api/scan',
    headers := jsonb_build_object('Authorization', 'Bearer YOUR_CRON_SECRET'),
    body := '{}'::jsonb
  );
$cron$);

After your first deploy, hit /api/scan?force=1&bootstrap=1 once β€” it backfills the dedup state silently so you don't get a flood of "new!" pings for every listing already on the market.

Sample Telegram alert

πŸ”₯ 6,800 β‚ͺ (hot deal) β€” Χ€ΧͺΧ— ΧͺΧ§Χ•Χ•Χ”
   Χ”Χ“Χ¨ Χ”ΧžΧ•Χ©Χ‘Χ•Χͺ β€’ Krause 12
   4 rooms β€’ 95 sqm β€’ floor 3
   πŸ“Š β‚ͺ72/sqm β€” 14% below avg, top 25% (cheap)
   πŸ‘€ ללא ΧͺΧ™Χ•Χ•Χš (private)
   πŸ›— ΧžΧ’ΧœΧ™Χͺ β€’ 🌿 מר׀בΧͺ β€’ πŸš— Χ—Χ Χ™Χ” β€’ πŸ›‘οΈ ממ"Χ“
   πŸ“ž 050-XXX-XXXX β†’ WhatsApp
   πŸ”— View on Onmap

Tech

Next.js 16 Β· TypeScript Β· Tailwind 4 Β· shadcn/ui Β· Supabase Postgres (with pg_cron) Β· Vercel Β· Leaflet Β· ScraperAPI Β· OSM Nominatim Β· Telegram Bot API

Caveats

  • Yad2 hides owner phones behind an authenticated reveal β€” only the source-deep-link gets sent for Yad2 listings. Onmap exposes phones freely.
  • ScraperAPI free tier covers ~5000 reqs/month; default cadence + active-hours stays well under that.
  • Designed around the Israeli market β€” Hebrew neighborhood names, β‚ͺ currency, IL phone format.

License

MIT β€” see LICENSE. Use it, fork it, swap in your own city.

About

🏒 Real-time apartment-listing aggregator for Israeli rentals β€” scans Yad2 + Onmap every 15 min, ranks vs preferences, alerts via Telegram with WhatsApp deep-links

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors