<feed xmlns='http://www.w3.org/2005/Atom'>
<title>bomSynoptic.git/systemd/synoptic-morph.service, branch master</title>
<subtitle>Display the latest Synoptic (isobaric) weather chart from the Australian Bureau of Meteorology
</subtitle>
<id>https://f3rr3t.com/bomSynoptic.git/atom?h=master</id>
<link rel='self' href='https://f3rr3t.com/bomSynoptic.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://f3rr3t.com/bomSynoptic.git/'/>
<updated>2026-06-10T09:10:38Z</updated>
<entry>
<title>Add synoptic-morph: 30-day rolling morph timelapse</title>
<updated>2026-06-10T09:10:38Z</updated>
<author>
<name>St33v</name>
<email>github@f3rr3t.com</email>
</author>
<published>2026-06-10T09:10:38Z</published>
<link rel='alternate' type='text/html' href='https://f3rr3t.com/bomSynoptic.git/commit/?id=e433a99ceddf7168d23377ffc8d585fc80ba8fb2'/>
<id>urn:sha1:e433a99ceddf7168d23377ffc8d585fc80ba8fb2</id>
<content type='text'>
synopticMorph.sh: rolling-cache implementation. On each run:
1. Pick the last WINDOW_DAYS*4 charts from the archive.
2. For each adjacent pair, fill any missing pair-morph (cached at
   /mnt/enclave/synoptic/pairs/&lt;chartA&gt;__&lt;chartB&gt;/p_NNNN.png).
3. Evict pair dirs whose slug isn't in the current window.
4. Symlink frames into a temp seq dir with LINGER on each source
   chart and DWELL on the latest, fade-in 1s and fade-out 2s.
5. Encode to /srv/www/pestrel/morph.mp4 with ffmpeg/h264.

Bootstrap: ~50 min CPU on first run (119 pair morphs at ~25s each).
Steady state: ~1 min/cycle (1 new pair + concat + encode).

synoptic-morph.service: oneshot, TimeoutStartSec=2h to cover the
bootstrap, Nice=10 + IOSchedulingClass=idle so it doesn't fight
the system for CPU/disk.

synoptic.service gains OnSuccess=synoptic-morph.service so the
chain fires automatically after each successful chart fetch.

morph.html: points at /morph.mp4 now. index.html: "Three-day
history" button renamed to "Monthly history", URL /morph.html.

setup.sh: installs the new unit + script, provisions
/mnt/enclave/synoptic/{pairs,out} when the enclave mount is present.

.gitignore: drop .claude/ (transient harness state).

Co-Authored-By: Claude Opus 4.7 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
