Find any grave. Preserve every memory.
GraveMap is an open-source platform for digitally mapping and preserving cemeteries. Every cemetery, every grave, and every empty plot β searchable and locatable by anyone, forever.
Most cemeteries around the world still rely on:
- π Paper registers and old notebooks
- π§ The memory of elderly caretakers
- ποΈ Word-of-mouth knowledge passed down generations
When someone asks "Where is my grandfather buried?" the answer is often "Ask the old caretaker." Years later, nobody knows. Many graves disappear entirely. Cemeteries fill up, but nobody can find the empty plots.
GraveMap solves this.
| Feature | Description |
|---|---|
| Interactive satellite map | Full-screen map with cemetery boundaries and color-coded grave plots |
| Grave search | Search by name, father's name, cemetery, city, or gender |
| Grave detail | View name, dates, biography, section/row/plot, photo, and status |
| Shareable links | Every grave has a unique URL (#grave-ID) β share on WhatsApp instantly |
| QR code | Auto-generated QR code on every grave detail page |
| Navigate to grave | One tap opens Google Maps with driving directions |
| Print grave card | Professional printable record with QR code and all details |
| Cemetery directory | Browse all registered cemeteries with occupancy stats |
| Request a cemetery | Submit a request for a new cemetery to be added |
| Report corrections | Flag wrong grave information for admin review |
| Feature | Description |
|---|---|
| Cemetery wizard | 3-step wizard: Info β Pin location β Draw boundary polygon |
| Grave wizard | 3-step wizard: Person info β Select cemetery β Draw grave rectangle |
| Generate Grave Grid | Auto-fill a cemetery with evenly-spaced grave plots from boundary |
| CSV bulk import | Upload a spreadsheet to register hundreds of graves at once |
| Photo via URL | Link an external photo (Imgur, Google Photos, etc.) to any grave |
| Dashboard | Stats tiles: total graves, cemeteries, occupied, available, reserved, pending |
| Request management | Review and approve/reject cemetery + correction requests |
| Quick status update | Mark any grave as Occupied / Reserved / Empty from detail view |
| Satellite/street toggle | Switch between satellite imagery and street map |
- HTML5, CSS3, JavaScript (Vanilla) β no framework, no build step
- Leaflet.js β interactive maps
- Leaflet Geoman β polygon and rectangle drawing tools
- Esri World Imagery β satellite tile layer
- qrcodejs β QR code generation
- Outfit β Google Fonts typography
- Firebase Authentication β Google Sign-In (admins only)
- Firebase Realtime Database β all data stored here
- GitHub Pages β static hosting
π‘ Zero server cost. Everything runs on Firebase free tier + GitHub Pages. No backend server, no Docker, no VPS.
Firebase Realtime Database
β
βββ cemeteries/
β βββ {id}/
β βββ name, city, province, district, country
β βββ address, description
β βββ centerLat, centerLng
β βββ boundary β JSON polygon coordinates
β
βββ graves/
β βββ {id}/
β βββ cemeteryId
β βββ name, fatherName, gender
β βββ dob, deathDate, burialDate, age
β βββ section, row, plot
β βββ bio
β βββ status β "occupied" | "empty" | "reserved"
β βββ photoUrl β external image URL (no storage cost)
β βββ polygon β JSON rectangle coordinates
β βββ lat, lng β grave center coordinates
β βββ relatives/ β [NEW] Bidirectional family tree relations
β β βββ {relativeGraveId}
β β βββ relation β "spouse" | "parent" | "child" | "sibling" | "other"
β βββ createdAt
β
βββ requests/
β βββ {id}/
β βββ type β "new-cemetery" | "correction"
β βββ resolved β boolean
β βββ ...fields
β
βββ admins/ β [NEW] Managed list of Google UIDs
β βββ {uid}/
β βββ email
β βββ name
β βββ addedAt
β
βββ fcmTokens/ β [NEW] Registered FCM tokens for admins
βββ {uid}/
βββ token
βββ email
βββ updatedAt
# Clone the repo
git clone https://github.com/shakeel143/GraveMap.git
cd GraveMap
# Serve with Python (no install needed)
python -m http.server 8000
# Open in browser
# http://localhost:8000No
npm install, no build step. Just open and run.
- Create a project at console.firebase.google.com.
- Enable Realtime Database and Authentication β Google provider.
- Replace the
firebaseConfigobject inindex.htmlwith your own credentials. - Set the Realtime Database Rules to the following configuration (necessary for PWA, FCM, and multi-admin bootstrapping):
{
"rules": {
"cemeteries": {
".read": true,
".write": "auth != null"
},
"graves": {
".read": true,
".write": "auth != null"
},
"deceased": {
".read": true,
".write": "auth != null"
},
"requests": {
".read": "auth != null",
".write": true
},
"notifications": {
".read": "auth != null",
".write": "auth != null"
},
"admins": {
".read": "auth != null",
"$uid": {
".write": "auth != null && (!root.child('admins').exists() || root.child('admins').child(auth.uid).exists())"
}
},
"fcmTokens": {
"$uid": {
".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"
}
}
}
}GraveMap/
βββ index.html # Single-page app β HTML, head meta scripts, and SW init
βββ css/
β βββ style.css # Main styling + RTL direction & family tree styles
βββ js/
β βββ app.js # Main logic (Leaflet, wizards, language translation, family links, charts, FCM)
βββ sw.js # PWA Service Worker (App shell caching + offline map strategies)
βββ manifest.json # Web App Manifest for mobile installation/PWA compliance
βββ firebase-messaging-sw.js # FCM Service Worker for handling background notifications
βββ favicon.png # Main app icon
βββ og-cover.png # Cover image for social share previews
βββ README.md
- Google Authentication (admin only)
- Firebase Realtime Database
- Leaflet.js interactive map
- Public map view with cemetery boundaries
- Basic search
- 3-step Cemetery creation wizard (info β location β draw boundary)
- 3-step Grave registration wizard (person β cemetery β draw plot)
- Color-coded grave status: π’ Available Β· π΄ Occupied Β· π‘ Reserved
- Satellite imagery as default map layer
- Satellite / Street map toggle
- Cemetery request workflow (public β admin review)
- Correction report workflow
- Admin dashboard with statistics tiles
- Generate Grave Grid (auto-fill boundary with plots)
- Approve / reject requests
- QR code on every grave
- Shareable grave URLs (
#grave-ID) - π Copy link button
- π¨οΈ Print grave card (with QR code)
- π§ Google Maps navigation
- π₯ CSV bulk import with preview table
- πΌοΈ External photo URL (no storage cost)
- OG/Twitter meta tags for social sharing previews
- Escape key closes modals
- Full mobile responsive layout
- Multi-admin management (add/remove admin UIDs from dashboard)
- Urdu / RTL language support
- PWA / offline mode (service worker + manifest.json)
- Family tree linking between related graves (bidirectional, with admin search UI)
- FCM push notifications for new requests (foreground + background, VAPID-ready)
- Occupancy analytics charts (donut + per-cemetery stacked bar chart)
- Dark topbar with glassmorphism backdrop filter
- Map-first layout β the map is always full-screen behind all panels
- Floating panels β left sidebar + right tools float over the map
- Modals as wizards β multi-step forms with clear progress indicators
- Color system:
#2ECC8AAvailable Β·#E05A5AOccupied Β·#F0B429Reserved - Mobile β panels collapse to bottom sheets, modals slide up from bottom
Download the template from Admin β Graves β π₯ Import CSV, or use this column layout:
name,fatherName,gender,dob,deathDate,burialDate,age,section,row,plot,bio,status,photoUrl
Ahmed Ali,Muhammad Ali,male,1945-03-12,2020-11-05,2020-11-06,75,A,3,12,A beloved father,occupied,| Column | Format | Required |
|---|---|---|
name |
Full name | β |
fatherName |
Father's full name | β |
gender |
male or female |
β |
dob |
YYYY-MM-DD |
β |
deathDate |
YYYY-MM-DD |
β |
burialDate |
YYYY-MM-DD |
β |
age |
Number | β |
section, row, plot |
Alphanumeric | β |
bio |
Free text | β |
status |
occupied, empty, or reserved |
β |
photoUrl |
Public image URL | β |
Imported graves are fully searchable immediately. They appear on the map once a polygon is drawn for them.
Pull requests are welcome. For major changes, please open an issue first.
- Fork the repo
- Create your branch:
git checkout -b feature/my-feature - Commit:
git commit -m 'feat: add my feature' - Push:
git push origin feature/my-feature - Open a Pull Request
MIT Β© Shakeel