levineuwirth.org/tools
Levi Neuwirth 5711aafa78
infra: forgejo sync tooling and a nightly backup timer
Two problems this session surfaced on the Forgejo box, both now addressed
in tracked source rather than in shell history.

forgejo-sync.sh pushes the local repositories to git.levineuwirth.org over
HTTPS. It exists because the only Forgejo remote anywhere used
ssh://…:2222, which is filtered on most public networks, so eight of nine
repos had drifted three to four months behind while the CV cited them as
canonical. Dry-run by default, never force-pushes, never touches `origin`,
creates new repos private, and refuses to push when the remote holds
commits the local machine does not — the check that caught `levshell`,
where Forgejo's copy turned out to be the abandoned prototype rather than
an older version of the current project.

The divergence check authenticates via GIT_ASKPASS. An earlier version ran
ls-remote unauthenticated, which fails silently on private repositories and
returned empty — indistinguishable from "remote has nothing we lack", i.e.
a false all-clear on exactly the repos where the check matters. A failed
listing now blocks instead of passing.

forgejo-backup.sh plus its timer close the other gap: there were no backups
at all, of an instance holding nine repositories, four of them cited by URL
in a CV PDF already in circulation. Nightly, no downtime, SQLite `.backup`
for a consistent snapshot rather than cp, integrity-checked before it is
trusted, archive verified readable before retention prunes anything, and 14
days kept. Aborts non-zero on any of those checks so a bad run surfaces as
a failed unit instead of a corrupt archive displacing a good one.

Both are still local to that box. Copying an archive off-site remains the
open half of the backup story.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SUGesXiMmACsLBTGG1xuEU
2026-08-11 13:37:34 +02:00
..
bin Add link archive system: snapshots, backlinks, link-rot 2026-05-23 10:06:33 -04:00
hooks Tooling, manifest, and content polish 2026-06-10 11:13:34 -04:00
add-popup-source.sh Last audit stragglers: scaffolder, refreeze safety, atomic-write polish 2026-06-10 11:43:14 -04:00
archive.py Archive: close out the audit-pass refinements 2026-06-19 16:23:14 -04:00
audit-marks.py Marks II: broader monogram coverage + audit-marks tool 2026-05-23 12:05:08 -04:00
compress-assets.sh Validate tool inputs and surface tracebacks on errors 2026-05-07 15:09:02 -04:00
convert-images.sh Tooling robustness: atomic writes, verified downloads 2026-06-10 09:43:25 -04:00
download-leaflet.sh Tooling robustness: atomic writes, verified downloads 2026-06-10 09:43:25 -04:00
download-model.sh Tooling robustness: atomic writes, verified downloads 2026-06-10 09:43:25 -04:00
download-pdfjs.sh PDF compression 2026-04-22 12:40:22 -04:00
embed.py Last audit stragglers: scaffolder, refreeze safety, atomic-write polish 2026-06-10 11:43:14 -04:00
extract-dimensions.py Last audit stragglers: scaffolder, refreeze safety, atomic-write polish 2026-06-10 11:43:14 -04:00
extract-exif.py Last audit stragglers: scaffolder, refreeze safety, atomic-write polish 2026-06-10 11:43:14 -04:00
extract-palette.py Last audit stragglers: scaffolder, refreeze safety, atomic-write polish 2026-06-10 11:43:14 -04:00
forgejo-backup.sh infra: forgejo sync tooling and a nightly backup timer 2026-08-11 13:37:34 +02:00
forgejo-sync.sh infra: forgejo sync tooling and a nightly backup timer 2026-08-11 13:37:34 +02:00
import-content.py sync before transfer 2026-07-27 19:10:51 -04:00
import-photo.sh Tooling, manifest, and content polish 2026-06-10 11:13:34 -04:00
import-poetry.py audit: tooling, deploy ordering, README, repo hygiene 2026-04-10 17:41:33 -04:00
leaflet-checksums.sha256 Spec dilemma 2026-05-01 21:22:01 -04:00
model-checksums.sha256 Pin Hugging Face model revisions for downloader and embed pipeline 2026-05-07 15:08:14 -04:00
monolith-version.txt Add link archive system: snapshots, backlinks, link-rot 2026-05-23 10:06:33 -04:00
pdfjs-checksums.sha256 Fix broken PDF hyperlinks 2026-04-22 12:10:31 -04:00
preset-signing-passphrase.sh Tooling, manifest, and content polish 2026-06-10 11:13:34 -04:00
refreeze.sh Last audit stragglers: scaffolder, refreeze safety, atomic-write polish 2026-06-10 11:43:14 -04:00
sign-site.sh States/Context/Embeddings fixes 2026-04-26 11:22:57 -04:00
stamp-build-time.py Tooling, manifest, and content polish 2026-06-10 11:13:34 -04:00
subset-fonts.sh initial deploy! whoop 2026-03-17 21:56:14 -04:00
viz_theme.py GPG signing, embedding pipeline, visualization filter, search timing, sig popups 2026-03-20 20:14:49 -04:00