Display your life in weeks — a grid visualization showing all weeks of your life, with past weeks, the current week, and future weeks visually distinguished. Mark significant moments with life chapters to see your journey at a glance.
Inspired by the "Your Life in Weeks" concept from Wait But Why.
The package is available on MELPA.
M-x package-install RET life-calendar RET
Or with use-package:
(use-package life-calendar
:ensure t)Clone this repository and add this to your init file:
(add-to-list 'load-path "/path/to/emacs-life-calendar")
(require 'life-calendar)Emacs 29+ has built-in support for installing packages from Git repositories:
(use-package life-calendar
:vc (:url "https://github.com/vshender/emacs-life-calendar")
:ensure t)Note: By default, :vc installs the last "release" — the most recent commit that changed the Version: header in the elisp file. To install the latest commit instead, add :rev :newest:
(use-package life-calendar
:vc (:url "https://github.com/vshender/emacs-life-calendar"
:rev :newest)
:ensure t)M-x life-calendar
On first use, you will be prompted to enter your birthday (in YYYY-MM-DD format). The birthday is saved automatically and remembered for future sessions.
Your birthday and life chapters are saved as Emacs custom variables (life-calendar-birthday and life-calendar-chapters), typically stored in your custom-file (often ~/.emacs.d/custom.el or within your init file).
To change your birthday or edit life chapters manually:
- Use
M-x customize-variable RET life-calendar-birthday RET, or - Edit the saved values directly in your custom file
| Key | Action |
|---|---|
f, b, C-f, C-b, arrows |
Move by week |
n, p, C-n, C-p, up/down |
Move by row (multiple years in multi-column view) |
], [, M-f, M-b |
Move by year |
M-<, M-> |
Jump to first/last week |
C-a, C-e, Home, End |
Beginning/end of row |
. |
Jump to current week |
Mark significant dates in your life (birthdays, graduations, jobs, etc.):
| Key | Action |
|---|---|
+ |
Add a life chapter |
- |
Remove a life chapter from current week |
Chapters are displayed with a distinct character (★ by default) and shown in the echo area when you navigate to them.
| Key | Action |
|---|---|
q |
Close the calendar |
g |
Refresh the display |
? |
Show help (keybindings) |
Run M-x customize-group RET life-calendar RET to customize all options, or set them in your init file:
;; Your birthday (set automatically on first use, or set manually).
(setq life-calendar-birthday "1990-05-15")
;; Number of years to display (default: 90).
(setq life-calendar-years 100)
;; When to count a new week (default: 'birthday).
;; 'birthday = day of week you were born (each week starts on that day)
;; Or use a day symbol: 'sunday, 'monday, 'tuesday, etc.
(setq life-calendar-week-start-day 'monday)
;; Number of columns to display (default: nil).
;; nil = auto-fit as many columns as the window allows
;; Or set to a specific number for fixed columns.
(setq life-calendar-columns nil) ; auto-fit to window
(setq life-calendar-columns 2) ; always show 2 columns
;; Characters for different week states.
(setq life-calendar-past-char "●")
(setq life-calendar-current-char "●")
(setq life-calendar-future-char "○")
(setq life-calendar-chapter-char "★")The package uses faces that inherit from built-in Emacs faces, so they automatically adapt to your theme:
| Face | Inherits from | Description |
|---|---|---|
life-calendar-past-face |
shadow |
Past weeks |
life-calendar-current-face |
warning |
Current week |
life-calendar-future-face |
default |
Future weeks |
life-calendar-chapter-face |
success |
Weeks with life chapters |
life-calendar-age-face |
font-lock-comment-face |
Age labels |
life-calendar-header-face |
bold |
Header text |
You can still customize them if needed:
(custom-set-faces
'(life-calendar-current-face ((t :inherit success :weight bold :inverse-video t))))The life calendar counts completed weeks. A week is marked as lived once its last day has passed. Think of it as filling in a square at the start of each new week, representing the week you just finished.
By default, your weeks start on the same day of the week as your birthday. If you were born on a Wednesday, each new week of your life begins on Wednesday. This means you complete a week of life every Wednesday, and that's when the calendar fills in a new square.
However, some people prefer to align their life weeks with calendar weeks. If you think of weeks as starting on Monday (common in Europe and the ISO standard) or Sunday (common in the US), you might want your life calendar to follow the same convention. Set life-calendar-week-start-day to 'monday or 'sunday to match your mental model of when a week begins.
A year of life runs from one birthday to the next. A week is counted if it completes within that interval — specifically, if its last day falls on or after your birthday but before your next birthday.
Since a year has about 365.25 days and a week has 7 days, most years contain 52 complete weeks (364 days) with one or two extra days. These extra days accumulate, and occasionally a 53rd week fits entirely within a year.
The exact count depends on the alignment between your birthday's day-of-week and the calendar. Over a lifetime, the distribution averages out, but individual years may vary.
- Emacs 27.1+
ISC
