Turn field notes into an online, interactive species-occurrence map in minutes.
Everything runs on a free static site (GitHub Pages) — no server, no database.
template/
A low-infrastructure method for small biodiversity teams (labs, NGOs, classes) to publish species observations as an interactive web map. The app reads four plain-text files at load time:
data_species.txt
– species list and legend infodata_mappoints.txt
– occurrence records (one record per line)data_language.txt
– UI labels (e.g., Indonesian + English)data_setting.txt
– map defaults (zoom, theme, basemap, etc.)You can edit all four files with any text editor or export them from spreadsheets via the built-in converters. To make something like this:
Its also come with detail, if you click on one point to pop up detail for single observation:
Its quite easy to follow, you just edited (or add) datas within four .txt files and its finish, just like that. You can put it in github pages (for free) or in your hosting without more resource (no need for databases) or you can also run in in your local server.
N 01°28.717'
)[id]
and [en]
blocks in data_language.txt
)app/
index.html
assets/
css/styles.css
js/app.js
data/
data_species.txt
data_mappoints.txt
data_language.txt
data_setting.txt
images/ # species photos/icons referenced from data_species.txt
docs/ # how-to guide (served on Pages)
template/ # blank starter you can copy
tools/
csv-to-txt/ # CSV converter (browser-based)
xlsx-to-txt/ # XLSX converter (browser-based)
app/data/data_species.txt
name | color | image
name
: scientific or common name shown in legendcolor
: HEX color (e.g., #377eb8
)image
: relative path in app/images/
(optional)Example
Perkutut Jawa (Geopelia striata) | #377eb8 | images/PerkututJawa.jpg
app/data/data_mappoints.txt
date | time | species | count | district | coord | habitat | location | activity
date
: YYYY-MM-DD
(recommended) or common local formatstime
: HH:MM
(24h) or H:MM AM/PM
species
: must match a name
in data_species.txt
coord
: -1.481, 124.846
or N 01°28.717' E 124°53.518'
|
inside text are auto-replaced with /
by the convertersExample
2025-08-21 | 06:15 | Perkutut Jawa (Geopelia striata) | 2 | Sario | -1.481, 124.846 | Pekarangan | Pohon ketapang depan rumah | Menyanyi
app/data/data_language.txt
INI-style language blocks + key=value
lines:
[id]
appTitle=Informasi Sebaran Burung di Kota Manado
legendTitle=Spesies
details.date=Tanggal
...
[en]
appTitle=Birds Distribution Information in Manado
legendTitle=Species
details.date=Date
...
app/data/data_setting.txt
scale = 12 # initial zoom (city ~12, neighborhood ~15)
theme = light # light | dark
language = local # local=id, translate=en
mapType = default # default | satellite | terrain
showImages = true # true/false | 1/0
showRoad = 1 # 0=show labels/roads, 1=hide labels
Full details and screenshots: see Docs.
template/
.data_*.txt
files with your species and points.app/index.html
locally (or publish on Pages).data_mappoints.txt
into app/data/
.main
, Folder: / (root)
https://sanriomisintaro.github.io/biodiversity-webmap-template/
If you use this template in a publication or report, please cite the repository and (if available) the archived release DOI. (not ready yet to cite)
If needed, generalize or mask coordinates before publishing (e.g., round to 0.01° or remove precise sites). Please never publish the exact locations of sensitive taxa. We mean it, especially for endangered and protected taxa.
species
values in data_mappoints.txt
must match name
in data_species.txt
.images/Jalak.jpg
) and filename case.key = value
formatting (no extra characters).# in the repo root
python -m http.server 8000
# then open http://localhost:8000/app/
Built with lightweight web tech (vanilla HTML/CSS/JS). Map tiles from OpenStreetMap / imagery providers as configured in the app.