Benoit.jp.net's website source based on Material for MkDocs.
Find a file
Benoit 63ab591a2f Add humorous intro to Post Mortems index
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 19:22:14 +09:00
data Add prefecture coverage map to hiking and road trip indexes 2026-02-23 16:52:12 +09:00
docs Add humorous intro to Post Mortems index 2026-03-11 19:22:14 +09:00
includes Add Japanese Internet connectivity documentation page 2025-11-15 19:17:52 +09:00
.gitignore Add Mermaid diagram rendering to retro_build.py for Win98 IE compatibility 2026-02-03 20:48:21 +09:00
.python-version Migrate from MkDocs to Zensical 2025-11-15 19:39:25 +09:00
CLAUDE.md Update README and CLAUDE.md for prefecture map feature 2026-02-23 16:53:41 +09:00
fit_to_md.py Fix hike nav buttons: use float divs so markdown="1" renders correctly 2026-02-27 21:19:41 +09:00
LICENSE Update LICENCE to CC0 2021-02-20 15:41:24 +09:00
MERMAID_RENDERING.md Add Mermaid diagram rendering to retro_build.py for Win98 IE compatibility 2026-02-03 20:48:21 +09:00
prefecture_map.py Add Leaflet trace map to hiking index and GPX traces to road trip prefecture map 2026-02-27 21:02:59 +09:00
pyproject.toml Bump zensical to 0.0.24 2026-02-27 21:06:39 +09:00
README.md Update README and CLAUDE.md for prefecture map feature 2026-02-23 16:53:41 +09:00
retro_build.py Strip variation selectors (U+FE00-FE0F) in remove_emoji 2026-02-21 21:02:02 +09:00
RETRO_BUILD_SETUP.md Update retro docs: attribution, CC0, current feature state 2026-02-21 20:44:52 +09:00
RETRO_README.md Update retro docs: attribution, CC0, current feature state 2026-02-21 20:44:52 +09:00
roadtrip_to_md.py Add Leaflet trace map to hiking index and GPX traces to road trip prefecture map 2026-02-27 21:02:59 +09:00
zensical.toml Add Post Mortems section with bike crash incident 2026-03-11 19:20:13 +09:00

benoit.jp.net

Personal website at benoit.jp.net, built with Zensical (by the Material for MkDocs creators). Documents self-hosted services, technical how-to guides, hiking logs, road trip GPS logs, and personal content.

Development

# Build the site
uv run zensical build

# Serve locally with live reload (http://localhost:8000)
uv run zensical serve

# Serve and open browser automatically
uv run zensical serve --open

fit_to_md.py

100% vibe coded by Claude Code. 0% human.

Converts a Garmin .fit hiking activity file into a Markdown page for the Hiking section of the site.

uv run python fit_to_md.py <activity.fit> [--notes "..."] [--peaks "..."] [--tz OFFSET]

Arguments

Argument Default Description
fit_file Path to the Garmin .fit file
--notes (empty) Free-text notes about the hike
--peaks (auto) Comma-separated peak names, bypasses Overpass API lookup
--tz +09:00 Timezone offset for display (JST by default)

Output

File Description
docs/Hiking/YYYY-MM-DD.md Markdown page with stats table
docs/Hiking/YYYY-MM-DD/map.png GPS trace rendered on OpenStreetMap tiles
docs/Hiking/YYYY-MM-DD/charts.png Elevation (colored by HR), heart rate, speed, cadence charts
docs/Hiking/index.md Auto-updated index listing all hikes
docs/Hiking/prefectures.png Prefecture coverage map, regenerated on every run

If two activities share the same date, the existing page is renamed to YYYY-MM-DD-HHMM.md and the new one is written as YYYY-MM-DD-HHMM.md (where HHMM is the local start time), preserving both.

After running, add the new page to the nav array in zensical.toml and fill in the prefectures frontmatter field with the prefectures hiked:

{"🥾 Peak Name, YYYY-MM-DD" = "Hiking/YYYY-MM-DD.md"}
prefectures: [Tokyo, Kanagawa]

Dependencies

Managed via uv, declared in pyproject.toml:

  • fitparse — Garmin .fit file parser
  • matplotlib — Charts (elevation, heart rate, speed, cadence)
  • staticmap — Static map render using OSM tiles
  • pyyaml — YAML frontmatter parsing for index generation
  • requests — Overpass API queries for peak name lookup

prefecture_map.py

100% vibe coded by Claude Code. 0% human.

Shared helper used by both fit_to_md.py and roadtrip_to_md.py to generate a colored PNG map of Japan's 47 prefectures, highlighting the ones visited. Not intended to be called directly.

Prefecture names are written in plain English in each page's prefectures: frontmatter list (e.g. [Tokyo, Osaka, Hokkaido]). The full mapping from clean names to GeoJSON identifiers is defined in PREFECTURE_NAMES inside the module. The boundary data lives in data/japan_prefectures.geojson (from the dataofjapan/land project, MIT licensed).

roadtrip_to_md.py

100% vibe coded by Claude Code. 0% human.

Converts multi-day GPX road trip files into a Markdown page for the Road Trips section of the site.

uv run python roadtrip_to_md.py --name "Tohoku 2024" day1.gpx [day2.gpx ...]

Arguments

Argument Default Description
gpx_files GPX files, one per day, in chronological order
--name (required) Trip name, e.g. Tohoku 2024
--tz +09:00 Timezone offset for display (JST by default)
--notes (empty) Free-text notes to append to the page
--md-only off Skip map/chart regeneration, update Markdown only

Output

File Description
docs/Road-Trips/YYYY-MM-DD.md Markdown page with stats table and Day by Day breakdown
docs/Road-Trips/YYYY-MM-DD/map.png Multi-day GPS trace on ESRI World Street Map tiles
docs/Road-Trips/YYYY-MM-DD/charts.png Elevation and speed charts per day
docs/Road-Trips/index.md Auto-updated index listing all trips with summaries
docs/Road-Trips/prefectures.png Prefecture coverage map, regenerated on every run

After running, add the new page to the nav array in zensical.toml, then manually fill in the prefectures, trip_summary, and Route fields:

{"🚗 Trip Name, YYYY-MM-DD" = "Road-Trips/YYYY-MM-DD.md"}
prefectures: [Shiga, Fukui, Ishikawa, Toyama]
trip_summary: "One-sentence description of the overall circuit."

Dependencies

Managed via uv, declared in pyproject.toml:

  • matplotlib — Charts (elevation, speed)
  • staticmap — Static map render using ESRI tiles
  • pyyaml — YAML frontmatter parsing for index generation
  • numpy — Speed smoothing and percentile calculations

License

CC0 1.0 Public Domain