Share and vote on local deals in a community feed
Translation pending
AI summary · README
SocialJavaScript · CSSGitHub @jowishOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Dilz is a community platform for sharing deals. Any user who spots an
interesting promotion — in a store, online, anywhere — posts it to the
Dilz feed, where the community can see it, vote on it, comment and share it.
Deals are geolocated, so people find what is worth their time near them.
The Capacitor 8 iOS shell lives in ios/ and loads the production Dilz application from https://dilz.vercel.app. App Store preparation, remaining blockers and the Mac release procedure are documented in docs/app-store/.Read the full README ↗Dilz is a community platform for sharing deals. Any user who spots an interesting promotion — in a store, online, anywhere — posts it to the Dilz feed, where the community can see it, vote on it, comment and share it.
Deals are geolocated, so people find what is worth their time near them.
The Capacitor 8 iOS shell lives in ios/ and loads the production Dilz application from https://dilz.vercel.app. App Store preparation, remaining blockers and the Mac release procedure are documented in docs/app-store/.
Run npm run ios:sync after changing Capacitor configuration or native plugins. Opening and signing the Xcode project requires macOS with Xcode 26 or later.
Dilz also still carries a legacy Israeli supermarket price-comparison feature (product/price/promotion imports). It is not the product — see Legacy: price comparison below.
npm install..env.example to .env.local and fill in the Supabase values.supabase-core-setup.sqlsupabase-product-images-setup.sqlsupabase-deal-images-setup.sqlsupabase-votes-setup.sqlsupabase-alerts-setup.sqlsupabase-safety-setup.sqlsupabase-native-push-setup.sqlsupabase-deal-promotion-setup.sqlnpm run dev.The service-role key is server-only. Never prefix it with NEXT_PUBLIC_ or expose it to browser code.
npm run dev: start the development servernpm test: run the unit testsnpm run build: create a production buildnpm run check: run tests followed by the production buildnpm run ios:sync: copy Capacitor configuration and plugins into the iOS projectnpm run ios:open: open the iOS project on a Mac with XcodeAuthenticated users can publish deals with an image, vote, comment, edit their own deals, and create alerts. The API derives the author identity from the Supabase access token rather than trusting request bodies.
scripts/deal-bot.js (Dilz Scout) fetches candidate deals from the web — KSP, public Telegram channels, authorized Facebook pages and RSS feeds — and inserts them with pending status for review. It does not compare prices; it discovers deals to add to Dilz. Approve or reject one with a server-to-server request:
$headers = @{ Authorization = "Bearer $env:ADMIN_BOT_TOKEN" }
$body = @{ id = 123 } | ConvertTo-Json
Invoke-RestMethod -Method Post -Uri http://localhost:3000/api/admin/approve -Headers $headers -ContentType application/json -Body $body
Use /api/admin/reject to reject it. Admin tokens must be sent in a header, never in the URL.
Dilz began as an Israeli supermarket price-comparison tool. That product is dead; Dilz today is the community deal-sharing platform described above. The price-comparison data pipeline and UI below are still present in the codebase — not deleted, since the local setup instructions above still depend on them — but they are not maintained or promoted as a feature.
The product comparison modal (components/deals/PromoModal.js) is no longer opened from anywhere
in the app — it and the barcode scanner it was paired with (pages/scan.js) were disconnected from the
UI in issue #15. When live, it listed each store's price for a product, highlighted the cheapest one,
and showed the amount saved. The component remains in the codebase, unreferenced, per the note above.
Imports write with SUPABASE_SERVICE_KEY; public clients only receive read access to catalog data.
node scripts/import-magasins.js
node scripts/import-prix.js
node scripts/import-images.js
The import order matters because prices and promotions reference products, while city search reads normalized stores.
Run supabase-product-images-setup.sql once before image enrichment. Images are matched only by exact barcode:
npm run images:stats
npm run images:import -- --source=shufersal --limit=500
npm run images:import -- --source=open-food-facts --limit=500
Shufersal pages are checked first because they cover many Israeli products. Open Food Facts is used as a secondary source and is intentionally rate-limited. Set OPENFOODFACTS_CONTACT to a real contact email before running bulk enrichment. Products with short internal produce codes keep the neutral application placeholder instead of receiving an approximate or misleading photo.
Open Food Facts images are attributed in the product comparison modal and remain subject to the source's CC BY-SA terms. Review retailer terms before relying on retailer-hosted images in production.
.env.example in the hosting environment.npm run check.