Skip to content

Latest commit

Β 

History

History
123 lines (92 loc) Β· 5.43 KB

File metadata and controls

123 lines (92 loc) Β· 5.43 KB

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.