Aplikasi berbagi lokasi secara real-time. Pengguna dapat membagikan lokasi GPS mereka ke dalam sebuah group, dan pengguna lain yang memantau group tersebut dapat melihat posisi mereka di peta secara langsung.
shareliveloc/
├── shareliveloc-api/ # Backend REST API + WebSocket (Go)
├── shareliveloc-mobile/ # Aplikasi mobile (Flutter)
├── docker-compose.yml # PostgreSQL + API container
└── README.md
| Komponen | Teknologi |
|---|---|
| Backend | Go, Gin, GORM, gorilla/websocket |
| Database | PostgreSQL 16 |
| Mobile | Flutter, flutter_map (OpenStreetMap), Geolocator |
| Real-time | WebSocket |
| Dev tools | Air (hot-reload), Docker Compose |
- Go >= 1.21
- Flutter >= 3.x
- Docker & Docker Compose (untuk PostgreSQL, bisa di WSL)
- Air (opsional, untuk hot-reload dev) -
go install github.com/air-verse/air@latest
docker compose up -d postgresDevelopment (dengan hot-reload):
cd shareliveloc-api
airAtau tanpa Air:
cd shareliveloc-api
go run main.goAtau via Docker (API + PostgreSQL):
docker compose up -dAPI berjalan di http://localhost:8080
cd shareliveloc-mobile
flutter pub get
flutter runKonfigurasi API URL di lib/config.dart:
class AppConfig {
static const String baseUrl = 'http://<IP_ANDA>:8080';
static const String wsUrl = 'ws://<IP_ANDA>:8080';
}- Android emulator ke localhost:
http://10.0.2.2:8080 - Device fisik: gunakan IP lokal komputer (contoh:
http://192.168.x.x:8080)
| Variable | Default | Keterangan |
|---|---|---|
DB_HOST |
localhost | Host PostgreSQL |
DB_PORT |
5432 | Port PostgreSQL |
DB_USER |
shareliveloc | Username database |
DB_PASSWORD |
shareliveloc | Password database |
DB_NAME |
shareliveloc | Nama database |
| Method | Endpoint | Keterangan |
|---|---|---|
POST |
/api/groups |
Buat group baru {"name": "..."} |
GET |
/api/groups |
List groups. Query: ?search=xxx&active_only=true |
GET |
/api/groups/:id |
Detail group |
- Jika total group <= 5, langsung tampilkan semua (tidak perlu search)
- Jika > 5, parameter
searchminimal 3 karakter active_only=truehanya menampilkan group yang punya share aktif
| Method | Endpoint | Keterangan |
|---|---|---|
POST |
/api/shares |
Mulai berbagi lokasi |
PUT |
/api/shares/:id/location |
Update koordinat GPS |
PUT |
/api/shares/:id/stop |
Berhenti berbagi |
GET |
/api/shares?group_id=x |
List share aktif per group |
POST /api/shares body:
{
"name": "Bus Transjakarta 1",
"icon": "bus",
"category": "Transportasi Umum",
"group_name": "Nama Group",
"duration_hours": 2
}icon:bus,car,personcategory:Transportasi Umum,Lainnyaduration_hours: 1-8 jam, atau0untuk manual (tanpa batas waktu)- Group otomatis dibuat jika belum ada
| Endpoint | Keterangan |
|---|---|
WS /ws/location/:group_id |
Real-time location updates per group |
Message format:
{
"share_id": 1,
"name": "Bus Transjakarta 1",
"icon": "bus",
"latitude": -6.2088,
"longitude": 106.8456,
"is_active": true,
"updated_at": "2026-04-14T10:00:00Z"
}is_active: falsedikirim saat share dihentikan atau expired (client harus hapus marker)
Auto-migrate saat startup: tabel dan kolom baru otomatis ditambahkan, kolom yang tidak ada di struct otomatis dihapus.
shareliveloc-api/
├── main.go # Entry point, router setup, port :8080
├── models/
│ └── models.go # GORM models, DB init, auto-migrate
├── handlers/
│ ├── group.go # Handler CRUD groups
│ ├── share.go # Handler shares + location update
│ └── websocket.go # WebSocket hub + broadcast
├── Dockerfile # Multi-stage build
├── .air.toml # Air hot-reload config
└── .env # Default environment variables
- Dashboard: Peta OpenStreetMap dengan marker real-time per group
- Filter group (autocomplete jika <= 5, search 3 huruf jika > 5)
- Hanya tampilkan group yang punya share aktif
- Marker emoji: bus, mobil, orang
- Tombol center ke lokasi sendiri
- Update posisi real-time via WebSocket
- Share: Form untuk mulai berbagi lokasi
- Input: Nama Shareloc, Icon, Kategori, Nama Group (autocomplete + free text), Durasi
- Durasi: Manual (tanpa batas) atau 1-8 jam
- Countdown timer saat sharing aktif
- GPS tracking di background (foreground service) - tetap jalan walau app di-minimize
- Notifikasi persistent saat berbagi aktif
- Session tersimpan - buka ulang app tetap menampilkan status sharing
- Tombol "Berhenti Berbagi" untuk stop manual
ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION- GPSACCESS_BACKGROUND_LOCATION- GPS di backgroundFOREGROUND_SERVICE/FOREGROUND_SERVICE_LOCATION- Background serviceINTERNET- Koneksi ke APIWAKE_LOCK/RECEIVE_BOOT_COMPLETED- Keep service alive
shareliveloc-mobile/lib/
├── main.dart # App entry, bottom navigation
├── config.dart # API base URL
├── models/
│ ├── group.dart # Model Group
│ └── share.dart # Model ShareLocation
├── services/
│ ├── api_service.dart # HTTP calls ke API
│ ├── location_service.dart # GPS tracking + background service + session
│ └── websocket_service.dart # WebSocket client
├── screens/
│ ├── dashboard_screen.dart # Peta + filter group
│ └── share_screen.dart # Form share + status + stop
└── widgets/
├── group_search_field.dart # Autocomplete group input
└── map_widget.dart # flutter_map + markers
com.ombapit.shareliveloc