summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzymon Szukalski <szymon@szymonszukalski.com>2026-04-02 13:58:14 +1100
committerSzymon Szukalski <szymon@szymonszukalski.com>2026-04-02 13:58:14 +1100
commit0d787210e8be2ffe53a44c2d8af95c849c776f53 (patch)
tree9e83aefce5c238504b01d39fa8cd91e23d673c62
parent6107c2fe77e547a2d7c48150c48b19172b828d3c (diff)
Add central MOC startup note
-rw-r--r--README.md9
-rw-r--r--config.org56
2 files changed, 65 insertions, 0 deletions
diff --git a/README.md b/README.md
index b03aab2..0f11dd3 100644
--- a/README.md
+++ b/README.md
@@ -73,6 +73,14 @@ emacs --batch -Q --load ./init.el
## Workflow
+### MOC
+
+There is a central [moc.org](/Users/skas/org/moc.org) note at `~/org/moc.org`. It is a deliberately small, curated navigation surface for the notes system rather than an exhaustive index or system of record.
+
+The MOC opens automatically on Emacs startup through startup-hook behavior, but it is not configured as the default fallback buffer when nothing is open. `C-c n M` opens it manually at any time.
+
+Its Quick Access section provides actionable links for opening the agenda, today's note, capture, and a new note, while the rest of the file stays lightweight and curated around active projects, areas, and a few high-leverage resources.
+
### Daily notes
Daily notes are plain Org files in `~/org/daily/`, named by date. When a daily note is created through the config, it starts with these headings:
@@ -108,6 +116,7 @@ Denote handles long-lived notes. The main bindings are:
- `C-c n n` to open or create a Denote note.
- `C-c n l` to insert a Denote link.
+- `C-c n M` to open the central MOC note.
- `C-c n m` to create a PARA subdirectory from the minibuffer before capturing into it.
- `C-c n d` to open today's daily note.
diff --git a/config.org b/config.org
index 592276f..02548ca 100644
--- a/config.org
+++ b/config.org
@@ -325,6 +325,8 @@ with the standard section layout already in place. Agenda views stay focused on
PARA notes, so project, area, and resource files can surface TODOs without
pulling in daily or archived notes. A small directory helper keeps PARA
subdirectories easy to create from the minibuffer before capturing into them.
+A curated =moc.org= in the Org root acts as the startup landing page and quick
+navigation surface without becoming a global fallback buffer.
#+begin_src emacs-lisp
(use-package org
@@ -460,6 +462,45 @@ If TIME is nil, use the current date."
(format-time-string "%Y-%m-%d.org" time)
ss/org-daily-directory))
+ (defun ss/moc-path ()
+ "Return the file name for the central MOC note."
+ (expand-file-name "moc.org" ss/org-directory))
+
+ (defun ss/moc-template ()
+ "Return the initial contents for the central MOC note."
+ (concat
+ "#+title: MOC\n\n"
+ "* Quick Access\n"
+ "- [[elisp:(ss/open-agenda)][Open agenda]]\n"
+ "- [[elisp:(ss/open-todays-note)][Today's note]]\n"
+ "- [[elisp:(org-capture nil)][Capture]]\n"
+ "- [[elisp:(denote-open-or-create)][New note]]\n\n"
+ "* Projects (active)\n"
+ "- Backend Chapter Uplift\n"
+ "- API Strategy\n"
+ "- Maturity Matrix\n"
+ "- DPT Ways of Working\n\n"
+ "* Areas\n"
+ "- My Role\n"
+ "- People and Performance\n"
+ "- SE Practice\n"
+ "- Stakeholder Alignment\n"
+ "- Engineering Department\n\n"
+ "* Resources (high leverage)\n"
+ "- API Strategy Reference\n"
+ "- Triage System\n"
+ "- Weekly Focus\n"))
+
+ (defun ss/ensure-moc ()
+ "Create the central MOC note when it does not exist.
+Return the path to the note."
+ (let ((file (ss/moc-path)))
+ (unless (file-exists-p file)
+ (make-directory (file-name-directory file) t)
+ (with-temp-file file
+ (insert (ss/moc-template))))
+ file))
+
(defun ss/daily-note-template (&optional time)
"Return the initial contents for the daily note at TIME."
(format "#+title: %s\n\n* Tasks\n\n* Notes\n\n* Open Loops\n"
@@ -481,13 +522,28 @@ Return the path to the note."
(interactive)
(find-file (ss/ensure-daily-note)))
+ (defun ss/open-moc ()
+ "Open the central MOC note."
+ (interactive)
+ (find-file (ss/ensure-moc)))
+
+ (defun ss/open-moc-on-startup ()
+ "Open the central MOC note during normal startup."
+ (when (and (equal (buffer-name (current-buffer)) "*scratch*")
+ (not buffer-file-name))
+ (ss/open-moc)))
+
(defun ss/open-agenda ()
"Refresh agenda files and invoke `org-agenda'."
(interactive)
(ss/ensure-org-agenda-loaded)
(call-interactively #'org-agenda))
+ :init
+ (add-hook 'emacs-startup-hook #'ss/open-moc-on-startup)
+ (ss/ensure-moc)
:bind (("C-c a" . ss/open-agenda)
("C-c c" . org-capture)
+ ("C-c n M" . ss/open-moc)
("C-c n m" . ss/create-note-subdirectory)
("C-c n d" . ss/open-todays-note))
:config