Images are published to the GitHub Container Registry for amd64 and arm64:
podman pull ghcr.io/leaced/cal2gancio:latestAll images pushed to main are signed with Cosign using keyless signing via GitHub Actions OIDC. No key management is required to verify.
cosign verify \
--certificate-identity-regexp "https://github.com/Leaced/cal2gancio/.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
ghcr.io/leaced/cal2gancio:latestThe signature is recorded in the Sigstore transparency log and can be inspected independently of GitHub.
The password is read from a file whose path is set by password_file in config.yml.
Recommended: podman secret
echo -n "your-gancio-password" | podman secret create gancio_password -This mounts the secret at /run/secrets/gancio_password inside the container — the default path.
Alternative: plain file
echo -n "your-gancio-password" > /etc/cal2gancio/password
chmod 600 /etc/cal2gancio/passwordSet password_file: /run/secrets/gancio_password in config.yml and mount the file at the same path.
To verify your config and inspect the events that would be sent — without touching Gancio — pass --dry-run:
podman run --rm \
-v /opt/cal2gancio:/opt/cal2gancio:ro,Z \
ghcr.io/leaced/cal2gancio:latest --dry-runNo password file or Gancio credentials are required. Each event is printed as JSON after the full post-processing pipeline (filters, tags, description assembly, etc.).
With a podman secret:
podman run --rm \
-v /opt/cal2gancio:/opt/cal2gancio:ro,Z \
--secret gancio_password \
ghcr.io/leaced/cal2gancio:latestWith a password file mounted directly:
podman run --rm \
-v /opt/cal2gancio:/opt/cal2gancio:ro,Z \
-v /etc/cal2gancio/password:/run/secrets/gancio_password:ro,Z \
ghcr.io/leaced/cal2gancio:latestQuadlet lets systemd manage the container declaratively.
# /etc/containers/systemd/cal2gancio.container
[Unit]
Description=cal2gancio iCal → Gancio sync
[Container]
Image=ghcr.io/leaced/cal2gancio:latest
Volume=/opt/cal2gancio:/opt/cal2gancio:ro,Z
Secret=gancio_password
[Service]
Type=oneshot# /etc/systemd/system/cal2gancio.timer
[Unit]
Description=cal2gancio sync timer
[Timer]
OnCalendar=*:0/30
Persistent=true
Unit=cal2gancio.service
[Install]
WantedBy=timers.targetsystemctl daemon-reload # triggers the Quadlet generator
systemctl enable --now cal2gancio.timer