pgx
PGX — Lightweight Postgres for AI agents. Written in Rust. Thousands of isolated databases in one runtime. 🐘
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Interactive web visualizer for Google Location History Timeline.json files.
Built with React + Vite + Leaflet. MapLibre GlobeView masih dalam
pengembangan — bisa diakses opt-in di /globe walaupun overlay belum
konsisten muncul di production, tetap balik ke Leaflet di /.
Auto-deploys to Hostinger via GitHub Actions.查看完整 README ↗Interactive web visualizer for Google Location History Timeline.json files.
Built with React + Vite + Leaflet. MapLibre GlobeView masih dalam
pengembangan — bisa diakses opt-in di /globe walaupun overlay belum
konsisten muncul di production, tetap balik ke Leaflet di /.
Auto-deploys to Hostinger via GitHub Actions.
Live: https://rebornian48.my.id/map-visualizer/
Timeline.json in
from the header when you're ready.L.divIcon dengan SVG inline dari src/mapIcons.js.
Legend swatch juga ikut simbol yang bersangkutan supaya konsisten.SECTIONS di
src/components/LayersControl.jsx)
otomatis mendarat di kategori yang benar.cdn.opentransum.randspace0.com dan di-cache per
sesi. Lihat bagian Data attribution di bawah untuk lisensi.BMKG · Gempa, BMKG · Peringatan Dini, BMKG · Cuaca di layer control):
data.bmkg.go.id) —
marker lingkaran berukuran magnitude, warna sesuai kedalaman
(dangkal merah / menengah oranye / dalam biru). Popup menampilkan
detail lengkap plus gambar shakemap dari static.bmkg.go.id bila
tersedia.www.bmkg.go.id/alerts/nowcast) — RSS
feed berisi daftar alert aktif; tiap alert diambil sebagai CAP 1.2
XML lalu direnderer sebagai polygon berwarna severity (Minor→
Extreme). Popup menampilkan headline, deskripsi, dan tautan
infografis BMKG.api.bmkg.go.id/publik/ prakiraan-cuaca) — 11 ibukota provinsi ter-hardcode dengan kode
adm4. Marker menampilkan emoji cuaca + suhu; popup menampilkan
kelembapan, angin, jarak pandang, dan jam prakiraan lokal.?h=awc&p=api/data/isigmet&q=format=json).markersGunungApi) di halaman utama; overlay fetch
halaman via proxy PHP lalu ekstrak array-nya di klien. Marker
warna sesuai level (hijau/kuning/oranye/merah), ukuran mengikuti
level agar yang berstatus tinggi lebih menonjol. Popup menampilkan
nama, provinsi, kabupaten/kota, elevasi, kode MAGMA, dan nomor
VONA jika ada.webservices.volcano.si.edu/geoserver/GVP-VOTW, feature type
Smithsonian_VOTW_Holocene_Volcanoes). Marker warna sesuai
aktivitas terakhir (aktif ≥ 1900 merah, historis 1500–1899 oranye,
holocene pra-1500 coklat), ukuran skala elevasi. Popup menampilkan
nama, negara, wilayah/subwilayah, tipe, landform, elevasi, batuan
utama, setting tektonik, tahun erupsi terakhir, bukti, foto GVP,
ringkasan geologis, dan deep-link ke halaman volcano.si.edu.Aeronautika · OpenAIP di bawah
Transportasi dengan dua toggle:
public/openaip/{airports,airspaces}.json
(~125 KB total), refresh manual dengan
OPENAIP_KEY=… node scripts/refresh-openaip.mjs tiap AIRAC cycle.
OpenAIP di-populate komunitas — coverage Indonesia terbatas (CTR/TMA
di luar Papua, PRD areas, navaid, dan waypoint belum terisi).Keuskupan Katolik di grup Gereja Katolik di bawah Wilayah
(di bawah radio boundary Provinsi/Kab/Kota). Choropleth 514
kabupaten/kota Indonesia diwarnai per provinsi gerejawi (10
hue: Medan, Palembang, Jakarta, Semarang, Ende, Kupang, Pontianak,
Samarinda, Makassar, Merauke) — supaya struktur metropolit +
sufragan terbaca sekali pandang. Cakupan 38 keuskupan teritorial
(Ordinariat Militer tidak masuk peta karena tidak punya batas
geografis). Popup menampilkan kab/kota + provinsi sipil, nama
keuskupan, status (Metropolit/Sufragan), tahun berdiri, uskup
diosesan aktif + tanggal penunjukan (atau Lowong), dan katedral.
Sumber: Daftar keuskupan di Indonesia
python scripts/refresh-keuskupan.py (roster
di-embed di script, bukan hasil scrape, karena Wikipedia
menuliskan cakupan wilayah dalam prosa).Insiden · MBG di
bawah Bencana Alam. Choropleth kabupaten/kota untuk dugaan kasus
keracunan program Makan Bergizi Gratis: polygon batas administrasi
di-arsir warm ramp (peach ≤50 → maroon >2.000) berdasar total
korban di kabupaten itu. Sumber tabel: Wikipedia bahasa Indonesia
Daftar kasus keracunan massal makan siang gratis
section Makan Bergizi Gratis, di-parse dengan handling rowspan
(jumlah korban tidak dobel-hitung) lewat MediaWiki API, matched
ke polygon kabkota.json, disimplify RDP ~500m jadi ~650 KB. Popup
menampilkan kabupaten, jumlah kejadian, total korban, dan tiga
insiden terbesar. Dashboard interaktif terpisah di
/map-visualizer/keracunan-mbg
— timeline bulanan + breakdown provinsi + top 10, dengan
cross-filter dua arah. Refresh manual dengan
python scripts/refresh-mbg.py (hasilkan dua file:
public/mbg/incidents.json untuk dashboard,
public/mbg/incidents.geojson untuk peta).Infrastruktur · BIG di layer control (icon menara), berisi tiga
grup toggle independen yang dijaring dari Satupeta MapServer
PUBLIK/SARANA_PRASARANA (edisi 2024-07):
geometry.type supaya
file yang sama bisa mengangkut point + line + polygon); palet
diatur per kategori supaya overlay saling tumpuk tetap terbaca di
light & dark basemap. Snapshot di-vendor ke public/sarpras/*.json
(~6,9 MB total). Refresh manual: python scripts/refresh-sarpras.py all — stdlib only, paginasi resultOffset, per-layer field
whitelist + maxAllowableOffset untuk polyline/polygon supaya
bundle tetap manageable.SDA & Lingkungan · BIG di layer control (icon daun), berisi lima
grup toggle dari MapServer PUBLIK/SUMBER_DAYA_ALAM_DAN_LINGKUNGAN
(edisi 2024-08). Sublayer bertema bencana ditaruh di panel
Bencana Alam (grup Bencana · SDA) supaya konsisten dengan
keluarga BMKG/Vulkano/Tektonik yang sudah ada; sisanya di panel
SDA & Lingkungan.
categorize per slug. Snapshot di-vendor ke public/sda/*.json (~263 MB total). Layer
raksasa (rawan-banjir 344k, gerakan-tanah 265k, karhutla 176k,
mangrove 240k) dikompres dengan maxAllowableOffset agresif
(0.005–0.01°, ~500 m–1.1 km) + resultRecordCount 200 supaya
respons tidak putus. Sebagian di-cap-out oleh soft-limit server
Esri saat paginasi. Tiga sublayer di-drop karena server-side broken
atau tanpa batas: layer 7 (DAS) & 35 (Konservasi Perairan) return
HTTP 400 untuk semua query; layer 50 (DDDTLH) paginasi tanpa akhir
melewati 408k fitur (kena 100 MB per-file cap GitHub). Refresh
manual: python scripts/refresh-sda.py all (~5 jam).Tektonik di layer control dengan
tiga toggle: batas lempeng (garis; zona subduksi ditandai merah
tebal), poligon lempeng (54 lempeng dengan warna stabil per kode),
dan orogen (13 zona pegunungan). GeoJSON di-bundle di
public/tectonicplates/ (~600 KB total) dari
fraxen/tectonicplates
— model PB2002 Bird (2003).Month Year · N km cumulative distance), a growing
magenta trail, and a glowing pin at the head, with a 10-second
trajectory hold at the end. Falls back to WebM only when the browser
cannot encode MP4 (Firefox).i navigasi ke
/map-visualizer/info (bukan modal). Diawali dengan ringkasan
isi peta — card per kategori tombol (Basemap / Wilayah /
Transportasi / Cuaca / Bencana Alam) yang mendaftar semua overlay
yang tersedia — lalu bagian detail per sumber (endpoint, atribusi,
lisensi, penyangkalan). URL shareable; .htaccess SPA fallback
bikin deep link works di prod, dan Vite dev server juga SPA
fallback by default.git clone https://github.com/Rebornian48/map-visualizer.git
cd map-visualizer
npm install
npm run dev
Open http://localhost:5173, then click + Add Timeline JSON in the
header and pick your Timeline.json.
Timeline.json.The workflow at .github/workflows/deploy.yml
builds the app and uploads dist/ to Hostinger via FTP on every push to
main.
Repository secrets required (Settings → Secrets and variables → Actions):
| Secret Name | Value |
|---|---|
FTP_HOST | e.g. ftp.yourdomain.com |
FTP_USER | e.g. u123456789 |
FTP_PASS | Your FTP password |
The workflow currently deploys to
/domains/rebornian48.my.id/public_html/map-visualizer/ — change
server-dir in the workflow if you host elsewhere.
Batas administrasi (empat level darat + empat zona laut) di-vendor
sebagai snapshot GeoJSON di public/boundaries/,
sumber BIG (Badan Informasi Geospasial) edisi Juni 2026 via
ArcGIS REST publik BIG di
geoservices.big.go.id/rbi/rest/services/BATASWILAYAH/.
Darat (radio, mutually exclusive di panel Wilayah · grup Boundary):
provinsi.json — 38 provinsi (dissolve kab/kota per WADMPR,
RDP ~2,2 km, drop islet slivers < 6 km², drop interior-ring holes)kabkota.json — 541 kabupaten/kota (RDP ~555 m)kecamatan.json — 7.432 kecamatan (RDP ~333 m)desa.json — 84.503 kelurahan/desa (server_offset 0,005° +
client RDP 0,002°; beberapa desa urban <200 m collapse ke titik)Laut (checkbox, boleh overlay bersama · grup Batas Laut):
laut/teritorial.json — Laut Teritorial (12 nm) · 21 segmenlaut/zona-tambahan.json — Zona Tambahan (24 nm) · 10 segmenlaut/landas-kontinen.json — Landas Kontinen · 31 segmenlaut/zee.json — ZEE (200 nm) · 24 segmenRefresh manual — jalankan tiap kali BIG rilis edisi baru atau ada pemekaran wilayah:
python scripts/refresh-boundaries.py # kabkota + provinsi (~1 menit)
python scripts/refresh-boundaries.py kecamatan # ~2 menit
python scripts/refresh-boundaries.py desa # ~15 menit (85 halaman × 1.000 fitur)
python scripts/refresh-boundaries.py all # semua level darat
python scripts/refresh-laut.py # 4 zona maritim (~5 detik)
Script paginasi (200-1000 fitur per request; server BIG 500 di atas
itu untuk desa/kecamatan), minta simplifikasi server-side
maxAllowableOffset, lalu simplify/clean di klien dengan shapely.
Tidak butuh API key.
Data batas wilayah administrasi Provinsi & Kabupaten/Kota adalah milik Badan Informasi Geospasial (BIG), edisi Juni 2026, diambil dari service ArcGIS REST publik mereka:
https://geoservices.big.go.id/rbi/rest/services/BATASWILAYAH/BATAS_KABKOTA_AR/MapServer/0
Snapshot GeoJSON di-vendor ke public/boundaries/{provinsi,kabkota}.json
supaya build self-contained. Data disajikan as-is; untuk keperluan
resmi rujuk ke portal BIG.
Overlay bus & rel diambil dari Opentransum (https://opentransum.randspace0.com/open-data).
https://cdn.opentransum.randspace0.com/transport-data/
— transsemarang.json, metrojabartrans.json, buslistrikmedan.json,
transkotaradja.json, transpakuan.json, mitradarat.json,
file_gtfs.zip (Transjakarta GTFS), krl_lines.geojson,
lrt_mrt_lines.geojson, rails.kml.CDN Opentransum hanya mengirim Access-Control-Allow-Origin: https://opentransum.randspace0.com, jadi fetch langsung dari
rebornian48.my.id diblok CORS. Karena kami tidak mengelola CDN
tersebut, build produksi mem-proxi via satu file PHP di Hostinger.
Setup proxy (sekali saja):
public_html/otsum/proxy.php di Hostinger (File Manager atau FTP).curl -sI "https://rebornian48.my.id/otsum/proxy.php?f=transsemarang.json" | grep -i access-control
Harus muncul access-control-allow-origin: *.Proxy meng-whitelist 10 nama file yang dipakai app, forward ke CDN Opentransum, dan menempelkan header CORS. Cache HTTP 1 jam di browser.
Dev lokal tidak melewati proxy — vite.config.js memproxikan
/otsum-cdn/* langsung ke CDN dari sisi Node server.
Ketiga host BMKG (data.bmkg.go.id, www.bmkg.go.id, api.bmkg.go.id)
tidak mengirim header CORS, jadi build produksi memakai satu file PHP
gabungan di Hostinger untuk merutekan ketiganya.
Setup proxy BMKG (sekali saja):
public_html/bmkg/proxy.php di Hostinger.curl -sI "https://rebornian48.my.id/bmkg/proxy.php?h=data&p=DataMKG/TEWS/autogempa.json" | grep -i access-control
Harus muncul access-control-allow-origin: *.Proxy meng-whitelist empat host (via ?h=data|www|api|magma) dan
mem-validasi path dengan regex (untuk CAP alert dengan ID dinamis).
Query string ?adm4=… diteruskan untuk endpoint cuaca. Host magma
menunjuk ke magma.esdm.go.id — halaman utama-nya menyisipkan roster
gunung api live sebagai variabel JS inline yang di-ekstrak di klien
oleh overlay MAGMA.
Dev lokal tidak melewati proxy PHP — vite.config.js memproxikan
/bmkg-cdn/*, /bmkg-www/*, /bmkg-api/*, dan /magma-web/*
langsung ke masing-masing host.
Dataset gunung api Holocene diambil langsung dari Smithsonian Global Volcanism Program, via WFS resmi mereka:
https://webservices.volcano.si.edu/geoserver/GVP-VOTW/ows?service=WFS&version=2.0.0&request=GetFeature&typeName=GVP-VOTW:Smithsonian_VOTW_Holocene_Volcanoes&outputFormat=application/json
Snapshot GeoJSON (~2,4 MB, 1.214 fitur) di-vendor ke
public/veins/volcanoes.json — refresh manual dengan curl di atas
untuk pick-up erupsi baru.
Sitasi wajib pada tampilan yang menampilkannya:
Global Volcanism Program, 2026. Volcanoes of the World (v. 5.2.6). Smithsonian Institution.
Data batas lempeng, poligon lempeng, dan orogen diambil dari repo fraxen/tectonicplates, turunan langsung dari model PB2002 Peter Bird:
Bird, P. (2003), An updated digital model of plate boundaries, Geochemistry Geophysics Geosystems, 4(3), 1027, doi:10.1029/2001GC000252.
File-nya di-vendor ke public/tectonicplates/{boundaries,plates,orogens}.json
supaya build self-contained (tidak fetch ke GitHub raw saat runtime).
Data bandara dan airspace polygon untuk Indonesia diambil dari
OpenAIP via Core REST API
(api.core.openaip.net) dengan filter ?country=ID. Snapshot
di-vendor ke public/openaip/{airports,airspaces}.json.
Refresh snapshot (perlu API key gratis dari openaip.net → profile → API Clients):
OPENAIP_KEY=your-key-here node scripts/refresh-openaip.mjs
Data OpenAIP CORS-friendly, tapi karena API key tidak boleh ke-expose di bundle publik, snapshot approach lebih aman daripada runtime fetch.
Data BMKG (gempa, peringatan dini cuaca, prakiraan cuaca) adalah milik Badan Meteorologi, Klimatologi, dan Geofisika. Sesuai ketentuan infoBMKG, wajib mencantumkan BMKG sebagai sumber pada aplikasi yang menampilkannya. Data disajikan as-is; untuk peringatan resmi dan tindakan lapangan, rujuk selalu ke bmkg.go.id.
npm run build
Upload the contents of dist/ to Hostinger's target folder via:
//globe
(init-race + line-width expression bug sudah diperbaiki; performa
layer padat dioptimalkan dengan data:url off-thread parse +
minzoom gate; PMTiles vector-tile support siap — lihat
Vector tile pipeline di bawah)pmtiles://…)Data berat (boundary desa 31 MB, mangrove 76 MB, dst.) di-pre-tile
sekali dengan tippecanoe → .pmtiles, lalu MapLibre cuma
memuat tile yang terlihat di viewport. Ini memangkas parse-time
dari detik ke instan.
Prasyarat (pilih salah satu):
brew install tippecanoe atau sudo apt install tippecanoesudo apt install tippecanoe
di dalam WSL) atau Docker Desktop (auto-pull
ghcr.io/felt/tippecanoe:latest)Build:
npm run tiles:list # lihat rencana build + status
npm run tiles:build # build semua yang belum ada
npm run tiles:build:boundaries # atau per-group
npm run tiles:build:sda
npm run tiles:build:sarpras
node scripts/build-pmtiles.mjs --only desa,mangrove --force # spesifik
Runner auto-detect (native → WSL → Docker). Paksa dengan
--runner docker. Output di public/tiles/<group>/<slug>.pmtiles —
jangan di-commit (regenerate on demand). Setelah tile terbangun,
switch entry di src/globe/layers.js dari
url: … ke pmtilesUrl: \${BASE}tiles//.pmtiles``;
GlobeView Path B (src/components/GlobeView.jsx:931)
otomatis akan pakai vector source.
See CHANGELOG.md for release history.
An example MP4 rendered from this tool — one user's Google Timeline covering March 2017 to August 2026, exported at 480×480, 24 fps, ~31.5 s (AV1 + AAC, ~1.6 MB).
| Time (s) | Date | Cumulative distance | Position / movement |
|---|---|---|---|
| 1 | Mar 2017 | 3,802 km | Yogyakarta (origin) |
| 2 | Feb 2018 | 10,352 km | Local loops around Yogyakarta–Bantul–Wates |
| 4 | Sep 2018 | 23,088 km | Dense activity across Yogyakarta |
| 6 | Apr 2019 | 36,458 km | Yogyakarta → Jakarta along the north-coast route |
| 8 | Aug 2019 | 52,422 km | Jabodetabek (Jakarta–Bogor–Bekasi) |
| 10 | Mar 2020 | 69,931 km | Jakarta ↔ Semarang corridor (pandemic era) |
| 12 | Jun 2021 | 85,293 km | Jakarta ↔ Yogyakarta via both north and south routes |
| 14 | Apr 2022 | 100,294 km | First Sumatra trip (toward Palembang / Jambi) |
| 16 | Nov 2022 | 117,564 km | Reach into Palembang; Bandung–Semarang corridor |
| 18 | Apr 2023 | 133,201 km | Kalimantan trip (Central Kalimantan) |
| 20 | Aug 2023 | 155,057 km | Full Java coverage: Jakarta ↔ Surabaya |
| 22 | Dec 2023 | 175,877 km | Jakarta–Semarang corridor |
| 24 | Jun 2024 | 197,650 km | Sulawesi trip (Makassar) |
| 26 | Oct 2024 | 220,772 km | Jakarta–Semarang again |
| 28 | Jul 2025 | 238,584 km | Jakarta–Semarang–Surabaya |
| 30 | May 2026 | 254,479 km | West + Central Java loop |
| 31 | Aug 2026 | 259,229 km | Final frame — a fan of trips across all of Indonesia, hubbed on Jakarta |
b0bb095 commit).google-timeline-visualizer by @mahlernim.
MIT