🟠 Draft | Swiss knife for ical & caldav calendars
Find a file
Glenn Y. Rolland 3b8e612446
Some checks reported errors
continuous-integration/drone/push Build encountered an error
feat: Add SBOM generation with Trivy
This commit introduces the generation of Software Bill of Materials
(SBOMs) for the project, enhancing supply chain security and
transparency. By providing a comprehensive list of all direct and
transitive dependencies, we can more effectively identify and mitigate
potential vulnerabilities, comply with regulatory requirements, and
improve overall software integrity.

- Added kiwimix.cdx.json, a CycloneDX 1.5 format SBOM generated by Trivy
  0.47.0, detailing Go module dependencies and their licenses.
- Added kiwimix.spdx, an SPDX 2.3 format SBOM generated by Trivy 0.47.0,
  providing an alternative representation of the project's software
  components and their relationships.

Signed-off-by: Glenn Y. Rolland <glenux@glenux.net>
2026-02-17 11:20:51 +01:00
cmd feat(cli): Implement full Cobra CLI for stack operations 2026-02-16 21:55:16 +01:00
docs feat(ics): Implement full ICS round-trip and range-based operations 2026-02-17 10:21:52 +01:00
pkg feat(ics): Implement full ICS round-trip and range-based operations 2026-02-17 10:21:52 +01:00
.drone.yml feat: Add Drone CI configuration 2026-02-16 16:22:42 +01:00
.gitignore feat: improve build process and ignore generated files 2026-02-16 16:29:30 +01:00
go.mod chore: update dependencies 2024-05-03 21:17:13 +02:00
go.sum chore: update dependencies 2024-05-03 21:17:13 +02:00
go.work feat: Introduce Go workspace for multi-module development 2026-02-16 17:39:42 +01:00
go.work.sum feat: Introduce Go workspace for multi-module development 2026-02-16 17:39:42 +01:00
kiwimix.cdx.json feat: Add SBOM generation with Trivy 2026-02-17 11:20:51 +01:00
kiwimix.spdx feat: Add SBOM generation with Trivy 2026-02-17 11:20:51 +01:00
Makefile feat(cli): Implement basic command parsing and execution 2026-02-16 18:22:01 +01:00
README.md docs: Revamp README with detailed usage and CLI model 2026-02-17 11:20:40 +01:00

Kiwimix

Stack-based CLI for building and transforming calendars.

Kiwimix operates on a calendar stack. Each operator maps to an operation, popping and pushing calendars as it runs. Use @ to chain operators in a single run.

Features

  • Stack-based execution with preflight validation.
  • Chain operators with @ in one CLI call.
  • Works with .ics calendars; supports ICS and JSON formats.
  • stdin/stdout support via - for load and save.

Usage

Quick start

Merge and anonymize a calendar:

kiwimix load alice.ics \
  @ filter --merge \
  @ filter --anonymize \
  @ save alice-public.ics

Union by occupied time ranges:

kiwimix load alice.ics \
  @ load bob.ics \
  @ union --ranges \
  @ save busy.ics

Compute free time slots by ranges:

kiwimix load alice.ics \
  @ load bob.ics \
  @ union --ranges \
  @ substract --ranges \
  @ save free-time.ics

Find free time:

kiwimix \
  generate --from-date XXX --to-date YYY --from-time 9:00 --to-time 19:00 \
  @ load agenda.ics \
  @ substract --ranges \
  @ save free.ics

Find free time for a meeting:

kiwimix \
  generate --from-date XXX --to-date YYY --from-time 9:00 --to-time 19:00 \
  @ load alice.ics \
  @ load bob.ics \
  @ union --ranges \
  @ substract --ranges \
  @ save free.ics

Rewrite events:

kiwimix load alice.ics \
  @ filter --merge \
  @ filter --anonymize \
  @ save alice-public.ics

Stack chain example (formerly noted as V2):

kiwimix generate --from-date XXX --to-date YYY --from-time 9:00 --to-time 19:00 \
  @ load alice.ics \
  @ filter --merge \
  @ filter --anonymize \
  @ load bob.ics \
  @ filter --merge \
  @ filter --anonymize \
  @ union --ranges \
  @ substract --ranges \
  @ save result.ics

CLI model

  • The stack holds calendars in memory.
  • Operators pop one or two calendars and push the result back.
  • swap and drop only operate on the stack (no files).
  • Preflight validation enforces that the pipeline ends with an empty stack.

Operator reference

  • Overview: `[docs/overview.md]

Format conventions

  • Dates: YYYY-MM-DD
  • Times: H:MM or HH:MM (24h)
  • For load and save, - means stdin/stdout.
  • Supported formats: ICS (default), JSON (case-insensitive).
  • If --format is omitted, the format is inferred from the file extension.
  • When using stdin/stdout (-), the format defaults to ICS unless specified.

Installation

Build and install from source:

make prepare
make build
make install

Install with Go directly:

go install ./...

Build and test

Build binaries and templates:

make build

Run tests:

make test

Install JS dependencies for template generation:

make npm

References

Contributing

FIXME: Contributing guidelines are not yet documented. Please open an issue to discuss changes or submit a PR with context and tests where applicable.

License

FIXME: License file not yet added. Until then, assume all rights reserved.