The project is in a healthy, maintained state
A TUI calendar application displaying Indonesian public holidays and cuti bersama from the official SKB 3 Menteri announcements, with vim-like navigation
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Runtime

~> 0.8
 Project Readme

ID Calendar TUI

Gem Version Docker Image

A terminal-based calendar application for Indonesian public holidays with vim-like navigation.

Fork of adiprnm/id-calendar-tui that takes holiday data from the official SKB 3 Menteri announcements and releases it automatically, published as the id-calendar-tui-clariant gem.

Calendar Screenshot

Features

  • Full calendar view with Indonesian public holidays
  • Vim-like navigation (h/j/k/l)
  • Navigate months with arrow keys
  • Jump to today with g
  • Color-coded holidays (National, Religious, Cultural)
  • Clean, centered TUI interface

Installation

Via RubyGems

gem install id-calendar-tui-clariant
calendar

Via Docker (GHCR)

docker run --rm -it ghcr.io/clariantb/id-calendar-tui:latest

From Source

git clone https://github.com/clariantb/id-calendar-tui.git
cd id-calendar-tui
bundle install
bundle exec ruby bin/calendar

Usage

# Run the calendar
calendar

# Or with bundle
bundle exec calendar

Navigation

Key Action
h, ← Previous month
l, → Next month
j, k Previous/Next year
g Go to today
q, Ctrl+C Quit

Holidays Included

  • National Holidays: New Year, Independence Day, etc.
  • Islamic Holidays: Eid al-Fitr, Eid al-Adha, etc.
  • Hindu Holidays: Nyepi (Day of Silence)
  • Chinese New Year: Imlek, Cap Go Meh
  • Christian Holidays: Good Friday, Easter, Christmas

Holiday Data

Holiday dates (libur nasional and cuti bersama) live in data/holidays.json and come from the government's official SKB 3 Menteri announcement as published by Setneg/Setkab. There is no official machine-readable source, so scripts/fetch_holidays.rb parses the press release and accepts it only if it matches the article's own stated totals ("sebanyak N hari") and the weekday printed beside every date.

A weekly GitHub Action (.github/workflows/update-holidays.yml) imports next year's list as soon as it is announced (usually September–October) and commits it. The action fails, so GitHub notifies the repository owner, when Google's public Indonesian holiday calendar shows that a decree is out but the import found nothing, or that a holiday was added by an amendment (SKB perubahan). To fix:

# Announcement published under a new URL
ruby scripts/fetch_holidays.rb --year 2028 --url https://www.setneg.go.id/baca/index/...

Amendments are added by hand to that year's holidays in data/holidays.json, with the announcement URL in sources; --year/--url refuses to re-import an existing year unless given --force, which would drop them. Scheduled runs never overwrite a year that is already imported. Years that have not been announced show "belum diumumkan" instead of guessed dates.

The app reads only this file (no network at runtime), so the same workflow also releases: whenever data/holidays.json differs from the latest v* tag (a new import or a pushed amendment), it bumps the patch version, adds a CHANGELOG entry, tags, and dispatches release.yml, which validates the data and publishes the gem and Docker image.

Requirements

  • Ruby 2.6+
  • Terminal with color support

Development

# Install dependencies
bundle install

# Run the application
bundle exec ruby bin/calendar

# Build gem
bundle exec gem build id-calendar-tui.gemspec

# Build Docker image
docker build -t id-calendar-tui .

Releasing

Holiday data releases are automatic (see Holiday Data). For a code release:

# Update version in id-calendar-tui.gemspec and CHANGELOG.md
git add .
git commit -m "Bump version to x.x.x"
git tag vx.x.x
git push origin vx.x.x

Either way release.yml publishes to RubyGems and GHCR. One-time setup is in RELEASING.md.

Contributing

Bug reports and pull requests are welcome.

License

MIT License - see LICENSE file for details.