Compare commits
136 Commits
7dcaa703e0
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 21c1d22859 | |||
| 68b328dabc | |||
| 817bd17959 | |||
| 77dd99ee2b | |||
| 857f33be54 | |||
| 320a98893a | |||
| e07fb3a72a | |||
| 1bb588d1d2 | |||
| aa1cb7411c | |||
| 5fe8c015f1 | |||
| 6f9538053c | |||
| 5e503cf3a5 | |||
| ce860cfef9 | |||
| 989755d33c | |||
| 9ddf52c635 | |||
| 9b62f79301 | |||
| 64aa9ec023 | |||
| 9bfd96af2c | |||
| 000af6934f | |||
| c94e36a861 | |||
| 2c831628b2 | |||
| 02fc666661 | |||
| c3cb224402 | |||
| 2b8ea1963b | |||
| f94880e758 | |||
| b6142cee44 | |||
| 53bfe5955d | |||
| 9f503c011d | |||
| 415d95ed47 | |||
| e787544a2b | |||
| 9f94164c61 | |||
| 608ccfdecd | |||
| 933652fd57 | |||
| fdaed1033a | |||
| bc77baca2e | |||
| 7c9a55224a | |||
| 85ba3747b1 | |||
| 71f8629d18 | |||
| b1492918d5 | |||
| 95ea38d250 | |||
| 81be69f08d | |||
| 71eaa3e788 | |||
| 5c75f1416f | |||
| 3379e50503 | |||
| 30c8937566 | |||
| 770a96b099 | |||
| 604ba00c70 | |||
| b6c9d0b2ac | |||
| 51ab99b839 | |||
| 2f733e5ffc | |||
| d7e3162f55 | |||
| 8e127e7e3a | |||
| e853cb543a | |||
| e29953ab90 | |||
| 366974475f | |||
| fa29888578 | |||
| 31f3c6fb2f | |||
| 936662e35c | |||
| a440583691 | |||
| 6486d377b2 | |||
| 6c842ebe7f | |||
| 89c9771a84 | |||
| 89ae41d9ec | |||
| 3983615c99 | |||
| 8412d1540c | |||
| 3f53bf5b85 | |||
| 3c77d6cdad | |||
| e44105b330 | |||
| f6a8657de2 | |||
| 89e2708b1e | |||
| f78ab147af | |||
| 886ed21e5d | |||
| eafc431e0e | |||
| 9809950347 | |||
| 21b572677e | |||
| 7c2303c4e8 | |||
| a4b3e526fb | |||
| 3018ae16ff | |||
| ff9ea3a0a7 | |||
| 913e4bf19a | |||
| 6eaa00d612 | |||
| 04e4fa3dcd | |||
| 8edbfd2dd3 | |||
| b1cffca953 | |||
| cf364bc298 | |||
| 5a6c00eaa4 | |||
| 512f1ce9b2 | |||
| ee107eebdf | |||
| 63a826fc8e | |||
| a9ce9a257c | |||
| 5ee0b8510f | |||
| 19d34622ca | |||
| dd764c8726 | |||
| dacda6fca0 | |||
| 8f87155c1d | |||
| 42ed59a6b3 | |||
| c403ea9593 | |||
| a2cdbd7506 | |||
| f463eadbef | |||
| ce5d520817 | |||
| b1e1a5cb9a | |||
| a7786f263f | |||
| ffcf156289 | |||
| d923f3eb46 | |||
| 075a8fa9d4 | |||
| 20212fee25 | |||
| 229532ab8b | |||
| 138649c8e5 | |||
| 728a43c4c3 | |||
| 850d2f5c50 | |||
| 6283c840ff | |||
| 7a9cd0f269 | |||
| cf5e1ecb2d | |||
| da7fbaf5b1 | |||
| e7482e5bdd | |||
| f829da10ec | |||
| fb5ae6732c | |||
| a398bcb737 | |||
| 9365f46440 | |||
| 246fbfde76 | |||
| 2a151b710c | |||
| ca283d621a | |||
| ca920a9fe8 | |||
| 26182ec363 | |||
| d0c821588e | |||
| 3edc18fe28 | |||
| 5bc8d008df | |||
| 5eca310bd8 | |||
| 13d6576a2c | |||
| bc67a0ee88 | |||
| 46c8a76633 | |||
| cc341cc944 | |||
| f4ee63282b | |||
| 326f28e4ac | |||
| 6e5caf33ad | |||
| 49c4ab0341 |
@@ -1,4 +1,9 @@
|
|||||||
/plugins/
|
/plugins/*
|
||||||
!/plugins/
|
!/plugins/.gitkeep
|
||||||
!/plugins/cache-on-save/
|
!/plugins/cache-on-save/
|
||||||
|
!/plugins/story-blocks/
|
||||||
/data/
|
/data/
|
||||||
|
/pages/01.trips/italy-2026-demo/
|
||||||
|
/pages/02.post/*ui-test*/
|
||||||
|
/config/plugins/git-sync.yaml
|
||||||
|
/config/security.yaml
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
/* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved. */
|
||||||
@@ -1,10 +1,21 @@
|
|||||||
login: mischa
|
login: mischa
|
||||||
state: enabled
|
state: enabled
|
||||||
title: Mischa
|
title: ''
|
||||||
email: mischa@gorinskat.nl
|
email: mischa@gorinskat.nl
|
||||||
fullname: Mischa
|
fullname: Mischa
|
||||||
hashed_password: $2y$10$koiWKjhhipph4uTbm7fWjOj79uwxfE/mYSXGKANrAvUrSqezY3xL2
|
hashed_password: $2y$10$xyV7bAUWEo75K6LbatUuYe/6x2Tj9nT6YnIjaDvESAhU2hJ7tjG2.
|
||||||
language: en
|
language: en
|
||||||
|
modified: 1782051328
|
||||||
|
admin_next:
|
||||||
|
preferences:
|
||||||
|
pluginsViewMode: cards
|
||||||
|
colorMode: dark
|
||||||
|
accentHue: 271
|
||||||
|
accentSaturation: 91
|
||||||
|
fontFamily: inter
|
||||||
|
pagesViewMode: tree
|
||||||
|
content_editor: ''
|
||||||
|
groups: { }
|
||||||
access:
|
access:
|
||||||
admin:
|
admin:
|
||||||
login: true
|
login: true
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
form:
|
||||||
|
validation: loose
|
||||||
|
fields:
|
||||||
|
active_trip:
|
||||||
|
type: pages
|
||||||
|
label: Active Trip
|
||||||
|
start_route: '/trips'
|
||||||
|
show_root: false
|
||||||
|
show_slug: true
|
||||||
|
|
||||||
|
travelling:
|
||||||
|
type: toggle
|
||||||
|
label: Currently Travelling
|
||||||
|
highlight: 1
|
||||||
|
default: false
|
||||||
|
options:
|
||||||
|
1: 'Yes'
|
||||||
|
0: 'No'
|
||||||
|
validate:
|
||||||
|
type: bool
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
name: Daily Entry
|
|
||||||
extends@: default
|
|
||||||
|
|
||||||
form:
|
|
||||||
fields:
|
|
||||||
tabs:
|
|
||||||
type: tabs
|
|
||||||
active: 1
|
|
||||||
fields:
|
|
||||||
content:
|
|
||||||
type: tab
|
|
||||||
title: Entry
|
|
||||||
|
|
||||||
fields:
|
|
||||||
header.title:
|
|
||||||
type: text
|
|
||||||
label: Title
|
|
||||||
validate:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
header.date:
|
|
||||||
type: datetime
|
|
||||||
label: Date
|
|
||||||
format: 'Y-m-d H:i'
|
|
||||||
validate:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
content:
|
|
||||||
type: markdown
|
|
||||||
label: Content
|
|
||||||
validate:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
header.hero_image:
|
|
||||||
type: text
|
|
||||||
label: 'Hero Image Filename'
|
|
||||||
help: 'Filename of the main photo for this entry (e.g. photo.jpg). Upload photos via the Media tab.'
|
|
||||||
|
|
||||||
location:
|
|
||||||
type: tab
|
|
||||||
title: Location
|
|
||||||
|
|
||||||
fields:
|
|
||||||
header.location_city:
|
|
||||||
type: text
|
|
||||||
label: City
|
|
||||||
placeholder: 'e.g. Kyoto'
|
|
||||||
|
|
||||||
header.location_country:
|
|
||||||
type: text
|
|
||||||
label: Country
|
|
||||||
placeholder: 'e.g. Japan'
|
|
||||||
|
|
||||||
header.lat:
|
|
||||||
type: number
|
|
||||||
label: Latitude
|
|
||||||
help: 'GPS latitude (for map)'
|
|
||||||
placeholder: '48.8566'
|
|
||||||
step: any
|
|
||||||
|
|
||||||
header.lng:
|
|
||||||
type: number
|
|
||||||
label: Longitude
|
|
||||||
help: 'GPS longitude (for map)'
|
|
||||||
placeholder: '2.3522'
|
|
||||||
step: any
|
|
||||||
|
|
||||||
weather:
|
|
||||||
type: tab
|
|
||||||
title: Weather
|
|
||||||
|
|
||||||
fields:
|
|
||||||
header.weather_temp_c:
|
|
||||||
type: number
|
|
||||||
label: 'Temperature (°C)'
|
|
||||||
help: 'Auto-filled from post form. Edit if needed.'
|
|
||||||
step: 1
|
|
||||||
|
|
||||||
header.weather_desc:
|
|
||||||
type: select
|
|
||||||
label: 'Weather Condition'
|
|
||||||
options:
|
|
||||||
Sunny: '☀️ Sunny'
|
|
||||||
'Partly cloudy': '⛅ Partly cloudy'
|
|
||||||
Cloudy: '☁️ Cloudy'
|
|
||||||
Foggy: '🌫️ Foggy'
|
|
||||||
Drizzle: '🌦️ Drizzle'
|
|
||||||
Rain: '🌧️ Rain'
|
|
||||||
Snow: '❄️ Snow'
|
|
||||||
Thunderstorm: '⛈️ Thunderstorm'
|
|
||||||
|
|
||||||
publishing:
|
|
||||||
type: tab
|
|
||||||
title: Publishing
|
|
||||||
|
|
||||||
fields:
|
|
||||||
header.published:
|
|
||||||
type: toggle
|
|
||||||
label: Published
|
|
||||||
highlight: 1
|
|
||||||
default: 1
|
|
||||||
options:
|
|
||||||
1: 'Yes'
|
|
||||||
0: 'No'
|
|
||||||
validate:
|
|
||||||
type: bool
|
|
||||||
|
|
||||||
header.publish_date:
|
|
||||||
type: datetime
|
|
||||||
label: 'Publish Date'
|
|
||||||
help: 'Schedule future publication (leave blank to publish immediately)'
|
|
||||||
format: 'Y-m-d H:i'
|
|
||||||
|
|
||||||
header.unpublish_date:
|
|
||||||
type: datetime
|
|
||||||
label: 'Unpublish Date'
|
|
||||||
help: 'Automatically unpublish at this date/time'
|
|
||||||
format: 'Y-m-d H:i'
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
ui:
|
||||||
|
defaults:
|
||||||
|
colorMode: ''
|
||||||
|
accentHue: 271
|
||||||
|
accentSaturation: 91
|
||||||
|
fontFamily: inter
|
||||||
|
fontSize: normal
|
||||||
|
editorMode: normal
|
||||||
|
editorStickyToolbar: true
|
||||||
|
editorFixedHeight: 0
|
||||||
|
adminLanguage: en-US
|
||||||
|
pagesPerPage: 20
|
||||||
|
pagesViewMode: tree
|
||||||
|
usersViewMode: cards
|
||||||
|
groupsViewMode: cards
|
||||||
|
pluginsViewMode: cards
|
||||||
|
themesViewMode: cards
|
||||||
|
settings:
|
||||||
|
autoSaveEnabled: false
|
||||||
|
autoSaveToolbarUndo: true
|
||||||
|
autoSaveBatchWindowMs: 0
|
||||||
|
collabEnabled: false
|
||||||
|
menubarLinks: { }
|
||||||
@@ -1,4 +1,225 @@
|
|||||||
types:
|
types:
|
||||||
|
defaults:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb.png
|
||||||
|
mime: application/octet-stream
|
||||||
|
image:
|
||||||
|
filters:
|
||||||
|
default:
|
||||||
|
- enableProgressive
|
||||||
|
|
||||||
|
jpg:
|
||||||
|
type: image
|
||||||
|
thumb: media/thumb-jpg.png
|
||||||
|
mime: image/jpeg
|
||||||
|
jpe:
|
||||||
|
type: image
|
||||||
|
thumb: media/thumb-jpg.png
|
||||||
|
mime: image/jpeg
|
||||||
|
jpeg:
|
||||||
|
type: image
|
||||||
|
thumb: media/thumb-jpg.png
|
||||||
|
mime: image/jpeg
|
||||||
|
png:
|
||||||
|
type: image
|
||||||
|
thumb: media/thumb-png.png
|
||||||
|
mime: image/png
|
||||||
|
webp:
|
||||||
|
type: image
|
||||||
|
thumb: media/thumb-webp.png
|
||||||
|
mime: image/webp
|
||||||
|
avif:
|
||||||
|
type: image
|
||||||
|
thumb: media/thumb.png
|
||||||
|
mime: image/avif
|
||||||
|
gif:
|
||||||
|
type: animated
|
||||||
|
thumb: media/thumb-gif.png
|
||||||
|
mime: image/gif
|
||||||
|
svg:
|
||||||
|
type: vector
|
||||||
|
thumb: media/thumb-svg.png
|
||||||
|
mime: image/svg+xml
|
||||||
|
mp4:
|
||||||
|
type: video
|
||||||
|
thumb: media/thumb-mp4.png
|
||||||
|
mime: video/mp4
|
||||||
|
mov:
|
||||||
|
type: video
|
||||||
|
thumb: media/thumb-mov.png
|
||||||
|
mime: video/quicktime
|
||||||
|
m4v:
|
||||||
|
type: video
|
||||||
|
thumb: media/thumb-m4v.png
|
||||||
|
mime: video/x-m4v
|
||||||
|
swf:
|
||||||
|
type: video
|
||||||
|
thumb: media/thumb-swf.png
|
||||||
|
mime: video/x-flv
|
||||||
|
flv:
|
||||||
|
type: video
|
||||||
|
thumb: media/thumb-flv.png
|
||||||
|
mime: video/x-flv
|
||||||
|
webm:
|
||||||
|
type: video
|
||||||
|
thumb: media/thumb-webm.png
|
||||||
|
mime: video/webm
|
||||||
|
ogv:
|
||||||
|
type: video
|
||||||
|
thumb: media/thumb-ogg.png
|
||||||
|
mime: video/ogg
|
||||||
|
mp3:
|
||||||
|
type: audio
|
||||||
|
thumb: media/thumb-mp3.png
|
||||||
|
mime: audio/mp3
|
||||||
|
ogg:
|
||||||
|
type: audio
|
||||||
|
thumb: media/thumb-ogg.png
|
||||||
|
mime: audio/ogg
|
||||||
|
wma:
|
||||||
|
type: audio
|
||||||
|
thumb: media/thumb-wma.png
|
||||||
|
mime: audio/wma
|
||||||
|
m4a:
|
||||||
|
type: audio
|
||||||
|
thumb: media/thumb-m4a.png
|
||||||
|
mime: audio/m4a
|
||||||
|
wav:
|
||||||
|
type: audio
|
||||||
|
thumb: media/thumb-wav.png
|
||||||
|
mime: audio/wav
|
||||||
|
aiff:
|
||||||
|
type: audio
|
||||||
|
thumb: media/thumb-aif.png
|
||||||
|
mime: audio/aiff
|
||||||
|
aif:
|
||||||
|
type: audio
|
||||||
|
thumb: media/thumb-aif.png
|
||||||
|
mime: audio/aiff
|
||||||
|
txt:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-txt.png
|
||||||
|
mime: text/plain
|
||||||
|
xml:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-xml.png
|
||||||
|
mime: application/xml
|
||||||
|
doc:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-doc.png
|
||||||
|
mime: application/msword
|
||||||
|
docx:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-docx.png
|
||||||
|
mime: application/vnd.openxmlformats-officedocument.wordprocessingml.document
|
||||||
|
xls:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-xls.png
|
||||||
|
mime: application/vnd.ms-excel
|
||||||
|
xlsx:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-xlsx.png
|
||||||
|
mime: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
|
||||||
|
ppt:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-ppt.png
|
||||||
|
mime: application/vnd.ms-powerpoint
|
||||||
|
pptx:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-pptx.png
|
||||||
|
mime: application/vnd.openxmlformats-officedocument.presentationml.presentation
|
||||||
|
pps:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-pps.png
|
||||||
|
mime: application/vnd.ms-powerpoint
|
||||||
|
rtf:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-rtf.png
|
||||||
|
mime: application/rtf
|
||||||
|
bmp:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-bmp.png
|
||||||
|
mime: image/bmp
|
||||||
|
tiff:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-tiff.png
|
||||||
|
mime: image/tiff
|
||||||
|
mpeg:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-mpg.png
|
||||||
|
mime: video/mpeg
|
||||||
|
mpg:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-mpg.png
|
||||||
|
mime: video/mpeg
|
||||||
|
mpe:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-mpe.png
|
||||||
|
mime: video/mpeg
|
||||||
|
avi:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-avi.png
|
||||||
|
mime: video/msvideo
|
||||||
|
wmv:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-wmv.png
|
||||||
|
mime: video/x-ms-wmv
|
||||||
|
html:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-html.png
|
||||||
|
mime: text/html
|
||||||
|
htm:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-html.png
|
||||||
|
mime: text/html
|
||||||
|
ics:
|
||||||
|
type: iCal
|
||||||
|
thumb: media/thumb-ics.png
|
||||||
|
mime: text/calendar
|
||||||
|
pdf:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-pdf.png
|
||||||
|
mime: application/pdf
|
||||||
|
ai:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-ai.png
|
||||||
|
mime: image/ai
|
||||||
|
psd:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-psd.png
|
||||||
|
mime: image/psd
|
||||||
|
zip:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-zip.png
|
||||||
|
mime: application/zip
|
||||||
|
7z:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-7z.png
|
||||||
|
mime: application/x-7z-compressed
|
||||||
|
gz:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-gz.png
|
||||||
|
mime: application/x-gzip
|
||||||
|
tar:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-tar.png
|
||||||
|
mime: application/x-tar
|
||||||
|
css:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-css.png
|
||||||
|
mime: text/css
|
||||||
|
js:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-js.png
|
||||||
|
mime: text/javascript
|
||||||
|
json:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-json.png
|
||||||
|
mime: application/json
|
||||||
|
vcf:
|
||||||
|
type: file
|
||||||
|
thumb: media/thumb-vcf.png
|
||||||
|
mime: text/x-vcard
|
||||||
gpx:
|
gpx:
|
||||||
type: file
|
type: file
|
||||||
mime: application/gpx+xml
|
mime: application/gpx+xml
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
popularity:
|
||||||
|
salt: 671ae9ab4f792c7dc860dbe8be288f2fdebdb3b4615f3c0f43211ecb95aaeeb3
|
||||||
|
auth:
|
||||||
|
jwt_secret: 61a84160bdd430768c82c4fe153e151a7a6f68f993c3779a5f36d32ee9293653
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// Auto-generated private secret. Do NOT commit to version control.
|
||||||
|
// Used for CSRF nonce signing and admin rate-limit hashing. Regenerate by
|
||||||
|
// deleting this file; the next request will write a new value.
|
||||||
|
|
||||||
|
return 'lsUHWFkCwvGZrL';
|
||||||
@@ -1 +0,0 @@
|
|||||||
{ }
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
title: 'Into the East'
|
title: 'Into the East'
|
||||||
description: 'A travel blog by Mischa'
|
|
||||||
author:
|
author:
|
||||||
name: Mischa
|
name: Mischa
|
||||||
email: mischa@gorinskat.nl
|
email: mischa@gorinskat.nl
|
||||||
taxonomies: [category, tag]
|
|
||||||
metadata:
|
metadata:
|
||||||
description: 'Into the East — travel journal'
|
description: 'Into the East — travel journal'
|
||||||
active_trip: japan-korea-2026
|
description: 'A travel blog by Mischa'
|
||||||
|
active_trip: /trips/us-canada-mex-2024
|
||||||
|
travelling: false
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ wrapped_site: false
|
|||||||
reverse_proxy_setup: false
|
reverse_proxy_setup: false
|
||||||
force_ssl: false
|
force_ssl: false
|
||||||
force_lowercase_urls: true
|
force_lowercase_urls: true
|
||||||
custom_base_url: 'http://100.96.115.96:8081'
|
custom_base_url: ''
|
||||||
username_regex: '^[a-z0-9_-]{3,16}$'
|
username_regex: '^[a-z0-9_-]{3,16}$'
|
||||||
pwd_regex: '(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}'
|
pwd_regex: '(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}'
|
||||||
intl_enabled: true
|
intl_enabled: true
|
||||||
|
|||||||
@@ -1,136 +0,0 @@
|
|||||||
# Bugs & Fixes
|
|
||||||
|
|
||||||
Backlog of confirmed bugs with root cause analysis and implementation spec for the fix.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## BUG-001 — New entry not visible after form submission
|
|
||||||
|
|
||||||
**Status:** fixed 2026-06-18
|
|
||||||
**Reported:** 2026-06-18
|
|
||||||
|
|
||||||
### Symptom
|
|
||||||
|
|
||||||
After submitting a new post via `/post`, the entry page file is created correctly on disk but does not appear in the `/tracker` feed or in the Grav Admin panel until the cache is manually flushed.
|
|
||||||
|
|
||||||
### Root cause
|
|
||||||
|
|
||||||
Grav's page-tree cache (`cache/doctrine/`) is not invalidated when `add-page-by-form` writes a new page to disk. The tracker template uses `page.children`, which Grav serves from cache — so the new child page is invisible until the cache is cleared.
|
|
||||||
|
|
||||||
### Workaround (manual)
|
|
||||||
|
|
||||||
Run in terminal after each submission:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker exec intotheeast_grav bash -c "cd /app/www/public && php bin/grav clearcache"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Fix spec
|
|
||||||
|
|
||||||
Wire cache-clear into the form process so it happens automatically on every successful submission.
|
|
||||||
|
|
||||||
**Approach — custom Grav plugin event hook:**
|
|
||||||
|
|
||||||
1. Create a small plugin `user/plugins/cache-on-save/` with one event listener:
|
|
||||||
- Listen on `onFormProcessed`
|
|
||||||
- When the form name is `new-entry`, call `$this->grav['cache']->deleteAll()` (note: `clear()` does not exist on `Grav\Common\Cache` in Grav 1.7)
|
|
||||||
2. Enable the plugin in `user/config/plugins/cache-on-save.yaml`
|
|
||||||
|
|
||||||
This is the cleanest approach: it fires exactly once per successful submission, requires no changes to `post-form.md`, and works for any future forms too.
|
|
||||||
|
|
||||||
**Alternative — disable page cache entirely:**
|
|
||||||
|
|
||||||
Set `cache: { enabled: false }` in `system.yaml`. Simpler but degrades frontend performance; not recommended for production.
|
|
||||||
|
|
||||||
### Files to create/modify
|
|
||||||
|
|
||||||
| File | Change |
|
|
||||||
|------|--------|
|
|
||||||
| `user/plugins/cache-on-save/cache-on-save.php` | New plugin, ~30 lines |
|
|
||||||
| `user/plugins/cache-on-save/cache-on-save.yaml` | Plugin manifest, enabled: true |
|
|
||||||
| `user/config/plugins/cache-on-save.yaml` | Runtime config, enabled: true |
|
|
||||||
|
|
||||||
### Acceptance criteria
|
|
||||||
|
|
||||||
1. Submit a new post via `/post`
|
|
||||||
2. Navigate to `/tracker` — the new entry is visible immediately, no manual cache flush needed
|
|
||||||
3. Grav Admin also shows the new page immediately
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## BUG-002 — Stale Twig cache after theme file changes
|
|
||||||
|
|
||||||
**Status:** fixed 2026-06-18
|
|
||||||
**Reported:** 2026-06-18
|
|
||||||
|
|
||||||
### Symptom
|
|
||||||
|
|
||||||
After theme template files are added or modified (e.g., creating `partials/base.html.twig`), Grav's Twig compiled-template cache still holds the old compiled version. Pages that extend the changed file throw 500 errors like "Template partials/base.html.twig is not defined" even though the file exists on disk.
|
|
||||||
|
|
||||||
### Root cause
|
|
||||||
|
|
||||||
Grav caches compiled Twig templates in `cache/twig/`. When a new file is added, existing templates that reference it don't know to recompile — their cache entries are still valid from their own mtime perspective.
|
|
||||||
|
|
||||||
### Workaround (manual)
|
|
||||||
|
|
||||||
Run after any theme file is added or changed:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker exec intotheeast_grav bash -c "cd /app/www/public && php bin/grav clearcache"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Fix spec
|
|
||||||
|
|
||||||
Disable Twig template caching in development via `user/config/system.yaml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
twig:
|
|
||||||
cache: false
|
|
||||||
```
|
|
||||||
|
|
||||||
Acceptable for a single-user dev setup — eliminates both BUG-001's side-effect and this bug entirely. Performance cost is negligible at one-user scale. On production, leave Twig cache enabled (it's fine there because template files don't change at runtime).
|
|
||||||
|
|
||||||
**Files to change:**
|
|
||||||
|
|
||||||
| File | Change |
|
|
||||||
|------|--------|
|
|
||||||
| `user/config/system.yaml` | Add `twig: { cache: false }` under development section |
|
|
||||||
|
|
||||||
### Acceptance criteria
|
|
||||||
|
|
||||||
1. Add a new theme template file
|
|
||||||
2. Reload any page — no 500 error, template works immediately without manual cache flush
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## BUG-003 — One post per day limit; silent failure on duplicate date
|
|
||||||
|
|
||||||
**Status:** fixed 2026-06-18
|
|
||||||
**Reported:** 2026-06-18
|
|
||||||
|
|
||||||
### Symptom
|
|
||||||
|
|
||||||
Submitting a second post with the same date as an existing entry shows "Entry posted successfully!" but creates no file. The user's post is silently discarded.
|
|
||||||
|
|
||||||
### Root cause
|
|
||||||
|
|
||||||
The `add-page-by-form` plugin built the page slug from date only (`Y-m-d`), producing folder names like `2026-06-18.entry`. With `overwrite_mode: false`, if that folder already exists the plugin skips page creation but does not abort — the `message` process step runs regardless, showing a false success.
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
Change the slug template in `user/pages/02.post/post-form.md` to include time and title:
|
|
||||||
|
|
||||||
```twig
|
|
||||||
{{ form.value.date|date('Y-m-d-Hi') }}-{{ form.value.title|lower|regex_replace('/[^a-z0-9]+/', '-')|trim('-') }}
|
|
||||||
```
|
|
||||||
|
|
||||||
Example: title "Arrived in Tokyo" at 14:30 on 2026-06-18 → `2026-06-18-1430-arrived-in-tokyo`
|
|
||||||
|
|
||||||
The slug is locked at creation time. Renaming the title afterwards does not change the URL.
|
|
||||||
|
|
||||||
### Acceptance criteria
|
|
||||||
|
|
||||||
1. Submit two posts on the same day with different times or titles — both appear in `/tracker` as separate entries
|
|
||||||
2. Renaming a post's title in the frontmatter does not break its URL
|
|
||||||
|
|
||||||
---
|
|
||||||
|
Before Width: | Height: | Size: 221 KiB |
|
Before Width: | Height: | Size: 152 KiB |
@@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
title: The Val d'Orcia at Dawn
|
|
||||||
date: '2025-09-05 10:00'
|
|
||||||
location_name: Val d'Orcia
|
|
||||||
location_country: Italy
|
|
||||||
lat: 43.078
|
|
||||||
lng: 11.676
|
|
||||||
hero_image: hero.jpg
|
|
||||||
hero_alt: Cypress-lined dirt road at first light, Tuscany
|
|
||||||
published: true
|
|
||||||
---
|
|
||||||
We left camp before the heat arrived. At six in the morning the Val d'Orcia belongs entirely to the light — long shadows, pale gold, not a car on the white roads. The kind of silence that has texture.
|
|
||||||
|
|
||||||
[snap-gallery images="hero.jpg,photo.jpg" captions="First light on the valley floor,The hills fold endlessly east" alts="Wide valley at dawn with golden light,Rolling green hills under morning sky" /]
|
|
||||||
|
|
||||||
We stopped twice before nine. Once for a puncture, once because the view demanded it.
|
|
||||||
|
|
||||||
[chapter-break image="hero.jpg" title="The Hour Before Heat" alt="Hazy hillside shimmering in early morning warmth" /]
|
|
||||||
|
|
||||||
By ten the temperature had shifted. The colours changed too — softer, more diffuse, the sky turning white at the edges. We dropped into the lower valley and the road surface changed from gravel to packed earth, then back again.
|
|
||||||
|
|
||||||
[snap-gallery images="photo.jpg,hero.jpg" captions="The texture of Tuscan gravel — coarser than it looks,The road ahead disappears into the heat" alts="Close-up of pale gravel surface,Road vanishing into bright haze" /]
|
|
||||||
|
|
||||||
[pull-quote]
|
|
||||||
The best hours of a cycling day are the ones nobody sees. Four in the morning to ten. Then it belongs to the sun.
|
|
||||||
[/pull-quote]
|
|
||||||
|
|
||||||
We made Pienza by noon. It was already thirty degrees and the ice cream queue was six deep.
|
|
||||||
|
Before Width: | Height: | Size: 204 KiB |
|
Before Width: | Height: | Size: 119 KiB |
@@ -1,55 +0,0 @@
|
|||||||
---
|
|
||||||
title: The Long Climb to Montalcino
|
|
||||||
date: '2025-09-06 20:00'
|
|
||||||
end_date: 2025-09-06
|
|
||||||
location_name: Montalcino
|
|
||||||
location_country: Italy
|
|
||||||
lat: 43.058
|
|
||||||
lng: 11.489
|
|
||||||
hero_image: hero.jpg
|
|
||||||
hero_alt: Hairpin road climbing through olive groves towards a hilltop town
|
|
||||||
published: true
|
|
||||||
---
|
|
||||||
The profile showed fourteen kilometres at an average of six percent. In practice it was steeper at the bottom and gentler at the top, which is the worst possible arrangement. We started climbing at two in the afternoon, which was also the worst possible decision.
|
|
||||||
|
|
||||||
[scrolly-section image="hero.jpg" alt="Empty road rising steeply through olive groves" caption="SP55 — 14km, 840m elevation gain"]
|
|
||||||
The first kilometre is the most honest. You find out immediately whether your legs have anything to say.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
By the halfway point the olive groves had given way to scrub oak and the road had narrowed to a single lane. No cars had passed in forty minutes. The silence was absolute except for breathing.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Then, at the last bend before the top, the town appeared. Just the outline of it — a tower, a wall, rooftops. It was enough.
|
|
||||||
[/scrolly-section]
|
|
||||||
|
|
||||||
[chapter-break image="photo.jpg" title="Montalcino" number="II" alt="Medieval town gate with stone archway" /]
|
|
||||||
|
|
||||||
[pull-quote image="photo.jpg" alt="Rows of Brunello vines descending from hilltop town"]
|
|
||||||
From the top you could see the whole valley we had spent two days riding through. It looked completely flat from up here.
|
|
||||||
[/pull-quote]
|
|
||||||
|
|
||||||
We found a bar in the main piazza. The owner brought two glasses of water without being asked. Then two more. Then a small plate of bread and oil that nobody ordered. We sat there for an hour.
|
|
||||||
|
|
||||||
[scrolly-section image="photo.jpg" alt="Shaded medieval piazza with stone buildings" caption="Piazza del Popolo, Montalcino"]
|
|
||||||
The piazza at five in the afternoon is a different place from the piazza at noon. People have returned from wherever they go during the heat.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
A wine shop with barrels in the window and a handwritten list on a chalkboard. We looked at it for a long time and bought nothing. The prices were very reasonable and this felt suspicious.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
A cat on a warm stone wall, watching traffic that did not exist. It had clearly been watching this traffic for years.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
The fortress walls turn amber just before sunset. You could photograph this from a hundred different angles and it would look the same in all of them: very good.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
The descent back to the valley takes twenty minutes. The climb took two and a half hours. This ratio never stops feeling wrong.
|
|
||||||
[/scrolly-section]
|
|
||||||
|
|
||||||
We found the agriturismo by following a handwritten sign nailed to a cypress tree. It was exactly what it promised to be.
|
|
||||||
|
Before Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 136 KiB |
@@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
title: One Evening in Siena
|
|
||||||
date: '2025-09-05 22:00'
|
|
||||||
location_name: Siena
|
|
||||||
location_country: Italy
|
|
||||||
lat: 43.318
|
|
||||||
lng: 11.330
|
|
||||||
hero_image: hero.jpg
|
|
||||||
hero_alt: The Piazza del Campo at dusk, terracotta rooftops fading to blue
|
|
||||||
published: true
|
|
||||||
---
|
|
||||||
[pull-quote]
|
|
||||||
Siena is not a city that tries to impress you. It has been here for a thousand years and intends to be here for a thousand more. You fit around it.
|
|
||||||
[/pull-quote]
|
|
||||||
|
|
||||||
We rolled in at half past six, legs finished, panniers heavier than they started. The Campo appeared without warning at the end of a narrow street and we both stopped pedalling at exactly the same moment.
|
|
||||||
|
|
||||||
[scrolly-section image="hero.jpg" alt="Piazza del Campo seen from the upper rim, sloping shell-shaped square"]
|
|
||||||
The square fills from the edges inward as evening comes. First the locals — people who have been here before and know which bench faces west. Then the tourists, then the pigeons, then the shadows.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
A busker with a cello at the top of the slope. A couple arguing quietly in a language I couldn't place. Three children running in a circle for reasons nobody questioned. The ordinary business of a city at the end of a summer day.
|
|
||||||
[/scrolly-section]
|
|
||||||
|
|
||||||
[snap-gallery images="hero.jpg,photo.jpg" captions="The Campo at the moment the light goes warm,A doorway on Via di Città — every doorway in Siena looks like this" alts="Wide shot of Campo at golden hour,Ornate stone doorway with iron lantern" /]
|
|
||||||
|
|
||||||
We found a place to eat down three flights of stairs in a basement that appeared to have no ventilation and no menu. It was perfect. The relief of sitting down after eight hours on a bike is a specific physical sensation that is difficult to describe to anyone who has not experienced it.
|
|
||||||
|
|
||||||
[pull-quote image="photo.jpg" alt="Sunset view over Siena rooftops from high vantage point"]
|
|
||||||
Cycling makes you earn every place you arrive at. Siena earned.
|
|
||||||
[/pull-quote]
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Rolling through Val d'Orcia"
|
|
||||||
template: entry
|
|
||||||
date: '2025-09-05 08:00'
|
|
||||||
lat: 43.078
|
|
||||||
lng: 11.676
|
|
||||||
location_city: Pienza
|
|
||||||
location_country: Italy
|
|
||||||
weather_temp_c: 24
|
|
||||||
weather_desc: Sunny
|
|
||||||
published: true
|
|
||||||
---
|
|
||||||
Cypress trees lining dirt roads, heat already rising. The Val d'Orcia is everything they say it is.
|
|
||||||
|
Before Width: | Height: | Size: 278 KiB |
@@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Siena at dusk"
|
|
||||||
template: entry
|
|
||||||
date: '2025-09-05 19:00'
|
|
||||||
lat: 43.318
|
|
||||||
lng: 11.335
|
|
||||||
location_city: Siena
|
|
||||||
location_country: Italy
|
|
||||||
weather_temp_c: 21
|
|
||||||
weather_desc: Clear
|
|
||||||
published: true
|
|
||||||
---
|
|
||||||
Rolled in just before sunset. The Piazza del Campo was still warm from the day's heat.
|
|
||||||
|
Before Width: | Height: | Size: 115 KiB |
@@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Towers of San Gimignano"
|
|
||||||
template: entry
|
|
||||||
date: '2025-09-06 12:00'
|
|
||||||
lat: 43.546
|
|
||||||
lng: 11.321
|
|
||||||
location_city: 'San Gimignano'
|
|
||||||
location_country: Italy
|
|
||||||
weather_temp_c: 26
|
|
||||||
weather_desc: Hot and sunny
|
|
||||||
published: true
|
|
||||||
---
|
|
||||||
Ate lunch in the shadow of the medieval towers. Legs tired, gelato mandatory.
|
|
||||||
|
Before Width: | Height: | Size: 172 KiB |
@@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Into Florence"
|
|
||||||
template: entry
|
|
||||||
date: '2025-09-06 18:00'
|
|
||||||
lat: 43.767
|
|
||||||
lng: 11.253
|
|
||||||
location_city: Florence
|
|
||||||
location_country: Italy
|
|
||||||
weather_temp_c: 28
|
|
||||||
weather_desc: Warm
|
|
||||||
published: true
|
|
||||||
---
|
|
||||||
City traffic after days of gravel roads. Dodged trams and found the hotel.
|
|
||||||
|
Before Width: | Height: | Size: 121 KiB |
@@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Tyrrhenian coast"
|
|
||||||
template: entry
|
|
||||||
date: '2025-09-08 09:00'
|
|
||||||
lat: 43.553
|
|
||||||
lng: 10.313
|
|
||||||
location_city: Livorno
|
|
||||||
location_country: Italy
|
|
||||||
weather_temp_c: 23
|
|
||||||
weather_desc: Sea breeze
|
|
||||||
published: true
|
|
||||||
---
|
|
||||||
The sea appeared suddenly between two hills. Eight days of riding ends here.
|
|
||||||
|
Before Width: | Height: | Size: 155 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 155 KiB |
|
After Width: | Height: | Size: 140 KiB |
@@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
title: 'Sorano: Rock and Time'
|
||||||
|
date: '2026-09-03'
|
||||||
|
location_name: Sorano
|
||||||
|
location_country: Italy
|
||||||
|
lat: 42.683
|
||||||
|
lng: 11.715
|
||||||
|
hero_image: hero.jpg
|
||||||
|
hero_alt: Medieval town of Sorano clinging to pale tufa cliffs at dusk
|
||||||
|
published: true
|
||||||
|
---
|
||||||
|
|
||||||
|
The road from Orbetello climbs inland through scrubland and heat. For most of the afternoon there is nothing on the horizon except sky and the occasional electricity pylon. Then, at the top of a ridge, Sorano appears — and the word "appears" does not quite cover it. The town has been carved from a cliff of tufa, a pale volcanic rock so soft you can score it with a fingernail. The buildings are the cliff and the cliff is the buildings.
|
||||||
|
|
||||||
|
[scrolly-section image="hero.jpg" alt="Medieval town of Sorano seen from the approach road, perched on pale tufa cliffs" caption="Sorano — tufa cliff town, Grosseto province"]
|
||||||
|
The approach by bike gives you an unusually long time to study it. The descent into the valley and the climb back up take perhaps forty minutes, and the town is visible for most of that time, doing nothing, requiring nothing.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Close up the rock is extraordinary. Hundreds of tomb niches cut into the cliff face — Etruscan graves, most of them open to the sky now, their contents long removed. The people who built this town chose to live surrounded by the evidence of their own mortality. This seems either very brave or very sensible.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
The gate into the old town is fifteenth century and narrow enough that loaded bikes don't fit without turning sideways. Inside, the air is noticeably cooler and the alleys are steep, paved with the same pale tufa, worn smooth by centuries of feet.
|
||||||
|
[/scrolly-section]
|
||||||
|
|
||||||
|
We found a wall to lean the bikes against and sat looking south over the valley we had come from. The light was going amber. Below us, the road we had ridden was already in shadow.
|
||||||
|
|
||||||
|
[chapter-break image="photo-1.jpg" title="After Dark" number="II" alt="Narrow medieval alley in Sorano at dusk, pale stone walls glowing warm" /]
|
||||||
|
|
||||||
|
[pull-quote image="photo-1.jpg" alt="Stone alley in Sorano lit by a single lantern at night"]
|
||||||
|
A town built on rock, carved from rock, returning slowly to rock. Two thousand years of human effort and the cliff remains indifferent.
|
||||||
|
[/pull-quote]
|
||||||
|
|
||||||
|
[scrolly-section image="photo-2.jpg" alt="View south from the tufa cliff walls of Sorano at dusk" caption="Val di Fiora, from the old walls"]
|
||||||
|
One restaurant was open. The menu was four items. We had the pasta with wild boar and the pasta with truffles and a carafe of local wine that cost six euros and was excellent.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
The owner sat at the next table watching a football match on his phone without headphones. Nobody minded. The town outside was completely quiet.
|
||||||
|
[/scrolly-section]
|
||||||
|
|
||||||
|
We were in bed before nine. Sorano at night is absolutely silent. It has been this quiet, in approximately this configuration, for a very long time.
|
||||||
|
After Width: | Height: | Size: 279 KiB |
|
After Width: | Height: | Size: 183 KiB |
|
After Width: | Height: | Size: 290 KiB |
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
title: "Val d'Orcia at Dawn"
|
||||||
|
date: '2026-09-05'
|
||||||
|
location_name: Val d'Orcia
|
||||||
|
location_country: Italy
|
||||||
|
lat: 43.078
|
||||||
|
lng: 11.676
|
||||||
|
hero_image: hero.jpg
|
||||||
|
hero_alt: Wide Tuscan valley at dawn, long cypress shadows across pale gravel road
|
||||||
|
published: true
|
||||||
|
featured: true
|
||||||
|
---
|
||||||
|
|
||||||
|
We left before the heat arrived. The alarm was five-thirty and the sky outside the tent was still more grey than blue. The valley was invisible in the dark except as an absence — a vast silence below us where the shapes of hills ought to be. By six the light had changed. The Val d'Orcia is one of those landscapes that photographers wait years to shoot at this hour, and you can see why: the light arrives at an angle that makes everything look like something from a different century.
|
||||||
|
|
||||||
|
[snap-gallery images="hero.jpg,photo-1.jpg,photo-2.jpg" captions="Six in the morning: the valley belongs entirely to the light,The Cypress Road — every photograph of Tuscany was taken here or somewhere like it,A farmhouse that has been sitting on this hill for four hundred years" alts="Wide misty Tuscan valley at dawn with long shadows,Straight road lined by tall cypress trees in morning light,Stone farmhouse on a hilltop with rolling landscape behind" /]
|
||||||
|
|
||||||
|
The roads down here are white gravel — strade bianche — and the tyres make a particular sound on them that you don't get anywhere else. We rode for two hours without seeing a car. The only other people were two elderly men walking a dog in the opposite direction. They waved.
|
||||||
|
|
||||||
|
[chapter-break image="photo-1.jpg" title="The Hour Before Heat" alt="Cypress road vanishing into a hazy summer morning" /]
|
||||||
|
|
||||||
|
By nine the temperature had already shifted. The quality of the light changed — softer, more diffuse, the sky turning white at the edges. The windows of the farmhouses began to open. Dogs that had been invisible in the dark became visible on walls and in doorways, watching us with professional detachment.
|
||||||
|
|
||||||
|
[snap-gallery images="photo-2.jpg,hero.jpg" captions="The road changes from asphalt to gravel to packed earth and back again without warning,The valley floor at nine: the shadows have shortened, the colours have flattened" alts="Farmhouse detail with terracotta roof and single cypress tree,Tuscan valley road in mid-morning haze" /]
|
||||||
|
|
||||||
|
[pull-quote]
|
||||||
|
The best hours of a cycling day are the ones nobody else sees. Before the heat arrives, before the cafes open, before the traffic comes. Everything belongs to you then.
|
||||||
|
[/pull-quote]
|
||||||
|
|
||||||
|
We reached Pienza at eleven-thirty. The ice-cream queue was eight deep and entirely justified.
|
||||||
|
After Width: | Height: | Size: 419 KiB |
|
After Width: | Height: | Size: 161 KiB |
@@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
title: 'One Evening in Siena'
|
||||||
|
date: '2026-09-05'
|
||||||
|
location_name: Siena
|
||||||
|
location_country: Italy
|
||||||
|
lat: 43.318
|
||||||
|
lng: 11.330
|
||||||
|
hero_image: hero.jpg
|
||||||
|
hero_alt: Piazza del Campo at dusk, terracotta paving fading from gold to shadow
|
||||||
|
published: true
|
||||||
|
---
|
||||||
|
|
||||||
|
[pull-quote image="hero.jpg" alt="Piazza del Campo seen from the upper rim at golden hour"]
|
||||||
|
Siena is not a city that tries to impress you. It has been here for a thousand years and intends to be here for a thousand more. You fit around it, not the other way.
|
||||||
|
[/pull-quote]
|
||||||
|
|
||||||
|
We rolled in at half past six, legs finished, panniers heavier than they started. The Campo appeared without warning at the end of a narrow street and we both stopped pedalling at exactly the same moment. That particular square does something to people. It is partly the shape — a shallow bowl, a scallop shell, the way it holds you — and partly the light at that hour, which turns the terracotta pavement the colour of old copper.
|
||||||
|
|
||||||
|
[chapter-break image="photo-1.jpg" title="The Campo" number="I" alt="Detail of Siena's herringbone brick pavement catching the last light" /]
|
||||||
|
|
||||||
|
[scrolly-section image="hero.jpg" alt="Piazza del Campo filling with people as evening comes" caption="Campo, 19:00 — the square fills from the edges inward"]
|
||||||
|
The locals arrive first. They know which spot faces west and which benches stay in the shade longest. Then the tourists, then the pigeons, then the long shadows.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
A busker with an accordion near the Fonte Gaia. A group of students lying on the slope reading. Three children running in a circle for reasons nobody questioned.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
We sat on the pavement with our backs against the warm brickwork of the Palazzo Pubblico and did not move for forty minutes. The relief of sitting still after eight hours on a bike is a specific physical sensation. It travels upward from your legs and settles somewhere just behind the sternum.
|
||||||
|
[/scrolly-section]
|
||||||
|
|
||||||
|
We found a place for dinner three streets away, down a flight of steps with no sign outside. The pasta was handmade, the wine was local, the bill was reasonable. We were in bed by ten. Tomorrow: Florence.
|
||||||
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 74 KiB |
@@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
title: 'Florence Without a Map'
|
||||||
|
date: '2026-09-07'
|
||||||
|
location_name: Florence
|
||||||
|
location_country: Italy
|
||||||
|
lat: 43.769
|
||||||
|
lng: 11.255
|
||||||
|
hero_image: hero.jpg
|
||||||
|
hero_alt: Arno river at midday with Ponte Vecchio, ochre buildings reflected in still water
|
||||||
|
published: true
|
||||||
|
---
|
||||||
|
|
||||||
|
No route today. No GPS, no distance target, no reason to be anywhere by any particular time. After six days of forward motion this felt almost wrong — the instinct to check the elevation profile arriving at nothing. We put the bikes in the hotel basement and walked out into Florence on foot.
|
||||||
|
|
||||||
|
[chapter-break image="hero.jpg" title="Day Seven" number="VII" alt="Arno river and Ponte Vecchio from Ponte Santa Trinita at midday" /]
|
||||||
|
|
||||||
|
[snap-gallery images="hero.jpg,photo-1.jpg" captions="The Arno at noon — greener than expected, the bridges older than you remember,Via dei Servi: washing lines, shutters, a cat on a warm stone ledge that had been warm since morning" alts="Arno river with Ponte Vecchio reflected in still water at midday,Narrow Florence street with laundry strung between buildings" /]
|
||||||
|
|
||||||
|
[pull-quote]
|
||||||
|
Cycling makes you earn every city you arrive at. Florence, we got for free. It felt like a gift and a debt simultaneously.
|
||||||
|
[/pull-quote]
|
||||||
|
|
||||||
|
[scrolly-section image="photo-1.jpg" alt="Narrow Oltrarno street in afternoon light" caption="Oltrarno, 14:00"]
|
||||||
|
The Uffizi had a queue that stretched around two corners and disappeared into a side street. We looked at it for a moment and went to find coffee instead. This felt correct.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
A covered market in the Oltrarno that nobody had told us about. A man selling leather goods from a table he clearly reassembled each morning from identical components. A small dog sleeping under a fruit stall in a precisely calculated patch of shade.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
We crossed the Ponte Vecchio at two in the afternoon, which is exactly the wrong time to cross the Ponte Vecchio, and it was still worth it. The light off the Arno at that hour is genuinely extraordinary and all the photographs in the world do not prepare you for it.
|
||||||
|
[/scrolly-section]
|
||||||
|
|
||||||
|
Dinner near the apartment, early. Feet sore in a different way from legs sore — a smaller, more concentrated complaint. Tomorrow: the last day. The coast road home.
|
||||||
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 44 KiB |
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
title: 'Setting Off from Campiglia'
|
||||||
|
date: '2026-09-01 07:00'
|
||||||
|
template: entry
|
||||||
|
published: true
|
||||||
|
featured: true
|
||||||
|
hero_image: ''
|
||||||
|
lat: 43.024
|
||||||
|
lng: 10.603
|
||||||
|
location_city: Campiglia Marittima
|
||||||
|
location_country: Italy
|
||||||
|
weather_temp_c: 27
|
||||||
|
weather_desc: Sunny
|
||||||
|
---
|
||||||
|
|
||||||
|
Seven in the morning and the coast road is still cool. We loaded the bikes in the car park below the old town, the panniers heavier than they should be and the weather forecast saying nine consecutive days of sun. The route heads south first — down into the Maremma, then east, then a long loop back. Eight days. Nobody goes this way in September except cyclists and people who have got lost.
|
||||||
|
After Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 250 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: 'Maremma in Full Sun'
|
||||||
|
date: '2026-09-02 11:30'
|
||||||
|
template: entry
|
||||||
|
published: true
|
||||||
|
hero_image: ''
|
||||||
|
lat: 42.612
|
||||||
|
lng: 11.171
|
||||||
|
location_city: Maremma
|
||||||
|
location_country: Italy
|
||||||
|
weather_temp_c: 29
|
||||||
|
weather_desc: Sunny
|
||||||
|
---
|
||||||
|
|
||||||
|
Eleven-thirty and already thirty degrees. The Maremma is agricultural land and scrubland and very little else, and in September it has the quality of a landscape that has given up trying. The road is straight, the sun is direct, the shadows are almost vertical. We stopped at a petrol station and drank two cans of something cold each. The man at the counter looked at us like people who had made a series of questionable decisions.
|
||||||
|
After Width: | Height: | Size: 146 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 166 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: 'The Lagoon at Dusk'
|
||||||
|
date: '2026-09-02 19:00'
|
||||||
|
template: entry
|
||||||
|
published: true
|
||||||
|
hero_image: ''
|
||||||
|
lat: 42.442
|
||||||
|
lng: 11.218
|
||||||
|
location_city: Orbetello
|
||||||
|
location_country: Italy
|
||||||
|
weather_temp_c: 24
|
||||||
|
weather_desc: Partly cloudy
|
||||||
|
---
|
||||||
|
|
||||||
|
Orbetello sits on a causeway between two lagoons and at dusk the light does something remarkable to the water. Pink flamingos — real ones, not ornamental — were standing in the shallows on the western side, perfectly still. We ate at a table outside overlooking the eastern lagoon. The sky turned orange and then purple and then a deep blue that was almost indistinguishable from the water. The wine was cold and the pasta had clams.
|
||||||
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 150 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: 'Orbetello Morning'
|
||||||
|
date: '2026-09-03 08:00'
|
||||||
|
template: entry
|
||||||
|
published: true
|
||||||
|
hero_image: ''
|
||||||
|
lat: 42.442
|
||||||
|
lng: 11.217
|
||||||
|
location_city: Orbetello
|
||||||
|
location_country: Italy
|
||||||
|
weather_temp_c: 22
|
||||||
|
weather_desc: Sunny
|
||||||
|
---
|
||||||
|
|
||||||
|
The lagoon at eight in the morning is a different thing from the lagoon at eight in the evening. Flat, silver, nearly silent. A single fisherman in a small boat about two hundred metres out, not appearing to fish. We left before the town had properly woken up, heading northeast on roads that climbed immediately and steeply into a landscape of oak and limestone that felt nothing like the coast we had left behind twenty minutes before.
|
||||||
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 50 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: 'Tufa and Towers'
|
||||||
|
date: '2026-09-03 17:00'
|
||||||
|
template: entry
|
||||||
|
published: true
|
||||||
|
hero_image: ''
|
||||||
|
lat: 42.683
|
||||||
|
lng: 11.715
|
||||||
|
location_city: Sorano
|
||||||
|
location_country: Italy
|
||||||
|
weather_temp_c: 26
|
||||||
|
weather_desc: Sunny
|
||||||
|
---
|
||||||
|
|
||||||
|
Sorano appears on the horizon an hour before you reach it: a cluster of towers and walls on a pale cliff, floating above the valley. The closer you get the stranger it becomes. The town is not built on rock — the town is rock, volcanic tufa carved and inhabited over two thousand years. The Etruscans started it. Everyone since has just kept adding floors. We are staying the night and it already feels like somewhere that requires more time than we have.
|
||||||
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 142 KiB |
|
After Width: | Height: | Size: 107 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: 'The Long Climb North'
|
||||||
|
date: '2026-09-04 15:00'
|
||||||
|
template: entry
|
||||||
|
published: true
|
||||||
|
hero_image: ''
|
||||||
|
lat: 43.077
|
||||||
|
lng: 11.678
|
||||||
|
location_city: "Val d'Orcia"
|
||||||
|
location_country: Italy
|
||||||
|
weather_temp_c: 23
|
||||||
|
weather_desc: Partly cloudy
|
||||||
|
---
|
||||||
|
|
||||||
|
Today was the hardest day. The route from Sorano to the Val d'Orcia crosses the eastern slope of Monte Amiata, which sounds manageable on a map and is not manageable at all. By noon we had climbed eleven hundred metres. By two we were somewhere above Seggiano in thin cloud, the views long gone, legs complaining in a language that had become very specific. Then the cloud lifted and the Val d'Orcia was simply there below us: pale roads, dark cypress, the whole thing exactly as advertised. Sometimes the landscapes that have been photographed to death are still worth arriving at.
|
||||||
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 49 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: 'Before the Heat Arrives'
|
||||||
|
date: '2026-09-05 08:30'
|
||||||
|
template: entry
|
||||||
|
published: true
|
||||||
|
hero_image: ''
|
||||||
|
lat: 43.078
|
||||||
|
lng: 11.676
|
||||||
|
location_city: Pienza
|
||||||
|
location_country: Italy
|
||||||
|
weather_temp_c: 21
|
||||||
|
weather_desc: Sunny
|
||||||
|
---
|
||||||
|
|
||||||
|
Six o'clock and the valley below Pienza is still in shadow. We left camp early on purpose — the route to Siena is long and September sun waits for no one. On the strade bianche the tyres make a sound like distant applause. No cars for the first two hours. Just the road and the light doing things to the cypress trees that would be embarrassing to describe in any other context.
|
||||||
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 191 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: 'Into Siena'
|
||||||
|
date: '2026-09-05 18:00'
|
||||||
|
template: entry
|
||||||
|
published: true
|
||||||
|
hero_image: ''
|
||||||
|
lat: 43.318
|
||||||
|
lng: 11.335
|
||||||
|
location_city: Siena
|
||||||
|
location_country: Italy
|
||||||
|
weather_temp_c: 25
|
||||||
|
weather_desc: Sunny
|
||||||
|
---
|
||||||
|
|
||||||
|
The approach to Siena by bike is through streets that get progressively older and steeper until suddenly the Campo is there. We had both seen it in photographs and the photographs are accurate in every way except one: they do not tell you how the square smells — stone and frying onions and the particular warm stillness of a Sienese summer evening. We sat on the pavement with our backs against the Palazzo Pubblico for forty minutes and did not want to be anywhere else.
|
||||||
|
After Width: | Height: | Size: 158 KiB |
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 170 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: 'Florence by Nightfall'
|
||||||
|
date: '2026-09-06 20:00'
|
||||||
|
template: entry
|
||||||
|
published: true
|
||||||
|
hero_image: ''
|
||||||
|
lat: 43.767
|
||||||
|
lng: 11.253
|
||||||
|
location_city: Florence
|
||||||
|
location_country: Italy
|
||||||
|
weather_temp_c: 21
|
||||||
|
weather_desc: Cloudy
|
||||||
|
---
|
||||||
|
|
||||||
|
A long day. Siena to Florence is ninety kilometres and involves two significant climbs before you reach the Chianti hills, after which it becomes more manageable but you have already used the legs you needed. We came in from the south as the light was going, the city materialising from a distance as a density of rooftops and towers. The Arno appeared between buildings and we crossed it and then we were in, which is always a slightly surprising moment after a long day.
|
||||||
|
After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 144 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: 'One Rest Day'
|
||||||
|
date: '2026-09-07 14:00'
|
||||||
|
template: entry
|
||||||
|
published: true
|
||||||
|
hero_image: ''
|
||||||
|
lat: 43.769
|
||||||
|
lng: 11.255
|
||||||
|
location_city: Florence
|
||||||
|
location_country: Italy
|
||||||
|
weather_temp_c: 22
|
||||||
|
weather_desc: Partly cloudy
|
||||||
|
---
|
||||||
|
|
||||||
|
The bikes stayed in the basement. We walked instead, which after six days of cycling felt simultaneously easier and harder — easier on the legs, harder on the feet, which are used to being passive. Florence does not require a plan. Every street contains something. We crossed the Arno four times from different bridges, each one giving a slightly different version of the same view, all of them good.
|
||||||
|
After Width: | Height: | Size: 110 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: 'Dawn on the Cecina Coast'
|
||||||
|
date: '2026-09-08 07:30'
|
||||||
|
template: entry
|
||||||
|
published: true
|
||||||
|
hero_image: ''
|
||||||
|
lat: 43.553
|
||||||
|
lng: 10.313
|
||||||
|
location_city: Cecina
|
||||||
|
location_country: Italy
|
||||||
|
weather_temp_c: 20
|
||||||
|
weather_desc: Sunny
|
||||||
|
---
|
||||||
|
|
||||||
|
The last day starts on the coast road south of Cecina, the sea visible between the pine trees. We have been inland for most of the week and the smell of salt water is a surprise. The road is flat, which after eight days of Tuscan hills feels almost suspicious. We rode in silence for the first hour. There was nothing that needed saying.
|
||||||
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 54 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: 'Home'
|
||||||
|
date: '2026-09-08 16:30'
|
||||||
|
template: entry
|
||||||
|
published: true
|
||||||
|
hero_image: ''
|
||||||
|
lat: 43.017
|
||||||
|
lng: 10.587
|
||||||
|
location_city: Campiglia Marittima
|
||||||
|
location_country: Italy
|
||||||
|
weather_temp_c: 26
|
||||||
|
weather_desc: Sunny
|
||||||
|
---
|
||||||
|
|
||||||
|
The old town of Campiglia was visible on its hill for the last twenty kilometres, appearing and disappearing between the trees the way it had appeared on the horizon eight days ago when we left. The loop is complete: same car park, same view across the coast, different legs. The bikes went back in the car and we sat on a wall and counted the countries and the kilometres and the pasta dishes. Eight days, one loop, Tuscany in September. It was exactly what it was supposed to be.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
title: Journal
|
||||||
|
template: dailies
|
||||||
|
content:
|
||||||
|
items: '@self.children'
|
||||||
|
order:
|
||||||
|
by: date
|
||||||
|
dir: desc
|
||||||
|
filter:
|
||||||
|
published: true
|
||||||
|
---
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
title: 'Tuscany 2026'
|
||||||
|
template: trip
|
||||||
|
date: '2026-09-01'
|
||||||
|
date_start: '2026-09-01'
|
||||||
|
date_end: '2026-09-08'
|
||||||
|
cover_image: ''
|
||||||
|
---
|
||||||
|
Before Width: | Height: | Size: 92 KiB |