Commit graph

65 commits

Author SHA1 Message Date
47d302a9a4 crypto fix
All checks were successful
Deploy / build-deploy (push) Successful in 2m26s
2026-08-20 00:09:08 +02:00
2a4e2c1c85 crypto fix
All checks were successful
Deploy / build-deploy (push) Successful in 2m32s
2026-08-19 23:55:01 +02:00
1d6b04c4f7 typo
All checks were successful
Deploy / build-deploy (push) Successful in 2m28s
2026-08-19 19:02:21 +02:00
ed61fb5ca5 fp6+
All checks were successful
Deploy / build-deploy (push) Successful in 3m6s
2026-08-19 17:19:51 +02:00
a8bc400371 video seo
All checks were successful
Deploy / build-deploy (push) Successful in 2m33s
2026-08-19 00:02:32 +02:00
faf881fa0c added missing icons
All checks were successful
Deploy / build-deploy (push) Successful in 3m0s
2026-08-18 21:21:41 +02:00
593bdb17d4 112 tested
All checks were successful
Deploy / build-deploy (push) Successful in 3m21s
2026-08-18 14:52:49 +02:00
4666c1995f markdown fix
All checks were successful
Deploy / build-deploy (push) Successful in 2m23s
2026-08-18 11:12:24 +02:00
320af54b3d text change
All checks were successful
Deploy / build-deploy (push) Successful in 2m26s
2026-08-17 17:32:09 +02:00
c31797bd9a retire the bunq integration
All checks were successful
Deploy / build-deploy (push) Successful in 3m32s
The webhook is deregistered at bunq and the callback endpoint, its parser,
default-deny classifier, dedup ledger and signature check are removed; the
code is in git history if a bank feed ever comes back. /financials keeps
reading the hand-maintained aggregates file, and sales + shop donations
stay live from the order ledger.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 11:43:09 +02:00
4c49000d46 fix shopfront pin for the shortened donate button
All checks were successful
Deploy / build-deploy (push) Successful in 3m33s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 11:23:45 +02:00
c9c8e9ace8 text change
Some checks failed
Deploy / build-deploy (push) Failing after 3m4s
2026-08-17 11:19:50 +02:00
5be98cff96 text change
Some checks failed
Deploy / build-deploy (push) Has been cancelled
2026-08-17 11:16:49 +02:00
3b12a6b02a text change
All checks were successful
Deploy / build-deploy (push) Successful in 2m45s
2026-08-17 11:11:23 +02:00
abbd616b40 donation item, shop soft open
All checks were successful
Deploy / build-deploy (push) Successful in 4m11s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 11:04:03 +02:00
b0666841f6 sanctions block list
All checks were successful
Deploy / build-deploy (push) Successful in 2m18s
2026-08-15 03:22:25 +02:00
749f525f83 tests and eurc
All checks were successful
Deploy / build-deploy (push) Successful in 4m19s
2026-08-15 00:54:05 +02:00
33c68c2f44 financial page with bank data
All checks were successful
Deploy / build-deploy (push) Successful in 1m48s
2026-08-14 04:14:13 +02:00
e68d2c245c finacial page
All checks were successful
Deploy / build-deploy (push) Successful in 2m20s
2026-08-14 02:50:58 +02:00
70668af8f5 coingate
All checks were successful
Deploy / build-deploy (push) Successful in 3m10s
2026-08-13 23:34:19 +02:00
284f8d3e49 renamed fp6
All checks were successful
Deploy / build-deploy (push) Successful in 6m4s
2026-08-12 00:06:22 +02:00
38688a68f5 CI fix
All checks were successful
Deploy / build-deploy (push) Successful in 6m20s
2026-08-10 01:51:39 +02:00
6841623e23 posts and avif
Some checks failed
Deploy / build-deploy (push) Failing after 5m49s
2026-08-10 01:37:26 +02:00
2fa6e70af1 order confirmation
All checks were successful
Deploy / build-deploy (push) Successful in 6m14s
2026-08-09 00:14:09 +02:00
aa2327ff1d warranty change
All checks were successful
Deploy / build-deploy (push) Successful in 6m47s
2026-08-08 23:27:06 +02:00
fb6d85aec9 warranty change
Some checks failed
Deploy / build-deploy (push) Has been cancelled
2026-08-08 23:25:46 +02:00
2f5ccd272e fixed links
All checks were successful
Deploy / build-deploy (push) Successful in 8m16s
2026-08-08 20:04:36 +02:00
ae30ac69f7 privacy policy
All checks were successful
Deploy / build-deploy (push) Successful in 8m1s
2026-08-08 14:38:14 +02:00
867bed2b5f ci: redeploy to pick up the backfilled 13b048149b5511dd.h264.mp4
The H.264 sibling landed on the media mount after the previous deploy
ran, and fetch-media.sh only discovers siblings at build time.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 03:35:05 +02:00
a625176c7d media: H.264 fallback beside every AV1, and the post links the H.264
All checks were successful
Deploy / build-deploy (push) Successful in 7m30s
The AV1-only publish lasted four hours in the wild: the first viewer on
mobile Safari got "bad media error" from the raw file, because a post's
link is fetched raw — Lemmy apps and browsers play that exact URL, with
no <source> negotiation in front of it. The previous commit's note
("--raw ... if that audience matters") had it backwards: the audience
that cannot play AV1 is not a per-post judgement call, it is whoever
happens to open the thread on an iPhone.

So publish-media.sh now emits two encodings and points the post at the
compatible one:

  * Every video transcode also produces <hash>.h264.mp4 (x264 crf 23,
    same denoise, same frames), uploaded beside the AV1 under the AV1's
    hash — the poster's sibling-naming trick, reused, so fetch-media.sh
    finds it by name with nothing to look up.
  * The printed URL to paste into the post is the H.264 one. pict-rs
    can thumbnail it too, so instance thumbnails come back as a bonus.

fetch-media.sh adopting an own-origin .h264.mp4 URL swaps the AV1 back
in as the page's primary when it is on the mount, and records the H.264
as `fallback` in posts.json. The renderer turns a non-empty fallback
into a <source> pair: the AV1 first with an explicit codecs parameter —
both files are video/mp4, so the parameter is the only thing that lets
a non-AV1 browser skip to the file it can play — and the H.264 second.
Browsers with AV1 keep downloading the small file; Safari before 17
gets one that plays instead of an element that will not.

e2e gains the matching conditional gate: a page offering an av01
<source> must offer an .h264.mp4 one, so an AV1 video can never again
ship without its fallback.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 03:14:51 +02:00
c21aa636aa privacy: public analytics, and the edit history replaces the changelog promise
All checks were successful
Deploy / build-deploy (push) Successful in 7m39s
The posts-feed note promise became a link: every version of this page and
its diffs are at /legal/privacy/history (redirect to this file's history).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 02:50:52 +02:00
8cd4d55d00 analytics: GoAccess reports from the Caddy logs, public and private tiers
Server-side only, per the privacy policy: no client-side analytics. Rotated
logs ingest exactly once into per-tier DBs; the public tier is anonymized
at ingest and never receives censored paths. Log retention raised to a year.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 02:50:52 +02:00
c1b0c29af6 media: publish to our own origin instead of mirroring a file host
All checks were successful
Deploy / build-deploy (push) Successful in 7m34s
A 167 MB screen recording uploaded to catbox.moe hit fetch-media.sh's 64 MB
MAX_BYTES, so curl refused it, the entry kept its third-party URL, and e2e
failed "/posts media origin" on a file we had on disk the whole time. Raising
the cap would have papered over it: the mirror step still depends on someone
else's server being up, fast, and still holding the file.

Invert it. tools/publish-media.sh uploads a recording to the media mount under
its content hash BEFORE the post exists and prints the URL to post, and
fetch-media.sh adopts an own-origin URL by rewriting it to /media/<hash> with no
request at all — no size cap, no third party in the build.

Also here, because publishing exposed them:

  * Rotation. Phones record 1920x1080 and attach a display matrix rather than
    rotating pixels, so an untouched file reports landscape while playing
    portrait and width/height reserve exactly the wrong box. publish-media.sh
    bakes rotation into the frames; fetch-media.sh swaps the dimensions on a
    quarter-turn matrix for anything mirrored straight from a phone.
  * Posters. pict-rs will not thumbnail AV1, so a self-hosted video usually
    arrives with no poster. publish-media.sh uploads <hash>.poster.webp beside
    the video and fetch-media.sh falls back to it — a real thumbnail still wins.
  * The workflow comment claiming a file on the mount is never downloaded again
    was wrong: the name is the hash of the bytes, so third-party media is
    re-fetched every build and only the write is skipped.

Transcoding to AV1 is what makes self-hosting cheap: that clip was 78 s of a
dark room at 17 Mbps, and denoise + AV1 gives the same picture in 15 MB. Note
<video> carries a single src with no fallback, so AV1 excludes Safari < 17;
--raw skips the transcode when that matters.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 01:16:17 +02:00
fca089c20d SEO
Some checks failed
Deploy / build-deploy (push) Failing after 7m0s
2026-08-06 23:42:25 +02:00
f2d20bb409 ci: test deploy after migration to Hetzner
All checks were successful
Deploy / build-deploy (push) Successful in 8m17s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 19:23:19 +02:00
b49042a626 new logo
All checks were successful
Deploy / build-deploy (push) Successful in 5m32s
2026-08-05 23:52:40 +02:00
fe489673be imprint: add EORI number
All checks were successful
Deploy / build-deploy (push) Successful in 6m0s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 22:51:20 +02:00
ad7a2eb76a changes
All checks were successful
Deploy / build-deploy (push) Successful in 5m55s
2026-08-05 22:32:34 +02:00
054a26475c changes
Some checks failed
Deploy / build-deploy (push) Has been cancelled
2026-08-05 22:32:03 +02:00
8c80740514 fixed risremembered claim
All checks were successful
Deploy / build-deploy (push) Successful in 4m37s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 07:45:40 +02:00
cc02023625 about page
All checks were successful
Deploy / build-deploy (push) Successful in 4m46s
2026-08-05 07:05:00 +02:00
728e48fc4f posts fix
Some checks failed
Deploy / build-deploy (push) Failing after 3m26s
2026-08-05 06:17:00 +02:00
40e094f7eb ci fix
All checks were successful
Deploy / build-deploy (push) Successful in 5m31s
2026-08-05 05:50:01 +02:00
8603182caf ci fix
Some checks failed
Deploy / build-deploy (push) Failing after 3m27s
2026-08-05 05:41:22 +02:00
7f73104db9 ci fix
All checks were successful
Deploy / build-deploy (push) Successful in 9m45s
2026-08-05 05:17:25 +02:00
1b59b548fa caddy
Some checks failed
Deploy / build-deploy (push) Failing after 5m4s
2026-08-05 04:32:52 +02:00
934c94cb5c rewrite
Some checks failed
Deploy / build-deploy (push) Failing after 4m56s
2026-08-05 04:18:37 +02:00
fb2f6079cc webgpu demo
All checks were successful
Deploy / build-deploy (push) Successful in 1m38s
2026-07-19 01:13:30 +02:00
bdea14fc20 CI: install nodejs so JS-based actions run in the arch container
All checks were successful
Deploy / build-deploy (push) Successful in 3m29s
actions/checkout and actions/cache are executed with node inside the
archlinux:latest job container, which has no node by default. Install it
in the first (shell) step, before Checkout, mirroring the Crafter.Build CI.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-18 23:34:00 +02:00
d3dd4b1f7a Add Forgejo Actions workflow to build and deploy on push
Some checks failed
Deploy / build-deploy (push) Failing after 1m0s
- .forgejo/workflows/deploy.yaml: build the wasm bundle on the arch-latest
  Docker runner and rsync it into the bind-mounted web root (/deploy) on
  push to master
- deploy/Caddyfile.example: reference site block with the cross-origin
  isolation headers the WASM runtime requires

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-18 23:27:41 +02:00