Commit Graph
28 Commits
Author SHA1 Message Date
makiolaj 8a1eb54a45 Render the app privacy policies from the app repos
Each policy now has exactly one copy: docs/PRIVACY.md in the app's own
repository. The pages keep their URLs and chrome and render that file
through a content collection, so the published page and the app's own
documentation cannot drift.

scripts/sync-external.mjs shallow-clones both repos into external/ from
prebuild and predev — not from CI: Coolify builds the site from the repo,
so a checkout that only ran in a Gitea job would never reach the deploy.
It falls back to the raw file if git is unavailable, and takes <APP>_REF
or <APP>_LOCAL for work against a branch or an unpushed working copy.

A missing, empty or malformed policy fails the build, verified against the
real image: the deploy stops rather than publishing an empty privacy page.
2026-09-09 16:33:11 +02:00
makiolaj 6311baccb7 Merge pull request 'Add the Calendula and Agendula privacy policies' (#7) from calendula-privacy-policy into main
Reviewed-on: #7
2026-09-09 14:02:01 +00:00
makiolaj 92472937cc Restore spaces stripped at wrapped inline-tag boundaries
Astro drops the whitespace run when a line break falls exactly at an inline
tag boundary, so "the\n<a ...>" renders glued. Adds {' '} at the wrap.
The footer one showed on every page.
2026-09-09 16:01:16 +02:00
makiolaj 0fe0eaf2bd Add the Agendula app privacy policy
Same structure as the Calendula page, but Agendula holds INTERNET and syncs
CalDAV itself, so the wording turns on "only to the server you entered"
rather than on the absence of the permission. Facts from the app repo:
storage modes, Keystore-encrypted credentials, RFC 6764 discovery,
Nextcloud Login Flow v2, Auto Backup exclusions, crash-report allowlist.
2026-09-09 16:01:11 +02:00
makiolaj d18692b693 Merge pull request 'Add the Calendula privacy policy, switch to business@' (#6) from calendula-privacy-policy into main
scheduled-deploy / trigger-deploy (push) Successful in 22s
Reviewed-on: #6
2026-07-28 17:11:08 +00:00
makiolaj bf40e27820 Switch the contact address to business@ 2026-07-28 19:01:29 +02:00
makiolaj 4181ef35ba Add the Calendula app privacy policy 2026-07-28 19:01:29 +02:00
makiolaj 97ff76b21f Merge pull request 'Publish two overdue posts (caldav-colors, the-feature-i-said-no-to)' (#5) from publish-overdue-posts into main
scheduled-deploy / trigger-deploy (push) Successful in 25s
2026-07-25 07:58:22 +00:00
makiolajandClaude Opus 5 0a9ef90160 Publish two overdue posts (flip draft: false)
Both reached their pubDate but were still draft: true, so every daily
scheduled-deploy rebuild skipped them — the gate in src/utils/posts.ts
checks draft before pubDate, so the flag outranks the date indefinitely.
The Jul 6 flip (c321728) covered only the posts due that day; these two
were not yet due and were never revisited:

- caldav-colors            (2026-07-08, 17 days overdue)
- the-feature-i-said-no-to (2026-07-10, 15 days overdue)

Verified with a production build: both render and appear in the blog
index, RSS feed, and sitemap.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-25 09:57:45 +02:00
makiolajandClaude Opus 4.8 c321728b7f Publish three due posts (flip draft: false)
scheduled-deploy / trigger-deploy (push) Successful in 25s
These posts had reached their pubDate but were still draft: true, so the
daily scheduled-deploy rebuild left them hidden — the publish gate in
src/utils/posts.ts checks draft before pubDate. Flip them to draft: false
so the date gate can release them:

- when-it-stopped-being-mine (2026-07-03)
- recurring-event-edit       (2026-07-05)
- the-translator-who-emailed-me (2026-07-06)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 19:34:23 +02:00
makiolaj 3c8e996b3e Merge pull request 'Document blog authoring + release workflow' (#4) from docs-blog-workflow into main
scheduled-deploy / trigger-deploy (push) Successful in 23s
2026-07-01 19:54:18 +00:00
makiolajandClaude Opus 4.8 0c686a2e40 Document how to add and release a blog post
docs/blog-workflow.md: frontmatter/voice conventions, the draft+pubDate gate,
the daily deploy cron, publish checklists (scheduled vs immediate), and gotchas.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 21:44:12 +02:00
makiolaj 6776b1f337 Merge pull request 'Publish first post: Compose for widgets, RemoteViews underneath' (#3) from release-widgets-post into main 2026-07-01 19:39:21 +00:00
makiolajandClaude Opus 4.8 5da1615fa8 Publish "Compose for widgets, RemoteViews underneath"
First post released through the scheduling pipeline: draft:false with pubDate
today so the date gate passes. The other five stay draft/future-dated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 21:39:10 +02:00
makiolaj 6d8df36557 Merge pull request 'Target shared docker runners in scheduled-deploy' (#2) from fix-runner-label into main
Reviewed-on: #2
2026-07-01 19:32:38 +00:00
makiolajandClaude Opus 4.8 6a577c14ce Target shared docker runners in scheduled-deploy
The instance runners advertise `dind`/`docker` labels, not `ubuntu-latest`, so
the job sat queued unmatched. Point runs-on at `docker`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 21:31:11 +02:00
makiolaj 8d1126b5dc Merge pull request 'Add date-based post scheduling + daily deploy cron, and six draft posts' (#1) from blog-release-pipeline into main 2026-07-01 14:42:28 +00:00
makiolajandClaude Opus 4.8 6b91ef1ab4 Add six draft posts drawn from Calendula issues
Technical, journey, and philosophy posts sourced from the Calendula issue
threads, reviewed for source-accuracy, standards, ethics, and voice. All
draft:true with staggered future pubDates; they stay hidden in prod until
approved (draft:false) and due.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 16:35:06 +02:00
makiolajandClaude Opus 4.8 cecbda26b0 Add date-based post scheduling and daily deploy cron
Gate blog listings/RSS on pubDate<=now (in addition to !draft) via a shared
getPublishedPosts() helper, so a post set to draft:false with a future pubDate
publishes itself once a build runs on that day. Dev shows everything for preview.

Add .gitea/workflows/scheduled-deploy.yml: a daily cron that pings the Coolify
deploy hook so the static site rebuilds and the date gate advances. No file
mutation, no repo write access — needs a runner + COOLIFY_DEPLOY_HOOK secret.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 16:35:06 +02:00
makiolajandClaude Opus 4.8 d1acda5a93 Add Datenschutzerklärung, two blog posts, and a /uses colophon
- datenschutz.astro: DSGVO privacy policy (server logfiles, Hetzner as
  Auftragsverarbeiter per Art. 28, cookieless Umami, self-hosted fonts,
  data-subject rights, supervisory-authority complaint).
- consts.ts: extract shared LEGAL entity data; Impressum now reads from it.
- blog: "Why my calendar app has no internet permission" and
  "Open standards as a constraint, not a checkbox".
- uses.astro: colophon of the site stack, Floret apps, and self-hosted infra.
- Footer: add Uses + Datenschutz links alongside Impressum.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:54:49 +02:00
makiolajandClaude Opus 4.8 108e790621 Add Impressum page (§ 5 DDG) and footer link
Legally required Impressum for the Einzelunternehmen (Kleinunternehmer,
no VAT ID, not in Handelsregister). Covers § 5 DDG contact data,
§ 18 Abs. 2 MStV responsible person, § 36 VSBG, and liability/copyright
disclaimers. Linked from the footer on every page.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:20:43 +02:00
Jean-Luc MakiolaandClaude Opus 4.8 ec8a8f38a0 docs: analytics on, healthcheck, OG image done
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 13:59:16 +02:00
Jean-Luc MakiolaandClaude Opus 4.8 0e2ae872bf Add OG share image (1200x630, brand)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 13:57:45 +02:00
Jean-Luc MakiolaandClaude Opus 4.8 a449dbd28e docs: record Coolify deployment (live)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 13:53:55 +02:00
Jean-Luc MakiolaandClaude Opus 4.8 c0aa7153c7 Use npm install instead of npm ci in build
Astro 7's wasm32 optional deps (@emnapi/*) make npm ci's strict lock-sync
check fail across npm/node versions. npm install reconciles and builds.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 13:52:15 +02:00
Jean-Luc MakiolaandClaude Opus 4.8 eac3dddf40 Use npm 11 in build stage to match the lockfile
node:22 ships npm 10, which rejects the npm-11-generated package-lock
("Missing: @emnapi/core"). Upgrade npm to 11 before npm ci.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 13:50:36 +02:00
Jean-Luc MakiolaandClaude Opus 4.8 2665cd7f25 Build on node:22-slim (glibc) to fix musl native-dep failure
npm ci failed on node:22-alpine (musl): Astro 7's rolldown/oxc native
bindings pull @emnapi/core etc. that aren't resolved for musl. Build on
Debian glibc to match the lockfile's linux-x64-gnu deps.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 13:48:56 +02:00
Jean-Luc MakiolaandClaude Opus 4.8 074199c656 Initial site: Astro + M3 Expressive, projects, blog
Personal site & blog for jeanlucmakiola.de.

- Astro 7 static output; self-hosted Inter + JetBrains Mono (Fontsource)
- Material 3 Expressive design tokens (red accent over neutral surfaces)
- Home (hero + about + selected work + latest writing)
- /work index + per-app pages (Calendula, Agendula, floret-kit) with
  build-time Gitea release tags, brand-icon link rows, features grid,
  and an at-a-glance facts panel
- Blog via Markdown content collection; RSS, sitemap, robots, OG/SEO
- Privacy-respecting Umami analytics, env-gated (off in dev)
- Dockerfile (build -> Caddy) + Caddyfile for Coolify deploy

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 13:39:08 +02:00