👻 Ghost.Reviews — Paranormal Investigation Companion
1-Line Pitch
Ghost.Reviews is an AI-powered paranormal companion app that maps real-world haunted locations, uses LLMs to verify community horror stories, and leverages text-to-speech to narrate local legends as users explore.
📽️ Demo & Submission Link
- Google Drive Link (Apk & Demo Video):
[Insert Your Google Drive Link Here](e.g., https://drive.google.com/file/d/1DGI1tqLbMtv-qkUNufuyfcguKpo25WPO/view?usp=sharing)
🧭 Inspiration
Most navigation and map apps are designed to help you find the nearest coffee shop, gas station, or hotel. But for urban explorers, folklore enthusiasts, and paranormal hunters, there was no dedicated portal to map the eerie, the historic, and the unexplained.
We wanted to build Ghost.Reviews to bridge the gap between local history and local legend. Our goal was to create a premium, gamified mobile experience that brings creepy local history to life, verifies urban legends using advanced AI, and wraps the exploration in an immersive, spine-chilling audio experience.
🔮 What it does
Ghost.Reviews is a dark-themed Android app that transforms physical exploration into a thrilling investigation game:
- Paranormal Radar (Interactive Map): Scan your surroundings using a fully offline-capable OpenStreetMap (
osmdroid). It queries historical landmarks, cemeteries, and haunted points of interest around you using the Overpass API. - Horror Verification (Groq Llama 3): When users submit local stories or reviews, a Llama 3 model validates the text to filter out non-paranormal spam, formats the findings, and dynamically generates a "Horror Score" and an atmospheric "Vibe Verdict" for that spot.
- Spectral Narrations (ElevenLabs TTS): Brings haunted history to life by generating realistic, spine-chilling voice readouts of location legends, utilizing
ExoPlayerwith a local caching mechanism so you can listen to stories offline during spooky excursions. - Reddit Horror Integration: Pulls the internet's best spine-chilling stories from subreddits like
r/nosleepandr/GhostStories, caching them locally for offline reading, complete with ElevenLabs narration support and custom Chrome Tabs redirection. - Spooky Share Cards: Generates programmatically drawn custom social media share cards on a canvas, showing your location, verified horror score, and the site's unique "Vibe" to let you share your brave encounters with friends.
- Badge Vault: Tracks your progress and unlocks thematic badges as you visit places with higher horror scores and write verified reports.
🛠️ How we built it
- Framework & Architecture: Built natively in Kotlin using MVVM (Model-View-ViewModel) and Clean Architecture principles to keep components modular and highly testable.
- AI Stack:
- Groq API (Llama 3): Used for fast, structured JSON responses to classify and score user stories and Wikipedia snippets.
- ElevenLabs API: Used to render atmospheric text-to-speech narration with a spooky, cinematic voice.
- Geospatial & Mapping: Powered by
osmdroidand Wikipedia's coordinate API to plot real haunted places and cemeteries without relying on expensive, paid mapping APIs. - Backend & Data Cache:
- Room Database: Handles fast caching for offline Reddit feeds and local logs.
- Firebase Firestore & Storage: Syncs community places, custom review posts, and pictures globally in real-time.
- Dagger Hilt: Handles clean dependency injection across the codebase.
⚠️ Challenges we ran into
- Structured LLM Outputs: Getting generative AI models to consistently output pure JSON without conversational filler or markdown wrappers is a classic challenge. We solved this by pairing Groq's JSON mode constraints with robust local exception handling and mock fallbacks to prevent user-facing crashes.
- Dynamic Canvas Rendering: Generating share card images programmatically in Android requires manual math. We utilized
StaticLayout.Builderto handle multi-line text wrapping and precise alignment on a customCanvasbitmap across different screen densities. - Efficient API Budgeting: Text-to-speech APIs can be expensive to run. To prevent duplicate requests, we designed a smart caching mechanism that hashes place descriptions and saves generated audio files locally using
ExoPlayer, ensuring we only query ElevenLabs when new content is added.
🎉 Accomplishments that we're proud of
- Designing a premium, highly atmospheric dark UI that uses custom Material 3 palettes, Lottie animations, and micro-interactions to create a cohesive, spooky vibe.
- Merging Overpass OpenStreetMap data dynamically with real-time Firebase user reviews to show a unified, updated paranormal map without cluttering the interface.
- Creating a highly responsive audio player flow that respects Android's lifecycle and immediately halts playback when the app is backgrounded or closed, preventing memory leaks.
🧠 What we learned
- Kotlin Coroutines & Flow: Deepened our understanding of handling asynchronous API streams, audio downloads, and database updates smoothly without blocking the main UI thread.
- SPARQL & Overpass queries: Learned how to query public spatial databases for historical metadata using advanced geographic bounding boxes.
- Security & Env Management: The importance of securely hiding API tokens in
local.propertiesand using Gradle'sBuildConfigto inject credentials safely at build time.
🚀 What's next for Ghost.Reviews
- Augmented Reality (AR) Radar: Overplaying ghost markers or heatmaps directly onto the physical world using the camera viewfinder.
- Group Hunts: Creating multiplayer lobbies where groups of friends can join a room and explore a haunted coordinate together with shared voice channels.
- Push Notifications: Sending a subtle warning notification when a user walks near a landmark with a certified Horror Score above 85.
🔔 Notes for Judges / Troubleshooting
[!IMPORTANT] API Key Fallbacks & Sandbox Setup
For the full experience (including custom LLM horror scoring and realistic voice narrations), the app relies on Groq and ElevenLabs API keys configured in
local.properties.If you run the app and notice a mock description/score, don't worry! We have built-in local fallbacks so that if keys are missing or api rate-limits are reached, the app generates high-quality mock horror scores (60-98) and creepy narration presets to ensure you can still test the app's full flow without getting blocked by network errors.
*If you encounter any build issues, database lockups, or configuration errors while testing the APK:*https://drive.google.com/file/d/1DGI1tqLbMtv-qkUNufuyfcguKpo25WPO/view?usp=sharing Please contact me directly via email at
[Your Email Address Here]—I am active, on standby, and happy to help you get the environment up and running immediately!
Built With
- kotlin

Log in or sign up for Devpost to join the conversation.