Presentation-ready inventory of every user-facing and behind-the-scenes feature. Grouped by area; duplicates merged. For the technical/architectural deep-dive (controllers, caching strategies, integrations config) see
features.md.
- Welcome / landing screen — First entry point for guests
- Login — Email + password sign-in
- Register — New account creation
- Google OAuth sign-in — "Sign in with Google" (ID token validated locally)
- Social login buttons (web + native) — Unified Google login UI across platforms
- Logout — Revoke session + clear cookie
- Forgot password — Request a reset link
- Reset password — Set new password via token, revoke all sessions
- Password reset email (Resend) — Sends the reset link by email
- Complete profile — Fill missing details after first login
- Onboarding flow — Guided setup for new users
- Skip onboarding — Bypass onboarding steps
- First-time questions — Initial survey / preferences capture
- Phone number update — Edit phone on profile
- Account deletion (with confirmation modal) — Permanently remove the account, confirmed first
- Auth security stack — JWT identity for protected routes · access token kept in memory only (XSS hardening) · refresh-token rotation (single-winner) · token reuse detection (revokes sessions) · httpOnly refresh cookie on web · refresh token in body on native · CSRF guard on the cookie path · constant-time BCrypt verify
- Registration name moderation (Content Safety) — Blocks abusive display names at signup
- Address search — Look up any address
- Address info panel (bottom sheet, tabs) — Sliding results panel with tabbed sections
- Overview section — Summary stats for the address
- Planning status section — Construction / permits / plans view
- Events section — Community reports for the address
- AI summary section — AI-generated address overview
- Active planning-items count chip — Live badge of non-completed planning + disruption items, shown on the תכנון tab
- Forward geocoding — Address → coordinates
- Reverse geocoding — Coordinates → address
- Reverse-geocode fallback for NULL-coord locations — Recovers coords when missing
- Places autocomplete (Google) — Google address suggestions
- Address autocomplete (data.gov.il / CBS) — City / street suggestions from open data
- Parcel info (gush / chelka) — Land parcel identifiers
- Planning status lookup — Fetches official planning data (Tel Aviv GIS, iplan/MAVAT fallback)
- MAVAT plan-lifecycle events — National plan milestones (deposited / approved / gazette) shown when outside Tel Aviv
- Nearby disruptions lookup — Official municipal disruptions around a point
- Cross-layer disruption deduplication — Collapses the same job listed across overlapping GIS layers (polygon + point + night-work) into one entry, keeping the best geometry
- Disruption coordinate backfill — Geocodes the address for GIS rows missing geometry so they still get a marker + distance (
coordSource: geometry | geocoded) - Zoning (ייעוד) chip popover — Expands all zonings on tap
- Active permit count chip — Shows live permit count
- Location resolve (address → location_id) — Maps an address to a DB location
- Location stats — Aggregated stats for a location
- Deep-linkable address search — Open a specific report via URL / state
- Google Maps rendering — Base interactive map
- Roadmap / streets view — Standard street map mode
- Satellite view toggle — Switch to aerial imagery
- Tel Aviv GIS satellite tiles — TLV orthophoto overlay
- Satellite labels overlay — Street labels on satellite view
- Map overlay system (markers / circles) — Screens push markers / circles to the map
- Smooth pan-to — Animated camera movement
- Drop-a-pin on map (+ prompt card) — Place a pin by tapping; action card appears for it
- Map controls toggle — Show / hide map controls
- Map layer toggle — Switch map layers
- Radius circle for nearby reports — Visualizes the search radius
- Persistent map layout — Map stays mounted across screens
52a. Building footprint overlay (BuildingsOverlay) — Draws official TLV building outlines (GIS layer 513) as a single
google.maps.Datalayer; viewport-tiled (0.01° grid), parallel-fetched, deduplicated by geometry string (notid_binyan), and anti-flicker (layer attached once, visibility toggled viasetStyle, no per-feature animation, mutations only on debouncedidle) 52b. House-number labels overlay (AddressNumbersOverlay) — Renders TLV house numbers (GIS layer 527) as map labels, viewport-fetched in native EPSG:2039 and reprojected; zoom-gated and separately toggleable alongside the building-footprint layer in the map controls 52c. Persistent home-address marker (HomeMarker) — The user's home address is rendered once in MapLayout so it stays visible across all map screens
- Community event reporting — Residents report disruptions
- Multi-step event creation (location / details / description) — Wizard for new reports
- Event cards — Compact report display
- Event success screen — Confirmation after creating a report
- Nearby reports list — Reports around the user
- Nearby event cards — Cards for nearby community reports
- Nearby disruption cards — Cards for official disruptions
- Distance-sorted nearby results — Events + disruptions decorated with and ordered by distance from the user
- Event voting (upvote / downvote) — Community signal on reports
- Comments (with live character counter) — Discussion on a report
- Reviews — User reviews on a location
- Add / edit review (with live character counter) — Submit or update a review
- Text length limits — Comments / reviews / event descriptions capped, with client-side counters
- Text moderation (Content Safety + Hebrew blocklist) — Filters abusive text
- Favorites / bookmarks — Save addresses
- Favorite toggle — Add / remove a bookmark
- Favorite check — Check if a location is saved
- Saved address cards — List of saved addresses
- Address comparison (0–100 score) — Side-by-side address scoring
- Rule-based scoring (penalty-from-ceiling) — Starts high, deducts for disruptions
- Confidence-weighted sentiment scoring — Reviews adjust score by data confidence
- Data-coverage confidence (backend) — Quality flag for how much data backs a score
- Cross-layer GIS dedup in scoring — Comparison reuses the disruption dedup so overlapping layers aren't double-counted
- Winner banner — Highlights the better address
- Winner reasons — Explains why one address won
- Comparison table — Criterion-by-criterion breakdown
- Comparison history — Past saved comparisons
- AI address summary (Gemini) — LLM-written address summary
- AI summary caching — Avoids re-calling the LLM for same input
- AI Q&A assistant — Ask free-text questions in the dictionary
- Deterministic local summary fallback — Used when the AI key / call fails
- Push notifications (FCM) — Device push delivery (web + native)
- In-app notification feed — Notification list inside the app
- Notification deep-linking — Tap lands on the relevant report
- Notification bell badge — Unread count on the bell
- Drawer notification count badge — Unread count in the menu
- Notification summary banner — Top-of-feed summary
- Mark notification seen — Clears unread state
- Dismiss notification — Remove from feed
- Location subscription toggle (+ check) — Follow / unfollow a location and query state
- GPS proximity notifications — Alerts for events near the user
- GPS preference get / set / delete — Manage GPS notification settings
- Device registration (FCM token) — Registers the push token
- Invalid token auto-cleanup — Removes dead FCM tokens
- FCM fan-out on event creation — Notifies home-address + GPS-proximity subscribers (200 m)
- Personal area screen — User's gamification dashboard
- XP system — Earn points for activity
- Levels (7 tiers) — Rank progression from XP (תושב חדש → אגדה עירונית)
- Badges from stats — Awards based on user activity
- Weekly missions (ISO-week rotation) — Rotating weekly goals
- Mission claim + XP reward — Claim completed missions for XP
- Activity streak — Consecutive-activity tracking
- Comment-count stat tracking — Comments-written stat fed into missions / progress
- Stat boxes / cards — Visual stat tiles
- Last-activity deep-linking — Jump back to the exact item / tab
- Neighborhood clustering (ML / K-Means) — Groups neighborhoods by livability
- Auto-K via silhouette score — Auto-picks cluster count
- Livability score per neighborhood — Computed score per area
- Good / medium / bad neighborhood labels — Human-readable cluster labels
- Cluster overlay toggle — Show / hide clusters on map
- Neighborhood overlay — Renders neighborhood polygons
- Neighborhood detail sheet — Tapping a neighborhood opens details
- Clustering diagnostics — Admin / debug clustering info
- Event relevance check-ins — Ask reporters if a report is still relevant
- Relevance confirmation modal — UI to confirm / dismiss relevance
- Pending confirmations — Reports awaiting the user's confirmation
- Confirm relevance (ownership-enforced) — Only the reporter can confirm
- Onboarding questions — Collects user role / preferences (saved via
PUT /users/onboarding→sp_SaveOnboarding) - Onboarding thank-you screen — Post-questions confirmation
- Cities reference data — City list for pickers
- Streets reference data — Streets per city
- Event types reference data — Categories for reports
- Plan status reference data — Planning status options
- Address part normalization — Cleans / normalizes address text
- File / image uploads — Attach images to content
- Image upload modal — Upload UI
- Browser-side image compression — Shrinks images before upload
- 5-layer file validation — Multi-step upload safety checks
- SAS-signed blob URLs — Time-limited private file access
- Smart dictionary (term lookup) — Planning-term glossary
- FAQ — Frequently asked questions
- Legal — Terms / privacy pages
- Settings & profile — User settings hub
- Home address management (+ dedicated editor) — Set / update home address
136a. Contact / bug-report form — In-app modal that emails the support inbox via Resend (replaces the old
mailto:link that failed silently on mobile); input HTML-encoded server-side, rate-limited - Drawer / hamburger menu — Side navigation menu
- Top search bar — Persistent search entry
- Bottom navigation bar — Primary app navigation
- PWA offline support — App works without network
- PWA install prompt / banner (A2HS) — Prompts to add the app to home screen
- Service worker caching (Workbox) — Caches assets / responses
- Per-domain runtime cache strategies — Tailored caching per source
- NetworkOnly live-data bypass — Forces fresh data for time-sensitive APIs
- Offline banner (network status) — Shows when device is offline
- Firebase messaging service worker — Handles background push
- iOS shell — Native iOS app wrapper
- Android shell — Native Android app wrapper
- Camera — Capture photos natively
- Geolocation (coarse + high-accuracy watchers) — Native location tracking
- Push notifications — Native push integration
- Filesystem — Native file access
- Keyboard — Native keyboard handling
- Status bar — Native status-bar styling
- Splash screen — Native launch screen
- Android hardware back button — Handles the OS back button
- Swipe-back gesture — Swipe-to-go-back navigation
- Safe-area insets — Respects notches / home indicators
- Hebrew / RTL layout — Right-to-left interface
- Heebo + Poppins fonts — Hebrew + Latin typography
- Aurora background + decorations — Animated gradient backdrop and decorative elements
- Animated collapse — Smooth expand / collapse sections
- Scroll hint — Cue that content scrolls
- Onboarding app tour (replayable) — Guided walkthrough with step highlights, re-runnable
- Phone-frame desktop preview — Mobile frame shown on desktop
- Motion animations — UI motion / transitions
- Click-outside handling — Closes popovers on outside click
- Debounced inputs — Throttles rapid input events
- Rate limiting (per-endpoint + global) — Throttles abuse per IP
- FluentValidation input validation — Schema-based request validation
- Global exception handling (ApiResponse envelope) — Uniform error responses
- Security headers (CSP, HSTS, X-Frame-Options, etc.) — Hardening HTTP headers
- Serilog logging (two-stage bootstrap) — Structured logging
- PII log redaction — Masks sensitive data in logs
- Request-logging middleware — Logs requests (excludes secrets)
- Strongly-typed options with ValidateOnStart — Config validated at startup
- CORS policy — Restricts allowed origins
- Swagger / OpenAPI (dev) — API explorer in development
- Sensitive-action audit log — Records security-relevant actions
- ADO.NET DAL (stored procedures, no EF) — Manual data access via SPs
180a. Real-client-IP resolution behind Cloudflare — Forwarded-headers middleware +
CF-Connecting-IPso rate limiting and audit logs see the true caller, not the proxy hop 180b. UTC date serialization — JSON converters normalize all APIDateTimes to UTC ISO-8601, so clients parse dates consistently
- Neighborhood seed service (startup, one-shot) — Seeds neighborhood polygons
- Clustering background job — Wakes hourly, recomputes neighborhood clusters when the last result is >1 day old
- Relevance background job — Wakes every 6h, prompts reporters to confirm relevance when the last prompt is >20h old
- GitHub Actions daily cron pokes —
cluster-daily/relevance-dailyhit the admin run-now endpoints (the free-tier App Service sleeps on idle, so the in-process timers alone aren't enough) 184a. Token-protected admin run-now endpoints — Clustering / relevance recompute gated by anX-Admin-Tokenheader (Key VaultAdmin--Token); runs fire-and-forget (202) so the App Service request timeout can't kill them, and the last-run timestamp updates only on success
- Azure App Service hosting (API + frontend) — Cloud hosting
- CI pipeline (build, typecheck, unit tests, audit) — Automated checks on push; backend xUnit + frontend vitest run on every PR, vulnerability checks block merge
186a. Security-header static host — Frontend served by a zero-dep
server.cjsthat injects CSP (report-only), HSTS, X-Frame-Options, nosniff, Permissions-Policy - CD pipeline (gated deploy on main) — Controlled production deploys
- Post-deploy health checks — Verifies deploy succeeded
- Health check endpoint — Liveness probe for load balancer
- Secret scanning (gitleaks, pre-commit + CI) — Blocks committed secrets
- CodeQL security analysis — Static security scanning
- Single re-runnable DB schema script — Idempotent schema source of truth
- ResetData script (wipe user data, keep schema) — Resets DB for testing
Each row is one external dependency: what we use it for and the account/service behind it.
- Azure subscription (Israel Central) — Cloud platform hosting all infrastructure
- Azure App Service — Hosts the API and the frontend
- Azure SQL Database — Primary datastore (managed SQL Server)
- Azure Key Vault — Production secrets via Managed Identity
- Azure Blob Storage — Image / file storage
- Azure AI Content Safety — Text / image moderation API
- Hebrew blocklist moderation — Local Hebrew abuse filter (runs before Content Safety)
- Azure Application Insights — Telemetry, logs, traces, metrics
- Google Cloud / Maps Platform — Maps, geocoding, Places autocomplete
- Google Gemini API — AI summaries and Q&A
- Google OAuth 2.0 — "Sign in with Google" identity provider
- Firebase project (FCM) — Push messaging + client config
- Resend — Transactional email: password-reset links + in-app contact/bug-report submissions (domain verified in Resend dashboard)
- Tel Aviv ArcGIS (gisn.tel-aviv.gov.il) — Municipal GIS disruption / plan layers + satellite tiles
- iplan / MAVAT (ags.iplan.gov.il) — National planning data (legacy TLS)
- data.gov.il (CBS) — Open-data city / street datasets
- Cloudflare — DNS for groundshare.app; proxies api.groundshare.app → Azure API (same-site so the refresh cookie works)
- groundshare.app custom domain — Production domain added via Cloudflare DNS
- GitHub — Source repo + Actions CI/CD + CodeQL + secret scanning
- @capgo/capacitor-social-login — Native Google login plugin