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>
This commit is contained in:
Jean-Luc Makiola
2026-06-28 13:39:08 +02:00
commit 074199c656
35 changed files with 6954 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
---
title: Hello, world
description: First post — what this site is and how it's built.
pubDate: 2026-06-28
tags: [meta]
draft: false
---
This is the first post on my new site. It's built with [Astro](https://astro.build),
deployed on a self-hosted [Coolify](https://coolify.io), and kept honest with
privacy-respecting analytics.
Posts live as Markdown files in the repository — so writing here is just editing
text and pushing a commit. More to come.

View File

@@ -0,0 +1,42 @@
---
name: Agendula
order: 2
status: In development
released: false
platform: Android 10+
license: MIT
summary: >-
The task-list sibling to Calendula — a pure front-end over the OpenTasks
provider (CalDAV VTODOs), with no reinvented sync stack.
tech:
- Kotlin
- Jetpack Compose
- Material 3 Expressive
features:
- title: Provider-native
body: >-
A pure front-end over the OpenTasks TaskContract provider. DAVx5,
SmoothSync, and DecSync sync your CalDAV VTODOs in; Agendula reads and
writes them — no own database.
- title: Data layer done
body: >-
Provider resolution, live-updating reads, writes, smart-list filtering,
and a self-scheduled reminder engine are built and unit-tested.
- title: UI in progress
body: >-
The Material 3 Expressive screens are being built on top of the tested
data layer, one at a time.
- title: Open standards only
body: >-
CalDAV, iCalendar, and DecSync are the lane. Proprietary task services are
out of scope by design — they would mean owning a sync stack.
links:
gitea: https://gitea.jeanlucmakiola.de/makiolaj/agendula
donate: https://ko-fi.com/jeanlucmakiola
---
Where Calendula is a pure front-end over Android's `CalendarContract`, Agendula
is a pure front-end over the **OpenTasks `TaskContract` provider**. The name
rhymes with its sibling on purpose: *Agendula* is *agenda* — Latin for "things
to be done" — given Calendula's `-ula` ending. A Calendula flower head is a
cluster of many small *florets*, so the two apps are florets of one bloom.

View File

@@ -0,0 +1,48 @@
---
name: Calendula
order: 1
status: Released
released: true
platform: Android 10+
license: MIT
summary: >-
A Material 3 Expressive calendar for Android. Reads, writes, and reminds on
top of the system calendar — any CalDAV account just appears — with zero
network access of its own.
tech:
- Kotlin
- Jetpack Compose
- Material 3 Expressive
features:
- title: Calendar views
body: >-
Month, week, and day views with a one-tap switcher. Full event detail —
attendees and responses, reminders, humanized recurrence, availability,
visibility, and foreign time zones.
- title: Safe editing
body: >-
Scoped writes for recurring events (only this, this-and-following, or the
whole series), a recurrence picker for presets and custom rules, and
conflict-safe saves that ask before overwriting.
- title: Built-in reminders
body: >-
Delivered by Calendula itself as notifications — essential when it's your
only calendar app, since Android delegates reminder delivery to calendar
apps. Tap a reminder to land on the event.
- title: Private by default
body: >-
Zero telemetry, zero analytics, no internet permission — your data never
leaves the device. Dynamic color on Android 12+, German and English UI.
links:
gitea: https://gitea.jeanlucmakiola.de/makiolaj/calendula
fdroid: https://f-droid.org/packages/de.jeanlucmakiola.calendula/
donate: https://ko-fi.com/jeanlucmakiola
translate: https://weblate.dev.jeanlucmakiola.de/engage/calendula/
---
Calendula is named after the flower whose name — like the word *calendar*
comes from the Latin *kalendae*, the first day of the month. It lives entirely
on top of Android's `CalendarContract`: any calendar synced to your device
(CalDAV via DAVx5, Google, local, WebCal subscriptions, …) simply appears, and
everything you create or edit syncs back the same way. **No own database, no
sync stack reinvented.**

View File

@@ -0,0 +1,37 @@
---
name: floret-kit
order: 3
status: Design system
released: false
platform: Android library
license: MIT
summary: >-
The shared Material 3 Expressive design system and plumbing behind the Floret
app family — so each app draws from one bloom instead of reinventing it.
tech:
- Kotlin
- Gradle composite build
features:
- title: Built from source
body: >-
Embedded as a git submodule and wired in with a Gradle composite build —
no published artifacts, which keeps every app reproducible for F-Droid.
- title: core-time
body: >-
Pure-Kotlin date/time helpers: local-day windows for smart-list logic and
locale/zone-aware display formatting. No Android, no dependencies.
- title: Growing
body: >-
Identity/theme, components, screen recipes, and provider / prefs /
reminders / crash plumbing land as they're extracted from the apps.
links:
gitea: https://gitea.jeanlucmakiola.de/makiolaj/floret-kit
donate: https://ko-fi.com/jeanlucmakiola
---
"Floret" is the family's design language: a Calendula flower head is a cluster
of many small *florets*, and each app is one of them. floret-kit is the bloom
they share — so a new app doesn't reinvent a settings screen, an edit form, or a
theme; it draws from here. Gradle's dependency substitution maps
`de.jeanlucmakiola.floret:<module>` to local source, so editing the kit updates
every app immediately.